static int test_timer(unsigned num) { int set = 0; /* reset state */ sw_count = 0; fired = 0; for (unsigned i = 0; i < MAX_CHANNELS; i++) { timeouts[i] = 0; } /* initialize and halt timer */ if (timer_init(TIMER_DEV(num), TIM_SPEED, cb) < 0) { printf("TIMER_%u: ERROR on initialization - skipping\n\n", num); return 0; } else { printf("TIMER_%u: initialization successful\n", num); } timer_stop(TIMER_DEV(num)); printf("TIMER_%u: stopped\n", num); /* set each available channel */ for (unsigned i = 0; i < MAX_CHANNELS; i++) { unsigned timeout = ((i + 1) * CHAN_OFFSET); if (timer_set(TIMER_DEV(num), i, timeout) < 0) { break; } else { ++set; printf("TIMER_%u: set channel %u to %u\n", num, i, timeout); } } if (set == 0) { printf("TIMER_%u: ERROR setting any channel\n\n", num); return 0; } /* start the timer */ printf("TIMER_%u: starting\n", num); timer_start(TIMER_DEV(num)); /* wait for all channels to fire */ do { ++sw_count; } while (fired != set); /* collect results */ for (int i = 0; i < fired; i++) { printf("TIMER_%u: channel %i fired at SW count %8u", num, i, (unsigned)timeouts[i]); if (i == 0) { printf(" - init: %8u\n", (unsigned)timeouts[i]); } else { printf(" - diff: %8u\n", (unsigned)(timeouts[i] - timeouts[i - 1])); } } return 1; }
/** * @brief Find device index in the pit_config array */ static inline unsigned int _pit_index(tim_t dev) { return ((unsigned int)dev) - TIMER_DEV(0); }
/** * @brief Find device index in the lptmr_config array */ static inline unsigned int _lptmr_index(tim_t dev) { return ((unsigned int)dev) - TIMER_DEV(0) - PIT_NUMOF; }
/** * @brief Get TIMER_x enum value from LPTMR device index */ static inline tim_t _lptmr_tim_t(uint8_t dev) { return (tim_t)(((unsigned int)TIMER_DEV(0)) + PIT_NUMOF + dev); }
/** * @brief Get TIMER_x enum value from PIT device index */ static inline tim_t _pit_tim_t(uint8_t dev) { return (tim_t)(((unsigned int)TIMER_DEV(0)) + dev); }