首页 > 代码库 > Cubieboard自带的红外接收(IR)测试成功

Cubieboard自带的红外接收(IR)测试成功

首先,你要自己有编译sun4i-ir.ko驱动,不过好像默认编译就带了这个驱动,所以,你们用的各个版本的内核应该都已经有驱动了,不过不一定自动加载了的。自己lsmod查看一下有木有,如果木有,就去驱动目录下insmod一下(insmod /lib/modules/3.0.57+(换3.0.57+为你的内核版本)/kernel/drivers/input/keyboard/sun4i-ir.ko)

先看看驱动信息,和被加载的位置:
未命名1.jpg 

未命名2.jpg 

如果无误,那就可以直接使用了~
要强调的是:请使用家里的电视机遥控器来测试,因为我试过空调遥控器,因为频率不对,接收不到,完全没反应。
未命名3.jpg 
先看看红外接收设备被加载在哪个位置,它其实是被当做键盘设备来加载的,当接收到信息的时候就会产生系统事件,所以我们只要查看这个设备产生的事件就好了。嗯,是input1,经测试,该事件的系统路径应该在/dev/input/event1

现在我们直接来在命令行里查看接收到的信息被解码后的数据,因为直接查看的话,一堆二进制0101在命令行里展示出来就是乱码,所以我使用hexdump将其转换为16进制查看。
未命名4.jpg 
看到了吧,收到的信息就是这些,你买个遥控器,把每一个键的信息记录下来之后,就可以写程序监听这些信号,实现遥控板操控CB了,哈哈

最后解释一下我猜测的 信号解读,比如:
00003f0 0b7f 0000 312b 0007 0000 0000 0000 0000
0000400 0b7f 0000 861b 000a 0001 005b 0001 0000
0000410 0b7f 0000 8621 000a 0000 0000 0000 0000
0000420 0b80 0000 a199 0000 0001 005b 0000 0000
0000430 0b80 0000 a19e 0000 0000 0000 0000 0000
0000440 0b80 0000 d641 0005 0001 005b 0001 0000
0000450 0b80 0000 d646 0005 0000 0000 0000 0000
0000460 0b80 0000 502c 000b 0001 005b 0000 0000
0000470 0b80 0000 5031 000b 0000 0000 0000 0000
0000480 0b81 0000 6b30 000b 0001 005b 0001 0000
0000490 0b81 0000 6b36 000b 0000 0000 0000 0000
00004a0 0b82 0000 8c76 0001 0001 005b 0000 0000
00004b0 0b82 0000 8c7b 0001 0000 0000 0000 0000
00004c0 0b82 0000 6927 0009 0001 005b 0001 0000
00004d0 0b82 0000 692c 0009 0000 0000 0000 0000
00004e0 0b82 0000 d320 000e 0001 005b 0000 0000
00004f0 0b82 0000 d325 000e 0000 0000 0000 0000
0000500 0b84 0000 6dc5 0005 0001 005b 0001 0000
0000510 0b84 0000 6dcb 0005 0000 0000 0000 0000
0000520 0b84 0000 dbd7 000a 0001 005b 0000 0000
0000530 0b84 0000 dbdc 000a 0000 0000 0000 0000

这是我反复按下和放开同一个键得到的信息,首先,可以确认的是,当你按下一个键,会产生一组信号,当你的红外移出IR的接收范围或者放开按键,又会产生一组信号。
我来截取其中4组信号来分析:
00004c0 0b82 0000 6927 0009 0001 005b 0001 0000  #这两行是第1次按下时产生的
00004d0 0b82 0000 692c 0009 0000 0000 0000 0000
00004e0 0b82 0000 d320 000e 0001 005b 0000 0000  
#这两行是第1次放开时产生的
00004f0 0b82 0000 d325 000e 0000 0000 0000 0000
0000500 0b84 0000 6dc5 0005 0001 005b 0001 0000
  #这两行是第2次按下时产生的
0000510 0b84 0000 6dcb 0005 0000 0000 0000 0000
0000520 0b84 0000 dbd7 000a 0001 005b 0000 0000
  #这两行是第2次放开时产生的
0000530 0b84 0000 dbdc 000a 0000 0000 0000 0000

首先抛开第一列(红色部分),那是hexdump打印出的解码后的信号的内存地址。

第二列,应该是每次按下和放开是相同的值,第二次按下就会+2,那我们可以理解为每一次按键产生信号的自增ID,如果多个遥控器在给他发信号,你接收信号可以不会乱,因为某次按下和放开的值始终相同。

第3列,不清楚,可能是第二列的扩展,或者是第4列的开始(前半部分)

第4、5列,看不懂了。。都是同一个键。。这些变化的数据肯定和键的值无关

每次按下同一个键的时候,不变的部分,就是后面4列了。而且我按完所有的键,每一组(两行)的第二行后4列始终是0.
那么是不是可以理解为,每一组第一行的数据后4列:

0001 005b 0001 0000  表示我遥控器上的xx键被按下  
0001 005b 0000 0000  表示我遥控器上的xx被按放开
0001 005b代表我的键的标示符,0001 0000 表示被按下 0000 0000 表示被放开
再进一步想,0x10000换成十进制就是65536 。应该没有人会用65536 表示按下 然后 0表示放开吧?
所以后面4个0应该也不用管,可能有其他用途把,那么0001就应该表示被按下, 0000表示放开。

猜解完毕!

2013-5-4更新:键的标示符也是只用1列数据表示,比如上面的005b ,而前面的0001是无关数据也就是说,005b 0001表示5b这个键按下 005b 0000表示它被放开

如有疑问请参考hipboi大神的答复(for Android):
http://cn.cubieboard.org/forum.p ... ad&tid=100#post_415


同时,我也上传两个驱动,以防万一有人没有这个驱动:
 sun4i-ir for 3.0.57 .zip (3.63 KB, 下载次数: 114)   for kernel 3.0.57+ only
 sun4i-ir for 3.0.57.zip (36.59 KB, 下载次数: 107)   for kernel 3.0.57 only
提示:版本不符的就不要下了,版本符合的,下了也不一定行,哈哈(因为module的全版本号是:vermagic:       3.0.57+ mod_unload modversions ARMv7 ,如果你查看系统其他驱动信息带了 PREEMPT或是其他字眼,反正只要与这串字符有差异,你就没法用,即使相同,也有可能报一些莫名其妙的错,不过不是驱动的问题,还是版本的问题)
所以,如果你的系统没有自带,还是自己编译吧。


后续步骤就是安装lirc,但我装了没配置成功。
这里只是抛砖引玉,希望各位有所发展,希望有能人能把 lirc 搞定就,然后给大家参考~

2013-5-4更新:lirc已经有人测试成功了,我也测过,可行,只是貌似还是不太完美。
地址见此处:http://cn.cubieboard.org/forum.php?mod=viewthread&tid=281


原文作者:WindLand
原文链接:http://forum.cubietech.com/forum.php?mod=viewthread&tid=133&extra=page%3D9

Cubieboard自带的红外接收(IR)测试成功