系统bug系列------rgpio读gpio状态出错

  在/system/core/toolbox下有个tool-rgpio用来读取gpio的状态

正好需要用来读一下某个gpio的状态,但是发现哪怕外面修改成了output,用这个tool读也是一个结果input

如下

ASUS_Z01F_1:/ # rgpio
gpio_number I/O driving func_sel gpio_pull gpio_value
    000      I    02mA      0    pull_down    low   
    001      I    02mA      0    pull_down    low   
    002      I    02mA      0    pull_down    low   
    003      I    02mA      0    pull_down    low   
    004      I    02mA      2     no_pull     high  
    005      I    02mA      2     no_pull     low   
    006      I    02mA      0     no_pull     high  
    007      I    02mA      0     no_pull     high  
    008      I    02mA      0    pull_down    low   
    009      I    02mA      0    pull_down    low   
    010      I    02mA      0     no_pull     high  
    011      I    02mA      0     no_pull     high  
    012      I    02mA      0     pull_up     high  
    013      I    02mA      0     pull_up     high  
    014      I    02mA      3     pull_up     high  
    015      I    02mA      3     pull_up     high  
    016      I    02mA      0    pull_down    low   
    017      I    02mA      0    pull_down    low   
    018      I    02mA      0     no_pull     high  
    019      I    02mA      0     no_pull     high  
    020      I    02mA      0    pull_down    low   
    021      I    02mA      0    pull_down    low   
    022      I    02mA      0     no_pull     high  
    023      I    02mA      0     no_pull     high  
    024      I    02mA      1    pull_down    low   
    025      I    02mA      0    pull_down    low   
    026      I    02mA      1    pull_down    low   
    027      I    02mA      1    pull_down    low   
    028      I    02mA      0    pull_down    low   
    029      I    02mA      1     no_pull     high  
    030      I    02mA      1     no_pull     high  
    031      I    02mA      0    pull_down    low   
    032      I    02mA      0    pull_down    low   
    033      I    02mA      0    pull_down    low   
    034      I    02mA      0     pull_up     high  
    035      I    02mA      0    pull_down    low   
    036      I    02mA      0    pull_down    low   
    037      I    02mA      0    pull_down    low   
    038      I    02mA      0    pull_down    low   
    039      I    02mA      0    pull_down    low   
    040      I    02mA      0    pull_down    low   
    041      I    08mA      0     pull_up     low   
    042      I    02mA      0    pull_down    low   
    043      I    16mA      0     pull_up     high  
    044      I    02mA      0    pull_down    low   
    045      I    02mA      0     no_pull     low   
    046      I    02mA      0    pull_down    low   
    047      I    02mA      0    pull_down    low   
    048      I    16mA      0     no_pull     low   
    049      I    02mA      0    pull_down    low   
    050      I    02mA      0    pull_down    high  
    051      I    02mA      0     no_pull     low   
    052      I    02mA      0     no_pull     low   
    053      I    02mA      0     no_pull     low   
    054      I    16mA      0     pull_up     low   
    055      I    02mA      0     no_pull     low   
    056      I    02mA      0     no_pull     low   
    057      I    02mA      0     no_pull     low   
    058      I    16mA      0     pull_up     low   
    059      I    02mA      0    pull_down    low   
    060      I    02mA      0    pull_down    low   
    061      I    02mA      0    pull_down    high  
    062      I    02mA      0    pull_down    low   
    063      I    02mA      0     pull_up     low   
    064      I    02mA      0    pull_down    high  
    065      I    16mA      0     pull_up     high  
    066      I    16mA      0     pull_up     high  
    067      I    02mA      1     no_pull     low   
    068      I    02mA      1     no_pull     low   
    069      I    02mA      1     no_pull     low   
    070      I    02mA      2     no_pull     low   
    071      I    02mA      2     no_pull     low   
    072      I    02mA      2     no_pull     low   
    073      I    02mA      1     no_pull     low   
    074      I    02mA      1     no_pull     low   
    075      I    02mA      0    pull_down    low   
    076      I    06mA      1    pull_down    low   
    077      I    06mA      1    pull_down    low   
    078      I    06mA      1    pull_down    low   
    079      I    06mA      1    pull_down    low   
    080      I    06mA      1    pull_down    low   
    081      I    02mA      0    pull_down    low   
    082      I    02mA      0    pull_down    low   
    083      I    02mA      0    pull_down    low   
    084      I    02mA      0    pull_down    low   
    085      I    02mA      0     pull_up     high  
    086      I    02mA      0    pull_down    low   
    087      I    16mA      0     no_pull     high  
    088      I    02mA      1    pull_down    low   
    089      I    02mA      1     no_pull     low   
    090      I    02mA      1     no_pull     low   
    091      I    02mA      1    pull_down    low   
    092      I    02mA      1    pull_down    low   
    093      I    02mA      1    pull_down    low   
    094      I    02mA      0    pull_down    low   
    095      I    02mA      0    pull_down    low   
    096      I    02mA      0     no_pull     low   
    097      I    02mA      0    pull_down    low   
    098      I    02mA      0    pull_down    low   
    099      I    02mA      0    pull_down    low   
    100      I    02mA      0    pull_down    low   
    101      I    02mA      0    pull_down    low   
    102      I    02mA      0    pull_down    low   
    103      I    02mA      0    pull_down    low   
    104      I    02mA      0    pull_down    low   
    105      I    02mA      0    pull_down    low   
    106      I    02mA      0    pull_down    low   
    107      I    02mA      0    pull_down    low   
    108      I    02mA      0    pull_down    low   
    109      I    02mA      0    pull_down    low   
    110      I    02mA      0    pull_down    low   
    111      I    02mA      0    pull_down    low   
    112      I    02mA      0    pull_down    low   
    113      I    02mA      0    pull_down    low   
    114      I    02mA      0    pull_down    low   
    115      I    02mA      0    pull_down    low   
    116      I    02mA      0    pull_down    low   
    117      I    02mA      0    pull_down    low   
    118      I    02mA      0    pull_down    low   
    119      I    02mA      0    pull_down    low   
    120      I    02mA      0    pull_down    low   
    121      I    02mA      0    pull_down    low   
    122      I    02mA      0    pull_down    low   
    123      I    02mA      0    pull_down    low   
    124      I    02mA      0    pull_down    low   
    125      I    02mA      0    pull_down    low   
    126      I    02mA      0    pull_down    low   
    127      I    02mA      0    pull_down    low   
    128      I    16mA      0     no_pull     low   
    129      I    02mA      0     no_pull     high  
    130      I    02mA      0     no_pull     low   

追了code,发现

uint32_t* value = (uint32_t*) (((uintptr_t) page) + (addr & 4095));这个值始终一样,读任何gpio都是

后来发case问了qcom才发现

原来应该改成

volatile uint32_t* value = (uint32_t*) (((uintptr_t) page) + (addr & 4095));

因为android N的编译器做了优化,把这个值放到了register中,而外界改这个值的时候是改的内存里的值,所以始终没有更新


而且如果不加volatile而且指针是指向堆分配的(malloc类型或者mmap类型),if((*value)&0x200)的结果是不可预知的


这是头一回遇到真的需要volatile这个关键字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值