Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: Masen am 15. September 2005, 17:58

Titel: HDD Tutorial
Beitrag von: Masen am 15. September 2005, 17:58
Hi,

brauche unbedingt gute Tuts für HDD Treiber programmierung !!

danke im voraus ^^
Titel: HDD Tutorial
Beitrag von: [MM] am 15. September 2005, 18:54
Probiers mal mit diesem hier:
http://www.karig.net/os/001f.html

MM
Titel: HDD Tutorial
Beitrag von: Masen am 15. September 2005, 19:01
danke, aber ich hät vieleicht dazu sagen sollen das ich das für einen C-Kernel bräuchte deswegen einige C Beispiele ^^
Titel: HDD Tutorial
Beitrag von: Roshl am 16. September 2005, 15:49
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^^
Titel: HDD Tutorial
Beitrag von: DarkThing am 16. September 2005, 17:12
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.
Titel: HDD Tutorial
Beitrag von: Masen am 16. September 2005, 17:52
joa danke wär nett ^^
Titel: HDD Tutorial
Beitrag von: WhiteDragon am 16. September 2005, 18:05
Ja, bitte, ich würde ihn mir auch gerne anschauen!
Titel: HDD Tutorial
Beitrag von: DarkThing am 17. September 2005, 12:44
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;
}