Android底層和中介層共同學習系列之android鍵盤對應

來源:互聯網
上載者:User

                                            (轉載請說明來自國內最大Android社區androidin底層驅動論壇分支,國內最大linux社區Linuxforum 嵌入式linux分支)
                                                
                                            (Email :hongjiujing@gmail.com)
                                                   (此文章適合於初學者,說的不對的地方歡迎大家指正和完善。大牛們可以繞道^^)

介紹
功能
鍵布局映射
        鍵映射的選擇
        檔案格式
        鍵布局對應檔樣本
鍵字元對應表
        鍵字元對應表的選擇
        檔案格式
        資源二進位檔案格式

完善您自己的驅動
示列

介紹:
     本文主要描述了鍵輸入怎麼轉換成Android應用程式層的行為資訊和怎樣自訂鍵的布局和鍵的字元對應表,滿足裝置的需要。
註:
       Android的應用不僅僅是平板電腦,MID,phone,還可以放到STB機頂盒,智能家庭終端上面去,所以按鍵的映射是一定要自訂的,不管按鍵是固定在裝置上,還是通過無線裝置還是藍芽遙控,都需要鍵的映射。
       Android也是基於Linux的核心,大部分時候都是作業系統在調度任務,執行任務。相應的,Android輸入系統也是遵循LINUX的input輸入輸出子系統,關於這部分的分析可以Google,有許多原理方面的分析。Android使用標準的Linux輸入事件裝置(/dev/event0),驅動描述可以查看核心樹標頭檔include/linux/input.h。如果想深入學習Linux input subsystem,可以訪問:http://git.kernel.org/?p=linux/k ... /linux-2.6.24.y.git;a=blob;f=Documentation/input/input.txt

註:event0是您的keypad/gpio-key註冊到核心的節點號,如果有其他的輸入裝置註冊進核心,也可以是event1。

功能性

   Android輸入事件裝置,用的是中斷(硬體觸發)或者輪詢結構(軟體類比),擷取裝置具體的掃描碼,通過input_event()轉化成標準的核心可接受的事件。
  鍵映射驅動的其他主要驅動是建立一個probe函數,用於註冊中斷或者您的軟體類比的輪詢功能函數,硬體初始化,用input_register_device()註冊驅動/裝置到輸入輸出系統。
  註:關於probe屬於linux裝置驅動模型相關知識,可以閱讀LDD3或者LINUX裝置驅動原理與實踐,有很詳細的描述。 

下面表描述了從鍵盤輸入最終轉成相應應用行為的轉化步驟

步驟                                                        行為                                                                                                解釋  
1                                        視窗管理器從Linux鍵盤驅動擷取鍵盤事件                                                         按鍵訊息不指定任何邏輯事件,它只與其硬體位置有關, 也就是說,按鍵的鍵盤碼沒有任何軟體含義,映射鍵盤碼
2                                        視窗管理器映射掃描碼為鍵碼。                                                                        當視窗管理器從驅動讀到一個鍵,它利用那個鍵布局對應檔將掃描碼映射為索引值。特別的,這個索引值就是螢幕顯示的條碼。例如
                                                                                                                                                        KEYCODE_DPAD_CENTER是導航五位鍵的中間的鍵,即使ALT+G產生一個"?"字元,事實上KEYCODE_G就是這個索引值。

3                                       視窗管理器發送掃描碼和鍵碼到應用程式`                                                        掃描碼和鍵碼被當前焦點所在介面處理,具體"翻譯"要看具體的應用場合。        

鍵布局映射

如何選擇一個鍵布局對應檔
鍵布局對應檔通常放在/system/usr/keylayout和/data/usr/keylayout

對於每一個鍵盤裝置xxx,設定系統屬性android.keylayout.xxx,如果沒有為自己的硬體裝置建立一個特定的裝置,Android將去讀/system/usr/keylayout/qwerty.kl這個設定檔。

註:如果設定系統屬性,請查看ttp://www.kandroid.org/android_pdk/build_new_device.html

檔案格式:
鍵對應檔通常以UTF8文字檔格式儲存於裝置,通常有如下特性:
注釋:用#表示,以#開頭的內容都將被忽略。
空白:所有的空行被忽略
鍵定義:鍵定義遵循如下格式key SCANCODE KEYCODE [FLAGS...],當掃描碼是一個數字,鍵碼定義在你描述的布局檔案android.keylayout.xxx,另外可以設定相關的FLAGS:
SHIFT: 當按下,自動加上SHIFT索引值
ALT:當按下,自動加上ALT
CAPS:當按下,自動帶上CAPS大寫
WAKE:當按下,當裝置進入睡眠的時候,按下這個鍵將喚醒,而且發送訊息給應用程式層。
WAKE_DROPPED:當按下,且裝置正處於睡眠,裝置被喚醒,但是不發送訊息給應用程式層。

鍵盤對應檔案樣本:
android/src/device/product/generic/tuttle2.kl
# Copyright 2007 The Android Open Source Project

key 2     1
key 3     2
key 4     3
key 5     4
key 6     5
key 7     6
key 8     7
key 9     8
key 10    9
key 11    0
key 158   BACK              WAKE_DROPPED
key 230   SOFT_RIGHT        WAKE
key 60    SOFT_RIGHT        WAKE
key 107   ENDCALL           WAKE_DROPPED
key 62    ENDCALL           WAKE_DROPPED
key 229   MENU         WAKE_DROPPED
key 59    MENU         WAKE_DROPPED
key 228   POUND
key 227   STAR
key 231   CALL              WAKE_DROPPED
key 61    CALL              WAKE_DROPPED
key 232   DPAD_CENTER       WAKE_DROPPED
key 108   DPAD_DOWN         WAKE_DROPPED
key 103   DPAD_UP           WAKE_DROPPED
key 102   HOME              WAKE
key 105   DPAD_LEFT         WAKE_DROPPED
key 106   DPAD_RIGHT        WAKE_DROPPED
key 115   VOLUME_UP
key 114   VOLUME_DOWN
key 116   POWER             WAKE
key 212   SLASH

key 16    Q
key 17    W
key 18    E
key 19    R
key 20    T
key 21    Y
key 22    U
key 23    I
key 24    O
key 25    P

key 30    A
key 31    S
key 32    D
key 33    F
key 34    G
key 35    H
key 36    J
key 37    K
key 38    L
key 14    DEL
        
key 44    Z
key 45    X
key 46    C
key 47    V
key 48    B
key 49    N
key 50    M
key 51    COMMA
key 52    PERIOD
key 28    ENTER 
        
key 56    ALT_LEFT
key 42    SHIFT_LEFT
key 215   AT
key 57    SPACE
key 53    SLASH
key 127   SYM
key 100   ALT_LEFT

key 399   GRAVE
鍵字元對應表:
鍵字元對應表位於:/system/usr/keychars和/data/usr/keychars!
比如對於一個特定的裝置xxx,設定android.keychar.xxx系統屬性,用全路徑表示去描述所需的鍵字元對應表。如果你沒有描述任何一個鍵字元對應表,系統將預設使用/system/usr/keychar/qwerty.kl!
註:這一點可以在開發板接USB KEYBOARD的時候,將logcat開啟看調試資訊,會看到default to qwerty.kl類似的資訊。

檔案格式:
鍵字元對應表檔案以二進位減少載入時間的形式儲存於裝置中,鍵字元對應表檔案有如下特徵:
注釋:以#開始為注釋
空行:所有的空行被忽略
列定義:當一個事件來臨的時候按下按鍵組合。這個事通常是MODIFIER_SHIFT,MODIFIER_CTRL,MODIFIER_ALT的組合。
O                                         no modifiers
S                                         MODIFIER_SHIFT
C                                         MODIFIER_CONTROL
L                                         MODIFIER_CAPS_LOCK
A                                         MODIFIER_ALT
索引值定義:索引值定義遵循如下規則:
鍵 掃描碼 字元[....]
掃描碼和字元通常是一個十進位的值或者是UTF8字元,可以通過strtol的解析。

鍵字元檔案的樣本:
下面這個檔案來自於android/src/device/product/generic/tuttle2.kcm,代表了一個完整的鍵字元檔案。
以type開始的語句描述了你所要描述鍵盤的類型,大體分為三種
1:NUMERIC,12鍵的數字鍵台
2:Q14:鍵盤包括所有的字元,但是可以一鍵多個字元。
3:QWERTY鍵盤包括了所有可能的字元和數字,類似於全鍵盤。
下面是一個QWERTY全鍵盤的定義樣本,因為android主要用於手機,手機一般是全鍵。
# Copyright 2007 The Android Open Source Project

[type=QWERTY]

# keycode   base    caps    fn      caps_fn number  display_label

A           'a'     'A'     '%'     0x00    '%'     'A'
B           'b'     'B'     '='     0x00    '='     'B'
C           'c'     'C'     '8'     0x00E7  '8'     'C'
D           'd'     'D'     '5'     0x00    '5'     'D'
E           'e'     'E'     '2'     0x0301  '2'     'E'
F           'f'     'F'     '6'     0x00A5  '6'     'F'
G           'g'     'G'     '-'     '_'     '-'     'G'
H           'h'     'H'     '['     '{'     '['     'H'
I           'i'     'I'     '$'     0x0302  '$'     'I'
J           'j'     'J'     ']'     '}'     ']'     'J'
K           'k'     'K'     '"'     '~'     '"'     'K'
L           'l'     'L'     '''     '`'     '''     'L'
M           'm'     'M'     '>'     0x00    '>'     'M'
N           'n'     'N'     '<'     0x0303  '<'     'N'
O           'o'     'O'     '('     0x00    '('     'O'
P           'p'     'P'     ')'     0x00    ')'     'P'
Q           'q'     'Q'     '*'     0x0300  '*'     'Q'
R           'r'     'R'     '3'     0x20AC  '3'     'R'
S           's'     'S'     '4'     0x00DF  '4'     'S'
T           't'     'T'     '+'     0x00A3  '+'     'T'
U           'u'     'U'     ''     0x0308  '&'     'U'
V           'v'     'V'     '9'     '^'     '9'     'V'
W           'w'     'W'     '1'     0x00    '1'     'W'
X           'x'     'X'     '7'     0xEF00  '7'     'X'
Y           'y'     'Y'     '!'     0x00A1  '!'     'Y'
Z           'z'     'Z'     '#'     0x00    '#'     'Z'

COMMA       ','     ';'     ';'     '|'     ','     ','
PERIOD      '.'     ':'     ':'     0x2026  '.'     '.'
AT          '@'     '0'     '0'     0x2022  '0'     '@'
SLASH       '/'     '?'     '?'     '/'     '/'     '/'

SPACE       0x20    0x20    0x9     0x9     0x20    0x20
NEWLINE     0xa     0xa     0xa     0xa     0xa     0xa

# on pc keyboards
TAB         0x9     0x9     0x9     0x9     0x9     0x9
0           '0'     ')'     ')'     ')'     '0'     '0'
1           '1'     '!'     '!'     '!'     '1'     '1'
2           '2'     '@'     '@'     '@'     '2'     '2'
3           '3'     '#'     '#'     '#'     '3'     '3'
4           '4'     '$'     '$'     '$'     '4'     '4'
5           '5'     '%'     '%'     '%'     '5'     '5'
6           '6'     '^'     '^'     '^'     '6'     '6'
7           '7'     ''     '&'     '&'     '7'     '7'
8           '8'     '*'     '*'     '*'     '8'     '8'
9           '9'     '('     '('     '('     '9'     '9'

GRAVE         '`'     '~'     '`'     '~'     '`'     '`'
MINUS         '-'     '_'     '-'     '_'     '-'     '-'
EQUALS        '='     '+'     '='     '+'     '='     '='
LEFT_BRACKET  '['     '{'     '['     '{'     '['     '['
RIGHT_BRACKET ']'     '}'     ']'     '}'     ']'     ']'
BACKSLASH     '/'     '|'     '/'     '|'     '/'     '/'
SEMICOLON     ';'     ':'     ';'     ':'     ';'     ';'
APOSTROPHE    '''     '"'     '''     '"'     '''     '''
STAR          '*'     '*'     '*'     '*'     '*'     '*'
POUND         '#'     '#'     '#'     '#'     '#'     '#'
PLUS          '+'     '+'     '+'     '+'     '+'     '+'

資源二進位格式

上面所描述的一段通過makekcharmap工具轉換成下面的格式,使用者可以通過mmap這個檔案,用於進程之間共用大概4K資料,可以節省載入時間。
Offset                          Size (bytes)                          Description
0x00-0x0b                                                         The ascii value "keycharmap1" including the null character
0x0c-0x0f                                                         padding
0x10-0x13                                                         The number of entries in the modifiers table (COLS)
0x14-0x17                                                         The number of entries in the characters table (ROWS)
0x18-0x1f                                                         padding
                                4*COLS                                 Modifiers table. The modifier mask values that each of the columns in the characters table correspond to.
                                                                        padding to the next 16 byte boundary
                                4*COLS*ROWS                 Characters table. The modifier mask values that each of the columns correspond to.
完善你自己的鍵盤事件驅動(略)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.