PCI RS232 minihowto

Door Pascal Schiks (C) 2003 GNU/GPL

Watte ?
De meeste PC's hebben tegenwoordig geen ISA sloten meer.
Waneer je dus je PCtje wilt uitbereiden met een RS232 interface,
dan moet het een PCI kaartje worden.
Helaas zijn die plug en play PCI kaartjes niet zo plug en play als wordt beweerd.
In deze miniHOWTO leg ik uit hoe je de doe boel toch aan de gang kan krijgen.

Legal gelul
Ach je kent het wel he
Alle informatie in deze mini howto pas je op eigen risico toe
Kom dus niet bij me zeuren als het niet werkt of je computer de lucht in vliegt

Ohhh ja.... deze minihowto plaats ik onder de GPL en GNU Licenties.
Als daar nog nooit van gehoord hebt, moet je je schamen.
Hierna word n.l. bij vrijwel elke Open Source Software meegeleverd verwezen.
In het kort komt het er op neer dat je dit document mag kopieren zoveel je wilt.
dat je er ook veranderingen in mag aanbrengen
Maar dat je de naam van de auteur (dat ben ik dus) moet laten staan
Dus niet doen alsof je dit verhaaltje zelf hebt geschreven want,
als je dat kont, had je het vast al gedaan !

Systeem eisen
Tja, een werkend Linux systeem zou wel handig zijn.
En een PCI serieel kaartje lijkt me ook wel handig.
Hoe je dat ding in je PC moet schroeven moet je maar in het boekje opzoeken daar ga ik niet over.
Laat het anders aan je buurjongetje over, die ken dat.
Tenslote zul je waarschijnlijk een wijziging in je kernel config moeten maken.
Dus je moet ten minste de kernel sources hebben geinstaleerd
an alle tools die noodzakelijk zijn om een kernel te maken.
Als je niet weet hoe je zelf een een kernel moet compileren,
dan moet je dat eerst maar eens bekijken.
De hele procedure staat beschreven in de Kernel-HOWTO !
heus het is niet moeilijk !
Ten slotte moeten de utilities lsmod en setserial ook op je systeem staan.
Dit zijn bij Linux echter vrij standaard zaken.

Voor dat je begint let er op dat voor vrijwel alle taken die je moet
uitvoeren je als root moet zijn ingelogd.

Kernel Configureren
Uiteraard heb je support voor PCI ingesteld anders kun je het wel helemaal vergeten.
Minder voor de hand liggend zijn de volgende opties bij de char devices.

[*] Standard/generic (8250/16550 and compatible UARTs) serial support
Let op dat je deze niet als een module laad, maar in het kernel meelinkt.
Dit kan anders problemen opleveren.

[*] Support more than 4 serial ports
Niet zo voor de hand liggend, maar waneer deze optie niet aanstaat zal de driver de de PCI aderessen niet accepteren.

[*] Support for sharing serial interrupts
Dit is eigenlijk wel vrij logisch.
Waneer je een PCI kaartje hebt dat meerdere seriele poorten
(en eventueel nog een parallelle poort) bevat dan zullen die allemaal de zelfde IRQ gebruiken.
de driver moet dus goed opletten waar de interrupt vandaan kwam.
normaal hoeft dat niet omdat er slechts een IRQ per seriele poort gebruikt wordt

Compileer het kernel met deze opties en instaleer op je systeem.
Als dit gelukt is, reboot dan je systeem met het nieuwe kernel.
Let op dat de nieuwe kaart wel herkend wordt, maar dat er nog geen
nieuwe seriele poorten gevonden worden !

Hardware onderzoeken
De volgende stap is uitzoeken welke I/O adderessen je PCI kaartje gebruikt.
Met de opdracht lspci kun je zien welke PCI kaartjes er in je systeem zitten.
Bij mij staat er o.a.:
00:04.0 Serial controller: NetMos Technology 222N-2 I/O Card (2S+1P) (rev 01)
Er kan echter ook zoiets staan als:
00:04.0 Class 0700: 9710:9835 (rev 01)
In dat geval heb je de PCI database niet geactiveerd in je kernel.
Dat is op zich niet erg, want die database heeft verder geen belangrijke functie.
Maar het is effe lastig om uit te zoeken welke kaart nu precies je seriele kaart is.

Nu moet je een paar zaken te weten komen.
n.l.
De ID van je PCI kaartje
Deze eerste kom je te weten mbv de opdracht lspci -n
de al eerder genoemde regel 00:04.0 Class 0700: 9710:9835 (rev 01)
verschijnt dan (naast soortgelijke regels van de andere PCI kaarten
de voledige kaart ID is in dit geval 9710:9835

Het volgende wat je moet weten,
zijn de BASE-I/O adderessen van de seriele poorten.
Die vind je met de opdracht
lspci -v
Het resultaat is zoiets als:
I/O ports at 10e8 [size=8]
I/O ports at 10e0 [size=8]

Mijn kaartje heeft twee seriele poorten dus de rest hoef ik niet te noteren.

Met dezelfde opdracht valt ook het IRQ level te zien.
In mijn geval staat er IRQ 10
Lijkt me duidelijk.

Verder wil je natuurlijk weten op welke ttyS poort de nieuwe poorten moeten komen.
Met de opdracht dmesg kun je zie welke ttyS devices er al in gebruik zijn.
Kies bijvoorbeeld de eerst volgende vrije.
Ik zelf heb slechts een seriele poort op mijn moederbord.
Op mijn systeem is dus enkel /dev/ttyS0 in gebruik.
De eerst vrije device node is dus ttyS1.
Maar ja... ik koos voor ttyS2.
dat maakt verder dus niet uit.

Seriele poor(ten) instellen
Dit is de laatste stap die je moet nemen.
Het is slim om dit gelijk in een scriptje te doen.
Dit scriptje moet je steeds bij het opstarten van je systeem uitvoeren.
Op mijn slackware systeem heb ik de opdrachten dus maar in /etc/rc.d/rc.serial gezet.
Voor elke poort moet je het programma setserial uitvoeren.
in Mijn geval ziet het er als volgt uit:

setserial /dev/ttyS2 uart 16550a port 0x10e8 irq 10
setserial /dev/ttyS3 uart 16550a port 0x10e0 irq 10

Ik had besloten om mijn eerste poort aan ttyS2 te koppelen.
Ik weet niet zeker welke RS232chip er op mijn kaartje zit, maar een 16550a zal het vast prima doen.
De eerste poort van mijn seriele PCI kaartje zit op 10e8 dat noteer je in
programeertalen als C en C++ en om deze reden ook in kernel modules
als 0x10e8 (decimale notering mag ook)
De gebruikte IRQ van het kaartje is 10 (of 0x0A)
Voor de tweede RS232 poort gebruik ik ttyS3, en het I/O addres 10e0,
(de tweede in het lijstje).
Nou, da's mooi,
opdrachtjes in het scriptje tikken, en scriptje uitvoeren.
klaar !

Let wel even op waneer je zo'n PCI RS232 lijntje gaat gebruiken in combinatie met inittab
Inittab kan natuurlijk geen RS232 poort gebruiken waneer die nog niet geinitialiseerd is.
Verder verwacht ik eigenlijk geen problemen.
Sucses ermee !