aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/ports/NRF51/NRF51822/st_lld.h
diff options
context:
space:
mode:
Diffstat (limited to 'os/hal/ports/NRF51/NRF51822/st_lld.h')
-rw-r--r--os/hal/ports/NRF51/NRF51822/st_lld.h66
1 files changed, 54 insertions, 12 deletions
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_ */