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