版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2023/6/2武漢科技大學(xué)Page1第12章Input輸入子系統(tǒng)【學(xué)習(xí)目標(biāo)】了解用戶輸入子系統(tǒng)熟悉Input輸入驅(qū)動(dòng)2023/6/2武漢科技大學(xué)Page2第12章Input輸入子系統(tǒng)
用戶輸入子系統(tǒng)12.1Input輸入驅(qū)動(dòng)12.2小結(jié)12.32023/6/2武漢科技大學(xué)Page312.1用戶輸入子系統(tǒng)Android中,用戶輸入系統(tǒng)的結(jié)構(gòu)比較簡單,實(shí)現(xiàn)輸入功能的硬件設(shè)備包括鍵盤、觸摸屏和軌跡球等。在Android的上層應(yīng)用中,可以通過獲得這些設(shè)備產(chǎn)生的事件,并對(duì)設(shè)備的事件做出響應(yīng)。在Java框架和應(yīng)用程序?qū)?,通常使用運(yùn)動(dòng)事件來獲得觸摸屏和軌跡球等設(shè)備的信息,用按鍵事件獲得各種鍵盤的信息。2023/6/2武漢科技大學(xué)Page412.1用戶輸入子系統(tǒng)Android用于輸入系統(tǒng)的框架結(jié)構(gòu)如圖所示。2023/6/2武漢科技大學(xué)Page512.1.1
Android輸入系統(tǒng)的結(jié)構(gòu)Android輸入系統(tǒng)的結(jié)構(gòu)比較簡單,從下到上包含了驅(qū)動(dòng)程序、本地庫處理部分、Java類對(duì)輸入事件的處理、對(duì)Java的接口等。Android用戶輸入系統(tǒng)的結(jié)構(gòu)如圖所示。從下到上,Android的用戶輸入系統(tǒng)分成以下幾個(gè)部分:驅(qū)動(dòng)程序:保存在/dev/input目錄中,通常是Event類型的驅(qū)動(dòng)程序。EventHub:本地框架層的EventHub是libui中的一部分,它實(shí)現(xiàn)了對(duì)驅(qū)動(dòng)程序的控制,并從中獲得信息。KeyLayout(按鍵布局)和KeyCharacterMap(按鍵字符映射)文件。同時(shí),libui中有相應(yīng)的代碼對(duì)其操作。定義按鍵布局和按鍵字符映射需要運(yùn)行時(shí)配置文件的支持,它們的后綴名分別為kl和kcm。2023/6/2武漢科技大學(xué)Page612.1.1
Android輸入系統(tǒng)的結(jié)構(gòu)Java框架層的處理:在Java框架層具有KeyInputDevice等類用于處理由EventHub傳送上來的信息,通常信息由數(shù)據(jù)結(jié)構(gòu)RawInputEvent和KeyEvent表示。在通常情況下,對(duì)于按鍵事件,則直接使用KeyEvent來傳送給應(yīng)用程序?qū)?,?duì)于觸摸屏和軌跡球等事件,則由RawInputEvent經(jīng)過轉(zhuǎn)換后,形成MotionEvent事件傳送給應(yīng)用程序?qū)?。Android應(yīng)用程序?qū)樱和ㄟ^重新實(shí)現(xiàn)onTouchEvent和onTrackballEvent等函數(shù)來接收運(yùn)動(dòng)事件(MotionEvent),通過重新實(shí)現(xiàn)onKeyDown和onKeyUp等函數(shù)來接收按鍵事件(KeyEvent)。這些類包含在android.view包中。2023/6/2武漢科技大學(xué)Page712.1.1
Android輸入系統(tǒng)的結(jié)構(gòu)2023/6/2武漢科技大學(xué)Page812.1.2移植工作在移植Android輸入系統(tǒng)時(shí)需要完成下面的兩個(gè)工作:移植輸入(input)驅(qū)動(dòng)程序。在用戶空間中動(dòng)態(tài)配置“kl”和“kcm”文件。因?yàn)锳ndroid輸入系統(tǒng)的硬件抽象層是libui庫中的EventHub,此部分是系統(tǒng)的標(biāo)準(zhǔn)部分。所以在實(shí)現(xiàn)特定硬件平臺(tái)的Android系統(tǒng)的時(shí)候,通常改變輸入系統(tǒng)硬件抽象層。EventHub使用Linux標(biāo)準(zhǔn)的輸入設(shè)備作為輸入設(shè)備,并且大多使用實(shí)用的Event設(shè)備?;谏鲜鲈?,為了實(shí)現(xiàn)Android系統(tǒng)的輸入,必須使用Linux標(biāo)準(zhǔn)輸入驅(qū)動(dòng)程序作為標(biāo)準(zhǔn)的輸入。由此可見,輸入系統(tǒng)的標(biāo)準(zhǔn)化程度較高,在用戶空間實(shí)現(xiàn)時(shí)一般不需要更改代碼。唯一的變化時(shí)使用不同的“ki”和“kcm”文件,使用按鍵的布局和按鍵字符映射關(guān)系。2023/6/2武漢科技大學(xué)Page912.2
Input輸入驅(qū)動(dòng)Input輸入驅(qū)入程序是Linux輸入設(shè)備的驅(qū)動(dòng)程序,可以進(jìn)一步分成游戲桿(joystick)、鼠標(biāo)(mouse和mice)和事件設(shè)備三種驅(qū)動(dòng)程序。其中事件驅(qū)動(dòng)程序是目前通用的驅(qū)動(dòng)程序,可以支持鍵盤、鼠標(biāo)、觸摸屏等多種輸入設(shè)備。Input驅(qū)動(dòng)程序的主設(shè)備號(hào)是13,每一種Input設(shè)備占用5位,因此每種設(shè)備包含的個(gè)數(shù)是32個(gè)。Event設(shè)備在用戶空間使用如下三種文件系統(tǒng)來操作接口。Read:用于讀取輸入信息。Ioctl:用于獲得和設(shè)置信息。Poll:調(diào)用可以進(jìn)行用戶空間的阻塞,當(dāng)內(nèi)核有按鍵等中斷,通過在中斷中喚醒poll的內(nèi)核實(shí)現(xiàn),這樣在用戶空間的poll調(diào)用也可以返回。Event設(shè)備在文件系統(tǒng)中的設(shè)備節(jié)點(diǎn)為/dev/input/eventX目錄。主設(shè)備號(hào)為13,次設(shè)備號(hào)按照遞增順序生成,為64~95,各個(gè)具體的設(shè)備保存在misc、touchscreen和keyboard等目錄中。Android輸入設(shè)備驅(qū)動(dòng)程序的頭文件是include/linux/input.h,核心文件是drivers/input/input.c,Event部分的代碼文件是drivers/input/evdev.c。2023/6/2武漢科技大學(xué)Page1012.2.1文件input.h在手機(jī)系統(tǒng)中使用的鍵盤(keyboard)和小鍵盤(kaypad)屬于按鍵設(shè)備EV_KEY,軌跡球?qū)儆谙鄬?duì)設(shè)備EV_REL,觸摸屏屬于絕對(duì)設(shè)備EV_ABS。input.h中定義了structinput_dev結(jié)構(gòu),它表示你Input驅(qū)動(dòng)程序的各種信息,對(duì)于Event設(shè)備分為同步設(shè)備、鍵盤、相對(duì)設(shè)備(鼠標(biāo))、絕對(duì)設(shè)備(觸摸屏)等。input_dev中定義并歸納了各種設(shè)備的信息,例如按鍵、相對(duì)設(shè)備、絕對(duì)設(shè)備、雜項(xiàng)設(shè)備、LED、聲音設(shè)備、強(qiáng)制反饋設(shè)備、開關(guān)設(shè)備等。
在具體實(shí)現(xiàn)Event驅(qū)動(dòng)程序時(shí),如果得到按鍵的事件,通常需要通過以下的接口向上進(jìn)行通知。2023/6/2武漢科技大學(xué)Page1112.2.2文件input.h在手機(jī)系統(tǒng)中使用的鍵盤(keyboard)和小鍵盤(kaypad)屬于按鍵設(shè)備EV_KEY,軌跡球?qū)儆谙鄬?duì)設(shè)備EV_REL,觸摸屏屬于絕對(duì)設(shè)備EV_ABS。input.h中定義了structinput_dev結(jié)構(gòu),它表示你Input驅(qū)動(dòng)程序的各種信息,對(duì)于Event設(shè)備分為同步設(shè)備、鍵盤、相對(duì)設(shè)備(鼠標(biāo))、絕對(duì)設(shè)備(觸摸屏)等。input_dev中定義并歸納了各種設(shè)備的信息,例如按鍵、相對(duì)設(shè)備、絕對(duì)設(shè)備、雜項(xiàng)設(shè)備、LED、聲音設(shè)備、強(qiáng)制反饋設(shè)備、開關(guān)設(shè)備等。
在具體實(shí)現(xiàn)Event驅(qū)動(dòng)程序時(shí),如果得到按鍵的事件,通常需要通過以下的接口向上進(jìn)行通知。2023/6/2武漢科技大學(xué)Page1212.2.2文件KeycodeLabels.h觸摸屏和軌跡球上報(bào)的是坐標(biāo)、按下、抬起等信息,信息量比較少。按鍵處理的過程稍微復(fù)雜,從驅(qū)動(dòng)程序到Android的Java層受到的信息,鍵表示方式經(jīng)過了兩次轉(zhuǎn)化。鍵掃描碼Scancode是由Linux的Input驅(qū)動(dòng)框架定義的整數(shù)類型。鍵掃描碼Scancode經(jīng)過一次轉(zhuǎn)化后,形成按鍵的標(biāo)簽KeycodeLabel,是一個(gè)字符串的表示形式。按鍵的標(biāo)簽KeycodeLabel經(jīng)過轉(zhuǎn)換后,再次形成整數(shù)型的按鍵碼keycode。在Android應(yīng)用程序?qū)?,主要使用按鍵碼keycode來區(qū)分。在文件KeycodeLabels.h中,按鍵碼整數(shù)值的格式,在此文件中是通過枚舉實(shí)現(xiàn)的。進(jìn)而定義了數(shù)組KEYCODES[],功能是存儲(chǔ)從字符串到整數(shù)的映射關(guān)系。左列內(nèi)容即表示按鍵標(biāo)簽KeyCodeLabel,右列的內(nèi)容為按鍵碼KeyCode(與KeyCode的數(shù)值對(duì)應(yīng))。在按鍵信息第二次轉(zhuǎn)化的時(shí)候,已經(jīng)將字符串類型KeyCodeLabel轉(zhuǎn)換成整數(shù)的KeyCode。2023/6/2武漢科技大學(xué)Page1312.2.3文件KeyCharacterMap.h文件frameworks/base/include/ui/KeyCharacterMap.h也是本地框架層libui的頭文件,在其中定義了按鍵的字符映射關(guān)系。其實(shí)KeyCharacterMap只是一個(gè)輔助的功能,因?yàn)榘存I碼只是一個(gè)與UI無關(guān)的證書,通常用程序?qū)ζ溥M(jìn)行捕獲處理。如果將按鍵事件轉(zhuǎn)換為用戶可見的內(nèi)容,需要經(jīng)過這個(gè)層次的轉(zhuǎn)換。2023/6/2武漢科技大學(xué)Page1412.2.3文件KeyCharacterMap.h
KeyCharacterMap需要從本地層傳送到Java層,JNI的代碼路徑如下所示:frameworks/base/core/jni/android_text_KeyCharacterMap.cppKeyCharacterMapJava框架層的代碼如下:frameworks/base/core/Java/android/view/KeyCharacterMap.Javaandroid.view.KeyCharacterMap類是Android平臺(tái)的API,可以在應(yīng)用程序中使用這個(gè)類。android.text.method中有各種Linstener,相互之間可以監(jiān)聽KeyCharacterMap相關(guān)的信息。2023/6/2武漢科技大學(xué)Page1512.2.3文件KeyCharacterMap.h上面關(guān)于按鍵碼和按鍵字符映射的內(nèi)容是在代碼中實(shí)現(xiàn)的內(nèi)容,還需要配合動(dòng)態(tài)的配置文件來使用。在實(shí)現(xiàn)Android系統(tǒng)的時(shí)候,很可能需要更改這兩種文件。需要?jiǎng)討B(tài)配置下面的兩個(gè)文件。KL(KeycodeLayout):后綴名為kl的配置文件。KCM(KeyCharacterMap):后綴名為kcm的配置文件。Donut及其之前版本的配置文件路徑為:development/emulator/keymaps/Ecliar及其之后配置文件的路徑為:sdk/emulator/keympas/
當(dāng)系統(tǒng)生成上述配置文件后,將會(huì)被放置在目標(biāo)文件系統(tǒng)的“/system/usr/keylaout/”目錄中或“/system/usr/keychars/”目錄中。另外,kl文件將被直接復(fù)制到目標(biāo)文件系統(tǒng)中:由于次春較大,kcm文件放置在目標(biāo)文件系統(tǒng)中之前,需要經(jīng)過壓縮處理。KeyLayoutMap.cpp負(fù)責(zé)解析處理kl文件,KeyCharacterMap.cpp負(fù)責(zé)解析kcm文件。2023/6/2武漢科技大學(xué)Page1612.2.4kl格式文件
Android默認(rèn)提供的按鍵布局文件主要包括qwerty.kl和AVRCP.kl。其中qwerty.kl是全鍵盤布局文件,是系統(tǒng)中主要按鍵使用的布局文件。AVRCP.kl用于多媒體的控制,ACRCP的含義為Audio/VideoRemoteControlProfile。
在按鍵布局文件中,第1列為按鍵的掃描碼,是一個(gè)整數(shù)值;第2列為按鍵的標(biāo)簽,是一個(gè)字符串。即完成了按鍵信息的第一次轉(zhuǎn)換,將整形的掃描碼,轉(zhuǎn)換成字符串類型的按鍵標(biāo)簽。第3列表示按鍵的Flag,帶有WAKE字符,表示此按鍵可以喚醒系統(tǒng)。
掃描碼來自驅(qū)動(dòng)程序,顯然不同的掃描碼可以對(duì)應(yīng)一個(gè)按鍵標(biāo)簽。表示物理上的兩個(gè)按鍵可以對(duì)應(yīng)同一個(gè)功能按鍵。2023/6/2武漢科技大學(xué)Page1712.2.5kcm格式文件
kcm格式文件是按鍵字符映射文件,用于表示按鍵字符的映射關(guān)系,功能是將整數(shù)類型按鍵碼(keycode)轉(zhuǎn)化成可以顯示的字符。kcm文件將被makekcharmap工具轉(zhuǎn)化成二進(jìn)制的格式,放在目標(biāo)系統(tǒng)的/system/usr/keychars/目錄中。除了QWERTY映射類型,還可以映射Q14(單鍵多字符對(duì)應(yīng)的鍵盤)和NUMERIC(12鍵的數(shù)字鍵盤)。kcm文件將被makekcharmap工具轉(zhuǎn)化成二進(jìn)制的格式,放在目標(biāo)系統(tǒng)的/system/usr/keychars/目錄中。2023/6/2武漢科技大學(xué)Page1812.2.6文件EventHub.cpp
文件EventHub.cpp位于libhui庫中的frameworks/base/libs/ui目錄下,此文件是輸入系統(tǒng)的核心控制文件,整個(gè)輸入系統(tǒng)的主要功能都是在此文件中實(shí)現(xiàn)的。例如當(dāng)按下電源鍵后,系統(tǒng)把scanCode寫入對(duì)應(yīng)的設(shè)備節(jié)點(diǎn),文件EventHub.cpp會(huì)讀這個(gè)設(shè)備節(jié)點(diǎn),并把scanCode通過kl文件對(duì)應(yīng)成keyCode發(fā)送到上層。在具體處理過程時(shí),在函數(shù)openPlatformInput()中通過調(diào)用scan_dir()函數(shù)搜索路徑下面所有Input驅(qū)動(dòng)的設(shè)備節(jié)點(diǎn),函數(shù)scan_dir()會(huì)從目錄中查找設(shè)備,找到后調(diào)用open_device()函數(shù)以打開查找到的設(shè)備。EventHub的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年涼山州甘洛縣考核招聘中學(xué)及職業(yè)技術(shù)學(xué)校教師考試真題
- 2023年來賓市武宣縣參加師范類畢業(yè)生就業(yè)考試真題
- 2023年湖州長興縣縣級(jí)醫(yī)療衛(wèi)生單位招聘衛(wèi)生人才和崗位衛(wèi)生人才考試真題
- 2023年包頭市中心醫(yī)院引進(jìn)考試真題
- 2024年出租汽車客運(yùn)服務(wù)項(xiàng)目立項(xiàng)申請(qǐng)報(bào)告范文
- 玻璃鋼管招標(biāo)方案
- 焙烤工藝學(xué)課程設(shè)計(jì)
- 泵站電氣維修方案
- 泵蓋的機(jī)械課程設(shè)計(jì)
- 波音液壓事故原因研究報(bào)告
- 2024至2030年中國綜合能源服務(wù)行業(yè)運(yùn)營動(dòng)態(tài)及投資規(guī)模預(yù)測報(bào)告
- 大學(xué)介紹清華大學(xué)宣傳
- 人教版高中數(shù)學(xué)A版 必修第1冊(cè)《第二章 一元二次函數(shù)、方程和不等式》大單元整體教學(xué)設(shè)計(jì)
- 2024年導(dǎo)游服務(wù)技能大賽《導(dǎo)游綜合知識(shí)測試》題庫及答案
- (完整)土地復(fù)墾施工方案
- 期末全真模擬測試卷2(試題)2024-2025學(xué)年二年級(jí)上冊(cè)數(shù)學(xué)蘇教版
- 廢塑料資源化利用項(xiàng)目環(huán)境影響評(píng)價(jià)
- 《食品安全抽樣檢驗(yàn)工作規(guī)范》附件文書2024
- ISO 55013-2024 資產(chǎn)管理-數(shù)據(jù)資產(chǎn)管理指南(中文版-雷澤佳翻譯-2024)
- 2024-2025學(xué)年湖南省常德市小學(xué)六年級(jí)英語上冊(cè)期末同步自測試卷及答案
- 2024年俄羅斯高空作業(yè)平臺(tái)車行業(yè)應(yīng)用與市場潛力評(píng)估
評(píng)論
0/150
提交評(píng)論