LINUX.ORG.RU

Драйвер для ir

 


0

1

Собственно, приехала ко мне cubieboard. Всё классно, только вот с LIRC/пультом она работать не хочет. Точнее с моим пультом. Там внутрях драйвера sun4i-ir написано собственное декодирование протокола пультов NEC. И всё.

Почитав исходники и разные мануалы понял, что половину LIRC уже давно перетащили в ядро. В частности декодировщики протоколов передачи пультов.

Есть так же в ядре и драйвер, который работает с GPIO и всеми этими классными декодировщиками. Называется gpio-ir-recv.

Внимание вопрос: Переписать существующий драйвер для ir так, чтобы он использовал декодировщики сигнала из ядра, или написать новый драйвер, который заставит контроллер IR прикидываться GPIO, и натравить на этот GPIO gpio-ir-recv?

Да, в hardware шарю не очень, так что сильно не пинать. Зарание спасибо.

cast AiFiLTr0


зачем тебе вообще GPIO драйвер, когда там аппаратный декодировщик есть и готовый драйвер для него?
Собираешь их IR драйвер, ловишь кейпрессы в /dev/input/eventX. Все. gpio драйвер тебе нахрен не нужен. Если ты конечно не gpio-ir-recv это вообще драйвер для махохистов, дающий по ~30 прерываний на один сканкод. Оно тебе надо?

AiFiLTr0 ★★★★★
()
Последнее исправление: AiFiLTr0 (всего исправлений: 1)
Ответ на: комментарий от AiFiLTr0

Вот это и хотел выяснить. Тот драйвер который есть - прикидывается устройством ввода вместо ик приёмника и понимает только пульты, эмулирующие клавиатуру, как я понял. Ну или просто работающие по протоколу NEC. У меня пульт от Philips. И там RC5. На него никакой реакции...

Надо поменять класс устройства и заюзать ir_core, чтобы можно было декодить и другие протоколы.

com
() автор топика
Ответ на: комментарий от com

понимает только пульты, эмулирующие клавиатуру, как я понял.

это как так?

Ну или просто работающие по протоколу NEC

Это ближе к правде.

Надо поменять класс устройства и заюзать ir_core, чтобы можно было декодить и другие протоколы.

нет. у тебя аппаратный декодер NEC. Хочешь принимать RC5 - бери ЛЮБОЕ свободное GPIO, цепляй на него 20-центовый приемник/демод на частоту твоего пульта, и запускай gpio-ir драйвер. Разумеется, GPIO должно уметь дергать прерывание, то есть gpio_to_irq() на него должно возвращать что-то отличное от нуля.

AiFiLTr0 ★★★★★
()
Ответ на: комментарий от AiFiLTr0

Э, нет. Включил отладочную инфу в существующем модуле - сигналы от пульта приходят, когда клавиши нажимаю. Так что никакой там не аппаратный декодер. Просто, как я и сказал, в драйвер зашита декодировка протокола NEC. Нажатые клавиши декодируются и приходят в качестве сканкодов в /dev/input/eventX

То что пишет драйвер с включённой отладкой:

[  346.030000] IR IRQ Serve
[  346.030000] IR IRQ Serve
[  346.050000] IR IRQ Serve
[  346.050000] --- c5 0b 92 0c d0 15 ef 0d ff be 7f 7f 7f           .............
[  346.050000] dcnt = 13 
[  346.050000] ir_irq_service: Rx Packet End, code=0xffffffff, ir_code=0x0, timer_used=0 
[  346.120000] IR IRQ Serve
[  346.120000] IR IRQ Serve
[  346.130000] IR IRQ Serve
[  346.130000] IR IRQ Serve
[  346.150000] IR IRQ Serve
[  346.150000] --- c0 11 8b 12 a0 08 9f 1c b5 08 8b 08 95 13 8a 09  ................
[  346.150000] --- 8a 08 8b 08 8b 08 8b 08 8b 08 8b 08 8b 08 95 7f  ................
[  346.150000] --- 7f 7f                                            ..
[  346.150000] dcnt = 34 
[  346.150000] ir_irq_service: Rx Packet End, code=0xffffffff, ir_code=0x0, timer_used=0 
[  396.400000] IR IRQ Serve
[  396.400000] IR IRQ Serve
[  396.420000] IR IRQ Serve
[  396.420000] --- c7 09 95 09 bd 0a ff 8e 0c ff aa 10 8d 7f 7f 7f  ................
[  396.420000] dcnt = 16 
[  396.420000] ir_irq_service: Rx Packet End, code=0xffffffff, ir_code=0x0, timer_used=0 
[  396.490000] IR IRQ Serve
[  396.490000] IR IRQ Serve
[  396.500000] IR IRQ Serve
[  396.500000] IR IRQ Serve
[  396.520000] IR IRQ Serve
[  396.520000] --- c0 11 8c 11 b6 11 95 08 8b 08 8b 08 8a 09 8a 09  ................
[  396.520000] --- 94 14 89 09 8a 09 8a 09 8a 09 8a 09 8a 09 8a 09  ................
[  396.520000] --- 94 14 89 7f 7f 7f                                ......
[  396.520000] dcnt = 38 
[  396.520000] ir_irq_service: Rx Packet End, code=0xffffffff, ir_code=0x0, timer_used=0 

Тут клавиша 1, а через некоторое время 2 с пульта.

com
() автор топика
Ответ на: комментарий от com

/dev/input/eventX (в моём случае event1), при этом, разумеется, молчит.

com
() автор топика
Ответ на: комментарий от com

Такс, глянул исходник. Таки там специальный блок таки для этого, а не голый gpio. И в принципе быстрее будет, чем всырую, хотя вкрячить туда RC5 таки реально. в самом начале можешь увидеть регистровую карту. Судя по всему, там блок тупо делает замеры времени между фронтами в fifo, по заполнении которого дергает прерывание. Прерывание всасывает данные из аппаратуры в буфер, по стопбиту

	if(intsta & IR_RXINTS_RXPE)	 /*Packet End*/

оно пытается его декодировать, используя ir_packet_handler. Соотсветвенно, если ты шлешь данные RC5, то он ими набивает буфер до стопбита, но декодировать не может, так как NEC. Так что если хочешь поддержки своего пульта, можешь либо переписать ir_packet_handler на RC5. Имея под рукой времянки это не так сложно. Либо забить, и поднять gpio-ir-recv. Он будет отжирать на порядок больше процессорного времени, ибо одна посылка от пульта, как я и говорит тебе будет дергать порядка 30 раз прерывание, если не больше. Вроде как там эта пина смультиплекшена с gpio. Если gpio этот умеет дергать прерывание, то можно даже ничего не перевешивать.

AiFiLTr0 ★★★★★
()
Последнее исправление: AiFiLTr0 (всего исправлений: 1)
Ответ на: комментарий от AiFiLTr0

Дока на A10 говорит:

The FIFO is 8-bits width in the depth of 16 levels The MSB bit is used to record the parity of the receiving CIR signal. The high level is represented as 1 and the low level is represented as 0. The rest 7 bits are used for the length of RLC. The maximum length is 128. If the duration of one level (high or low level) is more than 128, the another byte is used.

Кроме того, как я говорил выше, в ядре есть декодеры для протоколов пультов. В drivers/media/rc. Можно использовать ir_raw_event_handle из rc-core. Ему достаточно скормить данные с приёмника, дальше он сам определит протокол и декодирует сигнал с помощью ядрёных модулей. Только я до конца пока не понял как этим пользоваться.

com
() автор топика
Ответ на: комментарий от com

Ну попробуй, хотя я не уверен, что он кушает данные в том же формате, что их выдает А10.
Потом расскажешь о результатах.

AiFiLTr0 ★★★★★
()
Ответ на: комментарий от AiFiLTr0

Ну, в общем, дурная голова рукам покоя... Получилось, но есть, наверное, лучше.

https://groups.google.com/forum/#!topic/linux-sunxi/7t99bLeQb9M

По ссылке чувак, как я понял, написал с нуля, а не правил исходники. Но у него какие-то проблемы с FIFO. Пишет что пофиксил, но пока времени привести в прорядок нету.

com
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.