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_RADIO_INTENSET_DISABLED_Msk RADIO_INTENSET_DISABLED_Msk
350 #define HAL_RADIO_SHORTS_TRX_END_DISABLE_Msk RADIO_SHORTS_END_DISABLE_Msk
351 #define HAL_RADIO_SHORTS_TRX_PHYEND_DISABLE_Msk RADIO_SHORTS_PHYEND_DISABLE_Msk
352
353 /* HAL abstraction of Radio IRQ number */
354 #define HAL_RADIO_IRQn RADIO_IRQn
355
hal_radio_reset(void)356 static inline void hal_radio_reset(void)
357 {
358 /* TODO: Add any required setup for each radio event
359 */
360 }
361
hal_radio_stop(void)362 static inline void hal_radio_stop(void)
363 {
364 /* TODO: Add any required cleanup of actions taken in hal_radio_reset()
365 */
366 }
367
hal_radio_ram_prio_setup(void)368 static inline void hal_radio_ram_prio_setup(void)
369 {
370 struct {
371 uint32_t volatile reserved_0[0x5a0 >> 2];
372 uint32_t volatile bridge_type;
373 uint32_t volatile reserved_1[((0xe00 - 0x5a0) >> 2) - 1];
374 struct {
375 uint32_t volatile CPU0;
376 uint32_t volatile SPIS1;
377 uint32_t volatile RADIO;
378 uint32_t volatile ECB;
379 uint32_t volatile CCM;
380 uint32_t volatile AAR;
381 uint32_t volatile SAADC;
382 uint32_t volatile UARTE;
383 uint32_t volatile SERIAL0;
384 uint32_t volatile SERIAL2;
385 uint32_t volatile NFCT;
386 uint32_t volatile I2S;
387 uint32_t volatile PDM;
388 uint32_t volatile PWM;
389 } RAMPRI;
390 } volatile *NRF_AMLI = (void volatile *)0x40000000UL;
391
392 NRF_AMLI->RAMPRI.CPU0 = 0xFFFFFFFFUL;
393 NRF_AMLI->RAMPRI.SPIS1 = 0xFFFFFFFFUL;
394 NRF_AMLI->RAMPRI.RADIO = 0x00000000UL;
395 NRF_AMLI->RAMPRI.ECB = 0xFFFFFFFFUL;
396 NRF_AMLI->RAMPRI.CCM = 0x00000000UL;
397 NRF_AMLI->RAMPRI.AAR = 0xFFFFFFFFUL;
398 NRF_AMLI->RAMPRI.SAADC = 0xFFFFFFFFUL;
399 NRF_AMLI->RAMPRI.UARTE = 0xFFFFFFFFUL;
400 NRF_AMLI->RAMPRI.SERIAL0 = 0xFFFFFFFFUL;
401 NRF_AMLI->RAMPRI.SERIAL2 = 0xFFFFFFFFUL;
402 NRF_AMLI->RAMPRI.NFCT = 0xFFFFFFFFUL;
403 NRF_AMLI->RAMPRI.I2S = 0xFFFFFFFFUL;
404 NRF_AMLI->RAMPRI.PDM = 0xFFFFFFFFUL;
405 NRF_AMLI->RAMPRI.PWM = 0xFFFFFFFFUL;
406 }
407
hal_radio_phy_mode_get(uint8_t phy,uint8_t flags)408 static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
409 {
410 uint32_t mode;
411
412 switch (phy) {
413 case BIT(0):
414 default:
415 mode = RADIO_MODE_MODE_Ble_1Mbit;
416
417 #if defined(CONFIG_BT_CTLR_PHY_CODED)
418 /* Workaround: nRF52840 Revision 3 Errata 191 */
419 if (nrf52_errata_191()) {
420 *(volatile uint32_t *)0x40001740 &= ~0x80000000;
421 }
422 #endif /* CONFIG_BT_CTLR_PHY_CODED */
423
424 break;
425
426 case BIT(1):
427 mode = RADIO_MODE_MODE_Ble_2Mbit;
428
429 #if defined(CONFIG_BT_CTLR_PHY_CODED)
430 /* Workaround: nRF52840 Revision 3 Errata 191 */
431 if (nrf52_errata_191()) {
432 *(volatile uint32_t *)0x40001740 &= ~0x80000000;
433 }
434 #endif /* CONFIG_BT_CTLR_PHY_CODED */
435
436 break;
437
438 #if defined(CONFIG_BT_CTLR_PHY_CODED)
439 case BIT(2):
440 if (flags & 0x01) {
441 mode = RADIO_MODE_MODE_Ble_LR125Kbit;
442 } else {
443 mode = RADIO_MODE_MODE_Ble_LR500Kbit;
444 }
445
446 /* Workaround: nRF52840 Revision 3 Errata 191 */
447 if (nrf52_errata_191()) {
448 *(volatile uint32_t *)0x40001740 =
449 ((*(volatile uint32_t *)0x40001740) & 0x7FFF00FF) |
450 0x80000000 | ((uint32_t)(196U) << 8U);
451 }
452 break;
453 #endif /* CONFIG_BT_CTLR_PHY_CODED */
454 }
455
456 return mode;
457 }
458
hal_radio_tx_power_min_get(void)459 static inline uint32_t hal_radio_tx_power_min_get(void)
460 {
461 return RADIO_TXPOWER_TXPOWER_Neg40dBm;
462 }
463
hal_radio_tx_power_max_get(void)464 static inline uint32_t hal_radio_tx_power_max_get(void)
465 {
466 return RADIO_TXPOWER_TXPOWER_Pos8dBm;
467 }
468
hal_radio_tx_power_floor(int8_t tx_power_lvl)469 static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
470 {
471 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos8dBm) {
472 return RADIO_TXPOWER_TXPOWER_Pos8dBm;
473 }
474
475 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos7dBm) {
476 return RADIO_TXPOWER_TXPOWER_Pos7dBm;
477 }
478
479 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos6dBm) {
480 return RADIO_TXPOWER_TXPOWER_Pos6dBm;
481 }
482
483 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos5dBm) {
484 return RADIO_TXPOWER_TXPOWER_Pos5dBm;
485 }
486
487 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
488 return RADIO_TXPOWER_TXPOWER_Pos4dBm;
489 }
490
491 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
492 return RADIO_TXPOWER_TXPOWER_Pos3dBm;
493 }
494
495 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos2dBm) {
496 return RADIO_TXPOWER_TXPOWER_Pos2dBm;
497 }
498
499 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
500 return RADIO_TXPOWER_TXPOWER_0dBm;
501 }
502
503 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
504 return RADIO_TXPOWER_TXPOWER_Neg4dBm;
505 }
506
507 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
508 return RADIO_TXPOWER_TXPOWER_Neg8dBm;
509 }
510
511 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
512 return RADIO_TXPOWER_TXPOWER_Neg12dBm;
513 }
514
515 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
516 return RADIO_TXPOWER_TXPOWER_Neg16dBm;
517 }
518
519 if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
520 return RADIO_TXPOWER_TXPOWER_Neg20dBm;
521 }
522
523 /* Note: The -30 dBm power level is deprecated so ignore it! */
524 return RADIO_TXPOWER_TXPOWER_Neg40dBm;
525 }
526
hal_radio_tx_ready_delay_us_get(uint8_t phy,uint8_t flags)527 static inline uint32_t hal_radio_tx_ready_delay_us_get(uint8_t phy, uint8_t flags)
528 {
529 switch (phy) {
530 default:
531 case BIT(0):
532 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_US;
533 case BIT(1):
534 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_US;
535
536 #if defined(CONFIG_BT_CTLR_PHY_CODED)
537 case BIT(2):
538 if (flags & 0x01) {
539 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_US;
540 } else {
541 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_US;
542 }
543 #endif /* CONFIG_BT_CTLR_PHY_CODED */
544 }
545 }
546
hal_radio_rx_ready_delay_us_get(uint8_t phy,uint8_t flags)547 static inline uint32_t hal_radio_rx_ready_delay_us_get(uint8_t phy, uint8_t flags)
548 {
549 switch (phy) {
550 default:
551 case BIT(0):
552 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_US;
553 case BIT(1):
554 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_US;
555
556 #if defined(CONFIG_BT_CTLR_PHY_CODED)
557 case BIT(2):
558 if (flags & 0x01) {
559 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_US;
560 } else {
561 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_US;
562 }
563 #endif /* CONFIG_BT_CTLR_PHY_CODED */
564 }
565 }
566
hal_radio_tx_chain_delay_us_get(uint8_t phy,uint8_t flags)567 static inline uint32_t hal_radio_tx_chain_delay_us_get(uint8_t phy, uint8_t flags)
568 {
569 switch (phy) {
570 default:
571 case BIT(0):
572 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_1M_US;
573 case BIT(1):
574 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_2M_US;
575
576 #if defined(CONFIG_BT_CTLR_PHY_CODED)
577 case BIT(2):
578 if (flags & 0x01) {
579 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_S8_US;
580 } else {
581 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_S2_US;
582 }
583 #endif /* CONFIG_BT_CTLR_PHY_CODED */
584 }
585 }
586
hal_radio_rx_chain_delay_us_get(uint8_t phy,uint8_t flags)587 static inline uint32_t hal_radio_rx_chain_delay_us_get(uint8_t phy, uint8_t flags)
588 {
589 switch (phy) {
590 default:
591 case BIT(0):
592 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_1M_US;
593 case BIT(1):
594 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_2M_US;
595
596 #if defined(CONFIG_BT_CTLR_PHY_CODED)
597 case BIT(2):
598 if (flags & 0x01) {
599 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_S8_US;
600 } else {
601 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_S2_US;
602 }
603 #endif /* CONFIG_BT_CTLR_PHY_CODED */
604 }
605 }
606
hal_radio_tx_ready_delay_ns_get(uint8_t phy,uint8_t flags)607 static inline uint32_t hal_radio_tx_ready_delay_ns_get(uint8_t phy, uint8_t flags)
608 {
609 switch (phy) {
610 default:
611 case BIT(0):
612 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_1M_NS;
613 case BIT(1):
614 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_2M_NS;
615
616 #if defined(CONFIG_BT_CTLR_PHY_CODED)
617 case BIT(2):
618 if (flags & 0x01) {
619 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S8_NS;
620 } else {
621 return HAL_RADIO_NRF52840_TXEN_TXIDLE_TX_S2_NS;
622 }
623 #endif /* CONFIG_BT_CTLR_PHY_CODED */
624 }
625 }
626
hal_radio_rx_ready_delay_ns_get(uint8_t phy,uint8_t flags)627 static inline uint32_t hal_radio_rx_ready_delay_ns_get(uint8_t phy, uint8_t flags)
628 {
629 switch (phy) {
630 default:
631 case BIT(0):
632 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_1M_NS;
633 case BIT(1):
634 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_2M_NS;
635
636 #if defined(CONFIG_BT_CTLR_PHY_CODED)
637 case BIT(2):
638 if (flags & 0x01) {
639 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S8_NS;
640 } else {
641 return HAL_RADIO_NRF52840_RXEN_RXIDLE_RX_S2_NS;
642 }
643 #endif /* CONFIG_BT_CTLR_PHY_CODED */
644 }
645 }
646
hal_radio_tx_chain_delay_ns_get(uint8_t phy,uint8_t flags)647 static inline uint32_t hal_radio_tx_chain_delay_ns_get(uint8_t phy, uint8_t flags)
648 {
649 switch (phy) {
650 default:
651 case BIT(0):
652 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_1M_NS;
653 case BIT(1):
654 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_2M_NS;
655
656 #if defined(CONFIG_BT_CTLR_PHY_CODED)
657 case BIT(2):
658 if (flags & 0x01) {
659 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_S8_NS;
660 } else {
661 return HAL_RADIO_NRF52840_TX_CHAIN_DELAY_S2_NS;
662 }
663 #endif /* CONFIG_BT_CTLR_PHY_CODED */
664 }
665 }
666
hal_radio_rx_chain_delay_ns_get(uint8_t phy,uint8_t flags)667 static inline uint32_t hal_radio_rx_chain_delay_ns_get(uint8_t phy, uint8_t flags)
668 {
669 switch (phy) {
670 default:
671 case BIT(0):
672 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_1M_NS;
673 case BIT(1):
674 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_2M_NS;
675
676 #if defined(CONFIG_BT_CTLR_PHY_CODED)
677 case BIT(2):
678 if (flags & 0x01) {
679 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_S8_NS;
680 } else {
681 return HAL_RADIO_NRF52840_RX_CHAIN_DELAY_S2_NS;
682 }
683 #endif /* CONFIG_BT_CTLR_PHY_CODED */
684 }
685 }
686