diff options
Diffstat (limited to 'src/drivers/ata.c')
| -rw-r--r-- | src/drivers/ata.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/drivers/ata.c b/src/drivers/ata.c new file mode 100644 index 0000000..82df0e3 --- /dev/null +++ b/src/drivers/ata.c @@ -0,0 +1,34 @@ +#include <toxic/io.h> + +int +ata_read_sector( + int lba, + int total, + void *buf) +{ + int i, j; + unsigned short *ptr; /* Get 2 bytes at a time from the controller */ + + outb(0x1F6, (lba >> 24) | 0xE0); + outb(0x1F2, total); + outb(0x1F3, (unsigned char)(lba & 0xff)); + outb(0x1F4, (unsigned char)(lba >> 8)); + outb(0x1F5, (unsigned char)(lba >> 16)); + outb(0x1F7, 0x20); + + ptr = (unsigned short *)buf; + + for (i = 0; i < total; i++) { + char c = insb(0x1F7); + /* This should be implemented in interrupts */ + while (!(c & 0x08)) + c = insb(0x1F7); + + for (j = 0; j < 256; j++) { + *ptr = insw(0x1F0); + ptr++; + } + } + + return 0; +} |
