今天在android上添加了一个按键,这个按键是我随便找了一个gpio来做的,但是怎么添加都不成功,添加按键前后做了一下对比:
添加前:
(1)dtsi中:
tlmm_gpio_key {
28 qcom,pins = <&gp 107>, <&gp 108>, <&gp 109>;
27 qcom,pin-func = <0>;
26 qcom,num-grp-pins = <3>;
25 label = "tlmm_gpio_key";
24 gpio_key_active: gpio_key_active {
23 drive-strength = <2>;
22 bias-pull-up;
21 };
20 gpio_key_suspend: gpio_key_suspend {
19 drive-strength = <2>;
18 bias-pull-up;
17 };
16 };
(2)执行getevent后显示下面内容:
add device 1: /dev/input/event5
name: "msm8x16-snd-card-sbc Headset Jack"
add device 2: /dev/input/event4
name: "msm8x16-snd-card-sbc Button Jack"
add device 3: /dev/input/event2
name: "qpnp_pon"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 4: /dev/input/event1
name: "hbtp_vm"
add device 5: /dev/input/event0
name: "input_mt_wrapper"
could not get driver version for /dev/input/mice, Not a typewriter
add device 6: /dev/input/event3
name: "gpio-keys"
添加后:
(1)dtsi的内容:
tlmm_gpio_key {
28 qcom,pins = <&gp 107>, <&gp 108>, <&gp 109>, <&gp 113>;
27 qcom,pin-func = <0>;
26 qcom,num-grp-pins = <4>;
25 label = "tlmm_gpio_key";
24 gpio_key_active: gpio_key_active {
23 drive-strength = <2>;
22 bias-pull-up;
21 };
20 gpio_key_suspend: gpio_key_suspend {
19 drive-strength = <2>;
18 bias-pull-up;
17 };
16 };
(2)getevent后显示下面内容:
add device 1: /dev/input/event5
name: "msm8x16-snd-card-sbc Headset Jack"
add device 2: /dev/input/event4
name: "msm8x16-snd-card-sbc Button Jack"
add device 3: /dev/input/event2
name: "qpnp_pon"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 4: /dev/input/event1
name: "hbtp_vm"
add device 5: /dev/input/event0
name: "input_mt_wrapper"
could not get driver version for /dev/input/mice, Not a typewriter
问题原因及分析:
可以看到加了gpio113后,导致整个gpio-keys都失败了,去查看log,发现没有什么有用信息,那怎么办呢,既然是加了这个gpio出的问题,那问题肯定出在这个gpio上,
所以,要注意了,我们在选择这个gpio的时候,首先要确定这个gpio是可中断的,在我的datasheet中带有“wakeup”的gpio是可中断的,在硬件原理图中,标有星号(*)号的gpio是可以中断的,好了,这个保证了之后,还是有问题,怎么办呢?去msm××-pinctrl.dtsi中去查看有没有其他地方用到了你的这个gpio,有的话就要去掉,或者把自己的gpio换一个,说明冲突了,这些都做到后,基本上不会有什么问题了。
虽然这个功能很简单,程序也很简单,但是,一旦不细心或者想不到,好吧,当你想复杂了之后,那就各种查代码。
顺便说一下,记得添加键值:
kernel中对应的键值可以在这里找到:/kernel/include/uapi/linux/input.h
映射到上层的键值可以在这里找到:frameworks/native/include/android/keycodes.h
映射到键盘app的键值在这里可以找到:frameworks/base/core/java/android/view/KeyEvent.java
那么驱动中的键值是如何映射到android层的呢:
进入到设备:sudo adb shell
getevent -v可以看到下面的信息:
add device 6: /dev/input/event3
bus: 0019
vendor 0001
product 0001
version 0100
name: "gpio-keys"
location: "gpio-keys/input0"
id: ""
version: 1.0.1
接着进入:cd /system/usr/keylayout/
执行:ls可以到到下面的配置文件
AVRCP.kl
Generic.kl
Vendor_0079_Product_0011.kl
Vendor_045e_Product_028e.kl
Vendor_046d_Product_b501.kl
Vendor_046d_Product_c216.kl
Vendor_046d_Product_c219.kl
Vendor_046d_Product_c21d.kl
Vendor_046d_Product_c21f.kl
Vendor_046d_Product_c294.kl
Vendor_046d_Product_c299.kl
Vendor_046d_Product_c532.kl
Vendor_054c_Product_0268.kl
Vendor_0583_Product_2060.kl
Vendor_05ac_Product_0239.kl
Vendor_0b05_Product_4500.kl
Vendor_1038_Product_1412.kl
Vendor_12bd_Product_d015.kl
Vendor_1532_Product_0900.kl
Vendor_1689_Product_fd00.kl
Vendor_1689_Product_fd01.kl
Vendor_1689_Product_fe00.kl
Vendor_18d1_Product_2c40.kl
Vendor_18d1_Product_5018.kl
Vendor_1949_Product_0401.kl
Vendor_1bad_Product_f016.kl
Vendor_1bad_Product_f023.kl
Vendor_1bad_Product_f027.kl
Vendor_1bad_Product_f036.kl
Vendor_1d79_Product_0009.kl
Vendor_22b8_Product_093d.kl
Vendor_2378_Product_1008.kl
Vendor_2378_Product_100a.kl
ft5x06_ts.kl
gpio-keys.kl
qwerty.kl
synaptics_dsx.kl
synaptics_rmi4_i2c.kl
应该会存在一个Vendor_0001_Product_0001.kl文件,这个文件中存在我们添加的键值,如果没有这个文件,可以自己添加一个,不填加的话,会自己匹配相关内容,可能会出现有的按键不起作用的现象,android层的键值也是由此映射上去的。
下篇blog将趁热打铁,分析一下看一下input子系统。