Microkernel thing OS experiment (Zig ⚡)
at dev 1.1 kB view raw
1const arch = @import("../root.zig"); 2const out = arch.port.out; 3const pic = @import("pic.zig"); 4const Idt = arch.structures.Idt; 5const PIT_HZ = 1_193_180; 6const DATA_PORT = 0x40; 7const DATA_PORT_1 = 0x41; 8const DATA_PORT_2 = 0x42; 9const CMD_PORT = 0x43; 10 11// If we want a repeating square wave 12pub fn set_frequency(hz: u32) void { 13 const divider = PIT_HZ / hz; 14 @import("std").log.debug("divider = {}", .{divider}); 15 // Square Wave Generator, lobyte/hibyte 16 const mode = 0b0011_0110; 17 18 out(u8, CMD_PORT, mode); 19 out(u8, DATA_PORT, @truncate(divider)); 20 out(u8, DATA_PORT, @truncate(divider >> 8)); 21} 22 23pub inline fn mode0(ms: u32) void { 24 out(u8, CMD_PORT, 0xb0); 25 26 // Interrupt On Terminal Count 27 const latch = (PIT_HZ / (1000 / ms)); 28 out(u8, 0x42, @truncate(latch)); 29 out(u8, 0x42, @truncate(latch >> 8)); 30} 31 32var ctr: usize = 0; 33pub fn handler(_: *Idt.InterruptStackFrame) callconv(.{ .x86_64_interrupt = .{} }) void { 34 if (ctr % 1000 == 0) 35 @import("std").log.warn("PIT!", .{}); 36 ctr += 1; 37 pic.end_of_timer_interrupt(); 38}