瑞芯微Rockchip开发者社区
直播中

kmno4

12年用户 965经验值
私信 关注
[问答]

RK3288如何操作才能适配客户定制的红外遥控器?

RK3288如何操作才能适配客户定制的红外遥控器?

回帖(1)

王璨

2022-3-3 11:51:01
需求:

客户提供遥控器,需要在系统上适配该遥控器,接收对应的遥控器键值,并作相应的处理;

方法:

1、确定硬件接线方式,确定IR是直接接到RK3288上,并记住对应的pin脚;(PWM0)



2、Linux 3.10内核关于红外的代码文件在:kernel/drivers/input/remotectl/目录下

3、配置编译驱动选项

  RK3288平台默认配置已有IR部分,没有的按下列方式添加;

3.1  drivers/input/remotectl/Kconfig添加

config ROCKCHIP_REMOTECTL_PWM
    bool "rockchip remoctrl pwm capture"
        default n
3.2  drivers/input/remotectl/Makefile添加

obj-$(CONFIG_ROCKCHIP_REMOTECTL_PWM)      += rockchip_pwm_remotectl.o
3.3 打开编译IR的宏

方法一:

make menuconfig
Device Drivers
  --->Input device support
  ----->  

  •    rkxx remotectl
      ------->
  •    rkxx remoctrl pwm0 capture.
    方法二:

    修改kernel目录下的.config文件

    CONFIG_ROCKCHIP_REMOTECTL=y
    CONFIG_ROCKCHIP_REMOTECTL_PWM=y
    4、修改dts配置

    4.1 参考kernel/arch/arm/boot/dts/firefly-rk3288.dts 关于pwm0的配置

    &pwm0 {  //与前面硬件连接线有关 pwm的id
            compatible = "rockchip,remotectl-pwm";
            remote_pwm_id = <0>;  //与前面硬件连接线有关 pwm的id
            handle_cpu_id = <1>;
            status = "okay";

            ir_key1{
                    rockchip,usercode = <0xff00>;
                    rockchip,key_table =
                            <0xeb   KEY_POWER>,
                            <0xec   KEY_MENU>,
                            <0xfe   KEY_BACK>,
                            <0xb7   KEY_HOME>,
                            <0xa3   250>,
                            <0xf4   KEY_VOLUMEUP>,
                            <0xa7   KEY_VOLUMEDOWN>,
                            <0xf8   KEY_REPLY>,
                            <0xfc   KEY_UP>,
                            <0xfd   KEY_DOWN>,
                            <0xf1   KEY_LEFT>,
                            <0xe5   KEY_RIGHT>;
            };
    };
    4.2 获取遥控器的用户码和键值

    方法一:

    一般客户会提供该遥控器的键码说明



    方法二:

    通过内核日志打印获取用户码和键值

    打开打印功能有两种方式:

    ①adb或串口调试

    echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print
    ②修改源码

    diff --git a/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c b/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
    index 9776d3a..15adaa4 100755
    --- a/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
    +++ b/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
    @@ -25,7 +25,7 @@
    /*sys/module/rk_pwm_remotectl/parameters,
    modify code_print to change the value*/

    -static int rk_remote_print_code;
    +static int rk_remote_print_code = 1;
    static bool remote_suspend = false;
    module_param_named(code_print, rk_remote_print_code, int, 0644);
    #define DBG_CODE(args...)

    以上两种方式处理之后,每按下一次内核日志会出现类似下列的打印;

    <6>[ 1579.248716] USERCODE=0xdd72
    <6>[ 1579.275517] RMC_GETDATA=f1
    问题来了,客户提供的键值表用户码为72DD,power键的键值为0E;为什么android内核获取的不一致呢?

    虽然不一致,但是能看到以下的规律;

    ①72DD和72DD 十六进制 前两位和后两位置换

    ②0E(0000 1110)和F1 (1111 0001)按位取反

    我们找一个firefly的遥控器确认一下是否如此,另外由4.1结合下图可知dts配置和android内核获取的一致(遥控器键值表中的的码值需要按位取反);



    在配置dts前,我们用getevent看下是否能获取到linux键值;按下power键获取如下Linux键值;

    /dev/input/event0: 0001 0069 00000001
    /dev/input/event0: 0000 0000 00000000
    0x0069为16进制,对应的10进制为105,对应的linux键值在kernel/include/dt-bindings/input/input.h宏定义,其中105对应的是KEY_LEFT,那就不对了,目前红外码值与Linux键值还没有对应上;按照下列方式在dts种将码值和Linux键值对应;

    diff --git a/kernel/arch/arm/boot/dts/firefly-rk3288.dts b/kernel/arch/arm/boot/dts/firefly-rk3288.dts
    old mode 100644
    new mode 100755
    index b8b8c23..bed36b2
    --- a/kernel/arch/arm/boot/dts/firefly-rk3288.dts
    +++ b/kernel/arch/arm/boot/dts/firefly-rk3288.dts
    @@ -1111,6 +1111,32 @@
                            <0xf1   KEY_LEFT>,
                            <0xe5   KEY_RIGHT>;
            };
    +
    +       ir_key2{
    +               rockchip,usercode = <0xdd72>;
    +               rockchip,key_table =
    +                       <0xf1   KEY_POWER>,
    +                       <0xfc   KEY_MENU>,
    +                       <0xb8   KEY_BACK>,
    +                       <0xe9   KEY_HOME>,
    +                       <0xb6   KEY_VOLUMEUP>,
    +                       <0xbc   KEY_VOLUMEDOWN>,
    +                       <0xbb   KEY_UP>,
    +                       <0xe2   KEY_DOWN>,
    +                       <0xe3   KEY_LEFT>,
    +                       <0xb7   KEY_RIGHT>,
    +                       <0xa3   KEY_ENTER>,
    +                       <0xec   KEY_1>,
    +                       <0xef   KEY_2>,
    +                       <0xee   KEY_3>,
    +                       <0xf0   KEY_4>,
    +                       <0xf3   KEY_5>,
    +                       <0xf2   KEY_6>,
    +                       <0xf4   KEY_7>,
    +                       <0xf7   KEY_8>,
    +                       <0xf6   KEY_9>,
    +                       <0xb4   KEY_0>;
    +       };
    };

    重新按下Power键获得下列Linux键值,跟kernel/include/dt-bindings/input/input.h宏定义一致;

    /dev/input/event0: 0001 0074 00000001
    /dev/input/event0: 0000 0000 00000000
    试了下新加的几个按键,发现在输入框中按数字0~9,没反应;但是getevent获取的Linux键值是正确的;这里引入一个Android键值,需要与Linux键值对应起来;

    Linux键值与Android键值通过kl(key layout)文件映射起来,可以通过dumpsys input或者getevent命令获取该设备使用的.kl文件;

    ff680000.pwm对应的文件为ff680000_pwm.kl,RK平台的文件位于/device/rockchip/common/目录下

    key 28    ENTER
    key 116   POWER

    第一个KEY是固定的,第二个数值28代表Linux键值(十进制,与kernel/include/dt-bindings/input/input.h对应),第三个数值ENTER代表Android键值;

    diff --git a/device/rockchip/common/ff680000_pwm.kl b/device/rockchip/common/ff680000_pwm.kl
    index 01197b9..3a8e6f0 100755
    --- a/device/rockchip/common/ff680000_pwm.kl
    +++ b/device/rockchip/common/ff680000_pwm.kl
    @@ -1,6 +1,16 @@
    #$_FOR_ROCKCHIP_RBOX_$
    #$_rbox_$_modify_$_chenzhi_20120220: add for IR remote

    +key  2    1
    +key  3    2
    +key  4    3
    +key  5    4
    +key  6    5
    +key  7    6
    +key  8    7
    +key  9    8
    +key 10    9
    +key 11    0
    key 28    ENTER
    key 116   POWER
    key 158   BACK
    可以从/device/rockchip/common/device.mk 查出kl文件位于Android系统的哪个目录?

    device/rockchip/common/ff680000_pwm.kl:system/usr/keylayout/ff680000_pwm.kl
    手动push进去system/usr/keylayout/,重新测试,测试正常;
举报

更多回帖

发帖
×
20
完善资料,
赚取积分