1. 程式人生 > >Android原始碼編譯——RK3128開發板多款紅外遙控器常用按鍵適配

Android原始碼編譯——RK3128開發板多款紅外遙控器常用按鍵適配

最近拿到一塊Demo板,由於種種原因忘了入手遙控器。想到公司產品也是通過遙控操作,就抱著試一試的心態使用公司遙控器除錯。一路下來發現只有上下鍵可以使用。然而是相反的。以前沒做過底層,查閱相關資料後發現又有什麼RC5、RC6、NEC編碼,整個人都不好了。看了核心原始碼後知道拿到的這塊Demo板採用的是NEC編碼。只是和我們現有產品的遙控器編碼不同。在這裡是講RK3128方案的遙控器適配。話不多說開始我們的適配之旅。
適配過程分兩步:
1、得到現有遙控器NEC編碼。
2、配置到dts檔案,重新編譯核心即可。

第一步:獲得遙控器NEC編碼。

通過檢視核心驅動原始碼,可以看到遙控器使用者碼、鍵值對應的碼值的log被遮蔽了。

kernel/drivers/input/remotectl/rk_pwm_remotectl.c
//部分程式碼節選:

/*sys/module/rk_pwm_remotectl/parameters,
modify code_print to change the value*/

static int rk_remote_print_code;
static bool remote_suspend = false;
module_param_named(code_print, rk_remote_print_code, int, 0644);
#define DBG_CODE(args...) \
    do { \
        if
(rk_remote_print_code) { \ pr_info(args); \ } \ } while (0) /**…………中間省略………………*/ /**…………中間省略………………*/ case RMC_USERCODE: { /**…………中間省略………………*/ DBG_CODE("USERCODE=0x%x\n", ddata->scandata); /**…………中間省略………………*/ } break; case RMC_GETDATA: { /**…………中間省略………………*/
DBG_CODE("RMC_GETDATA=%x\n", (ddata->scandata>>8)); /**…………中間省略………………*/ } break;

通過前段定義的“DBG_CODE”可以知道操作parameters檔案即可打印出相應的碼值。
adb shell 下或者串列埠下均可以使用以下命令。

su
echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print
(1echo中間有空格,這段命令的作用是往code_print裡寫1)

輸入完畢這是按遙控器按鍵這有相關碼值打印出來。
注意:串列埠是直接列印在串列埠日誌的(如下圖)。
adb shell則需要檢視核心日誌直接輸入如下命令即可看到。

cat /dev/kmsg

這裡寫圖片描述
如上邊的“0xff00”就是使用者碼,“fa”就是按鍵對應的鍵值碼。
記錄完你要配置的所有按鍵的鍵值碼後接下來配置核心進行適配。

第二部:配置dts檔案

進入kernel/arch/arm/boot/dts目錄開啟rk3128的配置檔案rk3128-box-rk88.dts,找到remotectl節點,
可以看到事先已有預設的配置
這裡寫圖片描述

這是我們只需要把自己遙控器的使用者碼和對應的鍵值碼替換即可。
如果有多款遙控器要適配那就按照ir_key1{}的形式複製幾分,以ir_key2、ir_key3等命名。
如下我的配置。我適配了兩款遙控器。

&remotectl {
        handle_cpu_id = <2>;
        ir_key1{
                rockchip,usercode = <0xff00>;
                rockchip,key_table =
                       <0xeb   KEY_POWER>,
                       <0xa3   250>,
                       <0xe8   KEY_MENU>,
                       <0xfd   KEY_UP>,
                       <0xfc   KEY_DOWN>,
                       <0xfb   KEY_LEFT>,
                       <0xfa   KEY_RIGHT>,
                       <0xfe   KEY_REPLY>,
                       <0xff   KEY_HOME>,
                       <0xe9   KEY_BACK>,
                       <0xe6   KEY_VOLUMEDOWN>,
                       <0xef   KEY_VOLUMEUP>;
        };
        ir_key2{
                rockchip,usercode = <0x7f80>;
                rockchip,key_table =
                       <0xed   KEY_POWER>,
                       <0xfb   KEY_MENU>,
                       <0xfa   KEY_UP>,
                       <0xe4   KEY_DOWN>,
                       <0xf8   KEY_LEFT>,
                       <0xf6   KEY_RIGHT>,
                       <0xf7   KEY_REPLY>,
                       <0xfe   KEY_HOME>,
                       <0xf9   KEY_BACK>,
                       <0xf3   KEY_VOLUMEDOWN>,
                       <0xf1   KEY_VOLUMEUP>;
        };
};

由於我們是適配常用的按鍵,所以這裡了不需要改Framework層程式碼。如需特殊按鍵定製可以自行查閱資料。
配置完成後重新編譯核心檔案。將得到的kernel.img檔案少燒寫到開發板即可。

到這裡RK3128開發板多款紅外遙控器常用按鍵適配工作告一段落。在接下來的日子裡繼續學習原始碼相關內容。同時也會和大家分析學習心得。

掃描下方二維碼即可關注我的公眾號,想要實時接收博文推送,拿出手機掃碼關注公眾號吧~

公眾號二維碼

微信掃碼,即刻關注。

會不定期的更新相關內容喲 ^_^