USB e Gentoo Linux
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 |
+ -------- 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 |
# lspci -v | grep USB
0000:00:04.2 USB Controller: Intel Corp. 82371AB/EB/MB PIIX4 USB (rev 01)
(prog-if 00 [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 --->
--- SCSI support type (disk, tape, CD-ROM)
<*> SCSI disk support
USB support --->
<*> Support for Host-side USB
[*] USB device filesystem
--- USB Host Controller Drivers
<*> EHCI HCD (USB 2.0) support
< > OHCI HCD support
<*> UHCI HCD (most Intel and VIA) support
< > USB Modem (CDC ACM) support
<*> USB Printer support
<*> USB Mass Storage support
USB Network Adapters --->
<*> USB RTL8150 based ethernet device support (EXPERIMENTAL)
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 |
# dmesg | less
usb 1-1: new full speed USB device using uhci_hcd and address 2
scsi0 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 2
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 sda: 1003600 512-byte hdwr sectors (514 MB)
sda: Write Protect is off
sda: Mode Sense: 0b 00 00 08
sda: assuming drive cache: write through
SCSI device sda: 1003600 512-byte hdwr sectors (514 MB)
/dev/scsi/host0/bus0/target0/lun0: p1
Attached scsi removable disk sda 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
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/sda1 /mnt/usb
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda8 9.4G 7.5G 1.9G 80% /
/dev/hda9 11G 8.1G 2.4G 78% /usr
none 189M 0 189M 0% /dev/shm
/dev/sda1 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
Bus 001 Device 003: ID 0c76:0005 JMTek, LLC. USBdisk
Bus 001 Device 002: ID 046d:c00e Logitech, Inc. Optical Mouse
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
I contenuti di questo documento sono rilasciati sotto la licenza Creative
Commons - Attribution / Share Alike.
|