aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/nRF5_SDK_15.0.0_a53641a/external/infineon/pal/nrf5x/pal_os_event.c
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/nRF5_SDK_15.0.0_a53641a/external/infineon/pal/nrf5x/pal_os_event.c')
-rw-r--r--thirdparty/nRF5_SDK_15.0.0_a53641a/external/infineon/pal/nrf5x/pal_os_event.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/external/infineon/pal/nrf5x/pal_os_event.c b/thirdparty/nRF5_SDK_15.0.0_a53641a/external/infineon/pal/nrf5x/pal_os_event.c
new file mode 100644
index 0000000..809c2bd
--- /dev/null
+++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/external/infineon/pal/nrf5x/pal_os_event.c
@@ -0,0 +1,127 @@
+/**
+* \copyright
+* Copyright(c) 2018, Infineon Technologies AG
+* All rights reserved.
+*
+* This software is provided with terms and conditions as specified in OPTIGA(TM) Trust X Evaluation Kit License Agreement.
+* \endcopyright
+*
+* \author Infineon AG
+*
+* \file
+*
+* \brief This file implements the platform abstraction layer APIs for os event/scheduler.
+*
+* \addtogroup grPAL
+* @{
+*/
+
+/**********************************************************************************************************************
+ * HEADER FILES
+ *********************************************************************************************************************/
+#include "stdlib.h"
+#include "stdio.h"
+#include "pal_os_event.h"
+#include "nrf_rtc.h"
+#include "nrf_drv_rtc.h"
+
+/**********************************************************************************************************************
+ * MACROS
+ *********************************************************************************************************************/
+
+/*********************************************************************************************************************
+ * LOCAL DATA
+ *********************************************************************************************************************/
+/// @cond hidden
+/// Callback function when timer elapses
+static volatile register_callback callback_registered = NULL;
+/// Pointer to store upper layer callback context (For example: Ifx i2c context)
+static void * callback_ctx;
+
+const nrf_drv_rtc_t rtc2 = NRF_DRV_RTC_INSTANCE(2);
+static nrf_drv_rtc_config_t m_rtc2_config = NRF_DRV_RTC_DEFAULT_CONFIG;
+
+// Tick count for pal_os_timer
+volatile uint32_t g_tick_count = 0;
+
+/**
+* Timer callback handler.
+*
+* This get called from the TIMER elapse event.<br>
+* Once the timer expires, the registered callback funtion gets called from the timer event handler, if
+* the call back is not NULL.<br>
+*
+*\param[in] args Callback argument
+*
+*/
+static void ifx_rtc_handler(nrf_drv_rtc_int_type_t int_type)
+{
+ volatile register_callback callback;
+
+ if (int_type == NRF_DRV_RTC_INT_TICK)
+ {
+ g_tick_count++;
+ }
+
+ if (int_type == NRF_DRV_RTC_INT_COMPARE0)
+ {
+ nrf_drv_rtc_cc_disable(&rtc2, 0);
+
+ if (callback_registered != NULL)
+ {
+ callback = callback_registered;
+ callback_registered = NULL;
+ callback(callback_ctx);
+ }
+ }
+}
+
+/// @endcond
+
+void pal_os_event_init()
+{
+ // Initialize the RTC2 driver instance
+ APP_ERROR_CHECK(nrf_drv_rtc_init(&rtc2, &m_rtc2_config, ifx_rtc_handler));
+
+ // Set the prescaler to approximately get 1 ms intervals
+ m_rtc2_config.prescaler = 31;
+
+ // Enable tick event and interrupt
+ nrf_drv_rtc_tick_enable(&rtc2, true);
+
+ // Power on RTC instance
+ nrf_drv_rtc_enable(&rtc2);
+}
+
+/**
+* Platform specific event call back registration function to trigger once when timer expires.
+* <br>
+*
+* <b>API Details:</b>
+* This function registers the callback function supplied by the caller.<br>
+* It triggers a timer with the supplied time interval in microseconds.<br>
+* Once the timer expires, the registered callback function gets called.<br>
+*
+* \param[in] callback Callback function pointer
+* \param[in] callback_args Callback arguments
+* \param[in] time_us time in micro seconds to trigger the call back
+*
+*/
+void pal_os_event_register_callback_oneshot(register_callback callback,
+ void* callback_args,
+ uint32_t time_us)
+{
+ callback_registered = callback;
+ callback_ctx = callback_args;
+
+ // Clear the counter
+ nrf_drv_rtc_counter_clear(&rtc2);
+
+ // Set the compare register to trigger approximately at time_us
+ APP_ERROR_CHECK(nrf_drv_rtc_cc_set(&rtc2, 0, (time_us / 1024) + 1 , true));
+}
+
+/**
+* @}
+*/
+