| Zeile 2: | Zeile 2: | ||
== Erkennen der angeschlossenen Geräte == | == Erkennen der angeschlossenen Geräte == | ||
| − | Eine der größten Hürden zu Beginn beim Schreiben eines ATA-Treibers ist das Erkennen der angeschlossenen Geräte. Hierzu gibt es keinen von der Spezifikation vorgeschriebenen Weg. Viele Methoden funktionieren zwar in einigen Emulatoren aber auf echter Hardware nicht und umgekehrt. | + | Eine der größten Hürden zu Beginn beim Schreiben eines ATA-Treibers ist das Erkennen der angeschlossenen Geräte. Hierzu gibt es keinen von der Spezifikation vorgeschriebenen Weg. Viele Methoden funktionieren zwar in einigen Emulatoren, aber auf echter Hardware nicht und umgekehrt. |
| − | Beim Schreiben des ATA-Treibers für týndur habe ich lange nach einer Methode gesucht, die überall funktioniert und lange Wartezeiten beim Erkennen der Geräte vermeidet. Mittlerweile glaube ich, eine passende Methode gefunden zu haben, die in [[QEMU]] und [[VMWare]] und auf sämtlichen meinen bisher getesteten Maschinen funktioniert ( | + | Beim Schreiben des ATA-Treibers für týndur habe ich lange nach einer Methode gesucht, die überall funktioniert und lange Wartezeiten beim Erkennen der Geräte vermeidet. Mittlerweile glaube ich, eine passende Methode gefunden zu haben, die in [[QEMU]] und [[VMWare]] und auf sämtlichen meinen bisher getesteten Maschinen funktioniert (vier Rechner von P1 bis zum P4). |
=== HOB-Bit löschen === | === HOB-Bit löschen === | ||
| − | Im OSDev-Forum bin ich darauf gestoßen, dass man vor dem Suchen nach Geräten zuerst das HOB-Bit in den Kontrollregistern der beiden Geräte löschen sollte, da noch nicht klar ist, ob sie LBA48 unterstützen oder nicht. Ob es wirklich notwendig ist weiß ich nicht, aber schaden kann es ja nicht. | + | Im OSDev-Forum bin ich darauf gestoßen, dass man vor dem Suchen nach Geräten zuerst das HOB-Bit in den Kontrollregistern der beiden Geräte löschen sollte, da noch nicht klar ist, ob sie LBA48 unterstützen oder nicht. Ob es wirklich notwendig ist, weiß ich nicht, aber schaden kann es ja nicht. |
=== Floating Bus === | === Floating Bus === | ||
| Zeile 13: | Zeile 13: | ||
=== Responsive Device === | === Responsive Device === | ||
| − | Der nächste Schritt dient dazu, herauszufinden, ob auf dem Bus ein Gerät vorhanden ist, das auf Anfragen reagiert. Der Test kann einfach durchgeführt werden, indem man ein Gerät auswählt, danach beliebige Werte in die LBA-Register schreibt, und diese wieder ausliest. Wenn ein antwortendes Gerät vorhanden ist, kann man die gleichen Werte wieder einlesen, wenn das nicht der Fall ist, müssen auf dem Bus keine weiteren Prüfungen vorgenommen werden. Sicherheitshalber sollte hier zweimal geprüft werden, einmal mit Master und einmal mit Slave. Dies | + | Der nächste Schritt dient dazu, herauszufinden, ob auf dem Bus ein Gerät vorhanden ist, das auf Anfragen reagiert. Der Test kann einfach durchgeführt werden, indem man ein Gerät auswählt, danach beliebige Werte in die LBA-Register schreibt, und diese wieder ausliest. Wenn ein antwortendes Gerät vorhanden ist, kann man die gleichen Werte wieder einlesen, wenn das nicht der Fall ist, müssen auf dem Bus keine weiteren Prüfungen vorgenommen werden. Sicherheitshalber sollte hier zweimal geprüft werden, einmal mit Master und einmal mit Slave. Dies ist zwar eigentlich sinnlos, aber in VMWare reagiert der Master nicht (wie es in der Spezifikation vorgeschrieben ist), falls nur der Slave angesprochen wird, und soviel Zeit braucht das ganze ja nicht. |
| − | === IDENTIFY DEVICE - Kommando === | + | === IDENTIFY-DEVICE-Kommando === |
| − | Falls keine der vorherigen Prüfungen fehlgeschlagen ist, müsste jetzt mindestens ein Gerät am Bus vorhanden sein. Das wird jetzt sichergestellt und genauer ermittelt, welche Geräte wirklich vorhanden sind. Dies wird mit dem IDENTIFY DEVICE Befehl | + | Falls keine der vorherigen Prüfungen fehlgeschlagen ist, müsste jetzt mindestens ein Gerät am Bus vorhanden sein. Das wird jetzt sichergestellt und genauer ermittelt, welche Geräte wirklich vorhanden sind. Dies wird mit dem IDENTIFY-DEVICE-Befehl erledigt. Beim Senden dieses Befehls ist es sehr wichtig, dass man die ATA-Spezifikation genau befolgt, und sich an die dort erwähnten Protokolle hält. Wenn das korrekt gemacht wird, geht das Erkennen ohne ewig lange Timeouts und co. vonstatten. Falls das Identifizieren eines Gerätes fehlschlägt, heißt das noch nicht, dass kein Gerät vorhanden ist. Denn es könnte auch sein, dass es sich um ein Gerät mit PACKET-Interface handelt. Diese Geräte lassen sich mit dem IDENTIFY PACKET DEVICE identifizieren. |
== Register == | == Register == | ||
| Zeile 52: | Zeile 52: | ||
* ICRC: CRC-Vergleichsfehler bei Ultra-DMA-Übertragungen | * ICRC: CRC-Vergleichsfehler bei Ultra-DMA-Übertragungen | ||
* UNC: Fehler im Datenfeld des Sektors | * UNC: Fehler im Datenfeld des Sektors | ||
| − | * MC: Das Speichermedium(CD) wurde gewechselt | + | * MC: Das Speichermedium (CD) wurde gewechselt |
* IDNF: Die Sektor-ID wurde nicht gefunden | * IDNF: Die Sektor-ID wurde nicht gefunden | ||
* MCR: Bei einem CD-Laufwerk wurde der Auswurf-Knopf gedrückt | * MCR: Bei einem CD-Laufwerk wurde der Auswurf-Knopf gedrückt | ||
| Zeile 81: | Zeile 81: | ||
|} | |} | ||
* BSY: Busy | * BSY: Busy | ||
| − | * DRDY: Drive Ready. Gesetzt, wenn | + | * DRDY: Drive Ready. Gesetzt, wenn das Laufwerk Kommandos annehmen kann. |
* DF: Device Fault. Betrifft Fehler, die nicht im Fehlerregister angezeigt werden. | * DF: Device Fault. Betrifft Fehler, die nicht im Fehlerregister angezeigt werden. | ||
| − | * #: | + | * #: Befehlsabhängig. |
* DRQ: Ein Zugriff auf das Datenregister wird erwartet | * DRQ: Ein Zugriff auf das Datenregister wird erwartet | ||
* ERR: Error-Bit. Nach Fehler gesetzt, Beschreibung im Fehlerregister. | * ERR: Error-Bit. Nach Fehler gesetzt, Beschreibung im Fehlerregister. | ||
| Zeile 99: | Zeile 99: | ||
* HOB: siehe [[AT Attachment#HOB-Bit löschen|HOB-Bit]] | * HOB: siehe [[AT Attachment#HOB-Bit löschen|HOB-Bit]] | ||
* SRST: Software Reset | * SRST: Software Reset | ||
| − | * nIEN: Wenn gesetzt, sendet der Controller keine | + | * nIEN: Wenn gesetzt, sendet der Controller keine IRQs mehr |
* 0: Immer 0 | * 0: Immer 0 | ||
== Kommandos == | == Kommandos == | ||