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 }