一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Android底層和中間層共同學(xué)習(xí)系列之a(chǎn)ndroid鍵盤映射

 wanwanstudy 2012-02-08
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)(略)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    男女午夜视频在线观看免费| 欧美视频在线观看一区| 婷婷亚洲综合五月天麻豆| 男人的天堂的视频东京热| 国内欲色一区二区三区| 精品伊人久久大香线蕉综合| 亚洲国产色婷婷久久精品| 男人的天堂的视频东京热| 国产成人午夜av一区二区| 欧美日韩国产成人高潮| 亚洲二区欧美一区二区| 欧美一区日韩一区日韩一区| 国产又粗又深又猛又爽又黄| 正在播放玩弄漂亮少妇高潮| 国产亚洲精品一二三区| 99国产一区在线播放| 日系韩系还是欧美久久| 国产免费人成视频尤物| 国产免费无遮挡精品视频| 亚洲一区二区三区三区| 欧美在线观看视频三区| 日韩三极片在线免费播放| 国产av熟女一区二区三区蜜桃| 久久精品国产99精品最新| 欧美一区二区三区播放| 国产高清在线不卡一区| 日韩精品在线观看一区| 精品久久综合日本欧美| 久久99青青精品免费| 亚洲男女性生活免费视频| 日本和亚洲的香蕉视频| 国产午夜精品福利免费不| 欧美精品二区中文乱码字幕高清| 日韩特级黄片免费观看| 国产三级黄片在线免费看| 男女一进一出午夜视频| 国产又粗又猛又爽又黄的文字| 人妻亚洲一区二区三区| 中国日韩一级黄色大片| 日韩成人h视频在线观看| 欧美在线观看视频三区|