ISA Plug'n Play
JSTML Wie geht das mit dem ISA PnP ?

Irgendwann ist man davon abgegangen fuer ISA Karten mit ein paar Jumpern die Hardwareressourcen vorzugeben. Das war vermutlich zu einfach. Erste Versuche die starren Vorgaben aendern zu koennen, ohne die Karte auszubauen war z.B. bei der CPS Soundblaster 2.5. Dort war ein EEPROM drauf, das man umprogrammieren konnte und so den IRQ und DMA umstellen konnte. (Seltsamerweise blieb IRQ5 hardwaremaessig belegt, wenn man IRQ7 einstellte.) Dazu benoetigte man ein spezielles Programm.

ISA PnP wird von modernen BIOS Versionen unterstuetzt (zB Award Plug and Play Bios Extension 1.0A). Dazu hat die ISA Karte ein EEPROM in dem mehrere Konfigurationen der eigenen Ressourcenverteilung gespeichert sind. Unter Win9x nennt sich das 'Basiskonfigurationen'. Die erste Konfiguration ist unveraenderlich und vom Hersteller vorgegeben. Alle weiteren kann man selbst einstellen.

Wenn man im BIOS nun PnP OS auf No stellt, versucht das BIOS alle Plug and Play Hardware vorzukonfigurieren. Wenn man es auf Yes stellt, konfiguriert das BIOS nur die zum booten notwendigen Komponenten, wie Grafik und IDE Controller.
Der Ablauf wenn man im BIOS PnP OS auf No gestellt hat, ist grob dann so:
  • Es wird eine Ressourcentabelle angelegt fuer IRQ und DMA.
  • Zuerst werden Ressourcen die reserviert sind fuer nicht-PnP Karten als reserviert eingetragen.
  • Dann wird die erste ISA PnP Karte und deren gespeicherte Basiskonfigurationen durchgeschaut, welche noch moeglich ist.
  • Auf diese wird die Karte dann eingestellt und die Ressourcen werden als belegt in der Tabelle eingetragen.
  • Dann folgt die naechste Karte usw.
Dasselbe wird mit PCI Karten gemacht, die gewisse Ressourcen ISA erreichbar machen (zB Netzwerkkarten).
Bei den ueblichen Award BIOS kann man das Ergebnis ganz am Ende unter der Box, in der die Konfiguration des Computers steht sehen.

Im allgemeinen kann man PnP OS auf Yes stehen lassen und ein Programm nutzen das die Karten spaeter konfiguriert.
Bei der SB16 PnP bis AWE64 PnP gibt es da CTCU und CTCM von Creative.
Bei Crystal 423x Chips gibt es cs4232c.exe.
Bei anderen Karten aehnliches...

Leider macht die Software zum Konfigurieren nicht immer das was man wuenscht, und damit kann man durch PnP unter Umstaenden bei jedem booten eine
andere Hardwarekonfiguration vorfinden. Das ist nicht akzeptabel.

Um dieses Problem zu erschlagen gibt es eine halbwegs funktionierende Strategie.
Fuer SB PnP stellt man mit CTCU die zweite BasisKonfiguration auf seine Wunschkonfiguration um.
Dann traegt man seine Konfiguration in der ctpnp.cfg direkt ein (ist eine Textdatei) und setzt diese auf Read Only.
Nun sollte CTCM immer die Wunschkonfiguration laden.

In aehnlicher Weise klappt das auch bei anderen Karten, wobei man notduerftigerweise manchmal den Geraetemanager von Win9x missbrauchen muss um die Basiskonfigurationen festzulegen, da der Kartenhersteller kein Tools zum aendern der Basiskonfigurationen zur Verfuegung stellt.

Nun, wenn das BIOS die Hardware konfigurieren kann, sollte es im Prinzip moeglich sein ein universelles Programm dafuer zu schreiben. So ein Programm gibt es und es heisst ISAPNPTools. Geschrieben wurde es, um ISA PnP Karten fuer Linux zu konfigurieren, jedoch existiert auch eine Version fuer DOS. Zu erst laesst man sich mit pnpdump.exe eine Liste der im System vorhandenen ISA PnP Karten ausgeben, am besten in eine Datei mit: pnpdump > mypnp.txt
Das Programm generiert in der Ausgabe eine Textdatei die alle Basiskonfigurationen aller installierten Karten auflistet. Diese Textdatei kann man so zusammenkuerzen, dass man sie gleich als Konfigurationsvorgabe fuer isapnp.exe verwenden kann, das dann die Konfiguration der Karten vornimmt. Die Ausgabe startet so:

(READPORT 0x0273)
(ISOLATE PRESERVE)
(IDENTIFY *)
(VERBOSITY 2)
(CONFLICT (IO FATAL)(IRQ FATAL)(DMA FATAL)(MEM FATAL))


Die Readport Zeile sagt isapnp welcher Ausgabeport verwendet wird, um evt. vorhandene ISA PnP Karten zu konfigurieren. Dieser Port wird unter Win9x als eigenes Geraet gefuehrt und heisst ISA PnP Datenleseport (oder so aehnlich ;) ). Falls pnpdump keine (vorhandenen) Karten erkennt, kann man mit pnpdump 0xAAA (A = Adresse) den Datenleseport vorgeben. Die zweite Zeile (ISOLATE) sagt isapnp, dass es die Karten neu erkannt werden sollen (statt die BIOS Liste zu uebernehmen) und dabei deren aktuelle Konfiguration erhalten werden soll (Preserve). Identify * sagt, dass alle Karten nacheinander identifiziert werden. Die Einstellung Fatal bei Conflict gibt an, dass isapnp beim auftreten einer Konfiguration, bei der die gewuenschte Ressource schon belegt ist (oder ein andres Problem aufgetreten ist) abbrechen soll und beim naechsten Geraet weitermachen soll. Nun folgen die erkannten Geraete, fuer einen Crystal 4236 zB:

# Card 1: (serial identifier 5d ff ff ff ff 36 98 63 0e)
# Vendor Id CSC9836, No Serial Number (-1), checksum 0x5D.
# Version 1.0, Vendor version 0.1
# ANSI string -->Maxi Sound 64 Home Studio<--
(CONFIGURE CSC9836/-1 (LD 0
#     ANSI string -->WSS/SB<--
#     Start dependent functions: priority preferred
#       First DMA channel 1.
#             8 bit DMA only
#             Logical device is not a bus master
#             DMA may execute in count by byte mode
#             DMA may not execute in count by word mode
#             DMA channel speed type A
# (DMA 0 (CHANNEL 1))

(usw.)

als weiteres folgen dann jeweils zwei weitere Basiskonfigurationen mit allen moeglichen einstellbaren Ressourcen. Dies fuer jedes Logische Geraet, der CS4236 hat als logische Geraete zB
WSS/SB , GAME, CTRL, MPU, DSP. (Logisches Geraet = Logic Device = LD 0, LD 1 usw.) Nun kommentiert man die gewuenschte Konfiguration aus, Beispiel folgt unten. Nach jedem Logischen Geraet muss man entscheiden ob man es aktivieren will oder nicht. Das wird mit ACT Y bzw ACT N gemacht.

Das erste Problem was mir aufgefallen ist, was aber u.U. ein Bug des Programms ist - isapnp liest als Namen der Karte wenn es ein Logisches Device anspricht nur Datenmuell, so dass es meint sie nicht gefunden zu haben. Der Workaround ist, die Karten ueber deren Nummer anzusprechen mit CSN X. (Nachteil: es darf sich nichts an der Reihenfolge aendern).

So hier nun das Beispiel fuer die Konfigurationsdatei fuer isapnp.exe mit einer Maxi Sound 64 Home Studio und einer AWE64 auf einem Intel 430VX basierten Mainboard:

(ISOLATE PRESERVE)
(IDENTIFY *)
(VERBOSITY 4)

#(CONFIGURE CSC9836/-1 (LD 0
(CSN 1 (LD 0
  (DMA 0 (CHANNEL 3))
  (DMA 1 (CHANNEL 0))
  (INT 0 (IRQ 10 (MODE +E)))
  (IO 0 (SIZE 4) (BASE 0x0538))
#  (IO 1 (SIZE 4) (BASE 0x0388))
  (IO 2 (SIZE 16) (BASE 0x0260))
  (ACT Y)
))

#(CONFIGURE CSC9836/-1 (LD 1
(CSN 1 (LD 1
  (IO 0 (SIZE 8) (BASE 0x0208))
  (ACT N)
))

#(CONFIGURE CSC9836/-1 (LD 2
(CSN 1 (LD 2
  (IO 0 (SIZE 8) (BASE 0x0120))
  (ACT Y)
))

#(CONFIGURE CSC9836/-1 (LD 3
(CSN 1 (LD 3
  (INT 0 (IRQ 11 (MODE +E)))
  (IO 0 (SIZE 2) (BASE 0x0320))
  (ACT N)
))

#(CONFIGURE CSC9836/-1 (LD 4
(CSN 1 (LD 4
  (INT 0 (IRQ 9 (MODE +E)))
  (IO 0 (SIZE 6) (BASE 0x0330))
  (ACT Y)
))

#(CONFIGURE CTL00c1/12970 (LD 0
(CSN 2 (LD 0
  (INT 0 (IRQ 5 (MODE +E)))
  (DMA 0 (CHANNEL 1))
  (DMA 1 (CHANNEL 5))
  (IO 0 (SIZE 16) (BASE 0x0220))
  (IO 1 (SIZE 2) (BASE 0x0300))
  (IO 2 (SIZE 4) (BASE 0x0388))
  (ACT Y)
))

#(CONFIGURE CTL00c1/12970 (LD 1
(CSN 2 (LD 1
  (IO 0 (SIZE 8) (BASE 0x0200))
  (ACT N)
))

#(CONFIGURE CTL00c1/12970 (LD 2
(CSN 2 (LD 2
  (IO 0 (SIZE 4) (BASE 0x0620))
  (IO 1 (SIZE 4) (BASE 0x0A20))
  (IO 2 (SIZE 4) (BASE 0x0E20))
  (ACT Y)
))

(WAITFORKEY)

Die Zeile mit CONFIGURE hat dieselbe Bedeutung wie die Zeile mit CSN. Wenn man genau hinschaut faellt auf, dass am Anfang einmal (IO 1 (SIZE 4) (BASE 0x0388)) auskommentiert wurde (Der Port fuer OPL FM Synthese).  Weiter unten sieht man, dass auf der AWE64 dieser Port nochmal konfiguriert wird. Dies einzelne auskommentieren scheint zu funktionieren, auch wenn man mit ACT nur vollstaendige Logische Geraete abschalten kann. (vorausgesetzt PnP OS = Yes im Bios).
Wenn man nun isapnp.exe mit der Konfigurationsdatei als Parameter aufruft, scheint ersteinmal alles zu klappen, jedoch merkt man schnell dass es doch einige Probleme gibt:
  • Normalerweise listet pnpdump fuer das letzte Logische Geraet (AWE32/64 Wavetable) nur (IO 0 (SIZE 4) (BASE 0x0620)). Wenn man das so direkt uebernimmt, funktioniert der AWE Teil der Karte nicht. Erst durch das hinzufuegen der weiteren I/O Ressourcen   (IO 1 (SIZE 4) (BASE 0x0A20)) und (IO 2 (SIZE 4) (BASE 0x0E20)) funktioniert es.
  • Ein weiteres Problem auf das man schnell stoesst, die/der Eingang des CS4236 bleibt stumm. Das bedeutet, man kann mit am Mixer beispielsweise Line In auf 100% Lautstaerke stellen, bekommt aber trotzdem kein Eingangssignal. Fuer dieses Problem scheint es noch keine Loesung zu geben.
Scheinbar ist es so, dass vieles nicht 100%ig konform laeuft und noch weitere Dinge durchgefuehrt werden in der Konfigurationssoftware der Kartenhersteller. Oder das PnP Konfigurationstool des Herstellers gleichzeitig weitere (undokumentierte) Initialisierungsschritte durchfuehrt. Oftmals waere es praktisch das zu trennen...

Bleibt die Frage, ob PnP an der Stelle es einfacher gemacht hat. Der einzige Vorteil den ich sehe ist, dass die Software sieht, wo die Ressourcen der Karte sind im Gegensatz zu Nicht-PnP, wo aufwaendige Hardwaresuchen durchgefuehrt werden, bzw. der Benutzer die eingestellten Ressourcen seiner Karte kennen muss. Meineserachtens ist ISA-PnP fuer die Konfiguration der Hardware unter DOS ein Aufwand, der nicht noetig waere.
Thoughts
Artikel
Hardware Gallery x86
IBM PC System/2 8580
CBM Rechner
HP Gallery
Originale / Verpackungen
Curriculum Vitae
Links
alte Seite