void or1k_timer_pause(void) { uint32_t ttmr = or1k_mfspr(OR1K_SPR_TICK_TTMR_ADDR); ttmr = OR1K_SPR_TICK_TTMR_MODE_SET(ttmr, OR1K_SPR_TICK_TTMR_MODE_DISABLE); or1k_mtspr(OR1K_SPR_TICK_TTMR_ADDR, ttmr); }
/* --------------------------------------------------------------------------*/ void _or1k_timer_interrupt_handler(void) { OR1K_REENT.or1k_timer_ticks++; uint32_t ttmr = or1k_mfspr(OR1K_SPR_TICK_TTMR_ADDR); ttmr = OR1K_SPR_TICK_TTMR_IE_SET(ttmr, 1); ttmr = OR1K_SPR_TICK_TTMR_MODE_SET(ttmr, OR1K_SPR_TICK_TTMR_MODE_RESTART); ttmr = OR1K_SPR_TICK_TTMR_IP_SET(ttmr, 0); or1k_mtspr(OR1K_SPR_TICK_TTMR_ADDR, ttmr); }
/* --------------------------------------------------------------------------*/ void or1k_timer_enable(void) { uint32_t ttmr = or1k_mfspr(OR1K_SPR_TICK_TTMR_ADDR); ttmr = OR1K_SPR_TICK_TTMR_IE_SET(ttmr, 1); ttmr = OR1K_SPR_TICK_TTMR_MODE_SET(ttmr, OR1K_REENT.or1k_timer_mode); or1k_mtspr(OR1K_SPR_TICK_TTMR_ADDR, ttmr); uint32_t sr = or1k_mfspr(OR1K_SPR_SYS_SR_ADDR); sr = OR1K_SPR_SYS_SR_TEE_SET(sr, 1); or1k_mtspr(OR1K_SPR_SYS_SR_ADDR, sr); }
void or1k_timer_set_mode(uint32_t mode) { // Store mode in variable OR1K_REENT.or1k_timer_mode = mode; uint32_t ttmr = or1k_mfspr(OR1K_SPR_TICK_TTMR_ADDR); // If the timer is currently running, we also change the mode if (OR1K_SPR_TICK_TTMR_MODE_GET(ttmr) != 0) { ttmr = OR1K_SPR_TICK_TTMR_MODE_SET(ttmr, mode); or1k_mtspr(OR1K_SPR_TICK_TTMR_ADDR, ttmr); } }
status_t platform_set_periodic_timer(platform_timer_callback callback, void *arg, lk_time_t interval) { LTRACEF("cb %p, arg %p, interval %ld\n", callback, arg, interval); uint32_t ttmr = (uint64_t)timer_freq * interval / 1000; LTRACEF("count 0x%x\n", ttmr); timer_cb = callback; timer_arg = arg; /* disable timer before doing changes */ mtspr(OR1K_SPR_TICK_TTMR_ADDR, 0); /* reset timer counter */ mtspr(OR1K_SPR_TICK_TTCR_ADDR, 0); /* enable timer with given interval in 'restart' mode */ ttmr = OR1K_SPR_TICK_TTMR_MODE_SET(ttmr | OR1K_SPR_TICK_TTMR_IE_MASK, OR1K_SPR_TICK_TTMR_MODE_RESTART); mtspr(OR1K_SPR_TICK_TTMR_ADDR, ttmr); return NO_ERROR; }