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
(1和echo中間有空格,這段命令的作用是往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開發板多款紅外遙控器常用按鍵適配工作告一段落。在接下來的日子裡繼續學習原始碼相關內容。同時也會和大家分析學習心得。
掃描下方二維碼即可關注我的公眾號,想要實時接收博文推送,拿出手機掃碼關注公眾號吧~