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.

Debian installiert in den aktuellen Versionen einen Kernel in der Version 2.4.19 oder höher. Dieser ist im Bezug auf den USB Support auf dem aktuellen Stand und enthält alle notwendigen Module.

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/.

Kernel-Konfiguration

Diesen Abschnitt kann übersprungen werden wenn auf dem System bereits ein aktuelles Debian System mit dem Kernel 2.4.x (ab Debian 3.0, „bf24“) läuft. In jedem Fall ist zur Verwendung von Debian Kernel Paketen zu raten, dort sind alle Module bereits enthalten.

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

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.

Eine weitere Möglichkeit das verwendete USB Chipset zu ermitteln stellt das Kommando lspci zur Verfügung. lspci listet alle vom Bios erkannten PCI Geräte auf. In der ersten Spalte findet sich eine ID mit deren Hilfe sich genauere Informationen zu einzelnen PCI Geräte herausfinden lassen. Hierzu folgendes Beispiel:


sushi:/home/fr# lspci 
00:00.0 Host bridge: Intel Corporation 440BX/ZX - 82443BX/ZX Host bridge (rev 03)
00:01.0 PCI bridge: Intel Corporation 440BX/ZX - 82443BX/ZX AGP bridge (rev 03)
00:07.0 ISA bridge: Intel Corporation 82371AB PIIX4 ISA (rev 02)
00:07.1 IDE interface: Intel Corporation 82371AB PIIX4 IDE (rev 01)
00:07.2 USB Controller: Intel Corporation 82371AB PIIX4 USB (rev 01)
00:07.3 Bridge: Intel Corporation 82371AB PIIX4 ACPI (rev 02)
00:09.0 Ethernet controller: Intel Corporation 82557 [Ethernet Pro 100] (rev 08)
00:0a.0 Multimedia audio controller: Ensoniq ES1371 [AudioPCI-97] (rev 08)
00:0b.0 SCSI storage controller: Symbios Logic Inc. (formerly NCR) 53c810 (rev 23)
01:00.0 VGA compatible controller: ATI Technologies Inc 3D Rage LT Pro AGP-133 (rev dc)

sushi:/home/fr# lspci -v -s 00:07.2
00:07.2 USB Controller: Intel Corporation 82371AB PIIX4 USB (rev 01) (prog-if 00 [UHCI])
	Flags: bus master, medium devsel, latency 64, IRQ 10
	I/O ports at e000 [size=32]


Zunächst werden mittels lspci alle USB Geräte angezeigt und der entsprechende Eintrag für USB ermittelt. Danach wird lspci mit den Optionen -v -s und der entsprechenden ID aufgerufen. Anhand dieser Ausgabe läßt sich ermitteln das es sich bei diesem System um einen UHCI Controller handelt.

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
 .......

Folgendes Beispiel zeigt ein UHCI System mit den USB Treibern des Kernels 2.4.5:


Jul 23 10:54:33 sushi kernel: usb-uhci.c: $Revision: 1.259 $ time 18:23:00 May 27 2001
Jul 23 10:54:33 sushi kernel: usb-uhci.c: High bandwidth mode enabled
Jul 23 10:54:33 sushi kernel: usb-uhci.c: USB UHCI at I/O 0xe000, IRQ 10
Jul 23 10:54:33 sushi kernel: usb-uhci.c: Detected 2 ports
Jul 23 10:54:33 sushi kernel: usb.c: new USB bus registered, assigned bus number 1
Jul 23 10:54:33 sushi kernel: hub.c: USB hub found
Jul 23 10:54:33 sushi kernel: hub.c: 2 ports detected
Jul 23 10:54:33 sushi kernel: usb-uhci.c: v1.251 Georg Acher, Deti Fliegl, Thomas Sailer, Roman Weissgaerber
Jul 23 10:54:33 sushi kernel: usb-uhci.c: USB Universal Host Controller Interface driver
Jul 23 10:54:33 sushi kernel: hub.c: USB new device connect on bus1/2, assigned device number 2
Jul 23 10:54:33 sushi kernel: hub.c: USB hub found
Jul 23 10:54:33 sushi kernel: hub.c: 4 ports detected


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

Auch wenn diese Dateien eine Größe von 0 Byte aufweisen lassen sich mit den üblichen Unix Tools (beispielsweise more, less oder cat) die Informationen in diesen Dateien anzeigen) die Informationen in diesen Dateien anzeigen.

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.


fr@surimi:~$ cat /proc/interrupts 
           CPU0       CPU1       
  0:  150269498  154722102    IO-APIC-edge  timer
  1:     304690     303233    IO-APIC-edge  keyboard
  2:          0          0          XT-PIC  cascade
  9:          0          0    IO-APIC-edge  acpi
 12:    3049906    3085565    IO-APIC-edge  PS/2 Mouse
 14:    8349647    8378011    IO-APIC-edge  ide0
 15:          4          4    IO-APIC-edge  ide1
 16:   12624976   12621964   IO-APIC-level  eth0
 17:   26754608   26755521   IO-APIC-level  es1371
 18:          0          0   IO-APIC-level  bttv
 19:    1728387    1729572   IO-APIC-level  tmscsim, usb-uhci
NMI:  304991583  304991583 
LOC:  304969599  304969534 
ERR:          9

Hier als Beispiel die Daten von einem Dual-Prozessor System.

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.

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 (usb-storage) 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 Einträge 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, dieses Beispiel bezieht sich auf ein System ohne SCSI Hostadapter.

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