[Gulli] lirc - software

Alessandro Guarguaglini ilguargua@tiscali.it
Dom 9 Ott 2005 20:00:58 CEST


Dopo aver visto cosa usare come hardware, passiamo ora al software, non prima 
di colmare una una dimenticanza nella lista dei materiali per l'usbirboy :

1 basetta preforata
1 zoccolo a 20 pin per la cpu

(entrambi necessari)




PREREQUISITI E DIPENDENZE

I sorgenti li trovate ovviamente sul sito del progetto (http://www.lirc.org/),
ma vale la pena di controllare se per la vostra distribuzione esiste gia' il 
pacchetto precompilato. In caso affermativo, se usate un ricevitore seriale o
di altro tipo direttamente supportato da lirc, non dovreste avere bisogno 
d'altro. Negli altri casi (compreso l'usbirboy) vi servono i sorgenti del
kernel. *ATTENZIONE* a scegliere quelli giusti : devono essere quelli del
kernel che sta usando la vostra distribuzione. Un modo rapido per controllare
se sono gia' installati potrebbe essere questo (che ovviamente non garantisco
funzionare per ogni distribuzione in giro) :

ls -lL /lib/modules/`uname -r`| grep 'build'

l'output dovrebbe essere circa cosi' :

drwxr-xr-x   19 root     root         1304 2005-05-04 21:20 build/

Se invece il comando non da nessun output, ci sono dei problemi.
I sorgenti devono inoltre essere configurati con le impostazioni del kernel
in uso. Controllate che nella directory dei sorgenti esista un file chiamato
.config :

ls -l /lib/modules/`uname -r`/build/.config
-rw-r--r--  1 root root 37875 2005-05-04 
21:19 /lib/modules/2.6.10/build/.config

Se invece la risposta e' :
/lib/modules/2.6.10/build/.config : No such file or directory

il kernel non e' configurato. Come procurarsi la configurazione del kernel 
corrente e' argomento che ovviamente esula dalla mia competenza, provate 
comunque a vedere se esiste il file /proc/config.gz :

ls -l /proc/config.gz
-r--r--r--    1 root     root         8959 2005-10-07 22:29 /proc/config.gz

Se siete cosi' fortunati, decomprimetelo e copiatelo al suo posto :

gunzip -c /proc/config.gz > /lib/modules/`uname -r`/build/.config

Se intendete compilare anche i tools per XWindow , xmode2 e irxevent, 
caldamente
consigliati entrambi, vi serviranno anche i file header di X . Installate i 
pacchetti X.Org-devel o XFree-devel , a seconda del sottosistema grafico usato
dalla vostra distribuzione.
Ovviamente do' per scontato che abbiate installato tutto il necessario per 
compilare (gcc , binutils , etc) . Quasi tutte le distribuzioni includono una
voce a parte nella fase di installazione che installa tutto l'occorrente.




COMPILAZIONE/INSTALLAZIONE

Se decidete di compilare il pacchetto a partire dai sorgenti dovrete usare la
consueta prassi di configure - make - make install . Esiste anche uno scprit
(seput.sh) che aiuta nella scelta del driver appropriato all'hardware 
impiegato, e che lancia il 'configure' con i parametri giusti. Altrimenti 
lanciate :

./configure --help | less

per avere la lista dei driver disponibili. Esistono anche 2 speciali opzioni
'any' , che compila tutti i driver disponibili e 'none' che non ne compila 
nessuno. E' ovviamente consigliabile la lettura della documentazione allegata
al pacchetto, anche perche' non sempre c'e' una chiara corrispondenza tra il
nome del driver e l'hardware impiegato. A titolo d'esempio, il ricevitore
seriale autocostruito usa il driver serial , irda su porta seriale (anche se
integrato) usa il sir , l'usbirboy non ne usa (il driver per la periferica e'
incluso nel pacchetto usbirboy). Potete anche specificare l'indirizzo IO e
l'IRQ della porta seriale che intendete usare, ma questi parametri si possono
anche indicare al caricamento del modulo.
Stabilito quali sono le vostre esigenze, lanciate configure con gli 
appropriati parametri. Se il comando non genera errori, in genere dipendenze 
mancanti, nel caso controllate quale siano e rimediate, potete lanciare make, 
e se la compilazione va a buon fine make install. Se usate l'usbirboy 
ricordatevi che dovete compilare anche l'apposito modulo per il kernel. I 
sorgenti si trovano qui: 
http://sourceforge.net/project/showfiles.php?group_id=102345 , scompattate
il pacchetto e posizionatevi nella directory usbirboykmod. Qui e' sufficente
lanciare make, e se tutto e' ok make install. 

Controllate che i devices di lirc siano stati creati :

root@slack:~# ls -l /dev/lir*
crw-rw-rw-    1 root     root      61,   0 2004-06-05 17:35 /dev/lirc
srw-rw-rw-    1 root     root            0 2005-10-08 14:18 /dev/lircd=
prw-rw-rw-    1 root     root            0 2004-06-05 17:35 /dev/lircm|

Per l'usbirboy create manualmente il device con :

mknod /dev/usbirboy c 180 240

n.b.: se usate devfs, oppure il piu' moderno udev probabilmente i device
avranno altri nomi, o nel caso dell'usbirboy non sara' nemmeno necessario
crearlo. Spiacente ma non ho mai usato nessuno dei 2, quindi non so esservi
di aiuto.

Se avete compilato un modulo che usa la porta seriale ( es.  serial o sir)
prima di caricare il modulo di lirc dovrete rendergli disponibile la porta
seriale, altrimente occupata dal driver seriale di linux. Lanciate :

setserial /dev/ttySX uart none

sostituendo a X il numero della porta seriale (0 per la COM1, 1 per la 2, 
etc).
Generalmente i moderni pc hanno una sola porta seriale, quindi va bene usare 
0,ma la cosa cambia se usate ad esempio la porta irda integrata. Se non siete 
sicuri di quale sia il numero della porta seriale, andate per tentativi :
lanciate setserial su una porta, provate a caricare il modulo, se il 
caricamento non va a buon fine modprobe riporta l'errore :

root@slack:~# modprobe lirc_sir
FATAL: Error inserting lirc_sir (/lib/modules/2.6.10/misc/lirc_sir.ko): 
       Device or resource busy

Siamo a questo punto pronti per testare il tutto : caricate il modulo del
vostro ricevitore, passando eventulmente i parametri necessari, es. :

modprobe lirc_serial irq=4 io=0x3f8 
modprobe usbirboy

Se non ci sono messaggi di errore proviamo la ricezione con mode2 :

root@slack:~# mode2 -d /dev/usbirboy

il parametro -d va usato solo se non si usa il device standard /dev/lirc.
Ora premendo un tasto sul telecomando l'output sara' simile a questo:

pulse 611
space 1395
pulse 605
space 426
pulse 607
space 1393
pulse 611
space 1395
pulse 605
space 1413
pulse 608
space 404
pulse 638
space 380
... 

xmode2 mostra la stessa cosa ma in modalita' grafica, in pratica visualizza
il treno di onde quadre generato dal telecomando. Cambiando tasti, sarete in
grado di apprezzare visivamente come cambia il codice generato. Se l'onda
quadra vi pare troppo ravvicinata provate ad usare l'opzione -t 2 (o 1) da
linea di comando.




CONFIGURAZIONE SERVER

Il programma che si occupa della decodifica dei segnali del telecomando si
chiama lircd , che, come ci indica la 'd' finale del nome, e' un daemon, cioe'
un programma che gira in sottofondo, e che non prevede iterazioni con 
l'utente.
lircd legge dal device del ricevitore il segnale del telecomando, lo confronta
con quelli archiviati nel file di configurazione e se trova una corrispondenza
scrive sul suo device di output (/dev/lircd , una 'unix socket') il nome del
telecomando e del tasto premuto, cosi' da fornire un'interfaccia semplice ed
uniforme ai vari client che vi si connettono. I client hanno a loro volta un 
file di configurazione, che associa ad ogni tasto un comando.
Per prima cosa bisogna ovviamente procedere alla configurazione di lircd. Nel
pacchetto troviamo gia' un considerevole numero di files di configurazione
adatti ad alcuni telecomandi, perlopiu' quelli delle schede video/tv che ne
hanno uno. Altri files si trovano on-line (http://www.lirc.org/remotes) e 
coprono una piu' vasta area di telecomandi.
Se non riuscite a reperire un file gia' pronto, ne dovrete creare uno nuovo. 
L'operazione in se non e' molto difficile, ma richiede un po' di pazienza. 
Talvolta, a secondo del tipo di telecomando, e' necessario effettuare piu' 
tentativi prima di riuscire a trovare la configurazione ottimale, l'essenziale
e' non scoraggiarsi subito. Il programma per creare il files di configurazione
si chiama 'irrecord' e va lanciato indicando il device da cui leggere ( se
diverso da /dev/lirc) e il nome del file da creare , es :

irrecord -d /dev/usbirboy myremote.conf

una schermata introduttiva sottilinea l'importanza di questo file per il 
sistema lirc, e ci invita in caso di successo nella creazione a condividere
il files con altri. Premendo enter si viene edotti su come funzionera' la fase
di riconoscimento dei codici del nostro telecomando : e' necessario premere
di continuo pulsanti diversi del telecomando, uno alla volta finche' lo sullo
schermo non si siano completate le 2 linee di 80 punti. Premiamo di nuovo 
enter per iniziare la registrazione vera e propria :

Press RETURN now to start recording.
................................................................................
Found const length: 113536
Please keep on pressing buttons like described above.
................................................................................
RC-5 remote control found.
Found possible header: 976 797
Found hidden lead pulse: 974
No repeat code found.
Signals are biphase encoded.
Removed header.
Signal length is 13
Now enter the names for the buttons.

In questo caso irrecord ha riconosciuto il tipo di modulazione usato dal
telecomando, cioe' come associare ad ogni treno di onde quadre generato un
numero. Adesso inizia la fase di riconoscimento di ogni tasto :

Please enter the name for the next button (press <ENTER> to finish recording)
power

Now hold down button "power".

Please enter the name for the next button (press <ENTER> to finish recording)
1

Now hold down button "1".

[...]

Terminato di immettere tutti i tasti, premiamo enter senza scrivere nulla. Per
terminare la creazione del file ci e' richiesto di premere ripetutamente un
pulsante (sempre il solito) piu' velocemente possibile ma senza tenerlo sempre 
premuto :

Checking for toggle bit.
Please press an arbitrary button repeatedly as fast as possible (don't hold
it down!).
..............................
Toggle bit is 2.
Successfully written config file.

Controlliamo il file appena creato :

root@slack:~# cat myremote.conf

# Please make this file available to others
# by sending it to <lirc@bartelmus.de>
#
# this config file was automatically generated
# using lirc-0.7.1(serial) on Sun Oct  9 15:35:21 2005
#
# contributed by
#
# brand:                       myremote.conf
# model no. of remote control:
# devices being controlled by this remote:
#

begin remote

  name  myremote.conf
  bits            5
  flags RC5|CONST_LENGTH
  eps            30
  aeps          100

  one           953   819
  zero          953   819
  plead         976
  pre_data_bits   8
  pre_data       0x80
  gap          113536
  toggle_bit      2


      begin codes
          power                    0x0C
          1                        0x01
          2                        0x02
          3                        0x03
          4                        0x04
      end codes

end remote


Proviamo adesso se il tutto funziona con lircd :

root@slack:~# lircd -d /dev/usbirboy myremote.conf
root@slack:~# irw
0000000000001002 00 2 myremote.conf
0000000000001001 00 1 myremote.conf
000000000000100c 00 power myremote.conf
000000000000100c 01 power myremote.conf
0000000000001003 00 3 myremote.conf
0000000000001002 00 2 myremote.conf
0000000000001001 00 1 myremote.conf
0000000000001001 01 1 myremote.conf
0000000000001001 02 1 myremote.conf
0000000000001001 03 1 myremote.conf
0000000000001001 04 1 myremote.conf
0000000000001001 05 1 myremote.conf

irw ci mostra l'output dei tasti riconosciuti da lircd. Per ognuno ci viene
mostrato il codice esadecimale, il numero di ripetizioni, il nome assegnato al 
tasto ed il nome del telecomado. 
E' possibile anche usare piu' telecomdi contemporaneamente, per ognuno dovra'
essere creato un file di configurazione come sopra che poi dovranno essere
uniti in un unico file, es. con il comando 'cat':

cat myremote1.conf myremote2.conf > lircd.conf



CONFIGURAZIONE CLIENTS

I clients sono quei programmi che connettendosi a lircd associano tramite un 
file di configurazione i singoli tasti di ogni telecomando ad una determinata
azione. Alcuni sono inclusi nel pacchetto di lirc e consentono di controllare
in modo arbitrario praticamente qualsiasi applicazione, e diversi programmi
per il multimedia ( es. mplayer, xmms, xine, etc) includono la possibilita' di
usare lirc direttamente. Per tutti il file di configurazione di default e'
~/.lircrc . Il formato del file e' questo :

   begin
        prog    = ...
        remote  = ...
        button  = ...
        repeat  = ...
        delay   = ...
        config  = ...
        mode    = ...
        flags   = ...
   end
   
ripetuto per ogni combinazione tasto/azione.

'prog' e' il programma interessato da questo tasto; in ogni istante possono 
esserci piu' programmi in ascolto sulla socket di lircd , ma ogni programma
reagira' solo ai suoi tasti.
'remote' e' il nome del telecomando, come indicato nel file .conf di lircd.
'button' e' il nome assegnato al pulsante del telecomando
'config' e' la stringa che viene passata a 'prog' , che rappresenta quindi 
l'azione che verra' intrapresa.
'repeat' indica quante volte deve essere ripetuto il tasto prima che sia 
intrapresa l'azione.
Come spesso accade, un'occhiata ai files di esempio (che trovate nella
directory contrib/ del pacchetto) vi chiarira' le idee piu' di ogni altra
spiegazione. I programmi che vi saranno senz'altro piu' utili sono irexec e
irxevent. Sono entrambi daemon (quindi ricordatevi che devono essere in 
esecuzione quando intendete usarli), il primo avvia l'applicazione indicata
in 'config' , il secondo invia invece ad un'applicazione attiva sotto X window
l'evento indicati in 'config', che puo' essere un tasto, un click del mouse, 
etc. 

begin
  prog = irexec
  remote = myremote.conf
  button = power
  config = xawtv &
  mode = xawtv
  flags = once
end
 
questo ad esempio avviera' xawtv alla pressione del tasto 'power' del 
telecomando che avevamo configurato sopra. Ovviamente possiamo lanciare ogni 
programma possibile, incluso /sbin/shutdown per spengere il pc , o 
lanciare/interrompere la connessione ad internet, tanto per fare qualche 
esempio.

begin
  prog = irxevent
  button = 0
  config = Key f xawtv
end

questo invece alla pressione del tasto '0' inviera' il tasto 'f' a xawtv (che
serve per vedere la tv fullscreen).

begin
  prog = xmms
  remote = SONY
  button = PLAY
  config = PLAY
end

questa entry e' usata direttamente da xmms (ricordatevi di abilitare il 
relativo plugin !)

Se usate prevalentemente l'ambiente grafico KDE ed i suoi applicativi, provate
ad usare irkick , il server lirc di kde. Trattandosi di una applicazione
grafica l'uso e la configurazione dovrebbero essere abbastanza intuitivi.

Altro caso di client che usa un diverso file di configurazione e' lircmd ,
ovvero il mouse daemon, che consente di simulare un mouse tramite il 
telecomando.
Il mouse viene simulato tramite il device /dev/lircm , occorre quindi 
reindirizzare gli applicativi (es. l'Xserver o gpm) sul quel device tramite i
loro file di configurazione. I protocolli supportati sono MouseSystem, IMPS2 e
Intellimouse. L'ultimo e' preferibile perche' consente l'emulazione dei mouse
con la rotella di scroll. Il file di configurazione di default si trova in
/etc/lircmd.conf , e serve ad indicare in maniera abbastanza intuitiva la
corrispondenza tra tasti del telecomando e movimenti del mouse. Anche qui
un'occhiata agli esempi in dotazione vi dara' senz'altro una mano.


MESSA A PUNTO FINALE

A questo punto, dopo aver visto che tutto funziona come volevamo, pensiamo 
agli ultimi dettagli. Perche' il tutto sia funzionante all'avvio del 
computer, dovremo lanciare lircd e gli altri eventuali daemon insieme agli 
altri script di avvio. Le modalita' cambiano (e molto) da distribuzione a 
distribuzione, provate a vedere gli esempio di script d'avvio che trovate 
nella directory contrib/ del pacchetto e scegliete quello piu' adatto alla 
vostra distro. Se avete installato i pacchetti binari probabilmente non vi 
servira' fare altro.
Se usate il driver seriale ricordate il discorso fatto sopra con setserial ,
che dovra ovviamente essere fatto prima di avviare lircd. 
Prestate attenzione al fatto che a parte lircd che legge di default la sua
configurazione da /etc/lircd.conf per gli altri daemon la scelta di default
e' $HOME/.lircrc , e che quindi al momento del boot non saranno in grado di
trovarlo. Indicate quindi sempre sulla linea di comando la locazione giusta
del file (es. /home/utente/.lircrc). 
Per far si che il giusto modulo del driver venga caricato automaticamente
dobbiamo aggiungere questa riga al file /etc/modprobe.conf :

alias char-major-61  lirc_*driver*

dove *driver* puo' essere sir , serial o quello che usiamo. Al driver seriale
possono anche essere passati parametri, es. :

options lirc_sir irq=4 io=0x3f8 threshold=5

Il modulo dell'usbirboy si dovrebbe caricare da solo, al momento che si
inserisce il dispositivo nella presa USB.

Bene, ora non vi resta altro che godervi Linux con il vostro telecomado
preferito.



Maggiori informazioni sulla lista Gulli