高通平台gpio简单调试

版权声明:本文为博主原创文章,未经博主允许不得转载。    https://blog.youkuaiyun.com/u010164190/article/details/83860374
0.编译读写gpio寄存器地址工具:/system/bin/r
Android9.0源码地址:
system/core/toolbox/r.c
system/core/toolbox/Android.bp
cc_binary {                                                                                                                                                                                                    
    name: "r",                                                                                                                                                                                                 
    defaults: ["toolbox_defaults"],                                                                                                                                                                            
    srcs: ["r.c"],                                                                                                                                                                                             
}
 
# cd system/core/toolbox
# mm
# push r /system/bin
 
特别注意:如果gpio70已经被占用,应该在驱动代码或者.dts里注掉,否则下面的设置不生效。
1.使能gpio70
# cat /sys/kernel/debug/gpio //查看所有gpio状态信息
# cd /sys/class/gpio
# echo 70 > export
# cd gpio70
# echo out > direction
# echo 1 > value
 
2.//设置GPIO pull up
gpio寄存器地址计算和芯片平台有关,计算方式不一样.
***************************************************************************
msm8996 gpio寄存器地址: gpio基地址 + gpio号 * 0x1000(即是gpio号:70->0x46)
sdm845 gpio寄存器地址: gpio基地址 + 0x500000 + gpio号*0x1000(gpio号:70->0x46)
 
1、SDM845平台以GPIO46为例,十进制46对应的16进制为2E,每个GPIO均有
  这3个寄存器描述功能,包括输入/输出、驱动电流上/下拉、中断功能。
 
所以三个寄存器对应的地址为:
0x3400000 + 0x500000 + 0x1000*2E = 0x392E000 
0x3400000 + 0x500000 + 0x1000*2E = 0x392E004 
0x3400000 + 0x500000 + 0x1000*2E = 0x392E008 
读取方法:
/system/bin/r 0x392E000         --》0x392E000: 00000201 //0x201:out
/system/bin/r 0x392E004         --》0x392E004: 00000003 //0x03:high; 0x00;low
/system/bin/r 0x392E008         --》0x392E008: 000000e2 //0xe2:禁掉中断
对于读出来数据的定义通过寄存器对每位数据的定义可以得出:
<1>.0x201:1000000001 ---->out and pull down
          第9为=1 代表输出;
          6-8位为0,驱动能力2mA;
          2-5位0,普通GPIO功能;
          0-1=1:pull down; 2:keeper; 3:pull up; 4:no pull
    0x202: out and keeper
    0x203: out and pull up
    0x204: out and no pull
<2>0x3: 输出为高; 相当于echo 1 > value
   0x0: 输出为低; 相当于echo 0 > value
<3>.e2:11100010 
    最低位为0,代表disable中断功能
***************************************************************************
//获取gpio基地址: 0x1010000,最上边的一行
# cat /sys/kernel/debug/gpio"
GPIOs 0-149, platform/1010000.pinctrl, 1010000.pinctrl
 
70为10进制,转化为16进制为:0x46
gpio地址为:0x46 * 0x1000 + 0x1010000 = 0x1056000
 
 
3.//读gpio70的寄存器地址:
# /system/bin/r 0x1056000                                                                                                                                                    
01056000: 000002c6 //gpio70地址: 值
注意:
0x000002c5: pull down
0x000002c6: keeper
0x000002c5: pull up
 
4.//写gpio70寄存器值为0x000002c7,使之pull up
# /system/bin/r 0x1056000 0x000002c7
 
# 再读下0x1056000
# /system/bin/r 0x1056000
01056000: 000002c7
这时候可以用万用表量gpio70管脚,已经被拉高了,不是0V电压了。
 
--------------------- 
作者:慢慢的燃烧 
来源:优快云 
原文:https://blog.youkuaiyun.com/u010164190/article/details/83860374 
版权声明:本文为博主原创文章,转载请附上博文链接!

高通平台软件gpio调试可通过驱动代码和文件操作等方式进行。 在驱动代码方面,可从设备树节点获取gpio号,申请、设置和释放gpio。示例代码如下: ```c int gpio_99 = of_get_named_gpio_flags(dev->of_node, "gpio_name", 0, NULL); //从设备数节点, 可选 gpio_request(gpio_99, "gpio_name"); //通过gpio号申请gpio gpio_direction_output(gpio_99, 1); //设置gpio_99输出,初始值为1 gpio_set_value(gpio_99, 0); //设置gpio_99值为0 gpio_free(gpio_99); //gpio_99不再使用后应当释放 ``` 此代码中,首先使用`of_get_named_gpio_flags`函数从设备树节点获取gpio号,接着用`gpio_request`申请该gpio,之后通过`gpio_direction_output`设置其为输出并指定初始值,再用`gpio_set_value`设置具体值,最后使用`gpio_free`释放该gpio [^1]。 还有另一种驱动代码示例: ```c int gpio_XXX = of_get_named_gpio(dev->of_node,"gpio_name", 0); gpio_request(gpio_99, "gpio_name"); //通过gpio号申请gpio gpio_direction_output(gpio_XX, 1); //设置gpio_XX输出,初始值为1 gpio_set_value(gpio_XX, 0); //设置gpio_XX值为0 gpio_free(gpio_XX); //gpio_XX不再使用后应当释放 ``` 该代码同样是先获取gpio号,然后进行申请、设置输出和值,最后释放的操作 [^2]。 在文件操作方面,若要操作特定的gpio,需先计算出对应的gpio号。例如操作gpio42,实质上需要配置gpio(897 + 42),即gpio939。可通过以下命令进行调试: ```bash echo 939 > export cd gpio939 echo out > direction //设置gpio输出 ``` 这些命令先将gpio号导出,进入对应的gpio目录,再设置其为输出模式 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值