[Tecnica] Periferiche Linux

Yusef Maali contact a yusefmaali.net
Gio 17 Set 2015 10:55:08 BST


Spettacoloso.
Mai trovata su internet una guida introduttiva migliore di questa.

Dovresti pubblicarla da qualche parte, potrebbe far comodo a tanti.

Il 17/09/2015 00:13, Szymon Tomasz Stefanek ha scritto:
> 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 speci


Maggiori informazioni sulla lista Tecnica