2. GPIO

GPIO是General Purpose I/O的缩写,即通用输入输出端口,简单来说就是MCU/CPU可控制的引脚, 这些引脚通常有多种功能,最基本的是高低电平输入检测和输出,部分引脚还会与主控器的片上外设绑定, 如作为串口、I2C、网络、电压检测的通讯引脚。

Linux提供了GPIO子系统驱动框架,使用该驱动框架即可灵活地控制板子上的GPIO。

2.1. 引脚分布图

未找到图片

2.2. GPIO命名

Rockchip Pin的ID按照 控制器(bank)+端口(port)+索引序号(pin) 组成。

  • 控制器和GPIO控制器数量⼀致(GPIO0, GPIO1, GPIO2, GPIO3, GPIO4)

  • 端口固定 A、B、C和D,每个端口仅有8个索引号,(a=0,b=1,c=2,d=3)

  • 索引序号固定 0、1、2、3、4、5、6、7

rv1106具有5个GPIO控制器,可以控制32个IO,作为GPIO功能时,端口⾏为由GPIO控制器寄存器配置。

GPIO1_C4表达的意思为第1组控制器,端口号为C,索引号为4。该引脚号的计算公式为 32 x 1 + 2 x 8 + 4 = 52

  • 例如GPIO1_C4,计算公式为 32 x 1 + 2 x 8 + 4 = 52

  • 例如GPIO3_B2,计算公式为 32 x 3 + 8 x 1 + 2 = 106

  • 例如GPIO0_D6,计算公式为 32 x 0 + 8 x 3 + 6 = 30

  • 例如GPIO4_A7,计算公式为 32 x 4 + 8 x 0 + 7 = 135

板卡上除了主控芯片原生IO,也使用i2c扩展gpio(GPIO5),使用拓展IO的计算方式不一样,基地址是272,因此基于GPIO5的引脚公式需要加上基地址,

  • 例如GPIO5_PA4,计算公式为 272 + 0 x 8 + 4 = 276

  • 例如GPIO5_PB4,计算公式为 272 + 1 x 8 + 4 = 284

2.3. 使用GPIO sysfs接口控制IO

在Linux中,最常见的读写GPIO方式就是用GPIO sysfs interface, 是通过操作 /sys/class/gpio 目录下的 exportunexportgpio{N}/direction, gpio{N} /value (用实际引脚号替代{N})等文件实现的,经常出现shell脚本里面。 在kernel 4.8开始,加入了libgpiod的支持;而原有基于sysfs的访问方式,将被逐渐放弃。

GPIO举例计算

引脚

控制器

端口号

索引号

计算结果

GPIO1_C4

1

C

4

52 (32 x 1 + 8 x 2 + 4)

GPIO3_B2

3

B

2

106 (32 x 3 + 8 x 1 + 2)

GPIO0_D6

0

D

6

30 (32 x 0 + 8 x 3 + 6)

GPIO5_PA4

x

0

4

276 (272 + 8 x 0 + 4)

GPIO5_PB4

0

1

6

284 (272 + 8 x 1 + 4)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#以下所有操作均需要打开管理者权限使用
#使能引脚GPIO1_C4
echo 52 > /sys/class/gpio/export

#设置引脚为输入模式
echo in > /sys/class/gpio/gpio52/direction
#读取引脚的值
cat /sys/class/gpio/gpio52/value

#设置引脚为输出模式
echo out > /sys/class/gpio/gpio52/direction
#设置引脚为低电平
echo 0 > /sys/class/gpio/gpio52/value
#设置引脚为高电平
echo 1 > /sys/class/gpio/gpio52/value

#复位引脚
echo 52 > /sys/class/gpio/unexport

2.4. 使用libgpiod控制IO(推荐)

libgpiod是一种字符设备接口,GPIO访问控制是通过操作字符设备文件(比如 /dev/gpiodchip0 )实现的, 并通过libgpiod提供一些命令工具、c库以及python封装。

1
2
#安装gpiod 命令行工具
sudo apt install gpiod
  • gpiod工具的使用方法与sysfs接口的不同,gpiod是以控制器为单位,然后再详细到端口号和索引号,即gpiod使用两个数据确定引脚

GPIO举例计算

引脚

控制器

端口号

索引号

gpiod的使用结果

GPIO1_C4

1

C

4

1 20(8 x 2 + 4)

GPIO3_B2

3

B

2

3 10(8 x 1 + 2)

GPIO0_D6

0

D

6

0 30(8 x 3 + 6)

GPIO5_PB4

5

1

4

5 12(8 x 1 + 4)

GPIO5_PA4

5

0

4

5 4(8 x 0 + 4)

常用的命令行如下,可使用 -h 查看命令相对应的使用说明(以GPIO1_C4为例)

libgpiod命令

命令

作用

使用举例

说明

gpiodetect

列出所有的GPIO控制器

gpiodetect(无参数)

列出所有的GPIO控制器

gpioinfo

列出gpio控制器的引脚情况

gpioinfo 1

列出第一组控制器引脚组情况

gpioset

设置gpio

gpioset 1 20=0

设置第一组控制器编号20引脚为低电平

gpioget

获取gpio引脚状态

gpioget 1 20

获取第一组控制器编号20的引脚状态

gpiomon

监控gpio的状态

gpiomon 1 20

监控第一组控制器编号20的引脚状态

重要

Rockchip Pin的ID按照 控制器(bank)+端口(port)+索引序号(pin) 组成。其中端口号和索引号会合并成一个数值传入到gpiod里去 并不是所有的引脚都能够使用libgpiod控制,例如led之类的一些已经被使用的引脚。当使用这些被定义的引脚就会出现,设备繁忙,进而无法使用

2.5. FAQs

Q1:当使用GPIO时出现 gpioset: error setting the GPIO line values: Device or resource busy 或者 -bash: echo: 写错误: 设备或资源忙

A1:说明GPIO被占用了,占用的原因可能是设备树里把该引脚作为gpio或者其他复用功能被使用了。