X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcpu%2Farm%2Fdrv%2Ftimer_at91.h;h=68e5561e03e9894721d3ff477e19d7f221b49982;hb=32d1445272120a254d77ce8d1af1f527da7a2c17;hp=87bccd1e5a79c57cecb924b3b52cc87fa481375f;hpb=345f93de1963f49bdb194d2b06c8c5d7ba0a3e5f;p=bertos.git diff --git a/bertos/cpu/arm/drv/timer_at91.h b/bertos/cpu/arm/drv/timer_at91.h index 87bccd1e..68e5561e 100644 --- a/bertos/cpu/arm/drv/timer_at91.h +++ b/bertos/cpu/arm/drv/timer_at91.h @@ -40,42 +40,71 @@ #ifndef DRV_AT91_TIMER_H #define DRV_AT91_TIMER_H -#include /* CONFIG_TIMER */ -#include /* uint8_t */ -#include /* CLOCK_FREQ */ +#include /* CPU_FREQ */ + +#include "cfg/cfg_timer.h" /* CONFIG_TIMER */ +#include /* uint8_t */ +#include /* BV */ + +#include /** * \name Values for CONFIG_TIMER. * * Select which hardware timer interrupt to use for system clock and softtimers. * - * \{ + * $WIZ$ timer_select = "TIMER_ON_PIT", "TIMER_DEFAULT" */ #define TIMER_ON_PIT 1 ///< System timer on Periodic interval timer #define TIMER_DEFAULT TIMER_ON_PIT ///< Default system timer -/* \} */ /* * Hardware dependent timer initialization. */ #if (CONFIG_TIMER == TIMER_ON_PIT) - void timer_handler(void); + /* + * On ARM all IRQs are handled by the sysirq_dispatcher, so the actual + * timer handler can be treated like any other normal routine. + */ + #define DEFINE_TIMER_ISR void timer_handler(void); \ + void timer_handler(void) - #define DEFINE_TIMER_ISR void timer_handler(void) #define TIMER_TICKS_PER_SEC 1000 - #define TIMER_HW_CNT (CLOCK_FREQ / (16 * TIMER_TICKS_PER_SEC) - 1) + #define TIMER_HW_CNT (CPU_FREQ / (16 * TIMER_TICKS_PER_SEC) - 1) /** Frequency of the hardware high-precision timer. */ - #define TIMER_HW_HPTICKS_PER_SEC (CLOCK_FREQ / 16) + #define TIMER_HW_HPTICKS_PER_SEC (CPU_FREQ / 16) - /// Type of time expressed in ticks of the hardware high-precision timer + /** Type of time expressed in ticks of the hardware high-precision timer */ typedef uint32_t hptime_t; + #define SIZEOF_HPTIME_T 4 + + INLINE void timer_hw_irq(void) + { + /* Reset counters, this is needed to reset timer and interrupt flags */ + uint32_t dummy = PIVR; + (void) dummy; + } + + INLINE bool timer_hw_triggered(void) + { + return PIT_SR & BV(PITS); + } + + INLINE hptime_t timer_hw_hpread(void) + { + /* In the upper part of PIT_PIIR there is unused data */ + return PIIR & CPIV_MASK; + } + #else #error Unimplemented value for CONFIG_TIMER #endif /* CONFIG_TIMER */ +void timer_hw_init(void); + #endif /* DRV_TIMER_AT91_H */