From 355c8b4a7df083c13d82963fb9d14548647e91b1 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Sun, 18 Jan 2015 20:23:58 +0100 Subject: [PATCH] Generic trace pt2: made iso14443b use standard trace format --- armsrc/iso14443.c | 102 ++++++++++++++++++++++++--------------------- armsrc/iso14443a.c | 8 ---- armsrc/iso14443a.h | 3 -- armsrc/util.c | 16 +++++++ armsrc/util.h | 9 ++++ 5 files changed, 80 insertions(+), 58 deletions(-) diff --git a/armsrc/iso14443.c b/armsrc/iso14443.c index e9483189..4d7d4fa8 100644 --- a/armsrc/iso14443.c +++ b/armsrc/iso14443.c @@ -618,7 +618,7 @@ static RAMFUNC int Handle14443SamplesDemod(int ci, int cq) } /* - * Demodulate the samples we received from the tag + * Demodulate the samples we received from the tag, also log to tracebuffer * weTx: set to 'TRUE' if we behave like a reader * set to 'FALSE' if we behave like a snooper * quiet: set to 'TRUE' to disable debug output @@ -698,6 +698,12 @@ static void GetSamplesFor14443Demod(int weTx, int n, int quiet) } AT91C_BASE_PDC_SSC->PDC_PTCR = AT91C_PDC_RXTDIS; if (!quiet) Dbprintf("%x %x %x", max, gotFrame, Demod.len); + //Tracing + if (tracing && Demod.len > 0) { + uint8_t parity[MAX_PARITY_SIZE]; + GetParity(Demod.output , Demod.len, parity); + LogTrace(Demod.output,Demod.len, 0, 0, parity, FALSE); + } } //----------------------------------------------------------------------------- @@ -853,6 +859,20 @@ void AcquireRawAdcSamplesIso14443(uint32_t parameter) SendRawCommand14443B(sizeof(cmd1),1,1,cmd1); } +/** + Convenience function to encode, transmit and trace iso 14443b comms + **/ +static void CodeAndTransmit14443bAsReader(const uint8_t *cmd, int len) +{ + CodeIso14443bAsReader(cmd, len); + TransmitFor14443(); + if (tracing) { + uint8_t parity[MAX_PARITY_SIZE]; + GetParity(cmd, len, parity); + LogTrace(cmd,len, 0, 0, parity, TRUE); + } +} + //----------------------------------------------------------------------------- // Read a SRI512 ISO 14443 tag. // @@ -864,6 +884,9 @@ void AcquireRawAdcSamplesIso14443(uint32_t parameter) //----------------------------------------------------------------------------- void ReadSTMemoryIso14443(uint32_t dwLast) { + clear_trace(); + set_tracing(TRUE); + uint8_t i = 0x00; FpgaDownloadAndGo(FPGA_BITSTREAM_HF); @@ -885,8 +908,8 @@ void ReadSTMemoryIso14443(uint32_t dwLast) // First command: wake up the tag using the INITIATE command uint8_t cmd1[] = { 0x06, 0x00, 0x97, 0x5b}; - CodeIso14443bAsReader(cmd1, sizeof(cmd1)); - TransmitFor14443(); + + CodeAndTransmit14443bAsReader(cmd1, sizeof(cmd1)); // LED_A_ON(); GetSamplesFor14443Demod(TRUE, 2000,TRUE); // LED_A_OFF(); @@ -903,8 +926,8 @@ void ReadSTMemoryIso14443(uint32_t dwLast) cmd1[0] = 0x0E; // 0x0E is SELECT cmd1[1] = Demod.output[0]; ComputeCrc14443(CRC_14443_B, cmd1, 2, &cmd1[2], &cmd1[3]); - CodeIso14443bAsReader(cmd1, sizeof(cmd1)); - TransmitFor14443(); + CodeAndTransmit14443bAsReader(cmd1, sizeof(cmd1)); + // LED_A_ON(); GetSamplesFor14443Demod(TRUE, 2000,TRUE); // LED_A_OFF(); @@ -927,8 +950,8 @@ void ReadSTMemoryIso14443(uint32_t dwLast) // First get the tag's UID: cmd1[0] = 0x0B; ComputeCrc14443(CRC_14443_B, cmd1, 1 , &cmd1[1], &cmd1[2]); - CodeIso14443bAsReader(cmd1, 3); // Only first three bytes for this one - TransmitFor14443(); + CodeAndTransmit14443bAsReader(cmd1, 3); // Only first three bytes for this one + // LED_A_ON(); GetSamplesFor14443Demod(TRUE, 2000,TRUE); // LED_A_OFF(); @@ -959,8 +982,8 @@ void ReadSTMemoryIso14443(uint32_t dwLast) } cmd1[1] = i; ComputeCrc14443(CRC_14443_B, cmd1, 2, &cmd1[2], &cmd1[3]); - CodeIso14443bAsReader(cmd1, sizeof(cmd1)); - TransmitFor14443(); + CodeAndTransmit14443bAsReader(cmd1, sizeof(cmd1)); + // LED_A_ON(); GetSamplesFor14443Demod(TRUE, 2000,TRUE); // LED_A_OFF(); @@ -1097,20 +1120,15 @@ void RAMFUNC SnoopIso14443(void) samples += 2; #define HANDLE_BIT_IF_BODY \ - if(triggered) { \ - trace[traceLen++] = ((samples >> 0) & 0xff); \ - trace[traceLen++] = ((samples >> 8) & 0xff); \ - trace[traceLen++] = ((samples >> 16) & 0xff); \ - trace[traceLen++] = ((samples >> 24) & 0xff); \ - trace[traceLen++] = 0; \ - trace[traceLen++] = 0; \ - trace[traceLen++] = 0; \ - trace[traceLen++] = 0; \ - trace[traceLen++] = Uart.byteCnt; \ - memcpy(trace+traceLen, receivedCmd, Uart.byteCnt); \ - traceLen += Uart.byteCnt; \ - if(traceLen > 1000) break; \ - } \ + if(triggered && tracing) {\ + uint8_t parity[MAX_PARITY_SIZE];\ + GetParity(receivedCmd, Uart.byteCnt, parity);\ + LogTrace(receivedCmd,Uart.byteCnt,samples, samples,parity,TRUE);\ + if(!tracing) {\ + DbpString("Reached trace limit");\ + break;\ + }\ + }\ /* And ready to receive another command. */ \ memset(&Uart, 0, sizeof(Uart)); \ Uart.output = receivedCmd; \ @@ -1130,28 +1148,18 @@ void RAMFUNC SnoopIso14443(void) } if(Handle14443SamplesDemod(ci, cq)) { - // timestamp, as a count of samples - trace[traceLen++] = ((samples >> 0) & 0xff); - trace[traceLen++] = ((samples >> 8) & 0xff); - trace[traceLen++] = ((samples >> 16) & 0xff); - trace[traceLen++] = 0x80 | ((samples >> 24) & 0xff); - // correlation metric (~signal strength estimate) - if(Demod.metricN != 0) { - Demod.metric /= Demod.metricN; - } - trace[traceLen++] = ((Demod.metric >> 0) & 0xff); - trace[traceLen++] = ((Demod.metric >> 8) & 0xff); - trace[traceLen++] = ((Demod.metric >> 16) & 0xff); - trace[traceLen++] = ((Demod.metric >> 24) & 0xff); - // length - trace[traceLen++] = Demod.len; - memcpy(trace+traceLen, receivedResponse, Demod.len); - traceLen += Demod.len; - if(traceLen > DEMOD_TRACE_SIZE) { - DbpString("Reached trace limit"); - goto done; - } + //Use samples as a time measurement + if(tracing) + { + uint8_t parity[MAX_PARITY_SIZE]; + GetParity(receivedResponse, Demod.len, parity); + LogTrace(receivedResponse,Demod.len,samples, samples,parity,FALSE); + if(!tracing) { + DbpString("Reached trace limit"); + break; + } + } triggered = TRUE; LED_A_OFF(); LED_B_ON(); @@ -1175,7 +1183,7 @@ done: LED_C_OFF(); AT91C_BASE_PDC_SSC->PDC_PTCR = AT91C_PDC_RXTDIS; DbpString("Snoop statistics:"); - Dbprintf(" Max behind by: %i", maxBehindBy); + Dbprintf(" Max behind by: %i", maxBehindBy); Dbprintf(" Uart State: %x", Uart.state); Dbprintf(" Uart ByteCnt: %i", Uart.byteCnt); Dbprintf(" Uart ByteCntMax: %i", Uart.byteCntMax); @@ -1220,8 +1228,8 @@ void SendRawCommand14443B(uint32_t datalen, uint32_t recv,uint8_t powerfield, ui SpinDelay(200); } - CodeIso14443bAsReader(data, datalen); - TransmitFor14443(); + CodeAndTransmit14443bAsReader(data, datalen); + if(recv) { uint16_t iLen = MIN(Demod.len,USB_CMD_DATA_SIZE); diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index f5348e77..d91b24d7 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -148,14 +148,6 @@ void iso14a_set_trigger(bool enable) { trigger = enable; } -void iso14a_clear_trace() { - memset(trace, 0x44, TRACE_SIZE); - traceLen = 0; -} - -void iso14a_set_tracing(bool enable) { - tracing = enable; -} void iso14a_set_timeout(uint32_t timeout) { iso14a_timeout = timeout; diff --git a/armsrc/iso14443a.h b/armsrc/iso14443a.h index c595d5e1..c3710388 100644 --- a/armsrc/iso14443a.h +++ b/armsrc/iso14443a.h @@ -87,7 +87,4 @@ extern int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *resp_da extern void iso14a_set_trigger(bool enable); extern void iso14a_set_timeout(uint32_t timeout); -extern void iso14a_clear_trace(); -extern void iso14a_set_tracing(bool enable); - #endif /* __ISO14443A_H */ diff --git a/armsrc/util.c b/armsrc/util.c index cce9bed8..a4f55879 100644 --- a/armsrc/util.c +++ b/armsrc/util.c @@ -427,6 +427,22 @@ uint32_t RAMFUNC GetCountSspClk(){ return tmp_count; } } +void iso14a_clear_trace() { + clear_trace(); +} + +void iso14a_set_tracing(bool enable) { + set_tracing(enable); +} + +void clear_trace() { + memset(trace, 0x44, TRACE_SIZE); + traceLen = 0; +} + +void set_tracing(bool enable) { + tracing = enable; +} /** This is a function to store traces. All protocols can use this generic tracer-function. diff --git a/armsrc/util.h b/armsrc/util.h index d7eacd70..141d74b9 100644 --- a/armsrc/util.h +++ b/armsrc/util.h @@ -43,6 +43,15 @@ void LEDsoff(); int BUTTON_CLICKED(int ms); int BUTTON_HELD(int ms); void FormatVersionInformation(char *dst, int len, const char *prefix, void *version_information); +// @deprecated +void iso14a_clear_trace(); +// @deprecated +void iso14a_set_tracing(bool enable); +void clear_trace(); +void set_tracing(bool enable); + +// The function LogTrace() is also used by the iClass implementation in iclass.c and both iso14443a, iso14443b and mifare +bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t iLen, uint32_t timestamp_start, uint32_t timestamp_end, uint8_t *parity, bool readerToTag); void StartTickCount(); uint32_t RAMFUNC GetTickCount(); -- 2.39.2