1 /*
2 * Copyright (c) 2018 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 /* Use the NRF_RTC instance for coarse radio event scheduling */
8 #define NRF_RTC NRF_RTC0
9
10 /* HAL abstraction of event timer prescaler value */
11 #define HAL_EVENT_TIMER_PRESCALER_VALUE 4U
12
13 /* NRF Radio HW timing constants
14 * - provided in US and NS (for higher granularity)
15 * - based on empirical measurements and sniffer logs
16 */
17
18 /* TXEN->TXIDLE + TXIDLE->TX (with fast Radio ramp-up mode)
19 * in microseconds for LE 1M PHY.
20 */
21 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_FAST_NS 41050 /* 40.1 + 0.95 */
22 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_FAST_US \
23 HAL_RADIO_NS2US_ROUND(HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_FAST_NS)
24
25 /* TXEN->TXIDLE + TXIDLE->TX (with default Radio ramp-up mode)
26 * in microseconds for LE 1M PHY.
27 */
28 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_DEFAULT_NS 141050 /*140.1 + 0.95*/
29 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_DEFAULT_US \
30 HAL_RADIO_NS2US_ROUND(HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_DEFAULT_NS)
31
32 /* TXEN->TXIDLE + TXIDLE->TX (with default Radio ramp-up mode
33 * and no HW TIFS auto-switch) in microseconds for LE 1M PHY.
34 */
35 /* 129 + 0.95 */
36 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_DEFAULT_NO_HW_TIFS_NS 129950
37 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_DEFAULT_NO_HW_TIFS_US \
38 HAL_RADIO_NS2US_ROUND( \
39 HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_DEFAULT_NO_HW_TIFS_NS)
40
41 /* TXEN->TXIDLE + TXIDLE->TX (with fast Radio ramp-up mode)
42 * in microseconds for LE 2M PHY.
43 */
44 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_FAST_NS 40000 /* 40.1 - 0.1 */
45 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_FAST_US \
46 HAL_RADIO_NS2US_ROUND(HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_FAST_NS)
47
48 /* TXEN->TXIDLE + TXIDLE->TX (with default Radio ramp-up mode)
49 * in microseconds for LE 2M PHY.
50 */
51 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_DEFAULT_NS 144500 /* 144.6 - 0.1 */
52 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_DEFAULT_US \
53 HAL_RADIO_NS2US_ROUND(HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_DEFAULT_NS)
54
55 /* TXEN->TXIDLE + TXIDLE->TX (with default Radio ramp-up mode
56 * and no HW TIFS auto-switch) in microseconds for LE 2M PHY.
57 */
58 /* 129 - 0.1 */
59 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_DEFAULT_NO_HW_TIFS_NS 128900
60 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_DEFAULT_NO_HW_TIFS_US \
61 HAL_RADIO_NS2US_ROUND( \
62 HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_DEFAULT_NO_HW_TIFS_NS)
63
64 /* RXEN->RXIDLE + RXIDLE->RX (with fast Radio ramp-up mode)
65 * in microseconds for LE 1M PHY.
66 */
67 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_FAST_NS 40300 /* 40.1 + 0.2 */
68 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_FAST_US \
69 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_FAST_NS)
70
71 /* RXEN->RXIDLE + RXIDLE->RX (with default Radio ramp-up mode)
72 * in microseconds for LE 1M PHY.
73 */
74 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_DEFAULT_NS 140300 /*140.1 + 0.2*/
75 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_DEFAULT_US \
76 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_DEFAULT_NS)
77
78 /* RXEN->RXIDLE + RXIDLE->RX (with default Radio ramp-up mode and
79 * no HW TIFS auto-switch) in microseconds for LE 1M PHY.
80 */
81 /* 129 + 0.2 */
82 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_DEFAULT_NO_HW_TIFS_NS 129200
83 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_DEFAULT_NO_HW_TIFS_US \
84 HAL_RADIO_NS2US_CEIL( \
85 HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_DEFAULT_NO_HW_TIFS_NS)
86
87 /* RXEN->RXIDLE + RXIDLE->RX (with fast Radio ramp-up mode)
88 * in microseconds for LE 2M PHY.
89 */
90 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_FAST_NS 40300 /* 40.1 + 0.2 */
91 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_FAST_US \
92 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_FAST_NS)
93
94 /* RXEN->RXIDLE + RXIDLE->RX (with default Radio ramp-up mode)
95 * in microseconds for LE 2M PHY.
96 */
97 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_DEFAULT_NS 144800 /* 144.6 + 0.2 */
98 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_DEFAULT_US \
99 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_DEFAULT_NS)
100
101 /* RXEN->RXIDLE + RXIDLE->RX (with default Radio ramp-up mode and
102 * no HW TIFS auto-switch) in microseconds for LE 2M PHY.
103 */
104 /* 129 + 0.2 */
105 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_DEFAULT_NO_HW_TIFS_NS 129200
106 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_DEFAULT_NO_HW_TIFS_US \
107 HAL_RADIO_NS2US_CEIL(\
108 HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_DEFAULT_NO_HW_TIFS_NS)
109
110 #define HAL_RADIO_NRF52805_TX_CHAIN_DELAY_NS 600 /* 0.6 */
111 #define HAL_RADIO_NRF52805_TX_CHAIN_DELAY_US \
112 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52805_TX_CHAIN_DELAY_NS)
113
114 #define HAL_RADIO_NRF52805_RX_CHAIN_DELAY_1M_NS 9400 /* 9.4 */
115 #define HAL_RADIO_NRF52805_RX_CHAIN_DELAY_1M_US \
116 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52805_RX_CHAIN_DELAY_1M_NS)
117
118 #define HAL_RADIO_NRF52805_RX_CHAIN_DELAY_2M_NS 5450 /* 5.0 + 0.45 */
119 #define HAL_RADIO_NRF52805_RX_CHAIN_DELAY_2M_US \
120 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52805_RX_CHAIN_DELAY_2M_NS)
121
122 #if defined(CONFIG_BT_CTLR_RADIO_ENABLE_FAST)
123 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_US \
124 HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_FAST_US
125 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_NS \
126 HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_FAST_NS
127
128 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_US \
129 HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_FAST_US
130 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_NS \
131 HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_FAST_NS
132
133 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_US \
134 HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_FAST_US
135 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_NS \
136 HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_FAST_NS
137
138 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_US \
139 HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_FAST_US
140 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_NS \
141 HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_FAST_NS
142
143 #else /* !CONFIG_BT_CTLR_RADIO_ENABLE_FAST */
144 #if defined(CONFIG_BT_CTLR_TIFS_HW)
145 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_US \
146 HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_DEFAULT_US
147 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_NS \
148 HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_DEFAULT_NS
149
150 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_US \
151 HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_DEFAULT_US
152 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_NS \
153 HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_DEFAULT_NS
154
155 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_US \
156 HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_DEFAULT_US
157 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_NS \
158 HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_DEFAULT_NS
159
160 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_US \
161 HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_DEFAULT_US
162 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_NS \
163 HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_DEFAULT_NS
164
165 #else /* !CONFIG_BT_CTLR_TIFS_HW */
166 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_US \
167 HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_DEFAULT_NO_HW_TIFS_US
168 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_NS \
169 HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_DEFAULT_NO_HW_TIFS_NS
170
171 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_US \
172 HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_DEFAULT_NO_HW_TIFS_US
173 #define HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_NS \
174 HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_DEFAULT_NO_HW_TIFS_NS
175
176 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_US \
177 HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_DEFAULT_NO_HW_TIFS_US
178 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_NS \
179 HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_DEFAULT_NO_HW_TIFS_NS
180
181 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_US \
182 HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_DEFAULT_NO_HW_TIFS_US
183 #define HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_NS \
184 HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_DEFAULT_NO_HW_TIFS_NS
185 #endif /* !CONFIG_BT_CTLR_TIFS_HW */
186 #endif /* !CONFIG_BT_CTLR_RADIO_ENABLE_FAST */
187
188 /* HAL abstraction of Radio bitfields */
189 #define HAL_NRF_RADIO_EVENT_END NRF_RADIO_EVENT_END
190 #define HAL_RADIO_EVENTS_END EVENTS_END
191 #define HAL_RADIO_INTENSET_DISABLED_Msk RADIO_INTENSET_DISABLED_Msk
192 #define HAL_RADIO_SHORTS_TRX_END_DISABLE_Msk RADIO_SHORTS_END_DISABLE_Msk
193
194 /* HAL abstraction of Radio IRQ number */
195 #define HAL_RADIO_IRQn RADIO_IRQn
196
hal_radio_reset(void)197 static inline void hal_radio_reset(void)
198 {
199 /* TODO: Add any required setup for each radio event
200 */
201 }
202
hal_radio_stop(void)203 static inline void hal_radio_stop(void)
204 {
205 /* TODO: Add any required cleanup of actions taken in hal_radio_reset()
206 */
207 }
208
hal_radio_ram_prio_setup(void)209 static inline void hal_radio_ram_prio_setup(void)
210 {
211 struct {
212 uint32_t volatile reserved_0[0x5a0 >> 2];
213 uint32_t volatile bridge_type;
214 uint32_t volatile reserved_1[((0xe00 - 0x5a0) >> 2) - 1];
215 struct {
216 uint32_t volatile CPU0;
217 uint32_t volatile SPIS1;
218 uint32_t volatile RADIO;
219 uint32_t volatile ECB;
220 uint32_t volatile CCM;
221 uint32_t volatile AAR;
222 uint32_t volatile SAADC;
223 uint32_t volatile UARTE;
224 uint32_t volatile SERIAL0;
225 } RAMPRI;
226 } volatile *NRF_AMLI = (void volatile *)0x40000000UL;
227
228 NRF_AMLI->RAMPRI.CPU0 = 0xFFFFFFFFUL;
229 NRF_AMLI->RAMPRI.SPIS1 = 0xFFFFFFFFUL;
230 NRF_AMLI->RAMPRI.RADIO = 0x00000000UL;
231 NRF_AMLI->RAMPRI.ECB = 0xFFFFFFFFUL;
232 NRF_AMLI->RAMPRI.CCM = 0x00000000UL;
233 NRF_AMLI->RAMPRI.AAR = 0xFFFFFFFFUL;
234 NRF_AMLI->RAMPRI.SAADC = 0xFFFFFFFFUL;
235 NRF_AMLI->RAMPRI.UARTE = 0xFFFFFFFFUL;
236 NRF_AMLI->RAMPRI.SERIAL0 = 0xFFFFFFFFUL;
237 }
238
hal_radio_phy_mode_get(uint8_t phy,uint8_t flags)239 static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
240 {
241 ARG_UNUSED(flags);
242 uint32_t mode;
243
244 switch (phy) {
245 case BIT(0):
246 default:
247 mode = RADIO_MODE_MODE_Ble_1Mbit;
248 break;
249
250 case BIT(1):
251 mode = RADIO_MODE_MODE_Ble_2Mbit;
252 break;
253 }
254
255 return mode;
256 }
257
hal_radio_tx_power_min_get(void)258 static inline uint32_t hal_radio_tx_power_min_get(void)
259 {
260 return RADIO_TXPOWER_TXPOWER_Neg40dBm;
261 }
262
hal_radio_tx_power_max_get(void)263 static inline uint32_t hal_radio_tx_power_max_get(void)
264 {
265 return RADIO_TXPOWER_TXPOWER_Pos4dBm;
266 }
267
hal_radio_tx_power_floor(int8_t tx_power_lvl)268 static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
269 {
270 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
271 return RADIO_TXPOWER_TXPOWER_Pos4dBm;
272 }
273
274 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
275 return RADIO_TXPOWER_TXPOWER_Pos3dBm;
276 }
277
278 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
279 return RADIO_TXPOWER_TXPOWER_0dBm;
280 }
281
282 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
283 return RADIO_TXPOWER_TXPOWER_Neg4dBm;
284 }
285
286 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
287 return RADIO_TXPOWER_TXPOWER_Neg8dBm;
288 }
289
290 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
291 return RADIO_TXPOWER_TXPOWER_Neg12dBm;
292 }
293
294 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
295 return RADIO_TXPOWER_TXPOWER_Neg16dBm;
296 }
297
298 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
299 return RADIO_TXPOWER_TXPOWER_Neg20dBm;
300 }
301
302 /* Note: The -30 dBm power level is deprecated so ignore it! */
303 return RADIO_TXPOWER_TXPOWER_Neg40dBm;
304 }
305
hal_radio_tx_ready_delay_us_get(uint8_t phy,uint8_t flags)306 static inline uint32_t hal_radio_tx_ready_delay_us_get(uint8_t phy, uint8_t flags)
307 {
308 ARG_UNUSED(flags);
309
310 switch (phy) {
311 default:
312 case BIT(0):
313 return HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_US;
314 case BIT(1):
315 return HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_US;
316 }
317 }
318
hal_radio_rx_ready_delay_us_get(uint8_t phy,uint8_t flags)319 static inline uint32_t hal_radio_rx_ready_delay_us_get(uint8_t phy, uint8_t flags)
320 {
321 ARG_UNUSED(flags);
322
323 switch (phy) {
324 default:
325 case BIT(0):
326 return HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_US;
327 case BIT(1):
328 return HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_US;
329 }
330 }
331
hal_radio_tx_chain_delay_us_get(uint8_t phy,uint8_t flags)332 static inline uint32_t hal_radio_tx_chain_delay_us_get(uint8_t phy, uint8_t flags)
333 {
334 ARG_UNUSED(phy);
335 ARG_UNUSED(flags);
336
337 return HAL_RADIO_NRF52805_TX_CHAIN_DELAY_US;
338 }
339
hal_radio_rx_chain_delay_us_get(uint8_t phy,uint8_t flags)340 static inline uint32_t hal_radio_rx_chain_delay_us_get(uint8_t phy, uint8_t flags)
341 {
342 ARG_UNUSED(flags);
343
344 switch (phy) {
345 default:
346 case BIT(0):
347 return HAL_RADIO_NRF52805_RX_CHAIN_DELAY_1M_US;
348 case BIT(1):
349 return HAL_RADIO_NRF52805_RX_CHAIN_DELAY_2M_US;
350 }
351 }
352
hal_radio_tx_ready_delay_ns_get(uint8_t phy,uint8_t flags)353 static inline uint32_t hal_radio_tx_ready_delay_ns_get(uint8_t phy, uint8_t flags)
354 {
355 ARG_UNUSED(flags);
356
357 switch (phy) {
358 default:
359 case BIT(0):
360 return HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_NS;
361 case BIT(1):
362 return HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_NS;
363 }
364 }
365
hal_radio_rx_ready_delay_ns_get(uint8_t phy,uint8_t flags)366 static inline uint32_t hal_radio_rx_ready_delay_ns_get(uint8_t phy, uint8_t flags)
367 {
368 ARG_UNUSED(flags);
369
370 switch (phy) {
371 default:
372 case BIT(0):
373 return HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_NS;
374 case BIT(1):
375 return HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_NS;
376 }
377 }
378
hal_radio_tx_chain_delay_ns_get(uint8_t phy,uint8_t flags)379 static inline uint32_t hal_radio_tx_chain_delay_ns_get(uint8_t phy, uint8_t flags)
380 {
381 ARG_UNUSED(phy);
382 ARG_UNUSED(flags);
383
384 return HAL_RADIO_NRF52805_TX_CHAIN_DELAY_US;
385 }
386
hal_radio_rx_chain_delay_ns_get(uint8_t phy,uint8_t flags)387 static inline uint32_t hal_radio_rx_chain_delay_ns_get(uint8_t phy, uint8_t flags)
388 {
389 ARG_UNUSED(flags);
390
391 switch (phy) {
392 default:
393 case BIT(0):
394 return HAL_RADIO_NRF52805_RX_CHAIN_DELAY_1M_NS;
395 case BIT(1):
396 return HAL_RADIO_NRF52805_RX_CHAIN_DELAY_2M_NS;
397 }
398 }
399