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_RADIO_INTENSET_DISABLED_Msk RADIO_INTENSET_DISABLED_Msk
190 #define HAL_RADIO_SHORTS_TRX_END_DISABLE_Msk RADIO_SHORTS_END_DISABLE_Msk
191 #define HAL_RADIO_SHORTS_TRX_PHYEND_DISABLE_Msk RADIO_SHORTS_PHYEND_DISABLE_Msk
192
193 /* HAL abstraction of Radio IRQ number */
194 #define HAL_RADIO_IRQn RADIO_IRQn
195
hal_radio_reset(void)196 static inline void hal_radio_reset(void)
197 {
198 /* TODO: Add any required setup for each radio event
199 */
200 }
201
hal_radio_stop(void)202 static inline void hal_radio_stop(void)
203 {
204 /* TODO: Add any required cleanup of actions taken in hal_radio_reset()
205 */
206 }
207
hal_radio_ram_prio_setup(void)208 static inline void hal_radio_ram_prio_setup(void)
209 {
210 struct {
211 uint32_t volatile reserved_0[0x5a0 >> 2];
212 uint32_t volatile bridge_type;
213 uint32_t volatile reserved_1[((0xe00 - 0x5a0) >> 2) - 1];
214 struct {
215 uint32_t volatile CPU0;
216 uint32_t volatile SPIS1;
217 uint32_t volatile RADIO;
218 uint32_t volatile ECB;
219 uint32_t volatile CCM;
220 uint32_t volatile AAR;
221 uint32_t volatile SAADC;
222 uint32_t volatile UARTE;
223 uint32_t volatile SERIAL0;
224 } RAMPRI;
225 } volatile *NRF_AMLI = (void volatile *)0x40000000UL;
226
227 NRF_AMLI->RAMPRI.CPU0 = 0xFFFFFFFFUL;
228 NRF_AMLI->RAMPRI.SPIS1 = 0xFFFFFFFFUL;
229 NRF_AMLI->RAMPRI.RADIO = 0x00000000UL;
230 NRF_AMLI->RAMPRI.ECB = 0xFFFFFFFFUL;
231 NRF_AMLI->RAMPRI.CCM = 0x00000000UL;
232 NRF_AMLI->RAMPRI.AAR = 0xFFFFFFFFUL;
233 NRF_AMLI->RAMPRI.SAADC = 0xFFFFFFFFUL;
234 NRF_AMLI->RAMPRI.UARTE = 0xFFFFFFFFUL;
235 NRF_AMLI->RAMPRI.SERIAL0 = 0xFFFFFFFFUL;
236 }
237
hal_radio_phy_mode_get(uint8_t phy,uint8_t flags)238 static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
239 {
240 ARG_UNUSED(flags);
241 uint32_t mode;
242
243 switch (phy) {
244 case BIT(0):
245 default:
246 mode = RADIO_MODE_MODE_Ble_1Mbit;
247 break;
248
249 case BIT(1):
250 mode = RADIO_MODE_MODE_Ble_2Mbit;
251 break;
252 }
253
254 return mode;
255 }
256
hal_radio_tx_power_min_get(void)257 static inline uint32_t hal_radio_tx_power_min_get(void)
258 {
259 return RADIO_TXPOWER_TXPOWER_Neg40dBm;
260 }
261
hal_radio_tx_power_max_get(void)262 static inline uint32_t hal_radio_tx_power_max_get(void)
263 {
264 return RADIO_TXPOWER_TXPOWER_Pos4dBm;
265 }
266
hal_radio_tx_power_floor(int8_t tx_power_lvl)267 static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
268 {
269 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
270 return RADIO_TXPOWER_TXPOWER_Pos4dBm;
271 }
272
273 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
274 return RADIO_TXPOWER_TXPOWER_Pos3dBm;
275 }
276
277 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
278 return RADIO_TXPOWER_TXPOWER_0dBm;
279 }
280
281 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
282 return RADIO_TXPOWER_TXPOWER_Neg4dBm;
283 }
284
285 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
286 return RADIO_TXPOWER_TXPOWER_Neg8dBm;
287 }
288
289 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
290 return RADIO_TXPOWER_TXPOWER_Neg12dBm;
291 }
292
293 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
294 return RADIO_TXPOWER_TXPOWER_Neg16dBm;
295 }
296
297 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
298 return RADIO_TXPOWER_TXPOWER_Neg20dBm;
299 }
300
301 /* Note: The -30 dBm power level is deprecated so ignore it! */
302 return RADIO_TXPOWER_TXPOWER_Neg40dBm;
303 }
304
hal_radio_tx_ready_delay_us_get(uint8_t phy,uint8_t flags)305 static inline uint32_t hal_radio_tx_ready_delay_us_get(uint8_t phy, uint8_t flags)
306 {
307 ARG_UNUSED(flags);
308
309 switch (phy) {
310 default:
311 case BIT(0):
312 return HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_US;
313 case BIT(1):
314 return HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_US;
315 }
316 }
317
hal_radio_rx_ready_delay_us_get(uint8_t phy,uint8_t flags)318 static inline uint32_t hal_radio_rx_ready_delay_us_get(uint8_t phy, uint8_t flags)
319 {
320 ARG_UNUSED(flags);
321
322 switch (phy) {
323 default:
324 case BIT(0):
325 return HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_US;
326 case BIT(1):
327 return HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_US;
328 }
329 }
330
hal_radio_tx_chain_delay_us_get(uint8_t phy,uint8_t flags)331 static inline uint32_t hal_radio_tx_chain_delay_us_get(uint8_t phy, uint8_t flags)
332 {
333 ARG_UNUSED(phy);
334 ARG_UNUSED(flags);
335
336 return HAL_RADIO_NRF52805_TX_CHAIN_DELAY_US;
337 }
338
hal_radio_rx_chain_delay_us_get(uint8_t phy,uint8_t flags)339 static inline uint32_t hal_radio_rx_chain_delay_us_get(uint8_t phy, uint8_t flags)
340 {
341 ARG_UNUSED(flags);
342
343 switch (phy) {
344 default:
345 case BIT(0):
346 return HAL_RADIO_NRF52805_RX_CHAIN_DELAY_1M_US;
347 case BIT(1):
348 return HAL_RADIO_NRF52805_RX_CHAIN_DELAY_2M_US;
349 }
350 }
351
hal_radio_tx_ready_delay_ns_get(uint8_t phy,uint8_t flags)352 static inline uint32_t hal_radio_tx_ready_delay_ns_get(uint8_t phy, uint8_t flags)
353 {
354 ARG_UNUSED(flags);
355
356 switch (phy) {
357 default:
358 case BIT(0):
359 return HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_1M_NS;
360 case BIT(1):
361 return HAL_RADIO_NRF52805_TXEN_TXIDLE_TX_2M_NS;
362 }
363 }
364
hal_radio_rx_ready_delay_ns_get(uint8_t phy,uint8_t flags)365 static inline uint32_t hal_radio_rx_ready_delay_ns_get(uint8_t phy, uint8_t flags)
366 {
367 ARG_UNUSED(flags);
368
369 switch (phy) {
370 default:
371 case BIT(0):
372 return HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_1M_NS;
373 case BIT(1):
374 return HAL_RADIO_NRF52805_RXEN_RXIDLE_RX_2M_NS;
375 }
376 }
377
hal_radio_tx_chain_delay_ns_get(uint8_t phy,uint8_t flags)378 static inline uint32_t hal_radio_tx_chain_delay_ns_get(uint8_t phy, uint8_t flags)
379 {
380 ARG_UNUSED(phy);
381 ARG_UNUSED(flags);
382
383 return HAL_RADIO_NRF52805_TX_CHAIN_DELAY_US;
384 }
385
hal_radio_rx_chain_delay_ns_get(uint8_t phy,uint8_t flags)386 static inline uint32_t hal_radio_rx_chain_delay_ns_get(uint8_t phy, uint8_t flags)
387 {
388 ARG_UNUSED(flags);
389
390 switch (phy) {
391 default:
392 case BIT(0):
393 return HAL_RADIO_NRF52805_RX_CHAIN_DELAY_1M_NS;
394 case BIT(1):
395 return HAL_RADIO_NRF52805_RX_CHAIN_DELAY_2M_NS;
396 }
397 }
398