SCSI-Treiber-Schnittstelle

Der SCSI-Treiber ist eine wichtige offene Software-Schnittstelle (API) für den Zugriff auf beliebige Peripheriegeräte, nicht nur SCSI-Geräte. Auch SATA-Laufwerke für optische Medien (z. B. DVDs und BDs) und USB-Massenspeicher verwenden den SCSI-Kommandosatz. Für andere Hardware-Schnittstellen lassen sich SCSI-Kommandos emulieren, so wie es HDDRIVER für IDE- und SATA-Festplatten tut. Mit SCSI-Treibern lassen sich beliebige SCSI-Kommandos an nahezu beliebige Schnittstellen schicken. Mehrere SCSI-Treiber können koexistieren.

HDDRIVERs Nutzung von SCSI-Treibern

Intern besteht HDDRIVER aus zwei Treiber-Schichten: Dem SCSI-Treiber und dem Festplattentreiber, der ausschließlich über SCSI-Treiber auf Geräte zugreift. Bei diesen Treibern kann es sich um einen der in HDDRIVER eingebauten SCSI-Treiber handeln (für ACSI/SCSI/IDE/ATAPI/SATA), um einen SCSI-Treiber eines Drittanbieters, z. B. für USB, oder eine Kombination. Existiert beim Start von HDDRIVER bereits ein SCSI-Treiber für Bus 0 (ACSI), 1 (SCSI) oder 2 (IDE), benutzt HDDRIVER zum Zugriff auf diesen Bus automatisch den vorhandenen SCSI-Treiber statt seines eigenen, so wie es die SCSI-Treiber-Spezifikation vorschreibt.
Ein Milan mit PCI-SCSI-Karte stellt ein gutes Beispiel dar: Für SCSI-Geräte nutzt HDDRIVER den PCI-SCSI-Treiber des Milan, der bereits beim Booten verfügbar ist. Für IDE-Geräte nutzt HDDRIVER seinen eigenen SCSI-Treiber für Milan IDE. Bei MagiCMac, MagiCPC, Hatari und ARAnyM ist es ähnlich, vorausgesetzt, dass HDDRIVER nach dem SCSI-Treiber für die jeweilige Plattform gestartet wird.

Standard-Schnittstelle

HDDRIVER unterstützt die aktuelle Version 1.01 der SCSI-Treiber-Schnittstelle vollständig. Ein kleiner Schwachpunkt dieser Schnittstelle ist die Beschränkung auf die LUNs 0-7 (SCSI-Untereinheiten) pro Gerät, obwohl SCSI (nicht aber ACSI) 32 LUNs erlaubt. Durch eine abwärtskompatible Erweiterung der SCSI-Treiber-Schnittstelle lassen sich mit HDDRIVERs SCSI-Treiber alle 32 SCSI-LUNs verwenden. Geräte mit mehr als 8 LUNs werden beispielsweise von SCSI2Pi unterstützt.

Target-Schnittstelle

HDDRIVER unterstützt als einziger Treiber die SCSI-Treiber-Target-Schnittstelle: Ein TT oder Falcon wird von anderen Computern (auch Nicht-Ataris) als SCSI-Gerät erkannt und kann standardisierte oder selbstdefinierte SCSI-Kommandos ausführen.
SCSI-Target-Interface
Der Screenshot zeigt den Geräte-Check eines TT, mit einem Falcon am selben Bus. Auf dem TT (SCSI ID 7) läuft HDDRIVER 11.06, auf dem Falcon (SCSI ID 6) HDDRIVER 11.05. Beide Computer "sehen" sich, und der eine kann vom anderen gesendete SCSI-Kommandos ausführen.

Beispielcode in C für die Implementierung eigener SCSI-Kommandos ist auf GitHub verfügbar. Für die fehlerfreie Funktion des Target-Interfaces muss jede Software, die auf SCSI-Peripherie zugreift, dies über die SCSI-Treiber-Schnittstelle tun.

In den HDDRUTIL-Einstellungen lässt sich konfigurieren, ob HDDRIVER mit oder ohne Unterstützung der Target-Schnittstelle installiert werden soll. Ohne Target-Unterstützung belegt HDDRIVER etwa 3 KiB weniger RAM.

Implementierungen

Voll funktionsfähige SCSI-Treiber sind für die folgenden Hardware-Schnittstellen bzw. Emulatoren verfügbar:

Hardware/Emulator Softwarepaket Autor Bemerkung
Atari ACSI/SCSI/IDE HDDRIVER
CBHD/SCSIDRV.PRG
Uwe Seimet
Claus Brod, Steffen Engel
In HDDRIVER integriert
 
Atari ATAPI/SATA HDDRIVER Uwe Seimet In HDDRIVER integriert
Milan IDE/ATAPI/SATA HDDRIVER Uwe Seimet In HDDRIVER integriert
Milan SCSI Milan PCI SCSI Driver Michael Schwingen Open Source
MagiCMac MM_SCSI.PRG Steffen Engel, Thomas Tempelmann
MagiCPC SCSIDRIV.DLL Steffen Engel
Hatari (Linux SCSI/IDE/ATAPI/SATA/USB) NF_SCSI, s. unten Uwe Seimet Open Source
ARAnyM (Linux SCSI/IDE/ATAPI/SATA/USB) NF_SCSI, s. unten Uwe Seimet, Thorsten Otto Open Source

Zur Implementierung eines neuen SCSI-Treibers wird empfohlen, neben der SCSI-Treiber-Dokumentation die offiziellen SCSI-Standards zu lesen und die Testsuite zu verwenden. Informationen zum SCSI-Treiber-Interface liefern auch einige meiner Artikel für die Zeitschrift ST Computer.

Busse und Busnummern

Abhängig von den installierten Treibern können diese Busse existieren:

Busnummer Bus XHDI Major Device IDs Bemerkung
0 ACSI 0-7 Gemäß SCSI-Treiber-Spezifikation
1 SCSI 8-15 Gemäß SCSI-Treiber-Spezifikation, auch für Milan-SCSI (PCI)/MagiCMac/MagiCPC
2 IDE 16-23 Gemäß SCSI-Treiber-Spezifikation, auch für ATAPI/SATA
3 SD 24-31 SD-Karten-Slot (FireBee-Bus IDE2 und Vampire).
Der SCSI-Treiber der FireBee hat leider bekannte Fehler.
4 USB 32-39 USB-Storage-Treiber. Es ist wichtig, die neueste Version zu verwenden.
Leider hat auch diese Version bekannte Bugs (SCSI-Treiber, XHDI, Medienwechsel).
7 Ramdisk 56-63 SCSI-kompatible Ramdisk, z. B. mit HDDRIVER 13
8 Floppy 64-71 Siehe XHDI-Spezifikation. Einen SCSI-Treiber gibt es bisher nicht.
30 Linux-SG-Treiber, Bus A 240-247 SCSI-Treiber für Hatari und ARAnyM (/dev/sg0-/dev/sg7)
31 Linux-SG-Treiber, Bus B 248-255 SCSI-Treiber für Hatari und ARAnyM (/dev/sg8-/dev/sg15)

Per Konvention wird die eindeutige Basis-ID jeder XHDI Major Device ID von der Busnummer * 8 abgeleitet, um gefährliche ID-Konflikte zu vermeiden.
Einige Busse unterstützen keine Transfers von/zu ungeraden Speicheradressen. Benutzen Sie daher niemals ungerade Adressen, egal mit welchem Bus.

SCSI-Treiber- und Firmware-Testsuite

Mehrere offene Dokumente spezifizieren im Detail, wie die Entwicklung von Gerätetreibern für den Atari zu erfolgen hat. Abweichungen von diesen Spezifikationen führen zu Fehlfunktionen bis hin zu Datenverlusten.
Die Testsuite (s. Download-Bereich) ist eine Sammlung von Open-Source-Tools zum Testen von SCSI-Firmware/Emulationen (insbesondere SCSI-2 und neuer) und einiger SCSI-Treiber-Funktionen, auch für SCSI-Treiber für IDE/SATA oder USB. Getestet wird die Kompatibilität zu SCSI-2 und neuer, nicht die Kompatibilität zu HDDRIVER. Letztere folgt aus der SCSI-Kompatibilität.
HDDRIVER wird für die Tests nicht vorausgesetzt, sondern lediglich ein SCSI-Treiber für die zu testenden Busse/Geräte.

Die Testsuite umfasst diese Programme, jedes mit eigener Versionsnummer:

Die Tests verändern keine Daten. SERRTEST, ERRTEST und MCHGTEST listen die verfügbaren Busse auf und erwarten die Eingabe von Bus- und Geräte-IDs. SDRVTEST testet alle vorhandenen Geräte.
Bitte melden Sie sich, falls Sie einen Test finden, bei dem das erwartete Ergebnis nicht der SCSI-Treiber-Spezifikation oder dem SCSI-Standard entspricht. Die Quelltexte aller Programme sind auf GitHub verfügbar, so dass man genau sehen kann, was wie getestet wird.

Manche SD-Karten-Leser für ACSI bestehen den Medienwechsel-Test MCHGTEST nicht. Bei dieser Hardware kann Hot-Swapping von SD-Karten zum Datenverlust führen. Dieser Fehler existiert nicht mit echten physikalischen Wechselplatten (SyQuest, ZIP, JAZ, ...) und auch nicht mit UltraSatan und GigaFile. Hot-Swap wird von korrekt arbeitenden Platten und Treibern übrigens schon seit Jahrzehnten unterstützt, selbst von AHDI.
Es gibt Treiber-Bugs, die nicht durch die Testsuite gefunden werden, aber ebenfalls zu Fehlern nach Medienwechseln führen können. Bei HDDRIVER, ICDBOOT, CBHD, HuSHI und AHDI sind keine solchen Fehler bekannt, aber leider bei einigen Open-Source-Treibern. Die Entwickler der betroffenen Projekte wissen über die Bugs in ihren Treibern (insbesondere SCSI-Treiber und XHDI) Bescheid und würden sich vermutlich über Hilfe freuen.

Das Beispiel-Logfile von SDRVTEST zeigt die Testergebnisse von HDDRIVER mit Geräten, die alle Tests bestehen: Eine IBM DDRS-39130-Festplatte, eine von SCSI2Pi emulierte Wechselplatte, ein von SCSI2Pi emulierter Streamer und das SCSI-Treiber-Target-Interface von HDDRIVER.

Beispiel-Logfile von SDRVTEST Beispiel-Logfile von SDRVTEST

Mit der Testsuite kann man mit Hatari oder ARAnyM und dem SCSI-Treiber für Linux auch native Linux-Geräte testen. Das folgende Logfile testet eine emulierte IDE-Platte und eine echte NVMe-SSD an einem USB-nach-NVMe-Adapter.

Beispiel-Logfile mit Hatari Beispiel-Logfile mit Hatari

In einem Logfile wird jeder Fehler mit "ERROR" markiert. SDRVTEST versucht so gut wie möglich, zwischen Fehlern im SCSI-Treiber und Fehlern in der Geräte-Firmware zu unterscheiden.