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

Reply via email to