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