This is an automated email from the ASF dual-hosted git repository.

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 2d4a7dfd46d28bddd6df2a9c52c397e1b965a14a
Author: raiden00pl <[email protected]>
AuthorDate: Wed Nov 4 15:46:47 2026 +0100

    arch/arm/nrf53: Start the IEEE 802.15.4 ACK at aTurnaroundTime.
    
    The ACK TX was started from two interrupts and went on air late.  RADIO
    PHYEND starts the idle 802.15.4 timer over DPPI and its ACK compare
    enables TX.
    
    Assisted-by: Claude Code:claude-fable-5-1
    Signed-off-by: raiden00pl <[email protected]>
---
 arch/arm/src/nrf53/hardware/nrf53_dppi.h    |   4 +
 arch/arm/src/nrf53/hardware/nrf53_radio.h   |   2 +
 arch/arm/src/nrf53/hardware/nrf53_tim.h     |   8 +-
 arch/arm/src/nrf53/nrf53_ieee802154.c       |   1 -
 arch/arm/src/nrf53/nrf53_ieee802154_radio.c |  37 ++----
 arch/arm/src/nrf53/nrf53_ieee802154_radio.h |   8 +-
 arch/arm/src/nrf53/nrf53_ieee802154_tim.c   | 192 +++++++++++++++++++++++++---
 arch/arm/src/nrf53/nrf53_ieee802154_tim.h   |   8 ++
 arch/arm/src/nrf53/nrf53_ieee802154_trace.c |   1 -
 arch/arm/src/nrf53/nrf53_ieee802154_trace.h |   1 -
 10 files changed, 207 insertions(+), 55 deletions(-)

diff --git a/arch/arm/src/nrf53/hardware/nrf53_dppi.h 
b/arch/arm/src/nrf53/hardware/nrf53_dppi.h
index 4e8e08610a4..e6773071517 100644
--- a/arch/arm/src/nrf53/hardware/nrf53_dppi.h
+++ b/arch/arm/src/nrf53/hardware/nrf53_dppi.h
@@ -60,4 +60,8 @@
 
 #define DPPI_CHEN_CH(x)                       (1 << x)              /* Enable 
or disable channel x */
 
+/* PUBLISH and SUBSCRIBE registers of all peripherals */
+
+#define DPPI_EN                               (1 << 31)             /* Bit 31: 
Enable */
+
 #endif /* __ARCH_ARM_SRC_NRF53_HARDWARE_NRF53_DPPI_H */
diff --git a/arch/arm/src/nrf53/hardware/nrf53_radio.h 
b/arch/arm/src/nrf53/hardware/nrf53_radio.h
index 3f9f0305a42..06cdf14231f 100644
--- a/arch/arm/src/nrf53/hardware/nrf53_radio.h
+++ b/arch/arm/src/nrf53/hardware/nrf53_radio.h
@@ -81,6 +81,8 @@
 #define NRF53_RADIO_EVENTS_RXREADY_OFFSET    0x0158                 /* RADIO 
has ramped up and is ready to be started RX path */
 #define NRF53_RADIO_EVENTS_MHRMATCH_OFFSET   0x015c                 /* MAC 
header match found */
 #define NRF53_RADIO_EVENTS_PHYEND_OFFSET     0x016c                 /* Last 
bit is sent on air */
+#define NRF53_RADIO_SUBSCRIBE_TXEN_OFFSET    0x0080                 /* 
Subscribe to TXEN */
+#define NRF53_RADIO_PUBLISH_PHYEND_OFFSET    0x01ec                 /* Publish 
PHYEND */
 #define NRF53_RADIO_SHORTS_OFFSET            0x0200                 /* 
Shortcuts between local events and tasks */
 #define NRF53_RADIO_INTENSET_OFFSET          0x0304                 /* Enable 
interrupt */
 #define NRF53_RADIO_INTENCLR_OFFSET          0x0308                 /* Disable 
interrupt */
diff --git a/arch/arm/src/nrf53/hardware/nrf53_tim.h 
b/arch/arm/src/nrf53/hardware/nrf53_tim.h
index 17df9e2ad8a..0a90df4ed33 100644
--- a/arch/arm/src/nrf53/hardware/nrf53_tim.h
+++ b/arch/arm/src/nrf53/hardware/nrf53_tim.h
@@ -46,8 +46,10 @@
 #define NRF53_TIM_TASKS_CLEAR_OFFSET       0x000c                  /* Clear 
time */
 #define NRF53_TIM_TASKS_SHUTDOWN_OFFSET    0x0010                  /* Shutdown 
Timer */
 #define NRF53_TIM_TASKS_CAPTURE_OFFSET(x)  (0x0040 + ((x) * 4))    /* Capture 
Timer value to CC[x] */
+#define NRF53_TIM_SUBSCRIBE_START_OFFSET   0x0080                  /* 
Subscribe to START */
+#define NRF53_TIM_SUBSCRIBE_CLEAR_OFFSET   0x008c                  /* 
Subscribe to CLEAR */
 #define NRF53_TIM_EVENTS_COMPARE_OFFSET(x) (0x0140 + ((x) * 4))    /* Compare 
event on CC[x] */
-                                                                   /* TODO: 
0x080-0x1c0 */
+#define NRF53_TIM_PUBLISH_COMPARE_OFFSET(x) (0x01c0 + ((x) * 4))   /* Publish 
COMPARE[x] */
 #define NRF53_TIM_SHORTS_OFFSET            0x0200                  /* 
Shortcuts between local events and tasks */
 #define NRF53_TIM_INTEN_OFFSET             0x0300                  /* Enable 
or disable interrupt */
 #define NRF53_TIM_INTENSET_OFFSET          0x0304                  /* Enable 
interrupt */
@@ -76,6 +78,10 @@
 
 #define TIM_TASKS_CLEAR                    (1 << 0)                /* Bit 0: 
Clear Timer */
 
+/* TASKS_CAPTURE[x] Register */
+
+#define TIM_TASKS_CAPTURE                  (1 << 0)                /* Bit 0: 
Capture Timer value */
+
 /* SHORTS Register */
 
 #define TIM_SHORTS_COMPARE_CLEAR(x)        (1 << (x))              /* Bits 
0-5: */
diff --git a/arch/arm/src/nrf53/nrf53_ieee802154.c 
b/arch/arm/src/nrf53/nrf53_ieee802154.c
index 8c04c817996..b53ea800224 100644
--- a/arch/arm/src/nrf53/nrf53_ieee802154.c
+++ b/arch/arm/src/nrf53/nrf53_ieee802154.c
@@ -964,7 +964,6 @@ nrf53_radioi8_register(struct nrf53_radio_board_s *board)
       return NULL;
     }
 
-  DEBUGASSERT(dev->radio->ops->txstart);
   DEBUGASSERT(dev->radio->ops->notify_noack);
   DEBUGASSERT(dev->radio->ops->ccastart);
   DEBUGASSERT(dev->radio->ops->rxenable);
diff --git a/arch/arm/src/nrf53/nrf53_ieee802154_radio.c 
b/arch/arm/src/nrf53/nrf53_ieee802154_radio.c
index ec1adb97e31..e88dca3c3bb 100644
--- a/arch/arm/src/nrf53/nrf53_ieee802154_radio.c
+++ b/arch/arm/src/nrf53/nrf53_ieee802154_radio.c
@@ -158,7 +158,8 @@
  */
 
 #define IEEE802154_ACKTX_INT            (RADIO_INT_PHYEND)
-#define IEEE802154_ACKTX_SHORTS         (RADIO_SHORTS_PHYEND_DISABLE)
+#define IEEE802154_ACKTX_SHORTS         (RADIO_SHORTS_TXREADY_START | \
+                                         RADIO_SHORTS_PHYEND_DISABLE)
 
 /* aUnitBackoffPeriod in us */
 
@@ -190,7 +191,6 @@ static void nrf53_radioi8_gts_setup(struct 
nrf53_radioi8_dev_s *dev,
 
 /* Ops */
 
-static void nrf53_radioi8_txstart(struct nrf53_radioi8_dev_s *dev);
 static void nrf53_radioi8_ccastart(struct nrf53_radioi8_dev_s *dev);
 static void nrf53_radioi8_notify_noack(struct nrf53_radioi8_dev_s *dev);
 static int nrf53_radioi8_rxenable(struct nrf53_radioi8_dev_s *dev,
@@ -266,7 +266,6 @@ static uint8_t aligned_data(8)
 
 static struct nrf53_radioi8_radio_ops_s g_radioi8_radio_ops =
 {
-  .txstart      = nrf53_radioi8_txstart,
   .ccastart     = nrf53_radioi8_ccastart,
   .notify_noack = nrf53_radioi8_notify_noack,
   .rxenable     = nrf53_radioi8_rxenable,
@@ -456,14 +455,16 @@ static void nrf53_radioi8_ack_transmit(struct 
nrf53_radioi8_dev_s *dev)
 
   dev->radio->state.state = NRF53_RADIO_STATE_ACKTX;
 
-  /* Enable TX - start TX is called from timer interrupt */
-
-  NRF53_RADIO_PUTREG(lower, NRF53_RADIO_TASKS_TXEN_OFFSET, 1);
+  /* The timer started at PHYEND enables TX on time, enable it now when the
+   * timer was busy or is already behind.
+   */
 
-  /* Run TIMER - TX is handled in timer isr */
+  if (!dev->tim->ops->ackarm(dev))
+    {
+      NRF53_RADIO_PUTREG(lower, NRF53_RADIO_TASKS_TXEN_OFFSET, 1);
+    }
 
   nrf53_radioi8_trace_put(RADIO_TRACE_ACKTX, pending);
-  dev->tim->ops->setup(dev, NRF53_TIMER_CHAN_ACK, IEEE802154_ACKIFS_SYMBOLS);
 }
 
 /****************************************************************************
@@ -688,24 +689,6 @@ static void nrf53_radioi8_dopoll_gts(void *arg)
 }
 #endif  /* NRF53_GTS_SLOTS > 0 */
 
-/****************************************************************************
- * Name: nrf53_radioi8_txstart
- *
- * Description:
- *   Start transmission, TX must be armed (TXEN must be set).
- *
- ****************************************************************************/
-
-static void nrf53_radioi8_txstart(struct nrf53_radioi8_dev_s *dev)
-{
-  struct nrf53_radio_dev_s *lower = NULL;
-
-  DEBUGASSERT(dev);
-  lower = dev->radio->lower;
-
-  NRF53_RADIO_PUTREG(lower, NRF53_RADIO_TASKS_START_OFFSET, 1);
-}
-
 /****************************************************************************
  * Name: nrf53_radioi8_ccastart
  *
@@ -2413,6 +2396,8 @@ static void nrf53_radioi8_state_acktx(struct 
nrf53_radioi8_dev_s *dev)
 {
   nrf53_radioi8_trace_put(RADIO_TRACE_IRQ_ACKTX, 0);
 
+  dev->tim->ops->ackdone(dev);
+
   /* Start the TX that waited for the ACK TX, after the IFS */
 
   nrf53_radioi8_txnext(dev, dev->radio->state.rxlong ?
diff --git a/arch/arm/src/nrf53/nrf53_ieee802154_radio.h 
b/arch/arm/src/nrf53/nrf53_ieee802154_radio.h
index b20897bcb43..e22726698a6 100644
--- a/arch/arm/src/nrf53/nrf53_ieee802154_radio.h
+++ b/arch/arm/src/nrf53/nrf53_ieee802154_radio.h
@@ -60,6 +60,10 @@
 
 #define NRF53_RADIOI8_RAMPUP_US       (40)
 
+/* Latency from the last bit on air to the RADIO PHYEND event */
+
+#define NRF53_RADIOI8_PHYEND_US       (23)
+
 /* Air time of a frame with the given PHR: SHR, PHR and PSDU, 32 us/octet */
 
 #define NRF53_RADIOI8_FRAME_US(phr)   (((phr) + 6) * 2 * IEEE802154_SYMBOL_US)
@@ -148,10 +152,6 @@ struct ieee802154_cca_s;
 
 struct nrf53_radioi8_radio_ops_s
 {
-  /* Start transmission - TX must be armed (TXEN set) */
-
-  void (*txstart)(struct nrf53_radioi8_dev_s *dev);
-
   /* Start CCA - RX must be armed (RXEN set) */
 
   void (*ccastart)(struct nrf53_radioi8_dev_s *dev);
diff --git a/arch/arm/src/nrf53/nrf53_ieee802154_tim.c 
b/arch/arm/src/nrf53/nrf53_ieee802154_tim.c
index 24c52ec783f..b81d9d9c5e2 100644
--- a/arch/arm/src/nrf53/nrf53_ieee802154_tim.c
+++ b/arch/arm/src/nrf53/nrf53_ieee802154_tim.c
@@ -33,6 +33,9 @@
 #include <nuttx/irq.h>
 #include <nuttx/wqueue.h>
 
+#include "arm_internal.h"
+#include "hardware/nrf53_dppi.h"
+#include "hardware/nrf53_tim.h"
 #include "nrf53_ieee802154_tim.h"
 #include "nrf53_ieee802154_trace.h"
 
@@ -50,13 +53,23 @@
 
 #define NRF53_IEEE802154_TIMER0 (0)
 
-/* Timer period set to 16us (symbol duration) */
+/* Timer period set to 1 us, 16 MHz / 16 = 1 MHz */
 
-#define NRF53_TIMER_FREQUENCY   (1000000 / 16)
+#define NRF53_TIMER_PRESCALER    NRF53_TIM_PRE_1000000
 
-/* 16MHz / (2 ** 8) =  62500 */
+/* The ACK of a received frame starts aTurnaroundTime after its last symbol
+ * (IEEE 802.15.4-2006 7.5.6.4.2).  While the timer is idle, RADIO PHYEND
+ * clears and starts it and it stops at the ACK compare.  For an ACK the
+ * compare enables TX through RADIO TXEN, TXREADY starts the TX.
+ */
 
-#define NRF53_TIMER_PRESCALER   (8)
+#define NRF53_TIMER_BASE         NRF53_TIMER0_BASE
+#define NRF53_TIMER_ACKTXEN_US   (IEEE802154_TURN_AROUND_TIME * \
+                                  IEEE802154_SYMBOL_US - \
+                                  NRF53_RADIOI8_RAMPUP_US - \
+                                  NRF53_RADIOI8_PHYEND_US)
+#define NRF53_TIMER_LINK_PHYEND  (14)
+#define NRF53_TIMER_LINK_ACKTXEN (15)
 
 /****************************************************************************
  * Private Function Prototypes
@@ -68,6 +81,8 @@ static int nrf53_radioi8_tim(struct nrf53_radioi8_dev_s *dev, 
uint8_t chan,
                              uint32_t val);
 static void nrf53_radioi8_tim_stop(struct nrf53_radioi8_dev_s *dev);
 static void nrf53_radioi8_tim_reset(struct nrf53_radioi8_dev_s *dev);
+static bool nrf53_radioi8_tim_ackarm(struct nrf53_radioi8_dev_s *dev);
+static void nrf53_radioi8_tim_ackdone(struct nrf53_radioi8_dev_s *dev);
 
 /* Interrupts logic */
 
@@ -82,9 +97,11 @@ static int nrf53_radioi8_isr_tim(int irq, void *context, 
void *arg);
 
 static struct nrf53_radioi8_tim_ops_s g_radioi8_tim_ops =
 {
-  .setup = nrf53_radioi8_tim,
-  .stop  = nrf53_radioi8_tim_stop,
-  .reset = nrf53_radioi8_tim_reset
+  .setup   = nrf53_radioi8_tim,
+  .stop    = nrf53_radioi8_tim_stop,
+  .reset   = nrf53_radioi8_tim_reset,
+  .ackarm  = nrf53_radioi8_tim_ackarm,
+  .ackdone = nrf53_radioi8_tim_ackdone
 };
 
 /* Timer instance */
@@ -95,6 +112,54 @@ static struct nrf53_radioi8_tim_s g_radioi8_tim;
  * Private Function
  ****************************************************************************/
 
+/****************************************************************************
+ * Name: nrf53_radioi8_tim_count
+ *
+ * Description:
+ *   Capture the timer, the TX delay channel is free when the timer is idle.
+ *
+ ****************************************************************************/
+
+static uint32_t nrf53_radioi8_tim_count(void)
+{
+  putreg32(TIM_TASKS_CAPTURE, NRF53_TIMER_BASE +
+           NRF53_TIM_TASKS_CAPTURE_OFFSET(NRF53_TIMER_CHAN_TXDELAY));
+
+  return getreg32(NRF53_TIMER_BASE +
+                  NRF53_TIM_CC_OFFSET(NRF53_TIMER_CHAN_TXDELAY));
+}
+
+/****************************************************************************
+ * Name: nrf53_radioi8_tim_idle
+ *
+ * Description:
+ *   Let RADIO PHYEND start the idle timer, or keep it for a timer event.
+ *
+ ****************************************************************************/
+
+static void nrf53_radioi8_tim_idle(struct nrf53_radioi8_dev_s *dev,
+                                   bool idle)
+{
+  struct nrf53_radioi8_tim_s *tim = dev->tim;
+
+  if (idle)
+    {
+      NRF53_TIM_STOP(tim->tim);
+      NRF53_TIM_CLEAR(tim->tim);
+      NRF53_TIM_SHORTS(tim->tim, NRF53_TIM_SHORT_COMPARE_STOP,
+                       NRF53_TIMER_CHAN_ACK, true);
+      putreg32(DPPI_CHEN_CH(NRF53_TIMER_LINK_PHYEND),
+               NRF53_DPPIC_BASE + NRF53_DPPI_CHENSET_OFFSET);
+    }
+  else
+    {
+      putreg32(DPPI_CHEN_CH(NRF53_TIMER_LINK_PHYEND),
+               NRF53_DPPIC_BASE + NRF53_DPPI_CHENCLR_OFFSET);
+      NRF53_TIM_SHORTS(tim->tim, NRF53_TIM_SHORT_COMPARE_STOP,
+                       NRF53_TIMER_CHAN_ACK, false);
+    }
+}
+
 /****************************************************************************
  * Name: nrf53_radioi8_tim
  *
@@ -123,6 +188,7 @@ static int nrf53_radioi8_tim(struct nrf53_radioi8_dev_s 
*dev, uint8_t chan,
 
   /* Stop timer and clear the counter */
 
+  nrf53_radioi8_tim_idle(dev, false);
   NRF53_TIM_STOP(tim->tim);
   NRF53_TIM_CLEAR(tim->tim);
 
@@ -132,7 +198,7 @@ static int nrf53_radioi8_tim(struct nrf53_radioi8_dev_s 
*dev, uint8_t chan,
 
   /* Set compare register */
 
-  NRF53_TIM_SETCC(tim->tim, chan, val);
+  NRF53_TIM_SETCC(tim->tim, chan, val * IEEE802154_SYMBOL_US);
 
   /* Configure interrupt */
 
@@ -187,6 +253,8 @@ static void nrf53_radioi8_tim_stop(struct 
nrf53_radioi8_dev_s *dev)
 
   dev->tim->tim_pending = false;
   dev->tim->tim_now     = -1;
+
+  nrf53_radioi8_tim_idle(dev, true);
 }
 
 /****************************************************************************
@@ -199,49 +267,129 @@ static void nrf53_radioi8_tim_stop(struct 
nrf53_radioi8_dev_s *dev)
 
 static void nrf53_radioi8_tim_reset(struct nrf53_radioi8_dev_s *dev)
 {
-  /* Configure TIMER - freq = 62500 */
+  /* Configure TIMER - freq = 1 MHz */
 
   NRF53_TIM_STOP(dev->tim->tim);
   NRF53_TIM_CONFIGURE(dev->tim->tim, NRF53_TIM_MODE_TIMER,
                       NRF53_TIM_WIDTH_32B);
   NRF53_TIM_SETPRE(dev->tim->tim, NRF53_TIMER_PRESCALER);
+  NRF53_TIM_SETCC(dev->tim->tim, NRF53_TIMER_CHAN_ACK,
+                NRF53_TIMER_ACKTXEN_US);
+
+  /* RADIO PHYEND starts the timer, the ACK compare enables TX */
+
+  putreg32(DPPI_EN | NRF53_TIMER_LINK_PHYEND,
+           NRF53_TIMER_BASE + NRF53_TIM_SUBSCRIBE_CLEAR_OFFSET);
+  putreg32(DPPI_EN | NRF53_TIMER_LINK_PHYEND,
+           NRF53_TIMER_BASE + NRF53_TIM_SUBSCRIBE_START_OFFSET);
+  putreg32(DPPI_EN | NRF53_TIMER_LINK_ACKTXEN,
+           NRF53_TIMER_BASE +
+           NRF53_TIM_PUBLISH_COMPARE_OFFSET(NRF53_TIMER_CHAN_ACK));
+  NRF53_RADIO_PUTREG(dev->radio->lower, NRF53_RADIO_PUBLISH_PHYEND_OFFSET,
+                      DPPI_EN | NRF53_TIMER_LINK_PHYEND);
+  NRF53_RADIO_PUTREG(dev->radio->lower, NRF53_RADIO_SUBSCRIBE_TXEN_OFFSET,
+                      DPPI_EN | NRF53_TIMER_LINK_ACKTXEN);
+
+  putreg32(DPPI_CHEN_CH(NRF53_TIMER_LINK_ACKTXEN),
+           NRF53_DPPIC_BASE + NRF53_DPPI_CHENCLR_OFFSET);
 
   /* Reset state */
 
   dev->tim->tim_pending = false;
   dev->tim->tim_now     = -1;
+
+  nrf53_radioi8_tim_idle(dev, true);
 }
 
 /****************************************************************************
- * Name: nrf53_radioi8_tim_expire
+ * Name: nrf53_radioi8_tim_ackarm
  *
  * Description:
- *   Handle the expired timer channel.
+ *   Let the timer enable the ACK TX.  It runs since PHYEND only when it was
+ *   idle, and it must not have reached the ACK compare yet.
  *
  ****************************************************************************/
 
-static void nrf53_radioi8_tim_expire(struct nrf53_radioi8_dev_s *dev)
+static bool nrf53_radioi8_tim_ackarm(struct nrf53_radioi8_dev_s *dev)
 {
   struct nrf53_radioi8_tim_s *tim = dev->tim;
-  irqstate_t                  flags;
+  bool armed = false;
+  uint32_t count;
+  irqstate_t flags;
 
   flags = enter_critical_section();
 
-  switch (tim->tim_now)
+  count = nrf53_radioi8_tim_count();
+  if (!tim->tim_pending && count > 0 && count < NRF53_TIMER_ACKTXEN_US)
     {
-      /* RX ACK handler */
+      putreg32(DPPI_CHEN_CH(NRF53_TIMER_LINK_ACKTXEN),
+               NRF53_DPPIC_BASE + NRF53_DPPI_CHENSET_OFFSET);
+
+      /* The compare may pass while the channel is enabled */
 
-      case NRF53_TIMER_CHAN_ACK:
+      if (nrf53_radioi8_tim_count() < NRF53_TIMER_ACKTXEN_US ||
+          (NRF53_RADIO_GETREG(dev->radio->lower, NRF53_RADIO_STATE_OFFSET) &
+           RADIO_STATE_MASK) != RADIO_STATE_DISABLED)
         {
-          nrf53_radioi8_trace_put(RADIO_TRACE_IRQ_TIMACKTX, 0);
+          tim->tim_pending = true;
+          tim->tim_now     = NRF53_TIMER_CHAN_ACK;
+          armed            = true;
+        }
+      else
+        {
+          putreg32(DPPI_CHEN_CH(NRF53_TIMER_LINK_ACKTXEN),
+                   NRF53_DPPIC_BASE + NRF53_DPPI_CHENCLR_OFFSET);
+        }
+    }
 
-          /* Start TX */
+  leave_critical_section(flags);
+  return armed;
+}
 
-          dev->radio->ops->txstart(dev);
+/****************************************************************************
+ * Name: nrf53_radioi8_tim_ackdone
+ *
+ * Description:
+ *   The ACK TX is done, the timer is idle again.
+ *
+ ****************************************************************************/
 
-          break;
-        }
+static void nrf53_radioi8_tim_ackdone(struct nrf53_radioi8_dev_s *dev)
+{
+  irqstate_t flags;
+
+  flags = enter_critical_section();
+
+  putreg32(DPPI_CHEN_CH(NRF53_TIMER_LINK_ACKTXEN),
+           NRF53_DPPIC_BASE + NRF53_DPPI_CHENCLR_OFFSET);
+
+  if (dev->tim->tim_now == NRF53_TIMER_CHAN_ACK)
+    {
+      dev->tim->tim_pending = false;
+      dev->tim->tim_now     = -1;
+      nrf53_radioi8_tim_idle(dev, true);
+    }
+
+  leave_critical_section(flags);
+}
 
+/****************************************************************************
+ * Name: nrf53_radioi8_tim_expire
+ *
+ * Description:
+ *   Handle the expired timer channel.
+ *
+ ****************************************************************************/
+
+static void nrf53_radioi8_tim_expire(struct nrf53_radioi8_dev_s *dev)
+{
+  struct nrf53_radioi8_tim_s *tim = dev->tim;
+  irqstate_t                  flags;
+
+  flags = enter_critical_section();
+
+  switch (tim->tim_now)
+    {
       /* Delayed TX handler */
 
       case NRF53_TIMER_CHAN_TXDELAY:
@@ -302,6 +450,8 @@ static void nrf53_radioi8_tim_expire(struct 
nrf53_radioi8_dev_s *dev)
   tim->tim_pending = false;
   tim->tim_now     = -1;
 
+  nrf53_radioi8_tim_idle(dev, true);
+
   leave_critical_section(flags);
 }
 
diff --git a/arch/arm/src/nrf53/nrf53_ieee802154_tim.h 
b/arch/arm/src/nrf53/nrf53_ieee802154_tim.h
index 5581a90e00b..880dd439734 100644
--- a/arch/arm/src/nrf53/nrf53_ieee802154_tim.h
+++ b/arch/arm/src/nrf53/nrf53_ieee802154_tim.h
@@ -67,6 +67,14 @@ struct nrf53_radioi8_tim_ops_s
   /* Reset timer */
 
   void (*reset)(struct nrf53_radioi8_dev_s *dev);
+
+  /* Let the timer started at PHYEND enable the ACK TX */
+
+  bool (*ackarm)(struct nrf53_radioi8_dev_s *dev);
+
+  /* ACK TX done */
+
+  void (*ackdone)(struct nrf53_radioi8_dev_s *dev);
 };
 
 /* Timer interface */
diff --git a/arch/arm/src/nrf53/nrf53_ieee802154_trace.c 
b/arch/arm/src/nrf53/nrf53_ieee802154_trace.c
index f728a25dd77..6ba1ce74538 100644
--- a/arch/arm/src/nrf53/nrf53_ieee802154_trace.c
+++ b/arch/arm/src/nrf53/nrf53_ieee802154_trace.c
@@ -52,7 +52,6 @@ static const char *g_radio_trace_str[] =
   "RADIO IRQ: TX CCA BUSY",
   "RADIO IRQ: BEACON TX",
 
-  "TIM IRQ: TIM ACK TX",
   "TIM IRQ; TIM TX DELAY",
   "TIM IRQ: TIM WAIT ACK",
   "TIM IRQ: TIM CSMA DELAY",
diff --git a/arch/arm/src/nrf53/nrf53_ieee802154_trace.h 
b/arch/arm/src/nrf53/nrf53_ieee802154_trace.h
index bbd48bf58cb..288e312c6d2 100644
--- a/arch/arm/src/nrf53/nrf53_ieee802154_trace.h
+++ b/arch/arm/src/nrf53/nrf53_ieee802154_trace.h
@@ -63,7 +63,6 @@ enum radio_trace_type_e
 
   /* Timer interrupts */
 
-  RADIO_TRACE_IRQ_TIMACKTX,
   RADIO_TRACE_IRQ_TIMTXDELAY,
   RADIO_TRACE_IRQ_TIMWAITACK,
   RADIO_TRACE_IRQ_TIMCSMADELAY,

Reply via email to