summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorIan McFarlane <i.mcfarlane2002@gmail.com>2025-04-20 15:01:19 -0400
committerFreya Murphy <freya@freyacat.org>2025-04-20 23:44:39 -0400
commit2f0131770e2c967beac5d11a521c477b02371374 (patch)
treedacec8fdad8070f5db38dd1ab6c9247a4fe9bbec /kernel
parentread BARs from PCI (diff)
downloadcomus-2f0131770e2c967beac5d11a521c477b02371374.tar.gz
comus-2f0131770e2c967beac5d11a521c477b02371374.tar.bz2
comus-2f0131770e2c967beac5d11a521c477b02371374.zip
add rudimentary sleeping function based on CMOS clock
Diffstat (limited to 'kernel')
-rw-r--r--kernel/drivers/ata.c9
-rw-r--r--kernel/include/comus/drivers/clock.h2
-rw-r--r--kernel/include/lib/klib.h7
-rw-r--r--kernel/lib/ktime.c15
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;
+ }
+ }
+}