[RK3288][Android5.1] 调试笔记 --- 适配客户定制的红外遥控器

Platform: RK3288
OS: Android 5.1.1
Kernel: v3.10.0

需求:

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

方法:

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

[RK3288][Android5.1] 调试笔记 --- 适配客户定制的红外遥控器

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 获取遥控器的用户码和键值

方法一:

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

[RK3288][Android5.1] 调试笔记 --- 适配客户定制的红外遥控器

方法二:

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

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

①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内核获取的一致(遥控器键值表中的的码值需要按位取反);

[RK3288][Android5.1] 调试笔记 --- 适配客户定制的红外遥控器

 在配置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/,重新测试,测试正常;

上一篇:PWM编程基本操作步骤


下一篇:SBUS如何连接4G,如果通过数传DTU传输,实现远程控制