Skip to content

Commit

Permalink
bluetooth: align controller to new gpiote driver
Browse files Browse the repository at this point in the history
Align to multi-instance driver introduced in nrfx 3.2.0

Signed-off-by: Jakub Zymelka <[email protected]>
  • Loading branch information
jaz1-nordic authored and masz-nordic committed Dec 8, 2023
1 parent cb58021 commit 153cf63
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 25 deletions.
42 changes: 34 additions & 8 deletions subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <hal/nrf_radio.h>
#include <hal/nrf_ccm.h>
#include <hal/nrf_aar.h>
#include <nrfx_gpiote.h>

#include "util/mem.h"

Expand Down Expand Up @@ -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 "
Expand Down Expand Up @@ -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 <<
Expand All @@ -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 <<
Expand All @@ -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 <<
Expand All @@ -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 <<
Expand Down Expand Up @@ -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 */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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) */
Expand All @@ -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);
Expand All @@ -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 */
}

Expand Down

0 comments on commit 153cf63

Please sign in to comment.