Installation einer USB-Komponente am Beispiel einer Digitalkamera
Vorwort
Dieser kleine Artikel richtet sich vornehmlich an bereits fortgeschrittene Linux-Anwender, die sich mit dem Laden von Modulen und deren Kompilieren auskennen. Betrachtet wird übrigens nur der Kernel 2.4. Im Kernel 2.2 ist USB-Unterstützung erst seit Version 2.2.18 vorhanden. Allerdings kann man auch älteren Versionen durch einen Patch zu einem USB-Stack verhelfen, der fast auf dem aktuellen Stand von 2.4.x ist. Die meisten Distributionen haben diesen Patch bereits integriert.
Vorbereitung
Als erstes wird das mitgelieferte USB-Adapterkabel zur Kamera an den ersten USB-Slot gesteckt und mit der Kamera verbunden.
Kernel-Konfiguration und -Erstellung
Danach wechselt man in das Verzeichnis, wo sich die Kernel-Quellen befinden (normalerweise /usr/src/linux) und gibt make xconfig
oder make menuconfig
ein. Es wird das bekannte Menü gestartet, welches sich für die Konfiguration des Kernels und seiner Module verantwortlich zeigt. Man klickt auf den Eintrag und schon klappt das Fenster auf. Folgende Optionen müssen auf jeden Fall aktiviert werden:
- "Support for USB" (Je nach Wahl als Modul oder direkt in den Kernel. Ich empfehle die Umsetzung in ein Modul)
- "USB verbose debug messages" (Hiermit werden alle vom Kernel generierten Meldungen ausführlicher angezeigt, wenn auch manchmal etwas kryptisch)
- "Preliminary USB device filesystem" (Hiermit kann man später Zugriff auf die entsprechenden Gerätedateien erlangen)
Die nachfolgenden Optionen stellen die Art des USB-Controllers ein. Je nach Motherboard sind diese unterschiedlich. Ich empfehle alle zu aktivieren, also "UHCI" und "OHCI". Als nächstes folgen die entsprechenden Geräte, welche angeschlossen werden sollen. In unserem Beispiel wählen wir die Option
aus, da dies das Modul für unsere Kamera erzeugt. Je nach Gerät differiert natürlich die Wahl.Danach speichern wir die Konfiguration ab und geben ein:
make dep make modules make modules_install
Wenn man die USB-Unterstützung direkt in den Kernel kompiliert haben möchte (je nach Auswahl, siehe oben), dann muß man zusätzlich noch make bzImage
eingeben und das Kernel-Image kopieren, anschließend LILO ausführen (wer einen andern Bootloader verwendet, muß natürlich die entsprechenden Schritte ausführen) und den Computer neu starten. (Siehe auch diesen Pro-Linux-Artikel zur Kernel-Compilierung.) Bei der Variante, in der nur Module erzeugt werden, ist das nicht notwendig.
Laden und Einrichten des Treibers
Laden der Module
Nun kontrollieren wir mit der Eingabe von dmesg
, ob alles funktioniert. Dann werden die Module geladen. Als erstes laden wir die allgemeine USB-Unterstützung:
insmod usbcore
Als nächstes folgt dann der USB-Typ. Je nach Mainboard unterscheidet sich das Modul. Das gängigste wird wohl usb-uhci sein:
insmod usb-uhci
Als letztes laden wir dann den Treiber für unsere Kamera. Bei Scannern oder anderen Geräten nennt sich das Modul natürlich anders. Bereits an dieser Stelle sollten wir die Kamera auf Connect stellen, damit der Kernel mit der Kamera kommunizieren kann und weiß, was sich am Ende der Leitung befindet.
insmod dc2xx
Meldungen im Syslog
Nun kontrollieren wir mit der Eingabe von dmesg
, ob alles funktioniert. Es sollte etwas ähnlich folgender Meldung erscheinen:
usb-uhci.c: $Revision: 1.239 $ time 18:44:25 Nov 3 2000 usb-uhci.c: High bandwidth mode enabled usb-uhci.c: USB UHCI at I/O 0x1080, IRQ 11 usb-uhci.c: Detected 2 ports usb.c: new USB bus registered, assigned bus number 1 usb.c: kmalloc IF c3bbbec0, numif 1 usb.c: new device strings: Mfr=0, Product=2, SerialNumber=1 usb.c: USB device number 1 default language ID 0x0 Product: USB UHCI Root Hub SerialNumber: 1080 hub.c: USB hub found hub.c: 2 ports detected hub.c: standalone hub hub.c: ganged power switching hub.c: global over-current protection hub.c: power on to power good time: 2ms hub.c: hub controller current requirement: 0mA hub.c: port removable status: RR hub.c: local power source is good hub.c: no over-current condition exists hub.c: enabling power on all ports usb.c: hub driver claimed interface c3bbbec0 hub.c: port 1 connection change hub.c: port 1, portstatus 101, change 1, 12 Mb/s hub.c: port 1, portstatus 103, change 0, 12 Mb/s hub.c: USB new device connect on bus1/1, assigned device number 2 usb.c: kmalloc IF c3bbbf20, numif 1 usb.c: new device strings: Mfr=1, Product=2, SerialNumber=0 usb.c: USB device number 2 default language ID 0x409 Manufacturer: Eastman Kodak Company Product: KODAK DC280 Zoom Digital Camera usb.c: unhandled interfaces on device usb.c: USB device 2 (vend/prod 0x40a/0x130) is not claimed by any active driver. Length = 18 DescriptorType = 01 USB version = 1.00 Vendor:Product = 040a:0130 MaxPacketSize0 = 8 NumConfigurations = 1 Device version = 1.01 Device Class:SubClass:Protocol = 00:00:00 Per-interface classes Configuration: bLength = 9 bDescriptorType = 02 wTotalLength = 0020 bNumInterfaces = 01 bConfigurationValue = 01 iConfiguration = 00 bmAttributes = 40 MaxPower = 2mA Interface: 0 Alternate Setting: 0 bLength = 9 bDescriptorType = 04 bInterfaceNumber = 00 bAlternateSetting = 00 bNumEndpoints = 02 bInterface Class:SubClass:Protocol = ff:00:00 iInterface = 00 Endpoint: bLength = 7 bDescriptorType = 05 bEndpointAddress = 01 (out) bmAttributes = 02 (Bulk) wMaxPacketSize = 0040 bInterval = 00 Endpoint: bLength = 7 bDescriptorType = 05 bEndpointAddress = 82 (in) bmAttributes = 02 (Bulk) wMaxPacketSize = 0040 bInterval = 00 usb.c: registered new driver dc2xx dc2xx.c: USB Camera #0 connected usb.c: dc2xx driver claimed interface c3bbbf20 hub.c: port 1 connection change hub.c: port 1, portstatus 100, change 3, 12 Mb/s usb.c: USB disconnect on device 2 dc2xx.c: USB Camera #0 disconnected hub.c: port 1 enable change, status 100
USB-Dateisystem
Damit sind wir noch nicht am Ende angelangt. Als nächstes müssen wir das USB-Dateisystem mounten. (Siehe auch Kernel-Dokumentation, meistens zu finden unter /usr/src/linux/Documentation). Das geschieht mit folgendem Eintrag in die Datei /etc/fstab:
none /proc/bus/usb usbdevfs defaults,noauto 0 0
Die Option noauto sorgt erstmal dafür, daß das USB-Dateisystem nicht bei jedem Boot gemountet wird. usbdevfs gibt den Typ an, und /proc/bus/usb ist das Verzeichnis, wo alle relevanten Daten erscheinen.
Mit der Eingabe von mount /proc/bus/usb
wird nun das USB-Dateisystem gemountet.
Folgender Befehl gibt uns dann Informationen über die angeschlossenen Geräte aus:
cat /proc/bus/usb/devices
Dieser Befehl gibt uns Informationen zu den geladenen USB-Modulen aus:
cat /proc/bus/usb/drivers