ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-03-31 20:34:02  阅读:503  来源: 互联网

标签:Android5.1 适配 remotectl --- 键值 key rockchip input pwm


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

标签:Android5.1,适配,remotectl,---,键值,key,rockchip,input,pwm
来源: https://blog.csdn.net/qq_34594095/article/details/115337261

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有