diff --git a/drivers/include/nrf24l01p_ng.h b/drivers/include/nrf24l01p_ng.h index e0a361e8d8..4b3a873659 100644 --- a/drivers/include/nrf24l01p_ng.h +++ b/drivers/include/nrf24l01p_ng.h @@ -424,6 +424,17 @@ int nrf24l01p_ng_set_state(nrf24l01p_ng_t *dev, nrf24l01p_ng_state_t state); */ nrf24l01p_ng_state_t nrf24l01p_ng_get_state(const nrf24l01p_ng_t *dev); +/** + * @brief Retrieve a unique layer-2 address for an nrf24l01p_ng instance + * + * @note This function has __attribute__((weak)) so you can override this, e.g. + * to construct an address. By default @ref luid_get_lb is used. + * + * @param[in] dev The device descriptor of the transceiver + * @param[out] eui Destination to write the address to + */ +void nrf24l01p_ng_eui_get(const netdev_t *dev, uint8_t *eui); + #if IS_USED(MODULE_NRF24L01P_NG_DIAGNOSTICS) /** * @brief Get state variable as a string diff --git a/drivers/nrf24l01p_ng/gnrc_netif_nrf24l01p_ng.c b/drivers/nrf24l01p_ng/gnrc_netif_nrf24l01p_ng.c index f1cb2f91a4..98b118a4de 100644 --- a/drivers/nrf24l01p_ng/gnrc_netif_nrf24l01p_ng.c +++ b/drivers/nrf24l01p_ng/gnrc_netif_nrf24l01p_ng.c @@ -22,6 +22,7 @@ #include "debug.h" #include "net/gnrc.h" +#include "luid.h" #include "gnrc_netif_nrf24l01p_ng.h" #include "nrf24l01p_ng.h" @@ -234,3 +235,13 @@ int gnrc_netif_nrf24l01p_ng_create(gnrc_netif_t *netif, char *stack, return gnrc_netif_create(netif, stack, stacksize, priority, name, dev, &nrf24l01p_ng_netif_ops); } + +void __attribute__((weak)) nrf24l01p_ng_eui_get(const netdev_t *netdev, uint8_t *eui) +{ + (void)netdev; + do { + luid_get_lb(eui, NRF24L01P_NG_ADDR_WIDTH); + } + while (eui[NRF24L01P_NG_ADDR_WIDTH - 1] == + ((uint8_t[])NRF24L01P_NG_BROADCAST_ADDR)[NRF24L01P_NG_ADDR_WIDTH - 1]); +} diff --git a/drivers/nrf24l01p_ng/nrf24l01p_ng_netdev.c b/drivers/nrf24l01p_ng/nrf24l01p_ng_netdev.c index a1bf08af69..fa2630667a 100644 --- a/drivers/nrf24l01p_ng/nrf24l01p_ng_netdev.c +++ b/drivers/nrf24l01p_ng/nrf24l01p_ng_netdev.c @@ -26,9 +26,6 @@ #include "kernel_defines.h" #include "iolist.h" #include "irq.h" -#include "luid.h" -#include "mutex.h" -#include "net/eui64.h" #include "net/netdev.h" #include "xtimer.h" @@ -196,12 +193,10 @@ static int _init(netdev_t *netdev) /* assign to pipe 0 the broadcast address*/ nrf24l01p_ng_write_reg(dev, NRF24L01P_NG_REG_RX_ADDR_P0, NRF24L01P_NG_ADDR_P0(dev), aw); - luid_get_lb(NRF24L01P_NG_ADDR_P1(dev), aw); - /* "The LSByte must be unique for all six pipes" [datasheet p.38] */ - if (NRF24L01P_NG_ADDR_P1(dev)[aw - 1] == bc[aw - 1]) { - luid_get_lb(NRF24L01P_NG_ADDR_P1(dev), aw); - } - /* assign to pipe 0 the "main" listening address */ + /* "The LSByte must be unique for all six pipes" [datasheet p.38] */ + nrf24l01p_ng_eui_get(&dev->netdev, NRF24L01P_NG_ADDR_P1(dev)); + assert(NRF24L01P_NG_ADDR_P1(dev)[aw - 1] != NRF24L01P_NG_ADDR_P0(dev)[aw - 1]); + /* assign to pipe 1 the "main" listening address */ nrf24l01p_ng_write_reg(dev, NRF24L01P_NG_REG_RX_ADDR_P1, NRF24L01P_NG_ADDR_P1(dev), aw); /* set the address width */