sylveos

Toy Operating System
Log | Files | Refs

commit 1f00add3f80396de50bca2547372a9300a1ff027
parent fa0aa92896c22f40ce2c3539343a662a2d76aabb
Author: Sylvia Ivory <git@sivory.net>
Date:   Tue, 13 Jan 2026 20:03:11 -0800

Add system timer

Diffstat:
Msrc/sys-timer.zig | 41++++++++++++++++++++++++++++++++++++-----
1 file changed, 36 insertions(+), 5 deletions(-)

diff --git a/src/sys-timer.zig b/src/sys-timer.zig @@ -1,11 +1,42 @@ const std = @import("std"); +const barrier = @import("barrier.zig"); const BASE_ADDR: u32 = 0x2000_3000; -const STATUS: *volatile u32 = @ptrFromInt(BASE_ADDR + 0x00); +// const STATUS: *volatile u32 = @ptrFromInt(BASE_ADDR + 0x00); const COUNTER_LOWER: *volatile u32 = @ptrFromInt(BASE_ADDR + 0x04); const COUNTER_UPPER: *volatile u32 = @ptrFromInt(BASE_ADDR + 0x08); -const COMPARE_0: *volatile u32 = @ptrFromInt(BASE_ADDR + 0x0C); -const COMPARE_1: *volatile u32 = @ptrFromInt(BASE_ADDR + 0x10); -const COMPARE_2: *volatile u32 = @ptrFromInt(BASE_ADDR + 0x14); -const COMPARE_3: *volatile u32 = @ptrFromInt(BASE_ADDR + 0x18); +// const COMPARE_0: *volatile u32 = @ptrFromInt(BASE_ADDR + 0x0C); +// const COMPARE_1: *volatile u32 = @ptrFromInt(BASE_ADDR + 0x10); +// const COMPARE_2: *volatile u32 = @ptrFromInt(BASE_ADDR + 0x14); +// const COMPARE_3: *volatile u32 = @ptrFromInt(BASE_ADDR + 0x18); + +pub fn current_count() u64 { + const b = barrier.obtain(); + defer b.release(); + + const upper = COUNTER_UPPER.*; + const lower = COUNTER_LOWER.*; + const extended: u64 = @intCast(upper); + + return (extended << 32) | lower; +} + +// Busy delay +// Not the best way to delay *but* a proper delay +// requires *a lot* more code +pub fn delay(us: u64) void { + const start = current_count(); + while (true) { + const current = current_count(); + if ((current - start) >= us) return; + } +} + +pub fn delay_ms(ms: u64) void { + delay(ms * 1000); +} + +pub fn delay_s(s: u64) void { + delay_ms(s * 1000); +}