[Tecnica] Periferiche Linux

Marcello Semboli dinogen a gmail.com
Gio 17 Set 2015 06:47:37 BST


Bè, direi che dopo questa splendida introduzione ho già le basi che mi
servivano.
Grazie Pragma.!
Il 17/set/2015 12:13 AM, "Szymon Tomasz Stefanek" <pragma a siena.linux.it>
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 specifiche, spara.
>
> --
>
> STS
> _______________________________________________
> Tecnica mailing list
> Tecnica a liste.siena.linux.it
> http://liste.siena.linux.it/cgi-bin/mailman/listinfo/tecnica
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://liste.siena.linux.it/pipermail/tecnica/attachments/20150917/bdf31a52/attachment-0001.htm>


Maggiori informazioni sulla lista Tecnica