Serielle PCI-Karte unter Linux (OpenSuse)

Da neuere Computer oft keine oder zu wenige serielle Schnittstellen haben, ist man entweder auf den Einbau einer PCI-Karte mit seriellen Schnittstellen oer auf den Kauf eines USB-Seriell-Kabels angewiesen. Das USB-Seriell-Kabel ist für "normale" Nutzung des seriellen Anschlusses gut geeignet. Eine Nutzung zur Übertragung von Programmierdaten zur Programmierung von Atmel Microcontrollern ist mit diesen Kabeln nicht zu empfehlen. Ausserdem braucht man, wenn man zusätzlich RS232 braucht, schon mal zwei Kabel... Bleibt die Alternative PCI-Karte. Diese werden typischerweise sauber vom Standard-Linux-Kernel erkannt. Im folgenden beschreibe ich die etwas holprige Inbetriebnahme meiner Billigkarte, die ich für 15 Euro bei www.pollin.de bezogen habe. Diese Karte besitzt einen NetMos 9835 Chip. Dieser kann von Linux angesprochen werden. Sie besitzt zwei serielle Schnittstellen.

Wenn die Karte eingebaut wurde, kann man in /var/log/boot (neuer: /var/log/boot.msg) oder auch in der Ausgabe von dmesg nach dem String "tty" suchen, bei mir kam nach dem Einbau der Karte folgende Ausgabe:

socraggio:/home/dennis # grep tty /var/log/boot.msg
<6>[    0.000102] console [tty0] enabled
<6>[    0.652034] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
<6>[    0.652421] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
<6>[    0.652743] 0000:05:00.0: ttyS4 at I/O 0xd000 (irq = 20) is a 16550A
<6>[    0.652854] 0000:05:00.0: ttyS5 at I/O 0xd100 (irq = 20) is a 16550A


Die erste erkannte Schnittstelle (ttyS0) ist die des Motherboards. Diese habe ich über ein Slotblech von aussen erreichbar gemacht, denn das Gigabyte-Motherboard hat hierfür keinen Stecker mehr, sondern nur einen "Header", also einen 10-poligen Anschluss auf dem Board. An diesen kann man dann einen Stecker, der in einem Slotblech montiert ist und mit einem passenden Kabel geliefert wird, anschliessen. Achtung, es gibt Kabel mit unterschiedlichen Belegungen. Bei meinem Board wird eine 1:1 Belegung verlangt. Das Slotblech+Kabel habe ich bei www.conrad.de für ca. 5 Euro erstanden. Genaueres zu diesem Slotblech habe ich hier beschrieben.

Auf den PCI-Seriell-Karten werkelt ein Chip, der typischerweise zum 16550-Chip kompatibel ist. Meine serielle Schnittstelle hat 2 serielle Ports, die als ttyS4 und ttyS5 eingebunden werden.

Die PCI-Karte sollte nun mittels "lspci" zu finden sein. In folgender Ausgabe weiß der Kernel nichts mit der Karte anzufangen:

lspci -v
....
04:01.0 Class Class ffff: Illegal Vendor ID Unknown device ffff (rev ff) (prog-if ff)
        !!! Unknown header type 7f
...

Ich wechsle den PCI-Port und entferne eine überflüssige Soundkarte. Zunächst gibts noch Probleme, die Karte wird nur zum Teil erkannt:

lspci -v
...
04:01.0 Serial controller: NetMos Technology PCI 9835 Multi-I/O Controller (rev ff) (prog-if ff)
        !!! Unknown header type 7f
...
Ich update das File /usr/share/pci.ids. Unter OpenSuse geht dies mittels update-pciids.

Dann geht es:

lspci -v
...
04:01.0 Serial controller: NetMos Technology PCI 9835 Multi-I/O Controller (rev 01) (prog-if 02 [16550])
        Subsystem: LSI Logic / Symbios Logic 2S (16C550 UART)
        Flags: medium devsel, IRQ 19
        I/O ports at d500 [size=8]
        I/O ports at d600 [size=8]
        I/O ports at d700 [size=8]
        I/O ports at d800 [size=8]
        I/O ports at d900 [size=8]
        I/O ports at da00 [size=16]
...

Danach kann man über /dev/ttyS* die Ports ganz normal ansprechen. Ich hänge an das ttyS1 den AVR Programmer und an das ttyS2 den RS232 Anschluss des AVR Experimentierboards.

Das RS232-Kabel muss bei der Verbindung mit einem AVR-Microcontroller  wie folgt beschaltet werden:
Pin 2 - RxD <-> Pin 2 RxD
Pin 3 - TxD <-> Pin 3 TxD
Pin 5 - Gnd <-> Pin 5 Gnd
also kein Kreuzkabel, sondern eine 1:1-Verbindung.

Nutzung von kermit

Mittels kermit (http://www.columbia.edu/kermit, unter OpenSuse 11.0 per YasT installierbar, ab 11.1 muß man sich das Paket woanders beschaffen, z.B. hier: http://fr2.rpmfind.net//linux/RPM/opensuse/11.1/x86_64/ckermit-8.0.211-95.58.x86_64.html) kann man nun mit dem Board kommunizieren. Kermit hatte ich zuletzt etwa 1995 verwendet, der Methusalem läuft aber immer noch...
Ich habe übrigens auch minicom probiert, die seltsame Oberfläche hat mich aber vertrieben.

Die Initialisierung von Kermit kann man per Hand machen oder auch in der Datei ~/.kermrc:

dennis@soc:~> cat .kermrc
set line /dev/ttyS2
set speed 19200
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5

Mir gelingt es bisher nicht das BREAK-Signal in der Kermit-Session zu senden, was aber zu verschmerzen ist.

Mit OpenSuse 11.3 gibt es beim unbedarften Start von kermit eine Fehlermeldung der Art
"/var/lock
Sorry, write access to UUCP lockfile directory denied."
Dies ist ein Rechteproblem, das Verzeichnis /var/lock gehört User root und Gruppe root. Vermutlich kann man kermit dazu überreden, keinen Lock erzeugen zu wollen o.ä. Ich habe mir es einfach gemacht und die Situation mittels "chown -R root:users /var/lock" geklärt.