(轉載請說明來自國內最大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.
完善你自己的鍵盤事件驅動(略)