当前位置: 首页 > article >正文

【RK3568笔记】Android适配红外遥控器

概述

红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波;红外接收电路由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器。

在这里插入图片描述

鉴于家用电器的品种多样化和用户的使用特点,生产厂家对进行了严格的规范编码,这些编码各不相同,从而形成不同的编码方式,统一称为红外遥控器编码传输协议。到目前为止,红外遥控协议已多达十种, 如: RC5、 SIRCS、 Sy、 RECS80、Denon、NEC、Motorola、Japanese、SAMSWNG 和 Daewoo 等。我国家用电器的红外遥控器的生产厂家,其编码方式多数是按上述的各种协议进行编码的,而用得较多的有 NEC 协议。目前 RK 平台也只支持 NEC 编码的红外协议。


RK 平台上红外实现原理简介

PWM 有三种工作模式, reference mode, one-shot modecontinuous 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和码值

打开键值打印开关,按遥控器的按键,记录下对应的键值例如按下ResetPrtScr,有如下打印。
在这里插入图片描述

该遥控器的 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 红外遥控器增加自定义按键


http://www.kler.cn/a/456551.html

相关文章:

  • Kafka 性能提升秘籍:涵盖配置、迁移与深度巡检的综合方案
  • WPF的下拉复选框多选,数据来源数据库的表
  • sqlserver镜像设置
  • 如何在LabVIEW中更好地使用ActiveX控件?
  • 在实际开发中,如何权衡选择使用哪种数据结构和算法?
  • 使用npm包的工程如何引入mapboxgl-enhance/maplibre-gl-enhance扩展包
  • 虚拟机配置网络(nat)
  • Windows 安装 Jenkins 教程
  • 敏捷开发Scrum的深入理解和实践
  • 开源轮子 - EasyExcel02(深入实践)
  • .net core 的文件操作
  • HTML 标签页(Tabs)详细讲解
  • ISDP010_基于DDD架构实现收银用例主成功场景
  • 探索 Java 微服务的新趋势:现代工具与最佳实践
  • 【elementplus】中文模式
  • 【微信小程序】4plus|搜索框-历史搜索 | 我的咖啡店-综合实训
  • yarn install 安装报错:Workspaces can only be enabled in private projects.
  • 用 Unity 引擎,了解其核心概念、组件、资源、脚本、编辑器等功能,能够独立开发多平台的游戏或应用
  • 一种基于XC7V690T的在轨抗单粒子翻转系统(一)
  • IDEA2020的一些有用的功能
  • Java 溯本求源之基础(三十)——封装,继承与多态
  • STM32开发笔记123:使用STM32CubeProgrammer下载程序
  • 存储快照与拓扑调度
  • 软件工程三 需求获取与结构化分析方法(需求分析、功能建模、数据建模、行为建模、数据字典等)
  • 嵌入式AI STM32部署卷积神经网络的魔法棒
  • Linux上更新jar包里的某个class文件