123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- /*
- * 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>
- #ifdef __cplusplus
- extern "C" {
- #endif
- /** @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
- #if NRF_CLOCK_HAS_HFCLKAUDIO
- CLOCK_CONTROL_NRF_TYPE_HFCLKAUDIO,
- #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)
- #define CLOCK_CONTROL_NRF_SUBSYS_HFAUDIO \
- ((clock_control_subsys_t)CLOCK_CONTROL_NRF_TYPE_HFCLKAUDIO)
- /** @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);
- #ifdef __cplusplus
- }
- #endif
- #endif /* ZEPHYR_INCLUDE_DRIVERS_CLOCK_CONTROL_NRF_CLOCK_CONTROL_H_ */
|