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 69d268dce62f8f50965d404a29899f9c4b161a01 Author: raiden00pl <[email protected]> AuthorDate: Thu Oct 22 16:09:58 2026 +0200 arch/arm/nrf52,nrf53: transmit the beacon in its own radio state The beacon went through the normal TX path, so its TX done confirmed a transaction that did not exist and the beacon sequence number the MAC leaves to the radio was never set. Give the beacon its own state and macBSN, start it before any other frame as soon as no frame is on the air (IEEE 802.15.4-2003 7.5.2.4) and arm a beacon updated during its TX once it is sent. Assisted-by: Claude Code Signed-off-by: raiden00pl <[email protected]> --- arch/arm/src/nrf52/nrf52_ieee802154.c | 19 +++-- arch/arm/src/nrf52/nrf52_ieee802154_priv.h | 4 + arch/arm/src/nrf52/nrf52_ieee802154_radio.c | 124 ++++++++++++++++++++++++---- arch/arm/src/nrf52/nrf52_ieee802154_radio.h | 3 + arch/arm/src/nrf52/nrf52_ieee802154_trace.c | 2 + arch/arm/src/nrf52/nrf52_ieee802154_trace.h | 2 + arch/arm/src/nrf53/nrf53_ieee802154.c | 19 +++-- arch/arm/src/nrf53/nrf53_ieee802154_priv.h | 4 + arch/arm/src/nrf53/nrf53_ieee802154_radio.c | 124 ++++++++++++++++++++++++---- arch/arm/src/nrf53/nrf53_ieee802154_radio.h | 3 + arch/arm/src/nrf53/nrf53_ieee802154_trace.c | 2 + arch/arm/src/nrf53/nrf53_ieee802154_trace.h | 2 + 12 files changed, 266 insertions(+), 42 deletions(-) diff --git a/arch/arm/src/nrf52/nrf52_ieee802154.c b/arch/arm/src/nrf52/nrf52_ieee802154.c index fad5a0a4ded..8bc19f07195 100644 --- a/arch/arm/src/nrf52/nrf52_ieee802154.c +++ b/arch/arm/src/nrf52/nrf52_ieee802154.c @@ -27,6 +27,7 @@ #include <nuttx/config.h> #include <nuttx/debug.h> +#include <stdlib.h> #include <string.h> #include <nuttx/kmalloc.h> @@ -738,9 +739,10 @@ nrf52_radioi8_beaconstart(struct ieee802154_radio_s *radio, memcpy(&dev->state.sf, (void *)sfspec, sizeof(struct ieee802154_superframespec_s)); - /* Setup beacon transmission */ + /* Setup beacon transmission, macBSN starts from a random value */ dev->radio->ops->beacon_setup(dev, beacon->bf_data, beacon->bf_len); + dev->radio->state.bsn = rand(); /* Configure RTC events */ @@ -783,13 +785,16 @@ nrf52_radioi8_beaconupdate(struct ieee802154_radio_s *radio, flags = enter_critical_section(); - /* Arm the beacon TX buffer */ + /* The beacon on the air is replaced when it is sent */ - memcpy(&dev->radio->beaconbuf[1], beacon->bf_data, beacon->bf_len); - - /* Length = Frame data + CRC */ - - dev->radio->beaconbuf[0] = beacon->bf_len + 2; + if (dev->radio->state.state == NRF52_RADIO_STATE_BEACONTX) + { + dev->state.beacon_next = beacon; + } + else + { + dev->radio->ops->beacon_setup(dev, beacon->bf_data, beacon->bf_len); + } leave_critical_section(flags); diff --git a/arch/arm/src/nrf52/nrf52_ieee802154_priv.h b/arch/arm/src/nrf52/nrf52_ieee802154_priv.h index 8af61b306df..44de4716b8e 100644 --- a/arch/arm/src/nrf52/nrf52_ieee802154_priv.h +++ b/arch/arm/src/nrf52/nrf52_ieee802154_priv.h @@ -105,6 +105,10 @@ struct nrf52_radioi8_state_s struct ieee802154_superframespec_s sf; + /* Beacon updated during its TX */ + + struct ieee802154_beaconframe_s *beacon_next; + /* TX GTS */ struct ieee802154_txdesc_s *gts_desc[NRF52_GTS_SLOTS]; diff --git a/arch/arm/src/nrf52/nrf52_ieee802154_radio.c b/arch/arm/src/nrf52/nrf52_ieee802154_radio.c index ff436222083..7f269eaa146 100644 --- a/arch/arm/src/nrf52/nrf52_ieee802154_radio.c +++ b/arch/arm/src/nrf52/nrf52_ieee802154_radio.c @@ -212,6 +212,9 @@ static void nrf52_radioi8_work_ed(void *arg); static void nrf52_radioi8_state_rx(struct nrf52_radioi8_dev_s *dev); static void nrf52_radioi8_state_tx(struct nrf52_radioi8_dev_s *dev); static void nrf52_radioi8_state_acktx(struct nrf52_radioi8_dev_s *dev); +#ifdef CONFIG_NRF52_RADIO_IEEE802154_SUPERFRAME +static void nrf52_radioi8_state_beacontx(struct nrf52_radioi8_dev_s *dev); +#endif static void nrf52_radioi8_state_ed(struct nrf52_radioi8_dev_s *dev); static int nrf52_radioi8_isr_radio(int irq, void *context, void *arg); @@ -1132,6 +1135,19 @@ static void nrf52_radioi8_trg_nocsma(struct nrf52_radioi8_dev_s *dev) static void nrf52_radioi8_norm_trigger(struct nrf52_radioi8_dev_s *dev) { +#ifdef CONFIG_NRF52_RADIO_IEEE802154_SUPERFRAME + /* The beacon is not acknowledged and keeps its state */ + + if (dev->radio->state.state == NRF52_RADIO_STATE_BEACONTX) + { + nrf52_radioi8_trace_put(RADIO_TRACE_BEACONTX, + dev->radio->beaconbuf[3]); + NRF52_RADIO_PUTREG(dev->radio->lower, NRF52_RADIO_TASKS_TXEN_OFFSET, + 1); + return; + } +#endif + /* Wait for ACK */ if (dev->radio->txbuf[1] & IEEE802154_FRAMECTRL_ACKREQ) @@ -1194,13 +1210,12 @@ static void nrf52_radioi8_beacon_setup(struct nrf52_radioi8_dev_s *dev, static void nrf52_radioi8_beacon_tx(struct nrf52_radioi8_dev_s *dev) { - /* Beacon buffer is ready to send - transmit as non CSMA-CA */ - - nrf52_radioi8_norm_setup_buf(dev, dev->radio->beaconbuf, false); - - /* Send now */ + /* The beacon has priority over all other operations (IEEE 802.15.4-2003 + * 7.5.2.4), only a frame on the air completes first + */ - nrf52_radioi8_norm_trigger(dev); + dev->radio->state.beacon_pending = true; + nrf52_radioi8_txnext(dev, 0); } #endif @@ -1316,9 +1331,9 @@ static void nrf52_radioi8_rxrestore(struct nrf52_radioi8_dev_s *dev) * Name: nrf52_radioi8_txnext * * Description: - * Start the next frame if the radio is free: the delayed TX that waits, - * else the CSMA TX that waits, else restore RX. mindelay is the IFS a - * delayed TX keeps after the ACK TX that deferred it. + * Start the next frame if the radio is free: the beacon that waits, else + * the delayed TX that waits, else the CSMA TX that waits, else restore + * RX. mindelay is the IFS a frame keeps after the TX that deferred it. * ****************************************************************************/ @@ -1330,14 +1345,46 @@ static void nrf52_radioi8_txnext(struct nrf52_radioi8_dev_s *dev, flags = enter_critical_section(); - /* A frame on the air, an armed frame, an ACK TX, an energy detection - * or a CSMA transaction between its backoffs owns the radio. + /* A frame on the air, an ACK TX or an energy detection owns the radio */ + + if (dev->radio->state.state != NRF52_RADIO_STATE_DISABLED && + dev->radio->state.state != NRF52_RADIO_STATE_RX) + { + leave_critical_section(flags); + return; + } + +#ifdef CONFIG_NRF52_RADIO_IEEE802154_SUPERFRAME + /* The beacon first, it preempts the receiver */ + + if (dev->radio->state.beacon_pending) + { + dev->radio->state.beacon_pending = false; + dev->radio->beaconbuf[3] = dev->radio->state.bsn++; + + nrf52_radioi8_norm_setup_buf(dev, dev->radio->beaconbuf, false); + dev->radio->state.state = NRF52_RADIO_STATE_BEACONTX; + + if (mindelay == 0) + { + nrf52_radioi8_norm_trigger(dev); + } + else + { + dev->tim->ops->setup(dev, NRF52_TIMER_CHAN_TXDELAY, mindelay); + } + + leave_critical_section(flags); + return; + } +#endif + + /* An armed frame or a CSMA transaction between its backoffs owns the + * radio. */ if (dev->radio->state.csma_busy || - (dev->state.txdelayed_busy && !dev->state.txdelayed_pending) || - (dev->radio->state.state != NRF52_RADIO_STATE_DISABLED && - dev->radio->state.state != NRF52_RADIO_STATE_RX)) + (dev->state.txdelayed_busy && !dev->state.txdelayed_pending)) { leave_critical_section(flags); return; @@ -2151,6 +2198,37 @@ static void nrf52_radioi8_state_acktx(struct nrf52_radioi8_dev_s *dev) IEEE802154_SIFS_SYMBOLS); } +#ifdef CONFIG_NRF52_RADIO_IEEE802154_SUPERFRAME +/**************************************************************************** + * Name: nrf52_radioi8_state_beacontx + * + * Description: + * Handle radio interrupt for BEACONTX state. + * + ****************************************************************************/ + +static void nrf52_radioi8_state_beacontx(struct nrf52_radioi8_dev_s *dev) +{ + nrf52_radioi8_trace_put(RADIO_TRACE_IRQ_BEACONTX, 0); + + /* Arm the beacon updated during the TX */ + + if (dev->state.beacon_next != NULL) + { + nrf52_radioi8_beacon_setup(dev, dev->state.beacon_next->bf_data, + dev->state.beacon_next->bf_len); + dev->state.beacon_next = NULL; + } + + /* Start the TX that waited for the beacon, after the IFS */ + + nrf52_radioi8_txnext(dev, dev->radio->beaconbuf[0] > + IEEE802154_MAX_SIFS_FRAME_SIZE ? + IEEE802154_LIFS_SYMBOLS : + IEEE802154_SIFS_SYMBOLS); +} +#endif + /**************************************************************************** * Name: nrf52_radioi8_state_ed * @@ -2245,6 +2323,15 @@ static int nrf52_radioi8_isr_radio(int irq, void *context, void *arg) break; } +#ifdef CONFIG_NRF52_RADIO_IEEE802154_SUPERFRAME + case NRF52_RADIO_STATE_BEACONTX: + { + nrf52_radioi8_state_beacontx(dev); + + break; + } +#endif + case NRF52_RADIO_STATE_ED: { /* Clear event */ @@ -2263,6 +2350,15 @@ static int nrf52_radioi8_isr_radio(int irq, void *context, void *arg) } } +#ifdef CONFIG_NRF52_RADIO_IEEE802154_SUPERFRAME + /* The beacon that waited for the frame on the air */ + + if (dev->radio->state.beacon_pending) + { + nrf52_radioi8_txnext(dev, 0); + } +#endif + leave_critical_section(flags); return OK; diff --git a/arch/arm/src/nrf52/nrf52_ieee802154_radio.h b/arch/arm/src/nrf52/nrf52_ieee802154_radio.h index 419e776043c..188ae4c2fda 100644 --- a/arch/arm/src/nrf52/nrf52_ieee802154_radio.h +++ b/arch/arm/src/nrf52/nrf52_ieee802154_radio.h @@ -71,6 +71,7 @@ enum nrf52_radioi8_state_e NRF52_RADIO_STATE_RX, /* RX active */ NRF52_RADIO_STATE_ACKTX, /* Transmitting ACK now */ NRF52_RADIO_STATE_ED, /* Energy detection now */ + NRF52_RADIO_STATE_BEACONTX, /* Transmitting beacon now */ }; /* Radio data */ @@ -113,6 +114,8 @@ struct nrf52_radioi8_radio_data_s bool wait_for_beacon; /* Device wait for beacon */ bool ble; /* Batter life extension */ + bool beacon_pending; /* A beacon waits for the radio */ + uint8_t bsn; /* macBSN, the beacon sequence number */ #endif }; diff --git a/arch/arm/src/nrf52/nrf52_ieee802154_trace.c b/arch/arm/src/nrf52/nrf52_ieee802154_trace.c index 5577f302dc1..0ce5f1e0582 100644 --- a/arch/arm/src/nrf52/nrf52_ieee802154_trace.c +++ b/arch/arm/src/nrf52/nrf52_ieee802154_trace.c @@ -50,6 +50,7 @@ static const char *g_radio_trace_str[] = "RADIO IRQ: WAIT ACK", "RADIO IRQ: RX ACK DONE", "RADIO IRQ: TX CCA BUSY", + "RADIO IRQ: BEACON TX", "TIM IRQ: TIM ACK TX", "TIM IRQ; TIM TX DELAY", @@ -73,6 +74,7 @@ static const char *g_radio_trace_str[] = "CSMASETUP", "CSMATRIGGER", "NOCSMATRIGGER", + "BEACONTX", "NOACK", "DROPFRAME", "TXTRYAGAIN", diff --git a/arch/arm/src/nrf52/nrf52_ieee802154_trace.h b/arch/arm/src/nrf52/nrf52_ieee802154_trace.h index c3e553bd15b..a675eab6d51 100644 --- a/arch/arm/src/nrf52/nrf52_ieee802154_trace.h +++ b/arch/arm/src/nrf52/nrf52_ieee802154_trace.h @@ -59,6 +59,7 @@ enum radio_trace_type_e RADIO_TRACE_IRQ_WAITACK, RADIO_TRACE_IRQ_RXACKDONE, RADIO_TRACE_IRQ_TXCCABUSY, + RADIO_TRACE_IRQ_BEACONTX, /* Timer interrupts */ @@ -88,6 +89,7 @@ enum radio_trace_type_e RADIO_TRACE_CSMASETUP, RADIO_TRACE_CSMATRIGGER, RADIO_TRACE_NOCSMATRIGGER, + RADIO_TRACE_BEACONTX, RADIO_TRACE_NOACK, RADIO_TRACE_DROPFRAME, RADIO_TRACE_TXRETRY, diff --git a/arch/arm/src/nrf53/nrf53_ieee802154.c b/arch/arm/src/nrf53/nrf53_ieee802154.c index 9445370be7f..3ecca0ba9bc 100644 --- a/arch/arm/src/nrf53/nrf53_ieee802154.c +++ b/arch/arm/src/nrf53/nrf53_ieee802154.c @@ -27,6 +27,7 @@ #include <nuttx/config.h> #include <nuttx/debug.h> +#include <stdlib.h> #include <string.h> #include <nuttx/kmalloc.h> @@ -738,9 +739,10 @@ nrf53_radioi8_beaconstart(struct ieee802154_radio_s *radio, memcpy(&dev->state.sf, (void *)sfspec, sizeof(struct ieee802154_superframespec_s)); - /* Setup beacon transmission */ + /* Setup beacon transmission, macBSN starts from a random value */ dev->radio->ops->beacon_setup(dev, beacon->bf_data, beacon->bf_len); + dev->radio->state.bsn = rand(); /* Configure RTC events */ @@ -783,13 +785,16 @@ nrf53_radioi8_beaconupdate(struct ieee802154_radio_s *radio, flags = enter_critical_section(); - /* Arm the beacon TX buffer */ + /* The beacon on the air is replaced when it is sent */ - memcpy(&dev->radio->beaconbuf[1], beacon->bf_data, beacon->bf_len); - - /* Length = Frame data + CRC */ - - dev->radio->beaconbuf[0] = beacon->bf_len + 2; + if (dev->radio->state.state == NRF53_RADIO_STATE_BEACONTX) + { + dev->state.beacon_next = beacon; + } + else + { + dev->radio->ops->beacon_setup(dev, beacon->bf_data, beacon->bf_len); + } leave_critical_section(flags); diff --git a/arch/arm/src/nrf53/nrf53_ieee802154_priv.h b/arch/arm/src/nrf53/nrf53_ieee802154_priv.h index 2f13284a47a..d01f0390457 100644 --- a/arch/arm/src/nrf53/nrf53_ieee802154_priv.h +++ b/arch/arm/src/nrf53/nrf53_ieee802154_priv.h @@ -105,6 +105,10 @@ struct nrf53_radioi8_state_s struct ieee802154_superframespec_s sf; + /* Beacon updated during its TX */ + + struct ieee802154_beaconframe_s *beacon_next; + /* TX GTS */ struct ieee802154_txdesc_s *gts_desc[NRF53_GTS_SLOTS]; diff --git a/arch/arm/src/nrf53/nrf53_ieee802154_radio.c b/arch/arm/src/nrf53/nrf53_ieee802154_radio.c index 169529ef36d..2ec33faa29f 100644 --- a/arch/arm/src/nrf53/nrf53_ieee802154_radio.c +++ b/arch/arm/src/nrf53/nrf53_ieee802154_radio.c @@ -212,6 +212,9 @@ static void nrf53_radioi8_work_ed(void *arg); static void nrf53_radioi8_state_rx(struct nrf53_radioi8_dev_s *dev); static void nrf53_radioi8_state_tx(struct nrf53_radioi8_dev_s *dev); static void nrf53_radioi8_state_acktx(struct nrf53_radioi8_dev_s *dev); +#ifdef CONFIG_NRF53_RADIO_IEEE802154_SUPERFRAME +static void nrf53_radioi8_state_beacontx(struct nrf53_radioi8_dev_s *dev); +#endif static void nrf53_radioi8_state_ed(struct nrf53_radioi8_dev_s *dev); static int nrf53_radioi8_isr_radio(int irq, void *context, void *arg); @@ -1132,6 +1135,19 @@ static void nrf53_radioi8_trg_nocsma(struct nrf53_radioi8_dev_s *dev) static void nrf53_radioi8_norm_trigger(struct nrf53_radioi8_dev_s *dev) { +#ifdef CONFIG_NRF53_RADIO_IEEE802154_SUPERFRAME + /* The beacon is not acknowledged and keeps its state */ + + if (dev->radio->state.state == NRF53_RADIO_STATE_BEACONTX) + { + nrf53_radioi8_trace_put(RADIO_TRACE_BEACONTX, + dev->radio->beaconbuf[3]); + NRF53_RADIO_PUTREG(dev->radio->lower, NRF53_RADIO_TASKS_TXEN_OFFSET, + 1); + return; + } +#endif + /* Wait for ACK */ if (dev->radio->txbuf[1] & IEEE802154_FRAMECTRL_ACKREQ) @@ -1194,13 +1210,12 @@ static void nrf53_radioi8_beacon_setup(struct nrf53_radioi8_dev_s *dev, static void nrf53_radioi8_beacon_tx(struct nrf53_radioi8_dev_s *dev) { - /* Beacon buffer is ready to send - transmit as non CSMA-CA */ - - nrf53_radioi8_norm_setup_buf(dev, dev->radio->beaconbuf, false); - - /* Send now */ + /* The beacon has priority over all other operations (IEEE 802.15.4-2003 + * 7.5.2.4), only a frame on the air completes first + */ - nrf53_radioi8_norm_trigger(dev); + dev->radio->state.beacon_pending = true; + nrf53_radioi8_txnext(dev, 0); } #endif @@ -1316,9 +1331,9 @@ static void nrf53_radioi8_rxrestore(struct nrf53_radioi8_dev_s *dev) * Name: nrf53_radioi8_txnext * * Description: - * Start the next frame if the radio is free: the delayed TX that waits, - * else the CSMA TX that waits, else restore RX. mindelay is the IFS a - * delayed TX keeps after the ACK TX that deferred it. + * Start the next frame if the radio is free: the beacon that waits, else + * the delayed TX that waits, else the CSMA TX that waits, else restore + * RX. mindelay is the IFS a frame keeps after the TX that deferred it. * ****************************************************************************/ @@ -1330,14 +1345,46 @@ static void nrf53_radioi8_txnext(struct nrf53_radioi8_dev_s *dev, flags = enter_critical_section(); - /* A frame on the air, an armed frame, an ACK TX, an energy detection - * or a CSMA transaction between its backoffs owns the radio. + /* A frame on the air, an ACK TX or an energy detection owns the radio */ + + if (dev->radio->state.state != NRF53_RADIO_STATE_DISABLED && + dev->radio->state.state != NRF53_RADIO_STATE_RX) + { + leave_critical_section(flags); + return; + } + +#ifdef CONFIG_NRF53_RADIO_IEEE802154_SUPERFRAME + /* The beacon first, it preempts the receiver */ + + if (dev->radio->state.beacon_pending) + { + dev->radio->state.beacon_pending = false; + dev->radio->beaconbuf[3] = dev->radio->state.bsn++; + + nrf53_radioi8_norm_setup_buf(dev, dev->radio->beaconbuf, false); + dev->radio->state.state = NRF53_RADIO_STATE_BEACONTX; + + if (mindelay == 0) + { + nrf53_radioi8_norm_trigger(dev); + } + else + { + dev->tim->ops->setup(dev, NRF53_TIMER_CHAN_TXDELAY, mindelay); + } + + leave_critical_section(flags); + return; + } +#endif + + /* An armed frame or a CSMA transaction between its backoffs owns the + * radio. */ if (dev->radio->state.csma_busy || - (dev->state.txdelayed_busy && !dev->state.txdelayed_pending) || - (dev->radio->state.state != NRF53_RADIO_STATE_DISABLED && - dev->radio->state.state != NRF53_RADIO_STATE_RX)) + (dev->state.txdelayed_busy && !dev->state.txdelayed_pending)) { leave_critical_section(flags); return; @@ -2151,6 +2198,37 @@ static void nrf53_radioi8_state_acktx(struct nrf53_radioi8_dev_s *dev) IEEE802154_SIFS_SYMBOLS); } +#ifdef CONFIG_NRF53_RADIO_IEEE802154_SUPERFRAME +/**************************************************************************** + * Name: nrf53_radioi8_state_beacontx + * + * Description: + * Handle radio interrupt for BEACONTX state. + * + ****************************************************************************/ + +static void nrf53_radioi8_state_beacontx(struct nrf53_radioi8_dev_s *dev) +{ + nrf53_radioi8_trace_put(RADIO_TRACE_IRQ_BEACONTX, 0); + + /* Arm the beacon updated during the TX */ + + if (dev->state.beacon_next != NULL) + { + nrf53_radioi8_beacon_setup(dev, dev->state.beacon_next->bf_data, + dev->state.beacon_next->bf_len); + dev->state.beacon_next = NULL; + } + + /* Start the TX that waited for the beacon, after the IFS */ + + nrf53_radioi8_txnext(dev, dev->radio->beaconbuf[0] > + IEEE802154_MAX_SIFS_FRAME_SIZE ? + IEEE802154_LIFS_SYMBOLS : + IEEE802154_SIFS_SYMBOLS); +} +#endif + /**************************************************************************** * Name: nrf53_radioi8_state_ed * @@ -2245,6 +2323,15 @@ static int nrf53_radioi8_isr_radio(int irq, void *context, void *arg) break; } +#ifdef CONFIG_NRF53_RADIO_IEEE802154_SUPERFRAME + case NRF53_RADIO_STATE_BEACONTX: + { + nrf53_radioi8_state_beacontx(dev); + + break; + } +#endif + case NRF53_RADIO_STATE_ED: { /* Clear event */ @@ -2263,6 +2350,15 @@ static int nrf53_radioi8_isr_radio(int irq, void *context, void *arg) } } +#ifdef CONFIG_NRF53_RADIO_IEEE802154_SUPERFRAME + /* The beacon that waited for the frame on the air */ + + if (dev->radio->state.beacon_pending) + { + nrf53_radioi8_txnext(dev, 0); + } +#endif + leave_critical_section(flags); return OK; diff --git a/arch/arm/src/nrf53/nrf53_ieee802154_radio.h b/arch/arm/src/nrf53/nrf53_ieee802154_radio.h index d6356ce2957..5c84c0a0b81 100644 --- a/arch/arm/src/nrf53/nrf53_ieee802154_radio.h +++ b/arch/arm/src/nrf53/nrf53_ieee802154_radio.h @@ -71,6 +71,7 @@ enum nrf53_radioi8_state_e NRF53_RADIO_STATE_RX, /* RX active */ NRF53_RADIO_STATE_ACKTX, /* Transmitting ACK now */ NRF53_RADIO_STATE_ED, /* Energy detection now */ + NRF53_RADIO_STATE_BEACONTX, /* Transmitting beacon now */ }; /* Radio data */ @@ -113,6 +114,8 @@ struct nrf53_radioi8_radio_data_s bool wait_for_beacon; /* Device wait for beacon */ bool ble; /* Batter life extension */ + bool beacon_pending; /* A beacon waits for the radio */ + uint8_t bsn; /* macBSN, the beacon sequence number */ #endif }; diff --git a/arch/arm/src/nrf53/nrf53_ieee802154_trace.c b/arch/arm/src/nrf53/nrf53_ieee802154_trace.c index 74c185c1a35..55eed55fd46 100644 --- a/arch/arm/src/nrf53/nrf53_ieee802154_trace.c +++ b/arch/arm/src/nrf53/nrf53_ieee802154_trace.c @@ -50,6 +50,7 @@ static const char *g_radio_trace_str[] = "RADIO IRQ: WAIT ACK", "RADIO IRQ: RX ACK DONE", "RADIO IRQ: TX CCA BUSY", + "RADIO IRQ: BEACON TX", "TIM IRQ: TIM ACK TX", "TIM IRQ; TIM TX DELAY", @@ -73,6 +74,7 @@ static const char *g_radio_trace_str[] = "CSMASETUP", "CSMATRIGGER", "NOCSMATRIGGER", + "BEACONTX", "NOACK", "DROPFRAME", "TXTRYAGAIN", diff --git a/arch/arm/src/nrf53/nrf53_ieee802154_trace.h b/arch/arm/src/nrf53/nrf53_ieee802154_trace.h index 03129eef6d4..5eb5bf77808 100644 --- a/arch/arm/src/nrf53/nrf53_ieee802154_trace.h +++ b/arch/arm/src/nrf53/nrf53_ieee802154_trace.h @@ -59,6 +59,7 @@ enum radio_trace_type_e RADIO_TRACE_IRQ_WAITACK, RADIO_TRACE_IRQ_RXACKDONE, RADIO_TRACE_IRQ_TXCCABUSY, + RADIO_TRACE_IRQ_BEACONTX, /* Timer interrupts */ @@ -88,6 +89,7 @@ enum radio_trace_type_e RADIO_TRACE_CSMASETUP, RADIO_TRACE_CSMATRIGGER, RADIO_TRACE_NOCSMATRIGGER, + RADIO_TRACE_BEACONTX, RADIO_TRACE_NOACK, RADIO_TRACE_DROPFRAME, RADIO_TRACE_TXRETRY,
