在Android系統(tǒng)中,修改遙控器鍵碼值是一項(xiàng)實(shí)用的功能,它允許開發(fā)者或用戶根據(jù)實(shí)際需求自定義遙控器的行為。通過編程接口或系統(tǒng)設(shè)置,可以輕松實(shí)現(xiàn)對鍵碼值的添加、刪除及修改,從而優(yōu)化用戶體驗(yàn)或滿足特定應(yīng)用場景的需求。
TV 上遙控器鍵值怎么樣對應(yīng)到android的系統(tǒng)中,最近一個(gè)客戶需要在我們的平臺上修改,所以,我順便做了一下總結(jié),方便以后參考。
第一步: init.rc:通過service remotecfg /system/bin/remotecfg /system/etc/remote.conf在開機(jī)init階段,將remote.conf中的配置通過ioctl賦值到ir驅(qū)動(dòng)的變量中(用戶空間—>內(nèi)核空間),這樣遙控定制化配置才會(huì)生效。remotecfg程序代碼位于external/remoteconf/irremote.c,可以在設(shè)備的/system/bin/下找到它并手動(dòng)運(yùn)行#./system/bin/remotecfg /system/etc/remote.conf
第二步: 紅外驅(qū)動(dòng)(Linux內(nèi)核層):Linux irremote driver將依照紅外驅(qū)動(dòng)配置文件,將紅外鍵值ircode映射為Linux標(biāo)準(zhǔn)鍵盤掃描碼scancode。這個(gè)過程即將紅外遙控器的按鍵事件轉(zhuǎn)換為Linux的標(biāo)準(zhǔn)input event。a) 紅外驅(qū)動(dòng)配置文件/system/etc/remote.confb)標(biāo)準(zhǔn)鍵盤掃描碼kernel/include/linux/input.h(在幾次遙控器定制化中,尚未修改過該文件)
第三步: Andriod層:windows manager從irremote driver中讀出key event,再通過/system/usr/keylayout/aml_keypad.kl文件,將標(biāo)準(zhǔn)input設(shè)備的scan code映射為Andriod API按鍵KEYCODE字符串。最終scancode和keycode被window manager發(fā)送到應(yīng)用程序,被其focus view消化處理。例如:key 113 SEARCH官方稱.kl為key layout map file。
映射/配置文件說明 ircode映射為scan code: device/a***c/xxx/remote.conf #a***c NECremote factory_code = 0xfb040001 //每個(gè)設(shè)備都有獨(dú)特的factory code. 格式custom_code(16bit)+index_code(16bit) //例子: 0xfb040001= 0xfb04(客戶碼) + 0001 (低16位可填寫任意值) key_begin //按鍵映射表 0x47 11 //0x47是紅外鍵值,11是對應(yīng)的標(biāo)準(zhǔn)按鍵scancode,可以多個(gè)鍵值對應(yīng)一個(gè)scancode 0x5C 97 …… key_end //按鍵映射表結(jié)束
mouse_begin //鼠標(biāo)方向映射表,每行 0 0x10 //0是方向數(shù)字表示符(Left),對應(yīng)紅外按鍵鍵值0x10 1 0x11 //方向鍵右 2 0x0b //方向鍵上 3 0x0e //方向鍵下 mouse_end //鼠標(biāo)方向映射表結(jié)束 scancode與KEYCODE字符串映射: 在2.3系統(tǒng)中,位于源碼目錄的device/a***c/xxx/ aml_keypad.kl 在4.0系統(tǒng)中,位于源碼目錄的device/a***c/xxx/Vendor_0001_Product_0001.kl ..................... key 9 8 key 10 9 key 11 0 key 228 POUND key 227 STAR key 231 CALL key 61 CALL key 97 DPAD_CENTER key 108 DPAD_DOWN key 103 DPAD_UP key 102 HOME key 114 VOLUME_DOWN KEYCODE字符串轉(zhuǎn)換為Andriod UI鍵值:frameworks/base/include/ui/KeycodeLabels.h static const KeycodeLabel KEYCODES[] = { { "SOFT_LEFT", 1 }, { "HOME", 3 }, { "BACK", 4 }, { "CALL", 5 }, { "ENDCALL", 6 }, { "0", 7 }, { "1", 8 }, { "2", 9 }, { "3", 10 }, { "4", 11 }, { "5", 12 }, { "STAR", 17 }, { "POUND", 18 }, { "DPAD_UP", 19 }, { "VOLUME_UP", 24 }, ......................................... 鍵盤scancode定義:kernel/include/linux/input.h ...... #define KEY_SPACE 57 #define KEY_CAPSLOCK 58 #define KEY_F1 59 #define KEY_F2 60 #define KEY_F3 61 #define KEY_F4 62 #define KEY_F5 63 #define KEY_F6 64 #define KEY_F7 65 #define KEY_F8 66 #define KEY_F9 67 #define KEY_F10 68 ........
案例一:新平臺增加/移植遙控器代碼
mid產(chǎn)品往往沒有遙控器,如果要增加遙控器的支持,需要從mbox代碼中拷貝以下文件和目錄: 1)遙控器驅(qū)動(dòng):kernel\drivers\a***c\input\irremote 2)Andriod 遙控器service:external\remoteconf目錄 3)init.rc中啟動(dòng)service remotecfg # remote service remotecfg /system/bin/remotecfg /system/etc/remote.conf class main oneshot 4)拷貝定制化remote.conf與kl兩個(gè)文件
案例二:遙控器靜音鍵改為設(shè)置鍵(不新增按鍵)
1) 按下遙控靜音鍵,觀察串口打印出的ircode 2) 在板子的/system/etc/remote.conf文件中找到靜音鍵的ircode與scancode對應(yīng)行,如下: 0x0c 113 3) 在板子的/system/usr/keylayout/aml_keypad.kl或Vendor_0001_Product_0001.kl中找到scancode 113所在行: key 113 SEARCH 4) 將keycode ‘SEARCH’ 修改為需要的KEYCODE字符串。 5) 重新編譯
案例三:遙控器增加新按鍵功能
新增按鍵的遙控器往往不是我們公版遙控器,不能利用現(xiàn)有按鍵實(shí)現(xiàn)特定功能,需要在系統(tǒng)中新增以支持特定APK應(yīng)用場景。 1) 通過打印找出新增按鍵的ircode 2) 在device\a***c\xxx\remote.conf找到ircode對應(yīng)行,或新建一行。這個(gè)文件中需要注意factory_code = 0xfd020001 是遙控器的客戶碼,必須與實(shí)體遙控器對應(yīng)。 3) 修改device\a***c\xxx\aml_keypad.kl或Vendor_0001_Product_0001.kl 添加時(shí)依照上下文的格式:例如 key 1 BACK這行中,"1"對應(yīng)remote.conf 中的scancode,"BACK" 就是需要在后面keycodeLabels.h中定義的字串,新增按鍵可以自定義這個(gè)字串,比如RED。 4) frameworks/base/include/ui/KeycodeLabels.h,在KEYCODES[]數(shù)組后面順序添加: ... { "RED", 141}, { NULL, 0 } 注意: a) 追加的按鍵須在末行的{ NULL, 0 }前面。 在這個(gè)地方,會(huì)將RED等這些字符串轉(zhuǎn)換成數(shù)值、鍵值,傳送到KeyEvent.java中。 b) RED后面的數(shù)值,需要與客戶協(xié)商,客戶APK應(yīng)該專門處理這個(gè)新建的141值。 c) 141的值不應(yīng)與其他keycode重復(fù),建議新增鍵的取值依照上文的值,依次累加。 5)在frameworks/base/core/res/res/values/attrs.xml中追加: 6)在frameworks/base/core/java/android/view/KeyEvent.java中添加: public static final int KEYCODE_RED = 141; KeyEvent.java中添加的數(shù)值要與上面attrs.xml中的數(shù)值保持一致,如果是在最后面追加的話,需要注意修改LAST_KEYCODE的值 為最后一個(gè)。 7)修改完后,需要在根目錄下先執(zhí)行make update-api更新current.xml(frameworks\base\api目錄下)文件,再進(jìn)行編譯,否則會(huì)報(bào)錯(cuò)。 補(bǔ)充說明:不同的android版本,可能添加的方式不一樣,最近在看5.1的時(shí)候,發(fā)現(xiàn)機(jī)制又變了。留意keyevent.java中的注釋部分即可。
相關(guān)資源參考:
相關(guān)閱讀:
晶晨s905l(-b)p211 android 9.0(atv 9)固件
電視盒子紅外遙控器怎么適配 ?Amlogic盒子紅外遙控適配心得 |