/** * Wait for ISR register to contain the specified mask. * * Returns EC_SUCCESS, EC_ERROR_TIMEOUT if timed out waiting, or * EC_ERROR_UNKNOWN if an error bit appeared in the status register. */ static int wait_isr(int port, int mask) { uint32_t start = __hw_clock_source_read(); uint32_t delta = 0; do { int isr = STM32_I2C_ISR(port); /* Check for errors */ if (isr & (STM32_I2C_ISR_ARLO | STM32_I2C_ISR_BERR | STM32_I2C_ISR_NACK)) return EC_ERROR_UNKNOWN; /* Check for desired mask */ if ((isr & mask) == mask) return EC_SUCCESS; delta = __hw_clock_source_read() - start; /** * Depending on the bus speed, busy loop for a while before * sleeping and letting other things run. */ if (delta >= busyloop_us[pdata[port].freq]) usleep(100); } while (delta < pdata[port].timeout_us); return EC_ERROR_TIMEOUT; }
/* HWTimer event handlers */ void __hw_clock_event_set(uint32_t deadline) { fp_t inv_evt_tick = FLOAT_TO_FP(INT_32K_CLOCK/(float)SECOND); int32_t evt_cnt_us; /* Is deadline min value? */ if (evt_expired_us != 0 && evt_expired_us < deadline) return; /* mark min event value */ evt_expired_us = deadline; evt_cnt_us = deadline - __hw_clock_source_read(); #if DEBUG_TMR evt_cnt_us_dbg = deadline - __hw_clock_source_read(); #endif /* Deadline is behind current timer */ if (evt_cnt_us < 0) evt_cnt_us = 1; /* Event module disable */ CLEAR_BIT(NPCX_ITCTS(ITIM_EVENT_NO), NPCX_ITCTS_ITEN); /* * ITIM count down : event expired : Unit: 1/32768 sec * It must exceed evt_expired_us for process_timers function */ evt_cnt = FP_TO_INT((fp_inter_t)(evt_cnt_us) * inv_evt_tick); if (evt_cnt > TICK_EVT_MAX_CNT) { CPRINTS("Event overflow! 0x%08x, us is %d\r\n", evt_cnt, evt_cnt_us); evt_cnt = TICK_EVT_MAX_CNT; } /* Wait for module disable to take effect before updating count */ while (IS_BIT_SET(NPCX_ITCTS(ITIM_EVENT_NO), NPCX_ITCTS_ITEN)) ; NPCX_ITCNT16(ITIM_EVENT_NO) = MAX(evt_cnt, 1); /* Event module enable */ SET_BIT(NPCX_ITCTS(ITIM_EVENT_NO), NPCX_ITCTS_ITEN); /* Wait for module enable */ while (!IS_BIT_SET(NPCX_ITCTS(ITIM_EVENT_NO), NPCX_ITCTS_ITEN)) ; /* Enable interrupt of ITIM */ task_enable_irq(ITIM16_INT(ITIM_EVENT_NO)); }
static void motion_sense_insert_timestamp(void) { struct ec_response_motion_sensor_data vector; vector.flags = MOTIONSENSE_SENSOR_FLAG_TIMESTAMP; vector.timestamp = __hw_clock_source_read(); motion_sense_fifo_add_unit(&vector, motion_sensors, 0); }
uint32_t __hw_clock_event_get(void) { uint32_t ticks; /* Get the time of the next programmed deadline. */ ticks = ROTOR_MCU_TMR_TNCV(1); return __hw_clock_source_read() + ((ticks * SECOND) / clock_get_freq()); }
static void motion_sense_get_fifo_info( struct ec_response_motion_sense_fifo_info *fifo_info) { fifo_info->size = motion_sense_fifo.buffer_units; mutex_lock(&g_sensor_mutex); fifo_info->count = queue_count(&motion_sense_fifo); fifo_info->total_lost = motion_sense_fifo_lost; mutex_unlock(&g_sensor_mutex); fifo_info->timestamp = __hw_clock_source_read(); }
uint32_t __hw_clock_event_get(void) { uint32_t next_event_us = __hw_clock_source_read(); /* bit0, event timer is enabled */ if (IT83XX_ETWD_ETXCTRL(EVENT_EXT_TIMER) & (1 << 0)) { /* timer counter observation value to microseconds */ next_event_us += EVENT_TIMER_COUNT_TO_US( IT83XX_ETWD_ETXCNTOR(EVENT_EXT_TIMER)); } return next_event_us; }
void __hw_clock_event_set(uint32_t deadline) { uint32_t wait; /* bit0, disable event timer */ IT83XX_ETWD_ETXCTRL(EVENT_EXT_TIMER) &= ~(1 << 0); /* w/c interrupt status */ event_timer_clear_pending_isr(); /* microseconds to timer counter */ wait = deadline - __hw_clock_source_read(); IT83XX_ETWD_ETXCNTLR(EVENT_EXT_TIMER) = wait < EVENT_TIMER_COUNT_TO_US(0xffffffff) ? EVENT_TIMER_US_TO_COUNT(wait) : 0xffffffff; /* enable and re-start timer */ IT83XX_ETWD_ETXCTRL(EVENT_EXT_TIMER) |= 0x03; task_enable_irq(et_ctrl_regs[EVENT_EXT_TIMER].irq); }
void __hw_clock_event_set(uint32_t deadline) { uint32_t ticks; uint32_t delta; __hw_clock_event_clear(); delta = deadline - __hw_clock_source_read(); /* Convert the delta to ticks. */ ticks = delta * (clock_get_freq() / SECOND); /* Set the timer load count to the deadline. */ ROTOR_MCU_TMR_TNLC(1) = ticks; /* Enable the timer. */ ROTOR_MCU_TMR_TNCR(1) |= (1 << 0); }