11/*
2- * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
2+ * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
33 *
44 * SPDX-License-Identifier: Apache-2.0
55 */
1313#include "esp_ieee802154_dev.h"
1414#include "hal/ieee802154_ll.h"
1515#include "esp_timer.h"
16+ #include "soc/ieee802154_struct.h"
1617#ifdef __cplusplus
1718extern "C" {
1819#endif
@@ -36,8 +37,9 @@ static inline bool ieee802154_is_valid_channel(uint8_t channel)
3637#endif // SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_FREERTOS_USE_TICKLESS_IDLE
3738#define IEEE802154_PROBE (a ) do { \
3839 IEEE802154_RECORD_EVENT(a); \
39- ieee802154_record_abort (a); \
40+ IEEE802154_RECORD_ABORT (a); \
4041 IEEE802154_TXRX_STATISTIC(a); \
42+ IEEE802154_RECORD_FRAME(a); \
4143 } while(0)
4244
4345#if CONFIG_IEEE802154_RECORD_EVENT
@@ -119,7 +121,7 @@ typedef struct {
119121
120122#if CONFIG_IEEE802154_RECORD_ABORT
121123#define IEEE802154_ASSERT_RECORD_ABORT_SIZE CONFIG_IEEE802154_RECORD_ABORT_SIZE
122- #define ieee802154_record_abort (a ) do { \
124+ #define IEEE802154_RECORD_ABORT (a ) do { \
123125 if (a == IEEE802154_EVENT_RX_ABORT) { \
124126 g_ieee802154_probe.abort[g_ieee802154_probe.abort_index].abort_reason.rx \
125127 = ieee802154_ll_get_rx_abort_reason(); \
@@ -149,29 +151,95 @@ typedef struct {
149151 uint64_t timestamp ; /*!< record timestamp*/
150152} ieee802154_abort_info_t ;
151153#else
152- #define ieee802154_record_abort (a )
154+ #define IEEE802154_RECORD_ABORT (a )
153155#endif // CONFIG_IEEE802154_RECORD_ABORT
154156
157+ #if CONFIG_IEEE802154_RECORD_TXRX_FRAME
158+ #define IEEE802154_RECORD_TXRX_FRAME_SIZE CONFIG_IEEE802154_RECORD_TXRX_FRAME_SIZE
159+ #define IEEE802154_RECORD_FRAME_TYPE_INVALID 0
160+ #define IEEE802154_RECORD_FRAME_TYPE_RX 1
161+ #define IEEE802154_RECORD_FRAME_TYPE_TX 2
162+ #define IEEE802154_RECORD_FRAME_TYPE_RX_ACK 3
163+ #define IEEE802154_RECORD_FRAME_TYPE_TX_ACK 4
164+ #define IEEE802154_RECORD_FRAME_TYPE_VALID_MAX 5
165+
166+ #define IEEE802154_DEBUG_RX_FRAME_DUMP (type ) do {\
167+ g_ieee802154_probe.frame[g_ieee802154_probe.frame_index].frame_type = type; \
168+ g_ieee802154_probe.frame[g_ieee802154_probe.frame_index].mac_conf = IEEE802154.conf.val; \
169+ if ((((uint8_t *)IEEE802154.dma_rx_addr - &s_rx_frame[0][0]) % IEEE802154_RX_FRAME_SIZE) != 0 \
170+ || (((uint8_t *)IEEE802154.dma_rx_addr - &s_rx_frame[0][0]) / IEEE802154_RX_FRAME_SIZE) > CONFIG_IEEE802154_RX_BUFFER_SIZE) { \
171+ g_ieee802154_probe.frame[g_ieee802154_probe.frame_index].rx_buffer_index = -1; \
172+ } else { \
173+ g_ieee802154_probe.frame[g_ieee802154_probe.frame_index].rx_buffer_index = \
174+ (((uint8_t *)IEEE802154.dma_rx_addr - &s_rx_frame[0][0]) / IEEE802154_RX_FRAME_SIZE); \
175+ } \
176+ memcpy(g_ieee802154_probe.frame[g_ieee802154_probe.frame_index].dump_frame,\
177+ (void *)IEEE802154.dma_rx_addr, \
178+ IEEE802154_FRAME_MAX_LEN + 1); \
179+ g_ieee802154_probe.frame[g_ieee802154_probe.frame_index++].timestamp = esp_timer_get_time(); \
180+ g_ieee802154_probe.frame_index = (g_ieee802154_probe.frame_index == IEEE802154_RECORD_TXRX_FRAME_SIZE) ? \
181+ 0 : g_ieee802154_probe.frame_index; \
182+ } while (0)
183+
184+ #define IEEE802154_DEBUG_TX_FRAME_DUMP (type ) do { \
185+ g_ieee802154_probe.frame[g_ieee802154_probe.frame_index].frame_type = type; \
186+ g_ieee802154_probe.frame[g_ieee802154_probe.frame_index].mac_conf = IEEE802154.conf.val; \
187+ memcpy(g_ieee802154_probe.frame[g_ieee802154_probe.frame_index].dump_frame,\
188+ (void *)IEEE802154.dma_tx_addr, \
189+ IEEE802154_FRAME_MAX_LEN + 1); \
190+ g_ieee802154_probe.frame[g_ieee802154_probe.frame_index++].timestamp = esp_timer_get_time(); \
191+ g_ieee802154_probe.frame_index = (g_ieee802154_probe.frame_index == IEEE802154_RECORD_TXRX_FRAME_SIZE) ? \
192+ 0 : g_ieee802154_probe.frame_index; \
193+ } while (0)
194+
195+ #define IEEE802154_RECORD_FRAME (a ) do { \
196+ if (a == IEEE802154_EVENT_RX_DONE) { \
197+ IEEE802154_DEBUG_RX_FRAME_DUMP(IEEE802154_RECORD_FRAME_TYPE_RX); \
198+ } else if (a == IEEE802154_EVENT_ACK_RX_DONE) { \
199+ IEEE802154_DEBUG_RX_FRAME_DUMP(IEEE802154_RECORD_FRAME_TYPE_RX_ACK); \
200+ } else if (a == IEEE802154_EVENT_TX_DONE) { \
201+ IEEE802154_DEBUG_TX_FRAME_DUMP(IEEE802154_RECORD_FRAME_TYPE_TX); \
202+ } else if (a == IEEE802154_EVENT_ACK_TX_DONE) { \
203+ if (s_ieee802154_state == IEEE802154_STATE_TX_ENH_ACK) { \
204+ IEEE802154_DEBUG_TX_FRAME_DUMP(IEEE802154_RECORD_FRAME_TYPE_TX_ACK); \
205+ } \
206+ } \
207+ } while(0)
208+ typedef struct {
209+ uint8_t frame_type ;
210+ uint8_t dump_frame [IEEE802154_FRAME_MAX_LEN + 1 ];
211+ int8_t rx_buffer_index ;
212+ uint32_t mac_conf ;
213+ uint64_t timestamp ;
214+ } ieee802154_txrx_frame_info_t ;
215+ #else
216+ #define IEEE802154_RECORD_FRAME (a )
217+ #endif // CONFIG_IEEE802154_RECORD_TXRX_FRAME
218+
155219/**
156220 * @brief The table of recording IEEE802154 information.
157221 */
158222typedef struct {
159223#if CONFIG_IEEE802154_RECORD_EVENT
160- ieee802154_event_info_t event [IEEE802154_ASSERT_RECORD_EVENT_SIZE ]; /*!< record radio event */
161- uint8_t event_index ; /*!< the index of event */
224+ ieee802154_event_info_t event [IEEE802154_ASSERT_RECORD_EVENT_SIZE ]; /*!< record radio event */
225+ uint8_t event_index ; /*!< the index of event */
162226#endif // CONFIG_IEEE802154_RECORD_EVENT
163227#if CONFIG_IEEE802154_RECORD_STATE
164- ieee802154_state_info_t state [IEEE802154_ASSERT_RECORD_STATE_SIZE ]; /*!< record radio state */
165- uint8_t state_index ; /*!< the index of state */
228+ ieee802154_state_info_t state [IEEE802154_ASSERT_RECORD_STATE_SIZE ]; /*!< record radio state */
229+ uint8_t state_index ; /*!< the index of state */
166230#endif // CONFIG_IEEE802154_RECORD_STATE
167231#if CONFIG_IEEE802154_RECORD_CMD
168- ieee802154_cmd_info_t cmd [IEEE802154_ASSERT_RECORD_CMD_SIZE ]; /*!< record radio command */
169- uint8_t cmd_index ; /*!< the index of command */
232+ ieee802154_cmd_info_t cmd [IEEE802154_ASSERT_RECORD_CMD_SIZE ]; /*!< record radio command */
233+ uint8_t cmd_index ; /*!< the index of command */
170234#endif // CONFIG_IEEE802154_RECORD_CMD
171235#if CONFIG_IEEE802154_RECORD_ABORT
172- ieee802154_abort_info_t abort [IEEE802154_ASSERT_RECORD_ABORT_SIZE ]; /*!< record radio abort */
173- uint8_t abort_index ; /*!< the index of abort */
236+ ieee802154_abort_info_t abort [IEEE802154_ASSERT_RECORD_ABORT_SIZE ]; /*!< record radio abort */
237+ uint8_t abort_index ; /*!< the index of abort */
174238#endif // CONFIG_IEEE802154_RECORD_ABORT
239+ #if CONFIG_IEEE802154_RECORD_TXRX_FRAME
240+ ieee802154_txrx_frame_info_t frame [IEEE802154_RECORD_TXRX_FRAME_SIZE ]; /*!< record txrx frame */
241+ uint8_t frame_index ; /*!< the index of frame */
242+ #endif // CONFIG_IEEE802154_RECORD_TXRX_FRAME
175243} ieee802154_probe_info_t ;
176244
177245extern ieee802154_probe_info_t g_ieee802154_probe ;
0 commit comments