转载好文--完全接管遥控器(Total Remote Control)--

来源:互联网 发布:数控铣床编程图案1.2.2 编辑:程序博客网 时间:2024/05/17 03:40

转载自:http://www.cnitblog.com/gouzhuang/archive/2010/05/14/remote_control.html


定制固件通常都希望能够接收遥控器按键输入,这样就可以通过遥控器来控制某些功能,如启动/停止下载等。目前在各论坛上已经有了一些方法,我在这里介绍一种内核层面的实现方法。


先简单说一下遥控器是如何工作的。内核里有一个红外线接收器驱动程序,它的任务是接收并暂存遥控器按键供应用程序读取。每一个遥控器按键对应一个32位的代码,称为按键码。驱动程序每接收到一次按键,会在缓冲区内存储两个32位整数:第一个是按键码,第二个是重复标志(1表示重复按键,0则不是)。应用程序通过字符设备/dev/venus_irrp来读取遥控器按键码和重复标志。/dev/venus_irrp还支持ioctrl,应用程序可通过ioctrl设置一些驱动程序参数,如遥控器协议类型、驱动模式等。

通过修改红外线接收器驱动程序,可以实现以下功能:

1. 增加一个“影子”设备:/dev/shadow_irrp。所有接收到的按键码都一式两份分别发送到/dev /venus_irrp和/dev/shadow_irrp。
2. 提供一个sysfs接口:/sys/devices/platform/VenusIR/bypass,用于封锁或解锁/dev/venus_irrp。所谓封锁就是遥控器按键码不再发送到/dev/venus_irrp。当然任何时候“影子”设备都能接收到按键码(转发按键除外)。
封锁方法:echo 1 > /sys/devices/platform/VenusIR/bypass
解锁方法:echo 0 > /sys/devices/platform/VenusIR/bypass
3. 提供一个sysfs接口:/sys/devices/platform/VenusIR/fakekey,用于发送“伪造”的按键码到/dev/venus_irrp,从而实现转发。
转发方法,以按键代码“aa557f80”为例:
echo 'aa557f80' > /sys/devices/platform/VenusIR/fakekey

通过新的驱动程序,可以实现两种遥控模式:并行模式和过滤转发模式。

并行模式是指/dev/venus_irrp和/dev/shadow_irrp同时接收相同的按键码,dvdplayer使用vensu_irrp,自己开发的脚本或程序使用shadow_irrp,互不相干。而过滤转发模式则是封锁venus_irrp,按键码只发送到“影子”设备,经过程序过滤以后再转发到vensu_irrp。我们可以根据不同的定制需求选择两者之一,也可以随时在两种模式之间切换。

我们知道接收器的驱动程序在官方固件里是编入内核的,因此要使用新的驱动应该是要替换官方内核的。考虑到替换内核的操作比较复杂,必需重刷固件,而且目前我们手上的内核源码很可能与官方的不同,有潜在的兼容性风险,我们有必要另辟蹊径。我的策略是把新的驱动程序编译成模块,在模块初始化时通过内核符号表查到原驱动程序的退出清理函数venus_ir_cleanup_module()的地址,然后调用这个函数让它完成清理工作,接着新的驱动程序开始初始化,从而完成驱动程序的动态替换。

驱动程序源代码:venus_ir_new.tar.zip
编译好的模块:venus_ir_new.ko.zip

编译源码时需要修改Makefile中的KERNELDIR变量为你的内核源码目录。

注意事项:新的驱动程序模块必需在dvdplayer启动之前加载,否则dvdplayer已经打开了/dev/venus_irrp设备,驱动程序的替换会失败。因此建议将模块加载的命令放在/usr/local/etc/rcS中启动dvdplayer之前。
原创粉丝点击