2. GPIO代码分析(接口和注册过程)

2.1 api接口

int gpiochip_add(struct gpio_chip *chip)      //添加初始化gpio_chip管理的gpio_desc 

int gpiochip_remove(struct gpio_chip *chip)      //清空gpio_chip管理的全局gpio_desc数组项 

struct gpio_chip *gpiochip_find(void *data,int (*match)(struct gpio_chip *chip, void *data))    //查找获取gpio_chip 


int gpio_request(unsigned gpio, const char *label)      //请求gpio资源 

void gpio_free(unsigned gpio)        //释放gpio资源 


int gpio_set_debounce(unsigned gpio, unsigned debounce) //设置去抖动时间 

int gpio_direction_input(unsigned gpio)     //设置gpio为输入io 

int gpio_direction_output(unsigned gpio, int value) //设置gpio为输出io 


int gpio_cansleep(unsigned gpio)                        //判断gpio可否睡眠 

int gpio_get_value_cansleep(unsigned gpio)     //获取gpio值(gpio可睡眠) 

void gpio_set_value_cansleep(unsigned gpio, int value)  //设置gpio值(gpio可睡眠) 

int gpio_get_value(unsigned gpio)     //获取gpio值(gpio不可睡眠) 


int gpio_request_one(unsigned gpio, unsigned long flags, const char *label) //请求一个gpio资源 

int gpio_request_array(struct gpio *array, size_t num)  //请求一组gpio资源 

void gpio_free_array(struct gpio *array, size_t num) //释放一组gpio资源 


int gpio_to_irq(unsigned gpio)   //根据gpio号获取对应的中断号 


int gpio_export(unsigned gpio, bool direction_may_change)   //gpio创建用户接口 

void gpio_unexport(unsigned gpio)        //gpio移除用户接口

2.2 GPIO的注册过程

start_kernel 函数会调用 init_IRQ 函数。

1)init_IRQ 函数调用了 machine_desc 结构体的 init_irq 函数。

machine_desc 结构体在 arch/arm/include/asm/mach/arch.h 文件中定义,其中 init_irq 被赋值为 mx6_init_irq 。

(Board-mx6q_sabresd.c)

2)mx6_init_irq 函数中调用了 mx6q_register_gpios 函数

mx6q_register_gpios 函数调用了函数 mxc_gpio_init 。

gpio的类:

static struct class gpio_class = {

.name = "gpio",

.owner = THIS_MODULE,

.class_attrs = gpio_class_attrs,

};

在文件 arch/arm/mach-mx6/devices.c 文件中定义了 struct mxc_gpio_port mxc_gpio_ports[],里面包含了mx6q板子可用的GPIO口。在函数 mx6q_register_gpios 中说明了可用的口有7个。struct mxc_gpio_port对象的成员分别表示GPIO的组名,基地址,中断号和虚拟中断号等。

之后是代码分析部分

猜你喜欢

转载自blog.csdn.net/qq_38022972/article/details/81810686
今日推荐