Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions nrf_802154/doc/CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ Added
Currently, it is supported only on nRF54L Series SoCs.
Use this API during clock platform initialization.
If the latency is not set, the driver assumes a default worst-case startup latency of 1650 us.
* When the FEM power amplifier is configured, the Errata 56 for nRF54L15 is automatically applied. (KRKNWK-20409)

nRF Connect SDK v3.0.0 - nRF 802.15.4 Radio Driver
**************************************************
Expand Down
39 changes: 30 additions & 9 deletions nrf_802154/driver/src/nrf_802154_trx.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
#include "nrf_802154_trx_ppi_api.h"
#include "nrf_802154_utils.h"

#include <nrf_erratas.h>
#include "hal/nrf_egu.h"
#include "hal/nrf_radio.h"
#include "hal/nrf_timer.h"
Expand Down Expand Up @@ -764,11 +765,12 @@ static void device_config_254_apply_tx(void)

#endif

#if defined(NRF5340_XXAA) && !defined(CONFIG_SOC_SERIES_BSIM_NRFXX)

/** @brief Applies ERRATA-117
*
* Shall be called after setting RADIO mode to NRF_RADIO_MODE_IEEE802154_250KBIT.
*/
#if defined(NRF5340_XXAA) && !defined(CONFIG_SOC_SERIES_BSIM_NRFXX)
static void errata_117_apply(void)
{
/* Register at 0x01FF0084. */
Expand All @@ -779,8 +781,7 @@ static void errata_117_apply(void)
*p_radio_reg = ficr_reg;
}

static uint32_t m_pa_mod_filter_latched = 0;
static bool m_pa_mod_filter_is_latched = false;
#endif /* defined(NRF5340_XXAA) && !defined(CONFIG_SOC_SERIES_BSIM_NRFXX)*/

/** @brief Applies modulation fix when PA is used.
*
Expand All @@ -791,7 +792,19 @@ static bool m_pa_mod_filter_is_latched = false;
*/
static void pa_modulation_fix_apply(bool enable)
{
volatile uint32_t * p_radio_reg = (volatile uint32_t *)(RADIO_BASE + 0x584UL);
#if !defined(CONFIG_SOC_SERIES_BSIM_NRFXX)
#if (defined(NRF5340_XXAA) || defined(NRF54L_CONFIGURATION_56_ENABLE))
static uint32_t m_pa_mod_filter_latched = 0;
static bool m_pa_mod_filter_is_latched = false;
volatile uint32_t * p_radio_reg;

#if defined(NRF5340_XXAA)
p_radio_reg = (volatile uint32_t *)(RADIO_BASE + 0x584UL);
#elif defined(NRF54L_CONFIGURATION_56_ENABLE)
p_radio_reg = (volatile uint32_t *)(RADIO_BASE + 0x8C4UL);
#else
#error Unknown SoC
#endif

if (enable)
{
Expand All @@ -801,20 +814,29 @@ static void pa_modulation_fix_apply(bool enable)

if ((fem_caps.flags & MPSL_FEM_CAPS_FLAG_PA_SETUP_REQUIRED) != 0)
{
#if defined(NRF5340_XXAA)
m_pa_mod_filter_latched = *(p_radio_reg);
m_pa_mod_filter_is_latched = true;
*(p_radio_reg) = 0x40081B08;
#elif defined(NRF54L_CONFIGURATION_56_ENABLE)
// MLTPAN-56
m_pa_mod_filter_latched = *(p_radio_reg);
m_pa_mod_filter_is_latched = true;
*(p_radio_reg) = 0x01280001ul;
#endif
}
}
else if (m_pa_mod_filter_is_latched)
{
*(p_radio_reg) = m_pa_mod_filter_latched;
m_pa_mod_filter_is_latched = false;
}
#endif /* (defined(NRF5340_XXAA) || defined(NRF54L_CONFIGURATION_56_ENABLE)) */
#else /* !defined(CONFIG_SOC_SERIES_BSIM_NRFXX) */
(void)enable;
#endif /* !defined(CONFIG_SOC_SERIES_BSIM_NRFXX) */
}

#endif

void nrf_802154_trx_module_reset(void)
{
m_trx_state = TRX_STATE_DISABLED;
Expand Down Expand Up @@ -890,9 +912,10 @@ void nrf_802154_trx_enable(void)
#if defined(NRF5340_XXAA) && !defined(CONFIG_SOC_SERIES_BSIM_NRFXX)
// Apply ERRATA-117 after setting RADIO mode to NRF_RADIO_MODE_IEEE802154_250KBIT.
errata_117_apply();
pa_modulation_fix_apply(true);
#endif

pa_modulation_fix_apply(true);

memset(&packet_conf, 0, sizeof(packet_conf));
packet_conf.lflen = 8;
packet_conf.plen = NRF_RADIO_PREAMBLE_LENGTH_32BIT_ZERO;
Expand Down Expand Up @@ -1013,9 +1036,7 @@ void nrf_802154_trx_disable(void)

if (m_trx_state != TRX_STATE_DISABLED)
{
#if defined(NRF5340_XXAA) && !defined(CONFIG_SOC_SERIES_BSIM_NRFXX)
pa_modulation_fix_apply(false);
#endif

#if defined(RADIO_POWER_POWER_Msk)
nrf_radio_power_set(NRF_RADIO, false);
Expand Down