Linux提供了GPIO子系统驱动框架,使用该驱动框架即可灵活地控制板子上的GPIO。
GPIO命名
Rockchip Pin的ID按照 控制器(bank)+端口(port)+索引序号(pin) 组成。
- 控制器和GPIO控制器数量⼀致
- 端口固定 A、B、C和D,每个端口仅有8个索引号,(a=0,b=1,c=2,d=3)
- 索引序号固定 0、1、2、3、4、5、6、7
rk356x具有5个GPIO控制器,每个控制器可以控制32个IO,作为GPIO功能时, 端口⾏为由GPIO控制器寄存器配 置。
GPIO1_A4表达的意思为第1组控制器,端口号为A,索引号为4。该引脚号的计算公式为32 x 1 + 0 x 8 + 4 = 36
使用GPIO sysfs接口控制IO
在Linux中,最常见的读写GPIO方式就是用GPIO sysfs interface, 是通过操作 /sys/class/gpio 目录下的 export 、 unexport 、gpio{N}/direction, gpio{N} /value (用实际引脚号替代{N})等文件实现的,经常出现shell脚本里面。 在kernel 4.8开始,加入了libgpiod的支持;而原有基于sysfs的访问方式,将被逐渐放弃。
#以下所有操作均需要打开管理者权限使用
#使能引脚
echo 36 > /sys/class/gpio/export
#设置引脚为输入模式
echo in > /sys/class/gpio/gpio36/direction
#读取引脚的值
cat /sys/class/gpio/gpio36/value
#设置引脚为输出模式
echo out > /sys/class/gpio/gpio36/direction
#设置引脚为低电平
echo 0 > /sys/class/gpio/gpio36/value
#设置引脚为高电平
echo 1 > /sys/class/gpio/gpio36/value
#复位引脚
echo 36 > /sys/class/gpio/unexport
使用libgpiod控制IO
libgpiod是一种字符设备接口,GPIO访问控制是通过操作字符设备文件(比如 /dev/gpiodchip0 gpio控制器)实现的, 并通过libgpiod提供一些命令工具、c库以及python封装。
想要使用libgpiod,需要在板卡上安装libgpiod库。
#安装libgpiod库及头文件
sudo apt install libgpiod-dev
#安装gpiod 命令行工具
sudo apt install gpiod
常用的命令行如下,可使用 -h 查看命令相对应的使用说明(以GPIO1_A4为例)
命令 | 作用 | 使用举例 | 说明 |
---|---|---|---|
gpiodetect | 列出所有的GPIO控制器 | gpiodetect(无参数) | 列出所有的GPIO控制器 |
gpioinfo | 列出gpio控制器的引脚情况 | gpioinfo 1 | 列出第一组控制器引脚组情况 |
gpioset | 设置gpio | gpioset 1 4=0 | 设置第一组控制器编号4引脚为低电平 |
gpioget | 获取gpio引脚状态 | gpioget 1 4 | 获取第一组控制器编号4的引脚状态 |
gpiomon | 监控gpio的状态 | gpiomon 1 4 | 监控第一组控制器编号4的引脚状态 |