Zephyr API Documentation 4.2.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
nrf_clock_control.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2016 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_DRIVERS_CLOCK_CONTROL_NRF_CLOCK_CONTROL_H_
8#define ZEPHYR_INCLUDE_DRIVERS_CLOCK_CONTROL_NRF_CLOCK_CONTROL_H_
9
10#include <zephyr/device.h>
11#include <zephyr/sys/onoff.h>
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18#if defined(CONFIG_CLOCK_CONTROL_NRF)
19
20#include <hal/nrf_clock.h>
21
26enum clock_control_nrf_type {
27 CLOCK_CONTROL_NRF_TYPE_HFCLK,
28 CLOCK_CONTROL_NRF_TYPE_LFCLK,
29#if NRF_CLOCK_HAS_HFCLK24M
30 CLOCK_CONTROL_NRF_TYPE_HFCLK24M,
31#endif
32#if NRF_CLOCK_HAS_HFCLK192M
33 CLOCK_CONTROL_NRF_TYPE_HFCLK192M,
34#endif
35#if NRF_CLOCK_HAS_HFCLKAUDIO
36 CLOCK_CONTROL_NRF_TYPE_HFCLKAUDIO,
37#endif
38 CLOCK_CONTROL_NRF_TYPE_COUNT
39};
40
41/* Define can be used with clock control API instead of enum directly to
42 * increase code readability.
43 */
44#define CLOCK_CONTROL_NRF_SUBSYS_HF \
45 ((clock_control_subsys_t)CLOCK_CONTROL_NRF_TYPE_HFCLK)
46#define CLOCK_CONTROL_NRF_SUBSYS_LF \
47 ((clock_control_subsys_t)CLOCK_CONTROL_NRF_TYPE_LFCLK)
48#define CLOCK_CONTROL_NRF_SUBSYS_HF24M \
49 ((clock_control_subsys_t)CLOCK_CONTROL_NRF_TYPE_HFCLK24M)
50#define CLOCK_CONTROL_NRF_SUBSYS_HF192M \
51 ((clock_control_subsys_t)CLOCK_CONTROL_NRF_TYPE_HFCLK192M)
52#define CLOCK_CONTROL_NRF_SUBSYS_HFAUDIO \
53 ((clock_control_subsys_t)CLOCK_CONTROL_NRF_TYPE_HFCLKAUDIO)
54
56enum nrf_lfclk_start_mode {
57 CLOCK_CONTROL_NRF_LF_START_NOWAIT,
58 CLOCK_CONTROL_NRF_LF_START_AVAILABLE,
59 CLOCK_CONTROL_NRF_LF_START_STABLE,
60};
61
62/* Define 32KHz clock source */
63#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC
64#define CLOCK_CONTROL_NRF_K32SRC NRF_CLOCK_LFCLK_RC
65#endif
66#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL
67#define CLOCK_CONTROL_NRF_K32SRC NRF_CLOCK_LFCLK_XTAL
68#endif
69#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_SYNTH
70#define CLOCK_CONTROL_NRF_K32SRC NRF_CLOCK_LFCLK_SYNTH
71#endif
72#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_EXT_LOW_SWING
73#define CLOCK_CONTROL_NRF_K32SRC NRF_CLOCK_LFCLK_XTAL_LOW_SWING
74#endif
75#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_EXT_FULL_SWING
76#define CLOCK_CONTROL_NRF_K32SRC NRF_CLOCK_LFCLK_XTAL_FULL_SWING
77#endif
78
79/* Define 32KHz clock accuracy */
80#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM
81#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 0
82#endif
83#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_250PPM
84#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 1
85#endif
86#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_150PPM
87#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 2
88#endif
89#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_100PPM
90#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 3
91#endif
92#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_75PPM
93#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 4
94#endif
95#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_50PPM
96#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 5
97#endif
98#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM
99#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 6
100#endif
101#ifdef CONFIG_CLOCK_CONTROL_NRF_K32SRC_20PPM
102#define CLOCK_CONTROL_NRF_K32SRC_ACCURACY 7
103#endif
104
106void z_nrf_clock_calibration_force_start(void);
107
114int z_nrf_clock_calibration_count(void);
115
122int z_nrf_clock_calibration_skips_count(void);
123
124
129bool z_nrf_clock_calibration_is_in_progress(void);
130
137struct onoff_manager *z_nrf_clock_control_get_onoff(clock_control_subsys_t sys);
138
147void z_nrf_clock_control_lf_on(enum nrf_lfclk_start_mode start_mode);
148
161void z_nrf_clock_bt_ctlr_hf_request(void);
162
167void z_nrf_clock_bt_ctlr_hf_release(void);
168
174uint32_t z_nrf_clock_bt_ctlr_hf_get_startup_time_us(void);
175
176#endif /* defined(CONFIG_CLOCK_CONTROL_NRF) */
177
178/* Specifies to use the maximum available frequency for a given clock. */
179#define NRF_CLOCK_CONTROL_FREQUENCY_MAX UINT32_MAX
180
181/* Specifies to use the maximum available accuracy for a given clock. */
182#define NRF_CLOCK_CONTROL_ACCURACY_MAX 1
183/* Specifies the required clock accuracy in parts-per-million. */
184#define NRF_CLOCK_CONTROL_ACCURACY_PPM(ppm) (ppm)
185
186/* Specifies that high precision of the clock is required. */
187#define NRF_CLOCK_CONTROL_PRECISION_HIGH 1
188/* Specifies that default precision of the clock is sufficient. */
189#define NRF_CLOCK_CONTROL_PRECISION_DEFAULT 0
190
191/* AUXPLL devicetree takes in raw register values, these are the actual frequencies outputted */
192#define CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_MIN_HZ 80000000
193#define CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_AUDIO_44K1_HZ 11289591
194#define CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_USB24M_HZ 24000000
195#define CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_AUDIO_48K_HZ 12287963
196
197/* Internal helper macro to map DT property value to output frequency */
198#define _CLOCK_CONTROL_NRF_AUXPLL_MAP_FREQ(freq_val) \
199 ((freq_val) == NRF_AUXPLL_FREQ_DIV_MIN ? \
200 CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_MIN_HZ : \
201 (freq_val) == NRF_AUXPLL_FREQ_DIV_AUDIO_44K1 ? \
202 CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_AUDIO_44K1_HZ : \
203 (freq_val) == NRF_AUXPLL_FREQ_DIV_USB24M ? \
204 CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_USB24M_HZ : \
205 (freq_val) == NRF_AUXPLL_FREQ_DIV_AUDIO_48K ? \
206 CLOCK_CONTROL_NRF_AUXPLL_FREQ_OUT_AUDIO_48K_HZ : 0)
207
208/* Public macro to get output frequency of AUXPLL */
209#define CLOCK_CONTROL_NRF_AUXPLL_GET_FREQ(node) \
210 COND_CODE_1(DT_NODE_HAS_PROP(node, nordic_frequency), \
211 (_CLOCK_CONTROL_NRF_AUXPLL_MAP_FREQ(DT_PROP(node, nordic_frequency))), \
212 (0))
213
219
222
223 int (*request)(const struct device *dev,
224 const struct nrf_clock_spec *spec,
225 struct onoff_client *cli);
226 int (*release)(const struct device *dev,
227 const struct nrf_clock_spec *spec);
228 int (*cancel_or_release)(const struct device *dev,
229 const struct nrf_clock_spec *spec,
230 struct onoff_client *cli);
231 int (*resolve)(const struct device *dev,
232 const struct nrf_clock_spec *req_spec,
233 struct nrf_clock_spec *res_spec);
234 int (*get_startup_time)(const struct device *dev,
235 const struct nrf_clock_spec *spec,
236 uint32_t *startup_time_us);
237};
238
271static inline
272int nrf_clock_control_request(const struct device *dev,
273 const struct nrf_clock_spec *spec,
274 struct onoff_client *cli)
275{
276 const struct nrf_clock_control_driver_api *api =
277 (const struct nrf_clock_control_driver_api *)dev->api;
278
279 return api->request(dev, spec, cli);
280}
281
297 const struct nrf_clock_spec *spec,
298 k_timeout_t timeout);
299
314static inline
315int nrf_clock_control_release(const struct device *dev,
316 const struct nrf_clock_spec *spec)
317{
318 const struct nrf_clock_control_driver_api *api =
319 (const struct nrf_clock_control_driver_api *)dev->api;
320
321 return api->release(dev, spec);
322}
323
346static inline
348 const struct nrf_clock_spec *spec,
349 struct onoff_client *cli)
350{
351 const struct nrf_clock_control_driver_api *api =
352 (const struct nrf_clock_control_driver_api *)dev->api;
353
354 return api->cancel_or_release(dev, spec, cli);
355}
356
367static inline int nrf_clock_control_resolve(const struct device *dev,
368 const struct nrf_clock_spec *req_spec,
369 struct nrf_clock_spec *res_spec)
370{
371 const struct nrf_clock_control_driver_api *api =
372 (const struct nrf_clock_control_driver_api *)dev->api;
373
374 if (api->resolve == NULL) {
375 return -ENOSYS;
376 }
377
378 return api->resolve(dev, req_spec, res_spec);
379}
380
391static inline int nrf_clock_control_get_startup_time(const struct device *dev,
392 const struct nrf_clock_spec *spec,
393 uint32_t *startup_time_us)
394{
395 const struct nrf_clock_control_driver_api *api =
396 (const struct nrf_clock_control_driver_api *)dev->api;
397
398 if (api->get_startup_time == NULL) {
399 return -ENOSYS;
400 }
401
402 return api->get_startup_time(dev, spec, startup_time_us);
403}
404
417
428
429#ifdef __cplusplus
430}
431#endif
432
433#endif /* ZEPHYR_INCLUDE_DRIVERS_CLOCK_CONTROL_NRF_CLOCK_CONTROL_H_ */
Main header file for clock control driver API.
void * clock_control_subsys_t
clock_control_subsys_t is a type to identify a clock controller sub-system.
Definition clock_control.h:59
#define ENOSYS
Function not implemented.
Definition errno.h:82
#define NULL
Definition iar_missing_defs.h:20
static int nrf_clock_control_get_startup_time(const struct device *dev, const struct nrf_clock_spec *spec, uint32_t *startup_time_us)
Get the startup time of a clock.
Definition nrf_clock_control.h:391
void nrf_clock_control_hfxo_request(void)
Request the HFXO from Zero Latency Interrupt context.
static int nrf_clock_control_request(const struct device *dev, const struct nrf_clock_spec *spec, struct onoff_client *cli)
Request a reservation to use a given clock with specified attributes.
Definition nrf_clock_control.h:272
static int nrf_clock_control_cancel_or_release(const struct device *dev, const struct nrf_clock_spec *spec, struct onoff_client *cli)
Safely cancel a reservation request.
Definition nrf_clock_control.h:347
void nrf_clock_control_hfxo_release(void)
Release the HFXO from Zero Latency Interrupt context.
static int nrf_clock_control_release(const struct device *dev, const struct nrf_clock_spec *spec)
Release a reserved use of a clock.
Definition nrf_clock_control.h:315
static int nrf_clock_control_resolve(const struct device *dev, const struct nrf_clock_spec *req_spec, struct nrf_clock_spec *res_spec)
Resolve a requested clock spec to resulting spec.
Definition nrf_clock_control.h:367
int nrf_clock_control_request_sync(const struct device *dev, const struct nrf_clock_spec *spec, k_timeout_t timeout)
Synchronously request a reservation to use a given clock with specified attributes.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Definition clock_control.h:103
Runtime device structure (in ROM) per driver instance.
Definition device.h:510
const void * api
Address of the API structure exposed by the device instance.
Definition device.h:516
Kernel timeout type.
Definition clock.h:65
Definition nrf_clock_control.h:220
int(* resolve)(const struct device *dev, const struct nrf_clock_spec *req_spec, struct nrf_clock_spec *res_spec)
Definition nrf_clock_control.h:231
int(* request)(const struct device *dev, const struct nrf_clock_spec *spec, struct onoff_client *cli)
Definition nrf_clock_control.h:223
int(* cancel_or_release)(const struct device *dev, const struct nrf_clock_spec *spec, struct onoff_client *cli)
Definition nrf_clock_control.h:228
struct clock_control_driver_api std_api
Definition nrf_clock_control.h:221
int(* get_startup_time)(const struct device *dev, const struct nrf_clock_spec *spec, uint32_t *startup_time_us)
Definition nrf_clock_control.h:234
int(* release)(const struct device *dev, const struct nrf_clock_spec *spec)
Definition nrf_clock_control.h:226
Definition nrf_clock_control.h:214
uint16_t accuracy
Definition nrf_clock_control.h:216
uint16_t precision
Definition nrf_clock_control.h:217
uint32_t frequency
Definition nrf_clock_control.h:215
State associated with a client of an on-off service.
Definition onoff.h:274
State associated with an on-off manager.
Definition onoff.h:154