Serielle und parallele PCI-Karte unter Linux (OpenSuse)

Page content

Neuere Computer haben oft weder serielle noch parallele Anschlüsse.

Zum Teil kann man sich mit Kabel behelfen, die USB auf den passenden Port umsetzen.

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. Außerdem braucht man, wenn man zusätzlich RS232 braucht, schon mal zwei Kabel…

Bleibt die Alternative PCI-Karte. Diese gibts für seriell, parallel und gemischt. Sie bieten z.B. 1-4 serielle Anschlüße oder 1 seriellen und 1 parallelen Anschluß. Die PCI-Karten werden typischerweise sauber vom Standard-Linux-Kernel erkannt. möglicherweise gibt es mittlerweile auch PCIe-Karten, habe dies aber nicht untersucht.

Im folgenden beschreibe ich die etwas holprige Inbetriebnahme meiner Billigkarte, die ich für 15 Euro bei www.pollin.de bezogen habe. Name: LogiLinkPCI Multi I/O Controller Card. Sie besitzt zwei serielle Schnittstellen.

Diese Karte besitzt einen MosChip 9835 Chip. Dieser kann von Linux angesprochen werden. Viele heutige Chips sind zum Ur-Standard 16550 Chip kompatibel.

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 außen 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, anschließen. 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.

Die Ports der PCI-Karte werden als ttyS4 und ttyS5 eingebunden.

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. In diesem File findet sich nach dem Update folgender Eintrag:

 ...
 9710 NetMos Technology
 9250 PCI-to-PCI bridge [MCS9250]
 9805 PCI 1 port parallel adapter
 9815 PCI 9815 Multi-I/O Controller
 1000 0020 2P0S (2 port parallel adaptor)
 9820 PCI 9820 Multi-I/O Controller
 9835 PCI 9835 Multi-I/O Controller
 1000 0002 2S (16C550 UART)
 1000 0012 1P2S
 9845 PCI 9845 Multi-I/O Controller
 ...

Die 9835 steht also drin und Linux weiß, dass die Karte 16550-kompatibel ist. (Ich habe hier auch noch die NetMos 9845 herumliegen, mit 4 seriellen Ports, die ist wunderbarerweise auch in der pci.ids enthalten).

Nun geht es besser:

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

Ein lspci -vv bringt noch mehr Infos, u.a. den verwendeten Kernel-Treiber (Hinweis: lspci wurde auf einer anderen Maschine ausgeführt, daher leichte Abweichungen zu oben):

...
 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)
 Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
 Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
 Interrupt: pin A routed to IRQ 20
 Region 0: I/O ports at d000 [size=8]
 Region 1: I/O ports at d100 [size=8]
 Region 2: I/O ports at d200 [size=8]
 Region 3: I/O ports at d300 [size=8]
 Region 4: I/O ports at d400 [size=8]
 Region 5: I/O ports at d500 [size=16]
 Kernel driver in use: serial
...

Die Karte wird in voller Schönheit erkannt. Danach kann man über /dev/ttyS* die Ports ganz normal ansprechen. Ich hänge an das ttyS0 den AVR Programmer und an das ttyS4 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.

Parallele PCI-Karte unter Linux

Hier habe ich ebenfalls eine NoName-Karte mit einem NetMos-Chip verwendet. Die Karte beherrscht alle üblichen Betriebsmodi (SPP, EPP, ECP) und wird von Linux ebenfalls sauber erkannt und eingebunden. Mittels dmesg findet man folgende Zeilen:

...
 [ 2.598317] PCI parallel port detected: 9710:9805, I/O at 0xc150(0xc140), IRQ 19
 [ 2.598394] parport0: PC-style at 0xc150 (0xc140), irq 19, using FIFO [PCSPP,TRISTATE,COMPAT,ECP]
 [ 2.681695] ppdev: user-space parallel port driver
 ...

Das Port ist dann unter /dev/parport0 ansprechbar.

Berechtigungen

Für die verwendeten Devices muss der ansprechende Nutzer die passenden Rechte verfügen. Z.B. gehört /dev/parport0 bei mir root und der Gruppe lp. Ich habe daher meinen User der Gruppe lp hinzugefügt. Je nach Linux-Flavour (OpenSuse, Redhat,…) können die Gruppen anders heißen, also selbst nachsehen.

Besonderheit mit kermit: Mit OpenSuse 11.3 (und wohl auch bei neueren Versionen) 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.