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.