最近拿到一块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

android 遥控器按键值 安卓通用遥控器_产品


如上边的“0xff00”就是用户码,“fa”就是按键对应的键值码。

记录完你要配置的所有按键的键值码后接下来配置内核进行适配。

第二部:配置dts文件

进入kernel/arch/arm/boot/dts目录打开rk3128的配置文件rk3128-box-rk88.dts,找到remotectl节点,

可以看到事先已有默认的配置

android 遥控器按键值 安卓通用遥控器_RK3128_02

这是我们只需要把自己遥控器的用户码和对应的键值码替换即可。
如果有多款遥控器要适配那就按照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开发板多款红外遥控器常用按键适配工作告一段落。在接下来的日子里继续学习源码相关内容。同时也会和大家分析学习心得。