Inhalt

8. Interessante Programme, die Sie kennen sollten

8.1 Was ist setserial?

Einführung

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.

Probing

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.

Systemstart-Konfiguration

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.

Eine neue Konfigurationsmöglichkeit unter Verwendung von /etc/serial.conf

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.

Die alte Konfigurationsmethode: Editieren eines Skripts

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

IRQs

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.

8.2 Was ist isapnp?

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.

8.3 Was ist wvdialconf?

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

8.4 Was ist stty?

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.


Inhalt

Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 17:56:55