1 /*
2 * Copyright (c) 2018 Nordic Semiconductor ASA
3 * Copyright (c) 2018 Ioannis Glaropoulos
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8 #include <nrf_erratas.h>
9
10 /* Use the NRF_RTC instance for coarse radio event scheduling */
11 #define NRF_RTC NRF_RTC0
12
13 /* HAL abstraction of event timer prescaler value */
14 #define HAL_EVENT_TIMER_PRESCALER_VALUE 4U
15
16 /* NRF Radio HW timing constants
17 * - provided in US and NS (for higher granularity)
18 * - based on empirical measurements and sniffer logs
19 */
20
21 /* TXEN->TXIDLE + TXIDLE->TX (with fast Radio ramp-up mode)
22 * in microseconds for LE 1M PHY.
23 */
24 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_FAST_NS 40900 /*40.1 + 0.8*/
25 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_FAST_US \
26 HAL_RADIO_NS2US_ROUND(HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_FAST_NS)
27
28 /* TXEN->TXIDLE + TXIDLE->TX (with default Radio ramp-up mode)
29 * in microseconds for LE 1M PHY.
30 */
31 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_DEFAULT_NS 140900 /*140.1 + 0.8*/
32 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_DEFAULT_US \
33 HAL_RADIO_NS2US_ROUND(HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_DEFAULT_NS)
34
35 /* TXEN->TXIDLE + TXIDLE->TX (with default Radio ramp-up mode
36 * and no HW TIFS auto-switch) in microseconds for LE 1M PHY.
37 */
38 /* 129.5 + 0.8 */
39 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_DEFAULT_NO_HW_TIFS_NS 130300
40 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_DEFAULT_NO_HW_TIFS_US \
41 HAL_RADIO_NS2US_ROUND( \
42 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_DEFAULT_NO_HW_TIFS_NS)
43
44 /* TXEN->TXIDLE + TXIDLE->TX (with fast Radio ramp-up mode)
45 * in microseconds for LE 2M PHY.
46 */
47 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_FAST_NS 40000 /* 40.1 - 0.1 */
48 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_FAST_US \
49 HAL_RADIO_NS2US_ROUND(HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_FAST_NS)
50
51 /* TXEN->TXIDLE + TXIDLE->TX (with default Radio ramp-up mode)
52 * in microseconds for LE 2M PHY.
53 */
54 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_DEFAULT_NS 144900 /* 145 - 0.1 */
55 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_DEFAULT_US \
56 HAL_RADIO_NS2US_ROUND(HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_DEFAULT_NS)
57
58 /* TXEN->TXIDLE + TXIDLE->TX (with default Radio ramp-up mode and
59 * no HW TIFS auto-switch) in microseconds for LE 2M PHY.
60 */
61 /* 129.5 - 0.1 */
62 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_DEFAULT_NO_HW_TIFS_NS 129400
63 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_DEFAULT_NO_HW_TIFS_US \
64 HAL_RADIO_NS2US_ROUND( \
65 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_DEFAULT_NO_HW_TIFS_NS)
66
67 /* TXEN->TXIDLE + TXIDLE->TX (with fast Radio ramp-up mode)
68 * in microseconds for LE CODED PHY [S2].
69 */
70 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_FAST_NS 42300 /* 40.1 + 2.2 */
71 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_FAST_US \
72 HAL_RADIO_NS2US_ROUND(HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_FAST_NS)
73
74 /* TXEN->TXIDLE + TXIDLE->TX (with default Radio ramp-up mode)
75 * in microseconds for LE 2M PHY [S2].
76 */
77 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_DEFAULT_NS 132200 /* 130 + 2.2 */
78 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_DEFAULT_US \
79 HAL_RADIO_NS2US_ROUND(HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_DEFAULT_NS)
80
81 /* TXEN->TXIDLE + TXIDLE->TX (with default Radio ramp-up mode and
82 * no HW TIFS auto-switch) in microseconds for LE 2M PHY [S2].
83 */
84 /* 129.5 + 2.2 */
85 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_DEFAULT_NO_HW_TIFS_NS 131700
86 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_DEFAULT_NO_HW_TIFS_US \
87 HAL_RADIO_NS2US_ROUND( \
88 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_DEFAULT_NO_HW_TIFS_NS)
89
90 /* TXEN->TXIDLE + TXIDLE->TX (with fast Radio ramp-up mode)
91 * in microseconds for LE CODED PHY [S8].
92 */
93 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_FAST_NS 42300 /* 40.1 + 2.2 */
94 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_FAST_US \
95 HAL_RADIO_NS2US_ROUND(HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_FAST_NS)
96 /* TXEN->TXIDLE + TXIDLE->TX (with default Radio ramp-up mode)
97 * in microseconds for LE 2M PHY [S8].
98 */
99 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_DEFAULT_NS 121800 /*119.6 + 2.2*/
100 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_DEFAULT_US \
101 HAL_RADIO_NS2US_ROUND(HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_DEFAULT_NS)
102
103 /* TXEN->TXIDLE + TXIDLE->TX (with default Radio ramp-up mode and
104 * no HW TIFS auto-switch) in microseconds for LE 2M PHY [S8].
105 */
106 /* 129.5 + 2.2 */
107 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_DEFAULT_NO_HW_TIFS_NS 131700
108 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_DEFAULT_NO_HW_TIFS_US \
109 HAL_RADIO_NS2US_ROUND( \
110 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_DEFAULT_NO_HW_TIFS_NS)
111
112 /* RXEN->RXIDLE + RXIDLE->RX (with fast Radio ramp-up mode)
113 * in microseconds for LE 1M PHY.
114 */
115 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_FAST_NS 40300 /* 40.1 + 0.2 */
116 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_FAST_US \
117 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_FAST_NS)
118
119 /* RXEN->RXIDLE + RXIDLE->RX (with default Radio ramp-up mode)
120 * in microseconds for LE 1M PHY.
121 */
122 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_DEFAULT_NS 140300 /*140.1 + 0.2*/
123 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_DEFAULT_US \
124 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_DEFAULT_NS)
125
126 /* RXEN->RXIDLE + RXIDLE->RX (with default Radio ramp-up mode and
127 * no HW TIFS auto-switch) in microseconds for LE 1M PHY.
128 */
129 /* 129.5 + 0.2 */
130 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_DEFAULT_NO_HW_TIFS_NS 129700
131 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_DEFAULT_NO_HW_TIFS_US \
132 HAL_RADIO_NS2US_CEIL( \
133 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_DEFAULT_NO_HW_TIFS_NS)
134
135 /* RXEN->RXIDLE + RXIDLE->RX (with fast Radio ramp-up mode)
136 * in microseconds for LE 2M PHY.
137 */
138 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_FAST_NS 40300 /* 40.1 + 0.2 */
139 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_FAST_US \
140 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_FAST_NS)
141
142 /* RXEN->RXIDLE + RXIDLE->RX (with default Radio ramp-up mode)
143 * in microseconds for LE 2M PHY.
144 */
145 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_DEFAULT_NS 144800 /*144.6 + 0.2*/
146 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_DEFAULT_US \
147 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_DEFAULT_NS)
148
149 /* RXEN->RXIDLE + RXIDLE->RX (with default Radio ramp-up mode and
150 * no HW TIFS auto-switch) in microseconds for LE 2M PHY.
151 */
152 /* 129.5 + 0.2 */
153 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_DEFAULT_NO_HW_TIFS_NS 129700
154 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_DEFAULT_NO_HW_TIFS_US \
155 HAL_RADIO_NS2US_CEIL( \
156 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_DEFAULT_NO_HW_TIFS_NS)
157
158 /* RXEN->RXIDLE + RXIDLE->RX (with fast Radio ramp-up mode)
159 * in microseconds for LE Coded PHY [S2].
160 */
161 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_FAST_NS 40300 /* 40.1 + 0.2 */
162 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_FAST_US \
163 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_FAST_NS)
164
165 /* RXEN->RXIDLE + RXIDLE->RX (with default Radio ramp-up mode)
166 * in microseconds for LE Coded PHY [S2].
167 */
168 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_DEFAULT_NS 130200 /* 130 + 0.2 */
169 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_DEFAULT_US \
170 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_DEFAULT_NS)
171
172 /* RXEN->RXIDLE + RXIDLE->RX (with default Radio ramp-up mode
173 * and no HW TIFS auto-switch) in microseconds for LE Coded PHY [S2].
174 */
175 /* 129.5 + 0.2 */
176 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_DEFAULT_NO_HW_TIFS_NS 129700
177 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_DEFAULT_NO_HW_TIFS_US \
178 HAL_RADIO_NS2US_CEIL( \
179 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_DEFAULT_NO_HW_TIFS_NS)
180
181 /* RXEN->RXIDLE + RXIDLE->RX (with fast Radio ramp-up mode)
182 * in microseconds for LE Coded PHY [S8].
183 */
184 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_FAST_NS 40300 /* 40.1 + 0.2 */
185 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_FAST_US \
186 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_FAST_NS)
187
188 /* RXEN->RXIDLE + RXIDLE->RX (with default Radio ramp-up mode)
189 * in microseconds for LE Coded PHY [S8].
190 */
191 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_DEFAULT_NS 120200 /* 120.0 + 0.2 */
192 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_DEFAULT_US \
193 HAL_RADIO_NS2US_CEIL(HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_DEFAULT_NS)
194
195 /* RXEN->RXIDLE + RXIDLE->RX (with default Radio ramp-up mode and
196 * no HW TIFS auto-switch) in microseconds for LE Coded PHY [S8].
197 */
198 /* 129.5 + 0.2 */
199 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_DEFAULT_NO_HW_TIFS_NS 129700
200 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_DEFAULT_NO_HW_TIFS_US \
201 HAL_RADIO_NS2US_CEIL( \
202 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_DEFAULT_NO_HW_TIFS_NS)
203
204 #define HAL_RADIO_NRF52840_TX_CHAIN_DELAY_1M_US 1 /* ceil(0.6) */
205 #define HAL_RADIO_NRF52840_TX_CHAIN_DELAY_1M_NS 600 /* 0.6 */
206 #define HAL_RADIO_NRF52840_TX_CHAIN_DELAY_2M_US 1 /* ceil(0.6) */
207 #define HAL_RADIO_NRF52840_TX_CHAIN_DELAY_2M_NS 600 /* 0.6 */
208 #define HAL_RADIO_NRF52840_TX_CHAIN_DELAY_S2_US 1 /* ceil(0.6) */
209 #define HAL_RADIO_NRF52840_TX_CHAIN_DELAY_S2_NS 600 /* 0.6 */
210 #define HAL_RADIO_NRF52840_TX_CHAIN_DELAY_S8_US 1 /* ceil(0.6) */
211 #define HAL_RADIO_NRF52840_TX_CHAIN_DELAY_S8_NS 600 /* 0.6 */
212
213 #define HAL_RADIO_NRF52840_RX_CHAIN_DELAY_1M_US 10 /* ceil(9.4) */
214 #define HAL_RADIO_NRF52840_RX_CHAIN_DELAY_1M_NS 9400 /* 9.4 */
215 #define HAL_RADIO_NRF52840_RX_CHAIN_DELAY_2M_US 5 /* ceil(5.0) */
216 #define HAL_RADIO_NRF52840_RX_CHAIN_DELAY_2M_NS 5000 /* 5.0 */
217 #define HAL_RADIO_NRF52840_RX_CHAIN_DELAY_S2_US 25 /* ceil(24.6) */
218 #define HAL_RADIO_NRF52840_RX_CHAIN_DELAY_S2_NS 24600 /* 24.6 */
219 #define HAL_RADIO_NRF52840_RX_CHAIN_DELAY_S8_US 30 /* ceil(29.6) */
220 #define HAL_RADIO_NRF52840_RX_CHAIN_DELAY_S8_NS 29600 /* 29.6 */
221
222 #if defined(CONFIG_BT_CTLR_RADIO_ENABLE_FAST)
223 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_US \
224 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_FAST_US
225 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_NS \
226 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_FAST_NS
227
228 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_US \
229 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_FAST_US
230 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_NS \
231 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_FAST_NS
232
233 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_US \
234 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_FAST_US
235 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_NS \
236 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_FAST_NS
237
238 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_US \
239 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_FAST_US
240 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_NS \
241 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_FAST_NS
242
243 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_US \
244 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_FAST_US
245 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_NS \
246 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_FAST_NS
247
248 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_US \
249 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_FAST_US
250 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_NS \
251 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_FAST_NS
252
253 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_US \
254 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_FAST_US
255 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_NS \
256 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_FAST_NS
257
258 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_US \
259 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_FAST_US
260 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_NS \
261 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_FAST_NS
262
263 #else /* !CONFIG_BT_CTLR_RADIO_ENABLE_FAST */
264 #if defined(CONFIG_BT_CTLR_TIFS_HW)
265 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_US \
266 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_DEFAULT_US
267 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_NS \
268 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_DEFAULT_NS
269
270 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_US \
271 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_DEFAULT_US
272 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_NS \
273 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_DEFAULT_NS
274
275 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_US \
276 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_DEFAULT_US
277 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_NS \
278 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_DEFAULT_NS
279
280 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_US \
281 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_DEFAULT_US
282 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_NS \
283 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_DEFAULT_NS
284
285 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_US \
286 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_DEFAULT_US
287 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_NS \
288 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_DEFAULT_NS
289
290 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_US \
291 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_DEFAULT_US
292 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_NS \
293 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_DEFAULT_NS
294
295 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_US \
296 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_DEFAULT_US
297 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_NS \
298 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_DEFAULT_NS
299
300 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_US \
301 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_DEFAULT_US
302 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_NS \
303 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_DEFAULT_NS
304
305 #else /* !CONFIG_BT_CTLR_TIFS_HW */
306 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_US \
307 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_DEFAULT_NO_HW_TIFS_US
308 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_NS \
309 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_DEFAULT_NO_HW_TIFS_NS
310
311 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_US \
312 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_DEFAULT_NO_HW_TIFS_US
313 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_NS \
314 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_DEFAULT_NO_HW_TIFS_NS
315
316 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_US \
317 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_DEFAULT_NO_HW_TIFS_US
318 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_NS \
319 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_DEFAULT_NO_HW_TIFS_NS
320
321 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_US \
322 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_DEFAULT_NO_HW_TIFS_US
323 #define HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_NS \
324 HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_DEFAULT_NO_HW_TIFS_NS
325
326 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_US \
327 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_DEFAULT_NO_HW_TIFS_US
328 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_NS \
329 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_DEFAULT_NO_HW_TIFS_NS
330
331 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_US \
332 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_DEFAULT_NO_HW_TIFS_US
333 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_NS \
334 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_DEFAULT_NO_HW_TIFS_NS
335
336 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_US \
337 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_DEFAULT_NO_HW_TIFS_US
338 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_NS \
339 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_DEFAULT_NO_HW_TIFS_NS
340
341 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_US \
342 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_DEFAULT_NO_HW_TIFS_US
343 #define HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_NS \
344 HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_DEFAULT_NO_HW_TIFS_NS
345 #endif /* !CONFIG_BT_CTLR_TIFS_HW */
346 #endif /* !CONFIG_BT_CTLR_RADIO_ENABLE_FAST */
347
348 /* HAL abstraction of Radio bitfields */
349 #define HAL_NRF_RADIO_EVENT_END NRF_RADIO_EVENT_END
350 #define HAL_RADIO_EVENTS_END EVENTS_END
351 #define HAL_RADIO_INTENSET_DISABLED_Msk RADIO_INTENSET_DISABLED_Msk
352 #define HAL_RADIO_SHORTS_TRX_END_DISABLE_Msk RADIO_SHORTS_END_DISABLE_Msk
353
354 /* HAL abstraction of Radio IRQ number */
355 #define HAL_RADIO_IRQn RADIO_IRQn
356
hal_radio_reset(void)357 static inline void hal_radio_reset(void)
358 {
359 /* TODO: Add any required setup for each radio event
360 */
361 }
362
hal_radio_stop(void)363 static inline void hal_radio_stop(void)
364 {
365 /* TODO: Add any required cleanup of actions taken in hal_radio_reset()
366 */
367 }
368
hal_radio_ram_prio_setup(void)369 static inline void hal_radio_ram_prio_setup(void)
370 {
371 struct {
372 uint32_t volatile reserved_0[0x5a0 >> 2];
373 uint32_t volatile bridge_type;
374 uint32_t volatile reserved_1[((0xe00 - 0x5a0) >> 2) - 1];
375 struct {
376 uint32_t volatile CPU0;
377 uint32_t volatile SPIS1;
378 uint32_t volatile RADIO;
379 uint32_t volatile ECB;
380 uint32_t volatile CCM;
381 uint32_t volatile AAR;
382 uint32_t volatile SAADC;
383 uint32_t volatile UARTE;
384 uint32_t volatile SERIAL0;
385 uint32_t volatile SERIAL2;
386 uint32_t volatile NFCT;
387 uint32_t volatile I2S;
388 uint32_t volatile PDM;
389 uint32_t volatile PWM;
390 } RAMPRI;
391 } volatile *NRF_AMLI = (void volatile *)0x40000000UL;
392
393 NRF_AMLI->RAMPRI.CPU0 = 0xFFFFFFFFUL;
394 NRF_AMLI->RAMPRI.SPIS1 = 0xFFFFFFFFUL;
395 NRF_AMLI->RAMPRI.RADIO = 0x00000000UL;
396 NRF_AMLI->RAMPRI.ECB = 0xFFFFFFFFUL;
397 NRF_AMLI->RAMPRI.CCM = 0x00000000UL;
398 NRF_AMLI->RAMPRI.AAR = 0xFFFFFFFFUL;
399 NRF_AMLI->RAMPRI.SAADC = 0xFFFFFFFFUL;
400 NRF_AMLI->RAMPRI.UARTE = 0xFFFFFFFFUL;
401 NRF_AMLI->RAMPRI.SERIAL0 = 0xFFFFFFFFUL;
402 NRF_AMLI->RAMPRI.SERIAL2 = 0xFFFFFFFFUL;
403 NRF_AMLI->RAMPRI.NFCT = 0xFFFFFFFFUL;
404 NRF_AMLI->RAMPRI.I2S = 0xFFFFFFFFUL;
405 NRF_AMLI->RAMPRI.PDM = 0xFFFFFFFFUL;
406 NRF_AMLI->RAMPRI.PWM = 0xFFFFFFFFUL;
407 }
408
hal_radio_phy_mode_get(uint8_t phy,uint8_t flags)409 static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
410 {
411 uint32_t mode;
412
413 switch (phy) {
414 case BIT(0):
415 default:
416 mode = RADIO_MODE_MODE_Ble_1Mbit;
417
418 #if defined(CONFIG_BT_CTLR_PHY_CODED)
419 /* Workaround: nRF52840 Revision 3 Errata 191 */
420 if (nrf52_errata_191()) {
421 *(volatile uint32_t *)0x40001740 &= ~0x80000000;
422 }
423 #endif /* CONFIG_BT_CTLR_PHY_CODED */
424
425 break;
426
427 case BIT(1):
428 mode = RADIO_MODE_MODE_Ble_2Mbit;
429
430 #if defined(CONFIG_BT_CTLR_PHY_CODED)
431 /* Workaround: nRF52840 Revision 3 Errata 191 */
432 if (nrf52_errata_191()) {
433 *(volatile uint32_t *)0x40001740 &= ~0x80000000;
434 }
435 #endif /* CONFIG_BT_CTLR_PHY_CODED */
436
437 break;
438
439 #if defined(CONFIG_BT_CTLR_PHY_CODED)
440 case BIT(2):
441 if (flags & 0x01) {
442 mode = RADIO_MODE_MODE_Ble_LR125Kbit;
443 } else {
444 mode = RADIO_MODE_MODE_Ble_LR500Kbit;
445 }
446
447 /* Workaround: nRF52840 Revision 3 Errata 191 */
448 if (nrf52_errata_191()) {
449 *(volatile uint32_t *)0x40001740 =
450 ((*(volatile uint32_t *)0x40001740) & 0x7FFF00FF) |
451 0x80000000 | ((uint32_t)(196U) << 8U);
452 }
453 break;
454 #endif /* CONFIG_BT_CTLR_PHY_CODED */
455 }
456
457 return mode;
458 }
459
hal_radio_tx_power_min_get(void)460 static inline uint32_t hal_radio_tx_power_min_get(void)
461 {
462 return RADIO_TXPOWER_TXPOWER_Neg40dBm;
463 }
464
hal_radio_tx_power_max_get(void)465 static inline uint32_t hal_radio_tx_power_max_get(void)
466 {
467 return RADIO_TXPOWER_TXPOWER_Pos8dBm;
468 }
469
hal_radio_tx_power_floor(int8_t tx_power_lvl)470 static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
471 {
472 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos8dBm) {
473 return RADIO_TXPOWER_TXPOWER_Pos8dBm;
474 }
475
476 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos7dBm) {
477 return RADIO_TXPOWER_TXPOWER_Pos7dBm;
478 }
479
480 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos6dBm) {
481 return RADIO_TXPOWER_TXPOWER_Pos6dBm;
482 }
483
484 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos5dBm) {
485 return RADIO_TXPOWER_TXPOWER_Pos5dBm;
486 }
487
488 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
489 return RADIO_TXPOWER_TXPOWER_Pos4dBm;
490 }
491
492 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
493 return RADIO_TXPOWER_TXPOWER_Pos3dBm;
494 }
495
496 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos2dBm) {
497 return RADIO_TXPOWER_TXPOWER_Pos2dBm;
498 }
499
500 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
501 return RADIO_TXPOWER_TXPOWER_0dBm;
502 }
503
504 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
505 return RADIO_TXPOWER_TXPOWER_Neg4dBm;
506 }
507
508 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
509 return RADIO_TXPOWER_TXPOWER_Neg8dBm;
510 }
511
512 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
513 return RADIO_TXPOWER_TXPOWER_Neg12dBm;
514 }
515
516 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
517 return RADIO_TXPOWER_TXPOWER_Neg16dBm;
518 }
519
520 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
521 return RADIO_TXPOWER_TXPOWER_Neg20dBm;
522 }
523
524 /* Note: The -30 dBm power level is deprecated so ignore it! */
525 return RADIO_TXPOWER_TXPOWER_Neg40dBm;
526 }
527
hal_radio_tx_ready_delay_us_get(uint8_t phy,uint8_t flags)528 static inline uint32_t hal_radio_tx_ready_delay_us_get(uint8_t phy, uint8_t flags)
529 {
530 switch (phy) {
531 default:
532 case BIT(0):
533 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_US;
534 case BIT(1):
535 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_US;
536
537 #if defined(CONFIG_BT_CTLR_PHY_CODED)
538 case BIT(2):
539 if (flags & 0x01) {
540 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_US;
541 } else {
542 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_US;
543 }
544 #endif /* CONFIG_BT_CTLR_PHY_CODED */
545 }
546 }
547
hal_radio_rx_ready_delay_us_get(uint8_t phy,uint8_t flags)548 static inline uint32_t hal_radio_rx_ready_delay_us_get(uint8_t phy, uint8_t flags)
549 {
550 switch (phy) {
551 default:
552 case BIT(0):
553 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_US;
554 case BIT(1):
555 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_US;
556
557 #if defined(CONFIG_BT_CTLR_PHY_CODED)
558 case BIT(2):
559 if (flags & 0x01) {
560 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_US;
561 } else {
562 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_US;
563 }
564 #endif /* CONFIG_BT_CTLR_PHY_CODED */
565 }
566 }
567
hal_radio_tx_chain_delay_us_get(uint8_t phy,uint8_t flags)568 static inline uint32_t hal_radio_tx_chain_delay_us_get(uint8_t phy, uint8_t flags)
569 {
570 switch (phy) {
571 default:
572 case BIT(0):
573 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_1M_US;
574 case BIT(1):
575 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_2M_US;
576
577 #if defined(CONFIG_BT_CTLR_PHY_CODED)
578 case BIT(2):
579 if (flags & 0x01) {
580 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_S8_US;
581 } else {
582 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_S2_US;
583 }
584 #endif /* CONFIG_BT_CTLR_PHY_CODED */
585 }
586 }
587
hal_radio_rx_chain_delay_us_get(uint8_t phy,uint8_t flags)588 static inline uint32_t hal_radio_rx_chain_delay_us_get(uint8_t phy, uint8_t flags)
589 {
590 switch (phy) {
591 default:
592 case BIT(0):
593 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_1M_US;
594 case BIT(1):
595 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_2M_US;
596
597 #if defined(CONFIG_BT_CTLR_PHY_CODED)
598 case BIT(2):
599 if (flags & 0x01) {
600 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_S8_US;
601 } else {
602 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_S2_US;
603 }
604 #endif /* CONFIG_BT_CTLR_PHY_CODED */
605 }
606 }
607
hal_radio_tx_ready_delay_ns_get(uint8_t phy,uint8_t flags)608 static inline uint32_t hal_radio_tx_ready_delay_ns_get(uint8_t phy, uint8_t flags)
609 {
610 switch (phy) {
611 default:
612 case BIT(0):
613 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_NS;
614 case BIT(1):
615 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_NS;
616
617 #if defined(CONFIG_BT_CTLR_PHY_CODED)
618 case BIT(2):
619 if (flags & 0x01) {
620 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_NS;
621 } else {
622 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_NS;
623 }
624 #endif /* CONFIG_BT_CTLR_PHY_CODED */
625 }
626 }
627
hal_radio_rx_ready_delay_ns_get(uint8_t phy,uint8_t flags)628 static inline uint32_t hal_radio_rx_ready_delay_ns_get(uint8_t phy, uint8_t flags)
629 {
630 switch (phy) {
631 default:
632 case BIT(0):
633 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_NS;
634 case BIT(1):
635 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_NS;
636
637 #if defined(CONFIG_BT_CTLR_PHY_CODED)
638 case BIT(2):
639 if (flags & 0x01) {
640 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_NS;
641 } else {
642 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_NS;
643 }
644 #endif /* CONFIG_BT_CTLR_PHY_CODED */
645 }
646 }
647
hal_radio_tx_chain_delay_ns_get(uint8_t phy,uint8_t flags)648 static inline uint32_t hal_radio_tx_chain_delay_ns_get(uint8_t phy, uint8_t flags)
649 {
650 switch (phy) {
651 default:
652 case BIT(0):
653 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_1M_NS;
654 case BIT(1):
655 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_2M_NS;
656
657 #if defined(CONFIG_BT_CTLR_PHY_CODED)
658 case BIT(2):
659 if (flags & 0x01) {
660 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_S8_NS;
661 } else {
662 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_S2_NS;
663 }
664 #endif /* CONFIG_BT_CTLR_PHY_CODED */
665 }
666 }
667
hal_radio_rx_chain_delay_ns_get(uint8_t phy,uint8_t flags)668 static inline uint32_t hal_radio_rx_chain_delay_ns_get(uint8_t phy, uint8_t flags)
669 {
670 switch (phy) {
671 default:
672 case BIT(0):
673 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_1M_NS;
674 case BIT(1):
675 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_2M_NS;
676
677 #if defined(CONFIG_BT_CTLR_PHY_CODED)
678 case BIT(2):
679 if (flags & 0x01) {
680 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_S8_NS;
681 } else {
682 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_S2_NS;
683 }
684 #endif /* CONFIG_BT_CTLR_PHY_CODED */
685 }
686 }
687