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控制器寄存器配置。
Tips
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的访问方式,将被逐渐放弃。
以SC-3568HA举例,在40PIN引脚上挑选3个GPIO

引脚 | 控制器 | 端口号 | 索引号 | 计算结果 | PIN |
---|---|---|---|---|---|
GPIO4_D2 | 4 | D | 2 | 154 (32 x 4 + 8 x 3 + 2) | 7 |
GPIO2_D7 | 2 | D | 7 | 95 (32 x 2 + 8 x 3 + 7) | 18 |
GPIO0_C5 | 0 | C | 5 | 21 (32 x 0 + 8 x 2 + 5) | 29 |
#以下所有操作均需要打开管理者权限使用(鸿蒙系统默认就是管理者权限)
#使能引脚GPIO4_D2
echo 154 > /sys/class/gpio/export
#设置引脚为输入模式
echo in > /sys/class/gpio/gpio154/direction
#读取引脚的值
cat /sys/class/gpio/gpio154/value
#设置引脚为输出模式
echo out > /sys/class/gpio/gpio154/direction
#设置引脚为低电平
echo 0 > /sys/class/gpio/gpio154/value
#设置引脚为高电平
echo 1 > /sys/class/gpio/gpio154/value
#复位引脚
echo 154 > /sys/class/gpio/unexport
4. 拓展GPIO口
SC-3568HA上带有NCA9555芯片,NCA9555是一款24引脚CMOS器件,提供16位通用并行I2C总线数输入/输出GPIO扩展功能
4.1 拓展GPIO口引脚
目前从该芯片引出了5个IO出来使用,连接到了40PIN引脚上


NCA9555 | 40PIN |
---|---|
IO1_1 | 35 |
IO1_2 | 37 |
IO1_3 | 38 |
IO1_4 | 40 |
IO1_5 | 31 |
4.2 拓展GPIO口使用
该芯片为I2C通讯,挂载在I2C3下,驱动文件已添加,DTS配置如下:
- /arch/arm64/boot/dts/rockchip/rk3568-toybrick-x0-linux.dts
&i2c3{
nca9555:nca9555@20{
reg=<0x20>;
compatible = "novosense,nca9555";
status="okay";
gpio-controller;
#gpio-cells = <2>;
};
};
备注
在内核中使用NCA9555的IO口,其方式与普通的GPIO使用方式基本一致
例如:
//使用普通GPIO
&vcc3v3_lcd0_n {
gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>;
enable-active-high;
};
//使用NCA9555的IO
&vcc3v3_lcd1_n {
gpio = <&nca9555 3 GPIO_ACTIVE_HIGH>; //对应NCA9555 IO0_3
enable-active-high;
};
&vcc3v3_lcd2_n {
gpio = <&nca9555 10 GPIO_ACTIVE_HIGH>; //对应NCA9555 IO1_2
enable-active-high;
};