Plug&Play-Hilfe

Prototypenkarte für Plug-and-Play auf dem ISA-Bus

Praxis & Tipps | Praxis

Selbst die neueste Mainboard-Riege kommt nicht ohne aus: ISA-Slots bleiben uns wahrscheinlich auch in Neugeräten noch erhalten, nachdem sich Windows 98 auf breiter Front durchgesetzt hat. Spielraum genug, auch jetzt noch Entwicklungen mit ISA-Plug&Play zu starten.

Im Jahre Vier nach PCI sind ISA-Einsteckkarten immer noch nicht ausgestorben: Bei Sound-, Modem- und ISDN-Karten reicht die Übertragungsgeschwindigkeit des ISA-Bus locker aus, die anfallenden Daten zu bewegen. Moderne Boards brauchen mittlerweile auch keine Jumper oder DIP-Schalter mehr, da sie dem ISA-Plug&Play-Standard (ISA-PnP) gehorchen, wie er von Intel und Microsoft definiert wurde. Gleichwohl tauchen in der Praxis immer wieder Probleme auf, was entweder an Unverträglichkeiten zwischen herkömmlichen und ISA-PnP-Karten oder schlicht daran liegt, daß sich manche Hersteller nicht an den Standard halten.

Noch interessanter wird es, wenn man selbst ein solches Board entwickeln möchte. Hierfür gibt es kaum preiswerte Entwicklungskits, und auch die notwendige Informationsbeschaffung kann zu einer echten Odyssee werden. Deshalb bringt c't eine ISA-PnP-Karte, die als flexibel konfigurierbarer Prototyp für eigene Projekte dienen soll. Die Kenntnis der hierfür wichtigen Zusammenhänge zeigt auch 'Nichtnachbauwilligen', wo die neuralgischen Punkte des Standards liegen und wie solche Boards zu konfigurieren sind.

Im Gegensatz zu einer konventionellen (Legacy ISA) Karte verlangt das Bus-Interface eines ISA-PnP-Boards eine gewisse Eigenintelligenz, die den Konfigurationsmechanismus abhandelt. Damit man das Projekt auch ohne weitere Eigenentwicklung gleich nutzen kann, enthält die Karte einen Plug-and-Play-Baustein, der eine gepufferte serielle Schnittstelle (UART) bereitstellt. Diese läuft bis maximal 1 MBit/s und ist auf beliebige, freie I/O-Adressen im Bereich 0200...03F8h konfigurierbar.

Dank eines auf PnP-Karten sonst unüblichen Jumperblocks kann man den UART bei Bedarf desaktivieren und die PnP-Funktionen (Adreßdecoder, IRQ-Rangierung) zur Ansteuerung einer eigenen Schaltung auf dem Lochrasterfeld der Platine nutzen. Voraussetzung für den Einsatz der Karte ist allerdings, daß ihr Hostrechner über ein aktiviertes PnP-BIOS oder ein PnP-fähiges Betriebssystem - beispielsweise Windows 95 - verfügt.

Die Hersteller gehen mit dem Begriff Plug & Play zuweilen lax um, denn er ist nicht geschützt. Auch wenn er auf bunten Verpackungen zu lesen ist, muß eine Karte keineswegs dem ISA-Plug&Play-Standard entsprechen. Vielfach wird damit lediglich angedeutet, daß man für das Karten-Setup keine manuellen (Jumper-)Einstellungen vornehmen muß, sondern daß die Einstellung mit einem spezifischen Setup-Programm erfolgt. Das übliche Verfahren dabei ist, daß der Hersteller das alte ISA-Interface beibehält und lediglich ein Speicherelement (Latch) hinzugefügt hat, das die Ressourcen-Vorgaben (I/O, IRQ, DMA) für die Dauer der PC-Benutzung festhält. Diese werden während des Karten-Setup in einer Datei vermerkt und bei jedem Neustart - meist via CONFIG.SYS - ins Latch geschrieben.

Dabei kann eine Überprüfung auf eventuelle Kollisionen mit den Parametern anderer Boards beim Karten-Setup nur unvollständig stattfinden, da Legacy-ISA-Karten aufgrund ihres simplen I/O-Interface keine Möglichkeit zur Ermittlung der verwendeten Ressourcen bieten. Auch wenn viele Installations- und Testprogramme entsprechende Angaben präsentieren, haben sie diese meist nur durch die Analyse der Konfigurationsdateien (CONFIG.SYS, AUTOEXEC.BAT, *.INI) und einiger typischer Adressen (z. B. 220h für eine Soundblaster-Karte) festgestellt.

Also nichts mit Plug & Play, es bleibt weiterhin ungewiß, ob zwei Karten nicht doch dieselben Parameter verwenden. Für echte ISA-Plug&Play-Karten hingegen werden die PC-Ressourcen automatisch über das PnP-BIOS oder ein PnP-fähiges Betriebssystem zugewiesen. Dabei können trotzdem Konflikte entstehen, wenn man im PC einen Mix von PCI-, ISA-PnP- und Legacy-ISA-Karten vorfindet. Beispielsweise kann sich eine Legacy-ISA-Karte im nachhinein (nach der Initialisierung durch das BIOS) via SYSTEM.INI-Eintragung - sehr beliebt bei Soundkarten - einen IRQ schnappen, der eigentlich von einer anderen Einheit belegt ist [2].

Um diesem Mißstand abzuhelfen, haben Intel und Microsoft eine verbindliche Spezifikation für das Design von ISA-PnP-Boards definiert [3]. Wer schon einmal versucht hat, allein mit Hilfe dieser Beschreibung eine Karte zu entwickeln, kann sicher ein Lied davon singen, wie beschwerlich der Weg zu einer funktionierenden Schaltung sein kann. Zwar enthält die Dokumentation alle wesentlichen Dinge, doch ohne konkrete Beispiele erkennt man zunächst nicht, was eigentlich wichtig und für die Eigenentwicklung tatsächlich nötig ist.

Die c't-ISA-PnP-Karte bietet anhand eines konkreten Bausteins eine Entwicklungsbasis und geht auf die für diesen Typ wesentlichen Details ein. Eine Übertragung auf andere PnP-Chips fällt dann nicht mehr schwer. Auch die ISA-Plug&Play-Spezifikation verliert dadurch einen Teil ihres Schreckens.

ISA-Plug&Play mußte nachträglich in das ISA-Konzept eingebracht werden, ohne daß es zu Problemen mit dem üblichen Aufbau eines ISA-PC kommen kann. Dazu wurden drei zusätzliche 8-Bit-Register definiert (Address, Write Data und Read Data, siehe Tabelle 'PnP-Schlüssel'), über die die gesamte Plug&Play-Konfiguration abläuft. Ihre Adressen sind so gewählt, daß es keine Kollision mit bereits standardmäßig verwendeten Ports geben kann.

Alle ISA-Plug&Play-Karten verwenden zur Konfiguration ausschließlich diese drei Register. Der zum Adreß-Port umgewidmete Printer-Status-Port und die um 800h höhere Adresse werden bei ISA-Plug&Play nur schreibend benutzt. Das Lesen der Kartendaten erfolgt über eine Adresse im Bereich 0203...03FFh, die das PnP-BIOS des Host-Rechners ermittelt und den PnP-Karten bekanntgibt (vgl. [4]). Diese Adresse kann ein Treiber nach erfolgter Konfiguration beispielsweise über eine PnP-BIOS-Funktion erfahren.

Mittels des Adreß-Port wählt man das jeweilige interne Plug&Play-Register aus, um anschließend Daten zum Write-Data-Port zu schreiben oder Daten vom Read-Data-Port zu lesen. Jede Plug&Play-Karte verfügt über drei Registersätze: Card Control, Logical Device Control und Logical Device Configuration. Die Card-Control-Register legen globale Funktionen für die Steuerung der Karte fest.

Die Logical-Device-Control-Register sind für jedes logische Gerät auf der Karte einmal vorhanden und bestimmen, ob der betreffende Schaltungsteil - beispielsweise bei Multifunktionskarten - für den ISA-Bus aktiv ist. Sie dienen zudem der Überprüfung eines Ressourcen-Konflikts. Die Logical-Device-Configuration-Register sind ebenfalls für jedes logische Gerät einmal vorhanden und definieren die Speicher-, I/O-, Interrupt- und DMA-Einstellungen. Außerdem sind herstellerspezifische Register erlaubt, die es den Entwicklern ermöglichen, eigene Funktionen über den Plug&Play-Mechanismus zu integrieren (vgl. Tabelle 'PnP-Register').

Die Initialisierung einer ISA-Plug&Play-Karte läuft in mehreren Schritten ab. Nach dem Einschalten des PC erfolgt ein Reset durch das entsprechende Signal des ISA-Bus, alle ISA-Plug&Play-Karten setzen ihre interne CSN (Card Serial Number, ein 8-Bit-Handle für späteren Zugriff) auf null und gehen zunächst in den Zustand Wait For Key.

Die Konfiguration einer ISA-PnP-Karte geschieht nun nacheinander über den Sleep-, Isolation- und Config-State. Im ersten Schritt sendet das PnP-BIOS auf den PnP-Adreß-Port einen 32 Byte langen, festen Schlüssel - den Initiation Key:

6A, B5, DA, ED, F6, FB, 7D, BE,
DF, 6F, 37, 1B, 0D, 86, C3, 61,
B0, 58, 2C, 16, 8B, 45, A2, D1,
E8, 74, 3A, 9D, CE, E7, 73, 39

Haben die PnP-Karten diesen Schlüssel korrekt erkannt, wechseln sie in den Sleep State. Hier verharren sie so lange, bis das PnP-BIOS das Kommando Wake[0] (vgl. Kästchen 'Kartenwecker') schickt. Daraufhin wechseln die Boards in den Isolation State.

Im nächsten Schritt muß der Rechner allen noch nicht initialisierten PnP-Karten (CSN=0) eine CSN - fortlaufend ab 1 hochgezählt - zuweisen. Dazu bedient er sich des Isolation-Protokolls, um aus den Karten eine einzige auszuwählen. Dazu fragt das BIOS mittels einer Folge von 72 paarigen Lesezugriffen auf das PnP-Register Resource Data (Adresse 04h) den Serial Identifier (siehe unten) ab.

Der erste Lesezugriff darauf veranlaßt alle Karten, das Bit 0 ihres Serial Identifier auszuwerten. Hat eine Karte hier eine '1', dann darf sie den Datenbus beim ersten Lesen mit dem Wert 55h und beim zweiten Lesen mit 0AAh bedienen. Karten mit einer '0' beobachten den Bus und verabschieden sich bis zum nächsten Zyklus aus dem Isolationsprozeß, wenn sie erkennen, daß ein konkurrierendes Board den Bus treibt.

Für jedes auf dem Bus erkannte 55/AAh-Datenpaar merkt sich das BIOS eine '1' an der entsprechenden Stelle im Serial Identifier. Nach insgesamt 144 Lesezyklen hat der Rechner eine einzelne Karte isoliert. Das betreffende Board wechselt in den Config State, so daß der PC ihr eine CSN zuweisen kann. Diese Karte nimmt an weiteren Isolationszyklen nicht mehr teil und fällt in den Sleep State zurück. Anschließend wiederholt der Rechner den kompletten Isolationszyklus ab Wake[0] so lange, bis keine Karte mehr antwortet. Dies erkennt er daran, daß innerhalb der 144 Lesezugriffe keine Karte mehr mit 55/AAh antwortet.

Nachdem der komplette Isolationsprozeß durchlaufen ist, kann das BIOS jede Karte über ihre CSN ansprechen, ihren Ressourcen-Bedarf (mehr dazu weiter unten) ermitteln, ihr über ihre Register effektive Speicher-, I/O-, IRQ- und DMA-Ressourcen zuweisen und sie aktivieren. Treiber, die hernach die zugewiesenen Adressen oder Kanäle erfragen wollen, um 'ihre' Karte zu finden, können einen deutlich kürzeren Weg einschlagen.

Dazu stellt das PnP-BIOS die Funktion 40h (Get Plug & Play ISA Configuration Structure) bereit. Sie teilt unter anderem mit, welche maximale CSN das BIOS vergeben hat (also wie viele PnP-Karten es erkannt hat) und auf welcher Adresse der Read-Data-Port liegt. Die Aufgabe eines Treibers ist jetzt, nacheinander alle Karten 'abzuklappern'.

Dazu setzt er nacheinander alle Boards in den Config State, indem er das Kommando Wake[CSN] schickt. Anschließend kann der Treiber die PnP-Konfigurationsregister der so aktivierten Karte lesen. Deren Serial Identifier erfährt er jetzt byteweise über das PnP-Register 04h (Resource Data) und vergleicht ihn mit dem seiner Zielkarte. Bei Übereinstimmung hat der Treiber sein 'Opfer' gefunden. Die vom BIOS zugewiesenen Ressourcen (Speicher- und I/O-Bereiche, IRQ- und DMA-Kanal) kann er dann in den jeweiligen Konfigurationsregistern (vgl. Tabelle 'PnP-Register' und [3]) auslesen.

Vergrößern Eine ISA-Plug&Play-Karte ist erst ansprechbar, nachdem sie die vier Zustände Wait for Key, Sleep, Isolation sowie Config durchlaufen hat und eine Card Serial Number erhielt.

Unter Windows 95 ist der Configuration Manager für das Einbinden von Plug-and-Play-Karten zuständig. Er bietet unter anderem die Funktion CONFIGMG_Read_Registry_Value, die die Abfrage der eingestellten Parameter für eine bestimmte Karte gestattet. Details dazu enthält Microsofts Device Driver Kit [9].

Welche Ressourcen eine bestimmte ISA-PnP-Karte benötigt und innerhalb welcher Bereiche es sie der Karte zuweisen kann, erfährt das PnP-BIOS aus einem Festspeicher, den jedes Board enthalten muß. Bei der c't-ISA-PnP-Karte ist dies ein EEPROM. Darin steht als erstes Datum ein herstellerspezifisches Wort (Clock Prescalar Divisor Value), das der PnP-UART beim Reset selbsttätig ausliest und für seine Baudratenerzeugung verwendet.

Anschließend folgt die in der Plug-and-Play-Spezifikation festgelegte Ressource-Daten-Struktur, die der Baustein über das Resource-Data-Register (04h) dem BIOS zur Verfügung stellt. Falls das EEPROM keine gültigen Daten und der PnP-Chip selber keine Default-Einstellungen enthalten, kann das BIOS die Karte nicht initialisieren.

Zum Auslesen der Ressource-Daten muß das PnP-BIOS zunächst eine Karte mittels des Kommandos Wake[CSN] in den Config State setzen. Das angesprochene Board stellt daraufhin seinen internen Zeiger für die Ressource-Daten auf null und gibt über das Resource-Data-Register die Daten nacheinander byteweise aus. Ein direkter Zugriff auf bestimmte Bytes dieser Datenstruktur ist nicht möglich, das BIOS muß sie komplett sequentiell auslesen.

Der erste, neun Byte lange Block der Ressource-Daten besteht aus dem Serial Identifier, anhand dessen ein abfragendes Programm eine Karte eindeutig erkennen kann. Er setzt sich aus einer 4-Byte-Herstellerkennung (Vendor ID, Byte 0...3), einer 32 Bit langen Seriennummer (Byte 4...7) und einer 8-Bit-Checksumme (Byte 8) zusammen. Die unteren 16 Bit der Herstellerkennung werden zentral von Microsoft vergeben (http://www.microsoft.com/hwdev/busbios/pnpidfrm.htm), so daß es keine zufällige Übereinstimmung bei verschiedenen Firmen geben kann. Für die obere Hälfte der Vendor ID sowie die Seriennummer ist der Kartenhersteller selbst verantwortlich.

Laut Spezifikation soll jedes Board einer Produktreihe eine eindeutige Seriennummer erhalten, damit auch zwei Karten des gleichen Typs im selben Rechner laufen können. Manche Hersteller vergeben aber - wohl um den Verwaltungsaufwand zu sparen - nur eine feste. Dies führt dazu, daß man nur ein einzelnes Board solcher Bauart im PC betreiben kann.

Die Vendor ID enthält ein dreibuchstabiges Kürzel im Compressed-ASCII-Format (auf die unteren fünf Bit reduziert), das bei der c't-ISA-PNP-Karte beispielhaft als 'HLT' gewählt wurde:

Zeichen ASCII   	Compressed
H 1001000 01000
L 1001100 01100
T 1010100 10100

Zusammen mit einem führenden Null-Bit ergeben diese fünfzehn Bit die ersten zwei Byte (21h, 94h) des Serial Identifier. Seine folgenden sechs Bytes wurden für das Projekt willkürlich festgelegt.

Vergrößern Das Linear Feedback Shift Register während der Ausführung des Initiation-Key-Protokolls

Das letzte Byte des Serial Identifier bildet eine Checksumme, die das PnP-BIOS respektive Betriebssystem auswerten kann, um eine sichere Erkennung zu gewährleisten. Manche PnP-BIOSse erkennen zwar auch Karten mit falscher Checksumme, Windows 95 besteht jedoch auf einer korrekten. Zur Ermittlung dieses Prüfbytes für selbstgewählte Serial Identifier liegt auf der Projektdiskette das DOS-Programm CHKSM_SI bereit. Es bildet die Berechnung der Prüfsumme durch das LFSR nach (siehe Kasten 'Abgecheckt').

Ein wesentlicher Teil der Ressource-Daten ist die Compatible Device ID (Byte 26...2Ah). Hieran erkennt Windows 95 standardisierte Devices (Beispiele siehe Tabelle 'PnP-Gerätschaften'). Bei der UART-Karte steht der Eintrag 'PNP0501' (16550A Compatible Port), der entsprechend der Vendor ID als Compressed ASCII abgelegt ist.

Am Ende des Ressource-Daten-Blocks folgt ein Prüfbyte über den gesamten Block. Dieses ist die Differenz (hier 0ABh), die der Summe aller Ressource-Bytes (hier 955h) zu x00h fehlt.

Als Kern der ISA-Plug&Play-Karte kommt ein Baustein vom Typ TL16PNP550A zum Einsatz, der neben dem Plug&Play-Interface bereits einen gepufferten UART (Universal Asynchronous Receiver/Transmitter, asynchrone serielle Schnittstelle) enthält. Damit läßt sich die Funktion der Karte praktisch erproben. Der Vorteil dabei ist, daß Windows 95 diese Schnittstelle standardmäßig erkennt und sie daher ohne einen speziellen Treiber auskommt. Falls der COM-Port von Windows 95 aus nutzbar ist, beispielsweise als COM3 bei sonst mit zwei seriellen Schnittstellen ausgestatteten Rechnern, hat man die Bestätigung, daß sich die Karte wie ein kompatibles ISA-Plug&Play-Device verhält.

Für die Funktion als Plug&Play-Controller mit aktiver serieller Schnittstelle sind die Anschlüsse UARTBYPASS auf Low-Pegel und PNPBYPASS auf High-Pegel zu setzen (vgl. Tabelle 'Wechselspiel'). Dabei spielen die Signale für die manuelle Festlegung des Interrupt-Kanals (ICONFIG) und der I/O-Basisadresse (ACONFIG) keine Rolle. Man sollte sie dennoch auf einen definierten Pegel setzen (Vcc oder GND), da der Baustein sonst möglicherweise ein unvorhersehbares Verhalten an den Tag legt. Dies gilt generell für alle Konfigurationssignale: Man kann keinesfalls, wie bei TTL üblich, davon ausgehen, daß offene Eingänge als High-Pegel wirken.

Vergrößern Das erste Byte der Vendor ID (21h) läuft durch das Linear Feedback Shift Register und ergibt den Zwischenwert 7Eh.

Läuft die Schaltung als PnP-COM-Port, kann man anschließend den UART stillegen. Dann stellt der '550 nur sein ISA-Plug&Play-Interface zur Verfügung und bedient das Chip-Select-Signal /CS an der Stiftleiste STL_2 für eigene Hardware-Erweiterungen. Umgekehrt kann man auch die PnP-Funktion des Bausteins deaktivieren, so daß die Karte als normaler COM-Port erscheint. Dabei sind der betreffende IRQ und die I/O-Basisadresse über Steckbrücken festzulegen. Welche Jumperstellungen (ACONFIG, ICONFIG) für den Einsatz als Non-Plug&Play-Device gelten, zeigen die Tabellen 'Adreßeinstellung' und 'IRQ-Auswahl'.

Ein für Entwickler interessantes Feature des TL16PNP550A stellen die beiden Ausgangssignale PNPS0 und PNPS1 dar. Sie signalisieren über ihren jeweiligen Pegel den aktuellen Zustand des Bausteins (siehe Tabelle 'PnP-Ampel').

Erfreulicherweise bietet Texas Instruments seit einiger Zeit den TTL-RS232-Transceiver SN75C185 an, der mit minimalem Aufwand eine PC-gerechte Beschaltung der Sub-D-Buchse für den COM-Port ermöglicht. Als Konfigurationsspeicher kommt ein EEPROM (ST93C56, SGS-Thomson) zum Einsatz, das zwei interne Organisationen erlaubt: Befindet sich der Pin 6 (ORG) auf Vcc, ist es als 128 × 16 Bit organisiert, wie es der Controller verlangt. Andernfalls (ORG=GND) ist der Baustein als 256-Byte-Speicher organisiert.

Mit dem seriellen Taktsignal SCLK liest der PnP-UART die Daten aus dem ST93C56 aus. Der Dateneingang des EEPROMs (D, Pin 3) ist über einen Widerstand mit seinem Ausgang (Q, Pin 4) verbunden, damit beide Signale über einen Pin (SIO) des PnP-Controllers laufen können. Ohne eine zusätzliche Logik vermag er jedoch keine Daten direkt in das EEPROM zu schreiben.

Da das EEPROM im Lieferzustand leer ist, das PnP-Interface im TL16PNP550 aber auf darin abgelegte Ressource-Daten angewiesen ist, muß man es vor Inbetriebnahme der Karte programmieren. Dazu liegen auf der Projektdiskette sowohl ein entsprechendes DOS-Tool (EEPROG.EXE) als auch eine zugehörige Konfigurationsdatei (EEPROM.DAT, im Listing als kommentierte Version) bereit. In dieser Datei kann man unter anderem die für die Karte gewünschten I/O-Bereiche und IRQs definieren.

Vergrößern Das Adapterkabel zur Programmierung des EEPROMs verbindet man erst nach dem Einschalten des Rechners mit der Platine.

Beim Programmieren des EEPROMs darf der PnP-UART-Chip noch nicht bestückt sein. Die Karte steckt man in einen freien ISA-Slot. Erst nach dem Einschalten des PC verbindet man das Programmierkabel (siehe Bild) mit der Stiftleiste STL_1 auf der Platine und dem Druckerport LPT1. Anschließend kann EEPROG die Konfigurationsdaten in den Speicherbaustein übertragen. Den Erfolg des Schreibvorgangs kann man durch anschließendes Auslesen überprüfen. Nach einem Neustart des Rechners mit bestücktem PnP-UART sollte das PnP-BIOS die erfolgreiche Initialisierung der Karte melden. Beim erneuten Einschalten sollte man nicht vergessen, vorher das Programmierkabel abzuziehen. Sonst könnten zufällige Einschalt-Signale am Druckerport das EEPROM 'in die Wüste' schicken.

Um den UART des TL16PNP550 auszuschalten (Betriebsart Stand alone PnP Controller), legt man den Anschluß UARTBYPASS über seinen zugehörigen Jumper auf High-Pegel. Dadurch stellt der '550 ein logisches Device zur Verfügung, das acht fortlaufende I/O-Adressen aus dem Bereich 200...3F8h verwendet. Dazu kommt ein Interrupt-Kanal (EXINTR-IRQ), der in einem der Blöcke IRQ3...7 und IRQ9...12 liegt. IRQ15 ist auf der Karte nicht durchverbunden, da er bei üblichen PCs durch den zweiten IDE-Kanal belegt ist. Die Festlegung, welche I/O-Basisadresse und welchen IRQ der Baustein verwendet, trifft das PnP-BIOS während der Initialisierungsphase.

Zum Aufbau eigener Schaltungen ist auf der Platine ein Lochrasterfeld vorgesehen, in dessen Nähe alle wichtigen Signale auf der Pfostenleiste STL_1 bereitstehen. Den Datenbus puffert ein Transceiver 74ALS245, wobei die Signalrichtung mit dem Signal IOR (aktiv Low) umgeschaltet wird. Das AEN-Signal (Unterscheidung zwischen I/O- oder DMA-Zyklus) nutzt bereits der Controller, so daß es hier nicht benötigt wird. (ea)

Weitere Hinweise und Berichtigungen unter: c't-Projekte

[1] Georg Schnurer, Plug & Play: die Technik, c't 3/95, S. 136

[2] Peter Siering, Quelle fromage, PCI und Plug & Play - Hilfe zur Selbsthilfe, c't 2/97, S. 114

[3] Plug and Play ISA Specification, Intel/Microsoft, als Word-Dokument auf ftp://ftp.microsoft.com/developr/drg/Plug-and-Play/Pnpspecs

[4] Plug and Play BIOS Specification, Compaq/Phoenix/Intel, Quelle wie [3]

[5] Datenblatt TL16PNP550A, Texas Instruments, http://www.ti.com/

[6] Datenblatt ST93C56, SGS-Thomson, http://www.st.com/

[7] Tom Shanley, Plug and Play System Architecture, Addison-Wesley, 1995

[8] Walter Oney, Systemprogrammierung für Windows 95, Microsoft Press

[9] Windows 95 Device Driver Kit, Microsoft, 1996

[10] Klaus Dembowski, Computerschnittstellen und Bussysteme, Hüthig Verlag, 1997

Kartenwecker

Das Erwecken einer Karte aus dem Sleep-Zustand erfolgt mittels des Wake[CSN]-Kommandos. Dieses besteht aus einem Schreibvorgang auf das PnP-Kontrollregister Wake[CSN] (Adresse 03h), auf das alle PnP-Karten jederzeit lauschen. Dabei entsprechen die zu schreibenden Daten der gewünschten Card Serial Number:

Port[Address]:=$03;
Port[Write_Data]:=CSN;
PnP-Schlüssel
Port Name Adresse übliche ISA-Funktion Zugriff
Address 0279h Printer-Status-Port Schreiben
Write Data 0A79h - Schreiben
Read Data 0203...03FFh verschiedene Lesen
PnP-Register
Adresse Funktion
00...07h Card Control
08...1Fh Card Level (reserviert)
20...2Fh Card Level (herstellerspezifisch)
30...31h Logical Device Control
32...37h Logical Device Control (reserviert)
38...3Fh Logical Device Control (herstellerspezifisch)
40...75h Logical Device Configuration
76...EEh Logical Device Configuration (reserviert)
F0...FEh Logical Device Configuration (herstellerspezifisch)
FFh reserviert
Stückliste
Widerstände
R1 1k5
R2 1M
R3 2k2
Kondensatoren
C1 47 p
C2 22 p
C3 220 p
C4...9 100 n
C10 100 µ
Halbleiter
IC1 TL16PNP550, PLCC68
IC2 SN75C185
IC3 ST93C56
IC4 74ALS245
(IC1...4 z. B. Conrad Electronic)
Sonstiges
Q1 Quarz 22 MHz (HC58)
STL_1 Pfostenleiste 1 × 5, einreihig
STL_2 Pfostenleiste 1 × 18, einreihig
Jumper Pfostenleiste 3 × 8, 8 Steckbrücken
VB1 Sub-D-9-Stecker, gewinkelt, Printmontage
Sockel für IC1...4
Platine eMedia -Bestellnr. 9713284dB
Software ISAPNP (eMedia) oder in ct9713.zip
Programmierkabel: Sub-D-25-Stecker, fünfadrige Leitung, fünfpolige Kupplung für Pfostenleiste, siehe Text
PnP-Gerätschaften
Device ID Device-Typ
PNP0400 Standard LPT Printer Port
PNP0401 ECP Printer Port
PNP0500 Standard COM-Port
PNP0501 16550A Compatible Port
PNP0600 ESDI/IDE Controller
PNP0A00 ISA Bus
PNP0A03 PCI Bus

Abgecheckt

Das 8 Bit breite Linear Feedback Shift Register (LFSR) - Bestandteil jedes Plug&Play-Chips - ist für zwei Aufgaben im Plug-and-Play-Interface zuständig. Zum einen errechnet es aus den 32 Bytes des Initiation Key einen fortlaufenden Prüfwert.

Die empfangenen Daten des Initiation Key vergleicht ein PnP-Baustein intern mit dem vom LFSR erzeugten Wert. Um sicherzugehen, daß sich das LFSR im Grundzustand befindet, empfiehlt die Spezifikation, vor dem Senden des Initiation Key zunächst zwei Schreiboperationen mit 00h auf den PnP-Adreß-Port auszuführen. Danach enthält das LFSR den Wert 6Ah, der dem ersten Byte des Initiation Key entspricht. Nachdem das letzte Byte des Initiation Key geschrieben wurde, muß das LSFR den Wert 39h enthalten, damit die Karte in den Sleep State wechselt. Andernfalls nimmt das LFSR wieder den ursprünglichen Wert (6Ah) ein, was bedeutet, daß die Karte nicht angesprochen werden kann und weiterhin im Wait-For-Key-Zustand verharrt.

Die zweite Aufgabe - die Überprüfung der Checksumme des Serial Identifiers während des Isolationsprozesses - vollzieht das LFSR mit leicht anderer Konfiguration: Nach dem Empfang der Befehlsfolge 'Wake=0 AND CSN=0' wird das LFSR zunächst auf 6Ah zurückgesetzt. Das erste Bit des Serial Identifier gelangt auf den einen Eingang des ersten XOR-Gatters (beispielsweise eine '1'). Zusammen mit der XOR-Verknüpfung der unteren zwei Bit des Reset-Werts 6Ah erscheint als Eingangswert für das Schieberegister eine '0', die nach einmaligem Rechtsschieben (Lesezugriff auf das Serial Isolation Register) in das Bit 7 des LFSR wandert. Nachdem dieser Prozeß auch für die restlichen 63 Bit des Serial Identifier durchgelaufen ist, steht im LFSR die Prüfsumme.

PnP-Ampel
PNPS1 PNPS0 Status
0 0 Wait for Key
0 1 Sleep
1 0 Isolation
1 1 Configuration
Adreßeinstellung
ACONFIG 1:0 COM-Port Adreßbereich
00 1 3F8...3FFh
01 2 2F8...2FFh
10 3 3E8...3EFh
11 4 2E8...2EFh
Wechselspiel
Funktion UARTBYPASS PNPBYPASS ICONFIG 3:0 ACONFIG 1:0
PnP-UART 0 1 × ×
nur PnP-Controller 1 1 × ×
nur UART-Funktion 0 0 aktiv aktiv
reserviert 1 0 × ×
IRQ-Auswahl
ICONFIG 3:0 IRQ
0011 3
0100 4
0101 5
0110 6
0111 7
1001 9
1010 10
1011 11
1100 12
1111 15

Listing

Das EEPROM teilt dem abfragenden PnP-Betriebssystem während der Konfiguration unter anderem mit, welchen Serial Identifier die PnP-UART-Karte besitzt.

Adresse   Inhalt

; Clock Prescalar Divisor Value
0x00 0xFF ; herstellerspezifisch (UART 16550A)
0x01 0x3F ; Prescalar Value Bits [15:14]: 00: Divisor=12

; hier beginnt der Resource Data Block

; Serial Identifier
0x02 0x21 ; Vendor ID Byte 0
0x03 0x94 ; Vendor ID Byte 1, (ergibt: HLT)
0x04 0x10 ; Vendor ID Byte 2
0x05 0x01 ; Vendor ID Byte 3, (ergibt:1001)
0x06 0x01 ; Serial Number Byte 0
0x07 0x00 ; Serial Number Byte 1
0x08 0x00 ; Serial Number Byte 2
0x09 0x00 ; Serial Number Byte 3, (ergibt: 00000001)
0x0A 0x59 ; Serial ID Info Checksum

; Plug&Play Version
0x0B 0x0A ; Plug&Play Version Number, Small Item
0x0C 0x10 ; Plug&Play Version 1.0, BCD [7:4], [3:0]
0x0D 0x01 ; Vendor Version Number

; Identifier String (ANSI)
0x0E 0x82 ; Identifier String Type, Large Item
0x0F 0x0F ; Length Bits [7:0], hier 15
0x10 0x00 ; Length Bits [15:8]
0x11 "16550A COM PORT" ; Identifier String (Text)

; Logical Device ID
0x20 0x15 ; Logical Device ID, Small Item
0x21 0x21 ; Logical ID Byte 0
0x22 0x94 ; Logical ID Byte 1, (ergibt HLT)
0x23 0x00 ; Logical ID Byte 2
0x24 0x01 ; Logical ID Byte 3, (ergibt 0001)
0x25 0x02 ; Logical Device Flags, No boot,
I/O-Range Check (31h)

; Compatible Device ID
0x26 0x1C ; Compatible Device ID Type, Small Item
0x27 0x41 ; Compatible Device Byte 0
0x28 0xD0 ; Compatible Device Byte 1
0x29 0x05 ; Compatible Device Byte 2
0x2A 0x01 ; Compatible Device Byte 3, kompatibel
zum UART 16550A, "PNP0501"

; IRQ Descriptor
0x2B 0x22 ; IRQ Format, Small Item
0x2C 0xF8 ; IRQ Mask Bits [7:0], IRQ 7...3
0x2D 0x1C ; IRQ Mask Bits [15:8], IRQ 12...10

; I/O Descriptor
0x2E 0x47 ; I/O Port Descriptor Type, Small Item
0x2F 0x00 ; Information, Bit[0]=0: 10 Bit Decode
0x30 0x00 ; Minimum Base Address [7:0]
0x31 0x02 ; Minimum Base Address [15:8], (ergibt 200h)
0x32 0xF8 ; Maximum Base Address [7:0]
0x33 0x03 ; Maximum Base Address [15:8], (ergibt 3F8h)
0x34 0x08 ; Base Address Increment, (8 Ports)
0x35 0x08 ; Number of Ports, (8)

; END Tag
0x36 0x79 ; Small Item, End Tag
0x37 0xAB ; Resource Checksum


Anzeige