找回密码
 立即注册
首页 业界区 安全 Linux的GPIO子系统驱动框架简析

Linux的GPIO子系统驱动框架简析

栓汨渎 2025-7-18 17:38:19
一、Linux的GPIO驱动框架介绍


  • 功能包含:控制引脚的方向(输入/输出)、读取输入值、设置输出值、中断等
  • 屏蔽了物理硬件层面的真实有效电平,在内核中使用逻辑电平,如输出1在高电平有效时输出高电平,在低电平有效时输出低电平
  • 管理芯片自带的GPIO和扩展的GPIO,扩展的GPIO速度较慢,使用时不建议获取spinlock
二、GPIO子系统的三层


  • 用户层,包括led、key等GPIO设备,作为consumer
  • 核心层,主要是gpiolib.c,向用户层提供了gpiod_xx的API,给控制器层提供了gpiochip_add_data的API
  • 控制器层,GPIO控制器的驱动代码,作为provider
三、典型的设备树文件
  1. /{
  2.   gpio_virt: virtual_gpio_controller{
  3.     compatible = "user,virtual_gpio";
  4.     gpio-controller;
  5.     #gpio-cells = <2>;
  6.     ngpios = <4>;
  7.   };
  8.   my_led {
  9.     compatible = "user,led";
  10.     led-gpios = <&gpio_virt 0 GPIO_ACTIVE_LOW>;
  11.   };
  12. };
复制代码
四、三个比较重要的结构体
  1. struct gpio_device{      // 描述GPIO控制器
  2.   int id;    // 第几个GPIO控制器
  3.   struct gpio_chip *chip;  // 该GPIO组的操作函数
  4.   struct gpio_desc *descs;  // 描述GPIO控制器下的每个GPIO
  5.   int base;  // 一组GPIOxx的基号码
  6.   u16 ngpio;  // 一组GPIO有多少个
  7.   struct list_head list;  // 管理gpio控制器的链表
  8.   ...
  9. };
  10. struct gpio_chip{
  11.   struct gpio_device *gpiodev;  // 属于哪一个GPIO控制器
  12.   ...      // 一堆函数指针
  13.   int base;  // 一组GPIOxx的基号码
  14.   u16 ngpio;  // 一组GPIO有多少个
  15.   ...
  16. };
  17. struct gpio_desc{    // 描述GPIO
  18.   struct gpio_device *gdev;    // 属于哪一个GPIO控制器
  19.   ...
  20. };
复制代码
五、驱动程序流程
  1. // 控制器的驱动
  2. 1. 分配一个gpio_chip结构体
  3. 2. 设置gpio_chip结构体成员、label、parent、owner、get、set、direction_input、direction_output、base、ngpio
  4. 3. 使用devm_gpiochip_add_data的API使用gpio_chip构建一个gpio_device,并添加到链表中
  5. 4. 需要实现get、set、direction_input、direction_output等函数
  6. // GPIO设备的驱动
  7. 1. 使用gpiod_get获得一个gpio_desc结构体
  8. 2. 通过gpiod_xxx函数操作对应的GPIO
复制代码
六、加入pinctrl的gpio
  1. // 设备树
  2. gpio控制器节点中加入属性,当前gpio控制器的0引脚对应pinctrl的64引脚,共4组对应关系
  3.   gpio-ranges = <&pinctrl0 0 64 4>;
  4. // 驱动程序
  5. gpio控制器的驱动程序中,给gpio_chip结构体提供request函数,可以使用gpiolib.c中提供的gpiochip_generic_request
  6. pinctrl控制器的驱动程序中,给pmx_ops结构体提供gpio_request_enable或request函数
  7. // 对应ZYNQ,不存在pinctrl的概念,因此也没有这项功能,以上说法来自网上
复制代码
七、sysfs接口
  1. cd /sys/class/gpio
  2. ls   
  3. // 显示gpiochipxxx表示gpio控制器、显示gpioxx表示gpio引脚
  4. // export和unexport用作根据引脚号创建和销毁gpio的引脚
  5. // gpioxx目录下direction、value表示引脚的方向和值
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册