diff options
author | kaashoek <kaashoek> | 2006-07-05 20:00:14 +0000 |
---|---|---|
committer | kaashoek <kaashoek> | 2006-07-05 20:00:14 +0000 |
commit | b22d898297a2496ba4cfd31d445769fbebc0a46d (patch) | |
tree | 99a08718f78c6836be1a245650e48c9f20333fb9 /ide.c | |
parent | 8b4e2a08febc8b957b44732dbc7da831479a0005 (diff) | |
download | xv6-labs-b22d898297a2496ba4cfd31d445769fbebc0a46d.tar.gz xv6-labs-b22d898297a2496ba4cfd31d445769fbebc0a46d.tar.bz2 xv6-labs-b22d898297a2496ba4cfd31d445769fbebc0a46d.zip |
timer interrupts
disk interrupts (assuming bochs has a bug)
Diffstat (limited to 'ide.c')
-rw-r--r-- | ide.c | 127 |
1 files changed, 67 insertions, 60 deletions
@@ -21,97 +21,104 @@ static int diskno = 0; static int ide_wait_ready(int check_error) { - int r; + int r; - while (((r = inb(0x1F7)) & (IDE_BSY|IDE_DRDY)) != IDE_DRDY) - /* do nothing */; + while (((r = inb(0x1F7)) & (IDE_BSY|IDE_DRDY)) != IDE_DRDY) + /* do nothing */; - if (check_error && (r & (IDE_DF|IDE_ERR)) != 0) - return -1; - return 0; + if (check_error && (r & (IDE_DF|IDE_ERR)) != 0) + return -1; + return 0; } +void +ide_init(void) +{ + cprintf("ide_init: enable IRQ 14\n"); + irq_setmask_8259A(irq_mask_8259A & ~(1<<14)); + ide_wait_ready(0); +} + + int ide_probe_disk1(void) { - int r, x; + int r, x; - // wait for Device 0 to be ready - ide_wait_ready(0); + // wait for Device 0 to be ready + ide_wait_ready(0); - // switch to Device 1 - outb(0x1F6, 0xE0 | (1<<4)); + // switch to Device 1 + outb(0x1F6, 0xE0 | (1<<4)); - // check for Device 1 to be ready for a while - for (x = 0; x < 1000 && (r = inb(0x1F7)) == 0; x++) - /* do nothing */; + // check for Device 1 to be ready for a while + for (x = 0; x < 1000 && (r = inb(0x1F7)) == 0; x++) + /* do nothing */; - // switch back to Device 0 - outb(0x1F6, 0xE0 | (0<<4)); + // switch back to Device 0 + outb(0x1F6, 0xE0 | (0<<4)); - cprintf("Device 1 presence: %d\n", (x < 1000)); - return (x < 1000); + cprintf("Device 1 presence: %d\n", (x < 1000)); + return (x < 1000); } void ide_set_disk(int d) { - if (d != 0 && d != 1) - panic("bad disk number"); - diskno = d; + if (d != 0 && d != 1) + panic("bad disk number"); + diskno = d; } int ide_read(uint32_t secno, void *dst, unsigned nsecs) { - int r; - - if(nsecs > 256) - panic("ide_read"); - - ide_wait_ready(0); - - outb(0x3f6, 0); - outb(0x1F2, nsecs); - outb(0x1F3, secno & 0xFF); - outb(0x1F4, (secno >> 8) & 0xFF); - outb(0x1F5, (secno >> 16) & 0xFF); - outb(0x1F6, 0xE0 | ((diskno&1)<<4) | ((secno>>24)&0x0F)); - outb(0x1F7, 0x20); // CMD 0x20 means read sector - - sleep(0); - - for (; nsecs > 0; nsecs--, dst += 512) { - if ((r = ide_wait_ready(1)) < 0) - return r; - insl(0x1F0, dst, 512/4); - } + int r; + + if(nsecs > 256) + panic("ide_read"); + + ide_wait_ready(0); + + outb(0x3f6, 0); + outb(0x1F2, nsecs); + outb(0x1F3, secno & 0xFF); + outb(0x1F4, (secno >> 8) & 0xFF); + outb(0x1F5, (secno >> 16) & 0xFF); + outb(0x1F6, 0xE0 | ((diskno&1)<<4) | ((secno>>24)&0x0F)); + outb(0x1F7, 0x20); // CMD 0x20 means read sector + + for (; nsecs > 0; nsecs--, dst += 512) { + if ((r = ide_wait_ready(1)) < 0) + return r; + insl(0x1F0, dst, 512/4); + } - return 0; + return 0; } int ide_write(uint32_t secno, const void *src, unsigned nsecs) { - int r; + int r; - if(nsecs > 256) - panic("ide_write"); + if(nsecs > 256) + panic("ide_write"); - ide_wait_ready(0); + ide_wait_ready(0); - outb(0x1F2, nsecs); - outb(0x1F3, secno & 0xFF); - outb(0x1F4, (secno >> 8) & 0xFF); - outb(0x1F5, (secno >> 16) & 0xFF); - outb(0x1F6, 0xE0 | ((diskno&1)<<4) | ((secno>>24)&0x0F)); - outb(0x1F7, 0x30); // CMD 0x30 means write sector + outb(0x1F2, nsecs); + outb(0x1F3, secno & 0xFF); + outb(0x1F4, (secno >> 8) & 0xFF); + outb(0x1F5, (secno >> 16) & 0xFF); + outb(0x1F6, 0xE0 | ((diskno&1)<<4) | ((secno>>24)&0x0F)); + outb(0x1F7, 0x30); // CMD 0x30 means write sector - for (; nsecs > 0; nsecs--, src += 512) { - if ((r = ide_wait_ready(1)) < 0) - return r; - outsl(0x1F0, src, 512/4); - } + for (; nsecs > 0; nsecs--, src += 512) { + if ((r = ide_wait_ready(1)) < 0) + return r; + outsl(0x1F0, src, 512/4); + } - return 0; + return 0; } |