void chrono(u32 seconds) { startChrono(0); u64 startingTicks = 0; for(u32 i = 0; i < 4; i++) startingTicks |= REG_TIMER_VAL(i) << (16 * i); u64 res; do { res = 0; for(u32 i = 0; i < 4; i++) res |= REG_TIMER_VAL(i) << (16 * i); } while(res - startingTicks < seconds * TICKS_PER_SEC); stopChrono(); }
static u64 chrono(void) { u64 res = 0; for(u32 i = 0; i < 4; i++) res |= REG_TIMER_VAL(i) << (16 * i); res /= (TICKS_PER_SEC / 1000); return res; }
static void startChrono(void) { static bool isChronoStarted = false; if(isChronoStarted) return; REG_TIMER_CNT(0) = 0; //67MHz for(u32 i = 1; i < 4; i++) REG_TIMER_CNT(i) = 4; //Count-up for(u32 i = 0; i < 4; i++) REG_TIMER_VAL(i) = 0; REG_TIMER_CNT(0) = 0x80; //67MHz; enabled for(u32 i = 1; i < 4; i++) REG_TIMER_CNT(i) = 0x84; //Count-up; enabled isChronoStarted = true; }