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