<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, &quot;Szymon Tomasz Stefanek&quot; &lt;<a href="mailto:pragma@siena.linux.it">pragma@siena.linux.it</a>&gt; 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 &quot;gestire&quot; 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&#39;argomento, devo solo cominciare a capirlo.<br>
</blockquote>
<br>
Hm... l&#39;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 &quot;Linux Device Drivers&quot; di Rubini, fatto molto bene,<br>
ma non so se c&#39;è 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&#39;interfaccia userspace<br>
  accessibile tramite un file in /dev (che poi si chiama &quot;(char o block) device&quot;)<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&#39;è un dispositivo connesso su USB e lo &quot;aggancia&quot;,<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 &amp; A Mobile Phones<br>
  ...<br>
<br>
- Il dispositivo espone un identificativo composto da &lt;vendor_id&gt;:&lt;device_id&gt;<br>
  (nel nostro caso 1bbb:0017)<br>
<br>
- A questo punto serve un driver che sia in grado di riconoscere il dispositivo<br>
  e &quot;parlare&quot; 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 &lt;vendor_id&gt;:&lt;device_id&gt;.<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>
  &quot;embedded&quot; spesso l&#39;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 &quot;device&quot; dentro /dev (ma anche<br>
  da qualche altra parte) che si &quot;aggancia&quot; 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 &quot;parlarci&quot; 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 &quot;stack&quot; 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&#39;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&#39;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 &quot;glitch&quot;.<br>
<br>
- Alcuni dispositivi USB hanno bisogno di essere &quot;switchati&quot; di modalità<br>
  per poter funzionare. Per questo c&#39;è 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>