Zurück   EffizienzGurus Forum > Software & mehr > Anwendungsprogramme > Programmierecke

Hinweise

Wie greife ich direkt auf die HDD zu?

Dieses Thema wurde 5 mal beantwortet und 4055 x angesehen.

Antwort
 
Themen-Optionen
Alt 05.01.2007, 12:40   #1
Könner
 
Registriert seit: 01.2007
Ort: Halle
Beiträge: 68
Standard Wie greife ich direkt auf die HDD zu?

Folgendes gilt fuer P-ATA HDD und Compactflash Karten, da diese auch AT-A implementieren. AT Festplatten haben zumeist ein ausreichendes Subset der folgenden features.
Ich moechte mich erstmal auf den PIO 0 Modus beschraenken, weil der am einfachsten zu nutzen ist. Der Anschluss der Festplatte ist von der Art her wie eine Verlaengerung eines Systembusses. Man benoetigt von dem 40 Anschluessen nicht alle, sondern:
1 Reset
2 Ground
3 - 18 Data Bus wobei die Zuordnung immer abwechselnd ist: 7,8,6,9,5,10 usw.
Dann benoetigt man zur Adressierung Pin 35,33,36 - Adressbits 0 bis 2.
und Pins 37,38 CS1FX,CS3FX fuer den Chip Select 0 und 1
Zum Lesen und Schreiben gibt es noch die Read DIOR Pin 25 bzw. Write DIOW Pin 23 Leitung.
Fuer 16 Bit Adressierung muss man weiterhin Pin 32 IOCS16 auf aktiv ziehen
Das macht man am besten standardmaessig.

Weitere Pins werden fuer PIO 0 nicht benoetigt, zu beachten gilt, dass CS1FX, CS3FX, IOCS16, RESET, DIOR, DIOW low aktiv sind.

Softwaremaessig beginnt es zuerst damit, das Laufwerk zu resetten. Dabei muss /RES fuer mindestens 25 Mikrosekunden auf aktiv gehalten werden.
Danach fragt man den Laufwerksstatus ab und das ist das erste mal, wo man auf ein Register in der HDD zugreift. Das Status Register ist im Command Control Block also CS1FX Register 0 beim Lesen. Ein Lesezugriff laeuft so ab:
Adresse anlegen, in dem Fall 0
DIOR aktivieren
Daten lesen
DIOR deaktivieren

gleich analog ein Schreibzugriff auf ein Register der HDD:
Datenports des IO Bausteins zur HDD auf Ausgang setzen
Adresse anlegen
DIOW aktivieren
Datum anlegen
DIOW deaktivieren (Datum wird uebernommen)
Datenports des IO Bausteins zur HDD auf Eingang setzen

Ok wenn man das Statusregister nach Reset gelesen hat kann man die Bits auswerten:
Bits
7 BSY Busy
6 DRDY Drive Ready
3 DRQ Data request
sind die wichtigsten.
Nach Reset wartet man bis BSY inaktiv geht.

Folgende Zugriffe gehen alle auf CS1FX.

Laufwerk identifizieren:
Bevor man ein Kommando absetzt muss man warten, bis die HDD Ready ist, dazu liest man davor das Status Register aus und prueft ob DRDY gesetzt ist.
Die Identifizierung einer HDD laeuft so ab, dass man einen virtuellen Sektor a 512 Byte liest, in dem die HDD ihre Daten mitteilt. Dazu setzt man im Kommandoregister $07 den Befehlscode $ec. Dann wartet man bis im Statusregister BSY ausgeht.

Um die Daten nun zu lesen fuehrt man einen Transfer von 512 Byte Sektordaten durch. Das laeuft immer nach folgendem Schema ab:
Man wartet bis im Statusregister BSY = 0 und DRQ = 1 ist.
Danach fuehrt man 256 aufeinanderfolgende 16 Bit Lesezugriffe auf Adresse 0 aus.
(Sector schreiben geht analog)

In dem Identifizierungsdaten gibt es nur wenige wirklich wichtige Daten:
Byte Offset
2,3 Cylinder low,high
6 Heads
12 Sectors

114 bis 117 Kapazitaet in Sektoren - nur bei LBA

99 Bit 1 - LBA Support ja / nein

Mit LBA werden die Sektoren sequentiell durchnummeriert.
Im folgenden nehme ich an, dass die HDD LBA supportet, ca. ab 500 MB Kapazitaet sollte sie das koennen.

Einen Sektor lesen:
Man wartet bis DRDY gesetzt ist. Dann schreibt man einen 1 in das Sektorcount Register 3. Dann schreibt man eine 28 bittige Sektornummer in Register 3 bis 6 beginnend mit dem LSB. Nun schreibt man das Sektor lesen Kommando $20 in das Kommandoregister 7 und wartet danach bis BSY ausgeht. Nun kann man wie oben beschrieben die Sektordaten transferieren.

Einen Sektor schreiben geht analog, nur dass man Kommandocode $30 verwenden muss.

Damit hat man schon die komplette Basisfunktionalitaet um eine Festplatte zu lesen und zu schreiben.

Um auf einen Rutsch mehrere Sektoren zu lesen benutzt setzt man Sektorcount auf einen hoehere Zahl, 0 entspricht 256 Sektoren. Nach dem Transfer eines 512 Byte Buffers muss man warten bis DRQ wieder aktiv geht bis man den naechsten Sektor transferiert.

LBA 48 ist auch sehr einfach zu nutzen, man muss ein anderes Kommando zum lesen und zu schreiben von Sektoren benutzen: $24 bzw $34.
Dann sind die LBA und das Sektorcountregister 2 Byte FIFOs. Dabei werden die highest 4 Bits der LBA 28 Adressierung nichtmehr in Register 6 geschrieben, sondern es wird nurnoch 3,4,5 benutzt. Zuerst werden Bits 24 bis 47 geschrieben, dann 0 bis 23. Das nun 16 bittige Sektorcountregister hat den Vorteil, dass man gleich noch mehr Sektoren auf ein Kommando transferieren kann.

Geändert von elianda (05.01.2007 um 12:42 Uhr) Grund: kleine Rechtschreibkorrektur
elianda ist offline   Mit Zitat antworten
Alt 05.01.2007, 12:57   #2
Semi Profi
 
Benutzerbild von HOSCHII
 
Registriert seit: 10.2006
Ort: Fulda
Beiträge: 235
Standard

Um was gehts denn hier genau?!
HOSCHII ist offline   Mit Zitat antworten
Alt 05.01.2007, 12:59   #3
EffizienzGuru
Admin in Rente
 
Benutzerbild von Chibu
 
Registriert seit: 10.2006
Beiträge: 6.239
Standard

Um was es hier geht, steht im Threadtitel.
Was ich mich frage, was man damit erreicht, wo der Sinn der Aktion besteht.

Kann uns der Threadersteller vielleicht dazu noch ein paar Infos zukommen lassen?
Chibu ist offline   Mit Zitat antworten
Alt 05.01.2007, 13:03   #4
Semi Profi
 
Benutzerbild von HOSCHII
 
Registriert seit: 10.2006
Ort: Fulda
Beiträge: 235
Standard

Ich hab auch mehr auf den Sinn angespielt... -.-
HOSCHII ist offline   Mit Zitat antworten
Alt 05.01.2007, 13:04   #5
Administrator in Rente
Bughunter
 
Benutzerbild von buyman
 
Registriert seit: 09.2006
Ort: Salzburg (Österreich)
Beiträge: 3.571
Standard

Wo hast du die Festplatte eigentlich angeschlossen bzw. womit steuerst du sie an?
__________________
Früher im Sandkasten war das alles viel einfacher:
Da gabs was mit der Schüppe auf die Fresse ... und gut wars - aber Heute?
Werd auch du ein Guru

Geändert von buyman (05.01.2007 um 13:31 Uhr) Grund: Kleiner Zustatz
buyman ist offline   Mit Zitat antworten
Alt 06.01.2007, 18:11   #6
Könner
 
Registriert seit: 01.2007
Ort: Halle
Beiträge: 68
Standard

Naja ich wollte mal aufzeigen, dass es nahezu trivial einfach ist auf eine P-ATA Festplatte direkt zuzugreifen. Bei aktueller PC Hardware kommt man garnichtmehr so direkt heran, da der IDE-Controller dazwischen ist.
Zum ansteuern reicht irgendein digitaler I/O Baustein mit TTL kompatiblen Ausgaengen. Theoretisch geht es auch mit dem LPT Port, nur da hat einer zuwenig Pins.
Selbst verwende ich den 8255 von Intel, das ist sozusagen die Gebrauchskartoffel der digital I/O Bausteine. Der Chip bietet 24 Bit, deren Datenrichtung man in 8 Bit Bloecken waehlen kann. Der ist an einem C64 oder C128, da diese Systeme die beste Dokumentation ueberhaupt bieten.
elianda ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are an
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 Uhr.


Powered by vBulletin® Version 3.7.5 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41