mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-08-07 17:45:21 +00:00
Added configuration for approach to starting system clock source. There are 3 options: no wait, wait untill available, wait until stable. Added support for those modes in clock control driver which handles low frequency source clock. Signed-off-by: Krzysztof Chruscinski <krzysztof.chruscinski@nordicsemi.no>
146 lines
4.6 KiB
C
146 lines
4.6 KiB
C
/*
|
|
* Copyright (c) 2016 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_DRIVERS_CLOCK_CONTROL_NRF_CLOCK_CONTROL_H_
|
|
#define ZEPHYR_INCLUDE_DRIVERS_CLOCK_CONTROL_NRF_CLOCK_CONTROL_H_
|
|
|
|
#include <device.h>
|
|
#include <hal/nrf_clock.h>
|
|
#include <sys/onoff.h>
|
|
#include <drivers/clock_control.h>
|
|
|
|
/** @brief Clocks handled by the CLOCK peripheral.
|
|
*
|
|
* Enum shall be used as a sys argument in clock_control API.
|
|
*/
|
|
enum clock_control_nrf_type {
|
|
CLOCK_CONTROL_NRF_TYPE_HFCLK,
|
|
CLOCK_CONTROL_NRF_TYPE_LFCLK,
|
|
#if NRF_CLOCK_HAS_HFCLK192M
|
|
CLOCK_CONTROL_NRF_TYPE_HFCLK192M,
|
|
#endif
|
|
CLOCK_CONTROL_NRF_TYPE_COUNT
|
|
};
|
|
|
|
/* Define can be used with clock control API instead of enum directly to
|
|
* increase code readability.
|
|
*/
|
|
#define CLOCK_CONTROL_NRF_SUBSYS_HF \
|
|
((clock_control_subsys_t)CLOCK_CONTROL_NRF_TYPE_HFCLK)
|
|
#define CLOCK_CONTROL_NRF_SUBSYS_LF \
|
|
((clock_control_subsys_t)CLOCK_CONTROL_NRF_TYPE_LFCLK)
|
|
#define CLOCK_CONTROL_NRF_SUBSYS_HF192M \
|
|
((clock_control_subsys_t)CLOCK_CONTROL_NRF_TYPE_HFCLK192M)
|
|
|
|
/** @brief LF clock start modes. */
|
|
enum nrf_lfclk_start_mode {
|
|
CLOCK_CONTROL_NRF_LF_START_NOWAIT,
|
|
CLOCK_CONTROL_NRF_LF_START_AVAILABLE,
|
|
CLOCK_CONTROL_NRF_LF_START_STABLE,
|
|
};
|
|
|
|
/* Define 32KHz clock source */
|
|
#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC
|
|
#define CLOCK_CONTROL_NRF_K32SRC NRF_CLOCK_LFCLK_RC
|
|
#endif
|
|
#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL
|
|
#define CLOCK_CONTROL_NRF_K32SRC NRF_CLOCK_LFCLK_Xtal
|
|
#endif
|
|
#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_SYNTH
|
|
#define CLOCK_CONTROL_NRF_K32SRC NRF_CLOCK_LFCLK_Synth
|
|
#endif
|
|
#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_EXT_LOW_SWING
|
|
#define CLOCK_CONTROL_NRF_K32SRC NRF_CLOCK_LFCLK_Xtal_Low_Swing
|
|
#endif
|
|
#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_EXT_FULL_SWING
|
|
#define CLOCK_CONTROL_NRF_K32SRC NRF_CLOCK_LFCLK_Xtal_Full_Swing
|
|
#endif
|
|
|
|
/* Define 32KHz clock accuracy */
|
|
#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM
|
|
#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 0
|
|
#endif
|
|
#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_250PPM
|
|
#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 1
|
|
#endif
|
|
#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_150PPM
|
|
#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 2
|
|
#endif
|
|
#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_100PPM
|
|
#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 3
|
|
#endif
|
|
#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_75PPM
|
|
#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 4
|
|
#endif
|
|
#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_50PPM
|
|
#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 5
|
|
#endif
|
|
#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM
|
|
#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 6
|
|
#endif
|
|
#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_20PPM
|
|
#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 7
|
|
#endif
|
|
|
|
/** @brief Force LF clock calibration. */
|
|
void z_nrf_clock_calibration_force_start(void);
|
|
|
|
/** @brief Return number of calibrations performed.
|
|
*
|
|
* Valid when @ref CONFIG_CLOCK_CONTROL_NRF_CALIBRATION_DEBUG is set.
|
|
*
|
|
* @return Number of calibrations or -1 if feature is disabled.
|
|
*/
|
|
int z_nrf_clock_calibration_count(void);
|
|
|
|
/** @brief Return number of attempts when calibration was skipped.
|
|
*
|
|
* Valid when @ref CONFIG_CLOCK_CONTROL_NRF_CALIBRATION_DEBUG is set.
|
|
*
|
|
* @return Number of calibrations or -1 if feature is disabled.
|
|
*/
|
|
int z_nrf_clock_calibration_skips_count(void);
|
|
|
|
/** @brief Get onoff service for given clock subsystem.
|
|
*
|
|
* @param sys Subsystem.
|
|
*
|
|
* @return Service handler or NULL.
|
|
*/
|
|
struct onoff_manager *z_nrf_clock_control_get_onoff(clock_control_subsys_t sys);
|
|
|
|
/** @brief Permanently enable low frequency clock.
|
|
*
|
|
* Low frequency clock is usually enabled during application lifetime because
|
|
* of long startup time and low power consumption. Multiple modules can request
|
|
* it but never release.
|
|
*
|
|
* @param start_mode Specify if function should block until clock is available.
|
|
*/
|
|
void z_nrf_clock_control_lf_on(enum nrf_lfclk_start_mode start_mode);
|
|
|
|
/** @brief Request high frequency clock from Bluetooth Controller.
|
|
*
|
|
* Function is optimized for Bluetooth Controller which turns HF clock before
|
|
* each radio activity and has hard timing requirements but does not require
|
|
* any confirmation when clock is ready because it assumes that request is
|
|
* performed long enough before radio activity. Clock is released immediately
|
|
* after radio activity.
|
|
*
|
|
* Function does not perform any validation. It is the caller responsibility to
|
|
* ensure that every z_nrf_clock_bt_ctlr_hf_request matches
|
|
* z_nrf_clock_bt_ctlr_hf_release call.
|
|
*/
|
|
void z_nrf_clock_bt_ctlr_hf_request(void);
|
|
|
|
/** @brief Release high frequency clock from Bluetooth Controller.
|
|
*
|
|
* See z_nrf_clock_bt_ctlr_hf_request for details.
|
|
*/
|
|
void z_nrf_clock_bt_ctlr_hf_release(void);
|
|
|
|
#endif /* ZEPHYR_INCLUDE_DRIVERS_CLOCK_CONTROL_NRF_CLOCK_CONTROL_H_ */
|