2.GPIO
2.1 GPIO介绍
GPIO是General Purpose I/O的缩写,即通用输入输出端口,简单来说就是MCU/CPU可控制的引脚, 这些引脚通常有多种功能,最基本的是高低电平输入检测和输出,部分引脚还会与主控器的片上外设绑定, 如作为串口、I2C、网络、电压检测的通讯引脚。
2.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
2.3 使用GPIO sysfs接口控制IO
2.3.1 命令行的方式
在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 |
1#以下所有操作均需要打开管理者权限使用(鸿蒙系统默认就是管理者权限)
2#使能引脚GPIO4_D2
3echo 154 > /sys/class/gpio/export
4
5#设置引脚为输入模式
6echo in > /sys/class/gpio/gpio154/direction
7#读取引脚的值
8cat /sys/class/gpio/gpio154/value
9
10#设置引脚为输出模式
11echo out > /sys/class/gpio/gpio154/direction
12#设置引脚为低电平
13echo 0 > /sys/class/gpio/gpio154/value
14#设置引脚为高电平
15echo 1 > /sys/class/gpio/gpio154/value
16
17#复位引脚
18echo 154 > /sys/class/gpio/unexport
2.4 拓展GPIO口
SC-3568HA上带有NCA9555芯片,NCA9555是一款24引脚CMOS器件,提供16位通用并行I2C总线数输入/输出GPIO扩展功能
2.4.1 拓展GPIO口引脚
目前从该芯片引出了5个IO出来使用,连接到了40PIN引脚上
NCA9555 |
40PIN |
---|---|
IO1_1 |
35 |
IO1_2 |
37 |
IO1_3 |
38 |
IO1_4 |
40 |
IO1_5 |
31 |
2.4.1 拓展GPIO口使用
该芯片为I2C通讯,挂载在I2C3下,驱动文件已添加,DTS配置如下:
/arch/arm64/boot/dts/rockchip/rk3568-toybrick-x0-linux.dts
1&i2c3{
2 nca9555:nca9555@20{
3 reg=<0x20>;
4 compatible = "novosense,nca9555";
5 status="okay";
6 gpio-controller;
7 #gpio-cells = <2>;
8 };
9};
备注
在内核中使用NCA9555的IO口,其方式与普通的GPIO使用方式基本一致
例如:
1//使用普通GPIO
2&vcc3v3_lcd0_n {
3 gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>;
4 enable-active-high;
5};
6
7//使用NCA9555的IO
8&vcc3v3_lcd1_n {
9 gpio = <&nca9555 3 GPIO_ACTIVE_HIGH>; //对应NCA9555 IO0_3
10 enable-active-high;
11};
12
13&vcc3v3_lcd2_n {
14 gpio = <&nca9555 10 GPIO_ACTIVE_HIGH>; //对应NCA9555 IO1_2
15 enable-active-high;
16};