BSP之GPIO驱动

发布时间:2026/5/19 12:33:57

BSP之GPIO驱动 今天是第一次7.28更新网站用起来还不是很熟悉哈哈。其实想写点什么的想法已经很久了奈何出于懒惰或是其他原因一直没有行动起来今天的这篇文章原本是打算更新到公司wiki上的结果写到一半却没有保存真的很难受啊~~ 那就不在wiki上写了换个平台吧简介GPIO(General Purpose Input Output 通用输入输出)采用标准的Linux框架可在kernel/user Mode使用统一的接口操作GPIO。底层实现Linux kernel对GPIO资源进行了抽象抽象出一个gpiolib(如下图红色部分)这个是Linux GPIO框架的核心该层向下对接Specific Chip Driver,为这一层提供callback,具体实现GPIO的哪些操作向外提供统一的APIs,以供其他驱动或APP使用。gpiolib相关数据结构gpiolib其实就是围绕几个数据结构在做文章其数据结构主要定义在kernel/include/linux/gpio/driver.h和kernel/drivers/gpio/gpiolib.h中今天住要先看一下struct gpio_chip include/linux/gpio/driver.h数据结构对于其他数据结构gpio_desc/gpio_device/gpio_devices后面有时间再学习。struct gpio_chip { const char *label; struct gpio_device *gpiodev; struct device *parent; struct module *owner; int (*request)(struct gpio_chip *chip, unsigned offset); void (*free)(struct gpio_chip *chip, unsigned offset); int (*get_direction)(struct gpio_chip *chip, unsigned offset); int (*direction_input)(struct gpio_chip *chip, unsigned offset); int (*direction_output)(struct gpio_chip *chip, unsigned offset, int value); int (*get)(struct gpio_chip *chip, unsigned offset); int (*get_multiple)(struct gpio_chip *chip, unsigned long *mask, unsigned long *bits); void (*set)(struct gpio_chip *chip, unsigned offset, int value); void (*set_multiple)(struct gpio_chip *chip, unsigned long *mask, unsigned long *bits); int (*set_config)(struct gpio_chip *chip, unsigned offset, unsigned long config); int (*to_irq)(struct gpio_chip *chip, unsigned offset); void (*dbg_show)(struct seq_file *s, struct gpio_chip *chip); int (*init_valid_mask)(struct gpio_chip *chip); int base; u16 ngpio; const char *const *names; bool can_sleep; /* ... */ };我们可以看到这个结构里主要是一些函数指针对于新的SOC,只要对应实现这些callback对应的功能即可。然后通过gpiochip_add添加到GPIO子系统使用User Mode使用用户空间可以通过sysfs接口操作GPIO:需要打开CONFIG_GPIO_SYSFS 配置或者通过menuconfig配置Device Drivers - GPIO support - /sys/class/gpio/… (sysfs interface)/sys/class/gpio对应的源码位于driver/gpio/gpiolib-sysfs.c/sys/class/gpio目录下的包含export/unexport、gpioN、gpio_chipN三种文件export在用户空间申请某个GPIO的控制权unexport在用户空间移除某个GPIO的控制权gpioN:具体GPIO 的value、direction、edge等注edge有nono(disable GPIO中断)/rising(中断上升沿触发)/falling(中断下降沿触发)/both(中断双边沿触发)。gpio_chipN:指代GPIO控制器如何查看某个GPIO管脚对应的索引vi kernel/drivers/厂家/include/芯片型号/gpio.h 可看到具体GPIO的宏定义以GPIO index 5为例echo 5 /sys/class/gpio/export echo out /sys/class/gpio/gpio5/direction echo 0/1 /sys/class/gpio/gpio5/value注这些节点都可以通过open/read/write等标准IO函数操作目前Linux标准框架暂时还不支持GPIO上下拉以及驱动能力的相关配置。Kernel Mode使用kernel mode提供以下通过API接口申请gpio端口gpio_request释放gpio端口gpio_free设置gpio为输入输出模式:gpio_direction_input/output获取输入电平gpio_get_value设置输出电平gpio_set_value参考链接https://blog.csdn.net/zhoutaopower/article/details/98082006

相关新闻