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