ret_code_t nrf_drv_clock_init(void) { ret_code_t err_code = NRF_SUCCESS; if (m_clock_cb.module_initialized) { err_code = NRF_ERROR_MODULE_ALREADY_INITIALIZED; } else { m_clock_cb.p_hf_head = NULL; m_clock_cb.hfclk_requests = 0; m_clock_cb.p_lf_head = NULL; m_clock_cb.lfclk_requests = 0; nrf_drv_common_power_clock_irq_init(); #ifdef SOFTDEVICE_PRESENT if (!softdevice_handler_is_enabled()) #endif { nrf_clock_lf_src_set((nrf_clock_lfclk_t)CLOCK_CONFIG_LF_SRC); } #if CALIBRATION_SUPPORT m_clock_cb.cal_state = CAL_STATE_IDLE; #endif m_clock_cb.module_initialized = true; } NRF_LOG_INFO("Function: %s, error code: %s.\r\n", (uint32_t)__func__, (uint32_t)ERR_TO_STR(err_code)); return err_code; }
bool nrf_drv_clock_lfclk_is_running(void) { ASSERT(m_clock_cb.module_initialized); #ifdef SOFTDEVICE_PRESENT if (softdevice_handler_is_enabled()) { return true; } #endif // SOFTDEVICE_PRESENT return nrf_clock_lf_is_running(); }
static void hfclk_start(void) { #ifdef SOFTDEVICE_PRESENT if (softdevice_handler_is_enabled()) { (void)sd_clock_hfclk_request(); return; } #endif // SOFTDEVICE_PRESENT nrf_clock_event_clear(NRF_CLOCK_EVENT_HFCLKSTARTED); nrf_clock_int_enable(NRF_CLOCK_INT_HF_STARTED_MASK); nrf_clock_task_trigger(NRF_CLOCK_TASK_HFCLKSTART); }
bool nrf_drv_clock_hfclk_is_running(void) { ASSERT(m_clock_cb.module_initialized); #ifdef SOFTDEVICE_PRESENT if (softdevice_handler_is_enabled()) { uint32_t is_running; UNUSED_VARIABLE(sd_clock_hfclk_is_running(&is_running)); return (is_running ? true : false); } #endif // SOFTDEVICE_PRESENT return nrf_clock_hf_is_running(NRF_CLOCK_HFCLK_HIGH_ACCURACY); }
static void hfclk_stop(void) { #ifdef SOFTDEVICE_PRESENT if (softdevice_handler_is_enabled()) { (void)sd_clock_hfclk_release(); return; } #endif // SOFTDEVICE_PRESENT nrf_clock_task_trigger(NRF_CLOCK_TASK_HFCLKSTOP); while (nrf_clock_hf_is_running(NRF_CLOCK_HFCLK_HIGH_ACCURACY)) {} m_clock_cb.hfclk_on = false; }
// Function for fix errata 20: RTC Register values are invalid __STATIC_INLINE void errata_20(void) { #if defined(NRF52_ERRATA_20) if (!softdevice_handler_is_enabled()) { NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; NRF_CLOCK->TASKS_LFCLKSTART = 1; while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) { } } NRF_RTC1->TASKS_STOP = 0; #endif }
/**@brief Function for stopping LFCLK and calibration (if it was set up). */ static void lfclk_stop(void) { #if CALIBRATION_SUPPORT (void)nrf_drv_clock_calibration_abort(); #endif #ifdef SOFTDEVICE_PRESENT // If LFCLK is requested to stop while SD is still enabled, // it indicates an error in the application. // Enabling SD should increment the LFCLK request. ASSERT(!softdevice_handler_is_enabled()); #endif // SOFTDEVICE_PRESENT nrf_clock_task_trigger(NRF_CLOCK_TASK_LFCLKSTOP); while (nrf_clock_lf_is_running()) {} m_clock_cb.lfclk_on = false; }