# Plug and Play für Linux

Wie in der Beschreibung über die Hardwareparameter schon gezeigt, benötigen ISA-Karten die korrekte Einstellung ihrer Parameter wie IRQ, IO-Port und DMA-Kanal. Das Betriebssystem muß sich im Klaren über diese Parameter sein, damit es die entsprechende Hardware ansprechen kann. Bei einer Installation einer solchen Karte müssen also normalerweise die entsprechenden Einstellungen sowohl auf der Harwareseite, als auch der Softwareseite vorgenommen werden, damit die Karte dann funktioniert.

Die moderneren ISA-Karten haben zur Vereinfachung dieser Einstellungen einen Standard entwickelt, der die Karte und das Betriebssystem in die Lage versetzen soll, miteinander zu kommunizieren. Mit Hilfe dieser Verständigung sollte es möglich werden, daß sich die Karte beim Betriebssystem erkundigt, welche Ressourcen (IO-Ports, IRQs, usw) noch frei sind und dann selbstständig eine entsprechende Einstellung vornimmt. Das Betriebssystem selbst kann diese Einstellung dann aus der Karte lesen und den Gerätetreiber entsprechend konfigurieren. Diese Technik stellt natürlich entsprechende Anforderungen an die Erweiterungskarte. Sie muß einen ROM-Speicher besitzen, der die denkbaren Parameter enthält und die entsprechende Verdrahtung oder Logik, die diese Einstellungen dann nutzt.

Dieser Standard wird Plug and Play genannt, also etwa Einstecken und loslegen. Voraussetzung für die korrekte Funktionsweise ist es aber, daß das Betriebssystem diese Technik beherrscht. Die schlechte Nachricht gleich zuerst, Linux ist nicht Plug and Play fähig.

Um mit Linux sogenannte ISA-PnP Karten anzusprechen, muß eine passende Einstellung an die Karte geschickt werden, die ihre Ressourcen fest zuweist. Wenn das geschehen ist, kann Linux die Karte genauso behandeln, als ob es eine Karte mit fester manueller oder softwaremäßiger Einstellung wäre. Das heißt, beim Laden der Gerätetreiber können die entsprechenden Parameter angegeben werden.

Um die entsprechenden Einstellungen vorzunehmen gibt es zwei Programme, die diese Aufgabe in zwei Schritten übernehmen. Allerdings ist dazu etwas Handarbeit nötig. Die beiden Programme sind:

- pnpdump
- isapnp

Das erste Programm, pnpdump, scant den ISA-Bus nach PnP-Karten ab und ließt von den gefundenen Karten die möglichen Einstellungen (Ressourcen) aus dem ROM. Diese Einstellungen werden dann in einem bestimmten (für Menschen lesbaren) Format auf die Standard-Ausgabe geschrieben. Die denkbaren Einstellungen sind angegeben, eine tatsächliche Konfiguration ist aber auskommentiert. Die Ausgabe von pnpdump wird üblicherweise in eine Datei umgeleitet und dann mit einem Editor bearbeitet um eine bestimmte Einstellung zu aktivieren. Die bearbeitete Datei wird dann zur Konfigurationsdatei des zweiten Programms, mit dem wir die Einstellungen dann an die Karten zurückgeben. Dieses zweite Programm ist isapnp

Wir können also die Konfiguration von PnP-Karten in drei Schritte gliedern:

- Aufruf von pnpdump
  pnpdump wird aufgerufen und seine Ausgabe am besten gleich in die Datei `/etc/isapnp.conf` umgeleitet. Das ist die voreingestellte Konfigurationsdatei von isapnp. Wir schreiben also

        pnpdump > /etc/isapnp.conf

- Editieren der Datei `/etc/isapnp.conf`
  Die gerade erstellte Datei wird mit einem Editor bearbeitet, um die gewünschten Einstellungen zu aktivieren. Es ist jetzt möglich, die Hardwareparameter auszusuchen, die auf dem System noch frei sind.
- Aufruf von isapnp
  Das Programm isapnp schreibt die Einstellungen aus seiner Konfigurationsdatei wieder zurück an die Karten. Dieser Vorgang muß nach jedem Booten wiederholt werden. Das Programm isapnp sollte also über ein Startscript bei jedem Systemstart aufgerufen werden.

Nachdem diese drei Schritte vollzogen wurden, sind die ISA-Karten soweit, als wären es normale Karten, die über Jumper oder Software konfiguriert worden sind. Jetzt erst können - mit den entsprechenden Parametern - die Kernelmodule für diese Karte geladen werden.

### Eine Beispielkonfiguration

Um den Vorgang der manuellen Einstellung einmal genauer zu betrachten folgt hier eine Beispielkonfiguration. Ein Rechner ist mit einer Plug and Play-fähigen Ethernetkarte ausgestattet. Der Aufruf von

      pnpdump > /etc/isapnp.conf

erzeugt die Datei `/etc/isapnp.conf` mit folgendem Inhalt (gekürzt). Wichtige Zeilen sind rot hervorgehoben.

    # $Id: pnpdump.c,v 1.21 1999/12/09 22:28:33 fox Exp $
    # Release isapnptools-1.21 (library isapnptools-1.21)
    #
    # This is free software, see the sources for details.
    # This software has NO WARRANTY, use at your OWN RISK
    #
    # For details of the output file format, see isapnp.conf(5)
    #
    # For latest information and FAQ on isapnp and pnpdump see:
    # http://www.roestock.demon.co.uk/isapnptools/
    #
    # Compiler flags:  -DREALTIME -DNEEDSETSCHEDULER -DABORT_ONRESERR
    # (for   library:  -DREALTIME -DNEEDSETSCHEDULER -DABORT_ONRESERR)

    # Card 1: (serial identifier 13 0e 1e 37 b4 19 01 89 14)
    # EDI0119 Serial No 236861364 [checksum 13]
    # Version 1.0, Vendor version 1.0
    # ANSI string -->PLUG & PLAY ETHERNET CARD<--
    # Logical device id EDI0119
    #     Device support I/O range check register
             (CONFIGURE EDI0119/236861364 (LD 0
    #     Compatible device id PNP80d6
    #     Logical device decodes 10 bit IO address lines
    #         Minimum IO base address 0x0240
    #         Maximum IO base address 0x03e0
    #         IO base alignment 32 bytes
    #         Number of IO addresses required: 32
    #         (IO 0 (BASE 0x0340))
    #     IRQ 3, 4, 5, 9, 10, 11, 12 or 15.
    #         High true, edge sensitive interrupt
    #         (INT 0 (IRQ 10 (MODE +E)))
    #     Memory is non-writeable (ROM)
    #     Memory is non-cacheable
    #     Memory decode supports high address
    #     memory is 8-bit only
    #     memory is shadowable
    #     memory is an expansion ROM
    #     Minimum memory base address 0x0c0000
    #     Maximum memory base address 0x0dc000
    #     Range base alignment mask 0xff4000 bytes
    #     Range length 16384 bytes
    # Choose UPPER = Range, or UPPER = Upper limit to suit hardware
    # (MEM 0 (BASE 0x0c0000) (MODE bu) (UPPER 0x0c4000))
    # (MEM 0 (BASE 0x0c0000) (MODE br) (UPPER 0x004000))
    #         (ACT Y))
    )
    # End tag... Checksum 0x00 (OK)

    (WAITFORKEY)

Aus den Angaben kann folgendes ersehen werden:

- Es wurde eine Plug and Play fähige Karte mit der Seriennummer 13 0e 1e 37 b4 19 01 89 14 gefunden.
- Es handelt sich um eine Ethernet-Karte.

Die eigentliche Konfigurationsarbeit findet zwischen den Zeilen

      (CONFIGURE EDI0119/236861364 (LD 0

und

      )

statt. Alle dort gemachten Angaben sind noch auskommentiert, also wirkungslos. Erst durch manuellen Eingriff werden sie aktiviert.

Die Karte benötigt eine IO-Adresse und einen IRQ. Für diese beiden Einstellungen sind jeweils die Informationen angegeben, welche Angaben gemacht werden können. Zunächst die IO-Adresse:

Aus dem Kommentar

      #         Minimum IO base address 0x0240
      #         Maximum IO base address 0x03e0
      #         IO base alignment 32 bytes

können wir entnehmen, daß die kleinste Adresse die 0x240 ist, die größte Adresse 0x3e0. Die Adressen dazwischen können in Schrittweiten von 32 Byte angegeben werden. Gültige IO-Adressen wären also:

- `0x0240`
- `0x0260`
- `0x0280`
- `0x02a0`
- `0x02c0`
- `0x02e0`
- `0x0300`
- `0x0320`
- `0x0340`
- `0x0360`
- `0x0380`
- `0x03a0`
- `0x03c0`
- `0x03e0`

Jede dieser Adressen repräsentiert einen Adressbereich von dieser Adresse bis zur jeweils nächsten. Die Adresse `0x0240` meint also eigentlich den Bereich `0x0240-0x025f`.

Aus diesem Adressenpool muß nun eine Adresse ausgewählt werden, die noch nicht vom System oder einem anderen Gerät benutzt wird. Dazu wird die Datei `/proc/ioports` überprüft, die z.B. für den genannten Adressbereich folgende Angaben beinhalten könnte:

      ...
      0170-0177 : ide1
      01f0-01f7 : ide0
      02f8-02ff : serial(set)
      0376-0376 : ide1
      0378-037a : parport0
      03c0-03df : vga+
      03f6-03f6 : ide0
      03f8-03ff : serial(set)
      ...

Die Adressen `0x02e0-0x02ff` sind für unser Beispiel also nicht zu gebrauchen, weil in diesem Bereich bereits eine Adresse (serial) vergeben ist. Auch die Adressen `0x0360` bis `0x03e0` sind bereits durch andere Geräte (ide1, Parport0, vga, ide0 und serial) belegt. Alle anderen Adressen stehen uns zur freien Verfügung. Wir wählen beispielsweise die Adresse `0x0300`. Um diese Einstellung vorzunehmen ändern wir die Zeile

      #         (IO 0 (BASE 0x0340))

entsprechend um, und entziehen ihr das Kommentarzeichen:

               (IO 0 (BASE 0x0300))

Ähnlich gehen wir jetzt mit dem IRQ um. Die Zeile

      #     IRQ 3, 4, 5, 9, 10, 11, 12 or 15.

zeigt uns alle IRQs, die unsere Karte zur Verfügung stellt. Ein Blick nach `/proc/interrupts` zeigt uns, welche IRQs auf unserem System schon belegt sind:

       0:     882379          XT-PIC  timer
       1:      31607          XT-PIC  keyboard
       2:          0          XT-PIC  cascade
      10:        126          XT-PIC  ES1938
      11:      54397          XT-PIC  aic7xxx
      12:     250763          XT-PIC  PS/2 Mouse
      14:      41476          XT-PIC  ide0
      15:      63616          XT-PIC  ide1

IRQ 5 wäre beispielsweise noch frei. Um diesen IRQ zu aktivieren, ändern wir die Zeile

      #         (INT 0 (IRQ 10 (MODE +E)))

entsprechend um und entfernen wiederum das Kommentarzeichen:

               (INT 0 (IRQ 5 (MODE +E)))

Damit sind alle notwendigen Einstellungen erledigt, wir müssen die Karte jetzt nur noch aktivieren. Dazu wird der Zeile

      #         (ACT Y))

das Kommentarzeichen entfernt. Damit sind die manuellen Einstellungen erledigt, die Datei kann abgespeichert werden.

Um die vorgenommenen Einstellungen jetzt tatsächlich der Karte bekannt zu machen, muß das Programm isapnp aufgerufen werden. Das Programm bekommt den Namen der Konfigurationsdatei als Parameter, der Aufruf lautet also:

      /sbin/isapnp /etc/isapnp.conf

Diese Zeile muß bei jedem Systemstart erneut ausgeführt werden. Sie sollte also in einem der init-Scripts eingetragen sein. Meist wird bei der Installation von isapnp bereits ein entsprechendes init-Script angelegt.

Mit der hier besprochenen Einstellungsarbeit ist die ISA-Karte aber noch nicht ins System eingebunden. Das Einzige, was mit dieser Arbeit erreicht wurde ist, daß die Karte jetzt die entsprechenden Hardwareparameter benutzt. Die Arbeit entspricht also der manuellen Einstellung durch Jumper auf alten Karten. Das Laden der entsprechenden Module und die Übergabe der Hardwareparameter wird Thema der Vorbereitung auf die zweite Prüfung sein.