input之key(一)

  今天在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子系统。


















你可能感兴趣的:(input之key(一))