/* timer.c — ARM Generic Timer driver */ #include "timer.h" #include "gic.h" static volatile uint64_t ticks_count = 0; void timer_init(void) { uint64_t freq = timer_get_freq(); /* Set timer interval for 100Hz (freq/100 ticks per interrupt) */ uint64_t interval = freq / 100; __asm__ volatile("msr cntp_tval_el0, %0" :: "r"(interval)); /* Enable timer: unmask (bit 1=0), enable (bit 0=1) */ __asm__ volatile("msr cntp_ctl_el0, %0" :: "r"(1UL)); /* Enable timer IRQ on GIC */ gic_enable_irq(IRQ_TIMER_CNTP); } void timer_irq(void) { ticks_count++; /* Acknowledge timer interrupt by writing new interval */ uint64_t freq = timer_get_freq(); __asm__ volatile("msr cntp_tval_el0, %0" :: "r"(freq / 100)); } uint64_t timer_ticks(void) { return ticks_count; }