Eine wichtige Bemerkung gleich am Anfang: Verwenden Sie niemals
setserial
mit Laptops (PCMCIA).
Mit Hilfe des Programms setserial
können Sie dem Gerätetreiber
die I/O-Adresse des seriellen Ports mitteilen, auf welchen Interrupt
(IRQ) die Hardware des Ports eingestellt ist, über welchen UART Typ
Sie verfügen, etc. Das Programm kann Ihnen auch die aktuellen
Einstellungen anzeigen. Zusätzlich kann es die Hardware prüfen, wenn
bestimmte Optionen angegeben werden. Informationen über die Anwendung
von setserial
in Ihrer Distribution finden Sie mit
man setserial
sowie in den Info-Seiten unter /usr/doc/setserial.../
(o.ä.).
setserial
wird oft beim Systemstart durch ein Start-Skript
aufgerufen. Es wird nur funktionieren, wenn das entsprechende
Kernel-Modul geladen ist. Sollten Sie aus irgendeinem Grund das Modul
zu einem späteren Zeitpunkt wieder aus dem Speicher entfernen, gehen
vorgenommene Änderungen wieder verloren. In diesem Fall müssen Sie
setserial
nochmals aufrufen. Neben dem Aufruf durch ein
Start-Skript wird setserial
aufgerufen, wenn das Kernel-Modul
geladen wird.
Mit Hilfe entsprechender Optionen kann setserial
den seriellen
Port zu Testzwecken an einer bestimmten I/O-Adresse ansprechen
(engl.: »Probing«). Allerdings müssen Sie die I/O-Adresse wissen oder raten.
Wenn Sie z.B. /dev/ttyS2
angeben, wird die I/O-Adresse
angesprochen, von der setserial
annimmt, dass sie dem Port
/dev/ttyS2
zugeordnet ist (»0x2F8«).
Wenn Sie setserial
mitteilen, dass sich ttyS2
an einer anderen
Adresse befinden, wird es versuchen, diese andere Adresse
anzusprechen.
setserial
konfiguriert weder IRQs noch I/O-Adressen auf der Hardware
des seriellen Ports. Sie müssen setserial
genau die Werte mitteilen,
auf die die Hardware mittels Jumper oder Plug-and-Play eingestellt
ist. Verwenden Sie für setserial
keinerlei aus der Luft gegriffenen
Werte. Wenn Sie aber die I/O-Adresse wissen, aber nicht den Wert für
den IRQ, können Sie versuchen, mit Hilfe von setserial
den IRQ zu
bestimmen.
Sie können sich eine Liste der möglichen Befehle für setserial
ausgeben lassen, indem Sie einfach setserial
ohne weitere
Argumente eingeben (mit Ausnahme der Optionen, die nur aus einem
Buchstaben bestehen, wie z.B. »-v«, die Sie bei der Fehlersuche
verwenden sollten). Beachten Sie, dass setserial
für eine I/O-Adresse
die Bezeichnung »port« verwendet. Wenn Sie eingeben:
setserial -g /dev/ttyS*
sehen Sie einige Informationen über die Konfiguration des
Gerätetreibers für Ihre Ports. Mit der Option »-gv« erhalten Sie noch
mehr Informationen. Aber die Ausgabe verrät Ihnen nicht, ob die
Hardware auch wirklich auf die angezeigten Werte konfiguriert ist. Sie
können setserial
aufrufen und eine rein fiktive I/O-Adresse,
irgendeinen IRQ und einen beliebigen UART-Typ zuweisen. Wenn Sie
setserial das nächste mal aufrufen, wird es diese falschen Werte
anstandslos ausgeben. Beachten Sie, dass Wertzuweisungen verlorengehen,
wenn der PC ausgeschaltet wird, daher wird setserial automatisch beim
Start von Linux aufgerufen.
Um herauszufinden, ob eine bestimmte serielle Hardware installiert
ist, müssen Sie zunächst die I/O-Adresse wissen bzw. raten. Um die
vorhandene Hardware anzusprechen, können Sie den Befehl setserial
mit der Option »-v« und dem Parameter »autoconfigure«
verwenden. Wenn die Bildschirmausgabe einen UART Typ wie z.B. 16550A
anzeigt, ist alles in Ordnung. Wenn statt dessen »unknown« für den
UART Typ angezeigt wird, ist wahrscheinlich überhaupt kein serieller
Port an der angegebenen I/O-Adresse. Einige Billig-UART Typen
identifizieren sich nicht korrekt; wenn Sie »unknown« sehen,
besteht also noch eine geringe Chance, dass Sie dennoch einen
seriellen Port installiert haben.
Neben dem UART-Typ kann setserial
auch versuchen, den IRQ
herauszufinden, aber auch das funktioniert nicht immer einwandfrei. In
Programmversionen >= 2.15 kann das Ergebniss des zuletzt
durchgeführten Tests gespeichert und in der Konfigurationsdatei
/etc/serial.conf
abgelegt werden, die beim nächsten Start von
Linux gelesen wird. Das Skript, welches setserial
beim Booten
startet, führt üblicherweise kein Probing durch, aber das können Sie
ändern. Weitere Informationen dazu finden Sie im nächsten Abschnitt.
Wenn der Kernel das Modul mit dem Gerätetreiber für die serielle
Schnittstelle lädt (bzw. wenn der Gerätetreiber fest
zum Kernel hinzugebunden wurde), werden nur die Devices
ttyS0
bis ttyS3
automatisch gefunden und der Treiber wird auf die IRQs 4 und 3
konfiguriert (unabhängig davon, auf welche Werte die Hardware
eingestellt ist). Sie erkennen das an den Meldungen, die beim
Systemstart ausgegeben werden, es sieht so aus, als ob setserial
gestartet worden wäre. Wenn Sie drei oder mehr Ports verwenden,
können sich Probleme ergeben, falls ein IRQ von mehr als einem Port
genutzt wird.
Um diese oder ähnliche Problem zu lösen, muss setserial
ein zweites Mal
aufgerufen werden, diesmal allerdings mit den richtigen Werten für die
IRQs. Eines der Skripte, die beim Systemstart ausgeführt werden,
ist genau dafür zuständig. Dieser zweite Aufruf von setserial
muss möglichst früh während des Boot-Vorgangs erfolgen,
noch bevor irgendein anderer Prozess versucht, den seriellen
Port zu verwenden. Eigentlich sollte bei Ihrer Linux Distribution
bereits alles so eingestellt sein, dass setserial
beim
Start von Linux automatisch aufgerufen wird. Unter /usr/doc/
bzw.
/usr/share/doc/
sollten Sie
Informationen finden, was speziell bei Ihrer Distribution eingestellt
ist und wie Sie diese Einstellungen ggf. verändern können.
Bis zur Programmversion 2.14 wurde setserial
konfiguriert,
indem das Shell-Skript mit dem Aufruf von setserial
editiert
wurde; oft war dies die Datei /etc/rc.d/rc.serial
.
Ab der Version 2.15 liest dieses Shell-Skript die Konfigurationsdaten
für setserial
aus der Datei /etc/serial.conf
.
Aber selbst diese Datei muss nicht mehr manuell editiert werden,
normalerweise bewirkt die Verwendung von setserial
auf der
Befehlszeile, dass /etc/serial.conf
automatisch
entsprechend angepasst wird.
Die Absicht dahinter ist natürlich, es Ihnen so einfach wie möglich zu
machen: Sie müssen keine Dateien editieren, und setserial
wird
bei jedem Start von Linux automatisch für eine richtige Konfiguration sorgen.
Aber es gibt dennoch einige Fallstricke: Zum Einen ist es nicht
setserial
selbst, welches die Konfiguration in
/etc/serial.conf
schreibt. Zum Anderen können sich
unterschiedliche Distributionen unterschiedlich verhalten. Und
schließlich können Sie dieses Verhalten auch noch beeinflussen.
Häufig passiert etwa folgendes: Wenn Sie ihren PC herunterfahren, wird
das Skript, welches setserial
beim Systemstart aufgerufen hat,
nochmals ausgeführt, diesmal allerdings auf andere Weise. Beim
Herunterfahren des Systems werden nur die Teile des Skripts
durchlaufen, die für den Shutdown verantwortlich sind.
Das Skript sorgt nun dafür, dass setserial
aufgerufen wird, um
die aktuellen Einstellungen zu ermitteln, die dann in
/etc/serial.conf
gespeichert werden. Wenn Sie also
setserial
aufrufen, werden die Änderungen nicht sofort in
/etc/serial.conf
gespeichert, sondern dann und nur dann, wenn
Sie einen normalen Shutdown durchführen.
Sie können sich sicher schon vorstellen, welche Probleme
auftreten können. Vielleicht haben sie keinen richtigen Shutdown
durchgeführt (z.B. den PC einfach ausgeschaltet). Oder Sie haben ein
wenig mit setserial
experimentiert und vergessen, beim letzten
Aufruf die richtigen Werte anzugeben. Dann werden Ihre
»experimentellen« Werte gespeichert.
Wenn Sie dagegen /etc/serial.conf
manuell editieren, werden
diese Einstellungen beim Shutdown mit den aktuellen Einstellungen von
setserial
überschrieben. Es gibt eine Möglichkeit, um zu
verhindern, dass /etc/serial.conf
beim Shutdown angepasst
wird. Dazu muss die erste Zeile von /etc/serial.conf
,
»###AUTOSAVE###«, entfernt werden. Von mindestens einer Distribution
ist bekannt, dass diese erste Zeile automatisch beim ersten
Shutdown unmittelbar nach der Installation gelöscht wird. Hoffentlich
enthält /etc/serial.conf
in Ihrer Distribution genügend
Kommentare, die Ihnen weiterhelfen.
Das Skript, welches setserial
beim Systemstart aufruft, ist in
den meisten Fällen /etc/init.d/setserial
(Debian) oder
/etc/init.d/serial
(Redhat), es sollte aber nicht editiert
werden. Bei Redhat 6.0 muss die Datei
/usr/doc/setserial-2.15/rc.serial
nach /etc/init.d/
kopiert werden, wenn setserial
beim Booten ausgeführt werden
soll.
Um einen Port zu deaktivieren, können Sie ihn mithilfe von
setserial
auf »uart none« setzen.
Das Format der Konfigurationsdatei /etc/serial.conf
stimmt
mit dem Format überein, mit dem die Parameter für setserial
auf
der Befehlszeile angegeben werden. Für jeden Port wird eine Zeile
verwendet.
Seit Juli 1999 gibt es einen bekannten Fehler: Mit der »###AUTOSAVE###«-Funktion werden nur diejenigen Parameter gesichert, die mit dem Aufruf von
setserial -g /dev/ttyS?
angezeigt werden (das »?« steht dabei für 0, 1, 2, ...). Die anderen Parameter
werden nicht abgespeichert (wird setserial
mit der Option »a«
aufgerufen, werden alle Parameter angezeigt). Von diesem Fehler werden
nur wenige Anwender betroffen sein, weil diese Parameter nur
selten verändert werden müssen und die Standardeinstellung in den
meisten Fällen richtig ist. Der Fehler ist schon länger bekannt und
evtl. inzwischen behoben.
Um die aktuellen, von setserial
eingestellten Werte in der
Konfigurationsdatei /etc/serial.conf
zu speichern,
ohne dass ein Shutdown ausgeführt wird, können Sie das Skript
aufrufen, welches sonst beim Shutdown aufgerufen wird:
/etc/init.d/{set}serial stop
. Die »stop« Option
speichert die aktuelle Konfiguration, aber die seriellen Ports
arbeiten ohne Unterbrechung weiter.
Vor der Programmversion 2.15 (1999) gab es keine
/etc/setserial.conf
-Datei. Daher war es notwendig,
dasjenige Skript zu finden, welches beim Booten setserial
aufruft und es anzupassen. Wenn ein solches Skript nicht
vorhanden ist, müssen Sie eine neue Skript-Datei schreiben
oder die entsprechenden Befehle in ein anderes Skript
einfügen, welches während der Boot-Phase sehr früh ausgeführt
wird. Wenn dieses Skript exisitiert, befindet es sich
wahrscheinlich irgendwo im etc
Verzeichnisbaum. Bei Redhat
< 6.0 befindet sich eine Datei unter
/usr/doc/setserial
, die Sie jedoch zuerst unter
etc
kopieren müssen. Um ein passendes Skript zu finden,
können Sie locate
verwenden, z.B. können Sie dazu folgendes
eingeben:
locate "*serial*"
Früher wurde üblicherweise das Skript
/etc/rc.d/rc.serial
verwendet. Die Debian-Distribution
verwendete /etc/rc.boot/0setserial
. Eine andere häufig
verwendete Datei war /etc/rc.d/rc.local
, allerdings
sollte diese Datei nicht editiert werden, da sie eventuell nicht
früh genug ausgeführt wird. Es ist bekannt, dass andere
Prozesse veruchen können, auf den seriellen Port zuzugreifen,
noch bevor rc.local
aufgerufen wurde. Die Folge ist ein
Fehler bei der seriellen Kommunikation.
Falls ein solches Skript mitgeliefert wird, sollte es eine Reihe von
auskommentierten Beispielen enthalten. Durch entfernen der
Kommentarzeichen und/oder Änderung dieser Beispiele sollte es einfach
möglich sein, eine richtige Konfiguration zu erreichen. Stellen Sie
sicher, dass Sie den richtigen vollständigen Pfadnamen für
setserial
und die richtigen Namen für die Gerätedateien angeben.
Sie können die Änderungen testen, indem Sie das Skript von der
Kommandozeile aus aufrufen (als User »root«). Das geht schneller, als
das System wiederholt zu booten.
Wenn sie wollen, dass setserial
automatisch den UART-Typ und den
IRQ für das Device ttyS3
bestimmt, können sie etwa folgendes
eingeben:
/sbin/setserial /dev/ttyS3 auto_irq skip_test autoconfig
Wiederholen Sie diese Anweisung für jeden seriellen Port, der automatisch konfiguriert werden soll. Es muss auf jeden Fall ein Device-Name angegeben werden, der auf Ihrem System auch wirklich vorhanden ist. In einigen Fällen wird dieser Befehl nicht funktionieren (bei bestimmter Hardware); wenn Sie den UART-Typ und den IRQ kennen, können Sie diese Werte auch explizit zuweisen:
/sbin/setserial /dev/ttyS3 irq 5 uart 16550A skip_test
In der Standardkonfiguration teilen sich ttyS0
und ttyS2
den IRQ 4, während sich ttyS1
und ttyS3
IRQ 3 teilen. Aber
das gemeinsame Verwenden eines Interrupts für die seriellen Ports ist
nicht erlaubt, es sei denn, Sie haben 1. einen Kernel 2.2 oder höher,
und Sie haben 2. die entsprechende Kernelfunktion auch einkompiliert
und 3. die Hardware Ihrer seriellen Ports unterstützt die gemeinsame
Nutzung von Interrupts. Weitere Informationen hierzu finden Sie im
Kapitel
Gemeinsame Nutzung von Interrupts ab Kernel 2.2.
Wenn Sie ein internes Modem installieren, sich aber die Ports
ttyS0
und ttyS1
erhalten möchten, dann sollten Sie
versuchen, einen nicht verwendeten IRQ zu finden und diesen sowohl auf
dem seriellen Port (bzw. der Modem-Karte) einzustellen, als auch
mithilfe von setserial
diesen IRQ dem Gerätetreiber zuzuweisen.
Wenn IRQ 5 nicht für Ihre Soundkarte verwendet wird, kann er für das
Modem genutzt werden. Um die Hardware auf diesen IRQ einzustellen,
können Sie isapnp
verwenden, oder ein PnP BIOS, oder Sie machen
aus Linux ein PnP-fähiges Betriebssystem. Um herauszufinden, welche
freien IRQs es auf Ihrem System gibt, können Sie in der
Online-Dokumentation (Manual Page) von setserial
z.B. nach »IRQ 11«
suchen.
isapnp
ist ein Programm, um Plug-and-Play Geräte auf dem ISA
Bus zu konfigurieren, dazu gehören auch interne Modems. Es ist im
Paket »isapnptools« enthalten und enthält als weiteres Programm
pnpdump
. pnpdump
findet alle ISA PnP Geräte und zeigt die
erforderliche Konfiguration in einem Format an, welches direkt in die
PnP Konfigurationsdatei /etc/isapnp.conf
eingetragen werden
kann. Mit der Option »--dumpregs« kann es auch verwendet werden, um
die aktuelle I/O-Adresse und den IRQ des vom Modem verwendeten
seriellen Ports zu bestimmen. Der isapnp
-Befehl kann auch von
einem Start-Skript aufgerufen werden, so dass er bei jedem Start des
Computers ausgeführt wird, um die ISA PnP Geräte richtig zu
konfigurieren, selbst wenn das BIOS Ihres PCs kein PnP unterstützt.
Weitere Informationen finden Sie im Plug-and-Play HOWTO.
wvdialconf
versucht zu bestimmen, an welchem seriellen Port
ein Modem angeschlossen ist. Es erzeugt auch eine Konfiguration für
das Programm wvdial
, das verwendet werden kann, um auf einfache
Weise eine PPP-Verbindung mit einem Internet Service Provider (ISP)
herzustellen. Sie brauchen aber PPP nicht zu installieren, um
wvdialconf
zu verwenden. Es kann nur Modems finden, die gerade
keine Telefonverbindung haben. Es kann ebenfalls eine »passende«
Initialisierungssequenz konstruieren, das funktioniert aber nicht
in jedem Fall. Da dieser Befehl über keine Optionen verfügt, ist er
einfach anzuwenden, aber Sie müssen einen Dateinnamen angeben, unter
dem der Init-String und andere Daten gespeichert werden, z.B.:
wvdialconf mein_dateiname
stty
ähnelt setserial
, aber es setzt die Baud-Rate und
andere Parameter eines seriellen Ports. Der Befehl
stty -a < /dev/ttyS2
sollte anzeigen, wie ttyS2
konfiguriert ist. Die
meisten Einstellungen betreffen Parameter, die Sie mit Modems niemals
nutzen werden (z.B. bestimmte Einstellungen, die nur für alte
Terminals aus den 70er Jahren verwendet wurden). Aber stty
ist
manchmal hilfreich, um Fehler zu finden.
Zwei der Einstellungen, die mit stty
konfiguriert werden können
sind: 1. die Hardware-Flusskontrolle durch »crtscts« und 2. ob das
DCD-Signal des Modems ignoriert wird (»clocal«). Wenn das Modem kein
DCD-Signal sendet und clocal deaktiviert ist (stty
zeigt
»-clocal«), dann kann ein Programm eventuell den seriellen Port nicht
öffnen. Wenn der Port nicht geöffnet werden kann, reagiert das
Programm u.U. nicht mehr, weil es (oft vergeblich) auf ein DCD-Signal
des Modems wartet.
minicom
setzt clocal automatisch beim Start, hier sind also keine
Probleme zu erwarten. Aber die Version 6.0.192 von kermit
hängt
sich beim Befehl set line...
auf, wenn -clocal gesetzt ist. Wenn
kein DCD Signal anliegt und -clocal gesetzt ist, hängt selbst
stty
und es gibt anscheinend keine Möglichkeit, um clocal zu
setzen (ausser minicom
zu starten). Aber wenn minicom
beendet wird, werden die ursprünglichen Einstellungen wieder
hergestellt. Ein Ausweg besteht darin, mit Hilfe von minicom
den
Befehl AT&C
zum Modem zu senden (um das DCD Signal zu erzeugen)
und minicom
ohne Reset zu beenden, so dass das DCD Signal
erhalten bleibt. Dann kann erneut stty
aufgerufen werden.