USB

Der Trend bei neueren Motherboards und bei vielen Notebooks geht weg von parallelen und seriellen Schnittstellen, hin zu USB. Apples aktuelle Modelle, wie zum Beispiel der iMac, stellen sogar zur Tastatur und Maus die Verbindung über den USB-Bus her.

Der USB Support im Linux-Kernel ist noch ziemlich neu, Sie sollten auf alle Fälle den aktuellsten Kernel benutzen, den Sie bekommen können. USB Support wurde mit der Kernel-Version 2.2.7 eingeführt, wir empfehlen jedoch mindestens einen Kernel der 2.4.xer Serie zu benutzen, da die Implementation in den 2.2.xer Kernels schon recht alt ist. Wenn Sie dennoch einen 2.2.xer Kernel verwenden wollen, sollten Sie auf jeden Fall den USB-Teil aus den 2.4.xer Kernel übernehmen. Ein angepaßtes Paket finden Sie unter: http://www.suse.cz/development/usb-backport/.

An der USB-Implementation wird momentan noch sehr viel verändert, so daß es passieren kann, daß Teile dieser Dokumentation nicht ganz dem aktuellen Stand entsprechen. Lassen Sie sich davon nicht abschrecken, und nehmen Sie diesen Abschnitt als Leitfaden. Abweichend von Debian GNU/Linux 2.2, welches den Kernel 2.2 verwendet, gehen wir hier auf den Kernel in der Version 2.4.0-test4 und höher ein. Gerade im Bereich USB ist hier viel in Bewegung und ein Blick in die neueste Version lohnt sich fast immer.

Kernel-Konfiguration

Um USB nutzen zu können, müssen Sie einen neuen Kernel übersetzen. Am einfachsten benutzen Sie dazu make menuconfig auf der Console oder make xconfig, wenn Sie unter X11 arbeiten.

USB Kernel Konfiguration

Aktivieren Sie zunächst den allgemeinen USB Support und wählen Sie dann entweder UHCI (wenn Sie ein Intel PIIX4, VIA oder ähnliches Chipset benutzen) oder OHCI-HCD (bei Compaq-Rechnern, iMacs, OPTi, SiS, ALi usw.) aus. Dies ist von dem verwendeten Motherboard abhängig, eventuell hilft auch ein Blick in das Handbuch zu Ihrem Motherboard. Sie können auch versuchen, das USB Chipset in der Ausgabe des Kommandos cat /proc/pci zu finden. Wenn es sich um eine kurze Angabe (wie etwa: i/o at 0xe400) handelt, wählen Sie UHCI, wenn die Ausgabe länger ist (etwa: 32 bit memory at 0xee000000), dann wählen Sie OHCI. Wenn Sie sich nicht sicher sind, probieren Sie einfach beide nacheinander aus.

Damit haben Sie die grundsätzliche USB-Unterstützung aktiviert. Sie müssen nun noch entscheiden, für welche Gerätegruppen Sie Treiber benötigen. Sie können hier frei wählen, ob Sie die Treiber fest in den Kernel einbinden wollen oder lieber Module verwenden möchten. USB Hubs werden automatisch erkannt, dies müssen Sie nicht extra aktivieren.

Folgende Treiber stehen Ihnen zur Verfügung:

Übersetzen Sie nun den Kernel und ggf. auch die Module neu und starten Sie das System mit dem neuen Kernel.

Wenn Sie sich entschieden haben, Module zu benutzen, müssen Sie diese laden. Sie benötigen mindestens die Module usbcore.o und entweder usb-uhci.o oder usb-ohci-hcd.o. Weiterhin müssen Sie die gewünschten Treiber, also beispielsweise scanner.o oder printer.o laden.

Wenn Sie UHCI und einen externen USB-Hub benutzen, werden Sie in etwa folgendes in der Datei /var/log/syslog sehen:

 .......
 Jul 19 20:46:02 rachel kernel: USB HID boot protocol mouse registered.
 .......
 Jul 19 20:46:02 rachel kernel: uhci_control_thread at c01b8c5c
 Jul 19 20:46:02 rachel kernel: New bus registered
 Jul 19 20:46:02 rachel kernel: USB hub driver registered
 Jul 19 20:46:02 rachel kernel: uhci_connect_change: called for 0
 .......
 Jul 19 20:46:02 rachel kernel: USB hub found
 Jul 19 20:46:02 rachel kernel: hub: 4-ports detected
 Jul 19 20:46:02 rachel kernel: hub: individual port power switching
 Jul 19 20:46:02 rachel kernel: hub: standalone hub
 Jul 19 20:46:02 rachel kernel: hub: individual port over current protection
 Jul 19 20:46:02 rachel kernel: hub: power on to power good time: 100ms
 Jul 19 20:46:02 rachel kernel: hub: hub controller current requirement: 100mA
 Jul 19 20:46:02 rachel kernel: hub:  port 1 is removable
 Jul 19 20:46:02 rachel kernel: hub:  port 2 is removable
 Jul 19 20:46:02 rachel kernel: hub:  port 3 is removable
 Jul 19 20:46:02 rachel kernel: hub:  port 4 is removable
 Jul 19 20:46:02 rachel kernel: hub: local power source is good
 Jul 19 20:46:02 rachel kernel: hub: no over current condition exists
 Jul 19 20:46:02 rachel kernel: enabling power on all ports
 Jul 19 20:46:02 rachel kernel: uhci_connect_change: called for 1
 .......
 Jul 19 20:46:02 rachel kernel: hub: port 3 connection change
 .......
Hier noch ein Beispiel von einem Apple iMac, bei dem die Tastatur und die Maus über den USB Port angeschlossen sind.

PCI: Probing PCI hardware
USB: kernel-interface.c:107: Universal USB Driver v$Revision: 1.53 $
USB-OHCI: driver.c:898: USB Open Host Controller Interface Driver
USB-OHCI: driver.c:758: Host controller found at PCI bus 0 dev 20 fn 0
USB-OHCI: driver.c:564: Disabling OHCI legacy support on controller 0xc5fbd020
USB-OHCI: driver.c:843: Host Controller 0xc5fe0e00 (0) at PCI bus 0 dev 20 fn 0 initialized
USB-OHCI: driver.c:844: IRQ 28
USB: kernel-interface.c:154: 1 USB host found
USB-HUBD: driver.c:105: UUSBD Hub Driver v$Revision: 1.33 $
USB-HIDBP: driver.c:90: USB HID Boot Protocol Driver v$Revision: 1.5 $
adb devices:

.....

USB-HUBM: khubdd.c:468: Starting khubdd (pid 2)
USB-HUBM: hubm-stch.c:678: Device attachment detected on port 0 of hub 0xc5fe0e20 (0 -1)
hdc: ATAPI 1X CD-ROM drive, 4224kB Cache
Uniform CDROM driver Revision: 2.52
scsi0 : MESH
scsi : 1 host.
USBD: usbd-descr.c:1108: Device id 0x80d59b8 (0 1) at port 0, hub (0 -1): (no information available)
USBD: usbd-descr.c:777: Processing USB device 0xc5fbdec0 (0 1), configuration index 0
USBD: usbd-descr.c:399: Processing interface 0, alternate setting 0
USBD: usbd-drv.c:331: Considering driver 0xc5fe4400 `USB HID Boot Protocol Driver v$Revision: 1.5 $', weight 0
USBD: usbd-drv.c:331: Considering driver 0xc5fe4360 `UUSBD Hub Driver v$Revision: 1.33 $', weight 4
USB-HUBM: hubm-stch.c:678: Device attachment detected on port 0 of hub 0xc5fa6000 (0 1)
USBD: usbd-descr.c:1100: Device id 0xc3e494bb (0 2) at port 0, hub (0 1): Alps Electric M2452
USBD: usbd-descr.c:777: Processing USB device 0xc5fa6120 (0 2) 'M2452', configuration index 0
USBD: usbd-descr.c:673: Unknown descriptor type 0x21 from device 0xc5fa6120 (0 2)'s configuration 1 descriptor block at offset 0x12
USBD: usbd-descr.c:399: Processing interface 0, alternate setting 0
USBD: usbd-drv.c:331: Considering driver 0xc5fe4400 `USB HID Boot Protocol Driver v$Revision: 1.5 $', weight 6
USBD: usbd-drv.c:331: Considering driver 0xc5fe4360 `UUSBD Hub Driver v$Revision: 1.33 $', weight 0
USB-HIDBP: cfg.c:110: Interface 0 of device (0 2) supports HID Keyboard Boot Protocol
USB-HUBM: hubm-stch.c:678: Device attachment detected on port 2 of hub 0xc5fa6000 (0 1)
USBD: usbd-descr.c:1100: Device id 0x6411c61a (0 3) at port 2, hub (0 1): Logitech M4848
USBD: usbd-descr.c:777: Processing USB device 0xc5fa6360 (0 3) 'M4848', configuration index 0
USBD: usbd-descr.c:673: Unknown descriptor type 0x21 from device 0xc5fa6360 (0 3)'s configuration 1 descriptor block at offset 0x12
USBD: usbd-descr.c:399: Processing interface 0, alternate setting 0
USBD: usbd-drv.c:331: Considering driver 0xc5fe4400 `USB HID Boot Protocol Driver v$Revision: 1.5 $', weight 6
USBD: usbd-drv.c:331: Considering driver 0xc5fe4360 `UUSBD Hub Driver v$Revision: 1.33 $', weight 0
USB-HIDBP: cfg.c:139: Interface 0 of device (0 3) supports HID Boot Protocol Mouse
Wenn Sie keinerlei Einträge finden, die beim Laden der Treiber auf USB-Geräte hindeuten, so probieren Sie einen anderen Treiber (UHCI statt OHCI-HCD oder umgekehrt), prüfen Sie, ob USB-Geräte angeschlossen sind, und sehen Sie im BIOS nach, ob die USB-Unterstützung aktiviert ist.

USB-Device-Dateisystem

Das USB-Device-Dateisystem wird wie das /proc-Dateisystem dynamisch generiert. Sie können dieses Dateisystem an jeder beliebigen Stelle mounten, üblicherweise geschieht dies unter /proc/bus/usb. Dieses Verzeichnis wird automatisch vom Linux-Kernel erzeugt, wenn die USB-Unterstützung aktiviert wurde. Wenn Sie das USB-Device-Dateisystem an anderer Stelle im Dateisystem mounten möchten, kann es unter Umständen zu Problemen mit Programmen kommen, die das Dateisystem unterhalb von /proc/bus/usb erwarten.

Um dieses Dateisystem zu aktivieren, müssen Sie die Option „Preliminary USB Device Filesystem“ sowie das /proc-Dateisystem aktivieren.

Um dieses Dateisystem zu mounten, benötigen Sie Superuser-Rechte (root). Mit dem Kommando
mount -t usbdevfs none /proc/bus/usb
können Sie dies temporär bis zum nächsten Systemstart benutzen.

Um dies nicht nach jedem Neustart des Systems wiederholen zu müssen, sollten Sie folgenden Eintrag in die Datei /etc/fstab aufnehmen:
none            /proc/bus/usb             usbdevfs        defaults   0   0
Hierbei ist zu beachten, daß dieser Eintrag nach dem Eintrag für das /proc, Dateisystem stehen muß, da das USB-Device-Dateisystem unterhalb von diesem gemountet wird.

Sehen Sie sich nun einmal den Inhalt dieses Dateisystems an:
 dr-xr-xr-x   1 root     root            0 Jan 26 10:40 001
 -r--r--r--   1 root     root            0 Jan 26 10:40 devices
 -r--r--r--   1 root     root            0 Jan 26 10:40 drivers

Human Interface Device (HID)-Konfiguration

Der Linux-Kernel unterstützt vier verschiedene Gerätetypen über das HID Interface: Tastaturen, Mäuse, Joysticks und eine generische Schnittstelle.

HID Maus-Konfiguration

Zunächst müssen Sie die (USB-) Mausunterstützung im Kernel aktiviert haben. Weiterhin ist es nützlich, wenn Sie die Option Mix all Mice into one device aktivieren, es werden dann alle angeschlossenen USB-Mäuse zu einem Gerät zusammengefaßt. Wenn Sie die Treiber als Module erzeugt haben, laden Sie die Module hid.o, input.o und mousedev.o.

Wenn Sie nun die Maus einstecken, sollte diese vom Kernel erkannt werden. Sie können dies in der Datei /var/log/syslog prüfen. Weiterhin sollten Sie in der Datei /proc/interrupts einen Eintrag finden, der sich auf USB bezieht. Klicken Sie ein paarmal mit der Maus, und Sie können in dieser Datei verfolgen, daß dies Interrupts auslöst. Erstellen Sie nun ein Verzeichnis unterhalb von /dev/ eine Gerätedatei für die Maus, eventuell ist diese aber auch schon vorhanden:
mkdir /dev/usb
mknod /dev/usb/usbmouse0 c 10 32
Wenn Sie nun das Kommando cat /dev/usb/usbmouse0 aufrufen und dann die Maus bewegen, sollten Sie viele wilde Zeichen sehen. Brechen Sie das Kommando mit CTRL+C ab.

Wenn bis hierhin Ihre Tests erfolgreich waren, können Sie die Maus auch im praktischen Einsatz erproben. Um die Maus auf der Konsole mit gpm zu benutzen, starten Sie gpm wie folgt: gpm -m /dev/usb/usbmouse0 -t imps2. Sie können gpm auch dauerhaft zur Benutzung der USB-Maus überreden, indem Sie die entsprechenden Änderungen in der Datei /etc/gpm.conf aufnehmen oder das Programm gpmconfig benutzen.

Wenn Sie die USB-Maus auch unter X benutzen möchten, verändern Sie den Abschnitt „Mouse“ in der Datei /etx/X11/XF86Config wie folgt:

      Section "Xinput"
         SubSection "Mouse"
              DeviceName   "USB Mouse"
              Protocol     "IMPS/2"
              Port         "/dev/usb/usbmouse0"
              AlwaysCore
         EndSubSection
      EndSection
und starten Sie den X-Server neu.

HID Tastatur-Konfiguration

Wenn Sie eine USB-Tastatur an einer i386-Architektur benutzen, so wird dies bereits vom BIOS unterstützt. Hierzu muß die Tastatur am HUB auf dem Motherboard angeschlossen sein. Es schadet aber auch nicht, wenn Sie dies trotzdem im Kernel aktivieren. Auf der PowerPC-Plattform müssen Sie dies in jedem Fall im Kernel aktivieren.

Wenn Sie Module benutzen, laden Sie die Module: hid.o, input.o und keybdev.o.

Wenn Sie einige Zeichen auf der Tastatur tippen, sehen Sie in der Datei /proc/interrupts, wie die Interrupts zu der USB-Tastatur hochgezählt werden. Auch in der Datei /var/log/syslog sollten Sie beim Einstecken der Tastatur einige Informationen finden.

Beachten Sie, daß Sie beim Systemstart die Tastatur nur benutzen können, wenn das BIOS dies unterstützt, zu dieser Zeit ist der Linux-Kernel noch nicht geladen. Wenn das BIOS Ihres Systems dies nicht unterstützt, können Sie keine Kernel-Parameter übergeben oder ein alternatives Kernel-Image auswählen.

HID Joystick- und Gamepad-Konfiguration

Wenn Sie die USB-Joystick-Unterstützung aktivieren, funktionieren Ihre normalen Joysticks nicht mehr. Wenn Sie Module verwenden, laden Sie die Module: hid.o, input.o und joydev.o.

Wie schon bei der USB-Maus müssen Sie auch für die USB-Joystick-Unterstützung entsprechende Gerätedateien erzeugen:

 mknod /dev/usb/usbjs0 c 15 0
 mknod /dev/usb/usbjs1 c 15 1
 mknod /dev/usb/usbjs2 c 15 2
 mknod /dev/usb/usbjs3 c 15 3
Mit dem Kommando: cat /dev/usb/usbjs0 werden nun bei jeder Aktion mit dem Joystick Zeichen auf dem Bildschirm ausgegeben. Sie können nun den Joystick in allen Spielen nutzen, die dies auch unterstützen.

Scanner-Konfiguration

Der USB Scanner-Treiber arbeitet mit allen USB Scannern zusammen. Um aber sinnvoll damit arbeiten zu können, muß auch für SANE ein entsprechender Treiber vorhanden sein.

Wenn Ihr Scanner nicht automatisch einem passenden Treiber zugeordnet wird, sollten Sie die Treiber als Module erzeugen und die Hersteller und Produkt-ID von Hand den Modulen übergeben (alternativ können Sie auch die Sourcen ändern). Das Kommando hierzu lautet: insmod scanner.o vendor=0xXXXX product=0xYYYY, ersetzen Sie XXXX mit der hexadezimalen Hersteller-ID und YYYY mit der Produkt-ID.

Auch hier müssen Sie wieder Gerätedateien anlegen:

 mknod /dev/usb/usbscanner0 c 180 48
 chmod a+rw /dev/usb/usbscanner0
Um die Gerätedatei und damit den Scanner benutzen zu können, benötigen Sie noch ein entsprechendes Programm. Unter GNU/Linux ist das Programm der Wahl hierbei SANE. Wenn Sie beispielsweise einen HP Scanner benutzen, müssen Sie die Datei /etc/sane.d/hp.conf so verändern, daß diese nur folgendes enthält:

 /dev/usb/usbscanner0
   option connect-device
Sie sollten nun den Scanner nutzen können.

Modem-Konfiguration

Um mit dem Linux USB-Modem Treiber zu funktionieren, müssen die angeschlossenen Geräte (Analog-Modems oder ISDN) der CDC (Communication Device Class)-Spezifikation entsprechen.

Die benötigten Gerätedateien erzeugen Sie mit folgenden Kommandos:

 mknod /dev/usb/ttyACM0 c 166 0
 mknod /dev/usb/ttyACM1 c 166 1
 mknod /dev/usb/ttyACM2 c 166 2
 mknod /dev/usb/ttyACM3 c 166 3
Sie können bis zu 32 solcher Gerätedateien anlegen. Sie können nun mit jeder Software auf das Modem zugreifen.

Drucker-Konfiguration

Auch für einen USB-Drucker müssen Sie eine Gerätedatei erzeugen:

 mknod /dev/usb/usblp0 c 180 0
Ändern Sie nun die Gerätedatei in der Datei /etc/printcap, und Sie können den Drucker mit den üblichen Programmen ansprechen.

USB / Serielle Konfiguration

Der serielle Treiber arbeitet momentan mit Geräten der Hersteller Belkin, Peracom und Connect Tech zusammen. Es werden bis zu 8 serielle Geräte unterstützt, auch dafür müssen Sie Gerätedateien anlegen:

 mknod /dev/usb/ttyUSB0 c 188 0
 mknod /dev/usb/ttyUSB1 c 188 1
 mknod /dev/usb/ttyUSB2 c 188 2
 mknod /dev/usb/ttyUSB3 c 188 3
 mknod /dev/usb/ttyUSB4 c 188 4
 mknod /dev/usb/ttyUSB5 c 188 5
 mknod /dev/usb/ttyUSB6 c 188 6
 mknod /dev/usb/ttyUSB7 c 188 7
Sie können dann auf diese Geräte wie auf normale serielle Geräte zugreifen.

CPiA Kamera-Konfiguration

Dieser Treiber unterstützt einen Chipsatz der Firma Vision, der in einer Reihe von Kameras zu finden ist, beispielsweise in der Creative WebCamII. Um diesen Treiber benutzen zu können, müssen Sie auch die „Video for Linux“-Unterstützung (zu finden unter „Character Devices“ in der Kernel-Konfiguration) im Kernel aktivieren.

Auch dieser Treiber benötigt eine Gerätedatei:

 mknod /dev/video0 c 81 0
 ln -s /dev/video0 /dev/video
Um diese Hardware zu betreiben ist w3cam von Rasca Gmelch geeignet. Sie finden dies unter der URL: http://www.hdk-berlin.de/~rasca/w3cam/. Wenn Sie bereits eine TV-Karte in Ihrem Rechner installiert haben, können Sie für die ersten Versuche auch das Programm xawtv benutzen, hierbei müssen Sie auf der Kommandozeile die entsprechende Gerätedatei angeben (zum Beispiel: xawtv -c /dev/video1). Weiterhin ist es nötig, die Fenstergröße auf die Auflösung der Kamera anzupassen.

OV511 Kamera-Konfiguration

Dieser Treiber unterstützt ein Chipset der Firma OmniVision, welches zum Beispiel in der Creative WebCam III oder der Lenco MVC 95998 benutzt wird. Auch dieser Treiber benötigt die „Video for Linux“-Unterstützung und eine Gerätedatei:

 mknod /dev/video0 c 81 0
 ln -s /dev/video0 /dev/video
Sie können die gleichen Programme wie schon beschrieben nutzen.

Massenspeicher-Konfiguration

Dieser Treiber kann mit einer Vielzahl von Geräten benutzt werden. Dies kommt daher, daß eine Verbindung zum SCSI-Treiber im Kernel hergestellt wird, Sie müssen daher auch den SCSI Support im Kernel aktivieren. Sie können dann auf USB-Diskettenlaufwerke, Zip-Laufwerke, LS120-Laufwerke und USB CD-ROMs zugreifen.

Wenn Sie die entsprechenden Module geladen haben, sollte in der Datei /proc/scsi/scsi das Gerät aufgeführt sein.

Sie können nun in der Datei /etc/fstab für die verschiedenen Geräte folgende Eintrage vornehmen, um einfach darauf zugreifen zu können. Bitte beachten Sie, daß Sie, wenn Sie über weitere SCSI-Geräte verfügen, den Eintrag /dev/sda anpassen müssen.

Für ein Diskettenlaufwerk:

 /dev/sda    /mnt/usbfd       auto            noauto,user 0   0
Für ein Zip-Laufwerk:

 /dev/sda    /mnt/usbzip      vfat            noauto,user 0   0
Für ein CD-ROM:

 /dev/sda    /mnt/usbcdrom    iso9660         ro,noauto,user 0   0
und für eine Festplatte:

 /dev/sda    /mnt/usbhd       ext2            defaults   1   2