RK3399 Android7.1系统,GPIO控制详解

  1. 查看 GPIO 与物理引脚的对应关系
    本文以 GPIO0_A6 为例,即电路板上的 CPU 引出的零号第六个引脚,查看硬件线路与系统 gpio 路径的对应关系。

其中 rk3399 P2 引出的 GPIO0_A6 原理图与实物,如下:

首先需要计算对应的 gpio number 的值,可以通过/sys/kernel/debug/gpio 查询信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
rk3399_firefly_aioc_ai:/ $ cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-31, parent: platform/pinctrl, gpio0:
gpio-4 ( |bt_default_wake_host) in lo
gpio-5 ( |power ) in hi
gpio-9 ( |bt_default_reset ) out lo
gpio-10 ( |reset ) out hi
gpio-13 ( |firefly:yellow:user ) out lo

gpiochip1: GPIOs 32-63, parent: platform/pinctrl, gpio1:
gpio-32 ( |vcc5v0_host ) out hi
gpio-35 ( |vcc_otg_vbus ) out hi
gpio-42 ( |cs-gpio ) out hi
gpio-45 ( |pmic-hold-gpio ) out hi
gpio-46 ( |vsel ) out lo
gpio-49 ( |vdd3v3_pcie ) out lo
gpio-50 ( |vsel ) out lo
gpio-54 ( |hp-con-gpio ) out lo
gpio-56 ( |pmic-stby-gpio ) out hi

gpiochip2: GPIOs 64-95, parent: platform/pinctrl, gpio2:
gpio-66 ( |hp-det-gpio ) in lo
gpio-68 ( |power-gpio ) out hi
gpio-70 ( |vcc3v3_3g ) out hi
gpio-83 ( |bt_default_rts ) in hi
gpio-90 ( |bt_default_wake ) in lo
gpio-91 ( |firefly:blue:power ) out hi

gpiochip3: GPIOs 96-127, parent: platform/pinctrl, gpio3:
gpio-111 ( |mdio-reset ) out hi

gpiochip4: GPIOs 128-159, parent: platform/pinctrl, gpio4:
gpio-154 ( |irq-gpio ) in hi
gpio-155 ( |reset-gpio ) out hi
gpio-158 ( |vcc_sd ) out lo

通过上面的返回结果可以看到,GPIO1 是以 nubmer 为 32 开始, 那么 GPIO1*A0 就是 1 * 32 + 0 _ 8 + 0 = 32。

然后查看/sys/class/gpio 目录下存在的 gpio,这时候并没有 gpioxxxx_32,需要我们导出一个。

1
2
rk3399_firefly_aioc_ai:/ $ ls /sys/class/gpio
export gpiochip154 gpiochip155 unexport
  1. Android 系统导出 GPIO
    导出时需要切换到 root 执行 export 命令,否则权限阻止,导出命令如下:
1
2
3
4
rk3399_firefly_aioc_ai:/sys/class/gpio $ su
rk3399_firefly_aioc_ai:/sys/class/gpio # echo 32 > export
rk3399_firefly_aioc_ai:/sys/class/gpio # ls
export gpiochip154 gpiochip155 gpiochip32 unexport

此时就会发现多了一个 gpio32 的文件夹, 这个文件对应着 GPIO1_A0 引脚对应的功能。

注意:由于 rk3399 kernel 自带了通用 GPIO 驱动,所以这里可以直接 export 对应的引脚。

  1. Android 系统在用户空间使用系统命令控制 GPIO
    这里我们把 gpio32 设置为输出,这样用万用表测量起来比较方便。

进入到 gpio32 文件夹,然后 echo out > direction,如下:

1
2
rk3399_firefly_aioc_ai:/sys/class/gpio # cd gpio32/
rk3399_firefly_aioc_ai:/sys/class/gpio/gpio32 # echo out > direction
  1. GPIO 功能测试
    使能与关闭只需向 value 里传 1 和 0 即可,如下:
1
2
3
4
5
6
7
8
# 使能
rk3399_firefly_aioc_ai:/sys/class/gpio/gpio32 # echo 1 > value
rk3399_firefly_aioc_ai:/sys/class/gpio/gpio32 # cat value
1
# 关闭
rk3399_firefly_aioc_ai:/sys/class/gpio/gpio32 # echo 0 > value
rk3399_firefly_aioc_ai:/sys/class/gpio/gpio32 # cat value
0

使能 gpio32 引脚,用万用表测量下对应的针脚是否为 1.8V(FET3399-C 核心板引出的 GPIO,除了 RGMII 和 MDC,MDIO 是 3.3V 的,其余 GPIO 全部是 1.8V 电平)。

RK3399 Android7.1系统,GPIO控制详解

http://www.kch8.top/2022/11/30/rk3399-gpio-debug1/

发布于

2022-11-30

更新于

2023-08-18

许可协议

评论