Skip to content

Commit ba1def1

Browse files
cvinayakfabiobaltieri
authored andcommitted
Bluetooth: Controller: Add radio timer ISR usage support
Add radio timer ISR usage support. Signed-off-by: Vinayak Kariappa Chettimada <[email protected]>
1 parent d9f890b commit ba1def1

File tree

4 files changed

+105
-0
lines changed

4 files changed

+105
-0
lines changed

subsys/bluetooth/controller/Kconfig.ll_sw_split

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -902,6 +902,13 @@ config BT_CTLR_RADIO_ENABLE_FAST
902902
help
903903
Enable use of fast radio ramp-up mode.
904904

905+
config BT_CTLR_RADIO_TIMER_ISR
906+
# Hidden, enables use of timer ISR callback
907+
bool
908+
depends on SOC_COMPATIBLE_NRF52X || SOC_COMPATIBLE_NRF53X
909+
help
910+
Enables use of timer ISR callback.
911+
905912
config BT_CTLR_TIFS_HW
906913
bool "H/w Accelerated tIFS Trx switching"
907914
depends on !BT_CTLR_RADIO_ENABLE_FAST && BT_CTLR_TIFS_HW_SUPPORT

subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1153,6 +1153,56 @@ uint32_t radio_bc_has_match(void)
11531153
return (NRF_RADIO->EVENTS_BCMATCH != 0);
11541154
}
11551155

1156+
#if defined(CONFIG_BT_CTLR_RADIO_TIMER_ISR)
1157+
static radio_isr_cb_t isr_radio_tmr_cb;
1158+
static void *isr_radio_tmr_cb_param;
1159+
1160+
void isr_radio_tmr(void)
1161+
{
1162+
irq_disable(TIMER0_IRQn);
1163+
nrf_timer_int_disable(EVENT_TIMER, TIMER_INTENSET_COMPARE2_Msk);
1164+
nrf_timer_event_clear(EVENT_TIMER, HAL_EVENT_TIMER_DEFERRED_TX_EVENT);
1165+
1166+
isr_radio_tmr_cb(isr_radio_tmr_cb_param);
1167+
}
1168+
1169+
uint32_t radio_tmr_isr_set(uint32_t start_us, radio_isr_cb_t cb, void *param)
1170+
{
1171+
irq_disable(TIMER0_IRQn);
1172+
1173+
isr_radio_tmr_cb_param = param;
1174+
isr_radio_tmr_cb = cb;
1175+
1176+
/* start_us could be the current count in the timer */
1177+
uint32_t now_us = start_us;
1178+
1179+
/* Setup timer compare while determining the latency in doing so */
1180+
do {
1181+
/* Set start to be, now plus the determined latency */
1182+
start_us = (now_us << 1) - start_us;
1183+
1184+
/* Setup compare event with min. 1 us offset */
1185+
nrf_timer_event_clear(EVENT_TIMER, HAL_EVENT_TIMER_DEFERRED_TX_EVENT);
1186+
nrf_timer_cc_set(EVENT_TIMER, HAL_EVENT_TIMER_DEFERRED_TRX_CC_OFFSET,
1187+
start_us + 1U);
1188+
1189+
/* Capture the current time */
1190+
nrf_timer_task_trigger(EVENT_TIMER, HAL_EVENT_TIMER_SAMPLE_TASK);
1191+
1192+
now_us = EVENT_TIMER->CC[HAL_EVENT_TIMER_SAMPLE_CC_OFFSET];
1193+
} while ((now_us > start_us) &&
1194+
(EVENT_TIMER->EVENTS_COMPARE[HAL_EVENT_TIMER_DEFERRED_TRX_CC_OFFSET] == 0U));
1195+
1196+
nrf_timer_int_enable(EVENT_TIMER, TIMER_INTENSET_COMPARE2_Msk);
1197+
1198+
NVIC_ClearPendingIRQ(TIMER0_IRQn);
1199+
1200+
irq_enable(TIMER0_IRQn);
1201+
1202+
return start_us + 1U;
1203+
}
1204+
#endif /* CONFIG_BT_CTLR_RADIO_TIMER_ISR */
1205+
11561206
void radio_tmr_status_reset(void)
11571207
{
11581208
#if defined(CONFIG_BT_CTLR_NRF_GRTC)

subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ void radio_bc_configure(uint32_t n);
130130
void radio_bc_status_reset(void);
131131
uint32_t radio_bc_has_match(void);
132132

133+
void isr_radio_tmr(void);
134+
uint32_t radio_tmr_isr_set(uint32_t start_us, radio_isr_cb_t cb, void *param);
135+
133136
void radio_tmr_status_reset(void);
134137
void radio_tmr_tx_status_reset(void);
135138
void radio_tmr_rx_status_reset(void);

subsys/bluetooth/controller/ll_sw/nordic/lll/lll.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,33 @@ ISR_DIRECT_DECLARE(radio_nrf5_isr)
115115
#endif /* !CONFIG_DYNAMIC_DIRECT_INTERRUPTS */
116116
}
117117

118+
#if defined(CONFIG_BT_CTLR_RADIO_TIMER_ISR)
119+
#if defined(CONFIG_BT_CTLR_DYNAMIC_INTERRUPTS) && \
120+
defined(CONFIG_DYNAMIC_DIRECT_INTERRUPTS)
121+
static void timer_nrf5_isr(const void *arg)
122+
#else /* !CONFIG_BT_CTLR_DYNAMIC_INTERRUPTS */
123+
ISR_DIRECT_DECLARE(timer_nrf5_isr)
124+
#endif /* !CONFIG_BT_CTLR_DYNAMIC_INTERRUPTS */
125+
{
126+
DEBUG_RADIO_ISR(1);
127+
128+
lll_prof_enter_radio();
129+
130+
isr_radio_tmr();
131+
132+
ISR_DIRECT_PM();
133+
134+
lll_prof_exit_radio();
135+
136+
DEBUG_RADIO_ISR(0);
137+
138+
#if !defined(CONFIG_BT_CTLR_DYNAMIC_INTERRUPTS) || \
139+
!defined(CONFIG_DYNAMIC_DIRECT_INTERRUPTS)
140+
return 1;
141+
#endif /* !CONFIG_DYNAMIC_DIRECT_INTERRUPTS */
142+
}
143+
#endif /* CONFIG_BT_CTLR_RADIO_TIMER_ISR */
144+
118145
static void rtc0_nrf5_isr(const void *arg)
119146
{
120147
DEBUG_TICKER_ISR(1);
@@ -221,9 +248,19 @@ int lll_init(void)
221248
IRQ_CONNECT_FLAGS, no_reschedule);
222249
irq_connect_dynamic(HAL_RADIO_IRQn, CONFIG_BT_CTLR_LLL_PRIO,
223250
radio_nrf5_isr, NULL, IRQ_CONNECT_FLAGS);
251+
#if defined(CONFIG_BT_CTLR_RADIO_TIMER_ISR)
252+
ARM_IRQ_DIRECT_DYNAMIC_CONNECT(TIMER0_IRQn, CONFIG_BT_CTLR_LLL_PRIO,
253+
IRQ_CONNECT_FLAGS, no_reschedule);
254+
irq_connect_dynamic(TIMER0_IRQn, CONFIG_BT_CTLR_LLL_PRIO,
255+
timer_nrf5_isr, NULL, IRQ_CONNECT_FLAGS);
256+
#endif /* CONFIG_BT_CTLR_RADIO_TIMER_ISR */
224257
#else /* !CONFIG_DYNAMIC_DIRECT_INTERRUPTS */
225258
IRQ_DIRECT_CONNECT(HAL_RADIO_IRQn, CONFIG_BT_CTLR_LLL_PRIO,
226259
radio_nrf5_isr, IRQ_CONNECT_FLAGS);
260+
#if defined(CONFIG_BT_CTLR_RADIO_TIMER_ISR)
261+
IRQ_DIRECT_CONNECT(TIMER0_IRQn, CONFIG_BT_CTLR_LLL_PRIO,
262+
timer_nrf5_isr, IRQ_CONNECT_FLAGS);
263+
#endif /* CONFIG_BT_CTLR_RADIO_TIMER_ISR */
227264
#endif /* !CONFIG_DYNAMIC_DIRECT_INTERRUPTS */
228265
irq_connect_dynamic(HAL_RTC_IRQn, CONFIG_BT_CTLR_ULL_HIGH_PRIO,
229266
rtc0_nrf5_isr, NULL, 0U);
@@ -238,6 +275,10 @@ int lll_init(void)
238275
#else /* !CONFIG_BT_CTLR_DYNAMIC_INTERRUPTS */
239276
IRQ_DIRECT_CONNECT(HAL_RADIO_IRQn, CONFIG_BT_CTLR_LLL_PRIO,
240277
radio_nrf5_isr, IRQ_CONNECT_FLAGS);
278+
#if defined(CONFIG_BT_CTLR_RADIO_TIMER_ISR)
279+
IRQ_DIRECT_CONNECT(TIMER0_IRQn, CONFIG_BT_CTLR_LLL_PRIO,
280+
timer_nrf5_isr, IRQ_CONNECT_FLAGS);
281+
#endif /* CONFIG_BT_CTLR_RADIO_TIMER_ISR */
241282
IRQ_CONNECT(HAL_RTC_IRQn, CONFIG_BT_CTLR_ULL_HIGH_PRIO,
242283
rtc0_nrf5_isr, NULL, 0);
243284
#if defined(CONFIG_BT_CTLR_ZLI)
@@ -298,6 +339,10 @@ int lll_deinit(void)
298339
#if defined(CONFIG_DYNAMIC_DIRECT_INTERRUPTS)
299340
irq_disconnect_dynamic(HAL_RADIO_IRQn, CONFIG_BT_CTLR_LLL_PRIO,
300341
radio_nrf5_isr, NULL, IRQ_CONNECT_FLAGS);
342+
#if defined(CONFIG_BT_CTLR_RADIO_TIMER_ISR)
343+
irq_disconnect_dynamic(TIMER0_IRQn, CONFIG_BT_CTLR_LLL_PRIO,
344+
timer_nrf5_isr, NULL, IRQ_CONNECT_FLAGS);
345+
#endif /* CONFIG_BT_CTLR_RADIO_TIMER_ISR */
301346
#endif /* CONFIG_DYNAMIC_DIRECT_INTERRUPTS */
302347
irq_disconnect_dynamic(HAL_RTC_IRQn, CONFIG_BT_CTLR_ULL_HIGH_PRIO,
303348
rtc0_nrf5_isr, NULL, 0U);

0 commit comments

Comments
 (0)