Android底層和中間層共同學(xué)習(xí)系列之a(chǎn)ndroid鍵盤映射 (轉(zhuǎn)載請(qǐng)說(shuō)明來(lái)自國(guó)內(nèi)最大Android社區(qū)androidin底層驅(qū)動(dòng)論壇分支,國(guó)內(nèi)最大linux社區(qū)Linuxforum 嵌入式linux分支) (Email :hongjiujing@gmail.com) (此文章適合于初學(xué)者,說(shuō)的不對(duì)的地方歡迎大家指正和完善。大牛們可以繞道^^) 介紹 功能 鍵布局映射 鍵映射的選擇 文件格式 鍵布局映射文件示例 鍵字符映射 鍵字符映射的選擇 文件格式 資源二進(jìn)制文件格式 完善您自己的驅(qū)動(dòng) 示列 介紹: 本文主要描述了鍵輸入怎么轉(zhuǎn)換成Android應(yīng)用層的行為信息和怎樣自定義鍵的布局和鍵的字符映射表,滿足設(shè)備的需要。 注: Android的應(yīng)用不僅僅是平板電腦,MID,phone,還可以放到STB機(jī)頂盒,智能家庭終端上面去,所以按鍵的映射是一定要自定義的,不管按鍵是固定在設(shè)備上,還是通過無(wú)線設(shè)備還是藍(lán)牙遙控,都需要鍵的映射。 Android也是基于Linux的核心,大部分時(shí)候都是操作系統(tǒng)在調(diào)度任務(wù),執(zhí)行任務(wù)。相應(yīng)的,Android輸入系統(tǒng)也是遵循LINUX的input 輸入輸出子系統(tǒng),關(guān)于這部分的分析可以Google,有許多原理方面的分析。Android使用標(biāo)準(zhǔn)的Linux輸入事件設(shè)備(/dev /event0),驅(qū)動(dòng)描述可以查看內(nèi)核樹頭文件include/linux/input.h。如果想深入學(xué)習(xí)Linux input subsystem,可以訪問:http://git./?p=linux/kernel/git/stable/linux- 2.6.24.y.git;a=blob;f=Documentation/input/input.txt 注:event0是您的keypad/gpio-key注冊(cè)到內(nèi)核的節(jié)點(diǎn)號(hào),如果有其他的輸入設(shè)備注冊(cè)進(jìn)內(nèi)核,也可以是event1。 功能性 Android輸入事件設(shè)備,用的是中斷(硬件觸發(fā))或者輪詢結(jié)構(gòu)(軟件模擬),捕獲設(shè)備具體的掃描碼,通過input_event()轉(zhuǎn)化成標(biāo)準(zhǔn)的內(nèi)核可接受的事件。 鍵映射驅(qū)動(dòng)的其他主要驅(qū)動(dòng)是建立一個(gè)probe函數(shù),用于注冊(cè)中斷或者您的軟件模擬的輪詢功能函數(shù),硬件初始化,用input_register_device()注冊(cè)驅(qū)動(dòng)/設(shè)備到輸入輸出系統(tǒng)。 注:關(guān)于probe屬于linux設(shè)備驅(qū)動(dòng)模型相關(guān)知識(shí),可以閱讀LDD3或者LINUX設(shè)備驅(qū)動(dòng)原理與實(shí)踐,有很詳細(xì)的描述。 下面表描述了從鍵盤輸入最終轉(zhuǎn)成相應(yīng)應(yīng)用行為的轉(zhuǎn)化步驟 步驟 行為 解釋 1 窗口管理器從Linux鍵盤驅(qū)動(dòng)獲取鍵盤事件 按鍵消息不指定任何邏輯事件,它只與其硬件位置有關(guān), 也就是說(shuō),按鍵的鍵盤碼沒有任何軟件含義,映射鍵盤碼 2 窗口管理器映射掃描碼為鍵碼。 當(dāng)窗口管理器從驅(qū)動(dòng)讀到一個(gè)鍵,它利用那個(gè)鍵布局映射文件將掃描碼映射為鍵值。特別的,這個(gè)鍵值就是屏幕顯示的條碼。例如 KEYCODE_DPAD_CENTER是導(dǎo)航五位鍵的中間的鍵,即使ALT+G產(chǎn)生一個(gè)"?"字符,事實(shí)上KEYCODE_G就是這個(gè)鍵值。 3 窗口管理器發(fā)送掃描碼和鍵碼到應(yīng)用程序` 掃描碼和鍵碼被當(dāng)前焦點(diǎn)所在界面處理,具體"翻譯"要看具體的應(yīng)用場(chǎng)合。 鍵布局映射 如何選擇一個(gè)鍵布局映射文件 鍵布局映射文件通常放在/system/usr/keylayout和/data/usr/keylayout 對(duì)于每一個(gè)鍵盤設(shè)備xxx,設(shè)置系統(tǒng)屬性android.keylayout.xxx,如果沒有為自己的硬件設(shè)備創(chuàng)建一個(gè)特定的設(shè)備,Android將去讀/system/usr/keylayout/qwerty.kl這個(gè)配置文件。 注:如果設(shè)置系統(tǒng)屬性,請(qǐng)查看ttp://www.kandroid.org/android_pdk/build_new_device.html 文件格式: 鍵映射文件通常以UTF8文本文件格式存儲(chǔ)于設(shè)備,通常有如下特性: 注釋:用#表示,以#開頭的內(nèi)容都將被忽略。 空白:所有的空行被忽略 鍵定義:鍵定義遵循如下格式key SCANCODE KEYCODE [FLAGS...],當(dāng)掃描碼是一個(gè)數(shù)字,鍵碼定義在你描述的布局文件android.keylayout.xxx,另外可以設(shè)置相關(guān)的FLAGS: SHIFT: 當(dāng)按下,自動(dòng)加上SHIFT鍵值 ALT:當(dāng)按下,自動(dòng)加上ALT CAPS:當(dāng)按下,自動(dòng)帶上CAPS大寫 WAKE:當(dāng)按下,當(dāng)設(shè)備進(jìn)入睡眠的時(shí)候,按下這個(gè)鍵將喚醒,而且發(fā)送消息給應(yīng)用層。 WAKE_DROPPED:當(dāng)按下,且設(shè)備正處于睡眠,設(shè)備被喚醒,但是不發(fā)送消息給應(yīng)用層。 鍵盤映射文件示例: 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! 比如對(duì)于一個(gè)特定的設(shè)備xxx,設(shè)置android.keychar.xxx系統(tǒng)屬性,用全路徑表示去描述所需的鍵字符映射。如果你沒有描述任何一個(gè)鍵字符映射,系統(tǒng)將默認(rèn)使用/system/usr/keychar/qwerty.kl! 注:這一點(diǎn)可以在開發(fā)板接USB KEYBOARD的時(shí)候,將logcat打開看調(diào)試信息,會(huì)看到default to qwerty.kl類似的信息。 文件格式: 鍵字符映射文件以二進(jìn)制減少加載時(shí)間的形式存儲(chǔ)于設(shè)備中,鍵字符映射文件有如下特征: 注釋:以#開始為注釋 空行:所有的空行被忽略 列定義:當(dāng)一個(gè)事件來(lái)臨的時(shí)候按下組合鍵。這個(gè)事通常是MODIFIER_SHIFT,MODIFIER_CTRL,MODIFIER_ALT的組合。 O no modifiers S MODIFIER_SHIFT C MODIFIER_CONTROL L MODIFIER_CAPS_LOCK A MODIFIER_ALT 鍵值定義:鍵值定義遵循如下規(guī)則: 鍵 掃描碼 字符[....] 掃描碼和字符通常是一個(gè)十進(jìn)制的值或者是UTF8字符,可以通過strtol的解析。 鍵字符文件的示例: 下面這個(gè)文件來(lái)自于android/src/device/product/generic/tuttle2.kcm,代表了一個(gè)完整的鍵字符文件。 以type開始的語(yǔ)句描述了你所要描述鍵盤的類型,大體分為三種 1:NUMERIC,12鍵的數(shù)字鍵盤 2:Q14:鍵盤包括所有的字符,但是可以一鍵多個(gè)字符。 3:QWERTY鍵盤包括了所有可能的字符和數(shù)字,類似于全鍵盤。 下面是一個(gè)QWERTY全鍵盤的定義示例,因?yàn)閍ndroid主要用于手機(jī),手機(jī)一般是全鍵。 # 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 '+' '+' '+' '+' '+' '+' 資源二進(jìn)制格式 上面所描述的一段通過makekcharmap工具轉(zhuǎn)換成下面的格式,用戶可以通過mmap這個(gè)文件,用于進(jìn)程之間共享大概4K數(shù)據(jù),可以節(jié)省加載時(shí)間。 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. 完善你自己的鍵盤事件驅(qū)動(dòng)(略) |
|
來(lái)自: wanwanstudy > 《keyPAD》