LeMaker Guitar:IR

From BananaPro/Pi
Jump to: navigation, search
This page is a translated version of the page LeMaker Guitar:IR and the translation is 100% complete.

Other languages:
English • ‎中文(简体)‎

简介

红外线Infrared Radiation,简称IR,是一种无线通讯方式,可以进行无线数据的传输,其特征:一种点对点的传输方式,无线,距离不能太远,且要对准方向,中间也不能有障碍物(即不能穿墙而过)。 GUITAR的PMU(ACT2603C)内嵌IR功能模块,支持9012、NEC(8bit)、RC5、RC6(mode 0)四种协议的编码格式,完全由硬件实现,无需客户做软解码,从而缩短了项目开发时间。

Guitar PMU 支持的IR协议

9021编码协议

9021.png
9021协议由一个前导码,16bit customer code,以及8bit command code,及其翻转码组成。一组码的发起是由前导码开始,即先发送4.5ms的逻辑“1”(对于接收端是高电平),再发送4.5ms的逻辑“0”(对于接收端是低电平),随后是customer、command code。
其逻辑1&0,是由以下格式组成:(如下是发送端看到的信号,对应接收端逻辑0就是约1.12ms的低电平,逻辑1就是约2.25ms的高电平)。
9021-1.png

NEC 编码协议

Nec.png
NEC(8bit)协议由一个前导码,8bit customer code与其反转码,以及8bit command code,及其反转码组成。一组码的发起是由前导码开始,即先发送9ms的逻辑“1”(对于接收端是高电平),再发送4.5ms的逻辑“0”(对于接收端是低电平),随后是customer、command code。
customer code 由8位用户码及其反码与8位用户码再加8位用户码决定,这由生产商决定。 其逻辑1&0同9021,是由以下格式组成:
9021-1.png

RC5 编码协议

RC5的逻辑0&1,与9021或NEC不相同,其格式如下:
Rc5.png
RC5是由3bit的110组成前导码,其后是5bit customer code和command code。
Rc5-1.png

RC6 编码协议

RC6仅支持mode0。
它是由Header、control以及information三部分组成。
Rc6.png
其中Header由6个字节组成,2bit的startbit,3bit的mode,以及1bit的TR(Trailer bit,当一个按键被释放后发生位翻转,可用于区分新键值或重复按键);control与information分别是8bit的逻辑数值。
Rc6-1.png
First Start bit的信号格式如下:
Rc6-2.png
正常逻辑“1”和“0”的信号格式如下:
Rc6-3.png
TR bit是正常逻辑位的2倍,其格式如下:
Rc6-4.png

Guitar IR 驱动

驱动代码位于:
./linux-actions/drivers/input/keyboard/atc260x-irkeypad.c
平台设备资源位于:
./linux-actions-bsp/linux-actions/arch/arm/boot/dts/lemaker_guitar_bbb.dts
dts配置文件位于:
./linux-actions-bsp/linux-actions/arch/arm/boot/dts/lemaker_guitar_bbb.dts

Guitar PMU IR配置

为了便于开发,以及模块化的需要,我们把IR驱动中需要的资源单独提取出来,这样新移植一款IR的驱动,仅仅只需要配置这些资源即可完成,无需重新编写驱动代码,这些涉及的资源存放在板级文件dts中,位于:
./linux-actions-bsp/linux-actions/arch/arm/boot/dts/lemaker_guitar_bbb.dts
具体配置说明:

atc260x-irkeypad{ /*IR驱动的设备节点*/
size = <28>; /*键值的数量,与ir_code、key_code成员个数必须相同*/
user_code = <16448>; /*IR的customer code,由遥控器自身决定*/
protocol = <1>; /*IR支持的协议,0:90211:NEC8;2:RC5*/
wk_code= <77>; /*IR唤醒键的键值码,一般是power键码*/
period = <140>; /*延时上报弹起动作,单位ms*/
ir_code = <77 67 21 28 11 14 16 17 13 26 69 66 12 1 2 3 4 5 6 7 8 9 0 68 83 18 30 31>;
/*遥控器各按键的键值码*/
key_code = <116 113 115 114 103 108 105 106 353 172 139 158 14 2 3 4 5 6 7 8 9 10 11 175 139 52 165 163>;
/*映射的功能键值,与ir_code对应,提供给android应用*/
compatible = "actions,atc2603c-irkeypad"; /*用于绑定驱动和设备资源*/
};

如何添加遥控器

确认编码协议

如果可以从供应商那里得到这个信息最好了,否则要参考前面第二章的协议介绍自己做判断,这样的话,你需要有一个示波器,观察遥控器的任意一个按键的波形,前导码决定了该遥控器所支持的协议。
以LeMaker Guitar默认配置的遥控器为例,采用的是NEC编码模式。用示波器测量IR接收头的OUT端,按遥控器的任意键,可观察到波形,如:
Protocol.png
可以看到它的前导码是由9ms的低电平和4.5ms的高电平组组成的,可以判断出该款遥控器采用的是NEC编码,故而dts文件中protocol的字段应配置为1。

确认客户码

customer码紧跟在前导码的后面,波形如下:
Customer.png
从上图可以看到,根据NEC协议逻辑1与0的格式可以看出,后面跟的16位数据是0000 0010 0000 0010,数据是由低位到高位组成,所以实际的customer码 0100 0000 0100 0000,即0x4040,即dts的user_code字段应该配置为<16448>。

替换kernel.dtb文件

更改了dts配置文件后,执行make完要把./build/s500/misc/kernel.dtb复制到板子上的/media/lemaker/misc下,替换原有的kernel.dtb文件,重启生效。

确认键值码

一种方式是直接从供应商处获取,另一种方式可以在代码中把打印信息打开,一个个去试。
这里要用我们提供的*.ko文件:
http://mirror.lemaker.org/atc260x-irkeypad.zip
你也可以在github上下载源码自行编译:https://github.com/LeMaker/linux-actions

替换IR驱动:
卸载原驱动:
rmmod atc260x_irkeypad
加载新驱动:
insmod atc260x_irkeypad.ko
显示调试信息:
echo 1 > /sys/kernel/debug/ir_debug/debug_on
由于我们已经在前面的步骤得到了遥控器的协议和customer码,这里打开调试信息后,用遥控器对着IR接收头按下想要确认其键值码的按键,会在终端输出其键值码,如下图:
Irkey.png
如上图所示,显示出 ir_val=0x11,17。即刚才所按的键的键值码为17。同时old_key_val 和 new_key_val为0,表示在dts中还没有该键的映射值(功能码)。

功能码

功能码与键值码是一一对应的,功能码反应了具体的实际功能,它是提供给上层应用的,即应用只认识功能码,捕获后完成对应的功能。

Guitar PMU IR 调试

调试方法

IR调试比较简单,首先拿到IR遥控器要知道对应按键的键值码,根据其按键需要实现的功能参考android标准的按键映射表,填写dts文件。
其次,检查是否有中断产生。遥控器对准设备的IR接收头,用示波器测量接收pin是否有波形参数。如果没有,检查接收头的电源是否正常,否则更换遥控器或IR接收头。如果有波形,就有分析下波形是否与dts设定的参数相同,包括protocol、user_code。
如果能产生中断,获取到IR按键键值,基本就能正常工作了,剩下就是input子系统的工作,根据dts配置的映射表,驱动上报键值给系统。

常见问题说明

针对可休眠的设备,IR无法唤醒设备。
1) 首先确保wk_code是否配置正确,其键值映射必须是POWER。
2) 虽然配置了wk_code,仅只能触发PMU IR控制器唤醒CPU,但是不一定能唤醒android系统,必须在IR驱动resume函数中添加POWER的上报动作,因为android系统由上报的POWER键来决定是否执行late_resume唤醒操作。