Sterowanie OpenWrt z wykorzystaniem pilota
Ostatnia zmiana: 2014-05-12 21:32

W dawnych czasach obsługa pilotów na podczerwień (and. remote control) polegała na instalacji i konfiguracji pakietu lirc. Wraz z biegiem czasu moduły obsługi zostały zintegrowane z bieżącymi wydaniami jądra linuksa i stanowią jeden z elementów podsystemu tzw. input layer czyli krótko mówiąc zachowują się jak zwykłe klawiatury pozwalając na generowanie odpowiednich kodów klawiszy. Tym samym całkowicie zbędne stało się używanie pakietu lirc; całą obsługę przejmuje kernel linuksowy.

Piloty na podczerwień można znaleźć w wielu urządzeniach - począwszy od samodzielnych odbiorników na USB, dołączane są do tunerów DVB-T czy do wyświetlaczy LCD. W tym przykładzie został wykorzystany odbiornik podczerwieni zawarty w sticku USB DVB-T oraz OpenWrt Attitude Adjustment 12.01.x.



Sterowniki

Niezbędne jest zainstalowane odpowiednich sterowników dla danego urządzenia. Dla zwykłych samodzielnych odbiorników mogą to być pakiety kmod-ir-ati-remote lub kmod-ir-mceusb, dla wyświetlaczy np. kmod-ir-imon, dla dekoderów DVB-T - odpowiedni sterownik danego urządzenia. Należy posłużyć się odpowiednią instrukcją (1) i zainstalować wszystkie niezbędne elementy.
Dla posiadanego przeze mnie DVB-T był to moduł rc-it913x-v1.ko oraz dvb-usb-it913x.ko. Po poprawnym załadowaniu modułów, w logach (polecenie logread) pojawia się informacja o wykryciu m.in. urządzenia remote control


...
[ 1470.580000] DVB: registering adapter 0 frontend 0 (ITE 9135 Generic_1)...
[ 1470.590000] Registered IR keymap rc-it913x-v1
[ 1470.600000] input: IR-receiver inside an USB DVB receiver as /devices/platform/ohci-platform/usb1/1-1/rc/rc2/input4
[ 1470.610000] rc2: IR-receiver inside an USB DVB receiver as /devices/platform/ohci-platform/usb1/1-1/rc/rc2
[ 1470.620000] dvb-usb: schedule remote query interval to 250 msecs.
[ 1470.620000] dvb-usb: ITE 9135 Generic successfully initialized and connected.
[ 1470.630000] it913x: DEV registering device driver
...

Oprogramowanie

Do konfiguracji niezbędne będzie posiadanie zainstalowanego scyzoryka szwajcarskiego jakim jest program ir-keytable. Można go znaleźć w pakiecie v4l-utils, więc należy go zainstalować:


    # opkg update
    # opkg install v4l-utils 

Uruchamiamy i dostajemy np. taki wynik:


    # ir-keytable
    Found /sys/class/rc/rc2/ (/dev/input/event0) with:
        Driver it913x, table rc-it913x-v1
        Supported protocols: NEC 
        Enabled protocols: NEC 
        Repeat delay = 500 ms, repeat period = 125 ms

Z interesujących rzeczy: nasz odbiornik zarejestrowany jest pod oznaczeniem rc2, zdarzenia generowane przez niego idą na /dev/input/event0, a obsługuje protokół NEC. Niektóre odbiorniki pozwalają na wybór protokołu, a tym samym mogą współpracować z różnymi pilotami.

Przygotowanie mapowania klawiszy

Uruchamiamy ir-keytable z odpowiednią opcją i naciskamy dowolny przycisk na pilocie żeby sprawdzić czy generowane są jakieś kody:


    # ir-keytable -t -s rc2
Testing events. Please, press CTRL-C to abort.
1398889782.662718: event MSC: scancode = ff0b
1398889782.662726: event sync

gdzie rc2 to wcześniej znalezione oznaczenie pilota.
W tym przypadku został naciśnięty przycisk VOL-. Program odpowiedział że naciśnięcie tego przycisku wygenerowało kod ff0b (jest to liczba heksadecymalna). Należy nacisnąć wszystkie klawisze aby uzyskać pozostałe kody. Mając je, można zaś przygotować plik tekstowy z mapowaniami przycisków.
Umieszczamy go w pliku np. pod nazwą pilot w katalogu /etc/rc_keymaps/. Zawartość tego pliku musi być ściśle określona i wyglądać następująco:


==> pilot <==
# table pilot, type: NEC
0xff0a	KEY_POWER
0xff0b	KEY_VOLUMEUP
0xff0d	KEY_CHANNELUP
0xff0c	KEY_MEDIA_REPEAT
0xff10	KEY_VOLUMEDOWN
0xff1c	KEY_CHANNELDOWN
0xff04	KEY_1
0xff08	KEY_2
0xff07	KEY_3
0xff03	KEY_4
0xff1f	KEY_5
0xff06	KEY_6
0xff02	KEY_7
0xff1e	KEY_8
0xff05	KEY_9
0xff01	KEY_ZOOM
0xff09	KEY_0
0xff00	KEY_STOP
0xff0e	KEY_RECORD
0xff1d	KEY_MUTE
0xff0f	KEY_PAUSE

Pierwsze dwie linie określają nazwy oraz protokół. Następnie w każdej linii jest kod (z 0x określający że to liczba heksadecymalna) oraz nazwa kodu przycisku który będzie generowany. Jak łatwo zauważyć, w tym przypadku pilot miał 21 przycisków: zestaw numeryczny, przyciski głośności, wyciszania, zmiany kanałów, włączenia zasilania i kilka innych.
Następnym etapem będzie poinformowanie sterownika że ma używać tej mapy. Wykonujemy to poleceniem:


    # ir-keytable -s rc2 -w /etc/rc_keymaps/pilot

i to polecenie trzeba wpisać za każdym razem przy uruchomieniu routera, więc warto dodać je np, do /etc/rc.local.
Sprawdzamy ponownie czy działa mapowanie:


    # ir-keytable -t -s rc2
Testing events. Please, press CTRL-C to abort.
1398892092.163012: event MSC: scancode = ff0b
1398892092.163021: event key down: KEY_VOLUMDOWN (0x0072)
1398892092.163025: event sync
1398892092.409987: event key up: KEY_VOLUMEDOWN (0x0072)
1398892092.409992: event sync

Jeżeli tak jest to gratulacje - naciśniecie przycisku na pilocie generuje kod klawisza tak jak by to była zwykła klawiatura.

UWAGA: Przed zrobieniem mapy klawiszy warto sprawdzić czy ktoś nie zrobił już tego za nas. W katalogu /etc/rc_keymaps można znaleźć kilkanaście plików; możliwe jest że jeden z nich będzie obsługiwał nasz odbiornik podczerwieni.

Uruchomienie

Można teraz wykorzystać to do uruchamiania własnych poleceń. Wykorzystany zostanie wielokrotnie wymieniany program triggerhappy (1, 2), do wykonywania akcji. Zgodnie z opisem dodajemy więc własne polecenia które będą się wykonywały:


    # opkg install kmod-usb-hid triggerhappy
    # echo "KEY_POWER		1	logger \"POWER ON!\"" >> /etc/triggerhappy/triggers.d/example.conf 
    # echo "KEY_VOLUMEDOWN		1	logger \"Audio DOWN!\"" >> /etc/triggerhappy/triggers.d/example.conf 
    # echo "KEY_VOLUMEUP		1	logger \"Audio UP!\"" >> /etc/triggerhappy/triggers.d/example.conf 
    itd
    # /etc/init.d/triggerhappy enable
    # /etc/init.d/triggerhappy start

Kliknięcie teraz przycisku na pilocie generuje odpowiednie wpisy w logu.

Dodając wywołanie odpowiednich poleceń można np. włączyć muzykę, zwiększyć głośność, przełączać stacje radiowe. Ale także np. odmontować dyski czy uruchomić ściąganie plików. Zyskaliśmy więc w routerze kilkanaście dowolnie programowalnych przycisków.