红外传输

  • 格式:doc
  • 大小:47.50 KB
  • 文档页数:7

linux红外远程控制驱动时间:2010-05-22 22:22:44来源:网络作者:未知点击:53次1、红外通信协议红外通信是传统的线缆通信方式的替代,被用来进行设备之间点对点的数据传输。

目前作为一种广泛使用的无线连接技术,被众多的硬件和软件平台支持。

它具有小角度、短距离、传输速率高等特点。

红外通信技术1、红外通信协议红外通信是传统的线缆通信方式的替代,被用来进行设备之间点对点的数据传输。

目前作为一种广泛使用的无线连接技术,被众多的硬件和软件平台支持。

它具有小角度、短距离、传输速率高等特点。

红外通信技术发展的早期,存在有几种不同的通信标准,不同标准之间的通信设备并不能进行红外通信,为了统一红外通信标准,于1993年,一些厂商成立了IrDA(红外数据协会)。

IrDA是目前红外无线通信的工业标准,你可以使用它与打印机、传真机、modem、其它计算机进行通信。

按照速率IrDA红外通信可以分为下面四种:l SIR:2.4 kbit/s 到115.2 kbit/s,最基本的红外标准。

串口连接时必定使用的是SIR。

l MIR:576 kbit/s 到1152 kbit/sl FIR:4 Mbit/sl VFIR:16 Mbit/s2、红外通信装置为了进行红外通信,我们需要有发送和接收红外信号的装置,笔记本一般都带有IrDA的红外接口,而台式机一般需要购买专门的红外适配器。

目前市场上的红外适配器主要有串口红外适配器、USB红外适配器、主板接口红外适配器等。

利用我们的计算机进行红外通信的方式主要有:l 利用IrDA接口与其它具有红外通信接口的设备,如打印机、传真机、计算机等通信。

l 使用专用的红外遥控器和接收器。

l 使用红外接收器再加上普通的电视、DVD等的遥控器。

还需要专门的控制软件。

第一种主要是不同设备之间的红外数据传输,后两种是对计算机的红外遥控。

Linux针对这两种使用方式有不同的驱动和软件包。

3、Linux红外支持Linux/IrDA project于1997年开始,因为与IrDA协会的名称产生冲突,项目名称更改为Linux/IR,并从1999年开始成为IrDA的官方成员之一。

相关的软件包主要有IrDA-Utils。

LIRC project(Linux Infrared Remote Control)的主要目标是通过红外红外信号进行计算机的远程控制。

LIRC包支持解码并发送最普通的IR远程控制信号。

早期版本只支持串口和并口接口的硬件,但是现在已经能够支持很多不同的硬件。

LIRC包包括了针对不同接口硬件的设备驱动,不过最重要的还是lircd 后台程序,它负责解码设备驱动接收到的IR信号并将解码后的信息通过socket 进行发送,另外还有一个lircmd 后台程序,负责连接lircd 并将解码后的IR信号转换为鼠标移动信息。

此外LIRC还包括了一些用户空间的应用程序,为我们使用IR来控制计算机提供方便。

因为这里讨论的是红外远程控制驱动,所以LIRC将是下面阐述的重点。

的有关LIRC project的详细信息可以浏览它的项目主页/ 4、LIRC结构下图是LIRC包的驱动模型(Driver Model)主要涉及了三个devfs接口,/dev/lirc、/dev/lircd、/dev/lircmd。

l /dev/lirc依赖于使用的ioctlLIRC_MODE_MODE2 输出的packet包括了描述IR信号的整型值。

这个整型值的位0-23表示pulse/space的长度;位24为0时表示space,为1时表示pulse;所有剩余的位没有意义。

LIRC_MODE_CODE outputs chars (8 bits)LIRC_MODE_LIRCCODE outputs codes of configurable length in big endian byte order可参考文件drivers/lirc_serial/lirc_serial.c、drivers/lirc_parallel/lirc_parallel.c、tools/mode2.c(mode 工具,将这个驱动的输出显示在终端上)。

l /dev/lircd输出包括了所有remote和pressed button信息的字符串。

l /dev/lircm鼠标后台。

支持三种鼠标协议:MouseSystems, IntelliMouse 和IMPS/2。

可参考文件daemons/lircmd.c 4、LIRC配置LIRC的配置主要涉及到三个配置文件,lircd.conf、lircmd.conf、.lircrc。

l lircd.conflircd.conf是lircd后台程序的配置文件。

LIRC项目主页上已经有很多针对不同牌子遥控器的配置文件,如果在上面找不到匹配自己遥控器的lircd.conf文件,则需要使用irrecord工具进行手工配置。

配置过程在另一篇文章“Linux下遥控器的配置与使用”里已经有所阐述,下面的示例是一个典型的配置文件,其中定义了1~9,上、下、左、右和开关键的矩形脉冲信息。

begin remotename testbits 16flags SPACE_ENC|CONST_LENGTHeps 30aeps 100header 9092 4460one 632 1628zero 632 496ptrail 630repeat 9118 2181pre_data_bits 16pre_data 0xFFgap 108483toggle_bit 0begin codes1 0x906F2 0xB8473 0xF8074 0x98675 0xD8276 0x88777 0xE8178 0x48B79 0x9A65up 0x609Fdown 0x22DDleft 0xE21Dright 0x02FDpower 0x28D7mute 0x08F7end codesend remotel lircmd.conflircmd后台程序的配置文件,主要配置了遥控按键与鼠标消息的对应关系。

l .lircrcLIRC的客户端应用使用的配置文件,应该位于你的用户目录下面。

也可以命名为为/etc/lircrc,此时它为所有应用所共用。

beginprog = lirckeydremote = new.confbutton = powerrepeat = 0config = powerendbegin~end表示一个独立的配置块。

prog域的值表示使用该配置块的程序名称。

Remote的值表示使用的遥控器名称(参见lircd.conf中的定义)。

Button 的值表示遥控器按键名称(参见lircd.conf中的定义)。

Repeat 的值表示按键的重复次数。

Config 的值表示该按键对应的字符串,该字符串可以被prog定义的应用程序获得。

5、编写LIRC的客户端应用有两种类型的LIRC应用,一种为发送IR命令的应用,比如xrc、irsend等,另一种为接收IR 命令的应用,比如irexec, irxevent 和irpty等。

它们都将通过位于/dev/lircd的socket连接到lircd后台,通信的数据为普通的可读格式。

无论什么时候lircd接收到一个IR信号,它将广播下面的字符串到每个客户端(client):<code> < repeat count > <button name> <remote control name>code是IR信号的64位编码。

repeat count表示用户按下按键的时间,每当接收到一个新的IR信号时,它将增加1。

button name和remote control name在lircd的配置文件里定义。

如果你仅仅希望使自己的应用接收IR命令,可以使用lirc_client库,通常是/usr/lib/liblirc_client.a。

可以使用它编写LIRC的客户端应用,要记得包含lirc/lirc_client.h文件。

lirc_client库比较重要的函数有:l int lirc_init(char *prog,int verbose)库的初始化,它连接lircd后台做一些内部的初始化。

prog与.lircrc中的prog项对应,verbose表示是否打印错误信息到stderr,0表示不打印,1表示打印。

返回值为连接到lircd的socket描述符,有错误发生时返回-1。

l int lirc_readconfig(char *file,struct lirc_config **config,int (check)(char *s))读取配置文件。

file表示配置文件名称,NULL表示使用默认的.lircrc,也可以进行多次调用加载多个配置文件。

config表示配置文件数据结构(struct config)的指针,将在函数内部填充,lirc_code2char函数将需要它。

check函数指针指向一个对file进行解析的用户自定义函数。

l int lirc_nextcode(char **code)阻塞直到socket上有数据可用。

可以在程序的主循环里使用。

如果有错误发生返回-1,否则返回0和指向数据流里下一个字符串的指针code,注意code必须使用free函数释放。

此函数使得code中获得prog 对应的配置信息,若无按键信息则阻塞进程。

l int lirc_code2char(struct lirc_config *config,char *code,char **string)获得配置文件里与按键对应的配置字符串。

config和code分别由是前面两个函数填充的,string中将被.lircrc中的config域值填充。

l void lirc_freeconfig(struct lirc_config *config)释放config结构。

l int lirc_deinit()lirc销毁函数。

下面是LIRC项目主页上的一个简单示例/* $Id: technical.html,v 1.26 2005/12/10 22:12:02 lirc Exp $ *//****************************************************************************** irexec.c ********************************************************************************************************************************************** irexec - execute programs according to the pressed remote control buttons** Copyright (C) 1998 Trent Piepho <xyzzy@>* Copyright (C) 1998 Christoph Bartelmus <lirc@bartelmus.de>*/#ifdef HAVE_CONFIG_H# include <config.h>#endif#include <errno.h>#include <unistd.h>#include <stdarg.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "lirc_client.h"char *progname;int main(int argc, char *argv[]){struct lirc_config *config;progname=argv[0];if(argc>2){fprintf(stderr,"Usage: %s <config file> ",progname);exit(EXIT_FAILURE);}if(lirc_init("irexec",1)==-1) exit(EXIT_FAILURE);if(lirc_readconfig(argc==2 ? argv[1]:NULL,&config,NULL)==0){char *code;char *c;int ret;while(lirc_nextcode(&code)==0){if(code==NULL) continue;while((ret=lirc_code2char(config,code,&c))==0 &&c!=NULL){#ifdef DEBUGprintf("Execing command \"%s\" ",c);#endifsystem(c);}free(code);if(ret==-1) break;}lirc_freeconfig(config);}lirc_deinit();exit(EXIT_SUCCESS);}6、红外信号映射为X事件如果我们希望使用遥控器远程遥控进行视频、音频等播放操作,则需要将上面解码后的红外信号映射为X事件(当然指的是针对基于X的图形应用时)。