|
|
Festplatte[Bearbeiten] FestplatteIm uC-Forum tauchen gelegentlich immer mal wieder Fragen auf, wie man eine Festplatte ansteuert. Da ich mich selber auch relativ lange damit befasst habe, habe ich viel Zeit investierte, um alle Infos zusammen zu bekommen und hier mal einen Artikel gebastelt, der die wichtigsten Grundlagen vermitteln sollte, also wie eine Festplatte aufgebaut ist, welche Register es gibt und wie man mittels Command Codes irgendwelche Aktionen ausführt. [Bearbeiten] Grundlegender Aufbau einer FestplatteSicher haben einige von euch schon mal eine Festplatte auseinander genommen. Die können diesen Abschnitt getrost überspringen ;) Für die anderen hier mal ein Bild: Der Plattenstapel dreht sich üblicherweise mit einer Geschwindigkeit von 4200 oder 5400 U/min (Notebook-Festplatten), 7200 U/min (Desktop-Festplatten) oder mit über 10'000 U/min (Server-Festplatten). Die Platten selber bestehen aus Aluminium oder Glas, welches mit einer ferromagnetischen Schicht versehen ist. Die Schreib-/Leseköpfe können mittels eines sogenannten 'Servos' über den Platten positioniert werden. Sie sind im Prinzip kleine Spulen, die über einen Flexiblen Leiter mit einem Verstärker verbunden sind. Dieser Verstärker stellt die Verbindung mit der Elektronik her. Wenn nun die Platten rotieren, entsteht dadurch ein Luftzug im Festplattengehäuse. Der Luftzug hebt dann die Schreib-/Leseköpfe von der Plattenoberfläche ab, diese schweben dann einige nm über der Plattenoberfläche. Aus diesem Grund brauchen Festplatten einen minimalen Luftdruck (Oft ist im Datenblatt vermerkt, bis zu welcher Meereshöhe man das Gerät betreiben darf). [Bearbeiten] Wie werden jetzt die Daten gespeichert?Nun müssen natürlich irgendwie die Bits & Bytes auf dieser magnetischen Plattenschicht abgelegt werden können. Um das zu tun, wird eine spezielle Einteilung vorgenommen. Als erstes werden die Platten in konzentrische Ringe unterteilt. Diese Ringe werden als 'Track' bezeichnet. Alle Tracks, die vom Plattenzentrum den selben Abstand haben, nennt man Zylinder. Die Tracks wiederum unterteilt man in Sektoren. Üblicherweise sind es 63 Sektoren pro Track. In jedem Sektor lassen sich 512 Bytes speichern. Möchte man nun Einen Sektor gezielt adressieren, benötigt man also dessen Zylinder, die Sektornummer, und die Nummer des Schreib-/Lesekopfs (da die Ober- und Unterseite der Platten für die Datenspeicherung verwendet werden). Diese Adressierung nennt man CHS (für Cylinder, Head, Sector). Sie wird von neueren Festplatten oft nicht mehr unterstützt. Für diese gibt es eine einfachere Adressierungsart, nämlich LBA (Linear Block Address). Hier wird eine einzige 28 Bit lange Zahl verwendet, die alle Sektoren nacheinander linear durchnummeriert. In beiden Adressierungsarten lassen sich aber max. 128 GByte adressieren (warum, dazu später mehr). [Bearbeiten] Der IDE-SteckerIDE- (bzw. ATA-) Festplatten besitzen eine relativ einfache Schnittstelle zur Steuerung. Die Steckerbelegung sieht wie folgt aus: Beschreibung der Signale:
Die restlichen Signale braucht man nur, wenn man mit DMA arbeitet, worauf ich in diesem Artikel nicht näher eingehe. Zum steuern der Festplatte braucht man übrigens die Leitungen IORDY, CSEL un PDIAG nicht unbedingt. An DASP kann man eine LED incl. Vorwiderstand anschliessen. Die blinkt dann auf, wenn auf die Platte zugegriffen wird. Die Signalpegel für die Leitungen sind alle 5V TTL. Wenn man also einen mit 3.3V betriebenen Microcontroller mit 5V-Toleranten Eingängen hat, kann man die Festplatte problemlos ansteuern (habe ich selbst allerdings noch nicht getestet). [Bearbeiten] Der RegisterblockDie Festplatte besitzt 13 verschiedene Register. Auf diese kann man wie folgt zugreifen:
Wenn man DMA verwendet, dann sind noch weitere Adressierungen möglich, auf diese gehe ich hier allerdings (noch) nicht ein. Wenn beide Chip Select-Eingänge auf 1 sind, dann ist der Datenbus in einem hochohmigen Zustand (tristate). Zu beachten ist noch, dass alle Register (ausser dem Datenregister) nur 8 Bit breit sein. Diese 8 Bit werden auf den Datenleitungen DD0..7 übertragen. Auch erkennt man aus der Tabelle, dass u.U. je nach Operation (lesen, schreiben) unterschiedliche Register ausgewählt werden (was auch richtig ist, denn es macht ja keinen Sinn, etwas ins Status-Register zu schreiben...). [Bearbeiten] Das Alternate Status / Status RegisterDas Alternate Status Register hat grundsätzlich dieselbe Funktion wie das Status Register. Mit einem kleinen Unterschied: Wenn die Laufwerkselektronik einen Interrupt erzeugt (z. B. weil Daten gelesen werden sollen), dann wird der Interrupt gelöscht, wenn man das Status Register liest. Beim Lesen des Alternate Status Registers bleibt der Interrupt jedoch erhalten. In beiden Registern sind die folgenden Bits enthalten:
[Bearbeiten] Das Command-RegisterIn das Command Register schreibt man einen speziellen Command-Code, der bestimmte Aktionen einletet. So bewirkt z. B. das schreiben des Codes 0x30 das schreiben eines Sektors auf die Platte. Der Befehl wird unmittelbar nach dem Schreiben ins Command Register ausgeführt und BSY auf 1 gesetzt. [Bearbeiten] Das Data RegisterDas Data Register ist 16 Bit breit (als einziges der Register). Bei einem Lese- oder Schreibkommando können hier die gelesenen Daten abgeholt bzw. reingeschrieben werden. [Bearbeiten] Device Control RegisterDas Device Control Register enthält folgende Bits:
Setzt man SRST auf 1, so wird ein Software Reset durchgeführt. Mit nIEN kann man die Interrupts ein- oder ausschalten. [Bearbeiten] Device Register & LBA Bits 24..27Im Device Register stehen folgende Bits:
L gibt an, dass das Laufwerk in den LBA-Modus geschaltet werden soll (L = 1) oder dass CHS-Adressierung verwendet werdem soll (L = 0). DRV dient zur Adressierung eines Laufwerks, also zur Unterscheidung Master / Slave und ist nur nötig, wenn man 2 Laufwerke an einem Kabel betreibt. DRV = 0 wählt das Master-Laufwerk aus, DRV = 1 adressiert das Slave-Laufwerk. Die Bits H0..H3 geben die Nummer des Kopfes an, wenn CHS-Adressierung verwendet wird. Wird LBA verwendet, dann kommen hier die Bits 24..27 hin. [Bearbeiten] Error RegisterDas Error Register sieht so aus:
CRC bedeutet, dass bei einem DMA-Transfer ein CRC-Fehler aufgetreten ist. UNC gibt an, dass bei einer Datenübertragung ein Fehler erkannt worden ist, dieser aber nicht korrigiert werden konnte. IDNF zeigt an, dass der angeforderte Sektor nicht gefunden worden ist. ABRT wird auf 1 gesetzt, wenn ein Befehl abgebrochen (aborted) wurde. TK0NF Zeigt an, dass Track 0 nicht gefunden worden ist. AMNF (Address Mark not found): Zeigt an, dass der gewünschte Sektor zwar gefunden wurde, seine Daten aber nicht. [Bearbeiten] Features RegisterDas Features Register bekommt, je nach ausgeführtem Befehl, eine andere Bedeutung. [Bearbeiten] Cylinder High / LBA Bits 16..23Hier kommt das High Byte der Zylindernummer rein, wenn man CHS-Adressierung verwendet. Setzt man LBA ein, dann müssen hier die entsprechenden LBA Bits geschrieben werden. [Bearbeiten] Cylinder Low / LBA Bits 8..15Das Low-Byte der Zylindernummer bei CHS-Adressierung; Bits 8..15 bei LBA-Adressierung. [Bearbeiten] Sector Number / LBA Bits 0..7Wenn man mit CHS arbeitet, muss hier die Sektornummer stehen. Achtung: Sektoren werden von 1 her beginnend Adressiert! Bei LBA werden hier die Bits 0..7 platziert. [Bearbeiten] Sector Count RegisterHier kann man angeben, wie viele Sektoren man beim nächsten Befehl übertragen möchte. Die Festplatte kann bis 256 Sektoren auf einmal lesen. [Bearbeiten] Die Steuerung der PlatteUm jetzt endlich die Festplatte ansteuern zu können, wird wie folgt vorgegangen: Als erstes muss man allfällige Command-Parameter in den entsprechenden Registern platzieren. Siehe Beispiel. Anschliessend wird der Command Code ins Command Register geschrieben. Dann kann man auf 2 Arten verfahren:
Wenn man den Command Code abgesetzt hat und die Platte nicht mehr BSY ist, kann man schon das Datenregister schreiben (bzw. lesen). Das Vorgehen für den Read Sector-Command ist z. B. wie folgt:
Im Detail:
[Bearbeiten] Command CodesUm natürlich bestimmte Aktionen ausführen zu können, muss man die Command Codes der Festplatte kennen. Die wichtigsten Command Codes lauten:
Es gibt natürlich noch wesentlich mehr Kommandos, aber mit diesen paar hier kann man i.d.R. schon alles, was man braucht, um ein Dateisystem zu implementieren. Eine genauere Beschreibung findet sich unter diesem Link: http://t13.org/Documents/MinutesDefault.aspx?DocumentType=4&DocumentStage=2 Dann dort den gewünschten ATA-Standard auswählen (Aktuell ist glaube ich ATA-7). [Bearbeiten] Links |