Inhaltsverzeichnis
Zusammenfassung
In diesem Kapitel wird weiterführendes Hintergrundwissen zum Druckerbetrieb geliefert. Das Nachvollziehen der Beispiele ermöglicht eine Einsicht in die Zusammenhänge beim Druckerbetrieb. Es dient dazu, Lösungen für spezielle Anwendungsfälle zu finden.
Der Anschluss eines Druckers an ein Linux-System erfolgt in der Regel über eine parallele Schnittstelle. Ein Drucker an einer parallelen Schnittstelle wird über das parport-Subsystem des Kernels angesprochen. Die grundlegende Konfiguration einer parallelen Schnittstelle mit YaST ist im Abschnitt 5.3.4. “Manuelle Konfiguration” erläutert, daher sollen hier nur einige weitergehende Informationen vorgestellt werden.
Dem parport-Subsystem sind die parallelen Schnittstellen durch Laden architekturspezifischer Kernelmodule bekannt zu machen. So können mehrere, in Kette geschaltete Geräte (zum Beispiel ein Parallelport-ZIP-Laufwerk und ein Drucker) über eine parallele Schnittstelle gleichzeitig bedient werden. Die Zählung der Gerätedateien für Parallelport-Drucker beginnt bei /dev/lp0. Um über die erste parallele Schnittstelle drucken zu können, müssen beim SUSE Standardkernel die Module parport, parport_pc und lp geladen werden. Dies erledigt der kmod Kernel Module Loader in der Regel automatisch, sobald auf die Gerätedatei (zum Beispiel /dev/lp0) zum ersten Mal zugegriffen wird.
Wenn das Kernelmodul parport_pc ohne spezielle Parameter geladen wird, versucht es, die parallelen Schnittstellen automatisch zu erkennen und zu konfigurieren. In seltenen Fällen funktioniert das nicht und es kann zum plötzlichen Systemstillstand kommen. Dann müssen die korrekten Parameter für das parport_pc Modul explizit manuell konfiguriert werden. Deswegen kann, wie im Abschnitt 5.3. “Drucker einrichten mit YaST” beschrieben, die automatische Druckererkennung bei YaST verhindert werden.
Die parallele Schnittstelle /dev/lp0 wird durch einen Eintrag in /etc/modules.conf konfiguriert (Datei 6.1. “/etc/modules.conf: Erste parallele Schnittstelle”).
Beispiel 6.1. /etc/modules.conf: Erste parallele Schnittstelle
alias parport_lowlevel parport_pc options parport_pc io=0x378 irq=none
Bei io steht die IO-Adresse der parallelen Schnittstelle. Bei irq steht none als Voreinstellung für den Polling-Betrieb oder der Interrupt der parallelen Schnittstelle. Der Polling-Betrieb ist unproblematischer als der Interrupt-Betrieb, da Interrupt-Konflikte vermieden werden. Allerdings gibt es Motherboards und/oder Drucker, die nur im Interrupt-Betrieb korrekt funktionieren. Außerdem ermöglicht der Interrupt-Betrieb, dass der Drucker auch bei hoher Systemlast noch hinreichend Daten erhält.
Damit diese Einstellungen funktionieren, müssen im BIOS oder über die Firmware des Rechners folgende Werte (sofern vorhanden) für die parallele Schnittstelle eingestellt sein:
IO-Adresse 378 (hexadezimal)
Interrupt 7 (im Polling-Betrieb nicht relevant)
Modus Normal, SPP oder Output-Only (andere Modi funktionieren nicht immer)
DMA ist abgeschaltet (sollte im Modus Normal abgeschaltet sein)
Wenn der Interrupt 7 noch frei ist, dann kann mit dem Eintrag in der Datei 6.2. “ /etc/modules.conf: Interrupt-Betrieb für die erste parallele Schnittstelle ” der Interrupt-Betrieb aktiviert werden.
Beispiel 6.2. /etc/modules.conf: Interrupt-Betrieb für die erste parallele Schnittstelle
alias parport_lowlevel parport_pc options parport_pc io=0x378 irq=7
Bevor der Interrupt-Betrieb aktiviert wird, ist der Datei /proc/interrupts zu entnehmen, welche Interrupts bereits verwendet werden, wobei hier nur die Interrupts angezeigt werden, die momentan in Gebrauch sind. Dies kann sich je nach aktiv benutzter Hardware ändern. Der Interrupt für die parallele Schnittstelle darf nicht anderweitig in Gebrauch sein. Im Zweifel ist der Polling-Betrieb zu nehmen.
Nach einem Reboot steht die parallele Schnittstelle zur Verfügung. Statt eines Reboots genügt es, als Benutzer root die Liste der Abhängigkeiten der Kernelmodule zu aktualisieren, die Kernelmodule, die die parallele Schnittstelle betreffen, zu entladen…
depmod -a 2>/dev/null rmmod lp rmmod parport_pc rmmod parport
…und wieder neu zu laden:
modprobe parport modprobe parport_pc modprobe lp
Ist der Drucker in der Lage, ASCII-Text zu drucken, sollte man als Benutzer root mit folgendem Befehl eine Seite mit dem Wort Hello ausdrucken können:
echo -en "\rHello\r\f" >/dev/lp0
Hierbei ist das Wort Hello passend für einen Ausdruck umgeben von dem ASCII-Zeichen \r für Wagenrücklauf und gefolgt von dem ASCII-Zeichen \f das einen Seitenvorschub auslöst.
Im BIOS des Rechners muss ein Interrupt für USB aktiviert sein. Bei einem Award-BIOS ist dazu im Menü der Eintrag auf Enabled zu setzen. Je nach BIOS-Version werden auch andere Bezeichnungen verwendet.
Testen Sie, ob der USB-Drucker ansprechbar ist, indem Sie als Benutzer root eingeben:
echo -en "\rHello\r\f" >/dev/usb/lp0
Vorausgesetzt, es ist nur ein einziger USB-Drucker angeschlossen und dieser Drucker kann ASCII-Text drucken, sollte eine Seite mit dem Wort Hello ausgegeben werden.
Manche USB-Drucker brauchen eine spezielle Steuersequenz, bevor Daten über USB angenommen werden. Informationen hierzu finden sich auch in der Support-Datenbank http://sdb.suse.de/de/sdb/html unter dem Stichwort Epson und usb.
Normalerweise sollte Hersteller und Produktbezeichnung des Druckers in der Ausgabe des folgenden Kommandos erscheinen:
cat /proc/bus/usb/devices
Wenn hier weder Hersteller noch Produkt angezeigt werden, hat das normalerweise folgende Ursachen:
Das USB-System hat das Gerät (noch) nicht erkannt – evtl. weil der USB-Drucker ausgeschaltet ist. Der USB-Drucker kann dann nicht angesprochen werden.
Das USB-System hat zwar das Gerät erkannt, aber es kennt weder Hersteller- noch Produktbezeichnung des Druckers und zeigt daher nichts an. Der USB-Drucker kann dann aber angesprochen werden.
Manchmal kommt es vor, dass der USB-Drucker nicht mehr angesprochen werden kann, zum Beispiel wenn man während eines Ausdrucks den USB-Stecker abzieht. Zumeist sollte es genügen, diese Befehle zu verwenden, um das USB-System neu zu starten:
rchotplug stop rchotplug start
Wenn das nicht hilft, müssen alle Prozesse, die auf /dev/usb/lp0 zugreifen, beendet und die Kernelmodule, die den USB-Drucker betreffen, entladen und wieder neu geladen werden. Prüfen Sie vorher mit lsmod, welche USB-Module geladen sind (ob usb-uhci oder usb-ohci oder uhci) und ob noch weitere Modul-Abhängigkeiten bestehen; folgende Anzeige besagt, dass das Modul usbcore noch von den Modulen printer und usb-uhci benötigt wird:
usbcore ... [printer usb-uhci]
Daher müssen in diesem Fall die Module printer und usb-uhci vor dem Modul usbcore entladen werden. Geben Sie als Benutzer root folgende Befehle ein (anstelle von usb-uhci je nach System auch uhci oder usb-ohci):
fuser -k /dev/usb/lp0 rchotplug stop rmmod printer rmmod usb-uhci umount usbdevfs rmmod usbcore modprobe usbcore mount usbdevfs modprobe usb-uhci modprobe printer rchotplug start
Sind mehrere USB-Drucker angeschlossen, ist Folgendes zu beachten: Das USB-Subsystem erkennt angeschlossene USB-Drucker automatisch. Der erste USB-Drucker, der erkannt wird, ist über das Device /dev/usb/lp0 ansprechbar. Der zweite USB-Drucker, der erkannt wird, ist über das Device /dev/usb/lp1 ansprechbar. Je nach Druckermodell werden ausgeschaltete Drucker trotzdem noch automatisch erkannt oder nicht. Das liegt daran, dass manche Drucker auch im ausgeschalteten Zustand noch über den USB-Anschluss abgefragt werden können. Um ein Durcheinander der USB-Devices zu vermeiden, sollten vor dem Booten von Linux immer alle USB-Drucker eingeschaltet sein und während des Betriebs möglichst eingeschaltet bleiben.
Es wird eine parallele Schnittstelle über die Infrarotverbindung emuliert. Der Treiber im Linuxkernel stellt eine simulierte parallele Schnittstelle unter dem Device /dev/irlpt0 zur Verfügung. Ein Drucker über die Infrarotschnittstelle wird also genauso angesprochen wie ein Drucker am Parallelport, nur dass /dev/irlpt0 statt /dev/lp0 verwendet wird.
Testen Sie, ob der IrDA-Drucker ansprechbar ist, indem Sie als Benutzer root eingeben:
echo -en "\rHello\r\f" >/dev/irlpt0
Vorausgesetzt, der Drucker kann ASCII-Text drucken, sollte eine Seite mit dem Wort Hello ausgegeben werden.
In jedem Fall sollte der Drucker in der Ausgabe des folgenden Kommandos irdadump erscheinen. Gibt es den irdadump-Befehl nicht, dann ist das irda zu installieren. Wenn bei irdadump der Drucker nicht angezeigt wird, kann er nicht angesprochen werden. Wird hier überhaupt nichts angezeigt, dann ist wahrscheinlich der IrDA-Systemdienst nicht gestartet, denn dieser wird nicht automatisch beim Booten gestartet. Der IrDA-Systemdienst kann mit folgenden Kommandos gestartet und gestoppt werden:
rcirda start rcirda stop
Wie ein Drucker an der seriellen Schnittstelle betrieben werden kann, ist für den LPRng-Spooler im LPRng-Howto unter file:/usr/share/doc/packages/lprng/LPRng-HOWTO.html und dort insbesondere unter file:/usr/share/doc/packages/lprng/LPRng-HOWTO.html#SECSERIAL und in der Manualpage von printcap beschrieben. Informationen finden sich auch in der Support-Datenbank unter dem Stichwort seriell.