《(18)--18设备驱动程序设计4.pdf》由会员分享,可在线阅读,更多相关《(18)--18设备驱动程序设计4.pdf(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、07 设备驱动程序设计 “通用输入输出”GPIO(general purpose input output)是嵌入式系统中最简单,最常用的I/O接口。GPIO是一组可编程控制的管脚,由多个寄存器同时控制。通过设置对应的寄存器可以达到设置GPIO口对应状态与功能如读取数据状态,设置输入输出方向,清零,中断使能等功能。1.GPIO驱动概述 Linux内核中GPIO是最简单、最常用的资源(和 interrupt,dma,timer一样)驱动程序,应用程序都能够通过相应的接口使用GPIO,GPIO使用0MAX_INT之间的整数标识,不能使用负数,GPIO与硬件体系密切相关的,不过Linux有一个框架处
2、理GPIO,能够使用统一的接口来操作GPIO。1.GPIO驱动概述 struct gpio_chip struct gpio_chip const char *label;struct device *dev;struct module *owner;int (*request)(struct gpio_chip*chip,unsigned offset);/请求gpio void *free)(struct gpio_chip*chip,unsigned offset);/释放gpio int (*get_direction)(struct gpio_chip*chip,unsigned o
3、ffset);int (*direction_input)(struct gpio_chip*chip,unsigned offset);/配置gpio为输入,返回当前gpio状态 int (*get)(struct gpio_chip*chip,unsigned offset);/获取gpio的状态 1.1 gpiolib关键数据结构 int (*direction_output)(struct gpio_chip*chip,unsigned offset,int value);/配置gpio为输出,并设置为value int (*set_debounce)(struct gpio_chip
4、*chip,unsigned offset,unsigned debounce);/设置消抖动时间,尤其是gpio按键时有用 void (*set)(struct gpio_chip*chip,unsigned offset,int value);/设置gpio为value值 int (*to_irq)(struct gpio_chip*chip,unsigned offset);/把gpio号转换为中断号 void (*dbg_show)(struct seq_file*s,struct gpio_chip*chip);int base;/这个gpio控制器的gpio开始编号 ;1.1 gp
5、iolib关键数据结构 struct gpio_desc struct gpio_desc struct gpio_chip *chip;unsigned long flags;/*flag symbols are bit numbers*/#define FLAG_REQUESTED 0#define FLAG_IS_OUT 1#define FLAG_EXPORT 2 /*protected by sysfs_lock*/#define FLAG_SYSFS 3 /*exported via/sys/class/gpio/control*/#define FLAG_TRIG_FALL 4
6、/*trigger on falling edge*/#define FLAG_TRIG_RISE 5 /*trigger on rising edge*/1.1 gpiolib关键数据结构 struct gpio_desc#define FLAG_ACTIVE_LOW 6 /*value has active low*/#define FLAG_OPEN_DRAIN 7 /*Gpio is open drain type*/#define FLAG_OPEN_SOURCE 8 /*Gpio is open source type*/#define FLAG_USED_AS_IRQ 9 /*G
7、PIO is connected to an IRQ*/#define ID_SHIFT 16 /*add new flags before this one*/#define GPIO_FLAGS_MASK (1 ID_SHIFT)-1)#define GPIO_TRIGGER_MASK (BIT(FLAG_TRIG_FALL)|BIT(FLAG_TRIG_RISE)#ifdef CONFIG_DEBUG_FS const char *label;#endif;1.1 gpiolib关键数据结构 测试gpio端口是否合法:int gpio_is_valid(int number);GPIO申
8、请 int gpio_request(unsigned gpio,const char*label)/*成功返回零失败返回负的错误值*/GPIO输入输出设置 int gpio_direction_input(unsigned gpio);int gpio_direction_output(unsigned gpio,int value);1.2 GPIO口使用 获得GPIO引脚的值和设置GPIO引脚的值(对于输出)int gpio_get_value(unsigned gpio);void gpio_set_value(unsigned gpio,int value);gpio当作中断口使用
9、int gpio_to_irq(unsigned gpio);返回的值即中断编号可以传给request_irq()和free_irq()内核通过调用该函数将gpio端口转换为中断,在用户空间也有类似方法 1.2 GPIO口使用 导出gpio端口到用户空间 int gpio_export(unsigned gpio,bool direction_may_change);内核可以对已经被gpio_request()申请的gpio端口的导出进行明确的管理,参数direction_may_change表示用户程序是否允许修改gpio的方向,假如可以则参数direction_may_change为真。/
10、*撤销GPIO的导出*/void gpio_unexport();1.2 GPIO口使用 gpio_direction_output 与 gpio_set_value 区别 gpio_set_value(port_num,0/1)一般只是在这个GPIO口的寄存器上写上某个值,至于这个端口是否设置为输出,它就管不了!gpio_direction_output(port_num,0/1),在某个GPIO口写上某个值之后,还会把这个端口设置为输出模式。系统开发人员在要结合这两者来使用,以便提高效率。1.2 GPIO口使用 gpio_direction_output 与 gpio_set_value
11、区别 gpio_set_value(port_num,0/1)一般只是在这个GPIO口的寄存器上写上某个值,至于这个端口是否设置为输出,它就管不了!gpio_direction_output(port_num,0/1),在某个GPIO口写上某个值之后,还会把这个端口设置为输出模式。系统开发人员在要结合这两者来使用,以便提高效率。1.2 GPIO口使用 原理图分析 2.GPIO控制数码管 裸机程序设计 GPIOA.OUTENB|=(0 x1 23);/GPIOA23:设置输出模式 GPIOA.OUTENB|=0 xFF;/GPIOA0-7:设置输出模式 GPIOA.OUT&=(0 x1 23);GPIOA.OUT|=0 xFF;GPIOA.OUT|=0 x1 23;delay_ms(500);while(1)/依次点亮 for(i=0;i8;i+)GPIOA.OUT&=(0 x1 23);GPIOA.OUT|=0 x1 i;GPIOA.OUT|=0 x1 23;delay_ms(500);2.1 GPIO控制数码管 驱动程序设计 应用程序设计 Makefile设计 系统调试分析 2.1 GPIO控制数码管 共 同 学 习 共 同 进 步 加 油!
限制150内