Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Masen am 15. September 2005, 17:58
-
Hi,
brauche unbedingt gute Tuts für HDD Treiber programmierung !!
danke im voraus ^^
-
Probiers mal mit diesem hier:
http://www.karig.net/os/001f.html
MM
-
danke, aber ich hät vieleicht dazu sagen sollen das ich das für einen C-Kernel bräuchte deswegen einige C Beispiele ^^
-
Um die HDD anzusprechen muss man allerdings mit ports hantieren, da kommt man um asm nicht herum (und sei es indem man sich inb und outb funktionen in C definiert).
Ich hatte mal funktionierenden Code dafür, hatte ähnlichkeiten mit dem auf der genannten Seite (hab nur kurz draufgeschaut) sollte doch machbar sein daraus was zu machen, einfach Asm in C übertragen^^
-
Auf www.todo-online.de.vu gibts ja eine Beschreibung aller Ports. Ansonsten ist es ziemlich einfach, mein HDD-Treiber besteht (inkl. Kommentare) aus weniger als 100 Zeilen. Wenn ihn jemand braucht kann ich ihn ja posten.
-
joa danke wär nett ^^
-
Ja, bitte, ich würde ihn mir auch gerne anschauen!
-
Also: Das ganze ist nichts für ein Multitasking-OS, da ich kein DMA verwende:
Einen Sektor lesen:
BOOL hdddrv_read_sector(unsigned int sector, unsigned short *buffer, unsigned int drive) {
int i;
while((inport(0x1f7) & 0x80) == 0x80); /* Solange warten bis Laufwerk bereit ist */
/* Beinhaltet das Laufwerk, die Upperbits des Sektors und versetzt das Laufwerk in den LBA Mode */
outport(0x1f6, 0x40 | (drive << 4) | ((sector >> 24) & 0x0F));
outport(0x1f2, 1); /* Anzahl der zu lesenden Sektoren (erstmal nur einer) */
outport(0x1f3, sector & 0xFF); /* Sektor Nummer, Lower Byte */
outport(0x1f4, (sector >> 8) & 0xFF); /* Sektor Nummer, Middle Byte */
outport(0x1f5, (sector >> 16) & 0xFF); /* Sektor Nummer, N�hstes Byte*/
outport(0x1f7, 0x20); /* Befehl: Lesen!!! */
while((inport(0x1f7) & 0x80) == 0x80); /* Warten bis der Befehl ausgefhrt wurde */
while((inport(0x1f7) & 0x0F) != 8); /* Warten bis das Laufwerk bereit ist Bytes zu senden */
/* Byte fr Byte holen */
for(i=0;i<=256;i++)
buffer[i] = inportw(0x1f0);
/* Fehler aufgetreten? */
if(inport(0x1f1)){
return FALSE;
}
/* Alles ok */
return TRUE;
}
Einen Sektor schreiben:
BOOL hdddrv_write_sector(unsigned int sector, unsigned short *buffer, unsigned int drive) {
int i;
while((inport(0x1f7) & 0x80) == 0x80); /* Solange warten bis Laufwerk bereit ist */
/* Beinhaltet das Laufwerk, die Upperbits des Sektors und versetzt das Laufwerk in den LBA Mode */
outport(0x1f6, 0x40 | (drive << 4) | ((sector >> 24) & 0x0F));
outport(0x1f2, 1); /* Anzahl der zu lesenden Sektoren (erstmal nur einer) */
outport(0x1f3, sector & 0xFF); /* Sektor Nummer, Lower Byte */
outport(0x1f4, (sector >> 8) & 0xFF); /* Sektor Nummer, Middle Byte */
outport(0x1f5, (sector >> 16) & 0xFF); /* Sektor Nummer, N�hstes Byte*/
outport(0x1f7, 0x30); /* Befehl: Schreiben!!! */
while((inport(0x1f7) & 0x80) == 0x80); /* Warten bis der Befehl ausgefhrt wurde */
while((inport(0x1f7) & 0x0F) != 8); /* Warten bis das Laufwerk bereit ist Bytes zu senden */
/* Byte fr Byte senden */
for(i=0;i<=256;i++)
outportw(0x1f0, buffer[i]);
/* Alles ok */
return TRUE;
}