1 /*
2  * Copyright (c) 2023 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /* Use the timer instance ID, not NRF_TIMERx directly, so that it can be checked
8  * in radio_nrf5_ppi.h by the preprocessor.
9  */
10 #if defined(CONFIG_BT_CTLR_TIFS_HW)
11 #define EVENT_TIMER_ID 0
12 #define EVENT_TIMER    _CONCAT(NRF_TIMER, EVENT_TIMER_ID)
13 
14 /* Single timer feature not supported when using h/w tIFS switching */
15 #define HAL_RADIO_ISR_LATENCY_MAX_US 0U
16 
17 /* Wrapper for EVENTS_END event generated by Radio peripheral at the very end of the transmission
18  * or reception of a PDU on air. In case of regular PDU it is generated when last bit of CRC is
19  * received or transmitted.
20  */
21 #define HAL_RADIO_TRX_EVENTS_END    HAL_RADIO_EVENTS_END
22 #define HAL_NRF_RADIO_TRX_EVENT_END HAL_NRF_RADIO_EVENT_END
23 
24 /* Wrapper for RADIO_SHORTS mask connecting EVENTS_END to EVENTS_DISABLE.
25  * This is a default shortcut used to automatically disable Radio after end of PDU.
26  */
27 #define NRF_RADIO_SHORTS_TRX_END_DISABLE_Msk HAL_RADIO_SHORTS_TRX_END_DISABLE_Msk
28 
29 #define HAL_EVENT_TIMER_TRX_CC_OFFSET          0
30 #define HAL_EVENT_TIMER_TRX_EVENT              NRF_TIMER_EVENT_COMPARE0
31 #define HAL_EVENT_TIMER_READY_TASK             NRF_TIMER_TASK_CAPTURE0
32 
33 #define HAL_EVENT_TIMER_HCTO_CC_OFFSET         1
34 #define HAL_EVENT_TIMER_HCTO_EVENT             NRF_TIMER_EVENT_COMPARE1
35 #define HAL_EVENT_TIMER_ADDRESS_TASK           NRF_TIMER_TASK_CAPTURE1
36 
37 #define HAL_EVENT_TIMER_TRX_END_CC_OFFSET      2
38 #define HAL_EVENT_TIMER_TRX_END_TASK           NRF_TIMER_TASK_CAPTURE2
39 
40 #define HAL_EVENT_TIMER_DEFERRED_TRX_CC_OFFSET 2
41 #define HAL_EVENT_TIMER_DEFERRED_TX_EVENT      NRF_TIMER_EVENT_COMPARE2
42 
43 #define HAL_EVENT_TIMER_SAMPLE_CC_OFFSET       3
44 #define HAL_EVENT_TIMER_SAMPLE_TASK            NRF_TIMER_TASK_CAPTURE3
45 
46 #define HAL_EVENT_TIMER_PA_LNA_CC_OFFSET       2
47 #define HAL_EVENT_TIMER_PA_LNA_PDN_CC_OFFSET   3
48 
49 #else /* !CONFIG_BT_CTLR_TIFS_HW */
50 #if defined(CONFIG_BT_CTLR_SW_SWITCH_SINGLE_TIMER)
51 #define EVENT_TIMER_ID 4
52 #define EVENT_TIMER    _CONCAT(NRF_TIMER, EVENT_TIMER_ID)
53 
54 #define SW_SWITCH_TIMER EVENT_TIMER
55 
56 /* Radio ISR Latency to be considered with single timer used so that the PPI/
57  * DPPI is disabled in time when the timer is cleared on radio end, so that
58  * the timer compare should not trigger TXEN/RXEN immediately on radio end.
59  * This value will be used as minimum turnaround time in setting up Rx to Tx
60  * using radio_tmr_start_us under single timer use.
61  * The value of 80 us is used considering 150 us TIFS minus the maximum rx
62  * chain delay ~30 us, and minus the radio ramp up delay ~40 us.
63  */
64 #define HAL_RADIO_ISR_LATENCY_MAX_US 80U
65 
66 #define SW_SWITCH_TIMER_EVTS_COMP_BASE 4
67 
68 #if defined(CONFIG_BT_CTLR_PHY_CODED)
69 #define SW_SWITCH_TIMER_EVTS_COMP_S2_BASE 6
70 #endif /* !CONFIG_BT_CTLR_PHY_CODED */
71 
72 #if defined(CONFIG_BT_CTLR_DF)
73 #if defined(CONFIG_BT_CTLR_DF_PHYEND_OFFSET_COMPENSATION_ENABLE)
74 /* Allocate 2 adjacent channels for PHYEND delay compensation. Use the same channels as for
75  * PHY CODED S2. The CTEINLINE may not be enabled for PHY CODED so PHYEND event is generated
76  * at the same instant as END event. Hence the channels are used interchangeably.
77  * That saves from use of another timer.
78  */
79 #define SW_SWITCH_TIMER_EVTS_COMP_PHYEND_DELAY_COMPENSATION_BASE 6
80 #endif /* CONFIG_BT_CTLR_DF_PHYEND_OFFSET_COMPENSATION_ENABLE */
81 
82 /* Wrapper for EVENTS_END event generated by Radio peripheral at the very end of the transmission
83  * or reception of a PDU on air. In case of regular PDU it is generated when last bit of CRC is
84  * received or transmitted.
85  *
86  * When direction finding is enabled a PDU may include Constant Tone Extension at its end. For PDU
87  * including CTE EVENTS_PHYEND event is generated at very end of a PDU. In case there is no CTE in
88  * a PDU the EVENTS_PHYEND event is generated in the same instant as EVENTS_END event.
89  */
90 #define HAL_RADIO_TRX_EVENTS_END    HAL_RADIO_EVENTS_PHYEND
91 #define HAL_NRF_RADIO_TRX_EVENT_END HAL_NRF_RADIO_EVENT_PHYEND
92 
93 /* Wrapper for RADIO_SHORTS mask connecting EVENTS_PHYEND to EVENTS_DISABLE.
94  * This is a mask for SOC that has Direction Finding Extension in a Radio peripheral.
95  * It enables shortcut for EVENTS_PHYEND event generated at very end to Radio EVENTS_DISABLE event.
96  * In case there is a CTE in a PDU then EVENTS_PHYEND event is generated after the CTE.
97  * If there is no CTE, it is generated in the same instant as EVENTS_END.
98  */
99 #define NRF_RADIO_SHORTS_TRX_END_DISABLE_Msk HAL_RADIO_SHORTS_TRX_PHYEND_DISABLE_Msk
100 
101 /* Delay of EVENTS_PHYEND event on receive PDU without CTE included when CTEINLINE is enabled */
102 #define RADIO_EVENTS_PHYEND_DELAY_US 16
103 
104 #if defined(CONFIG_BT_CTLR_DF_CONN_CTE_RX)
105 /* Delay of CCM TASKS_CRYPT start in number of bits for Radio Bit counter */
106 #define CCM_TASKS_CRYPT_DELAY_BITS 3
107 #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_RX */
108 
109 #else /* !CONFIG_BT_CTLR_DF */
110 /* Wrapper for EVENTS_END event generated by Radio peripheral at the very end of the transmission
111  * or reception of a PDU on air. In case of regular PDU it is generated when last bit of CRC is
112  * received or transmitted.
113  */
114 #define HAL_RADIO_TRX_EVENTS_END    HAL_RADIO_EVENTS_END
115 #define HAL_NRF_RADIO_TRX_EVENT_END HAL_NRF_RADIO_EVENT_END
116 
117 /* Wrapper for RADIO_SHORTS mask connecting EVENTS_END to EVENTS_DISABLE.
118  * This is a default shortcut used to automatically disable Radio after end of PDU.
119  */
120 #define NRF_RADIO_SHORTS_TRX_END_DISABLE_Msk HAL_RADIO_SHORTS_TRX_END_DISABLE_Msk
121 #endif /* !CONFIG_BT_CTLR_DF */
122 
123 #define HAL_EVENT_TIMER_TRX_CC_OFFSET          0
124 #define HAL_EVENT_TIMER_TRX_EVENT              NRF_TIMER_EVENT_COMPARE0
125 #define HAL_EVENT_TIMER_READY_TASK             NRF_TIMER_TASK_CAPTURE0
126 
127 #define HAL_EVENT_TIMER_HCTO_CC_OFFSET         1
128 #define HAL_EVENT_TIMER_HCTO_EVENT             NRF_TIMER_EVENT_COMPARE1
129 #define HAL_EVENT_TIMER_ADDRESS_TASK           NRF_TIMER_TASK_CAPTURE1
130 
131 #define HAL_EVENT_TIMER_TRX_END_CC_OFFSET      2
132 #define HAL_EVENT_TIMER_TRX_END_TASK           NRF_TIMER_TASK_CAPTURE2
133 
134 #define HAL_EVENT_TIMER_DEFERRED_TRX_CC_OFFSET 2
135 #define HAL_EVENT_TIMER_DEFERRED_TX_EVENT      NRF_TIMER_EVENT_COMPARE2
136 
137 #define HAL_EVENT_TIMER_SAMPLE_CC_OFFSET       3
138 #define HAL_EVENT_TIMER_SAMPLE_TASK            NRF_TIMER_TASK_CAPTURE3
139 
140 #define HAL_EVENT_TIMER_PA_LNA_CC_OFFSET       2
141 #define HAL_EVENT_TIMER_PA_LNA_PDN_CC_OFFSET   3
142 
143 #else /* !CONFIG_BT_CTLR_SW_SWITCH_SINGLE_TIMER */
144 #define EVENT_TIMER_ID 0
145 #define EVENT_TIMER    _CONCAT(NRF_TIMER, EVENT_TIMER_ID)
146 
147 #define SW_SWITCH_TIMER NRF_TIMER1
148 
149 /* When using dedicated timer used for tIFS switching, compensation to avoid
150  * spurious TXEN/RXEN due to timer being clear is not needed.
151  */
152 #define HAL_RADIO_ISR_LATENCY_MAX_US 0U
153 
154 #define SW_SWITCH_TIMER_EVTS_COMP_BASE 0
155 
156 #if defined(CONFIG_BT_CTLR_PHY_CODED)
157 #define SW_SWITCH_TIMER_EVTS_COMP_S2_BASE 2
158 #endif /* !CONFIG_BT_CTLR_PHY_CODED */
159 
160 #if defined(CONFIG_BT_CTLR_DF)
161 #if defined(CONFIG_BT_CTLR_DF_PHYEND_OFFSET_COMPENSATION_ENABLE)
162 /* Allocate 2 adjacent channels for PHYEND delay compensation. Use the same channels as for
163  * PHY CODED S2. The CTEINLINE may not be enabled for PHY CODED so PHYEND event is generated
164  * at the same instant as END event. Hence the channels are used interchangeably.
165  * That saves from use of another timer.
166  */
167 #define SW_SWITCH_TIMER_EVTS_COMP_PHYEND_DELAY_COMPENSATION_BASE 2
168 #endif /* CONFIG_BT_CTLR_DF_PHYEND_OFFSET_COMPENSATION_ENABLE */
169 
170 /* Wrapper for EVENTS_END event generated by Radio peripheral at the very end of the transmission
171  * or reception of a PDU on air. In case of regular PDU it is generated when last bit of CRC is
172  * received or transmitted.
173  *
174  * When direction finding is enabled a PDU may include Constant Tone Extension at its end. For PDU
175  * including CTE EVENTS_PHYEND event is generated at very end of a PDU. In case there is no CTE in
176  * a PDU the EVENTS_PHYEND event is generated in the same instant as EVENTS_END event.
177  */
178 #define HAL_RADIO_TRX_EVENTS_END    HAL_RADIO_EVENTS_PHYEND
179 #define HAL_NRF_RADIO_TRX_EVENT_END HAL_NRF_RADIO_EVENT_PHYEND
180 
181 /* Wrapper for RADIO_SHORTS mask connecting EVENTS_PHYEND to EVENTS_DISABLE.
182  * This is a mask for SOC that has Direction Finding Extension in a Radio peripheral.
183  * It enables shortcut for EVENTS_PHYEND event generated at very end to Radio EVENTS_DISABLE event.
184  * In case there is a CTE in a PDU then EVENTS_PHYEND event is generated after the CTE.
185  * If there is no CTE, it is generated in the same instant as EVENTS_END.
186  */
187 #define NRF_RADIO_SHORTS_TRX_END_DISABLE_Msk HAL_RADIO_SHORTS_TRX_PHYEND_DISABLE_Msk
188 
189 /* Delay of EVENTS_PHYEND event on receive PDU without CTE included when CTEINLINE is enabled */
190 #define RADIO_EVENTS_PHYEND_DELAY_US 16
191 
192 #if defined(CONFIG_BT_CTLR_DF_CONN_CTE_RX)
193 /* Delay of CCM TASKS_CRYPT start in number of bits for Radio Bit counter */
194 #define CCM_TASKS_CRYPT_DELAY_BITS 3
195 #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_RX */
196 
197 #else /* !CONFIG_BT_CTLR_DF */
198 /* Wrapper for EVENTS_END event generated by Radio peripheral at the very end of the transmission
199  * or reception of a PDU on air. In case of regular PDU it is generated when last bit of CRC is
200  * received or transmitted.
201  */
202 #define HAL_RADIO_TRX_EVENTS_END    HAL_RADIO_EVENTS_END
203 #define HAL_NRF_RADIO_TRX_EVENT_END HAL_NRF_RADIO_EVENT_END
204 
205 /* Wrapper for RADIO_SHORTS mask connecting EVENTS_END to EVENTS_DISABLE.
206  * This is a default shortcut used to automatically disable Radio after end of PDU.
207  */
208 #define NRF_RADIO_SHORTS_TRX_END_DISABLE_Msk HAL_RADIO_SHORTS_TRX_END_DISABLE_Msk
209 #endif /* !CONFIG_BT_CTLR_DF */
210 
211 #define HAL_EVENT_TIMER_TRX_CC_OFFSET          0
212 #define HAL_EVENT_TIMER_TRX_EVENT              NRF_TIMER_EVENT_COMPARE0
213 #define HAL_EVENT_TIMER_READY_TASK             NRF_TIMER_TASK_CAPTURE0
214 
215 #define HAL_EVENT_TIMER_HCTO_CC_OFFSET         1
216 #define HAL_EVENT_TIMER_HCTO_EVENT             NRF_TIMER_EVENT_COMPARE1
217 #define HAL_EVENT_TIMER_ADDRESS_TASK           NRF_TIMER_TASK_CAPTURE1
218 
219 #define HAL_EVENT_TIMER_TRX_END_CC_OFFSET      2
220 #define HAL_EVENT_TIMER_TRX_END_TASK           NRF_TIMER_TASK_CAPTURE2
221 
222 #define HAL_EVENT_TIMER_DEFERRED_TRX_CC_OFFSET 2
223 #define HAL_EVENT_TIMER_DEFERRED_TX_EVENT      NRF_TIMER_EVENT_COMPARE2
224 
225 #define HAL_EVENT_TIMER_SAMPLE_CC_OFFSET       3
226 #define HAL_EVENT_TIMER_SAMPLE_TASK            NRF_TIMER_TASK_CAPTURE3
227 
228 #define HAL_EVENT_TIMER_PA_LNA_CC_OFFSET       2
229 #define HAL_EVENT_TIMER_PA_LNA_PDN_CC_OFFSET   3
230 #endif /* !CONFIG_BT_CTLR_SW_SWITCH_SINGLE_TIMER */
231 #endif /* !CONFIG_BT_CTLR_TIFS_HW */
232