From 13a79da4e974239d72bb0b132c02c67fb2600ad8 Mon Sep 17 00:00:00 2001 From: "adam@algroup.co.uk" Date: Thu, 28 Jan 2010 11:49:05 +0000 Subject: [PATCH] add 'losimman' command - simulate arbitrary Manchester encoded LF tags --- armsrc/appmain.c | 9 +++++---- armsrc/apps.h | 2 +- armsrc/lfops.c | 12 +++++++++--- client/command.c | 43 +++++++++++++++++++++++++++++++++++++------ 4 files changed, 52 insertions(+), 14 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index a14d8fb8..674c8917 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -26,7 +26,7 @@ int kvsprintf(char const *fmt, void *arg, int radix, va_list ap); // is the order in which they go out on the wire. //============================================================================= -BYTE ToSend[256]; +BYTE ToSend[512]; int ToSendMax; static int ToSendBit; struct common_area common_area __attribute__((section(".commonarea"))); @@ -34,7 +34,7 @@ struct common_area common_area __attribute__((section(".commonarea"))); void BufferClear(void) { memset(BigBuf,0,sizeof(BigBuf)); - DbpString("Buffer cleared"); + Dbprintf("Buffer cleared (%i bytes)",sizeof(BigBuf)); } void ToSendReset(void) @@ -718,13 +718,14 @@ void UsbPacketReceived(BYTE *packet, int len) case CMD_DOWNLOADED_SIM_SAMPLES_125K: { BYTE *b = (BYTE *)BigBuf; memcpy(b+c->arg[0], c->d.asBytes, 48); + //Dbprintf("copied 48 bytes to %i",b+c->arg[0]); break; } #ifdef WITH_LF case CMD_SIMULATE_TAG_125K: LED_A_ON(); - SimulateTagLowFrequency(c->arg[0], 1); + SimulateTagLowFrequency(c->arg[0], c->arg[1], 1); LED_A_OFF(); break; #endif @@ -794,7 +795,7 @@ void UsbPacketReceived(BYTE *packet, int len) } break; default: - DbpString("unknown command"); + Dbprintf("%s: 0x%04x","unknown command:",c->cmd); break; } } diff --git a/armsrc/apps.h b/armsrc/apps.h index 1c17882a..71c25d1a 100644 --- a/armsrc/apps.h +++ b/armsrc/apps.h @@ -78,7 +78,7 @@ void ReadTItag(void); void WriteTItag(DWORD idhi, DWORD idlo, WORD crc); void AcquireTiType(void); void AcquireRawBitsTI(void); -void SimulateTagLowFrequency(int period, int ledcontrol); +void SimulateTagLowFrequency(int period, int gap, int ledcontrol); void CmdHIDsimTAG(int hi, int lo, int ledcontrol); void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol); void SimulateTagLowFrequencyBidir(int divisor, int max_bitlen); diff --git a/armsrc/lfops.c b/armsrc/lfops.c index 27088b7e..a6216eec 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -423,7 +423,7 @@ void WriteTItag(DWORD idhi, DWORD idlo, WORD crc) DbpString("Now use tiread to check"); } -void SimulateTagLowFrequency(int period, int ledcontrol) +void SimulateTagLowFrequency(int period, int gap, int ledcontrol) { int i; BYTE *tab = (BYTE *)BigBuf; @@ -468,7 +468,13 @@ void SimulateTagLowFrequency(int period, int ledcontrol) } i++; - if(i == period) i = 0; + if(i == period) { + i = 0; + if (gap) { + SHORT_COIL(); + SpinDelayUs(gap); + } + } } } @@ -762,7 +768,7 @@ void CmdHIDsimTAG(int hi, int lo, int ledcontrol) if (ledcontrol) LED_A_ON(); - SimulateTagLowFrequency(n, ledcontrol); + SimulateTagLowFrequency(n, 0, ledcontrol); if (ledcontrol) LED_A_OFF(); diff --git a/client/command.c b/client/command.c index a2c567e6..8ecbc684 100644 --- a/client/command.c +++ b/client/command.c @@ -577,7 +577,6 @@ retest: static void CmdEM410xsim(char *str) { int i, n, j, h, binary[4], parity[4]; - char *s = "0"; /* clock is 64 in EM410x tags */ int clock = 64; @@ -628,12 +627,40 @@ static void CmdEM410xsim(char *str) } /* modulate that biatch */ - Cmdmanchestermod(s); + Cmdmanchestermod(""); /* booyah! */ RepaintGraphWindow(); + + CmdLosim(""); +} + +/* simulate an LF Manchester encoded tag with specified bitstream, clock rate and inter-id gap */ +static void CmdLosimManchester(char *str) +{ + static int clock, gap; + static char data[1024], gapstring[8]; + int i; - CmdLosim(s); + /* get settings/bits */ + sscanf(str, "%i %s %i", &clock, &data[0], &gap); + + /* clear our graph */ + CmdClearGraph(0); + + /* fill it with our bitstream */ + for (i= 0; i < strlen(data) ; ++i) + CmdAppendGraph(0, clock, data[i]- '0'); + + /* modulate */ + Cmdmanchestermod(""); + + /* show what we've done */ + RepaintGraphWindow(); + + /* simulate */ + sprintf(&gapstring[0], "%i", gap); + CmdLosim(gapstring); } static void ChkBitstream(char *str) @@ -654,6 +681,9 @@ static void ChkBitstream(char *str) static void CmdLosim(char *str) { int i; + static int gap; + + sscanf(str,"%i",&gap); /* convert to bitstream if necessary */ ChkBitstream(str); @@ -667,7 +697,7 @@ static void CmdLosim(char *str) SendCommand(&c); } - UsbCommand c={CMD_SIMULATE_TAG_125K, {GraphTraceLen, 0, 0}}; + UsbCommand c={CMD_SIMULATE_TAG_125K, {GraphTraceLen, gap, 0}}; SendCommand(&c); } @@ -2881,7 +2911,8 @@ static struct { {"hi15sim", CmdHi15tag, 0, "Fake an ISO15693 tag"}, {"hidsimtag", CmdHIDsimTAG, 0, " -- HID tag simulator"}, {"hisimlisten", CmdHisimlisten, 0, "Get HF samples as fake tag"}, - {"losim", CmdLosim, 0, "Simulate LF tag"}, + {"losim", CmdLosim, 0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"}, + {"losimman", CmdLosimManchester, 0, " [GAP] Simulate arbitrary Manchester LF tag"}, {"losimbidir", CmdLosimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"}, /* card reading functions */ @@ -2923,7 +2954,7 @@ static struct { void CommandReceived(char *cmd) { int i; - char line[256]; + char line[512]; PrintToScrollback("> %s", cmd); -- 2.39.5