From 153cf6373c1c907f20ef771d4564c1d1060c1e19 Mon Sep 17 00:00:00 2001 From: Jakub Zymelka Date: Wed, 6 Sep 2023 11:28:05 +0200 Subject: [PATCH] bluetooth: align controller to new gpiote driver Align to multi-instance driver introduced in nrfx 3.2.0 Signed-off-by: Jakub Zymelka --- .../ll_sw/nordic/hal/nrf5/radio/radio.c | 42 +++++++++++++--- .../nordic/hal/nrf5/radio/radio_nrf5_dppi.h | 50 ++++++++++++------- 2 files changed, 67 insertions(+), 25 deletions(-) diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c index 90d756504398f57..069e9fa34b959b3 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "util/mem.h" @@ -55,6 +56,10 @@ GPIOTE_CONFIG_OUTINIT_High : \ GPIOTE_CONFIG_OUTINIT_Low) +#define GPIO_NODE(node, pin, idx) DT_GPIO_CTLR_BY_IDX(node, pin, idx) +#define GPIOTE_PHANDLE(node, pin, idx) DT_PHANDLE(GPIO_NODE(node, pin, idx), gpiote_instance) +#define GPIOTE_IDX(node, pin, idx) DT_PROP(GPIOTE_PHANDLE(node, pin, idx), instance) + #if defined(FEM_NODE) BUILD_ASSERT(!HAL_RADIO_GPIO_PA_OFFSET_MISSING, "fem node " DT_NODE_PATH(FEM_NODE) " has property " @@ -1547,7 +1552,10 @@ uint32_t radio_tmr_sample_get(void) #if defined(HAL_RADIO_GPIO_HAVE_PA_PIN) void radio_gpio_pa_setup(void) { - NRF_GPIOTE->CONFIG[HAL_PALNA_GPIOTE_CHAN] = + nrfx_gpiote_t gpiote = + NRFX_GPIOTE_INSTANCE(GPIOTE_IDX(FEM_NODE, HAL_RADIO_GPIO_PA_PROP, 0)); + + gpiote.p_reg->CONFIG[HAL_PALNA_GPIOTE_CHAN] = (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) | (NRF_GPIO_PA_PSEL << @@ -1568,7 +1576,10 @@ void radio_gpio_pa_setup(void) #if defined(HAL_RADIO_GPIO_HAVE_LNA_PIN) void radio_gpio_lna_setup(void) { - NRF_GPIOTE->CONFIG[HAL_PALNA_GPIOTE_CHAN] = + nrfx_gpiote_t gpiote = + NRFX_GPIOTE_INSTANCE(GPIOTE_IDX(FEM_NODE, HAL_RADIO_GPIO_LNA_PROP, 0)); + + gpiote.p_reg->CONFIG[HAL_PALNA_GPIOTE_CHAN] = (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) | (NRF_GPIO_LNA_PSEL << @@ -1589,7 +1600,9 @@ void radio_gpio_pdn_setup(void) { /* Note: the pdn-gpios property is optional. */ #if defined(NRF_GPIO_PDN) - NRF_GPIOTE->CONFIG[HAL_PDN_GPIOTE_CHAN] = + nrfx_gpiote_t gpiote = NRFX_GPIOTE_INSTANCE(GPIOTE_IDX(FEM_NODE, pdn_gpios, 0)); + + gpiote.p_reg->CONFIG[HAL_PDN_GPIOTE_CHAN] = (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) | (NRF_GPIO_PDN_PSEL << @@ -1605,7 +1618,10 @@ void radio_gpio_csn_setup(void) { /* Note: the spi-if property is optional. */ #if defined(NRF_GPIO_CSN_PIN) - NRF_GPIOTE->CONFIG[HAL_CSN_GPIOTE_CHAN] = + nrfx_gpiote_t gpiote = NRFX_GPIOTE_INSTANCE( + GPIOTE_IDX(DT_BUS(FEM_SPI_DEV_NODE), cs_gpios, DT_REG_ADDR(FEM_SPI_DEV_NODE))); + + gpiote.p_reg->CONFIG[HAL_CSN_GPIOTE_CHAN] = (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) | (NRF_GPIO_CSN_PSEL << @@ -1653,18 +1669,28 @@ void radio_gpio_pa_lna_enable(uint32_t trx_us) void radio_gpio_pa_lna_disable(void) { + nrfx_gpiote_t gpiote_pa = + NRFX_GPIOTE_INSTANCE(GPIOTE_IDX(FEM_NODE, HAL_RADIO_GPIO_PA_PROP, 0)); #if defined(HAL_RADIO_FEM_IS_NRF21540) + nrfx_gpiote_t gpiote_pdn = NRFX_GPIOTE_INSTANCE(GPIOTE_IDX(FEM_NODE, pdn_gpios, 0)); +#if defined(NRF_GPIO_CSN_PIN) + nrfx_gpiote_t gpiote_cs = NRFX_GPIOTE_INSTANCE( + GPIOTE_IDX(DT_BUS(FEM_SPI_DEV_NODE), cs_gpios, DT_REG_ADDR(FEM_SPI_DEV_NODE))); +#endif + hal_radio_nrf_ppi_channels_disable(BIT(HAL_ENABLE_PALNA_PPI) | BIT(HAL_DISABLE_PALNA_PPI) | BIT(HAL_ENABLE_FEM_PPI) | BIT(HAL_DISABLE_FEM_PPI)); - NRF_GPIOTE->CONFIG[HAL_PALNA_GPIOTE_CHAN] = 0; - NRF_GPIOTE->CONFIG[HAL_PDN_GPIOTE_CHAN] = 0; - NRF_GPIOTE->CONFIG[HAL_CSN_GPIOTE_CHAN] = 0; + gpiote_pa.p_reg->CONFIG[HAL_PALNA_GPIOTE_CHAN] = 0; + gpiote_pdn.p_reg->CONFIG[HAL_PDN_GPIOTE_CHAN] = 0; +#if defined(NRF_GPIO_CSN_PIN) + gpiote_cs.p_reg->CONFIG[HAL_CSN_GPIOTE_CHAN] = 0; +#endif #else hal_radio_nrf_ppi_channels_disable(BIT(HAL_ENABLE_PALNA_PPI) | BIT(HAL_DISABLE_PALNA_PPI)); - NRF_GPIOTE->CONFIG[HAL_PALNA_GPIOTE_CHAN] = 0; + gpiote_pa.p_reg->CONFIG[HAL_PALNA_GPIOTE_CHAN] = 0; #endif } #endif /* HAL_RADIO_GPIO_HAVE_PA_PIN || HAL_RADIO_GPIO_HAVE_LNA_PIN */ diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf5_dppi.h b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf5_dppi.h index 1fdf7d90d30cb27..50b9e9030e5ebd9 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf5_dppi.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf5_dppi.h @@ -180,6 +180,13 @@ static inline void hal_trigger_rateoverride_ppi_config(void) nrf_ccm_subscribe_set(NRF_CCM, NRF_CCM_TASK_RATEOVERRIDE, HAL_TRIGGER_RATEOVERRIDE_PPI); } +#if defined(HAL_RADIO_GPIO_HAVE_PA_PIN) || defined(HAL_RADIO_GPIO_HAVE_LNA_PIN) || \ + defined(HAL_RADIO_FEM_IS_NRF21540) +#define GPIO_NODE(node, pin, idx) DT_GPIO_CTLR_BY_IDX(node, pin, idx) +#define GPIOTE_PHANDLE(node, pin, idx) DT_PHANDLE(GPIO_NODE(node, pin, idx), gpiote_instance) +#define GPIOTE_IDX(node, pin, idx) DT_PROP(GPIOTE_PHANDLE(node, pin, idx), instance) +#endif + /******************************************************************************/ #if defined(HAL_RADIO_GPIO_HAVE_PA_PIN) || defined(HAL_RADIO_GPIO_HAVE_LNA_PIN) static inline void hal_palna_ppi_setup(void) @@ -191,9 +198,11 @@ static inline void hal_palna_ppi_setup(void) #if !defined(HAL_RADIO_FEM_IS_NRF21540) nrf_gpiote_task_t task; + nrfx_gpiote_t gpiote = + NRFX_GPIOTE_INSTANCE(GPIOTE_IDX(FEM_NODE, HAL_RADIO_GPIO_PA_PROP, 0)); task = nrf_gpiote_out_task_get(HAL_PALNA_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_DISABLE_PALNA_PPI); + nrf_gpiote_subscribe_set(gpiote.p_reg, task, HAL_DISABLE_PALNA_PPI); #endif } #endif /* defined(HAL_RADIO_GPIO_HAVE_PA_PIN) || defined(HAL_RADIO_GPIO_HAVE_LNA_PIN) */ @@ -204,40 +213,47 @@ static inline void hal_palna_ppi_setup(void) static inline void hal_pa_ppi_setup(void) { nrf_gpiote_task_t task; + nrfx_gpiote_t gpiote = + NRFX_GPIOTE_INSTANCE(GPIOTE_IDX(FEM_NODE, HAL_RADIO_GPIO_PA_PROP, 0)); #if defined(HAL_RADIO_GPIO_PA_POL_INV) task = nrf_gpiote_clr_task_get(HAL_PALNA_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_ENABLE_PALNA_PPI); + nrf_gpiote_subscribe_set(gpiote.p_reg, task, HAL_ENABLE_PALNA_PPI); task = nrf_gpiote_set_task_get(HAL_PALNA_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_DISABLE_PALNA_PPI); + nrf_gpiote_subscribe_set(gpiote.p_reg, task, HAL_DISABLE_PALNA_PPI); #else /* !HAL_RADIO_GPIO_PA_POL_INV */ task = nrf_gpiote_set_task_get(HAL_PALNA_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_ENABLE_PALNA_PPI); + nrf_gpiote_subscribe_set(gpiote.p_reg, task, HAL_ENABLE_PALNA_PPI); task = nrf_gpiote_clr_task_get(HAL_PALNA_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_DISABLE_PALNA_PPI); + nrf_gpiote_subscribe_set(gpiote.p_reg, task, HAL_DISABLE_PALNA_PPI); #endif /* !HAL_RADIO_GPIO_PA_POL_INV */ } static inline void hal_lna_ppi_setup(void) { nrf_gpiote_task_t task; + nrfx_gpiote_t gpiote = + NRFX_GPIOTE_INSTANCE(GPIOTE_IDX(FEM_NODE, HAL_RADIO_GPIO_PA_PROP, 0)); #if defined(HAL_RADIO_GPIO_LNA_POL_INV) task = nrf_gpiote_clr_task_get(HAL_PALNA_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_ENABLE_PALNA_PPI); + nrf_gpiote_subscribe_set(gpiote.p_reg, task, HAL_ENABLE_PALNA_PPI); task = nrf_gpiote_set_task_get(HAL_PALNA_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_DISABLE_PALNA_PPI); + nrf_gpiote_subscribe_set(gpiote.p_reg, task, HAL_DISABLE_PALNA_PPI); #else /* !HAL_RADIO_GPIO_LNA_POL_INV */ task = nrf_gpiote_set_task_get(HAL_PALNA_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_ENABLE_PALNA_PPI); + nrf_gpiote_subscribe_set(gpiote.p_reg, task, HAL_ENABLE_PALNA_PPI); task = nrf_gpiote_clr_task_get(HAL_PALNA_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_DISABLE_PALNA_PPI); + nrf_gpiote_subscribe_set(gpiote.p_reg, task, HAL_DISABLE_PALNA_PPI); #endif /* !HAL_RADIO_GPIO_LNA_POL_INV */ } static inline void hal_fem_ppi_setup(void) { nrf_gpiote_task_t task; + nrfx_gpiote_t gpiote_pdn = NRFX_GPIOTE_INSTANCE(GPIOTE_IDX(FEM_NODE, pdn_gpios, 0)); + nrfx_gpiote_t gpiote_cs = NRFX_GPIOTE_INSTANCE( + GPIOTE_IDX(DT_BUS(FEM_SPI_DEV_NODE), cs_gpios, DT_REG_ADDR(FEM_SPI_DEV_NODE))); nrf_timer_publish_set(EVENT_TIMER, NRF_TIMER_EVENT_COMPARE3, HAL_ENABLE_FEM_PPI); @@ -246,26 +262,26 @@ static inline void hal_fem_ppi_setup(void) #if defined(HAL_RADIO_GPIO_NRF21540_PDN_POL_INV) task = nrf_gpiote_clr_task_get(HAL_PDN_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_ENABLE_FEM_PPI); + nrf_gpiote_subscribe_set(gpiote_pdn.p_reg, task, HAL_ENABLE_FEM_PPI); task = nrf_gpiote_set_task_get(HAL_PDN_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_DISABLE_FEM_PPI); + nrf_gpiote_subscribe_set(gpiote_pdn.p_reg, task, HAL_DISABLE_FEM_PPI); #else /* !HAL_RADIO_GPIO_NRF21540_PDN_POL_INV */ task = nrf_gpiote_set_task_get(HAL_PDN_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_ENABLE_FEM_PPI); + nrf_gpiote_subscribe_set(gpiote_pdn.p_reg, task, HAL_ENABLE_FEM_PPI); task = nrf_gpiote_clr_task_get(HAL_PDN_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_DISABLE_FEM_PPI); + nrf_gpiote_subscribe_set(gpiote_pdn.p_reg, task, HAL_DISABLE_FEM_PPI); #endif /* !HAL_RADIO_GPIO_NRF21540_PDN_POL_INV */ #if defined(HAL_RADIO_GPIO_NRF21540_CSN_POL_INV) task = nrf_gpiote_clr_task_get(HAL_CSN_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_ENABLE_FEM_PPI); + nrf_gpiote_subscribe_set(gpiote_cs.p_reg, task, HAL_ENABLE_FEM_PPI); task = nrf_gpiote_set_task_get(HAL_CSN_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_DISABLE_FEM_PPI); + nrf_gpiote_subscribe_set(gpiote_cs.p_reg, task, HAL_DISABLE_FEM_PPI); #else /* !HAL_RADIO_GPIO_NRF21540_CSN_POL_INV */ task = nrf_gpiote_set_task_get(HAL_CSN_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_ENABLE_FEM_PPI); + nrf_gpiote_subscribe_set(gpiote_cs.p_reg, task, HAL_ENABLE_FEM_PPI); task = nrf_gpiote_clr_task_get(HAL_CSN_GPIOTE_CHAN); - nrf_gpiote_subscribe_set(NRF_GPIOTE, task, HAL_DISABLE_FEM_PPI); + nrf_gpiote_subscribe_set(gpiote_cs.p_reg, task, HAL_DISABLE_FEM_PPI); #endif /* !HAL_RADIO_GPIO_NRF21540_CSN_POL_INV */ }