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.
Esempio 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.
|
Esempio 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
Nota:
Dalla versione 2005.0, Gentoo Linux usa il 2.6 come kernel predefinito. A meno
che tu non stia usando il profilo con il kernel 2.4, gentoo-sources
offre un kernel 2.6 per la maggior parte delle architetture. Verifica
quindi la versione del tuo kernel e regolati di conseguenza per la
configurazione.
|
In primo luogo emergi 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.
Esempio 3: Procurarsi i sorgenti del kernel |
# emerge gentoo-sources
|
Procediamo ora con la configurazione del kernel.
Esempio 4: 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 i kernel 2.6.x
Ora vedremo alcune delle opzioni che andranno abilitate durante la
configurazione di un kernel 2.6 per supportare le nostre periferiche USB. Se
stai usando un kernel 2.4, vai alla sezione Opzioni
di configurazione per i kernel 2.4.x.
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.
|
Esempio 5: make menuconfig: opzioni per i kernel 2.6 |
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 Mass Storage Write-Protected Media Detection (EXPERIMENTAL)
--- USB Input Devices
<*> USB Human Interface Device (full HID) support
[*] HID input layer 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)
|
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).
Opzioni di configurazione per i kernel 2.4.x
Ora vedremo alcune delle opzioni che andranno abilitate durante la
configurazione di un kernel 2.4 per supportare le nostre periferiche USB. Se
stai usando un kernel 2.6, vai alla sezione Opzioni
di configurazione per i kernel 2.6.x.
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.
|
Esempio 6: make menuconfig: opzioni per i kernel 2.6 |
Input core support --->
<*> Input core support
< > Keyboard support
< > Mouse support
< > Event interface support
USB support --->
<*> Support for USB
[*] Preliminary USB device filesystem
--- USB Host Controller Drivers
<*> UHCI Alternate Driver (JE) support
< > OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support
--- USB Device Class drivers
< > USB Audio support
<*> USB Mass Storage support
< > USB Modem (CDC ACM) support
<*> USB Printer support
--- USB Human Interface Devices (HID)
<*> USB Human Interface Device (full HID) support
[*] HID input layer support
USB Serial Converter support --->
<*> USB Serial Converter support
<*> USB Prolific 2303 Single Port Serial Driver (NEW)
|
Terminata la configurazione, puoi (ri)compilare il kernel e il supporto USB
dovrebbe essere attivo dopo un reboot.
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.
|
Esempio 7: 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.
Esempio 8: 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.
Si tenga 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.
Esempio 9: 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 è una sciocchezza.
Esempio 10: 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.
|
Attenzione:
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).
|
Esempio 11: 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,
Esempio 12: 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.
Hot plug o Cold plug??
Gentoo usa due pacchetti, sys-apps/hotplug e sys-apps/coldplug,
per gestire dispositivi installabili a caldo. Dietro le quinte di
questa magia informatica si cela una logica abbastanza semplice. Cercheremo ora
di capire di cosa si tratta e durante la spiegazione cercheremo anche di
conoscere meglio questi due pacchetti.
Possiamo definire il firmware come un software su un dispositivo hardware che
viene caricato ed eseguito ma che non può essere modificato con facilità.
Molti dispositivi hanno un firmware che ne assicura il corretto funzionamento
e spesso il firmware contiene codice vitale per l'hardware. Il firmware è
presente in un'ampia gamma di dispositivi, dalla ROM alle schede USB e
PCMCIA. Quando una periferica viene installata, il firmware (in alcuni casi
può trattarsi anche del driver) viene letto e caricato in memoria e soltanto
in un secondo momento la periferica può essere usata dal sistema.
Per farla breve, Gentoo utilizza sys-apps/hotplug per gestire, dal lato
firmware, le periferiche installabili a caldo. sys-apps/hotplug
userà il firmware richiesto per far funzionare una determinata periferica. Il
firmware dovrebbe trovarsi in /lib/firmware ed è da lì che viene
prelevato. Installare hotplug è semplice, basta emergerlo.
Esempio 13: Installare hotplug |
# emerge hotplug
|
La domanda più ovvia ora è, cos'è coldplug e perchè è necessario?
sys-apps/coldplug fa le stesse cose di hotplug ma le fa per dispositivi
installabili a caldo che sono già connessi durante il boot. Ad esempio
una scheda di rete USB. Prima hotplug si occupava di entrambe le situazioni ma
poi è stato diviso in hotplug e coldplug, con coldplug che si fa carico di
tutto il lavoro. Devi emergerlo se hai dispositivi installabili a caldo
che devono essere attivati durante il boot.
Esempio 14: Installare coldplug |
# emerge coldplug
# rc-update add coldplug boot
* coldplug added to runlevel boot
* rc-update complete.
|
Nota:
Lo script di inizializzazione riportato qui sopra fa le stesse cose che faceva
quello di hotplug (per dispositivi già connessi). Lo script
/etc/init.d/hotplug non fa altro che verificare che
CONFIG_HOTPLUG sia abilitato a funzionare con il kernel corrente.
|
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
|