1. GPIO 命名规则
RK3588 的 GPIO 命名格式:GPIO{BANK}{GROUP}{PIN}
GPIO3_D4
│ │ │
│ │ └── PIN 编号 (0-7)
│ └──── 分组 (A/B/C/D)
└──────── GPIO Bank 编号 (0-4)RK3588 Bank 划分
| Bank | 范围 | 说明 |
|---|---|---|
| GPIO0 | line 0 - 31 | 基础功能 |
| GPIO1 | line 32 - 63 | 基础功能 |
| GPIO2 | line 64 - 95 | 基础功能 |
| GPIO3 | line 96 - 127 | 扩展功能 |
| GPIO4 | line 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 = 243. 完整计算公式
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/gpiochip3GPIO4_A0
Bank = 4, Group = A(0), PIN = 0
line offset = 0 + 0 = 0
全局编号 = 4 × 32 + 0 = 128
gpiochip = /dev/gpiochip4GPIO1_B3
Bank = 1, Group = B(8), PIN = 3
line offset = 8 + 3 = 11
全局编号 = 1 × 32 + 11 = 43
gpiochip = /dev/gpiochip15. 快速查找表
Bank 0
| A | B | C | D | |
|---|---|---|---|---|
| 0 | 0 | 8 | 16 | 24 |
| 1 | 1 | 9 | 17 | 25 |
| 2 | 2 | 10 | 18 | 26 |
| 3 | 3 | 11 | 19 | 27 |
| 4 | 4 | 12 | 20 | 28 |
| 5 | 5 | 13 | 21 | 29 |
| 6 | 6 | 14 | 22 | 30 |
| 7 | 7 | 15 | 23 | 31 |
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=07. 踩坑提醒
- gpiochip 编号不一定等于 Bank 编号——看设备树(DTS)里 GPIO 控制器的注册顺序,大多数情况下一致,但别想当然,跑一下
gpiodetect确认 - line offset 是 Bank 内偏移,不是全局编号。
gpiod_chip_get_line(chip, offset)传的是 Bank 内的偏移值 - 换引脚只需改两处:launch 文件里的
gpio_line和代码里的默认值