sylveos

Toy Operating System
Log | Files | Refs

clock.zig (862B)


      1 const std = @import("std");
      2 
      3 const mem = @import("../mem.zig");
      4 
      5 const BASE_ADDRESS: usize = mem.BASE_ADDRESS + 0x0000_3000;
      6 const COUNTER_LOWER: usize = BASE_ADDRESS + 0x0004;
      7 const COUNTER_UPPER: usize = BASE_ADDRESS + 0x0008;
      8 
      9 pub fn current_count() u64 {
     10     const upper = mem.get_u32_barrier(@ptrFromInt(COUNTER_UPPER));
     11     const lower = mem.get_u32_barrier(@ptrFromInt(COUNTER_LOWER));
     12     const extended: u64 = @intCast(upper);
     13 
     14     return (extended << 32) | lower;
     15 }
     16 
     17 // Busy delay
     18 // Not the best way to delay *but* a proper delay
     19 // requires *a lot* more code
     20 pub fn delay(us: u64) void {
     21     const start = current_count();
     22     while (true) {
     23         const current = current_count();
     24         if ((current - start) >= us) return;
     25     }
     26 }
     27 
     28 pub fn delay_ms(ms: u64) void {
     29     delay(ms * 1000);
     30 }
     31 
     32 pub fn delay_s(s: u64) void {
     33     delay_ms(s * 1000);
     34 }