lirc(4) устройства lirc

ОПИСАНИЕ

Символьные устройства /dev/lirc* предоставляют низкоуровневый двунаправленный интерфейс к аппаратуре с инфракрасным (IR) управлением. Для приёма данных драйвер может работать в двух различных режимах, в зависимости от имеющейся аппаратуры.

Некоторая аппаратура (обычно, ТВ-карты) декодирует IR-сигнал самостоятельно и выдаёт обработанные события о нажатых кнопках в виде целых значений. Драйверы такой аппаратуры работают в режиме LIRC_MODE_LIRCCODE. Обычно, такая аппаратура не поддерживает отправку IR-сигналов. Кроме того, обычно, она работает только со специальными пультами, поставляющимися с ней в комплекте.

Другой вид аппаратуры предоставляет потоки длительностей наличия/отсутствия импульсов. Такие драйверы работают в режиме LIRC_MODE_MODE2. Иногда такая аппаратура также поддерживает отправку данных через IR. Она может использоваться с любым (почти) видом аппаратуры.

Команда ioctl LIRC_GET_REC_MODE (смотрите далее) позволяет определить доступность режима.

Чтение входящих данных с драйверами LIRC_MODE_MODE2

В режиме LIRC_MODE_MODE2 данные, возвращаемые read(2), представляют собой 32-битные значения длительностей наличия/отсутствуя импульсов, кодируемые типом lirc_t. Время длительностей (микросекунды) кодируется в младших 24 битах. Старшими 8 битам определяется тип пакета:

LIRC_MODE2_SPACE.
Значение представляет длительность отсутствия импульса (микросекунды).
LIRC_MODE2_PULSE.
Значение представляет длительность импульса (микросекунды).
LIRC_MODE2_FREQUENCY.
Значение представляет частоту (Гц); смотрите команду ioctl LIRC_SET_MEASURE_CARRIER_MODE.
LIRC_MODE2_TIMEOUT.
Значение представляет задержку; смотрите команду ioctl LIRC_SET_REC_TIMEOUT_REPORTS.

Чтение входящих данных

драйверами LIRC_MODE_LIRCCODE

В режиме LIRC_MODE_LIRCCODE вызов read(2) возвращает декодированные данные о нажатии кнопки. Длину каждого пакета можно получить с помощью команды ioctl LIRC_GET_LENGTH. Чтение нужно выполнять блоками размером по количеству бит, полученных от LIRC_GET_LENGTH, округляя до полного байта.

Отправка данных

Отправка данных поддерживается только в режиме LIRC_MODE_PULSE. Данные, записываемые в символьное устройство с помощью write(2), представляют собой последовательность наличия/отсутствия импульсов в виде целых чисел. Импульсы и их отсутствие неявно разделяются только по их положению. Данные должны начинаться и заканчиваться импульсом, то есть всегда должно быть нечётное количество выборок. Функция write(2) блокирует выполнение до тех пор, пока данные не будут переданы аппаратурой. Если данных больше, чем аппаратура может послать, то write(2) завершается с ошибкой EINVAL.

ПОДДЕРЖКА КОМАНД IOCTL

#include <lirc/include/media/lirc.h>    /* смотрите ДЕФЕКТЫ */
int ioctl(int fd, int cmd, ...);

Следующие команды ioctl можно использовать для тестирования или изменения определённых аппаратных настроек через lirc. Для многих команд требуется третий аргумент, обычно с типом int, который обозначается далее как val.

Обычно, каждый драйвер имеет набор настроек по умолчанию. Реализацией драйвера выполняется повторное применение настроек после закрытия устройства из пользовательского пространства, поэтому каждое приложение, открывающее устройство, сразу может рассчитывать на работу с настройками по умолчанию.

Всегда поддерживаемые команды

Устройства /dev/lirc* всегда поддерживают следующие команды:

LIRC_GET_FEATURES (void)
Возвращает битовую маску возможностей; смотрите ВОЗМОЖНОСТИ. Некоторые драйверы поддерживают динамические возможности, которые не обновляются после вызова команды init().
LIRC_GET_REC_MODE
Возвращает режим приёма, который может быть одним из:
LIRC_MODE_MODE2 (void)
Драйвер возвращает последовательность длительностей наличия/ отсутствуя импульсов.
LIRC_MODE_LIRCCODE
Драйвер возвращает целые значения, каждое из которых представляет декодированное нажатие кнопки.

Если устройство возвращает код ошибки после LIRC_GET_REC_MODE, то можно считать, что это устройство не является lirc.

Необязательные команды

Некоторые устройства lirc поддерживают команды, перечисленные ниже. Если не утверждается обратное, они завершаются с ошибкой ENOIOCTLCMD или ENOSYS, если операция не поддерживается, или с ошибкой EINVAL, если операция завершилась с ошибкой.

LIRC_SET_REC_MODE (int)
Задаёт режим приёма. Значением val может быть LIRC_MODE_LIRCCODE или LIRC_MODE_MODE2.

LIRC_GET_LENGTH (void)
Возвращает длину кодов возврата для драйверов типа LIRC_MODE_LIRCCODE, в противном случае возвращает ошибку ENOIOCTLCMD.
LIRC_GET_SEND_MODE (void)
Возвращает режим передачи. Поддерживается только LIRC_MODE_PULSE.
LIRC_SET_SEND_MODE (int)
Задаёт режим передачи. Ничего не делает, так как пока поддерживается только LIRC_MODE_PULSE.
LIRC_SET_SEND_CARRIER (int)
Задаёт частоту модуляции. Значением аргумента является частота (в Гц).
SET_SEND_DUTY_CYCLE (int)
Задаёт скважность опорного сигнала (carrier duty cycle). Значение val — число в диапазоне [0,100], описывающей ширину импульса в виде процента от всего сигнала. Значения 0 и 100 не несут какого-то особенного смысла, но зарезервированы для использования в будущем.
LIRC_GET_MIN_TIMEOUT (void), LIRC_GET_MAX_TIMEOUT (void)
В некоторых устройствах есть встроенные таймеры, которые можно использовать для обнаружения длительного отсутствия активности IR. Это может помочь lircd(8) обнаружить окончание сигнала IR и что можно запускать процесс декодирования. Такие операции возвращают целочисленные значения минимального/максимального периода ожидания, которое можно задать (в микросекундах). У некоторых устройств период ожидания нельзя изменить. В таких драйверах LIRC_GET_MIN_TIMEOUT и LIRC_GET_MAX_TIMEOUT возвращают одинаковое значение.
LIRC_SET_REC_TIMEOUT (int)
Задаёт период неактивности IR в виде целого значения (микросекунды). Корректные значения должны находиться в пределах, полученных от LIRC_GET_MIN_TIMEOUT и LIRC_GET_MAX_TIMEOUT. Значение 0 (если поддерживается оборудованием) отключает все аппаратные ожидания и о данных сообщается сразу после появления. Если точное значение установить невозможно, то нужно указать следующее большее возможное значение.
LIRC_SET_REC_TIMEOUT_REPORTS (int)
Включает (val равно 1) или выключает пакеты об (val равно 0) ожидании в LIRC_MODE_MODE2. По умолчанию, сообщения об ожидании должны быть выключены.
LIRC_SET_REC_CARRIER (int)
Задаёт базовую частоту приёмника (Гц).
LIRC_SET_REC_CARRIER_RANGE (int)
После открытия устройства, первый запуск этой операции задаёт нижнюю базовую границу, а второй запуск задаёт верхнюю границу (Гц).
LIRC_SET_MEASURE_CARRIER_MODE (int)
Включает (val равно 1) или выключает (val равно 0) режим измерения. Если режим включён, то после следующего нажатия клавиши драйвер пошлёт пакеты LIRC_MODE2_FREQUENCY. По умолчанию должен быть выключен.
LIRC_GET_REC_RESOLUTION (void)
Возвращает точность разрешения драйвера (в микросекундах).
LIRC_GET_MIN_FILTER_PULSE (void), LIRC_GET_MAX_FILTER_PULSE (void)
Некоторые устройства могут фильтровать пики во входящих сигналах согласно заданным правилам фильтрации. Данные команды ioctl возвращают аппаратные свойства, которые описывают границы возможных фильтров. Настройки фильтров зависят от ожидаемых протоколов IR. Служба lircd(8) получает параметры всех определений протоколов из своего файла настройки lircd.conf(5).
LIRC_GET_MIN_FILTER_SPACE (void), LIRC_GET_MAX_FILTER_SPACE (void)
Смотрите LIRC_GET_MIN_FILTER_PULSE.
LIRC_SET_REC_FILTER (int)
Длительность наличия/отсутствия импульса короче чем это значение (в микросекундах) фильтруется аппаратурой.
LIRC_SET_REC_FILTER_PULSE (int), LIRC_SET_REC_FILTER_SPACE (int)
Длительность наличия/отсутствия короче чем это значение (в микросекундах) фильтруется аппаратурой. Если фильтры невозможно задать раздельно длительности наличия/отсутствия импульсов, то соответствующие ioctl должны возвращать ошибку и нужно задействовать LIRC_SET_REC_FILTER.
LIRC_SET_TRANSMITTER_MASK
Включает набор передатчиков, указанных в val в виде битовой маски, где каждый включаемый передатчик обозначен 1. Первый передатчик кодируется в самом младшем бите и т. д. Если указана некорректная битовая маска, например, указан бит, но в устройстве нет столько передатчиков, то данная операция возвращает количество доступных передатчиков и ничего не делает.
LIRC_SET_WIDEBAND_RECEIVER (int)
У некоторых устройств есть специальный широкополосный приёмник, который предназначен для обучения выводу существующего пульта. Данную ioctl можно использовать для включения (val равно 1) или отключения (val равно 0) этого свойства. Это может быть полезно для устройств с узкополосными приёмниками, которые не могут работать с некоторыми пультами. Широкополосные приёмники могут иметь большую точность. С другой стороны их недостаток в меньшей дальности приёма.
Замечание: широкополосные приёмники могут неявно включаться, если вы включаете сообщения о несущей. В этом случае, он отключится сразу после отключения сообщений о несущей. Попытка отключить широкополосный приёмник при включённых сообщениях о несущей ни к чему не приводит.
LIRC_SETUP_START (void), LIRC_SETUP_END (void)
Задание параметров некоторых драйверов может быть оптимизировано группированием с помощью вызовов ioctl LIRC_SETUP_START и LIRC_SETUP_END. Когда драйвер получает вызов LIRC_SETUP_START, он может отложить отправку последующих изменений настроек в аппаратуру до получения LIRC_SETUP_END. Это может быть реализовано в драйвере, но каждый драйвер также должен обрабатывать изменения параметров, которые не обрамлены LIRC_SETUP_START и LIRC_SETUP_END. Также драйверы могут игнорировать эти ioctl.
LIRC_NOTIFY_DECODE (void)
Данная команда ioctl вызывается из lircd(8), если возможно успешное декодирование входящего сигнала IR. Это может использоваться поддерживаемой аппаратурой для визуального уведомления пользователя, например миганием светодиода.

ВОЗМОЖНОСТИ

Возможности драйвера возвращаются LIRC_GET_FEATURES в виде битовой маски. В маске может быть закодировано следующее:

LIRC_CAN_REC_RAW
Драйвер способен вести приём в LIRC_MODE_RAW.
LIRC_CAN_REC_PULSE
Драйвер способен вести приём в LIRC_MODE_PULSE.
LIRC_CAN_REC_MODE2
Драйвер способен вести приём в LIRC_MODE_MODE2.
LIRC_CAN_REC_LIRCCODE
Драйвер способен вести приём в LIRC_MODE_LIRCCODE.
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_DUTY_CYCLE_RANGE
Драйвер поддерживает LIRC_SET_REC_DUTY_CYCLE_RANGE.
LIRC_CAN_SET_REC_CARRIER_RANGE
Драйвер поддерживает LIRC_SET_REC_CARRIER_RANGE.
LIRC_CAN_GET_REC_RESOLUTION
Драйвер поддерживает LIRC_GET_REC_RESOLUTION.
LIRC_CAN_SET_REC_TIMEOUT
Драйвер поддерживает LIRC_SET_REC_TIMEOUT.
LIRC_CAN_SET_REC_FILTER
Драйвер поддерживает LIRC_SET_REC_FILTER.
LIRC_CAN_MEASURE_CARRIER
Драйвер поддерживает измерение частоты модуляции с помощью LIRC_SET_MEASURE_CARRIER_MODE.
LIRC_CAN_USE_WIDEBAND_RECEIVER
Драйвер поддерживает режим обучения с помощью LIRC_SET_WIDEBAND_RECEIVER.
LIRC_CAN_NOTIFY_DECODE
Драйвер поддерживает LIRC_NOTIFY_DECODE.
LIRC_CAN_SEND_RAW
Драйвер поддерживает отправку с помощью LIRC_MODE_RAW.
LIRC_CAN_SEND_PULSE
Драйвер поддерживает отправку с помощью LIRC_MODE_PULSE.
LIRC_CAN_SEND_MODE2
Драйвер поддерживает отправку с помощью LIRC_MODE_MODE2.
LIRC_CAN_SEND_LIRCCODE
Драйвер поддерживает отправку (редко, так как драйверы LIRCCODE пишутся для аппаратуры типа ТВ-карт, которые, обычно не поддерживают отправку).

ДЕФЕКТЫ

Для работы с этими устройствами, требуется заголовочный файл ядра lirc.h. Этот файл не экспортируется (пока) из заголовков ядра. В настоящее время файл распространяется в пакете lirc; смотрите