Skip to content

1. GPIO 命名规则

RK3588 的 GPIO 命名格式:GPIO{BANK}{GROUP}{PIN}

GPIO3_D4
 │ │ │
 │ │ └── PIN 编号 (0-7)
 │ └──── 分组 (A/B/C/D)
 └──────── GPIO Bank 编号 (0-4)

RK3588 Bank 划分

Bank范围说明
GPIO0line 0 - 31基础功能
GPIO1line 32 - 63基础功能
GPIO2line 64 - 95基础功能
GPIO3line 96 - 127扩展功能
GPIO4line 128 - 159扩展功能

2. Group 偏移计算

每个 Bank 有 32 个引脚,按 A/B/C/D 四组分组,每组 8 个:

Pin 编号
 0  1  2  3  4  5  6  7   A0-A7 → offset 0-7
 8  9 10 11 12 13 14 15   B0-B7 → offset 8-15
16 17 18 19 20 21 22 23   C0-C7 → offset 16-23
24 25 26 27 28 29 30 31   D0-D7 → offset 24-31

计算公式:

line offset = Group偏移 + PIN编号

Group偏移:
 A = 0
 B = 8
 C = 16
 D = 24

3. 完整计算公式

line offset = Group偏移 + PIN编号
全局编号 = Bank编号 × 32 + line offset
gpiochip = /dev/gpiochip{Bank编号}  ← 通常 Bank 与 gpiochip 一一对应

4. 实例计算

GPIO3_D4

Bank = 3, Group = D(24), PIN = 4

line offset = 24 + 4 = 28
全局编号 = 3 × 32 + 28 = 124
gpiochip = /dev/gpiochip3

libgpiod 调用: gpiod_chip_open("/dev/gpiochip3"), gpiod_chip_get_line(chip, 28)

GPIO3_C6

Bank = 3, Group = C(16), PIN = 6

line offset = 16 + 6 = 22
全局编号 = 3 × 32 + 22 = 118
gpiochip = /dev/gpiochip3

GPIO4_A0

Bank = 4, Group = A(0), PIN = 0

line offset = 0 + 0 = 0
全局编号 = 4 × 32 + 0 = 128
gpiochip = /dev/gpiochip4

GPIO1_B3

Bank = 1, Group = B(8), PIN = 3

line offset = 8 + 3 = 11
全局编号 = 1 × 32 + 11 = 43
gpiochip = /dev/gpiochip1

5. 快速查找表

Bank 0

ABCD
0081624
1191725
22101826
33111927
44122028
55132129
66142230
77152331

Bank 1(line 偏移 = 上表 + 32)

Bank 2(line 偏移 = 上表 + 64)

Bank 3(line 偏移 = 上表 + 96)

Bank 4(line 偏移 = 上表 + 128)

6. 验证命令

bash
# 查看所有 gpiochip
gpiodetect

# 查看 gpiochip3 的所有 line
gpioinfo gpiochip3

# 监控特定 GPIO(以 GPIO3_D4 为例)
sudo gpiomon --format="%s.%n %e" gpiochip3 28

# 读取 GPIO 状态
sudo gpioget gpiochip3 28

# 设置 GPIO 电平(输出模式)
gpioset gpiochip3 28=1
gpioset gpiochip3 28=0

7. 踩坑提醒

  • gpiochip 编号不一定等于 Bank 编号——看设备树(DTS)里 GPIO 控制器的注册顺序,大多数情况下一致,但别想当然,跑一下 gpiodetect 确认
  • line offset 是 Bank 内偏移,不是全局编号。gpiod_chip_get_line(chip, offset) 传的是 Bank 内的偏移值
  • 换引脚只需改两处:launch 文件里的 gpio_line 和代码里的默认值