From 3c6756556d46ba9349e0b9526c9f5f83e111a080 Mon Sep 17 00:00:00 2001 From: Stephane D'Alu Date: Sat, 6 Feb 2016 02:02:09 +0100 Subject: try to implement tick-less mode --- os/hal/ports/NRF51/NRF51822/st_lld.h | 66 +++++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 12 deletions(-) (limited to 'os/hal/ports/NRF51/NRF51822/st_lld.h') diff --git a/os/hal/ports/NRF51/NRF51822/st_lld.h b/os/hal/ports/NRF51/NRF51822/st_lld.h index c62ff2c..3f47a11 100644 --- a/os/hal/ports/NRF51/NRF51822/st_lld.h +++ b/os/hal/ports/NRF51/NRF51822/st_lld.h @@ -27,17 +27,19 @@ #ifndef _ST_LLD_H_ #define _ST_LLD_H_ +#include "halconf.h" + /*===========================================================================*/ /* Driver constants. */ /*===========================================================================*/ /** - * @brief SPI0 interrupt priority level setting. + * @brief System ticks implementer as a timer. */ #define NRF51_SYSTEM_TICKS_AS_TIMER 1 /** - * @brief SPI0 interrupt priority level setting. + * @brief System ticks implementer as an rtc. */ #define NRF51_SYSTEM_TICKS_AS_RTC 2 @@ -64,6 +66,14 @@ #error "NRF51_SYSTEM_TICKS illegal value" #endif +#if defined(CH_CFG_ST_TIMEDELTA) && CH_CFG_ST_TIMEDELTA < 5 +#error "CH_CFG_ST_TIMEDELTA is too low" +#endif + +#if (OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING) +#error "Freeruning (tick-less) mode currently not working" +#endif + /*===========================================================================*/ /* Driver data structures and types. */ /*===========================================================================*/ @@ -96,8 +106,13 @@ extern "C" { * @notapi */ static inline systime_t st_lld_get_counter(void) { - - return (systime_t)0; +#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_RTC) + return (systime_t)NRF_RTC0->COUNTER; +#endif +#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) + NRF_TIMER0->TASKS_CAPTURE[1] = 1; + return (systime_t)NRF_TIMER0->CC[1]; +#endif } /** @@ -110,8 +125,16 @@ static inline systime_t st_lld_get_counter(void) { * @notapi */ static inline void st_lld_start_alarm(systime_t abstime) { - - (void)abstime; +#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_RTC) + NRF_RTC0->CC[0] = abstime; + NRF_RTC0->EVENTS_COMPARE[0] = 0; + NRF_RTC0->EVTENSET = RTC_EVTEN_COMPARE0_Msk; +#endif +#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) + NRF_TIMER0->CC[0] = abstime; + NRF_TIMER0->EVENTS_COMPARE[0] = 0; + NRF_TIMER0->INTENSET = TIMER_INTENSET_COMPARE0_Msk; +#endif } /** @@ -120,7 +143,14 @@ static inline void st_lld_start_alarm(systime_t abstime) { * @notapi */ static inline void st_lld_stop_alarm(void) { - +#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_RTC) + NRF_RTC0->EVTENCLR = RTC_EVTEN_COMPARE0_Msk; + NRF_RTC0->EVENTS_COMPARE[0] = 0; +#endif +#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) + NRF_TIMER0->INTENCLR = TIMER_INTENCLR_COMPARE0_Msk; + NRF_TIMER0->EVENTS_COMPARE[0] = 0; +#endif } /** @@ -131,8 +161,12 @@ static inline void st_lld_stop_alarm(void) { * @notapi */ static inline void st_lld_set_alarm(systime_t abstime) { - - (void)abstime; +#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_RTC) + NRF_RTC0->CC[0] = abstime; +#endif +#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) + NRF_TIMER0->CC[0] = abstime; +#endif } /** @@ -143,8 +177,12 @@ static inline void st_lld_set_alarm(systime_t abstime) { * @notapi */ static inline systime_t st_lld_get_alarm(void) { - - return (systime_t)0; +#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_RTC) + return (systime_t)NRF_RTC0->CC[0]; +#endif +#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) + return (systime_t)NRF_TIMER0->CC[0]; +#endif } /** @@ -157,8 +195,12 @@ static inline systime_t st_lld_get_alarm(void) { * @notapi */ static inline bool st_lld_is_alarm_active(void) { - +#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_RTC) + return NRF_RTC0->EVTEN & RTC_INTENSET_COMPARE0_Msk; +#endif +#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) return false; +#endif } #endif /* _ST_LLD_H_ */ -- cgit v1.2.3