首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

驱动GPIO操作总结

设备驱动程序是软件概念和硬件电路之间的一个抽象层,软件操作硬件的关键就是对寄存器的操作。笔者使用的S5PV210是IO与内存统一编址的,在裸机中直接操作IO端口的物理地址,而在驱动必须使用虚拟地址。...考虑到GPIO作为硬件资源,存在着被多个驱动使用,还有复用的问题,所以内核提供了GPIO驱动gpiolib框架来统一管控GPIO资源,gpiolib在内核作为一个驱动所实现。...定义了CONFIG_GENERIC_GPIO宏则包含头文件asm/gpio.h,而asm/gpio.h又包含了相应平台下的头文件mach/gpio.h,其中又包含了asm-generic/gpio.h...(unsigned gpio) gpio: gpio编号,相关宏定义在linux/gpio.h 返回值: 成功返回0,失败返回负值 gpio_direction_output 设置GPIO为输出模式...(unsigned gpio, int value) #define gpio_set_value __gpio_set_value gpio: gpio编号,相关宏定义在linux/gpio.h

93220
您找到你想要的搜索结果了吗?
是的
没有找到

Linux通用GPIO驱动写法与应用

第四步:生成设备节点 通过调用device_create生成设备节点,应用程序通过控制设备节点来对gpio进行控制。 以上的具体代码可以参考附录2:GPIO驱动程序。...将GPIO驱动集成到内核 由于前面已经将问题驱动模块单独编译,此时若想集成到内核,则需要做以下几件事: 4.1 向内核添加文件 由于GPIO驱动属于字符设备驱动,所以应该放在kernel/drivers...4.3 让驱动编译到内核 通过Kconfig只是选择了编译的宏,如果让驱动正真编译到内核,还需要修改Makefile。也就是修改kernel/drivers/char/Makefile ?...同时启动后再dev目录可以看到生成的设备 ? 5. 总结 由于应用层不能直接操作gpio,但是应用程序可以调用驱动程序的接口来操作gpio。这也是为什么控制gpio这么麻烦的原因。...并且可以知道调用过程,思路清晰。 通过这次的总结,对Linux的驱动的内核层与应用层要区分清楚,同时也加深对驱动程序编写流程的理解。

9.4K43

Linux 驱动开发 gpio子系统 快速入门

gpio 和 pinctrl 子系统在内核里的使用率非常高,和嵌入式产品的关联非常大。从这两个子系统开始学习驱动开发是个不错的入门选择。...pinctrl 的作用: 引脚复用,例如某个引脚即可用作为普通的gpio,也可以作为UART的TX; 引脚配置,一般包括上下拉、驱动能力等; ?...子系统,用 struct gpio_desc 来描述一个 gpio 引脚,gpiod_xxx() 都是围绕着 strcut gpio_desc 进行操作的。...点击查看大图 正常情况下,驱动工程师不需要了解 gpio chip driver 和 gpiolib: 驱动工程师负责编写 gpio consumer drvier; 芯片厂商的 bsp 工程师负责编写...在 gpio 子系统,SoC 上的每一个 gpio bank 都会被认为是一个 gpio controller,每一个 gpio controller 都由一个 struct gpio_chip 来描述

5.1K33

Linux驱动实践:如何编写【 GPIO 】设备的驱动程序?

目录 示例程序目标 编写驱动程序 编写应用程序 卸载驱动模块 在前几篇文章,我们一块讨论了:在 Linux 系统,编写字符设备驱动程序的基本框架,主要是从代码流程和 API 函数这两方面触发。...这篇文章,我们就以此为基础,写一个有实际应用功能的驱动程序: 在驱动程序,初始化 GPIO 设备,自动创建设备节点; 在应用程序,打开 GPIO 设备,并发送控制指令设置 GPIO 口的状态; 示例程序目标...加载驱动模块 在加载驱动模块之前,先来检查一下系统,几个与驱动设备相关的地方。 先看一下 /dev 目录下,目前还没有设备节点( /dev/mygpio[0-3] )。...还是通过 dmesg 指令来查看驱动模块的打印信息: $ dmesg 可以看到:操作系统为这个设备分配的主设备号是 244,并且也打印了GPIO硬件的初始化函数的调用信息。...再来看一下 dmesg的打印信息: 可以看到:驱动程序gpio_driver_exit( ) 被调用执行了。

5K30

Stm32的GPIO驱动继电器

由于单片机的GPIO口的输出电流非常小 (功率很小),所以单片机的GPIO口只能驱动类似于LED灯、数码管等小功率用电器,而不能驱动像继电器这样大功率的用电器。...继电器 SRD-03VDC-SL-C继电器:只需要3V电压就可以控制继电器的单刀双掷开关,但不能用GPIO口的高电平驱动继电器,需要用上述提到的驱动电路进行驱动。...比较安全的做法是把外接电源和常开端连接到外接的高压电路。 所以,GPIO口通过三极管驱动继电器的电路如下: 左边是STM32的单片机端口通过三极管输出电压,右边是继电器。...继电器也有2.6V电压,电流值为2.6 V / 25 Ω= 104 mA,继电器被驱动。 这个电路图中,功率要比改进前小很多。 另外,当GPIO = 0时,继电器不被驱动。...小结: 由于单片机的GPIO的电流很小,所以需要通过三极管对电流进行放大,然后驱动继电器。继电器的线圈和触点在接通和断开瞬间会对整个电路造成很大的影响,因此要对继电器的线圈和触点分别进行保护。

4.6K30

基于IMX6的GPIO驱动程序

bit29~bit15 14位为 “数据大小” 区,表示 ioctl() 的 arg 变量传送的内存大小。           ...要按照Linux内核的约定方法为驱动程序选择ioctl编号,因为如果不按照这个约定进行编写,就有可能因为cmd参数冲突问题不能正确调用ioctl函数。...在include/asm/ioctl.h头文件,我们可以看到供我们使用的创建cmd参数的方法。...通过__gpio_set_value()向底层写入1或0,当写入1时,IO输出高电平,当写入0时,IO输出低电平;当cmd参数为DS_CS1_R时,通过gpio_direction_input()设置IO...arg参数是驱动层和应用层交换的数据,例如当写GPIO,arg=1时,应用层给驱动层传递1,驱动层控制GPIO为高电平;当读GPIO时,应用层通过驱动层传递过来的arg参数的值来判别GPIO的高低电平。

1.8K80

Delphi调用驱动打印

前言 我们做打印小票的时候除了直接对端口发送指令的方式,还有就是调用打印机驱动打印的方式,在Delphi想要用驱动打印的方式就可以用到TPrinter类 TPrinter类介绍 TPrinter类中封装了...---- Capabilities 指示一个打印设备驱动器的当前设置 指示一个打印设备驱动器的当前设置。...如果应用程序调用了BeginDoc方法并在调用EndDoc方法(或Abort方法)之前将把Printing属性设置为真值。...调用EndDoc方法将结束打印工作(并关闭当前打开的文体)。打印工作将在EndDoc方法调用结束后开始。在应用程序调用EndDoc方法后,打印机开始打印。...不能直接调用TPrinter方法。TPrinter方法将由Printer函数自动调用。方法为打印机分配内存,并调用继承的构造方法。然后设置正确的驱动器、设备和端口.

2.4K30

Linux系统驱动之使用GPIO模拟I2C的驱动程序分析

使用GPIO模拟I2C的驱动程序分析 参考资料: i2c_spec.pdf Linux文档 Linux-5.4\Documentation\devicetree\bindings\i2c\i2c-gpio.yaml...1.2 I2C信号 I2C协议数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。传输时,先传输最高位(MSB)。...双方设备,某个设备发送数据时,另一方怎样才能不影响SDA上的数据?...驱动程序分析 3.1 平台总线设备驱动模型 3.2 设备树 对于GPIO引脚的定义,有两种方法: 老方法:gpios 新方法:sda-gpios、scl-gpios 3.3 驱动程序分析 1....drain了 在驱动里不需要在设置为open drain 如果需要驱动代码自己去设置SDA为open drain,就不要提供这个属性 i2c-gpio,scl-open-drain: 它表示其他驱动

3.1K32

【i.MX6ULL】驱动开发3——GPIO寄存器配置原理

前面的两篇Linux驱动文章,介绍了字符设备驱动的两种新旧开发方式,并使用一个虚拟的字符驱动来学习字符设备的开发的流程。...同样,i.MX6ULL也有多种点灯方式: 裸机系统:汇编操作寄存器点灯、C语言操作寄存器点灯 跑Linux系统:字符驱动LED点灯、设备树驱动LED点灯 究其本质,最终都是要操作i.MX6ULL的寄存器...数据寄存器的各位直接引到芯片外部,控制寄存器则是对数据寄存器每一位进行独立的设置。 1.1 板子LED硬件原理图 在开始介绍i.MX6ULL的GPIO之前,先来看一下板子的原理对于LED的标注。...当需要使用引脚的GPIO功能时,就要配置GPIO外设的各个寄存器(DR、GDIR、PSR...)。...),即数据寄存器,它是32位的,一个GPIO组最大只有32个IO,因此DR寄存器的每个位都对应一个 GPIO

1.1K31

嵌入式:ARM的IO访问与芯片选择

在许多ARM架构系统里,I/O单元对于用户码是不可访问的,只可以通过系统管理调用(SWI)或通过C的库函数来使用这些调用。...一般一些高档的ARM架构处理器具有DMA功能。...ARM7TDMI不带MMU,但uCLinux也能用。 USB接口:有些ARM芯片内置USB控制器 GPIO数量:有些是与地址线、数据线和串口线等复用。...如:PHILIPS的SAA7750,所有GPIO都可设置成FIQ或IRQ,并且可选择上升沿、下降沿、高电平、低电平四种方式。这对红外遥控接收和键盘等任务都很方便。...SAA7750内置了一个16位立体声音频ADC和DAC,并且带耳机驱动。 PS2:用来带键盘鼠标。 CAN总线:如现代公司的HMS30C7202就集成了2路CAN总线接口。

68820

Linuxgpio接口的使用方法示例

前言 Linux内核gpio是最简单,最常用的资源(和 interrupt ,dma,timer一样)驱动程序,应用程序都能够通过相应的接口使用gpiogpio使用0~MAX_INT之间的整数标识,...不能使用负数,gpio与硬件体系密切相关的,不过linux有一个框架处理gpio,能够使用统一的接口来操作gpio.在讲gpio核心(gpiolib.c)之前先来看看gpio是怎么使用的 使用gpio...使用gpio接口需要包含#include ,在驱动中使用延时函数mdelay,需要包含#include 文件,Documentation/gpio.txt.../* GPIO OUTPUT */ void gpio_set_value(unsigned gpio, int value); int gpio_cansleep(unsigned gpio);...); } else { set_irq_type(gpio_to_irq(sw->gpio), IRQ_TYPE_EDGE_RISING); } } 参考文章 Linuxgpio口使用方法

2.6K53
领券