GPIO 接口
1. GPIO介绍
GPIO是General Purpose I/O的缩写,即通用输入输出端口,简单来说就是MCU/CPU可控制的引脚, 这些引脚通常有多种功能,最基本的是高低电平输入检测和输出,部分引脚还会与主控器的片上外设绑定, 如作为串口、I2C、网络、电压检测的通讯引脚。
2. 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
RK3568具有5个GPIO控制器,每个控制器可以控制32个IO,作为GPIO功能时, 端口⾏为由GPIO控制器寄存器配置。
提示
GPIO1_A4表达的意思为第1组控制器,端口号为A,索引号为4。 该引脚号的计算公式为32 x 1 + 0 x 8 + 4 = 36
3. 使用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的访问方式,将被逐渐放弃。
以M4-R1举例,在40PIN引脚上挑选3个GPIO

引脚 | 控制器 | 端口号 | 索引号 | 计算结果 | PIN |
---|---|---|---|---|---|
GPIO0_D3 | 0 | D | 3 | 27 (32 x 0 + 8 x 3 + 3) | 7 |
GPIO1_B0 | 1 | B | 0 | 40 (32 x 1 + 8 x 1 + 0) | 29 |
GPIO4_B2 | 4 | B | 2 | 138 (32 x 4 + 8 x 1 + 2) | 36 |
# 注意,如果驱动占用了这个引脚,则无法通过该方法导出在用户态控制该GPIO
#使能引脚GPIO4_D2
echo 138 > /sys/class/gpio/export
#设置引脚为输入模式
echo in > /sys/class/gpio/gpio138/direction
#读取引脚的值
cat /sys/class/gpio/gpio138/value
#设置引脚为输出模式
echo out > /sys/class/gpio/gpio138/direction
#设置引脚为低电平
echo 0 > /sys/class/gpio/gpio138/value
#设置引脚为高电平
echo 1 > /sys/class/gpio/gpio138/value
#复位引脚
echo 138 > /sys/class/gpio/unexport