Linux提供了GPIO子系统驱动框架,使用该驱动框架即可灵活地控制板子上的GPIO。
GPIO命名
泰山派开发板板载了一个40PIN 2.54间距的贴片排针,排针的引脚定义兼容经典40PIN接口。
在后续对GPIO进行操作前,我们需要先了解k3566的GPIO命名规则, 此处以 GPIO0_B7 举例:
GPIO | 0 | B7 |
控制器(bank) | 端口(port) | 索引序号(pin) |
- 控制器(bank):rk3566有5个GPIO控制器分别是GPIO0-GPIO4,一个控制器下面包含ABCD个端口,每个端口下有包含0-7个索引序号,所以一个控制器可控制32个IO引脚。
- 端口(port): A、B、C、D。对应着数字:0-3所以A=0、B=1、C=2、D=3
- 索引序号(pin):固定为0-7共计8个数
代入 GPIO0_B7 ,该引脚的 ID 可以按照以下规则组成:
控制器 (bank) 为 0,表示第 0 组控制器。
端口(port)为 B,表示端口号为1。
索引序号(pin)为7。
根据计算公式:32 x 0 + 1 x 8 + 7 = 15,可以得到引脚ID为15。
sysfs操控GPIO
在Linux中,最常见的读写GPIO方式就是用GPIO sysfs interface, 是通过操作 /sys/class/gpio 目录下的 export 、 unexport 、gpio{N}/direction, gpio{N} /value (用实际引脚号替代{N})等文件实现的,经常出现shell脚本里面。 在kernel 4.8开始,加入了libgpiod的支持;而原有基于sysfs的访问方式,将被逐渐放弃。
GPIO输出测试
使用杜邦线连接GPIO0_B7 引脚 和 核心板的P53引脚,看看能否使用下面的代码控制核心板的LED,实现亮灭效果。当然也可以接入逻辑分析仪,通过查看高低电平的变化。
#以下所有操作均需要打开管理者权限使用# 将引脚号 15 导出为 GPIO 引脚,使其可以被访问和控制。
echo 15 > /sys/class/gpio/export# 将引脚号 15 的方向设置为输出模式,即设置为输出引脚。
echo out > /sys/class/gpio/gpio15/direction# 将引脚号 15 的值设置为 1,即将引脚设置为高电平。
echo 1 > /sys/class/gpio/gpio15/value# 将引脚号 15 的值设置为 0,即将引脚置设置为低电平。
echo 0 > /sys/class/gpio/gpio15/value # 将引脚号 15 解除导出,即取消对引脚号 15 的 GPIO 控制权。
echo 15> /sys/class/gpio/unexport
GPIO输入测试
使用杜邦线连接GPIO0_B7 引脚 和 核心板的P32引脚(核心板上面的按钮外接了P32) ,然后对按键进行按下和弹起操作,并且通过下面的代码打印出来的值。
#以下所有操作均需要打开管理者权限使用# 将引脚号 15 导出为 GPIO 引脚,使其可以被访问和控制。
echo 15 > /sys/class/gpio/export# 将引脚号 15 的方向设置为输入模式,即设置为输入引脚。
echo in > /sys/class/gpio/gpio15/direction# 读引脚的值,结果为1或0,更具引脚实际电平决定。
cat /sys/class/gpio/gpio15/value # 将引脚号 15 解除导出,即取消对引脚号 15 的 GPIO 控制权。
echo 15> /sys/class/gpio/unexport
libgpiod操控GPIO
libgpiod是一种字符设备接口,GPIO访问控制是通过操作字符设备文件(比如 /dev/gpiodchip0 gpio控制器)实现的, 并通过libgpiod提供一些命令工具、c库以及python封装。想要使用libgpiod,需要在板卡上安装libgpiod库。
#安装libgpiod库及头文件
sudo apt install libgpiod-dev #安装gpiod 命令行工具
sudo apt install gpiod
常用的命令行如下,可使用 -h 查看命令相对应的使用说明(以GPIO0_B7为例)
命令 | 作用 | 使用举例 | 说明 |
gpiodetect | 列出所有的GPIO控制器 | gpiodetect(无参数) | 列出所有的GPIO控制器 |
gpioinfo | 列出gpio控制器的引脚情况 | gpioinfo 0 | 列出第0组控制器引脚组情况 |
gpioset | 设置gpio | gpioset 0 15=0 | 设置第0组控制器编号7引脚为低电平 |
gpioget | 获取gpio引脚状态 | gpioget 0 15 | 获取第0组控制器编号7的引脚状态 |
gpiomon | 监控gpio的状态 | gpiomon 0 15 | 监控第0组控制器编号7的引脚状态 |