任志敏
(常州紡織服裝職業(yè)技術(shù)學(xué)院機(jī)電學(xué)院,江蘇 常州 213164)
隨著Android系統(tǒng)的不斷發(fā)展,越來(lái)越多的嵌入式系統(tǒng)引入Android平臺(tái)作為系統(tǒng)平臺(tái)。Android平臺(tái)的一大優(yōu)勢(shì)是使用觸摸屏操作APP應(yīng)用程序,在大多數(shù)應(yīng)用場(chǎng)合利用這一優(yōu)勢(shì)效率很高,用戶體驗(yàn)良好,但是在有些場(chǎng)合就適應(yīng)得不是很友好,比如在汽車(chē)維修領(lǐng)域使用的發(fā)動(dòng)機(jī)檢測(cè)系統(tǒng),操作人員一般都攜帶手套檢查相關(guān)汽車(chē)部件,若要再用到觸摸屏,操作起來(lái)就不方便,頻繁脫戴手套又耗時(shí)又不安全,因此還是需要借助傳統(tǒng)的物理按鍵實(shí)現(xiàn)相關(guān)操作。典型的汽車(chē)發(fā)動(dòng)機(jī)檢測(cè)內(nèi)窺鏡如圖1所示。
圖1 汽車(chē)發(fā)動(dòng)機(jī)檢測(cè)內(nèi)窺鏡實(shí)物圖
從圖1可以看出,手柄上有6個(gè)物理按鍵,除了一個(gè)電源按鍵以外,還有5個(gè)功能按鍵,其功能一般是“菜單”,“向上選擇”,“向下選擇”,“確定”,“返回”。通過(guò)這5個(gè)按鍵實(shí)現(xiàn)如圖2所示的APP窗口操作。
圖2 內(nèi)窺鏡APP窗口
按下“菜單”按鍵,彈出如圖2所示的窗口,通過(guò)“向上選擇”和“向下選擇”兩個(gè)按鍵選擇按鈕,用“確定”按鍵進(jìn)入對(duì)應(yīng)的功能模塊。即原來(lái)使用觸摸屏實(shí)現(xiàn)菜單操作都有5個(gè)物理按鍵完成。
Android系統(tǒng)本身支持的物理按鍵包括系統(tǒng)功能鍵和“querty”鍵盤(pán),系統(tǒng)功能鍵包括“Home”,“volume up”,“volume down”,“menu”等,“querty”鍵盤(pán)就是日常我們所見(jiàn)的普通鍵盤(pán)上的各種按鍵。在安裝了Android2.2以前的版本的硬件系統(tǒng)上,系統(tǒng)功能鍵和“querty”鍵均是真實(shí)存在的物理按鍵,而Android2.2以后的硬件系統(tǒng),一般保留的物理按鍵只有系統(tǒng)功能鍵,“querty”鍵盤(pán)采用軟鍵盤(pán)的形式。本文設(shè)計(jì)的內(nèi)窺鏡采用Android6.0系統(tǒng),公版的硬件系統(tǒng)電路只引出支持功能鍵的物理按鍵[2],其電路圖如圖3所示。
從圖3中可以看出,AVCC為模數(shù)轉(zhuǎn)換的參考電壓,LRADC0為模數(shù)轉(zhuǎn)換引腳,R1~R8為分壓電阻,S1~S7一端連接對(duì)應(yīng)的分壓電阻,另一端連接電源地,按下S1~S7中任何一個(gè)鍵,通過(guò)讀取LRADC0引腳的模數(shù)轉(zhuǎn)換值就可以感知到底按下了哪個(gè)按鍵,這樣做的好處是節(jié)省了IO引腳資源,只需要連一個(gè)模數(shù)轉(zhuǎn)換引腳就可以確定7個(gè)按鍵。在設(shè)計(jì)過(guò)程中,若不需要用到這7個(gè)鍵,按鍵可以刪除,但電阻不可刪除??紤]到工業(yè)內(nèi)窺鏡錄制播放視頻時(shí)仍舊需要用到麥克風(fēng),因此保留音量鍵VOL+和VOL-,MENU鍵用于“菜單”鍵,SEARCH鍵用于“向上選擇”鍵,HOME鍵用于“向下選擇”鍵,ESC鍵用于“確定”鍵,ENTER鍵用于“返回”鍵。
圖3 Android6.0公版按鍵硬件電路
為了響應(yīng)內(nèi)窺鏡上增加的“菜單”等5個(gè)物理按鍵,需要了解和修改Android6.0的內(nèi)核文件,第一個(gè)文件為模數(shù)轉(zhuǎn)換映射文件,位于/linux-3.4/drivers/input/keyboard目錄下的sunxi-keyboard.c文件,該文件中定義了一個(gè)數(shù)組,該數(shù)組為static unsigned char keypad_mapindex[64]={0,0,0,0,0,0,0,/*key1*/1,1,1,1,1,1,/*key2*/2,2,2,2,2,2, /*key3*/3,3,3,3,3,/*key4*/4,4,4,4,4,/*key5*/5,5,5,5,5,/*key6*/6,6,6,6,6,6,6,6,6,/*key7*/7,7,7,7,7,7,7,7,7,7,7,7,7/* key 8*/}。
從該數(shù)組可以看出,該數(shù)組正好對(duì)應(yīng)圖3所示的物理按鍵原理圖,把電壓一共分成64份,每一份對(duì)應(yīng)一個(gè)電壓值,大約為0.2V,比如key1鍵對(duì)應(yīng)圖3中的VOL+模數(shù)采集點(diǎn),雖然該點(diǎn)的電壓為0.19V,但是每次按下VOL+鍵模數(shù)轉(zhuǎn)換的值不一定完全一樣,因此keypad_mapindex數(shù)組中設(shè)定7個(gè)值來(lái)相應(yīng)按下VOL+鍵。在sunxi-keyboard.c文件中,通過(guò)代碼
scancode = keypad_mapindex[key_val&0x3f];
input_report_key(sunxikbd_dev, sunxi_scankeycodes[scancode], 0);
上報(bào)具體的按鍵值。
第二個(gè)與物理按鍵相關(guān)的同樣位于/linux-3.4/drivers/input/keyboard目錄下的sun8i-keyboard.h文件。該文件首先定義了數(shù)組sunxi_scankeycodes[KEY_MAX_CNT],用于內(nèi)核上報(bào)給系統(tǒng)的值[1]。為了避免與系統(tǒng)自帶的值相沖突,本文設(shè)計(jì)了如圖4所示的上報(bào)值數(shù)組。
圖4 課題設(shè)計(jì)上報(bào)值
sunxi_scankeycodes上報(bào)數(shù)組只是做了一個(gè)定義,具體的上報(bào)值,比如KEY_VOLUMEUP值是多少呢?
第三個(gè)文件是位于/linux-3.4/include/linux目錄下的input.h文件,該文件下定義了KEY_VOLUMEUP的值,系統(tǒng)具體上報(bào)的默認(rèn)鍵值定義最大為248,因此本文自定義的5個(gè)上報(bào)鍵值從249開(kāi)始,這5個(gè)上報(bào)鍵值分別是:菜單鍵KEY_MYMENU具體鍵值為249;向上選擇鍵KEY_MYUP具體鍵值為250;向下選擇鍵KEY_MYDOWN具體鍵值為251;確定鍵KEY_MYENTER具體鍵值為252;返回鍵KEY_MYBACK具體鍵值為253。
總結(jié)一下按鍵上報(bào)的過(guò)程,1)Android底層的linux系統(tǒng)內(nèi)核通過(guò)掃描,將物理按鍵按下的電壓轉(zhuǎn)換為數(shù)字電壓并且映射到數(shù)組下標(biāo)。2)通過(guò)keypad_mapindex[64],sunxi_scankeycodes[KEY_MAX_CNT]兩個(gè)數(shù)組關(guān)系轉(zhuǎn)化將按鍵映射到內(nèi)核中預(yù)定義的鍵值。3)linux內(nèi)核上報(bào)給上層一個(gè)具體的鍵值。
第四個(gè)文件是位于Android/device/vendor-name/device-name/configs目錄下的sunxi-keyboard.kl文件,該文件是framework層的按鍵映射文件,增加本文的5個(gè)按鍵映射,修改其配置為:key 114 VOLUME_DOWN;key 115 VOLUME_UP;key 249 MYMENU;key 250 MYUP;key 251 MYDOWN;key 252 MYENTER;key 253 MYBACK。該文件中key為關(guān)鍵字,不能改動(dòng),249為input.h定義的上報(bào)鍵值。
第五個(gè)文件是位于/frameworks/native/include/android目錄下的keycodes.h文件,該文件定義了用于Android應(yīng)用層的按鍵鍵值,修改該文件后,菜單鍵應(yīng)用層鍵值A(chǔ)KEYCODE_MYMENU=300;AKEYCODE_MYUP=301;AKEYCODE_MYDOWN=302;AKEYCODE_MYENTER=303;AKEYCODE_MYBACK=304。需要注意的是,該文件的鍵值與linux層上報(bào)的鍵值是不同的,那么如何把兩者對(duì)應(yīng)起來(lái)呢?
第六個(gè)文件是位于/frameworks/native/include/input目錄下的InputEventLabels.h文件,修改該文件,把增加的5個(gè)鍵的定義加入其中,代碼為DEFINE_KEYCODE(MYMENU),DEFINE_KEYCODE(MYUP),DEFINE_KEYCODE(MYDOWN),DEFINE_KEYCODE(MYENTER),DEFINE_KEYCODE(MYBACK)。
第七個(gè)文件是位于frameworks/base/core/res/res/values目錄下的attrs.xml,修改后代碼為
經(jīng)過(guò)以上文件的修改,新增加的5個(gè)物理按鍵就可以響應(yīng)Android上層APP程序了。
為了測(cè)試驗(yàn)證物理按鍵的響應(yīng)效果,本文在Android6.0平臺(tái)上設(shè)計(jì)了APP程序進(jìn)行驗(yàn)證[3],測(cè)試代碼如圖5所示。
圖5 物理按鈕響應(yīng)驗(yàn)證程序代碼
經(jīng)過(guò)測(cè)試,系統(tǒng)原有的兩個(gè)音量鍵仍舊功能不變,新增加的5個(gè)按鍵可以準(zhǔn)確響應(yīng)。