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的引脚状态  | 

















![[ansible] playbook运用](https://img-blog.csdnimg.cn/direct/c7b90c3d4966472dbfc938518e25df44.png)
