LIRC - Linux手册页

时间:2019-08-20 18:01:46  来源:igfitidea点击:

Linux程序员手册 第4部分
更新日期: 2019-03-06

名称

lirc-lirc设备

说明

/ dev / lirc *字符设备提供了到红外(IR)远程设备的低级双向接口。这些设备大多数都可以接收,有些可以发送。接收或发送数据时,驱动程序根据基础硬件以两种不同的模式工作。

一些硬件(通常是电视卡)在内部对IR信号进行解码,并提供解码后的按钮按下信号作为扫描代码值。这种硬件的驱动程序在LIRC_MODE_SCANCODE模式下工作。这种硬件通常不支持发送IR信号。此外,这种硬件只能解码有限的一组IR协议,通常仅解码与例如电视卡捆绑在一起的特定遥控器的协议。

其他硬件提供了脉冲/空间持续时间流。这样的驱动程序在LIRC_MODE_MODE2模式下工作。有时,这种硬件还支持发送IR数据。这样的硬件可以与(几乎)任何种类的遥控器一起使用。这种类型的硬件也可以在LIRC_MODE_SCANCODE模式下使用,在这种情况下,内核IR解码器将对IR进行解码。这些解码器可以用扩展的bpf(请参阅bpf(2))编写,并附加到lirc设备。

LIRC_GET_FEATURES ioctl(请参阅下文)允许探查是否支持接收和发送,以及在哪些模式下以及其他功能。

Reading input with the LIRC_MODE_MODE2 mode

在LIRC_MODE_MODE2模式下,read(2)返回的数据提供表示空间或脉冲持续时间的32位值。持续时间(微秒)以低24位编码。高8位指示包的类型:

LIRC_MODE2_SPACE
值反映空间持续时间(微秒)。
LIRC_MODE2_PULSE
值反映脉冲持续时间(微秒)。
LIRC_MODE2_FREQUENCY
值反映频率(Hz);请参阅LIRC_SET_MEASURE_CARRIER_MODE ioctl。
LIRC_MODE2_TIMEOUT
值反映空间持续时间(微秒)。该软件包反映了超时;请参阅LIRC_SET_REC_TIMEOUT_REPORTS ioctl。

Reading input with the LIRC_MODE_SCANCODE mode

在LIRC_MODE_SCANCODE模式下,read(2)返回的数据反映了结构lirc_scancode中解码后的按钮按下。扫描码存储在scancode字段中,IR协议存储在rc_proto中。该字段具有枚举rc_proto的值。

Writing output with the LIRC_MODE_PULSE mode

使用write(2)写入字符设备的数据是整数的脉冲/空间序列。脉冲和空格仅通过其位置隐式标记。数据必须以脉冲开始和结束,因此它必须始终包含奇数个采样。 write(2)函数将阻塞,直到硬件已发送数据为止。如果提供的数据多于硬件发送的数据,则write(2)调用将失败,并显示错误EINVAL。

Writing output with the LIRC_MODE_SCANCODE mode

写入字符设备的数据必须是单个结构lirc_scancode。必须填写scancode和rc_proto字段,所有其他字段必须为0。内核IR编码器会将扫描代码转换为脉冲和空格。协议或扫描码无效,或lirc设备无法传输。

IOCTL COMMANDS

LIRC设备的ioctl定义受struct file_operations的ioctl函数定义的约束,这给我们留下了一个用于ioctl命令的无符号int和用于该参数的unsigned long。为了在32位和64位体系结构之间实现ioctl的可移植性,这些值限制为它们的32位大小。

#include <linux/lirc.h>    /* But see BUGS */
int ioctl(int fd, int cmd, ...);

以下ioctl可用于探测或更改特定的lirc硬件设置。许多需要第三个参数,通常是一个int。以下称为val。

Always Supported Commands

/ dev / lirc *设备始终支持以下命令:

LIRC_GET_FEATURES(void)
返回组合特征位的位掩码;请参阅功能。

如果设备返回LIRC_GET_FEATURES的错误代码,则可以安全地假定它不是lirc设备。

Optional Commands

一些lirc设备支持下面列出的命令。除非另有说明,否则,如果不支持该操作,则失败,并显示错误ENOTTY;如果操作失败,则失败,并显示错误EINVAL,或者提供了无效的参数。如果驱动程序不宣布支持某些功能,则调用相应的ioctl将失败,并显示错误ENOTTY。

LIRC_GET_REC_MODE(void)
If the lirc

device has no receiver, this operation fails with the error
ENOTTY.

Otherwise, it returns the receive mode, which will be one of:

LIRC_MODE_MODE2
驱动程序返回一系列脉冲/间隔时间。
LIRC_MODE_SCANCODE
驱动程序返回struct lirc_scancode值,每个值代表解码后的按钮按下。
LIRC_SET_REC_MODE(int)
设置接收模式。 val是LIRC_MODE_SCANCODE或LIRC_MODE_MODE2。如果lirc设备没有接收器,则此操作将失败,并显示错误ENOTTY。
LIRC_GET_SEND_MODE(void)
返回发送模式。支持LIRC_MODE_PULSE或LIRC_MODE_SCANCODE。如果lirc设备无法发送,该操作将失败,并显示错误ENOTTY。
LIRC_SET_SEND_MODE(int)
设置发送模式。 val是LIRC_MODE_SCANCODE或LIRC_MODE_PULSE。如果lirc设备无法发送,该操作将失败,并显示错误ENOTTY。
LIRC_SET_SEND_CARRIER(int)
设置调制频率。参数是频率(Hz)。
LIRC_SET_SEND_DUTY_CYCLE(int)
设置载波占空比。 val是[0,100]范围内的数字,它描述脉冲宽度占总周期的百分比。当前,没有为0或100定义特殊含义,但保留了这些值以备将来使用。
LIRC_GET_MIN_TIMEOUT(void),LIRC_GET_MAX_TIMEOUT(void)
某些设备具有内部计时器,可用于检测长时间没有红外活动的时间。这可以帮助lircd(8)检测到IR信号已完成,并可以加快解码过程。这些操作返回的整数值具有可以设置的最小/最大超时(微秒)。某些设备具有固定的超时时间。对于此类驱动程序,LIRC_GET_MIN_TIMEOUT和LIRC_GET_MAX_TIMEOUT将失败,并显示错误ENOTTY。
LIRC_SET_REC_TIMEOUT(int)
设置IR不活动超时的整数值(微秒)。该值必须在LIRC_GET_MIN_TIMEOUT和LIRC_GET_MAX_TIMEOUT定义的范围内才能被接受。值为0(如果硬件支持)将禁用所有硬件超时,应尽快报告数据。如果无法设置精确值,则应设置下一个大于给定值的可能值。
LIRC_GET_REC_TIMEOUT(void)
返回当前的不活动超时(微秒)。自Linux 4.18起可用。
LIRC_SET_REC_TIMEOUT_REPORTS(int)
Enable (val

is 1) or disable
(val

is 0) timeout packages in
LIRC_MODE_MODE2.

The behavior of this operation has varied across kernel versions:

*
从Linux 4.16开始:每次打开lirc设备时,默认情况下都会为生成的文件描述符启用超时报告。 LIRC_SET_REC_TIMEOUT操作可用于禁用(如果需要,以后再启用)文件描述符上的超时。
*
在Linux 4.15和更早版本中:默认情况下,超时报告是禁用的,并且在与lirc设备关联的任何文件描述符上启用它们(通过LIRC_SET_REC_TIMEOUT)具有启用引用该设备的所有文件描述符超时的作用(直到再次禁用超时)。 。
LIRC_SET_REC_CARRIER(int)
设置接收载波频率的上限(Hz)。请参阅LIRC_SET_REC_CARRIER_RANGE。
LIRC_SET_REC_CARRIER_RANGE(int)
设置接收载波频率的下限(Hz)。为此,请首先使用LIRC_SET_REC_CARRIER_RANGE ioctl设置下限,然后使用LIRC_SET_REC_CARRIER ioctl设置上限。
LIRC_SET_MEASURE_CARRIER_MODE(int)
启用(模式为1)或禁用(模式为0)测量模式。如果启用,从下一个按键开始,驱动程序将发送LIRC_MODE2_FREQUENCY数据包。默认情况下,应将其关闭。
LIRC_GET_REC_RESOLUTION(void)
返回驱动程序分辨率(微秒)。
LIRC_SET_TRANSMITTER_MASK(int)
启用val中指定的一组发送器,其中包含一个位掩码,其中每个启用的发送器均为1。第一个发送器由最低有效位编码,依此类推。当给出无效的位掩码时,例如,即使设备没有那么多的发送器,也会设置一个位,该操作将返回可用发送器的数量,否则不执行任何操作。
LIRC_SET_WIDEBAND_RECEIVER(int)
一些设备配备了特殊的宽带接收器,旨在用于了解现有遥控器的输出。该ioctl可用于启用(值等于1)或禁用(值等于0)此功能。这对于否则具有窄带接收器的设备可能会很有用,这些接收器会阻止它们与某些遥控器一起使用。宽带接收器也可能更精确。另一方面,它们的缺点通常是减小了接收范围。
注意:如果启用载波报告,则可能隐式启用宽带接收器。在这种情况下,一旦您禁用运营商报告,它就会被禁用。在载波报告处于活动状态时尝试禁用宽带接收器将无济于事。

FEATURES

LIRC_GET_FEATURES ioctl返回描述驱动程序功能的位掩码。掩码中可能返回以下位:

LIRC_CAN_REC_MODE2
驱动程序能够使用LIRC_MODE_MODE2进行接收。
LIRC_CAN_REC_SCANCODE
驱动程序能够使用LIRC_MODE_SCANCODE进行接收。
LIRC_CAN_SET_SEND_CARRIER
驱动程序支持使用LIRC_SET_SEND_CARRIER更改调制频率。
LIRC_CAN_SET_SEND_DUTY_CYCLE
驱动程序支持使用LIRC_SET_SEND_DUTY_CYCLE更改占空比。
LIRC_CAN_SET_TRANSMITTER_MASK
驱动程序支持使用LIRC_SET_TRANSMITTER_MASK更改活动的发送器。
LIRC_CAN_SET_REC_CARRIER
驱动程序支持使用LIRC_SET_REC_CARRIER设置接收载波频率。如果设置了LIRC_CAN_SET_REC_CARRIER功能,则自从驱动程序在内核2.6.36版中合并以来,所有lirc设备都必须设置LIRC_CAN_SET_REC_CARRIER_RANGE。
LIRC_CAN_SET_REC_CARRIER_RANGE
该驱动程序支持LIRC_SET_REC_CARRIER_RANGE。必须先使用LIRC_SET_REC_CARRIER_RANGE ioctl设置载波的下限,然后再使用LIRC_SET_REC_CARRIER ioctl设置上限。
LIRC_CAN_GET_REC_RESOLUTION
该驱动程序支持LIRC_GET_REC_RESOLUTION。
LIRC_CAN_SET_REC_TIMEOUT
该驱动程序支持LIRC_SET_REC_TIMEOUT。
LIRC_CAN_MEASURE_CARRIER
驱动程序支持使用LIRC_SET_MEASURE_CARRIER_MODE测量调制频率。
LIRC_CAN_USE_WIDEBAND_RECEIVER
驱动程序支持使用LIRC_SET_WIDEBAND_RECEIVER的学习模式。
LIRC_CAN_SEND_PULSE
驱动程序支持使用LIRC_MODE_PULSE或LIRC_MODE_SCANCODE发送

BUGS

使用这些设备需要内核源头文件lirc.h。在内核4.6版之前,此文件不可用。使用旧内核的用户可以使用捆绑在其中的文件

另外参见

ir-ctl(1),lircd(8),bpf(2)

https://www.kernel.org/doc/html/latest/media/uapi/rc/lirc-dev.html

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/