GPIO子系统
总体框架
通用功能
- 可以设为输出:让它输出高低电平;
- 可以设为输入,读取引脚当前电平;
- 可以用来触发中断
通用属性
- 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
如果只是简单的引脚控制(比如输出、查询输入值),可以不编写驱动程序。
但是涉及中断的话,就需要编写驱动程序了。
- 确定GPIO编号
查看每个/sys/class/gpio/gpiochipXXX
目录下的label,确定是你要用的GPIO控制器,也称为GPIO Bank。
根据它名字gpiochipXXX,就可以知道基值是XXX。
基值加上引脚offset,就是这个引脚的编号。
- 导出/设置方向/读写值
举例:
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时会自动调用