[Tecnica] Periferiche Linux
Szymon Tomasz Stefanek
pragma a siena.linux.it
Mer 16 Set 2015 23:13:15 BST
On 16/09/2015 22:53, Marcello Semboli wrote:
> Salve,
> dovrei imparare a gestire delle periferiche su raspberry pi 2.
> Intendo "gestire" in senso molto lato perché sono quasi totalmente a digiuno di tutto ciò che riguarda la directory /dev.
> So che esistono i moduli e so che i moduli fanno apparire le periferiche nella directory /dev.
> Ma non so poi cosa dovrebbe fare un programma per usare la periferica.
> Non devo padroneggiare l'argomento, devo solo cominciare a capirlo.
Hm... l'argomento di per sè è abbastanza ampio e dipende a che livello vuoi arrivare.
Puoi leggere qualcosa qui: http://www.tldp.org/LDP/tlk/dd/drivers.html .
Io a suo tempo lessi "Linux Device Drivers" di Rubini, fatto molto bene,
ma non so se c'è una versione aggiornata per i kernel recenti.
Comunque, sintetizzando.
- Sulla raspberry ci gira linux standard, quindi la gestione delle periferiche
non è particolare.
- La gestione di una periferica varia in funzione del tipo di dispositivo.
- Come hai già accennato, per molti dispositivi (quelli che comunemente attacchi
ad un pc tramite USB, ad esempio) il kernel offre un'interfaccia userspace
accessibile tramite un file in /dev (che poi si chiama "(char o block) device")
Poi ci vuole uno strato software in userspace che di fatto usi la periferica
con il protocollo corretto.
Un esempio:
- Modem 3G connesso via USB.
Per esempio Alcatel One Touch X230, magari brandizzato da Vodafone o qualche
altra compagnia.
- Il kernel da solo si accorge che c'è un dispositivo connesso su USB e lo "aggancia",
tramite il driver generico USB al suo albero di dispositivi. A questo livello vedi
la periferica tramite lsusb e poco altro.
$ lsusb
...
Bus 001 Device 028: ID 1bbb:0017 T & A Mobile Phones
...
- Il dispositivo espone un identificativo composto da <vendor_id>:<device_id>
(nel nostro caso 1bbb:0017)
- A questo punto serve un driver che sia in grado di riconoscere il dispositivo
e "parlare" con il particolare chip a bordo.
- Se il modulo del driver è già caricato (o il driver è builtin nel kernel) allora
la sua attivazione avviene automaticamente tramite la coppia <vendor_id>:<device_id>.
Se il driver non è caricato allora si può caricarlo tramite modprobe.
Ci sono dei meccanismi che consentono di caricare automaticamente i moduli
quando viene inserito un dispositivo riconosciuto.
Per il modem in oggetto il driver è usbserial (piùttosto generico).
Sulla ubuntu il driver viene caricato automaticamente mentre su distribuzioni
"embedded" spesso l'ho dovuto tirare su a mano.
- Il driver riconosce il chip e tipicamente espone un interfaccia
di tipo seriale associata ad una nuova coppia di numeri (minor/major).
Con il programma mknod puoi creare un "device" dentro /dev (ma anche
da qualche altra parte) che si "aggancia" alla coppia minor/major e permette
di comunicare con il driver. Per esempio /dev/ttyUSB0.
La /dev/ di quasi tutte le distribuzioni è prepopolata con i device
più comuni e ci sono dei meccanismi per creare i device automaticamente.
Quindi mknod non si usa quasi più... però è bene sapere che il processo
teorico sarebbe quello.
- A questo punto un programma userspace, come ad esempio minicom,
può connettersi al modem e "parlarci" con il relativo protocollo (i comandi AT).
Per usare il modem 3G nel mondo reale, poi, hai bisogno di un programma
più complicato: pppd, che usa sequenze di comandi AT per stabilire una
connessione remota e tira su tutta la baracca necessaria perchè
il tuo browser possa fare connessioni TCP attraverso di essa.
Quindi per usare una periferica in generale ci vuole uno "stack" di software.
Nel caso del modem 3G abbiamo:
- Driver usb generico (in kernelspace)
- Driver dello specifico chip (in kernelspace)
|
/dev/ttyUSB0
|
- pppd (in userspace)
|
ppp0
|
- google-chrome
Ci sono diverse varianti di questo schema.
- Alcuni dispositivi hanno driver quasi completamente in userspace. Un esempio
sono dispositivi accessibili tramite libusb, un'altro sono le stampanti di rete.
- Le schede video sono bestie molto complicate e i relativi driver a livello
kernel non necessariamente offrono un'interfaccia in /dev.
- Le schede di rete offrono interfacce specializzate (eth0, wlan0 etc..)
che non stanno dentro /dev.
- Alcuni dispositivi possono offrire più interfacce userspace, anche di
tipo diverso (ad esempio ci sono chiavette USB che fanno anche storage).
Poi ci sono vari "glitch".
- Alcuni dispositivi USB hanno bisogno di essere "switchati" di modalità
per poter funzionare. Per questo c'è usb_modeswitch.
- Il kernel non conosce gli ID di tutti i possibili dispositivi
quindi non è detto che sia in grado di tirare su il driver necessario.
Non è neanche detto che il driver stesso sia in grado di agganciarsi
al proprio dispositivo, magari bisogna dargli qualche dritta.
Etc...
Se hai domande specifiche, spara.
--
STS
Maggiori informazioni sulla lista
Tecnica