Platform: RK3288
OS: Android 5.1.1
Kernel: v3.10.0
需求:
客户提供遥控器,需要在系统上适配该遥控器,接收对应的遥控器键值,并作相应的处理;
方法:
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/,重新测试,测试正常;