lirc -
устройства
lirc
Символьные
устройства
/dev/lirc*
предоставляют
низкоуровневый
двунаправленный
интерфейс
к
аппаратуре
с
инфракрасным
(IR)
управлением.
Большинство
этих
устройств
может
принимать
данные, а не
которые и
отправлять.
При приёме
или
отправке
данных
драйвер
работает в
двух
различных
режимах, в
зависимости
от
имеющейся
аппаратуры.
Некоторая
аппаратура
(обычно,
ТВ-карты)
декодирует
IR-сигнал
самостоятельно
и выдаёт
обработанные
события о
нажатых
кнопках в
виде
значений
сканкодов.
Драйверы
такой
аппаратуры
работают в
режиме
LIRC_MODE_SCANCODE.
Обычно,
такая
аппаратура
не
поддерживает
отправку
IR-сигналов.
Кроме того,
она может
декодировать
ограниченный
набор
IR-протоколов,
обычно,
только
определённых
пультов,
поставляющихся
с ней в
комплекте.
Другой вид
аппаратуры
выдаёт
потоки
длительностей
наличия/отсутствия
импульсов.
Такие
драйверы
работают в
режиме
LIRC_MODE_MODE2.
Она может
использоваться
с любым
(почти)
видом
аппаратуры.
Этот тип
аппаратуры
также
можно
использовать
в режиме
LIRC_MODE_SCANCODE, в этом
случае
сигнал
декодируют
декодеры
ядра. Эти
декодеры
можно
писать в
расширенных
BPF (смотрите
bpf(2)) и
присоединять
к
устройству
lirc. Иногда
такая
аппаратура
также
поддерживает
отправку
данных
через IR.
Команда ioctl
LIRC_GET_FEATURES
(смотрите
далее)
позволяет
определить
доступность
приёма и
отправки,
режимы, а
также
другие
возможности.
In the
LIRC_MODE_MODE2 mode, the data returned by
read(2) provides
32-bit values representing a space or a pulse duration. The time of the
duration (microseconds) is encoded in the lower 24 bits. Pulse (also known as
flash) indicates a duration of infrared light being detected, and space (also
known as gap) indicates a duration with no infrared. If the duration of space
exceeds the inactivity timeout, a special timeout package is delivered, which
marks the end of a message. The upper 8 bits indicate the type of package:
- 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_MODE2_OVERFLOW
- The IR receiver encountered an overflow, and as a result
data is missing (since Linux 5.18).
В режиме
LIRC_MODE_SCANCODE данные,
возвращаемые
read(2) в
структуре
lirc_scancode,
содержат
декодированные
нажатия
кнопок.
Сканкод
сохраняется
в поле
scancode, а
протокол IR —
в
rc_proto. В этом
поле
хранится
одно из
значений
enum
rc_proto.
Данные,
записываемые
в
символьное
устройство
с помощью
write(2),
представляют
собой
последовательность
наличия/отсутствия
импульсов
в виде
целых
чисел.
Импульсы и
их
отсутствие
неявно
разделяются
только по
их
положению.
Данные
должны
начинаться
и
заканчиваться
импульсом,
то есть
всегда
должно
быть
нечётное
количество
выборок.
Функция
write(2)
блокирует
выполнение
до тех пор,
пока
данные не
будут
переданы
аппаратурой.
Если
данных
больше, чем
аппаратура
может
послать, то
write(2)
завершается
с ошибкой
EINVAL.
Данные,
записываемые
в
символьные
устройства,
должны
храниться
в
структуре
lirc_scancode. Должны
быть
заполнены
поля
scancode и
rc_proto,
остальные
должны
быть равны 0.
IR-кодировщики
ядра
преобразуют
сканкод в
импульсы и
паузы. При
некорректном
протоколе,
сканкоде
или
устройстве
lirc передача
невозможна.
#include <linux/lirc.h> /* но смотрите ДЕФЕКТЫ */
int ioctl(int fd, int cmd, int *val);
The following
ioctl(2) operations are provided by the
lirc
character device to probe or change specific
lirc hardware settings.
Устройства
/dev/lirc* всегда
поддерживают
следующие
команды:
-
LIRC_GET_FEATURES (void)
- Возвращает
битовую
маску
возможностей;
смотрите
ВОЗМОЖНОСТИ.
Если
устройство
возвращает
код ошибки
после
LIRC_GET_FEATURES,
то можно
считать,
что это
устройство
не
является
lirc.
Некоторые
устройства
lirc
поддерживают
команды,
перечисленные
ниже. Если
не
утверждается
обратное,
они
завершаются
с ошибкой
ENOTTY, если
операция
не
поддерживается,
или с
ошибкой
EINVAL,
если
операция
завершилась
с ошибкой
или
указаны
некорректные
параметры.
Если
драйвер не
анонсирует
поддержку
определённых
возможностей,
то вызов
соответствующих
ioctl
завершается
с ошибкой
ENOTTY.
-
LIRC_GET_REC_MODE (void)
- Если в
устройстве
lirc нет
приёмника,
то эта
операция
завершается
ошибкой ENOTTY.
В
противном
случае
возвращается
режим
приёма,
который
может быть
одним из:
- 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)
- Задаёт
частоту
модуляции.
Значением
аргумента
является
частота (в
Гц).
-
LIRC_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
возвращают
ошибку 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)
- Включает
( val равно 1)
или
выключает
пакеты об (
val равно 0)
ожидании в
LIRC_MODE_MODE2. Работа
этой
операции в
разных
версиях
ядра
отличается:
- •
- Since Linux 5.17: timeout packages are always enabled and
this ioctl is a no-op.
- •
- Since Linux 4.16: timeout packages are enabled by default.
Each time the lirc device is opened, the
LIRC_SET_REC_TIMEOUT operation can be used to disable (and, if
desired, to later re-enable) the timeout on the file descriptor.
- •
- In Linux 4.15 and earlier: timeout packages are disabled by
default, and enabling them (via LIRC_SET_REC_TIMEOUT) on any file
descriptor associated with the lirc device has the effect of
enabling timeouts for all file descriptors referring to that device (until
timeouts are disabled again).
-
LIRC_SET_REC_CARRIER (int)
- Задаёт
верхнюю
границу
несущей
частоты
приёмника
(Гц).
Смотрите
LIRC_SET_REC_CARRIER_RANGE.
-
LIRC_SET_REC_CARRIER_RANGE (int)
- Задаёт
нижнюю
границу
несущей
частоты
приёмника
(Гц). Для
выполнения
этой
операции
сначала
нужно
задать
нижнюю
границу с
помощью ioctl
LIRC_SET_REC_CARRIER_RANGE, а
затем
верхнюю
границу с
помощью ioctl
LIRC_SET_REC_CARRIER.
-
LIRC_SET_MEASURE_CARRIER_MODE (int)
- Включает
( val равно 1)
или
выключает (
val равно 0)
режим
измерения.
Если режим
включён, то
после
следующего
нажатия
клавиши
драйвер
пошлёт
пакеты
LIRC_MODE2_FREQUENCY. По
умолчанию
должен
быть
выключен.
-
LIRC_GET_REC_RESOLUTION (void)
- Возвращает
точность
разрешения
драйвера (в
микросекундах).
-
LIRC_SET_TRANSMITTER_MASK (int)
- Включает
набор
передатчиков,
указанных
в val в виде
битовой
маски, где
каждый
включаемый
передатчик
обозначен
1. Первый
передатчик
кодируется
в самом
младшем
бите и т. д.
Если
указана
некорректная
битовая
маска,
например,
указан бит,
но в
устройстве
нет
столько
передатчиков,
то данная
операция
возвращает
количество
доступных
передатчиков
и ничего не
делает.
-
LIRC_SET_WIDEBAND_RECEIVER (int)
- У
некоторых
устройств
есть
специальный
широкополосный
приёмник,
который
предназначен
для
обучения
выводу
существующего
пульта.
Данную ioctl
можно
использовать
для
включения (
val равно 1)
или
отключения
( val равно 0)
этого
свойства.
Это может
быть
полезно
для
устройств
с
узкополосными
приёмниками,
которые не
могут
работать с
некоторыми
пультами.
Широкополосные
приёмники
могут
иметь
большую
точность. С
другой
стороны, их
недостаток
в меньшей
дальности
приёма.
- Замечание:
широкополосные
приёмники
могут
неявно
включаться,
если вы
включаете
сообщения
о несущей.
В этом
случае, он
отключится
сразу
после
отключения
сообщений
о несущей.
Попытка
отключить
широкополосный
приёмник
при
включённых
сообщениях
о несущей
ни к чему
не
приводит.
ioctl
LIRC_GET_FEATURES
возвращает
битовую
маску,
описывающую
свойства
драйвера. В
маске
могут быть
установлены
следующие
биты:
- 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
- The driver supports setting the receive carrier frequency
using LIRC_SET_REC_CARRIER. Any lirc device since the
drivers were merged in Linux 2.6.36 must have
LIRC_CAN_SET_REC_CARRIER_RANGE set if
LIRC_CAN_SET_REC_CARRIER feature is set.
- LIRC_CAN_SET_REC_CARRIER_RANGE
- Драйвер
поддерживает
LIRC_SET_REC_CARRIER_RANGE.
Перед
использованием
ioctl LIRC_SET_REC_CARRIER для
указания
верхней
границы,нужно
вызвать ioctl
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_MEASURE_CARRIER
- Драйвер
поддерживает
измерение
частоты
модуляции
с помощью
LIRC_SET_MEASURE_CARRIER_MODE.
- LIRC_CAN_USE_WIDEBAND_RECEIVER
- Драйвер
поддерживает
режим
обучения с
помощью
LIRC_SET_WIDEBAND_RECEIVER.
- LIRC_CAN_SEND_PULSE
- Драйвер
поддерживает
отправку в
режиме LIRC_MODE_SCANCODE
или LIRC_MODE_SCANCODE.
Using these devices requires the kernel source header file
lirc.h. This
file is not available before Linux 4.6. Users of older kernels could use the
file bundled in
http://www.lirc.org
ir-ctl(1),
lircd(8),
bpf(2)
https://www.kernel.org/doc/html/latest/userspace-api/media/rc/lirc-dev.html
Русский
перевод
этой
страницы
руководства
был сделан
Artyom Kunyov <
[email protected]>, Azamat Hackimov
<
[email protected]>, Dmitry Bolkhovskikh
<
[email protected]>, Katrin Kutepova <
[email protected]>,
Konstantin Shvaykovskiy <
[email protected]>, Yuri Kozlov
<
[email protected]> и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]