X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/1c8fbeb93e82f6aafb885b57b9afbfadcf85c171..e069d740e376914c9d639630e04898e28918f1ff:/armsrc/lfsampling.c diff --git a/armsrc/lfsampling.c b/armsrc/lfsampling.c index 83579cca..02c0cd4a 100644 --- a/armsrc/lfsampling.c +++ b/armsrc/lfsampling.c @@ -6,17 +6,11 @@ // Miscellaneous routines for low frequency sampling. //----------------------------------------------------------------------------- -#include "proxmark3.h" -#include "apps.h" -#include "util.h" -#include "string.h" - #include "lfsampling.h" sample_config config = { 1, 8, 1, 95, 0 } ; -void printConfig() -{ +void printConfig() { Dbprintf("LF Sampling config: "); Dbprintf(" [q] divisor: %d ", config.divisor); Dbprintf(" [b] bps: %d ", config.bits_per_sample); @@ -37,38 +31,35 @@ void printConfig() * @brief setSamplingConfig * @param sc */ -void setSamplingConfig(sample_config *sc) -{ +void setSamplingConfig(sample_config *sc) { if(sc->divisor != 0) config.divisor = sc->divisor; - if(sc->bits_per_sample!= 0) config.bits_per_sample= sc->bits_per_sample; - if(sc->decimation!= 0) config.decimation= sc->decimation; - if(sc->trigger_threshold != -1) config.trigger_threshold= sc->trigger_threshold; + if(sc->bits_per_sample != 0) config.bits_per_sample = sc->bits_per_sample; + if(sc->decimation != 0) config.decimation = sc->decimation; + if(sc->trigger_threshold != -1) config.trigger_threshold = sc->trigger_threshold; - config.averaging= sc->averaging; + config.averaging = sc->averaging; if(config.bits_per_sample > 8) config.bits_per_sample = 8; if(config.decimation < 1) config.decimation = 1; printConfig(); } -sample_config* getSamplingConfig() -{ +sample_config* getSamplingConfig() { return &config; } -typedef struct { +struct BitstreamOut { uint8_t * buffer; uint32_t numbits; uint32_t position; -} BitstreamOut; +}; /** * @brief Pushes bit onto the stream * @param stream * @param bit */ -void pushBit( BitstreamOut* stream, uint8_t bit) -{ +void pushBit( BitstreamOut* stream, uint8_t bit) { int bytepos = stream->position >> 3; // divide by 8 int bitpos = stream->position & 7; *(stream->buffer+bytepos) |= (bit > 0) << (7 - bitpos); @@ -83,8 +74,7 @@ void pushBit( BitstreamOut* stream, uint8_t bit) * 0 or 95 ==> 125 KHz * **/ -void LFSetupFPGAForADC(int divisor, bool lf_field) -{ +void LFSetupFPGAForADC(int divisor, bool lf_field) { FpgaDownloadAndGo(FPGA_BITSTREAM_LF); if ( (divisor == 1) || (divisor < 0) || (divisor > 255) ) FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 88); //134.8Khz @@ -97,13 +87,14 @@ void LFSetupFPGAForADC(int divisor, bool lf_field) // 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. + // 50ms 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(); + // start a 1.5ticks is 1us + StartTicks(); } - /** * Does the sample acquisition. If threshold is specified, the actual sampling * is not commenced until the threshold has been reached. @@ -119,13 +110,12 @@ void LFSetupFPGAForADC(int divisor, bool lf_field) * @param silent - is true, now outputs are made. If false, dbprints the status * @return the number of bits occupied by the samples. */ -uint32_t DoAcquisition(uint8_t decimation, uint32_t bits_per_sample, bool averaging, int trigger_threshold,bool silent) -{ +uint32_t DoAcquisition(uint8_t decimation, uint32_t bits_per_sample, bool averaging, int trigger_threshold,bool silent) { //bigbuf, to hold the aquired raw data signal uint8_t *dest = BigBuf_get_addr(); uint16_t bufsize = BigBuf_max_traceLen(); - BigBuf_Clear_ext(false); + //BigBuf_Clear_ext(false); //creates issues with cmdread (marshmellow) if(bits_per_sample < 1) bits_per_sample = 1; if(bits_per_sample > 8) bits_per_sample = 8; @@ -141,7 +131,7 @@ uint32_t DoAcquisition(uint8_t decimation, uint32_t bits_per_sample, bool averag uint32_t sample_total_numbers =0 ; uint32_t sample_total_saved =0 ; - while(!BUTTON_PRESS()) { + while(!BUTTON_PRESS() && !usb_poll_validate_length() ) { WDT_HIT(); if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) { AT91C_BASE_SSC->SSC_THR = 0x43; @@ -211,12 +201,10 @@ uint32_t DoAcquisition(uint8_t decimation, uint32_t bits_per_sample, bool averag * @param silent * @return number of bits sampled */ -uint32_t DoAcquisition_default(int trigger_threshold, bool silent) -{ +uint32_t DoAcquisition_default(int trigger_threshold, bool silent) { return DoAcquisition(1,8,0,trigger_threshold,silent); } -uint32_t DoAcquisition_config( bool silent) -{ +uint32_t DoAcquisition_config( bool silent) { return DoAcquisition(config.decimation ,config.bits_per_sample ,config.averaging @@ -224,11 +212,10 @@ uint32_t DoAcquisition_config( bool silent) ,silent); } -uint32_t ReadLF(bool activeField, bool silent) -{ - if (!silent) printConfig(); +uint32_t ReadLF(bool activeField, bool silent) { + if (!silent) + printConfig(); LFSetupFPGAForADC(config.divisor, activeField); - // Now call the acquisition routine return DoAcquisition_config(silent); } @@ -236,8 +223,7 @@ uint32_t ReadLF(bool activeField, bool silent) * Initializes the FPGA for reader-mode (field on), and acquires the samples. * @return number of bits sampled **/ -uint32_t SampleLF(bool printCfg) -{ +uint32_t SampleLF(bool printCfg) { return ReadLF(true, printCfg); } /** @@ -252,53 +238,64 @@ uint32_t SnoopLF() { * acquisition of T55x7 LF signal. Similart to other LF, but adjusted with @marshmellows thresholds * the data is collected in BigBuf. **/ -void doT55x7Acquisition(void){ - - #define T55xx_SAMPLES_SIZE 12000 // 32 x 32 x 10 (32 bit times numofblock (7), times clock skip..) - #define T55xx_UPPER_THRESHOLD 128+40 // 50 - #define T55xx_READ_TOL 5 - #define T55xx_LOWER_THRESHOLD 128-40 //-50 +void doT55x7Acquisition(size_t sample_size) { + #define T55xx_READ_UPPER_THRESHOLD 128+40 // 60 grph + #define T55xx_READ_LOWER_THRESHOLD 128-40 // -60 grph + #define T55xx_READ_TOL 2 + uint8_t *dest = BigBuf_get_addr(); uint16_t bufsize = BigBuf_max_traceLen(); - if ( bufsize > T55xx_SAMPLES_SIZE ) - bufsize = T55xx_SAMPLES_SIZE; + if ( bufsize > sample_size ) + bufsize = sample_size; - uint16_t i = 0; + uint8_t curSample = 0, lastSample = 0; + uint16_t i = 0, skipCnt = 0; bool startFound = false; bool highFound = false; - uint8_t sample = 0; - uint8_t firstSample = 0; - while(!BUTTON_PRESS()) { + bool lowFound = false; + + while(!BUTTON_PRESS() && !usb_poll_validate_length() && skipCnt < 1000 && (i < bufsize) ) { WDT_HIT(); if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) { - AT91C_BASE_SSC->SSC_THR = 0x00; + AT91C_BASE_SSC->SSC_THR = 0x43; //43 LED_D_ON(); } if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY) { - sample = (uint8_t)AT91C_BASE_SSC->SSC_RHR; + curSample = (uint8_t)AT91C_BASE_SSC->SSC_RHR; LED_D_OFF(); - // find first high sample - if (!startFound && sample > T55xx_UPPER_THRESHOLD) { - if (sample > firstSample) - firstSample = sample; - highFound = TRUE; + // skip until the first high sample above threshold + if (!startFound && curSample > T55xx_READ_UPPER_THRESHOLD) { + //if (curSample > lastSample) + // lastSample = curSample; + highFound = true; } else if (!highFound) { + skipCnt++; + continue; + } + // skip until the first low sample below threshold + if (!startFound && curSample < T55xx_READ_LOWER_THRESHOLD) { + //if (curSample > lastSample) + lastSample = curSample; + lowFound = true; + } else if (!lowFound) { + skipCnt++; continue; } - // skip until samples begin to change - if (startFound || sample < firstSample - T55xx_READ_TOL){ - if (!startFound) - dest[i++] = firstSample; - startFound = TRUE; - dest[i++] = sample; - - // exit condition. - if (i >= bufsize) break; + // skip until first high samples begin to change + if (startFound || curSample > T55xx_READ_LOWER_THRESHOLD + T55xx_READ_TOL){ + // if just found start - recover last sample + if (!startFound) { + dest[i++] = lastSample; + startFound = true; + } + // collect samples + dest[i++] = curSample; } } } -} \ No newline at end of file +} + \ No newline at end of file