ADB操作GPIO口
确定GPIO Base Addr
开机,adb shell 进入系统

cd /sys/class/gpio
ls
如下图所示:
这里能看到很多gpiochipxxx,这里的gpiochip可以理解为模块内部的各种器件(如基带芯片msm8953、pm8953等等),每个器件下对应了一些GPIO口,msm8953基带芯片的GPIO口对应gpiochip0。
查看cat /sys/kernel/debug/gpio,如下图:
从上图可以看出msm8953对应GPIOs 0-141,对应的GPIO Base Addr是从0开始。
我们以GPIO_1为例,那么GPIO_0的BaseAddr = 0 + 1 = 1,须要操作的工具是gpio1。
GPIO掌握
前辈行export操作
cd /sys/class/gpio
su
echo 1 > export
ls
可以看到多了一个gpio1,解释GPIO_1的export操作已经成功。
设置GPIO口输出口
echo out > gpio1/direction
cat gpio1/direction
设置GPIO口输出高电平
echo 1 > gpio1/value
cat gpio1/value
可以看到gpio1的值已经为1。同时用万用表丈量一下GPIO_1所对应的硬件管脚,能够量到1.8V的高电平。
通过寄存器修正GPIO口配置
GPIO寄存器地址
根据msm8953的硬件寄存器手册,GPIO干系寄存器如下:
0x01000000+TLMM_GPIO_CFGn, n=[0..141]
0x01000004+TLMM_GPIO_IN_OUTn, n=[0..141]
0x01000008+TLMM_GPIO_INTR_CFGn, n=[0..141]
n的范围是0~141,对应msm8953所有的GPIO口。
寄存器地址打算方法为 0x0100000X+n0x1000。
比如,GPIO_1的TLMM_GPIO_CFG寄存器地址 = 0x01000000+10x1000 = 0x01001000
修正GPIO配置
TLMM_GPIO_CFG描述如下:
以GPIO_1为例,设置GPIO_1为输出口,驱动能力8mA,内部下拉。
./system/bin/r 0x01001000 0x000002C1
0x00002C1对应二进制 0x0000001011000001
bit9 = 1 // GPIO_OE(输出使能位); 配置输出高电平或低电平时,该bit须要先配置。
bit8~6 = 3 // DRV_8_MA
bit5~2 = 0 // FUNC_SEL为GPIO功能
bit1~0 = 0 // PULL_DOWN
修正GPIO输出值
TLMM_GPIO_IN_OUT描述如下:
以GPIO_1为例,bit1为输出值。
输出高电平:
./system/bin/r 0x01001004 0x00000002
输出低电平
./system/bin/r 0x01001004 0x00000000
1. 设备树增加节点,如下面所示:
+ pwr {+ compatible = "qcom,pwr";+ dev_name = "pwr";+ status = "okay";+ gpio_zero = <&msm_gpio 1 0x0>;+ };+
2. kernel/driver/ 下新建一个驱动 gpio_control。
Makefile 里面增加编译选项:
+obj-y += gpio_control/
gpio_control驱动包括Makefile和pwr.c。
Makefile内容:
obj-y += pwr.o
pwr.c代码实现采取通用的linux接口,包括以下函数:
gpio_request / gpio_direction_output / gpio_set_value / gpio_free
https://uploader.shimo.im/f/sYbIH8PWKDgxubM4.c?attname=pwr.c&download
参考文档
《80-p2472-2x_c_msm8953_hardware_register_description.pdf》