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 b7bc87e70..8c224b6a1 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 76d1247a9..4c7fa1900 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 a0fa870b6..6b131c261 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(); +} - // Now call the acquisition routine - DoAcquisition125k(); +void AcquireRawAdcSamples125k(int divisor) +{ + LFSetupFPGAForADC(divisor, true); + DoAcquisition125k(-1); +} + +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 387e60d58..22aa1e059 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 471e4e0cb..7278754b8 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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�*4~=4hE&kUxJi5G(f5K5o5t*c_u05%?w(TZJ3mp8muNKFe$Kb z{PoyAxrIrQ@z>-uP8FsDdXvutD=}T*nfxJGk$G!_?qrb=<;mvEZj3)B+i@vRR!mZ1 z+%~z5ONFsva(0p%(}#q~#w^Mp!y;Iem>iTQ*MurD3204T5DFSAJ;I{M{7b=Vaz?WL zWbrUD=D!R^lMPsv8I>l7uqv`{W=L?5o?OMMz{CP7>6Dl{j3zhmC^COk*f;qJs}hrk z(c}|6ip={M7ERV+Q#MpN;BCNwtyhRt1*w91VX$7|B8)#Lv+*ml|ADjxHWx(xXPf*!mvi!uAbB>81JVXek0#6JNwTqlhHted|KX5l z{Uh>&1r)1FOcTr}x8y0XD16|so2-$jz^q{1F!?l-GE)Q3>ZFSJXtbdmeF9c zIkO_O!+(Lv(aZ|W?-)8J+i@ugG@y;4PTr6&%GA;{xt&XqnW%%Rc- z;Rg*r6ed4sQD8Z;;IGDHZdQ3V#%~H|88%JckgPEIf{;3^f`hjJ+vFN+d)6lmCr^M9 zi#*E_rk@IvAG0d5H2g>ar5AbDpA7ptlqT!2$+Mnj*nMEZWC31zp_>ewAyp47ZE#Fx z^b%qI-e5R+2Ae$Ni^&zds*L+5-(yo`x$Cf9VKOtj64O?u$>JJ!xD}W;vM=b+t*M4R=KY1IwBFlS*&I6NY^C_@AVdy?E`9He?4zK|;~_>N)s1aK+;0Ww5&VzPse`($?}aia%d ztB*iRb=1K{NK*O3@LvHuehzImx=g;{qda+Yp2+0tG|tHvn6y(qAdd*b$Huoo2Fd?G z8qppcJPpV_ zpfNgSMy<&USd^GF6eb@DRc5tf@NW>F{Dwt)vUr&6K*U2$m2$AP64xWnf@pRA}%}5aM8I0x=Z9 zjDm)U$v^637{exu)+_S}Gl(2uEnx6r2xkbL>{4&T%Elqs#4@?HUYbIG8|;1q>P> zMk82+0qQbW2gU@(2!=2Q(FRr!qinKigB~OAi*a2d&xG@TLxFiTlw74k>!qqUi1_*|TgffacfEX+whGT$W2#7H` zp;4NJL(z$2a($z-7LSi`Fk{OBQv+THsM8rZSc({98p0JsPq2a*?h2wO*ozotCckO? zq#`4r&cb<+slZ{5fVv3h0hksR)U8=cG83kI&@vB@qCLqI)<1 delta 7393 zcmdmgl4<`*rU}-3hL#K|44g)WRz{{)CPouIH!})M{JV^gg@I9l!G}SZf#CoHgZ|`= zj4F(bldmzVFe*&`&8W<1Fj<~yDWmk{qf8krOg0C&CmS+nurTQ!;F~;`*@=;H@&Ya& zM!wB&RcA6zKE@h9`6-XtWN8iA$rWsplLL9pCbw(IPF}+6FPb27hG8><&H-)%rZWti zSs;wb9_(^#bqDx2Fu$3c!>%~lSF>{RF+Q!y1{{KuefhX2^YDu@GHre&`iPDDUxWPv z-WSYv4*wTSKF=uY!?8$-uVMcMy$9Som>#egFfcGMbg&{>v4KJ70H;D156sd>j0GSy z2SnE}>}JqAz`cR#4Z{uwy#pNzOgfW)aL91{V6Z#DyMS3|atxDnD97Ik_6PVMF#loL z&0v3k{{!<6h6Ipy2Z1#VzZvYnE@t?_V0WT_f$$rq(+rzHA{ST`Kx$5~>L6L+qH}?J z0n;0Xeg>ta8U~_=qfcXr=Cx)6M{0hux7!ETSfJ81afs`;f$nIhI4{_cfhJOt9NBAEy|8e*) zFgco8lIMeh(E;L$iS50qz2(ODtd?9blNpu)RSS zWc59UeIPevFv&5rPXIgS0|VGc9>{UGX@bH5ZUrtLum|2SOK}-B@IPSIU^>OHX|e!| z6ze_){s!jB`Yf_~zZV!~^iL3e!f=wo&Vhdd^C3tyHL#>G>}1e$;GV$rgkfWYQUZv< z)H%6|MTTP$Nc0Fp=j3@TGCB$l+#*az7#bCH9JmFT4l#l~y@NLa6!0KR9x(i1GXgOl zI-HpNj75&Ue**IphMxkHxml&T>_IkytTvkbfm?C%#bhCBfFy?%9C8fb8*Cr&S1{jW_|jmzfWLy-zUgp-AxPvEBsp-%BBxCS zy94|N+;12BW|+KNQHE2Y=TGxLj{gnzlOHHbvpR4UFx{ENF2lNoLAQZp@>>q~v5DWe={9&-&{8;oMTm8Ql`x87B%%u#+8#X8K{9rDCW@v$T z47(e^#lSm;T`l^jICe0Z9q8szO6u6bqyUM76UYU_CI+1|90p7&4c!VWTsSr`B{72i zfKo8*X3#mHv4cs4p<6-2fnx)c0ZT$X$Ym~~Z;-P81G@t{JD5`#PCHmR=ol~uuz*w6 z14cxyvw>TM;WUGhgU$wKXfbjCxft2az@vYFL)1w` zp^3rVfn)MHCb95M4mt-oY?#>iR4`#H zUN#@lIl!ULbcCV##4-mCL#9iRLgNMN3Wi?{b`AUsm|rmb6R>O0dBXgI;hck6gU$-( zUn~jfpy=^ncz~228EhE!8-zh3R-pWNi2)qX91KqwenN6Fh+*WwGlBUD(@7>f5Cdxo z#boASF^lOLLnnit1IOe#7IAI|B?pZiLdO`o8T2MA=t|YA1aJs29bsy8(DC5FQBW}$ zFlaO|KXf?2U?ZZ_!2FI`0Oa5qk{~xg%a*@Pb^-hsn7^|8XW)0?zrg&A9USfwf=FsW z<&VwaV3=&eCdi$ja6rR=DTkq%L1l7)jYR1F29*OGPncvU^f#!!kSJinR%CwfFnq-k z!5nw!_=)X5bSjv!6`8*i>~82AFu!s5oM3fpaxJfT{kI0=M?626|1q3zG=9MIgZTgh zIESwgoWro4K^Ihs-eK6zpm{(ef$5GzKZD`{jsm7vkZP5I0ZGk%2E_v!0ZeBY+BuXD za1=BhfK;mr$kpm*2CV}eCZKjfgTet03#Jn+29tx?1+{)L7$4x-!~BNfc!Ti)o*m3k z^BWkDN}}H>b_e*kf=Xzke<0--n(r{2=P(8p;m{Jgfh7mrCgB7%dp0MS9pKm_^p2sM zLFoX;X?By z2T>yaW-vU!GlBUJ%Xx;)2Y3+Wx#S;kJB1fi)Pox=7nngJwxEX93$_9VhRvnQm)N)- z@JBEUF`R8MJ~8>Cxs*Pr+Ry>JQ3HDu589m6167_EI3`OmNpntO(&K1s0Qu@4hb$W( z1E^&-InhEQl*9gD{|DwjO#eYO4c6uyBeY$o!El>l(*quOIgHYr+x-Asx#=);vnW5% zoqUc-ocn;z0qzZKJPeZ=lqMHw%j*7MvT|u}Q2fG)rL<)RHBiBgIv$7H3I+#xCR;Jf zFmwNLm>kJ09rhaJwh7ES3?~^j9nsmq{0frXJdl!`05sjnF!VDhzW^7r;6ehW6$fh0 zNmnr0ftr*rI3}NBmgbb;(qd>7cyxec@;WXVwq`4aQw_$G1>|K|`5TxYc}+HCkug*N z4N8Rfa|frGUwbx-z-~;4)=_ z7tVsvj)9+nS%K*UgAs?$ByM!8DLdu%93s=P*BI_;~;nCd^n%FabMIrJ}%agV7jNlwm8u_66uQ zaIfG3wf2-7I3Oh$1H)u9MSh+JorByKOgs#e8x$HQ2ii#KAK)%%vSDa-l3{3NPzKon zEk{twsqLUPrvsCKLJxyt0!IPU0j%Ye$^q^ME=G<91_cKW15i1|z%V&fNuZv==m7r) zZas$63pO?IY`|Vnfl~Me<~I$$K~?z%<_C~EnNa{#9DrL&e;EEY7=wCV1`OvI>>YSM zFhff)P#Y88aoa6mc7XczQ8E2`HW#VgA%UpDzq#+!mwFE zVX_31JnJ)soeWBo|8U5&K4JLHuxWAvlZ=M{2j(vf{{_GSg{?yhEy12lUc#iz_-OJ8 zCS{f*4!c<Cr^`5 zWIo2Qa2@)IGvY&r6O)heC^ElNST*?- zk1|s;%Vd6Dc~+-849f*38}lkL9p5lHoL8RJ`EAp0hso8v3M}^-&NofI&nBl?$aKe{ zT|oB;H}=XKTH=0TXrKIySCQo`L-T~m+ViyZqGNXvP0pNA~#ABK|*W|KE~DC*o`P(p6GyFwc5+yYE+#uJ7{ z1{F|dxiq9#O zXr6q|Q&H#xL%RUD6$_1|6%3OZQ$?7LFPJRuC9frXg5fu~=g)kI2^^LVtp6DPH-J+k zoN?>G`2)t27ih?9-f-w=1dmuiD;5Fd1~4=a{Q-3jC%@2;=Q_azYHD&DFx{9e$S1{m zlHokVrpX_?PEd;l3@nSfk1fZL9s#v7=8$^U`*po_xf{lyZjufR!g4xc>h zD~8z&N|PJBG!@&*i=Qfy44vqXSAC9pU;3%d2>PJe>UxR z_^Ub%P`sRB*r1?rKzgzilRWb-a8)P8Wd(})Hw-@vj3y^A$+Ns+00*oR^J5O9$r_0Y z94xmPln!ujaGHF9NtSs5D14a|)u(_4EioF~+@OI|P)P$GL4Cvk4t=J7putfE=06NO zC)Y76GTxiKAVigEd(-6O%%H$}9pc8cgJbe%E@dVMqscQQl$ahUO}61yU}4$Fpfovw zTY*JkqsD^CE!+w$4L=l&Ccg;PpM0HLg!S2iN(Q^h8&ZErOIr%k@lHi68ode7UOs62@HVYVKCijI%O}5~bW%|}JIh@y( znZphgT_Beo<~0#9hLq@_E(B!soME%WWNtnsrXLR`>+>lw{p6S&%m<3?*?dZjyC&~* znYfu>>;ns<@Z<*GTtCD?d3ufm8JZWMJR~>lp!P`vb{vQ0#CU zFnyXlH$jq(=?y4GC)+T|v;JZDxxi?$f{M~)CT-ct@`L2f@&&68Yz!W5`niTp9$-KGg82QzWE)@O$?Fr@`6a-;BlrOK*_%u?12eJeYizS(fq0ldZXx85JhaXHj4|vtXmfZehk1 zlR3kbSg$qwWiXmt;IFKOQYvHgIRu!FGHhl@fR)PP9MTh*p0MuZ01Yb3=?gz$_<6v{ zfqw!sw9|nyYyz!#o-llzun(l>*5sG0(ku!m6gEvh!6VQ5i=mG}Y4RH$dDc@*lO0qh z3-HRb-cp#(pgP%vSCRRCgX!cMMRIJ)Zx~)OSWT|ckZ1YCz&~N~d<})53k~fC;Lw5= z%xEosu+$X>XpIYP@xvx-m?1rXa8y0vXq*6MfQxLF7fh!eChPMlFus^PAwrq?9mDy_ z+lm!go-uSbOqLE(V0qBc-7xuov4Y?^hUP}FKIn)+!{iNVGK>!$^a3+u z(q@~ADrQF3$=j>%FfvS@QlrSs!P+!=M@$)fejJmCx?2UrRiVi>|1L?^q{+pxNE2zH4~ZmpN+2;mWRVstndFnLYACb;ec zRUsS4AsR1u|loo70YY}5iL%4$I3DzP888Cyrh%sjJo5oKna|F~`I1e%vILr}H zm*G4BQVzl_tc8p*4&ef#M_3CPCo?r0FmtdpOs;JP)s*4Qpe$D1oWm$M`9*WwWS(x$ z$qp0PCWp3&PCnJnzqzvIBQvAJ=IjnLCPt>od3}nT4|jPmGBQl&>5-ZIpqq2DVUP4= p{%$rla6gk_@`oA^`Oxym9~l diff --git a/fpga/fpga_lf.v b/fpga/fpga_lf.v index 1e20aa903..819763759 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 b1fa7fc70..a6d077b99 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 9c25555df..4b1fc2b68 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