From 57a42e3ce9dab67b080ff3b9a4a5f9e79b1c12d6 Mon Sep 17 00:00:00 2001 From: Antiklesys Date: Sat, 5 Sep 2026 22:31:52 +0800 Subject: [PATCH] Stability fix for sc-bigbuf traces --- armsrc/BigBuf.c | 10 +++++++++- armsrc/BigBuf.h | 1 + armsrc/appmain.c | 4 ++++ armsrc/sam_sc.c | 9 +++++++++ armsrc/sam_sc.h | 1 + include/pm3_cmd.h | 1 + 6 files changed, 25 insertions(+), 1 deletion(-) diff --git a/armsrc/BigBuf.c b/armsrc/BigBuf.c index 5e84dce1b..cfd495c5d 100644 --- a/armsrc/BigBuf.c +++ b/armsrc/BigBuf.c @@ -75,6 +75,7 @@ static dmabuf8_t s_dma_8 = { // trace related variables static uint32_t s_trace_len = 0; static bool s_tracing = true; +static bool s_tracing_blocked = false; static uint32_t s_trace_origin = 0; static bool s_trace_origin_valid = false; @@ -231,7 +232,14 @@ void set_tracelen(uint32_t value) { } void set_tracing(bool enable) { - s_tracing = enable; + s_tracing = enable && !s_tracing_blocked; +} + +bool set_tracing_blocked(bool blocked) { + bool previous = s_tracing_blocked; + s_tracing_blocked = blocked; + if (blocked) s_tracing = false; + return previous; } bool get_tracing(void) { diff --git a/armsrc/BigBuf.h b/armsrc/BigBuf.h index 640422c57..fa763cf22 100644 --- a/armsrc/BigBuf.h +++ b/armsrc/BigBuf.h @@ -55,6 +55,7 @@ void BigBuf_print_status(void); uint32_t BigBuf_get_traceLen(void); void clear_trace(void); void set_tracing(bool enable); +bool set_tracing_blocked(bool blocked); // Returns the previous block state. void set_tracelen(uint32_t value); bool get_tracing(void); diff --git a/armsrc/appmain.c b/armsrc/appmain.c index ea4896e76..5e4551c1d 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -2936,6 +2936,10 @@ static void PacketReceived(PacketCommandNG *packet) { sam_sc_handler(packet); break; } + case CMD_HF_SAM_SC_NO_TRACE: { + sam_sc_handler_no_trace(packet); + break; + } #endif diff --git a/armsrc/sam_sc.c b/armsrc/sam_sc.c index c1f6dd93a..8b196174e 100644 --- a/armsrc/sam_sc.c +++ b/armsrc/sam_sc.c @@ -453,6 +453,15 @@ static int sam_sc_card_api_loop(uint8_t *response, uint16_t *response_len, return res; } +void sam_sc_handler_no_trace(const PacketCommandNG *c) { + const bool tracing = get_tracing(); + const bool blocked = set_tracing_blocked(true); + clear_trace(); + sam_sc_handler(c); + set_tracing_blocked(blocked); + set_tracing(tracing); +} + void sam_sc_handler(const PacketCommandNG *c) { if (c == NULL || c->length < SAM_SC_HEADER_LEN) { diff --git a/armsrc/sam_sc.h b/armsrc/sam_sc.h index da45c89e3..013247352 100644 --- a/armsrc/sam_sc.h +++ b/armsrc/sam_sc.h @@ -93,6 +93,7 @@ #define SAM_SC_ADDR_SNMP_LOADER 0xff void sam_sc_handler(const PacketCommandNG *c); +void sam_sc_handler_no_trace(const PacketCommandNG *c); // Forces the next sam_sc_handler() call to perform an I2C reset before sending // its payload. Intended to be called by other firmware paths that may have diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index 452a2cbc7..bfcc87e24 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -1205,6 +1205,7 @@ typedef struct { // session state must persist across calls (no I2C reset, no GetVersion ping, // no iso15 NFC-relay loop) and the routing scFlag byte must be host-supplied. #define CMD_HF_SAM_SC 0x0904 +#define CMD_HF_SAM_SC_NO_TRACE 0x0905 // Same payload and reply command as CMD_HF_SAM_SC. #define CMD_UNKNOWN 0xFFFF