文档详情

Linux内核红外遥控子系统LIRC.doc

发布:2017-06-16约字共13页下载文档
文本预览下载声明
Linux Infrared Remote Control System 修订历史 版本 日期 作者 描述 0.1 2011-10-12 杜昌彬 初稿 红外遥控基础知识 红外遥控简介 红外遥控协议有有很多,比如RC-5,RC-6,NEC,SIRC等,不过协议都比较简单,基本上都是以脉冲宽度或脉冲间隔来编码。 当遥控器上按下按键时,遥控器逻辑单元会产生一个完整的逻辑脉冲波形,这个波形上包含了遥控命令的信息,他是红外传输的基带信号。这个波形被送到遥控器的调制单元,经调制单元调制成高频的红外电磁波信号,并由发光二极管发射出去。如下图的左边模块。 红外遥控的信号的产生和接收 红外电磁波信号现在一般使用一体化接收头接收,接收头同时完成了信号的解调和放大,其输出信号就是红外的基带脉冲信号。解调后的信号可直接送入信号处理器中由处理器对脉冲波形进行解码,也就是将经编码的脉冲信号翻译成逻辑数字。根据不同的控制协议,解码方式不同。 红外接收头,一跟线用于输出脉冲信号,其他两根是电源线和地线 红外遥控协议 下面已sony的SIRC协议为列说明。 编码 SIRC协议使用脉冲宽度对每一比特位进行编码,编码规则如下: SIRC协议首先,每一个脉冲后跟一个固定宽为600微秒的间隔,而每一个脉冲便是一个逻辑数字,并由脉冲的宽度决定是0还是1:脉冲宽度1200微秒表示逻辑1,宽度600微秒表示逻辑0. 幀格式 当按下遥控器上的按键时,遥控器会发送一个命令信号,这个信号就是一个幀,它包含了命令字段和地址(设备)字段,以及扩展字段。当按住按键不放时,遥控器会不断的发送这一命令信号,直到松开。 SIRC协议的幀格式有12位、15位、20位三种,如下所示: 一个幀以一个起始标志(图中的红色)开始,它是一个2400微秒的脉冲并跟一个间隔。之后是7字节的命令字段(图中的橙色),这个字段用于识别按下了遥控器上的哪个按键;然后是地址字段(图中的蓝色),用于识别控制的是什么类型的设备;对于20位宽格式,还有一个扩展字段,用于传输其他信息。 址值和设备类型映射表 一种命令值和具体按键的映射表 示例:Sony电视遥控器上“音量-”按键对应的脉冲波形 对于脉冲波形的解码,一般用一个专门的硬件单元完成,也可以在CPU中利用如GPIO等检测接收器输出的波形然后使用软件的方式解码,但这种方式效率显然很低。 Linux 对红外遥控的支持 Linux上通过LIRC子系统对红外控制提供支持,它包含几个部分:lirc核心、协议原始脉冲解码器、按键映射表、红外输入设备驱动。LIRC代码在: drivers/media/IR 协议原始脉冲解码器模块 解码器模块实现用软件的方法对原始脉冲进行解码。解码器用一个ir_raw_handler结构表示。 struct ir_raw_handler { struct list_head list; int (*decode)(struct input_dev input_dev, struct ir_raw_event event); /* 解码函数 */ int (*raw_register)(struct input_dev input_dev); /* 注册函数 */ int (*raw_unregister)(struct input_dev input_dev); /* 卸载函数 */ }; 解码器通过注册和卸载函数: int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler) void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler) 当注册解码器时, ir_raw_handler的 raw_register函数被调用,所以可在其进行一些解码器初始化工作。相应的,卸载时 raw_unregister函数被调用。所有注册的解码器放在一个全局链表ir_raw_handler_list中,lirc会便利每个解码器对报告的波形进行解码,注意,此时当任何一个解码器返回一个错误,后面的解码器不会被执行,所以不要将不使用的解码器模块同时加载到内核中。 解码器的主体就是 decode函数,lirc核心会将驱动报告的每个脉冲一次一次的传递到decode 函数,而decode 函数的实现就是一个状态机,每一次输入导致进入下一状态,直到一次解码完成,然后返回起始状态进行下次解码。 再LIRC中,每个脉冲(包括脉冲间隔)用一个ir_raw_event结构表示: struct ir_raw_event { unsigned
显示全部
相似文档