From b014c96d685962e4d4eea887b211397ba17fbf3d Mon Sep 17 00:00:00 2001 From: iZsh Date: Sat, 21 Jun 2014 21:33:54 +0200 Subject: [PATCH] new command "lf snoop" to snoop raw ADC values fpga/lo_read.v (lf_field): new argument. fpga/fpga_lf.v: modify accordingly. armsrc/apps.h (FPGA_MAJOR_MODE_LF_READER): Rename as FPGA_MAJOR_MODE_LF_ADC. armsrc/apps.h (FPGA_LF_ADC_READER_FIELD): New LF option. armsrc/lfops.c: Modify accordingly. client/cmdlf.c (CmdLFSnoop): New command. armsrc/appmain.c, armsrc/lfops.c, client/cmdlf.h, include/usb_cmd.h: Modify accordingly. --- armsrc/appmain.c | 6 ++++- armsrc/apps.h | 9 ++++--- armsrc/lfops.c | 60 +++++++++++++++++++++++++++------------------- client/cmdlf.c | 23 ++++++++++++++++++ client/cmdlf.h | 1 + fpga/fpga_lf.bit | Bin 42175 -> 42175 bytes fpga/fpga_lf.v | 2 +- fpga/lo_read.v | 5 ++-- include/usb_cmd.h | 1 + 9 files changed, 75 insertions(+), 32 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index b7bc87e7..8c224b6a 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -215,7 +215,7 @@ void MeasureAntennaTuning(void) */ FpgaDownloadAndGo(FPGA_BITSTREAM_LF); - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); for (i=255; i>19; i--) { WDT_HIT(); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, i); @@ -638,6 +638,10 @@ void UsbPacketReceived(uint8_t *packet, int len) case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K: ModThenAcquireRawAdcSamples125k(c->arg[0],c->arg[1],c->arg[2],c->d.asBytes); break; + case CMD_LF_SNOOP_RAW_ADC_SAMPLES: + SnoopLFRawAdcSamples(c->arg[0], c->arg[1]); + cmd_send(CMD_ACK,0,0,0,0,0); + break; case CMD_HID_DEMOD_FSK: CmdHIDdemodFSK(0, 0, 0, 1); // Demodulate HID tag break; diff --git a/armsrc/apps.h b/armsrc/apps.h index 76d1247a..4c7fa190 100644 --- a/armsrc/apps.h +++ b/armsrc/apps.h @@ -59,7 +59,8 @@ void ToSendStuffBit(int b); void ToSendReset(void); void ListenReaderField(int limit); void AcquireRawAdcSamples125k(int at134khz); -void DoAcquisition125k(void); +void SnoopLFRawAdcSamples(int divisor, int trigger_threshold); +void DoAcquisition125k(int trigger_threshold); extern int ToSendMax; extern uint8_t ToSend[]; extern uint32_t BigBuf[]; @@ -82,8 +83,8 @@ void SetAdcMuxFor(uint32_t whichGpio); #define FPGA_CMD_SET_DIVISOR (2<<12) // Definitions for the FPGA configuration word. // LF -#define FPGA_MAJOR_MODE_LF_READER (0<<5) -#define FPGA_MAJOR_MODE_LF_EDGE_DETECT (1<<5) +#define FPGA_MAJOR_MODE_LF_ADC (0<<5) +#define FPGA_MAJOR_MODE_LF_EDGE_DETECT (1<<5) #define FPGA_MAJOR_MODE_LF_PASSTHRU (2<<5) // HF #define FPGA_MAJOR_MODE_HF_READER_TX (0<<5) @@ -92,6 +93,8 @@ void SetAdcMuxFor(uint32_t whichGpio); #define FPGA_MAJOR_MODE_HF_ISO14443A (3<<5) // BOTH #define FPGA_MAJOR_MODE_OFF (7<<5) +// Options for LF_ADC +#define FPGA_LF_ADC_READER_FIELD (1<<0) // Options for LF_EDGE_DETECT #define FPGA_LF_EDGE_DETECT_READER_FIELD (1<<0) // Options for the HF reader, tx to tag diff --git a/armsrc/lfops.c b/armsrc/lfops.c index a0fa870b..6b131c26 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -15,7 +15,7 @@ #include "crc16.h" #include "string.h" -void AcquireRawAdcSamples125k(int divisor) +void LFSetupFPGAForADC(int divisor, bool lf_field) { FpgaDownloadAndGo(FPGA_BITSTREAM_LF); if ( (divisor == 1) || (divisor < 0) || (divisor > 255) ) @@ -25,23 +25,30 @@ void AcquireRawAdcSamples125k(int divisor) else FpgaSendCommand(FPGA_CMD_SET_DIVISOR, divisor); - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | (lf_field ? FPGA_LF_ADC_READER_FIELD : 0)); // Connect the A/D to the peak-detected low-frequency path. SetAdcMuxFor(GPIO_MUXSEL_LOPKD); - // Give it a bit of time for the resonant antenna to settle. SpinDelay(50); - // Now set up the SSC to get the ADC samples that are now streaming at us. FpgaSetupSsc(); +} + +void AcquireRawAdcSamples125k(int divisor) +{ + LFSetupFPGAForADC(divisor, true); + DoAcquisition125k(-1); +} - // Now call the acquisition routine - DoAcquisition125k(); +void SnoopLFRawAdcSamples(int divisor, int trigger_threshold) +{ + LFSetupFPGAForADC(divisor, false); + DoAcquisition125k(trigger_threshold); } // split into two routines so we can avoid timing issues after sending commands // -void DoAcquisition125k(void) +void DoAcquisition125k(int trigger_threshold) { uint8_t *dest = (uint8_t *)BigBuf; int n = sizeof(BigBuf); @@ -56,9 +63,12 @@ void DoAcquisition125k(void) } if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY) { dest[i] = (uint8_t)AT91C_BASE_SSC->SSC_RHR; - i++; LED_D_OFF(); - if (i >= n) break; + if (trigger_threshold != -1 && dest[i] < trigger_threshold) + continue; + else + trigger_threshold = -1; + if (++i >= n) break; } } Dbprintf("buffer samples: %02x %02x %02x %02x %02x %02x %02x %02x ...", @@ -85,7 +95,7 @@ void ModThenAcquireRawAdcSamples125k(int delay_off, int period_0, int period_1, else FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Give it a bit of time for the resonant antenna to settle. SpinDelay(50); @@ -105,7 +115,7 @@ void ModThenAcquireRawAdcSamples125k(int delay_off, int period_0, int period_1, else FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); LED_D_ON(); if(*(command++) == '0') SpinDelayUs(period_0); @@ -120,10 +130,10 @@ void ModThenAcquireRawAdcSamples125k(int delay_off, int period_0, int period_1, else FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // now do the read - DoAcquisition125k(); + DoAcquisition125k(-1); } /* blank r/w tag data stream @@ -609,7 +619,7 @@ void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol) FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Connect the A/D to the peak-detected low-frequency path. SetAdcMuxFor(GPIO_MUXSEL_LOPKD); @@ -823,7 +833,7 @@ void CmdIOdemodFSK(int findone, int *high, int *low, int ledcontrol) FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Connect the A/D to the peak-detected low-frequency path. SetAdcMuxFor(GPIO_MUXSEL_LOPKD); @@ -1141,7 +1151,7 @@ void T55xxWriteBit(int bit) { FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); if (bit == 0) SpinDelayUs(WRITE_0); else @@ -1157,7 +1167,7 @@ void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMod FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Give it a bit of time for the resonant antenna to settle. // And for the tag to fully power up @@ -1189,7 +1199,7 @@ void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMod // Now perform write (nominal is 5.6 ms for T55x7 and 18ms for E5550, // so wait a little more) FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); SpinDelay(20); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); } @@ -1211,7 +1221,7 @@ void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) LED_D_ON(); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Give it a bit of time for the resonant antenna to settle. // And for the tag to fully power up @@ -1237,7 +1247,7 @@ void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) // Turn field on to read the response FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Now do the acquisition i = 0; @@ -1276,7 +1286,7 @@ void T55xxReadTrace(void){ LED_D_ON(); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Give it a bit of time for the resonant antenna to settle. // And for the tag to fully power up @@ -1292,7 +1302,7 @@ void T55xxReadTrace(void){ // Turn field on to read the response FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Now do the acquisition i = 0; @@ -1983,7 +1993,7 @@ void SendForward(uint8_t fwd_bit_count) { //Field on FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Give it a bit of time for the resonant antenna to settle. // And for the tag to fully power up @@ -1995,7 +2005,7 @@ void SendForward(uint8_t fwd_bit_count) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); // field off SpinDelayUs(55*8); //55 cycles off (8us each)for 4305 FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER);//field on + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);//field on SpinDelayUs(16*8); //16 cycles on (8us each) // now start writting @@ -2007,7 +2017,7 @@ void SendForward(uint8_t fwd_bit_count) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); // field off SpinDelayUs(23*8); //16-4 cycles off (8us each) FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER);//field on + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);//field on SpinDelayUs(9*8); //16 cycles on (8us each) } } diff --git a/client/cmdlf.c b/client/cmdlf.c index 387e60d5..22aa1e05 100644 --- a/client/cmdlf.c +++ b/client/cmdlf.c @@ -450,6 +450,28 @@ int CmdLFSimManchester(const char *Cmd) return 0; } +int CmdLFSnoop(const char *Cmd) +{ + UsbCommand c = {CMD_LF_SNOOP_RAW_ADC_SAMPLES}; + // 'h' means higher-low-frequency, 134 kHz + c.arg[0] = 0; + c.arg[1] = -1; + if (*Cmd == 0) { + // empty + } else if (*Cmd == 'l') { + sscanf(Cmd, "l %"lli, &c.arg[1]); + } else if(*Cmd == 'h') { + c.arg[0] = 1; + sscanf(Cmd, "h %"lli, &c.arg[1]); + } else if (sscanf(Cmd, "%"lli" %"lli, &c.arg[0], &c.arg[1]) < 1) { + PrintAndLog("use 'snoop' or 'snoop {l,h} [trigger threshold]', or 'snoop [trigger threshold]'"); + return 0; + } + SendCommand(&c); + WaitForResponse(CMD_ACK,NULL); + return 0; +} + int CmdVchDemod(const char *Cmd) { // Is this the entire sync pattern, or does this also include some @@ -540,6 +562,7 @@ static command_t CommandTable[] = {"sim", CmdLFSim, 0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"}, {"simbidir", CmdLFSimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"}, {"simman", CmdLFSimManchester, 0, " [GAP] Simulate arbitrary Manchester LF tag"}, + {"snoop", CmdLFSnoop, 0, "['l'|'h'|] [trigger threshold]-- Snoop LF (l:125khz, h:134khz)"}, {"ti", CmdLFTI, 1, "{ TI RFIDs... }"}, {"hitag", CmdLFHitag, 1, "{ Hitag tags and transponders... }"}, {"vchdemod", CmdVchDemod, 1, "['clone'] -- Demodulate samples for VeriChip"}, diff --git a/client/cmdlf.h b/client/cmdlf.h index 471e4e0c..7278754b 100644 --- a/client/cmdlf.h +++ b/client/cmdlf.h @@ -21,6 +21,7 @@ int CmdLFRead(const char *Cmd); int CmdLFSim(const char *Cmd); int CmdLFSimBidir(const char *Cmd); int CmdLFSimManchester(const char *Cmd); +int CmdLFSnoop(const char *Cmd); int CmdVchDemod(const char *Cmd); #endif diff --git a/fpga/fpga_lf.bit b/fpga/fpga_lf.bit index 133ea9924b546523b0128737e5082cc723406319..d9c7515ea737c6ae3bcddf7d21fc3c9ed2220795 100644 GIT binary patch delta 7464 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 delta 7393 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 diff --git a/fpga/fpga_lf.v b/fpga/fpga_lf.v index 1e20aa90..81976375 100644 --- a/fpga/fpga_lf.v +++ b/fpga/fpga_lf.v @@ -80,7 +80,7 @@ lo_read lr( lr_pwr_lo, lr_pwr_hi, lr_pwr_oe1, lr_pwr_oe2, lr_pwr_oe3, lr_pwr_oe4, adc_d, lr_adc_clk, lr_ssp_frame, lr_ssp_din, lr_ssp_clk, - lr_dbg + lr_dbg, lf_field ); lo_passthru lp( diff --git a/fpga/lo_read.v b/fpga/lo_read.v index b1fa7fc7..a6d077b9 100644 --- a/fpga/lo_read.v +++ b/fpga/lo_read.v @@ -13,7 +13,8 @@ module lo_read( output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, input [7:0] adc_d, output adc_clk, output ssp_frame, output ssp_din, output ssp_clk, - output dbg + output dbg, + input lf_field ); reg [7:0] to_arm_shiftreg; @@ -65,7 +66,7 @@ assign pwr_oe2 = 1'b0; assign pwr_oe3 = 1'b0; assign pwr_oe4 = 1'b0; // this is the antenna driver signal -assign pwr_lo = pck_divclk; +assign pwr_lo = lf_field & pck_divclk; // ADC clock out of phase with antenna driver assign adc_clk = ~pck_divclk; // ADC clock also routed to debug pin diff --git a/include/usb_cmd.h b/include/usb_cmd.h index 9c25555d..4b1fc2b6 100644 --- a/include/usb_cmd.h +++ b/include/usb_cmd.h @@ -96,6 +96,7 @@ typedef struct { #define CMD_ISO_15693_COMMAND_DONE 0x0314 #define CMD_ISO_15693_FIND_AFI 0x0315 #define CMD_ISO_15693_DEBUG 0x0316 +#define CMD_LF_SNOOP_RAW_ADC_SAMPLES 0x0317 // For Hitag2 transponders #define CMD_SNOOP_HITAG 0x0370 -- 2.39.2