1. 程式人生 > >Android按鍵事件——上層與驅動的對映

Android按鍵事件——上層與驅動的對映

原創: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$ ls
Android.mk
Generic.kcm     
qwerty2.kcm  qwerty.kl             
Vendor_046d_Product_c294.kl 
Vendor_054c_Product_0268.kl    
Virtual.kcm
AVRCP.kl   
Generic.kl        
keyboards.mk  
qwerty.idc    
Vendor_045e_Product_028e.kl 
Vendor_046d_Product_c299.kl 
Vendor_05ac_Product_0239.kl
common.mk
qwerty2.idc   
qwerty.kcm    
Vendor_046d_Product_c216.kl
Vendor_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   ENTER
key 0x2   BACK
key 0x3   MENU
key 0x4   HOME
key 0x5   DPAD_LEFT
key 0x6   DPAD_RIGHT

把佈局檔案編譯進系統,在當前目錄的common.mk中,在keylayouts變數的末尾加入: my_keypad.kl\

到這裡,android鍵盤的底層驅動事件跟上層定義的按鍵事件就對應起來了。