最近拿到一块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开发板多款红外遥控器常用按键适配工作告一段落。在接下来的日子里继续学习源码相关内容。同时也会和大家分析学习心得。