This is an automated email from the ASF dual-hosted git repository. xiaoxiang781216 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit b2f996dd4c6921a5c27561971e7dfe4cfc0692f1 Author: raiden00pl <[email protected]> AuthorDate: Thu Oct 22 16:59:20 2026 +0200 drivers/wireless/ieee802154/mrf24j40: take the extended address from the board The MRF24J40 has no extended address and the driver used all ones. The lower half can provide one, nrf52832-dk builds it from the device ID. Assisted-by: Claude Code Signed-off-by: raiden00pl <[email protected]> --- .../nrf52832-dk/src/nrf52_ieee802154_mrf24j40.c | 32 ++++++++++++++++++---- .../wireless/ieee802154/mrf24j40/mrf24j40_radif.c | 15 +++++++++- include/nuttx/wireless/ieee802154/mrf24j40.h | 5 ++++ 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/boards/arm/nrf52/nrf52832-dk/src/nrf52_ieee802154_mrf24j40.c b/boards/arm/nrf52/nrf52832-dk/src/nrf52_ieee802154_mrf24j40.c index 8924dd8e055..b0bde24b366 100644 --- a/boards/arm/nrf52/nrf52832-dk/src/nrf52_ieee802154_mrf24j40.c +++ b/boards/arm/nrf52/nrf52832-dk/src/nrf52_ieee802154_mrf24j40.c @@ -31,6 +31,7 @@ #include "nrf52_gpio.h" #include "nrf52_gpiote.h" #include "nrf52_spi.h" +#include "nrf52_uid.h" #include "nrf52_mrf24j40.h" @@ -63,6 +64,8 @@ static int nrf52_attach_irq(const struct mrf24j40_lower_s *lower, xcpt_t handler, void *arg); static void nrf52_enable_irq(const struct mrf24j40_lower_s *lower, bool state); +static void nrf52_geteaddr(const struct mrf24j40_lower_s *lower, + uint8_t *eaddr); /**************************************************************************** * Private Data @@ -80,12 +83,13 @@ static void nrf52_enable_irq(const struct mrf24j40_lower_s *lower, static struct nrf52_mrf24j40_s g_mrf24j40_priv = { - .dev.attach = nrf52_attach_irq, - .dev.enable = nrf52_enable_irq, - .handler = NULL, - .arg = NULL, - .intcfg = GPIO_MRF24J40_INT, - .spidev = NRF52_MRF24J40_SPI, + .dev.attach = nrf52_attach_irq, + .dev.enable = nrf52_enable_irq, + .dev.geteaddr = nrf52_geteaddr, + .handler = NULL, + .arg = NULL, + .intcfg = GPIO_MRF24J40_INT, + .spidev = NRF52_MRF24J40_SPI, }; /**************************************************************************** @@ -153,6 +157,22 @@ static void nrf52_enable_irq(const struct mrf24j40_lower_s *lower, * Public Functions ****************************************************************************/ +/**************************************************************************** + * Name: nrf52_geteaddr + * + * Description: + * The MRF24J40 has no extended address, build a locally administered + * one from the MCU device identifier. + * + ****************************************************************************/ + +static void nrf52_geteaddr(const struct mrf24j40_lower_s *lower, + uint8_t *eaddr) +{ + nrf52_get_uniqueid(eaddr); + eaddr[0] = (eaddr[0] | 0x02) & ~0x01; +} + /**************************************************************************** * Name: nrf52_mrf24j40_initialize * diff --git a/drivers/wireless/ieee802154/mrf24j40/mrf24j40_radif.c b/drivers/wireless/ieee802154/mrf24j40/mrf24j40_radif.c index d563cb3068b..af9395b1271 100644 --- a/drivers/wireless/ieee802154/mrf24j40/mrf24j40_radif.c +++ b/drivers/wireless/ieee802154/mrf24j40/mrf24j40_radif.c @@ -35,6 +35,7 @@ #include <nuttx/arch.h> #include <nuttx/wireless/ieee802154/ieee802154_radio.h> #include <nuttx/wireless/ieee802154/ieee802154_mac.h> +#include <nuttx/wireless/ieee802154/mrf24j40.h> #include "mrf24j40.h" #include "mrf24j40_reg.h" @@ -420,6 +421,7 @@ int mrf24j40_reset(FAR struct ieee802154_radio_s *radio) { FAR struct mrf24j40_radio_s *dev = (FAR struct mrf24j40_radio_s *)radio; struct ieee802154_cca_s cca; + uint8_t eaddr[8]; int reg; /* Software reset */ @@ -491,7 +493,18 @@ int mrf24j40_reset(FAR struct ieee802154_radio_s *radio) mrf24j40_setchannel(dev, 11); mrf24j40_setpanid(dev, g_allones); mrf24j40_setsaddr(dev, g_allones); - mrf24j40_seteaddr(dev, g_allones); + + /* Use the extended address of the board, if it has one */ + + if (dev->lower->geteaddr != NULL) + { + dev->lower->geteaddr(dev->lower, eaddr); + mrf24j40_seteaddr(dev, eaddr); + } + else + { + mrf24j40_seteaddr(dev, g_allones); + } dev->max_frame_waittime = MRF24J40_DEFAULT_MAX_FRAME_WAITTIME; dev->bsn = 0; diff --git a/include/nuttx/wireless/ieee802154/mrf24j40.h b/include/nuttx/wireless/ieee802154/mrf24j40.h index dc856dae489..189ec105dc3 100644 --- a/include/nuttx/wireless/ieee802154/mrf24j40.h +++ b/include/nuttx/wireless/ieee802154/mrf24j40.h @@ -55,6 +55,11 @@ struct mrf24j40_lower_s int (*attach)(FAR const struct mrf24j40_lower_s *lower, xcpt_t handler, FAR void *arg); void (*enable)(FAR const struct mrf24j40_lower_s *lower, bool state); + + /* Get the extended address of the board, NULL if it has none */ + + void (*geteaddr)(FAR const struct mrf24j40_lower_s *lower, + FAR uint8_t *eaddr); }; #ifdef __cplusplus
