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

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引脚上

GPIO_1

GPIO_2

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};