К одной из моих DVB-карт прилагался штатный ИК-приемник на верёвочке и пульт. И я, наконец, решил присобачить его к компьютеру.
У всех нормальных людей при настройке lirc проблемы возникают с определением протокола, кодов кнопок и прочей низкоуровневой фигни. У меня они, как обычно, возникли в совершенно другом месте.
Дальше технические подробности, интересные только IT-специалистам.
Конфигурация для пульта от моей карты нашлась сразу в готовом виде. Потом оказалось, что на родном сайте lirc этих конфигураций тоже дофига, и они там регулярно обновляются, только ссылок на это место на основном сайте lirc нифига нет. Хуже того, на этом сайте сильно устаревшая документация, в которой нет многих на самом деле поддерживаемых карт, а для карты, наиболее похожей на мою, там рекомендуется использовать ядрёный модуль lirc_gpio и драйвер default, которые я и пробовал настроить, пока не обнаружил, что на самом деле модуль вообще не нужен, поскольку приемник прекрасно доступен через /dev/input/event*, а lirc’овый драйвер для него называется devinput.
Данные из этого event* приходили (я проверил с помощью cat |hexdump), но совершенно не соответствующие ожиданиям lirc, и он их благополучно игнорировал. Когда я уже почти отчаялся и решил записать коды вручную, irrecord радостно сообщил мне, что для devinput мне, с большой вероятностью, ничего записывать не надо, а надо взять типовую конфигурацию.
Взял. И – о чудо! – lirc стал выдавать клиенту (irw) нажатия кнопок. Но для тех, для которых выдавал, получалась какая-то фигня, совершенно не соответствующая самим кнопкам. А для некоторых не выдавал вообще.
При внимательном разглядывании оказалось, что эти кнопки не понимает не только lirc, а и сам драйвер:
Jan 16 01:04:52 kernel: [95828.656628] Budget-CI dvb ir receiver saa7146 (1): unknown key: key=0x0e raw=0x350e down=1
Jan 16 01:04:52 kernel: [95828.908006] Budget-CI dvb ir receiver saa7146 (1): unknown key: key=0x0e raw=0x350e down=0
Вот тут и пригодились открытые исходники. Оказалось, что в зависимости от pci->subsystem_device драйвер DVB-карты может использовать три раскладки преобразования получаемых от ИК-приемника данных в коды кнопок. Добавил отладочную печать, пересобрал модуль, загрузил, обнаружил, что subsystem_device от моей карты оказался неопознанным, и для него выбралась раскладка по умолчанию. Неправильная.
Добавил еще одну строчку с номером subsystem_device от моей карты, пересобрал модуль – и lirc стал выдавать правильные коды для всех кнопок.
А вот в системе с закрытыми исходниками, как, например, в предлагавшемся Windows медиацентре, фиг бы я чего нашёл и, тем более, исправил. Хотя, конечно, есть шанс, что там бы такой проблемы вообще не возникло. Если бы нашелся общесистемный драйвер для того же пульта. А то у производителей таких мультимедийных девайсов очень модно, чтобы с пультом умела работать только их родная программа..
Оригинал этой записи. Комментировать можно тут или там.