gpio
======
头文件:linux/gpio.h
实现文件:driver/gpio/gpiolib.c
参考文件:Doccumentation/gpio.txt
准备工作
------------
为了驱动具体的设备,驱动程序常常需要系统中的各类资源进行申请,形如以下调用
-->gpio_request(gpio_num, "led gpio"); //申请GPIO,用做led
-->request_irq(irq_no, irq_handler, IRQF_DISABLED, irq_name, &irq_data);//申请中断
上述gpio_request()就实现了对应GPIO申请的功能。设备驱动程序如果要获得kernel GPIO模块的
支持(gpio_request能用...),需要完成如下步骤
-->Platforms must declare GENERIC_GPIO support in their Kconfig (boolean true)
-->在模块Kconfig中加入depends on GENERIC_GPIO,对于必须使用GPIO的模块
-->#inlcude <linux/gpio.h>
使用gpio
----------
准备工作做完之后,就可以申请GPIO然后使用了。下面是使用GPIO的一般性过程
申请GPIO->设置GPIO方向->设置其他功能(上拉,下拉)->输入或输出值->释放GPIO
相应的函数如下
int gpio_request(unsigned gpio, const char *label);//申请GPIO
void gpio_free(unsigned gpio);//释放GPIO
int gpio_direction_input(unsigned gpio);//设置为输入
int gpio_direction_output(unsigned gpio, int value);//设置为输出
int gpio_set_debounce(unsigned gpio, unsigned debounce);
int __gpio_get_value(unsigned gpio);//读GPIO 通常是inline函数
void __gpio_set_value(unsigned gpio, int value);//设置GPIO
对于有些挂载在I2C,SPI总线上的扩展GPIO,读写操作可能会导致睡眠,因此不能在中断函数中
使用。使用下面的函数以区别于正常的GPIO
int gpio_get_value_cansleep(unsigned gpio);//读GPIO
void gpio_set_value_cansleep(unsigned gpio, int value);//写GPIO
kernel在很多时候都体现了良好的编程思想,其中一个就是资源获得即初始化,也就是把资源获取
和初始化设置放在同一个函数中。对于GPIO其操作如下
//申请一个GPIO,使用glags进行设置
int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
//申请一组GPIO,并初始化设置
int gpio_request_array(const struct gpio *array, size_t num);
//释放一组GPIO
void gpio_free_array(const struct gpio *array, size_t num);
这里涉及到struct gpio结构体,它的定义如下
struct gpio {
unsigned gpio;
unsigned long flags;
const char
======
头文件:linux/gpio.h
实现文件:driver/gpio/gpiolib.c
参考文件:Doccumentation/gpio.txt
准备工作
------------
为了驱动具体的设备,驱动程序常常需要系统中的各类资源进行申请,形如以下调用
-->gpio_request(gpio_num, "led gpio"); //申请GPIO,用做led
-->request_irq(irq_no, irq_handler, IRQF_DISABLED, irq_name, &irq_data);//申请中断
上述gpio_request()就实现了对应GPIO申请的功能。设备驱动程序如果要获得kernel GPIO模块的
支持(gpio_request能用...),需要完成如下步骤
-->Platforms must declare GENERIC_GPIO support in their Kconfig (boolean true)
-->在模块Kconfig中加入depends on GENERIC_GPIO,对于必须使用GPIO的模块
-->#inlcude <linux/gpio.h>
使用gpio
----------
准备工作做完之后,就可以申请GPIO然后使用了。下面是使用GPIO的一般性过程
申请GPIO->设置GPIO方向->设置其他功能(上拉,下拉)->输入或输出值->释放GPIO
相应的函数如下
int gpio_request(unsigned gpio, const char *label);//申请GPIO
void gpio_free(unsigned gpio);//释放GPIO
int gpio_direction_input(unsigned gpio);//设置为输入
int gpio_direction_output(unsigned gpio, int value);//设置为输出
int gpio_set_debounce(unsigned gpio, unsigned debounce);
int __gpio_get_value(unsigned gpio);//读GPIO 通常是inline函数
void __gpio_set_value(unsigned gpio, int value);//设置GPIO
对于有些挂载在I2C,SPI总线上的扩展GPIO,读写操作可能会导致睡眠,因此不能在中断函数中
使用。使用下面的函数以区别于正常的GPIO
int gpio_get_value_cansleep(unsigned gpio);//读GPIO
void gpio_set_value_cansleep(unsigned gpio, int value);//写GPIO
kernel在很多时候都体现了良好的编程思想,其中一个就是资源获得即初始化,也就是把资源获取
和初始化设置放在同一个函数中。对于GPIO其操作如下
//申请一个GPIO,使用glags进行设置
int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
//申请一组GPIO,并初始化设置
int gpio_request_array(const struct gpio *array, size_t num);
//释放一组GPIO
void gpio_free_array(const struct gpio *array, size_t num);
这里涉及到struct gpio结构体,它的定义如下
struct gpio {
unsigned gpio;
unsigned long flags;
const char