diff options
Diffstat (limited to 'src/generic')
-rw-r--r-- | src/generic/armcm_timer.c | 14 | ||||
-rw-r--r-- | src/generic/armcm_timer.h | 8 |
2 files changed, 22 insertions, 0 deletions
diff --git a/src/generic/armcm_timer.c b/src/generic/armcm_timer.c index a9c8ab9f..7f11cd68 100644 --- a/src/generic/armcm_timer.c +++ b/src/generic/armcm_timer.c @@ -54,6 +54,20 @@ timer_kick(void) SCB->ICSR = SCB_ICSR_PENDSTSET_Msk; } +// Implement simple early-boot delay mechanism +void +udelay(uint32_t usecs) +{ + if (!(CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk)) { + CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; + DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; + } + + uint32_t end = timer_read_time() + timer_from_us(usecs); + while (timer_is_before(timer_read_time(), end)) + ; +} + void timer_init(void) { diff --git a/src/generic/armcm_timer.h b/src/generic/armcm_timer.h new file mode 100644 index 00000000..5e118380 --- /dev/null +++ b/src/generic/armcm_timer.h @@ -0,0 +1,8 @@ +#ifndef __GENERIC_ARMCM_TIMER_H +#define __GENERIC_ARMCM_TIMER_H + +#include <stdint.h> // uint32_t + +void udelay(uint32_t usecs); + +#endif // serial_irq.h |