linux gpio

2019-11-29 15:49| 发布者: yangy| 查看: 1727| 评论: 0

类目: I.MX6系列产品  >  Linux     文档编号: 330

在Linux中,会在gpiolib.c中定义一个 ARCH_NR_GPIOS 大小的数组static struct gpio_desc gpio_desc[ARCH_NR_GPIOS];。每个元素对应于当前CPU上各个GPIO接口的信息,记录各个GPIO的描述符,即对应struct gpio_desc结构体。struct gpio_desc内的成员gpio_chip又指向了一系列关于GPIO的操作。具体的操作在 driver/gpio/gpio_**.c中实现。 gpio_desc结构体中,flags为一标志位,用来指示当前GPIO是否已经占用,当用gpio_request申请GPIO资源时,flags位就会置位,当调用gpio_free释放GPIO资源时,flags就会清零。 当我们调用gpio_request(),实际上会将参数gpio在数组中查找其对应的gpio_desc,在根据gpio_chip就可以找到底层关于request()的实现。 所有的GPIO控制器驱动应包括下面的头文件,包含 struct gpio_chip 的定义。

include <linux/gpio/driver.h>

struct gpio_chip:标记GPIO所属的控制器,里面包含诸多回调函数,用于控制GPIO的行为,各个板卡都有实现自己的gpio_chip控制模块; struct gpio_desc:用于标记一个GPIO; 在driver/gpio/gpio_**.c文件中会注册特定平台**的GPIO驱动

  • 定义了GPIO板级控制的内容,包括设置 set gpio,get gpio,dir_in,dir_out,gpio_to_irq等行为;

  • 获取GPIO板级的资源,包括 gpio_reg_base,并赋值给 struct gpio_chip;

  • 将struct gpio_chip添加到GPIOLIB中;

driver/gpio/gpio_**.c会定义平台驱动并初始化 板级文件或设备树会添加平台设备

当设备与驱动匹配就会执行**_gpio_probe()的内容。 probe() 中初始化struct gpio_chip结构体的成员。并调用 gpiochip_add()将gpio_chip添加到 GPIOLIB 中。 GPIOLIB 提供GPIO调用的接口函数。比如常见的 gpio_request()/gpio_free()/gpio_get_value()/gpio_is_valid() 等。

相关结构体

  1. gpio_chip代表一个芯片的一个gpio bank

struct gpio_chip {  //gpio bank
const char *label; //bank名
struct device *dev; //设备文件
struct module *owner; //模块所有者
int (*request)(struct gpio_chip *chip,unsigned offset);
void (*free)(struct gpio_chip *chip,unsigned offset);
int (*direction_input)(struct gpio_chip *chip,unsigned offset); //配置gpio为输入
int (*get)(struct gpio_chip *chip,unsigned offset); //获取值
int (*direction_output)(struct gpio_chip *chip,unsigned offset, int value); //配置gpio为输出
int (*direction_output_array)(struct gpio_chip*chip, unsigned value, unsigned mask);
int (*set_debounce)(struct gpio_chip *chip,unsigned offset, unsigned debounce); //去抖动时间
void (*set)(struct gpio_chip *chip,unsigned offset, int value); //设置gpio值
int (*to_irq)(struct gpio_chip *chip,unsigned offset); //中断
void (*dbg_show)(struct seq_file *s,struct gpio_chip *chip);
int base; //gpio基数
u16 ngpio; //gpio个数
const char *const *names;
unsigned can_sleep:1; //能否睡眠
unsigned exported:

已解决

未解决

只是看看

最新评论