【RK3568笔记】Android适配红外遥控器
概述
红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波;红外接收电路由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器。
鉴于家用电器的品种多样化和用户的使用特点,生产厂家对进行了严格的规范编码,这些编码各不相同,从而形成不同的编码方式,统一称为红外遥控器编码传输协议。到目前为止,红外遥控协议已多达十种, 如: RC5、 SIRCS、 Sy、 RECS80、Denon、NEC、Motorola、Japanese、SAMSWNG 和 Daewoo 等。我国家用电器的红外遥控器的生产厂家,其编码方式多数是按上述的各种协议进行编码的,而用得较多的有 NEC
协议。目前 RK
平台也只支持 NEC
编码的红外协议。
RK 平台上红外实现原理简介
PWM
有三种工作模式, reference mode
, one-shot mode
和 continuous mode
. 红外遥控器就采用 reference mode
,这种模式下 PWM
可以捕获输入高低电平的宽度,并产生中断,CPU
接收到中断后去相应的寄存器读取。
按下遥控的时候,红外接收头会产生一系列的高低电平,PWM
就会产生相应的中断,CPU
读取相应的寄存器就知道这些高低电平的时间,根据协议就可以解码出红外的用户码和键值码出来。
RK3568遥控器添加方法
本文是在正点原子RK3568
开发板上适配新的遥控器,适配步骤如下:
1、确定编译的配置
查看编译脚本中所用的配置,用于确认所用的设备树 rk3568-atk-evb1-ddr4-v10.dtsi
home/ho/rk3568_android_sdk/kernel-4.19/make.sh
2、确认新遥控器的USERCODE和码值
打开键值打印开关,按遥控器的按键,记录下对应的键值例如按下Reset
、PrtScr
,有如下打印。
该遥控器的 usercode
是 0xbf4,Reset
键值就是 0xbb 、PrtScr
键值是0xa9。如此反复,直到打印完遥控器上的所有键值。
3、在设备树中添加配置
步骤1通过编译脚本确认当前使用设备树,在设备树中添加遥控器键码值。
/home/ho/rk3568_android_sdk/kernel-4.19/arch/arm64/boot/dts/rockchip/rk3568-atk-evb1-ddr4-v10.dtsi
&pwm7 {
ir_key1 {
/* Ho 适配新遥控器 */
rockchip,usercode = <0xbf4>;
rockchip,key_table =
<0xff KEY_POWER>, //电源
<0xfe KEY_MUTE>, //静音
<0xfd KEY_1>, //1
<0xfc KEY_2>, //2
<0xfb KEY_3>, //3
<0xfa KEY_4>, //4
<0xf9 KEY_5>, //5
<0xf8 KEY_6>, //6
<0xf7 KEY_7>, //7
<0xf6 KEY_8>, //8
<0xf5 KEY_9>, //9
<0xf3 KEY_0>, //10
<0xbe KEY_PAGEUP>, //下翻页
<0xbd KEY_PAGEDOWN>, //下翻页
<0xec KEY_UP>, //上
<0xeb KEY_DOWN>, //下
<0xee KEY_LEFT>, //左
<0xed KEY_RIGHT>, //右
<0xea KEY_BACK>, //返回
<0xb7 KEY_VOLUMEUP>, //音量+
<0xb6 KEY_VOLUMEDOWN>, //音量-
<0xbc KEY_MENU>, //菜单
<0xe3 KEY_SLEEP>, //休眠
<0xb5 KEY_CHANNELUP>, //频道+
<0xb4 KEY_CHANNELDOWN>, //频道-
<0xb3 KEY_HOME>, //主页
<0xae KEY_SCREENLOCK>, //锁屏
<0xe0 KEY_RESTART>, //重启
<0xa9 KEY_PRTSCR>, //截图 linux没有标准键定义
<0xbb KEY_RESET>, //重置 linux没有标准键定义
<0xe9 KEY_PEN>, //画笔 linux没有标准键定义
<0xef KEY_REPLY>; //确认
};
};
ir_key1
是代码第一个,这个名字没有要求,新加一个就序号加 1,第二个的话一般就命名成ir_key2
,以此类推。
handle_cpu_id
项代表 ir 中断在哪一个 cpu
上处理,如果是 4 核系统可以是 0-3,如果是双系统只能是 0-1,为了遥控中断更好的响应建议错开 cpu0
去处理。
4、内核头文件中增加按键定义
/home/ho/rk3568_android_sdk/kernel-4.19/include/dt-bindings/input/linux-event-codes.h
/home/ho/rk3568_android_sdk/kernel-4.19/include/dt-bindings/input/rk-input.h
5、键值映射文件Generic.kl
增加与上层对应关系
使用指令dumpsys input
找到对应的kl文件
/home/ho/rk3568_android_sdk/frameworks/base/data/keyboards/Generic.kl
6、KeyEvent.java
定义上层键值
注意下面提示哪里有需要更新的地方
public static final int KEYCODE_PRTSCR = 289; //截图
public static final int KEYCODE_RESET = 290; //重置
public static final int KEYCODE_PEN = 291; //画笔
/**
* Integer value of the last KEYCODE. Increases as new keycodes are added to KeyEvent.
* @hide
*/
@TestApi
public static final int LAST_KEYCODE = KEYCODE_PEN;
// NOTE: If you add a new keycode here you must also add it to:
// isSystem()
// isWakeKey()
// frameworks/native/include/android/keycodes.h
// frameworks/native/include/input/InputEventLabels.h
// frameworks/base/core/res/res/values/attrs.xml
// emulator?
// LAST_KEYCODE
7、keycodes.h
定义上层键值
/home/ho/rk3568_android_sdk/frameworks/native/include/android/keycodes.h
8、添加按键标签定义
/home/ho/rk3568_android_sdk/frameworks/native/libs/input/InputEventLabels.cpp
9、attrs.xml
中增加按键
/home/ho/rk3568_android_sdk/frameworks/base/core/res/res/values/attrs.xml
<!-- Ho添加 新增自定义按键 -->
<enum name="KEYCODE_PTRSCR" value="289" />
<enum name="KEYCODE_RESET" value="290" />
<enum name="KEYCODE_PEN" value="291" />
10、按键已经添加完毕,但是编译会报错如下,需要更新 api 文件,先执行指令 make update-api
,再编译
You have tried to change the API from what has been previously approved.
To make these errors go away, you have two choices:
1) You can add "@hide" javadoc comments to the methods, etc. listed in the
errors above.
2) You can update current.txt by executing the following command:
make update-api
To submit the revised current.txt to the main Android repository,
you will need approval.
11、在 getevent.h
中添加此按键标签
/home/ho/rk3568_android_sdk/out/soong/.intermediates/system/core/toolbox/toolbox_input_labels/gen/input.h-labels.h
12、上一步添加标签后编译会报错,提示找不到 KEY_PRTSCR
等,则需要在头文件中定义
/home/ho/rk3568_android_sdk/bionic/libc/kernel/uapi/linux/input-event-codes.h
13、上层接收到按键值
按照上述方式添加完成遥控器按键的映射和定义后,上层即可接收到遥控器按下抬起的动作。
在PhoneWindowManager
中通过interceptKeyBeforeQueueing
方法拦截特殊按键事件。
12-26 04:25:53.343 463 567 I WindowManager: interceptKeyBeforeQueueing: keyCode = 290 ,down = true
12-26 04:25:53.344 463 567 I WindowManager: interceptKeyBeforeQueueing:遥控器重置 !
12-26 04:25:53.346 463 566 D WindowManager: interceptKeyTi keyCode=290 down=true repeatCount=0 keyguardOn=false canceled=false
12-26 04:25:53.528 463 567 I WindowManager: interceptKeyBeforeQueueing: keyCode = 290 ,down = false
12-26 04:25:53.528 463 567 I WindowManager: interceptKeyBeforeQueueing:遥控器重置 !
12-26 04:25:53.529 463 566 D WindowManager: interceptKeyTi keyCode=290 down=false repeatCount=0 keyguardOn=false canceled=false
12-26 04:29:21.235 463 567 I WindowManager: interceptKeyBeforeQueueing: keyCode = 291 ,down = true
12-26 04:29:21.236 463 567 I WindowManager: interceptKeyBeforeQueueing:遥控器画笔 !
12-26 04:29:21.237 463 566 D WindowManager: interceptKeyTi keyCode=291 down=true repeatCount=0 keyguardOn=false canceled=false
12-26 04:29:21.417 463 567 I WindowManager: interceptKeyBeforeQueueing: keyCode = 291 ,down = false
12-26 04:29:21.418 463 567 I WindowManager: interceptKeyBeforeQueueing:遥控器画笔 !
12-26 04:29:21.419 463 566 D WindowManager: interceptKeyTi keyCode=291 down=false repeatCount=0 keyguardOn=false canceled=false
结尾
参考文章
Rockchip_Developer_Guide_PWM_IR_CN.pdf
RK3288 红外遥控器增加自定义按键