Android按键事件——上层与驱动的映射

来源:互联网 发布:php date日期格式化 编辑:程序博客网 时间:2024/04/19 05:35

原创:M_r_D

转载请注明出处!

    首先查看android对上层按键事件的定义,在头文件<KeycodeLabels.h>中:

static const KeycodeLabel KEYCODES[] = {    { "SOFT_LEFT", 1 },    { "SOFT_RIGHT", 2 },    { "HOME", 3 },    { "BACK", 4 },    { "CALL", 5 },    { "ENDCALL", 6 },    { "0", 7 },    { "1", 8 },    { "2", 9 },    { "3", 10 },    { "4", 11 },    { "5", 12 },    { "6", 13 },    { "7", 14 },    { "8", 15 },    { "9", 16 },    { "STAR", 17 },    { "POUND", 18 },    { "DPAD_UP", 19 },    { "DPAD_DOWN", 20 },    { "DPAD_LEFT", 21 },    { "DPAD_RIGHT", 22 },    { "DPAD_CENTER", 23 },    { "VOLUME_UP", 24 },    { "VOLUME_DOWN", 25 },    { "POWER", 26 },    { "CAMERA", 27 },    { "CLEAR", 28 },    { "A", 29 },    { "B", 30 },    { "C", 31 },    { "D", 32 },    { "E", 33 },    { "F", 34 },    { "G", 35 },    { "H", 36 },    { "I", 37 },    { "J", 38 },    { "K", 39 },    { "L", 40 },    { "M", 41 },    { "N", 42 },    { "O", 43 },    { "P", 44 },    { "Q", 45 },    { "R", 46 },    { "S", 47 },    { "T", 48 },    ...    { "BUTTON_14", 201 },    { "BUTTON_15", 202 },    { "BUTTON_16", 203 },    { "LANGUAGE_SWITCH", 204 },    { "MANNER_MODE", 205 },    { "3D_MODE", 206 },    { "CONTACTS", 207 },    { "CALENDAR", 208 },    { "MUSIC", 209 },    { "CALCULATOR", 210 },    { "ZENKAKU_HANKAKU", 211 },    { "EISU", 212 },    { "MUHENKAN", 213 },    { "HENKAN", 214 },    { "KATAKANA_HIRAGANA", 215 },    { "YEN", 216 },    { "RO", 217 },    { "KANA", 218 },    { "ASSIST", 219 },    // NOTE: If you add a new keycode here you must also add it to several other files.    //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.    { NULL, 0 }};
左边是事件的名称,根据字面意思非常容易了解其作用;右边是对应的事件号,比如我们在终端敲入"input keyevent 4"命令,就可以产生BACK的效果。上层按键事件的定义个人建议不要修改,如果增加了一个新的按键事件的定义,也要到KeyEvent.java里面作相应的修改。

    按键的底层驱动事件是驱动开发人员自行定义的,这里我们只关心它上报的事件和对应的按键号。假如设备现在有6个按键,其对应的按键事件为:

按键                       事件

key 1                     0x01

key 2                     0x02

key 3                     0x03

key 4                     0x04

key 5                     0x05

key 6                     0x06

   

    目前的情况是,android上层已经有按键事件的定义了,底层驱动也有按键事件上报。但是缺少了中间的对接层,也就是说哪个按键对应哪种事件还不清楚。所以,需要为它们加入一个布局文件。按键的布局文件存放在frameworks/base/data/keyboards目录下,以.kl为后缀的文件都是键盘的布局文件,ls一下:

android-4.2_r1/frameworks/base/data/keyboards$ lsAndroid.mkGeneric.kcm     qwerty2.kcm  qwerty.kl             Vendor_046d_Product_c294.kl Vendor_054c_Product_0268.kl    Virtual.kcmAVRCP.kl   Generic.kl        keyboards.mk  qwerty.idc    Vendor_045e_Product_028e.kl Vendor_046d_Product_c299.kl Vendor_05ac_Product_0239.klcommon.mkqwerty2.idc   qwerty.kcm    Vendor_046d_Product_c216.klVendor_046d_Product_c532.kl Vendor_22b8_Product_093d.kl

    具体读取哪个布局文件是根据驱动的名字来确定的,如果找不到与驱动名字相同的文件,就会读取默认文件Generic.kl。现在我们假设键盘在驱动层的名字为“my_keypad”,所以需要创建一个名为“my_keypad,kl”的布局文件。文件的内容是什么呢,不急。目前还有一点不明确,上面提到的6个按键的作用我们还没有定义。假设定义如下:

按键                        作用

key 1                      确定

key 2                      返回

key 3                      菜单

key 4                      主解面

key 5                      左移

key 6                      右移

对应的布局文件“my_keypad,kl”的内容就应该为:

key 0x1   ENTERkey 0x2   BACKkey 0x3   MENUkey 0x4   HOMEkey 0x5   DPAD_LEFTkey 0x6   DPAD_RIGHT

把布局文件编译进系统,在当前目录的common.mk中,在keylayouts变量的末尾加入: my_keypad.kl\

到这里,android键盘的底层驱动事件跟上层定义的按键事件就对应起来了。