这篇文档介绍如何在Android下访问GPIO。
准备工作
固件版本必须满足以下条件:
- Android M >= V170603
- Android N >= V170421
如何获取GPIO数值
你可以通过GPIO banks和pins来获取。不同版本的内核数值不同。
Linux 4.9 (Android O )
- aobus-banks
Banks:
1 | root@Khadas:/home/khadas# cat /sys/kernel/debug/pinctrl/pinctrl@ff800014/gpio-ranges |
Pins:
1 | root@Khadas:/home/khadas# cat /sys/kernel/debug/pinctrl/pinctrl@ff800014/pins |
例如:获取GPIOAO_6
的数值:
Number(GPIOAO_6) = bank + pin = 496 + 6 = 502
- periphs-banks
Banks:
1 | root@Khadas:/home/khadas# cat /sys/kernel/debug/pinctrl/pinctrl@ff634480/gpio-ranges |
Pins:
1 | root@Khadas:/home/khadas# cat /sys/kernel/debug/pinctrl/pinctrl@ff634480/pins |
Linux 3.14 (Android M,N)
Banks:
1 | # cat /sys/kernel/debug/pinctrl/c1109880.pinmux/gpio-ranges |
Pins:
1 | # cat /sys/kernel/debug/pinctrl/c1109880.pinmux/pins |
例如:获取GPIOH_4
, GPIOH_5
and GPIOAO_6
的数值:
Number(GPIOH_5) = bank + pin = 155 - 10 + 31= 176
Number(GPIOH_4) = bank + pin = 155 - 10 + 30= 175
Number(GPIOAO_6) = bank + pin = 145 - 0 + 6 = 151
在Android下
GPIO 列表
1 | PIN GPIO Number |
有两种方式访问GPIO:
- 通过ADB命令
- 第三方应用
ADB命令
- 通过Wi-Fi ADB连接到VIMs
1 | $ adb connect IP_ADDR |
- 登录VIMs:
1 | $ adb shell |
- 获取root权限
1 | $ su |
- 申请GPIO(GPIOH5)
1 | $ echo 432 > /sys/class/gpio/export |
- 配置GPIO(GPIOH5)为输出
1 | $ echo out > /sys/class/gpio/gpio432/direction |
- 配置GPIO(GPIOH5)输出高电平
1 | $ echo 1 > /sys/class/gpio/gpio432/value |
- 配置GPIO(GPIOH5)输出低电平
1 | $ echo 0 > /sys/class/gpio/gpio432/value |
- 配置GPIO(GPIOH5)为输入
1 | $ echo in > /sys/class/gpio/gpio432/direction |
- 读取GPIO(GPIOH5)电平
1 | $ cat /sys/class/gpio/gpio432/value |
- 释放GPIO(GPIOH5)
1 | $ echo 432 > /sys/class/gpio/unexport |
第三方应用
- 获取root权限
1 | Process mProcess = Runtime.getRuntime().exec("su"); |
- 申请GPIO(GPIOH5)
1 | DataOutputStream os = new DataOutputStream(mProcess.getOutputStream()); |
- 配置GPIO(GPIOH5)为输出
1 | os.writeBytes("echo out > /sys/class/gpio/gpio" + 432 + "/direction\n"); |
- 配置GPIO(GPIOH5)为输入
1 | os.writeBytes("echo in > /sys/class/gpio/gpio" + 432 + "/direction\n"); |
- 读取GPIO(GPIOH5)电平
1 | Runtime runtime = Runtime.getRuntime(); |
- 释放GPIO(GPIOH5)
1 | os.writeBytes("echo " + 432 + " > /sys/class/gpio/unexport\n"); |