在/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这个关键字