ajhahn.de
← FlashOS
Flash 43 lines
// System Timer driver for Raspberry Pi 4

const LINEAR_MAP_BASE u64 = 0xFFFF000000000000
const DEVICE_BASE u64 = 0xFE000000
const TIMER_BASE u64 = DEVICE_BASE + 0x3000 + LINEAR_MAP_BASE

const CLOCKHZ u32 = 1_000_000

const SysTimerRegs = extern struct {
    control_status u32,
    counter_lo u32,
    counter_hi u32,
    compare [4]u32
}

fn getTimerRegs() *mut volatile SysTimerRegs {
    return #as(*mut volatile SysTimerRegs, #ptrFromInt(TIMER_BASE))
}

const interval_1 u32 = CLOCKHZ
var cur_ls32_1 u32 = 0

// Output interface constant from utilc.c (MU = mini-uart interface index)
const MU i32 = 0
extern fn main_output(interface i32, str [*:0]u8) void

/// Initialize system timer compare 1 (compare 0 and 2 are used by VC)
export fn timer_init() void {
    const regs = getTimerRegs()
    cur_ls32_1 = regs.counter_lo
    cur_ls32_1 +%= interval_1
    regs.compare[1] = cur_ls32_1
}

/// IRQ handler for system timer 1
export fn handle_sys_timer_1() void {
    const regs = getTimerRegs()
    cur_ls32_1 +%= interval_1
    regs.compare[1] = cur_ls32_1
    regs.control_status |= (1 << 1)
    main_output(MU, "timer 1 interrupt\n")
}