diff options
-rw-r--r-- | kernel/drivers/ata.c | 9 | ||||
-rw-r--r-- | kernel/include/comus/drivers/clock.h | 2 | ||||
-rw-r--r-- | kernel/include/lib/klib.h | 7 | ||||
-rw-r--r-- | kernel/lib/ktime.c | 15 |
4 files changed, 29 insertions, 4 deletions
diff --git a/kernel/drivers/ata.c b/kernel/drivers/ata.c index 8d5bbe1..6b131b8 100644 --- a/kernel/drivers/ata.c +++ b/kernel/drivers/ata.c @@ -419,11 +419,13 @@ void ide_initialize(uint32_t BAR0, uint32_t BAR1, uint32_t BAR2, uint32_t BAR3, ide_channel_write(chan, ATA_REG_HDDEVSEL, 0xA0 | (drive_idx << 4)); // This function should be implemented in your OS. which waits for 1 ms. // it is based on System Timer Device Driver. - sleep(1); // Wait 1ms for drive select to work. + // sleep(1); // Wait 1ms for drive select to work. + kspin_sleep_seconds(1); // TODO: sleep 1ms, this is way too long // (II) Send ATA Identify Command: ide_channel_write(chan, ATA_REG_COMMAND, ATA_CMD_IDENTIFY); - sleep(1); + // sleep(1); + kspin_sleep_seconds(1); // TODO: sleep 1ms // (III) Polling: if (ide_channel_read(chan, ATA_REG_STATUS) == 0) { @@ -465,7 +467,8 @@ void ide_initialize(uint32_t BAR0, uint32_t BAR1, uint32_t BAR2, uint32_t BAR3, ide_channel_write(chan, ATA_REG_COMMAND, ATA_CMD_IDENTIFY_PACKET); - sleep(1); + // sleep(1); + kspin_sleep_seconds(1); // TODO: sleep one millisecond } static uint8_t id_space_buf[2048] = { 0 }; diff --git a/kernel/include/comus/drivers/clock.h b/kernel/include/comus/drivers/clock.h index 35f26c6..7099fa7 100644 --- a/kernel/include/comus/drivers/clock.h +++ b/kernel/include/comus/drivers/clock.h @@ -9,6 +9,6 @@ #ifndef CLOCK_H_ #define CLOCK_H_ -extern void clock_update(void); +void clock_update(void); #endif /* clock.h */ diff --git a/kernel/include/lib/klib.h b/kernel/include/lib/klib.h index e009b3b..e79af41 100644 --- a/kernel/include/lib/klib.h +++ b/kernel/include/lib/klib.h @@ -310,4 +310,11 @@ void *krealloc(void *ptr, size_t size); */ void kfree(void *ptr); +/* + * Calls unixtime over and over until a number of seconds have passed + * + * @param seconds - number of seconds to wait, minimum (may take longer) + */ +void kspin_sleep_seconds(size_t seconds); + #endif /* klib.h */ diff --git a/kernel/lib/ktime.c b/kernel/lib/ktime.c new file mode 100644 index 0000000..9bfcaa9 --- /dev/null +++ b/kernel/lib/ktime.c @@ -0,0 +1,15 @@ +#include <lib/klib.h> +#include <comus/time.h> + +void kspin_sleep_seconds(size_t seconds) +{ + const uint64_t start = unixtime(); + + while (1) { + const uint64_t now = unixtime(); + + if (now - start > seconds) { + return; + } + } +} |