【嵌入式Linux内核驱动】GPIO子系统

GPIO子系统

总体框架

image-20230323210215556

通用功能

  • 可以设为输出:让它输出高低电平;
  • 可以设为输入,读取引脚当前电平;
  • 可以用来触发中断

通用属性

  • Active-High and Active-Low
  • Open Drain and Open Source 开漏和开源

GPIOLIB向上提供的gpiod相关接口

GPIOLIB向下提供的gpiochip相关接口

应用编程

/sys/bus/gpio/devices目录下,列出了部分GPIO控制器,如下表:

/sys/bus/gpio/devices/gpiochip0
/sys/bus/gpio/devices/gpiochip1
/sys/bus/gpio/devices/gpiochip2

/sys/class/gpio/gpiochipXXX下,有这些信息:

/sys/class/gpio/gpiochip508]# ls -1
base     // 这个GPIO控制器的GPIO编号
device
label    // 名字
ngpio    // 引脚个数
power
subsystem
uevent

查看GPIO使用情况

cat /sys/kernel/debug/gpio

通过SYSFS使用GPIO

如果只是简单的引脚控制(比如输出、查询输入值),可以不编写驱动程序。

但是涉及中断的话,就需要编写驱动程序了。

  1. 确定GPIO编号

查看每个/sys/class/gpio/gpiochipXXX目录下的label,确定是你要用的GPIO控制器,也称为GPIO Bank。

根据它名字gpiochipXXX,就可以知道基值是XXX。

基值加上引脚offset,就是这个引脚的编号。

  1. 导出/设置方向/读写值

举例:

echo 509 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio509/direction
echo 1 > /sys/class/gpio/gpio509/value
echo 509 > /sys/class/gpio/unexport

echo 509 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio509/direction
cat /sys/class/gpio/gpio509/value
echo 509 > /sys/class/gpio/unexport

内核驱动

具体应用时的驱动

GPIO控制器驱动

每个GPIO Controller用一个gpio_device来表示:

  • 里面每一个gpio引脚用一个gpio_desc来表示
  • gpio引脚的函数(引脚控制、中断相关),都放在gpio_chip里

分配/设置/注册一个gpio_chip结构体。

GPIO与Pinctrl的交互

在GPIO控制器设备树中使用如下代码建立映射关系

// 当前GPIO控制器的0号引脚, 对应pinctrlA中的128号引脚, 数量为12
gpio-ranges = <&pinctrlA 0 128 12>; 

在GPIO驱动程序中,解析跟Pinctrl之间的联系:处理gpio-ranges:

  • 这不需要我们自己写代码

  • 注册gpio_chip时会自动调用

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>