Gentoo Logo

USB e Gentoo Linux

Indice:

1.  Introduzione

Cos'è USB?

USB è l'acronimo di Universal Serial Bus e in poche parole è un'interfaccia standard che permette al computer di comunicare con diverse periferiche. Tra le periferiche USB più usate troviamo le tastiere, i mouse, le penne USB, le fotocamere digitali, i masterizzatori esterni per CD & DVD, le stampanti ecc.

Allo stato attuale esistono due versioni del protocollo USB, cioè USB 1.1 e USB 2.0. Da momento che il protocollo USB ha sempre mantenuto la compatibilità con le versioni precedenti, lo stesso accade tra USB 1.1 e USB 2.0. I dispositivi più recenti supportano la versione 2.0. USB 2.0 supporta una velocità massima di trasmissione dati di 480 Mbps o 60 MBps e questa costituisce la differenza più importante dalla versione precedente. Un altro vantaggio del protocollo USB è che i dispositivi supportano hot-plug, che significa che non si deve riavviare la macchina per poter usare tali dispositivi.

Il Punto di Vista Tecnico

Prima di addentrarci nelle opzioni di configurazione del kernel, vale la pena di entrare un po' più nei dettagli del protocollo USB. Se hai fretta oppure se vuoi saltare questa sezione, puoi andare direttamente alla Configurazione del Kernel.

Un sistema USB è costituito da un 'host controller', da una serie di hub (concentratori), da un 'hub principale' (root hub) che gestisce fino a 127 dispositivi USB, hub inclusi. Un 'host controller' non è altro che l'interfaccia hardware tra il dispositivo USB e il sistema operativo. Tali interfacce vengono chiamate HCI (Host Controller Interface) e le più usate sono OHCI (Open HCI), prodotta da Compaq, UHCI (Universal HCI) e EHCI (Enhanced HCI), entrambe prodotte da Intel. OHCI/UHCI sono lo standard per le interfacce USB 1.1 mentre EHCI è lo standard per USB 2.0.

I produttori offrono ai programmatori un'interfaccia che permette al sistema di interagire con l'hardware; questa interfaccia prende il nome di HCD, Host Controller Device. È proprio attraverso l'HCD che i dispositivi USB interagiscono con il software di sistema. Il seguente schema dovrebbe rendere il concetto più semplice.

Codice 1.1: Architettura USB Generica

(Il software è costituito da diversi componenti, tra cui i driver, ma per semplicità non vengono indicati)

  + --------  Hardware  --------   + ----  Software  ---- +
  |                                |                      |
  | [Dispositivo USB] -+-> {EHCI} -+--->  ( EHCD )        |
  |                    |           |                      |  Utente
  |                    `-> {UHCI} -+--->  ( UHCD )        |
  |                                |                      |
  + --------  Hardware  --------   + ----  Software  ---- +

Un dispositivo USB può utilizzare un driver creato appositamente oppure un driver già presente sul sistema ma per stabilire se questo sia possibile bisogna introdurre il concetto di classe. Due dispositivi che appartengono alla stessa classe possono condividere lo stesso driver. Tra le classi esistenti troviamo la classe USB HID (Human Interface Devices) alla quale appartengono le tastiere e i mouse, la classe dei dispositivi di memorizzazione di massa USB (USB Mass Storage devices) che comprende le penne USB, le fotocamere digitali, i player audio ecc. e la classe USB CDC (Communication Devices Class) di cui fanno parte i modem USB e simili.

Com'è configurata la tua macchina?

Scoprire se la tua macchina supporta il protocollo USB 2.0 è molto semplice. Per farlo useremo il comando lspci.

Nota: lspci fa parte del pacchetto sys-apps/pciutils. Se non dovesse essere installato, esegui emerge pciutils. L'esecuzione di lspci richiede i diritti di root.

Codice 1.2: Esempi di output di lspci

(Su un sistema con supporto per USB 1.1 verrà rilevato soltanto UHCI)

# lspci -v | grep USB
0000:00:04.2 USB Controller: Intel Corp. 82371AB/EB/MB PIIX4 USB (rev 01)
(prog-if 00 [UHCI])

(Su un sistema con supporto per USB 2.0, verranno rilevati EHCI e UHCI)

00:1d.0 USB Controller: Intel Corp. 82801DB USB (Hub #1) (rev 01) (prog-if 00
[UHCI])
00:1d.1 USB Controller: Intel Corp. 82801DB USB (Hub #2) (rev 01) (prog-if 00
[UHCI])
00:1d.2 USB Controller: Intel Corp. 82801DB USB (Hub #3) (rev 01) (prog-if 00
[UHCI])
00:1d.7 USB Controller: Intel Corp. 82801DB USB EHCI Controller (rev 01)
(prog-if 20 [EHCI])

Così, attraverso lspci, possiamo scoprire se il nostro sistema supporta il protocollo USB 2.0. Questo ci servirà durante la configurazione del kernel per attivare le opzioni più opportune.

2.  Configurazione del Kernel

Procurarsi il kernel

In primo luogo installa i sorgenti del kernel che hai scelto. Per i nostri scopi useremo i gentoo-sources. Per maggiori informazioni sui diversi kernel disponibili in Portage, fai riferimento alla Guida ai Kernel Gentoo Linux.

Codice 2.1: Procurarsi i sorgenti del kernel

#  emerge gentoo-sources

Procediamo ora con la configurazione del kernel.

Codice 2.2: Spostarsi nella directory dei sorgenti

#  cd /usr/src/linux
#  make menuconfig

Nota: Nell'esempio si assume che il link simbolico /usr/src/linux punti ai sorgenti del kernel che vuoi usare. Controlla che sia vero prima di procedere.

Opzioni di configurazione per il kernel

Ora vedremo alcune delle opzioni che andranno abilitate durante la configurazione del kernel supportare le nostre periferiche USB.

Nota: Gli esempi di seguito illustrati mostreranno le opzioni di base e quelle più comunemente richieste da una periferica USB, come un dispositivo di memorizzazione di massa USB (la maggior parte delle fotocamere e delle penne USB). Se hai un dispositivo che richiede una configurazione particolare, dai un occhio al manuale d'uso o cerca sul Web per vedere se è supportato direttamente dal kernel o se richiede particolari driver. Per semplicità, i nostri esempi mostrano casi in cui il supporto è offerto dal kernel. Se preferisci un kernel modulare, prendi nota dei vari moduli e modifica di conseguenza la configurazione.

Codice 2.3: make menuconfig: opzioni per il kernel

Device Drivers  --->
  SCSI device support  --->

(Il supporto SCSI verrà abilitato automaticamente selezionando 'USB Mass Storage'
ma sarà comunque necessario abilitare il supporto per i dischi.)
---   SCSI support type (disk, tape, CD-ROM)
<*>   SCSI disk support

(Torna indietro di un livello e accedi al supporto per dispositivi USB)
USB support  --->

(Questo è l'hub principale (root hub) ed è necessario per il supporto USB. Se vuoi compilarlo come modulo,
 verrà chiamato 'usbcore'.)
<*> Support for Host-side USB

(Seleziona almeno un HCD. Nel dubbio, puoi selezionarli tranquillamente tutti.)
--- USB Host Controller Drivers
<*> EHCI HCD (USB 2.0) support
< > OHCI HCD support
<*> UHCI HCD (most Intel and VIA) support

(Un po' più in basso troviamo i dispositivi CDC e quelli di memorizzazione di massa.)
< > USB Modem (CDC ACM) support
<*> USB Printer support
<*> USB Mass Storage support

(Se hai una scheda di rete USB, come la RTL8150, questo è ciò che ti occorre)
USB Network Adapters  --->
    <*> USB RTL8150 based ethernet device support (EXPERIMENTAL)

(Se hai un adattatore seriale-USB, come il Prolific 2303, questo è ciò che ti occorre)
USB Serial Converter support  --->
    <*> USB Serial Converter support
    <*> USB Prolific 2303 Single Port Serial Driver (NEW)

Se si possiede una tastiera USB, mouse, joystick o qualunque altro dispositivo di input, bisogna abilitare il supporto a HID. Tornare indietro di un livello a "Device drivers" e abilitare il supporto a HID come mostrato:

Codice 2.4: Abilitare il supporto a HID

Device Drivers --->
  [*] HID Devices  --->
    <*>   USB Human Interface Device (full HID) support

Terminata la configurazione, puoi (ri)compilare il kernel e il supporto USB dovrebbe essere attivo dopo un reboot. Puoi passare alla sezione Verificare il funzionamento del supporto USB per vedere se tutto è OK (come dovrebbe).

3.  Verificare il funzionamento del supporto USB

dmesg è tuo amico!

È finalmente arrivato il momento di mettere in pista le nostre periferiche USB :) Iniziamo subito. In questa sezione vedremo come il sistema risponde ad alcuni dispositivi USB. Cominciamo con una penna USB da 512 MB. Puoi usare anche altri dispositivi di memorizzazione di massa. Per vedere cosa accade e come risponde il sistema, useremo principalmente dmesg.

Nota: L'output di dmesg contiene molte più informazioni di quelle che ci servono dato che legge il buffer del kernel che contiene anche tutti i messaggi del boot. Negli esempi che seguono abbiamo mantenuto soltanto le porzioni di interesse, aggiungendo linee vuote per migliorare la leggibilità. Se necessario usa dmesg | more oppure dmesg | less per analizzare l'output del tuo sistema.

Codice 3.1: Output di dmesg per la penna USB

(Inserisci la penna USB in una porta e quindi...)
# dmesg | less

(Il dispositivo viene rilevato come USB 1.1 e viene allocato un
indirizzo. Viene anche rilevato che tipo di HCD sta usando.)
usb 1-1: new full speed USB device using uhci_hcd and address 2

(L'emulazione SCSI interviene automaticamente)
scsi0 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 2

(Ora vengono mostrate le informazioni sul dispositivo, incluso il numero del modello)
usb-storage: waiting for device to settle before scanning
  Vendor: JetFlash  Model: TS512MJF2A        Rev: 1.00
  Type:   Direct-Access                      ANSI SCSI revision: 02
SCSI device sdb: 1003600 512-byte hdwr sectors (514 MB)

(Il rilevamento della protezione da scrittura è a livello EXPERIMENTAL nei kernel più recenti)
sdb: Write Protect is off
sdb: Mode Sense: 0b 00 00 08
sdb: assuming drive cache: write through
SCSI device sdb: 1003600 512-byte hdwr sectors (514 MB)
/dev/scsi/host0/bus0/target0/lun0: p1
Attached scsi removable disk sdb at scsi0, channel 0, id 0, lun 0
Attached scsi generic sg0 at scsi0, channel 0, id 0, lun 0,  type 0
usb-storage: device scan complete
(A questo punto la periferica dovrebbe essere accessibile montandola in /dev/sdb1)

(Quando il dispositivo viene disconnesso, il sistema se ne accorge)
usb 1-1: USB disconnect, address 2

Una volta che la periferica è connessa e montata, può essere trattata come un normale disco fisso. Le operazioni di routine come cp, mv, rm, ecc. funzionano tranquillamente. Sulla penna USB è possibile creare un filesystem e formattarlo.

Codice 3.2: Accedere alla penna USB

# mount /dev/sdb1 /mnt/usb
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda8             9.4G  7.5G  1.9G  80% /
/dev/sda9              11G  8.1G  2.4G  78% /usr
none                  189M     0  189M   0% /dev/shm
/dev/sdb1             490M   34M  457M   7% /mnt/usb

Nota: È possibile accedere alle fotocamere digitali come si fa con le penne USB. È il metodo che uso con la mia Nikon Coolpix 5200. Le attuali fotocamere digitali trasferiscono le immagini in due modi; come dispositivi di memorizzazione USB e attraverso PTP (Picture Transfer Protocol). La fotocamera è configurata come un dispositivo di memorizzazione di massa; ne discende che la procedura di accesso è identica a quella di una penna USB. Tenere presente che questo potrebbe NON funzionare i tutti i casi e con tutte le fotocamere con supporto USB.

Come verrebbe rilevato un mouse USB? Come un dispositivo HID.

Codice 3.3: Mouse ottico USB

# dmesg | grep USB
drivers/usb/input/hid-core.c: v2.0:USB HID core driver
usb 1-1: new low speed USB device using address 2
input: USB HID v1.10 Mouse [Logitech USB-PS/2 Optical Mouse] on
usb-0000:00:07.2-1

Un altro comando utile per rilevare lo stato delle porte USB è lsusb. Fa parte di sys-apps/usbutils e verrà discusso nella prossima sezione.

4.  USB dal lato utente

Strumenti utili

Fino a questo punto abbiamo visto il supporto per il protocollo USB dal lato kernel/sistema. Ora daremo un'occhiata al supporto offerto da Gentoo all'utente.

Uno degli strumenti più utili è lsusb. Genera un elenco di tutte le periferiche USB connesse al sistema. Installarlo è semplice.

Codice 4.1: Installare usbutils

# emerge usbutils

Una volta installato è sufficiente un lsusb per ottenere le informazioni di base sui dispositivi USB connessi alla macchina.

Nota: È molto probabile che tu debba essere root per eseguire lsusb.

Avvertenza: lsusb rileva le informazioni dei dispositivi USB da /proc/bus/usb. Se non è stato abilitato nel kernel c'è il caso che lsusb non funzioni del tutto. Assicurati di aver abilitato il /proc filesystem nel kernel e che usbfs sia montato in /proc/bus/usb (che dovrebbe accadere automaticamente).

Codice 4.2: lsusb in funzione

# lsusb
(Questa è una penna USB da 512 MB Transcend)
Bus 001 Device 003: ID 0c76:0005 JMTek, LLC. USBdisk
(Questo è il mouse ottico)
Bus 001 Device 002: ID 046d:c00e Logitech, Inc. Optical Mouse
(Questo è l'hub principale o root hub)
Bus 001 Device 001: ID 0000:0000

Se vuoi ottenere più informazioni allora devi eseguire lsusb -v. Provalo e guarda quante informazioni genera. Un'altra opzione comoda di lsusb è la possibilità di generare l'alberatura della gerarchia USB corrente per rendere più semplice l'analisi della mappa dei dispositivi. Il comando è lsusb -t. Per esempio,

Codice 4.3: lsusb mostra la gerarchia USB

# lsusb -t
Bus#  1
`-Dev#   1 Vendor 0x0000 Product 0x0000
  |-Dev#   2 Vendor 0x046d Product 0xc00e
  `-Dev#   3 Vendor 0x0c76 Product 0x0005

Ora puoi confrontare facilmente l'output di lsusb con quello di lsusb -t, per facilitare eventuali debug o per comprendere meglio il funzionamento di USB.

5.  Ringraziamenti...

Riferimenti

Durante la stesura di questa guida sono stato aiutato da diversi documenti trovati online e alcuni di essi, pur essendo molto tecnici, sono veramente interessanti. Penso che meritino il giusto credito.

Altri link interessanti



Stampa

Aggiornato il 26 dicembre 2011

La versione originale di questo documento non è più mantenuta

Oggetto: Questo documento offre una guida per implementare il supporto USB sotto Gentoo Linux e per la configurazione delle periferiche USB.

Shyam Mani
Autore

Massimo Canali
Traduzione

Cristiano Chiucchiolo
Revisione

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.