]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
Merged with master 54/head
authorMartin Holst Swende <martin@swende.se>
Sat, 31 Jan 2015 17:21:38 +0000 (18:21 +0100)
committerMartin Holst Swende <martin@swende.se>
Sat, 31 Jan 2015 17:21:38 +0000 (18:21 +0100)
1  2 
armsrc/Makefile
armsrc/appmain.c
armsrc/apps.h
armsrc/lfops.c
armsrc/lfsampling.c
client/cmddata.c
client/cmdlf.c
client/graph.h

diff --combined armsrc/Makefile
index 4e460623ff0fa0f0ec642a308c04722ab279ed35,bbcbcb1c4263819f861abb13acf465456d90bba7..fb693006f0162d695fa403ec2cc49fc263019c64
@@@ -10,15 -10,16 +10,16 @@@ APP_INCLUDES = apps.
  
  #remove one of the following defines and comment out the relevant line
  #in the next section to remove that particular feature from compilation  
- APP_CFLAGS    = -DWITH_LF -DWITH_ISO15693 -DWITH_ISO14443a -DWITH_ISO14443b -DWITH_ICLASS -DWITH_LEGICRF -DWITH_HITAG -fno-strict-aliasing
+ APP_CFLAGS    = -DWITH_LF -DWITH_ISO15693 -DWITH_ISO14443a -DWITH_ISO14443b -DWITH_ICLASS -DWITH_LEGICRF -DWITH_HITAG  -DWITH_CRC -fno-strict-aliasing
  #-DWITH_LCD 
  
  #SRC_LCD = fonts.c LCD.c
 -SRC_LF = lfops.c hitag2.c
 +SRC_LF = lfops.c hitag2.c lfsampling.c
  SRC_ISO15693 = iso15693.c iso15693tools.c 
  SRC_ISO14443a = epa.c iso14443a.c mifareutil.c mifarecmd.c mifaresniff.c
  SRC_ISO14443b = iso14443.c
- SRC_CRAPTO1 = crapto1.c crypto1.c
+ SRC_CRAPTO1 = crapto1.c crypto1.c des.c aes.c 
+ SRC_CRC = iso14443crc.c crc.c crc16.c crc32.c 
  
  THUMBSRC = start.c \
        $(SRC_LCD) \
  # These are to be compiled in ARM mode
  ARMSRC = fpgaloader.c \
        legicrf.c \
-       iso14443crc.c \
-       crc16.c \
        lfdemod.c \
        $(SRC_ISO14443a) \
        $(SRC_ISO14443b) \
        $(SRC_CRAPTO1) \
+       $(SRC_CRC) \
        legic_prng.c \
        iclass.c \
-       crc.c
+       BigBuf.c \
  
  # stdint.h provided locally until GCC 4.5 becomes C99 compliant
  APP_CFLAGS += -I.
diff --combined armsrc/appmain.c
index 32b7e5924ad5e74edd1cab73ac4fd259feba64af,791ad4f861bcdb64e5003fdfe17087b66cb47502..cb1b9f73fee185ddf706e2e6720a348bb517799d
@@@ -23,7 -23,7 +23,7 @@@
  
  #include "legicrf.h"
  #include <hitag2.h>
 -
 +#include "lfsampling.h"
  #ifdef WITH_LCD
   #include "LCD.h"
  #endif
@@@ -42,12 -42,6 +42,6 @@@ int ToSendMax
  static int ToSendBit;
  struct common_area common_area __attribute__((section(".commonarea")));
  
- void BufferClear(void)
- {
-       memset(BigBuf,0,sizeof(BigBuf));
-       Dbprintf("Buffer cleared (%i bytes)",sizeof(BigBuf));
- }
  void ToSendReset(void)
  {
        ToSendMax = -1;
@@@ -246,7 -240,10 +240,10 @@@ void MeasureAntennaTuningHf(void
  
  void SimulateTagHfListen(void)
  {
-       uint8_t *dest = (uint8_t *)BigBuf+FREE_BUFFER_OFFSET;
+       // ToDo: historically this used the free buffer, which was 2744 Bytes long. 
+       // There might be a better size to be defined:
+       #define HF_14B_SNOOP_BUFFER_SIZE 2744
+       uint8_t *dest = BigBuf_malloc(HF_14B_SNOOP_BUFFER_SIZE);
        uint8_t v = 0;
        int i;
        int p = 0;
                                p = 0;
                                i++;
  
-                               if(i >= FREE_BUFFER_SIZE) {
+                               if(i >= HF_14B_SNOOP_BUFFER_SIZE) {
                                        break;
                                }
                        }
@@@ -629,17 -626,16 +626,17 @@@ void UsbPacketReceived(uint8_t *packet
    
        switch(c->cmd) {
  #ifdef WITH_LF
 +              case CMD_SET_LF_SAMPLING_CONFIG:
 +                      setSamplingConfig((sample_config *) c->d.asBytes);
 +                      break;
                case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K:
 -                      AcquireRawAdcSamples125k(c->arg[0]);
 -                      cmd_send(CMD_ACK,0,0,0,0,0);
 +                      cmd_send(CMD_ACK,SampleLF(),0,0,0,0);
                        break;
                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);
 +                      cmd_send(CMD_ACK,SnoopLF(),0,0,0,0);
                        break;
                case CMD_HID_DEMOD_FSK:
                        CmdHIDdemodFSK(c->arg[0], 0, 0, 1);
                case CMD_MIFAREU_READBL:
                        MifareUReadBlock(c->arg[0],c->d.asBytes);
                        break;
+               case CMD_MIFAREUC_AUTH1:
+                       MifareUC_Auth1(c->arg[0],c->d.asBytes);
+                       break;
+               case CMD_MIFAREUC_AUTH2:
+                       MifareUC_Auth2(c->arg[0],c->d.asBytes);
+                       break;
                case CMD_MIFAREU_READCARD:
                        MifareUReadCard(c->arg[0], c->arg[1], c->d.asBytes);
-                         break;
+                       break;
+               case CMD_MIFAREUC_READCARD:
+                       MifareUReadCard(c->arg[0], c->arg[1], c->d.asBytes);
+                       break;
                case CMD_MIFARE_READSC:
                        MifareReadSector(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
                        break;
                case CMD_MIFARE_SNIFFER:
                        SniffMifare(c->arg[0]);
                        break;
  #endif
  
  #ifdef WITH_ICLASS
                        break;
  
                case CMD_BUFF_CLEAR:
-                       BufferClear();
+                       BigBuf_Clear();
                        break;
  
                case CMD_MEASURE_ANTENNA_TUNING:
                case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K:
  
                        LED_B_ON();
+                       uint8_t *BigBuf = BigBuf_get_addr();
                        for(size_t i=0; i<c->arg[1]; i += USB_CMD_DATA_SIZE) {
                                size_t len = MIN((c->arg[1] - i),USB_CMD_DATA_SIZE);
-                               cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K,i,len,0,((byte_t*)BigBuf)+c->arg[0]+i,len);
+                               cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K,i,len,traceLen,BigBuf+c->arg[0]+i,len);
                        }
                        // Trigger a finish downloading signal with an ACK frame
-                       // We put a 1 in arg[0] to alert the host we're also sending sample_config
-                       cmd_send(CMD_ACK,1,0,0,getSamplingConfig(),sizeof(sample_config));
 -                      cmd_send(CMD_ACK,0,0,traceLen,0,0);
++                      cmd_send(CMD_ACK,1,0,traceLen,getSamplingConfig(),sizeof(sample_config));
                        LED_B_OFF();
                        break;
  
                case CMD_DOWNLOADED_SIM_SAMPLES_125K: {
-                       uint8_t *b = (uint8_t *)BigBuf;
+                       uint8_t *b = BigBuf_get_addr();
                        memcpy(b+c->arg[0], c->d.asBytes, USB_CMD_DATA_SIZE);
                        cmd_send(CMD_ACK,0,0,0,0,0);
                        break;
diff --combined armsrc/apps.h
index 89440bfecedd288634b1d1504c62c85e42226c4e,5ef876232ceb2230596e93e7428f8507866ca765..58a2a62196bd0cb2b96fe2259d7e962c8527ec77
  #include "common.h"
  #include "hitag2.h"
  #include "mifare.h"
- // The large multi-purpose buffer, typically used to hold A/D samples,
- // maybe processed in some way.
- #define BIGBUF_SIZE                           40000
- uint32_t BigBuf[BIGBUF_SIZE / sizeof(uint32_t)];
- #define TRACE_OFFSET                  0
- #define TRACE_SIZE                            3000
- #define RECV_CMD_OFFSET                       (TRACE_OFFSET + TRACE_SIZE)
- #define MAX_FRAME_SIZE                        256
- #define MAX_PARITY_SIZE                       ((MAX_FRAME_SIZE + 1)/ 8)
- #define RECV_CMD_PAR_OFFSET           (RECV_CMD_OFFSET + MAX_FRAME_SIZE)
- #define RECV_RESP_OFFSET              (RECV_CMD_PAR_OFFSET + MAX_PARITY_SIZE)
- #define RECV_RESP_PAR_OFFSET  (RECV_RESP_OFFSET + MAX_FRAME_SIZE)
- #define CARD_MEMORY_OFFSET            (RECV_RESP_PAR_OFFSET + MAX_PARITY_SIZE)
- #define CARD_MEMORY_SIZE              4096    
- #define DMA_BUFFER_OFFSET             CARD_MEMORY_OFFSET
- #define DMA_BUFFER_SIZE               CARD_MEMORY_SIZE
- #define FREE_BUFFER_OFFSET            (CARD_MEMORY_OFFSET + CARD_MEMORY_SIZE)
- #define FREE_BUFFER_SIZE              (BIGBUF_SIZE - FREE_BUFFER_OFFSET - 1)
- /*
- The statements above translates into this :
- BIGBUF_SIZE         = 40000
- TRACE_OFFSET        = 0
- TRACE_SIZE          = 3000
- RECV_CMD_OFFSET     = 3000
- MAX_FRAME_SIZE      = 256
- MAX_PARITY_SIZE     = 32
- RECV_CMD_PAR_OFFSET = 3256
- RECV_RESP_OFFSET    = 3288
- RECV_RESP_PAR_OFFSET= 3544
- CARD_MEMORY_OFFSET  = 3576
- CARD_MEMORY_SIZE    = 4096
- DMA_BUFFER_OFFSET   = 3576
- DMA_BUFFER_SIZE     = 4096
- FREE_BUFFER_OFFSET  = 7672
- FREE_BUFFER_SIZE    = 32327
-  */
+ #include "../common/crc32.h"
+ #include "BigBuf.h"
  
  extern const uint8_t OddByteParity[256];
- extern uint8_t *trace; // = (uint8_t *) BigBuf;
- extern int traceLen;   // = 0;
  extern int rsamples;   // = 0;
  extern int tracing;    // = TRUE;
  extern uint8_t trigger;
@@@ -81,9 -43,11 +43,8 @@@ int AvgAdc(int ch)
  void ToSendStuffBit(int b);
  void ToSendReset(void);
  void ListenReaderField(int limit);
 -void AcquireRawAdcSamples125k(int at134khz);
 -void SnoopLFRawAdcSamples(int divisor, int trigger_threshold);
 -void DoAcquisition125k(int trigger_threshold);
  extern int ToSendMax;
  extern uint8_t ToSend[];
- extern uint32_t BigBuf[];
  
  /// fpga.h
  void FpgaSendCommand(uint16_t cmd, uint16_t v);
@@@ -141,10 -105,6 +102,10 @@@ void SetAdcMuxFor(uint32_t whichGpio)
  #define FPGA_HF_ISO14443A_READER_MOD                          (4<<0)
  
  /// lfops.h
 +extern uint8_t decimation;
 +extern uint8_t bits_per_sample ;
 +extern bool averaging;
 +
  void AcquireRawAdcSamples125k(int divisor);
  void ModThenAcquireRawAdcSamples125k(int delay_off,int period_0,int period_1,uint8_t *command);
  void ReadTItag(void);
@@@ -199,7 -159,9 +160,9 @@@ void ReaderMifare(bool first_try)
  int32_t dist_nt(uint32_t nt1, uint32_t nt2);
  void MifareReadBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *data);
  void MifareUReadBlock(uint8_t arg0,uint8_t *datain);
- void MifareUReadCard(uint8_t arg0, int arg1, uint8_t *datain);
+ void MifareUC_Auth1(uint8_t arg0, uint8_t *datain);
+ void MifareUC_Auth2(uint32_t arg0, uint8_t *datain);
+ void MifareUReadCard(uint8_t arg0, int Pages, uint8_t *datain);
  void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
  void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
  void MifareUWriteBlock(uint8_t arg0,uint8_t *datain);
@@@ -216,6 -178,25 +179,25 @@@ void MifareCSetBlock(uint32_t arg0, uin
  void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain);
  void MifareCIdent();  // is "magic chinese" card?
  
+ //desfire
+ void Mifare_DES_Auth1(uint8_t arg0,uint8_t *datain);
+ void Mifare_DES_Auth2(uint32_t arg0, uint8_t *datain);                                           
+ // mifaredesfire.h
+ bool  InitDesfireCard();
+ void  MifareSendCommand(uint8_t arg0,uint8_t arg1, uint8_t *datain);
+ void  MifareDesfireGetInformation();
+ void  MifareDES_Auth1(uint8_t arg0,uint8_t arg1,uint8_t arg2, uint8_t *datain);
+ void  ReaderMifareDES(uint32_t param, uint32_t param2, uint8_t * datain);
+ int   DesfireAPDU(uint8_t *cmd, size_t cmd_len, uint8_t *dataout);
+ size_t        CreateAPDU( uint8_t *datain, size_t len, uint8_t *dataout);
+ void  OnSuccess();
+ void  OnError(uint8_t reason);
  /// iso15693.h
  void RecordRawAdcSamplesIso15693(void);
  void AcquireRawAdcSamplesIso15693(void);
diff --combined armsrc/lfops.c
index 43af4eed4d39048359fbab6f8ab6a4631dc7a1a7,7b6fa97a71d51d73231d8251d8b9ff04b5c07be2..479da77204ebc3fc357b5c569afbc3b0aab2f2bc
  #include "crc16.h"
  #include "string.h"
  #include "lfdemod.h"
 +#include "lfsampling.h"
  
  
  /**
 -* Does the sample acquisition. If threshold is specified, the actual sampling
 -* is not commenced until the threshold has been reached.
 -* @param trigger_threshold - the threshold
 -* @param silent - is true, now outputs are made. If false, dbprints the status
 -*/
 -void DoAcquisition125k_internal(int trigger_threshold,bool silent)
 -{
 -    uint8_t *dest = BigBuf_get_addr();
 -    int n = BigBuf_max_traceLen();
 -    int i;
 -
 -    memset(dest, 0, n);
 -    i = 0;
 -    for(;;) {
 -        if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) {
 -            AT91C_BASE_SSC->SSC_THR = 0x43;
 -            LED_D_ON();
 -        }
 -        if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY) {
 -            dest[i] = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
 -            LED_D_OFF();
 -            if (trigger_threshold != -1 && dest[i] < trigger_threshold)
 -                continue;
 -            else
 -                trigger_threshold = -1;
 -            if (++i >= n) break;
 -        }
 -    }
 -    if(!silent)
 -    {
 -        Dbprintf("buffer samples: %02x %02x %02x %02x %02x %02x %02x %02x ...",
 -                 dest[0], dest[1], dest[2], dest[3], dest[4], dest[5], dest[6], dest[7]);
 -
 -    }
 -}
 -/**
 -* Perform sample aquisition.
 -*/
 -void DoAcquisition125k(int trigger_threshold)
 -{
 -    DoAcquisition125k_internal(trigger_threshold, false);
 -}
 -
 -/**
 -* Setup the FPGA to listen for samples. This method downloads the FPGA bitstream
 -* if not already loaded, sets divisor and starts up the antenna.
 -* @param divisor : 1, 88> 255 or negative ==> 134.8 KHz
 -*                                0 or 95 ==> 125 KHz
 -*
 -**/
 -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
 -    else if (divisor == 0)
 -        FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz
 -    else
 -        FpgaSendCommand(FPGA_CMD_SET_DIVISOR, divisor);
 -
 -    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();
 -}
 -/**
 -* Initializes the FPGA, and acquires the samples.
 -**/
 -void AcquireRawAdcSamples125k(int divisor)
 -{
 -    LFSetupFPGAForADC(divisor, true);
 -    // Now call the acquisition routine
 -    DoAcquisition125k_internal(-1,false);
 -}
 -/**
 -* Initializes the FPGA for snoop-mode, and acquires the samples.
 -**/
 -
 -void SnoopLFRawAdcSamples(int divisor, int trigger_threshold)
 -{
 -    LFSetupFPGAForADC(divisor, false);
 -    DoAcquisition125k(trigger_threshold);
 -}
 -
 + * Function to do a modulation and then get samples.
 + * @param delay_off
 + * @param period_0
 + * @param period_1
 + * @param command
 + */
  void ModThenAcquireRawAdcSamples125k(int delay_off, int period_0, int period_1, uint8_t *command)
  {
  
 -    /* Make sure the tag is reset */
 -    FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
 -    FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
 -    SpinDelay(2500);
 -
 -
      int divisor_used = 95; // 125 KHz
      // see if 'h' was specified
  
      if (command[strlen((char *) command) - 1] == 'h')
          divisor_used = 88; // 134.8 KHz
  
 +      sample_config sc = { 0,0,1, divisor_used, 0};
 +      setSamplingConfig(&sc);
  
 -    FpgaSendCommand(FPGA_CMD_SET_DIVISOR, divisor_used);
 -    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);
 +      /* Make sure the tag is reset */
 +      FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
 +      FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
 +      SpinDelay(2500);
  
 -    // And a little more time for the tag to fully power up
 -    SpinDelay(2000);
 +      LFSetupFPGAForADC(sc.divisor, 1);
  
 -    // Now set up the SSC to get the ADC samples that are now streaming at us.
 -    FpgaSetupSsc();
 +      // And a little more time for the tag to fully power up
 +      SpinDelay(2000);
  
      // now modulate the reader field
      while(*command != '\0' && *command != ' ') {
          FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
          LED_D_OFF();
          SpinDelayUs(delay_off);
 -        FpgaSendCommand(FPGA_CMD_SET_DIVISOR, divisor_used);
 +              FpgaSendCommand(FPGA_CMD_SET_DIVISOR, sc.divisor);
  
          FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);
          LED_D_ON();
      FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
      LED_D_OFF();
      SpinDelayUs(delay_off);
 -    FpgaSendCommand(FPGA_CMD_SET_DIVISOR, divisor_used);
 +      FpgaSendCommand(FPGA_CMD_SET_DIVISOR, sc.divisor);
  
      FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);
  
      // now do the read
 -    DoAcquisition125k(-1);
 +      DoAcquisition_config(false);
  }
  
 +
 +
  /* blank r/w tag data stream
  ...0000000000000000 01111111
  1010101010101010101010101010101010101010101010101010101010101010
@@@ -93,8 -177,8 +93,8 @@@ void ReadTItag(void
   #define FREQLO 123200
   #define FREQHI 134200
  
-     signed char *dest = (signed char *)BigBuf;
-     int n = sizeof(BigBuf);
+     signed char *dest = (signed char *)BigBuf_get_addr();
+     uint16_t n = BigBuf_max_traceLen();
      // 128 bit shift register [shift3:shift2:shift1:shift0]
      uint32_t shift3 = 0, shift2 = 0, shift1 = 0, shift0 = 0;
  
@@@ -246,7 -330,8 +246,8 @@@ void AcquireTiType(void
   #define TIBUFLEN 1250
  
      // clear buffer
-     memset(BigBuf,0,sizeof(BigBuf));
+       uint32_t *BigBuf = (uint32_t *)BigBuf_get_addr();
+     memset(BigBuf,0,BigBuf_max_traceLen()/sizeof(uint32_t));
  
      // Set up the synchronous serial port
      AT91C_BASE_PIOA->PIO_PDR = GPIO_SSC_DIN;
      AT91C_BASE_PIOA->PIO_PDR = GPIO_SSC_DOUT;
      AT91C_BASE_PIOA->PIO_ASR = GPIO_SSC_DIN | GPIO_SSC_DOUT;
  
-     char *dest = (char *)BigBuf;
+     char *dest = (char *)BigBuf_get_addr();
      n = TIBUFLEN*32;
      // unpack buffer
      for (i=TIBUFLEN-1; i>=0; i--) {
@@@ -383,7 -468,7 +384,7 @@@ void WriteTItag(uint32_t idhi, uint32_
  void SimulateTagLowFrequency(int period, int gap, int ledcontrol)
  {
      int i;
-     uint8_t *tab = (uint8_t *)BigBuf;
+     uint8_t *tab = BigBuf_get_addr();
  
      FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
      FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_EDGE_DETECT);
@@@ -443,7 -528,7 +444,7 @@@ void SimulateTagLowFrequencyBidir(int d
  
  // compose fc/8 fc/10 waveform
  static void fc(int c, int *n) {
-     uint8_t *dest = (uint8_t *)BigBuf;
+     uint8_t *dest = BigBuf_get_addr();
      int idx;
  
      // for when we want an fc8 pattern every 4 logical bits
@@@ -547,11 -632,11 +548,11 @@@ void CmdHIDsimTAG(int hi, int lo, int l
  // loop to get raw HID waveform then FSK demodulate the TAG ID from it
  void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol)
  {
-     uint8_t *dest = (uint8_t *)BigBuf;
-     size_t size=0; //, found=0;
+     uint8_t *dest = BigBuf_get_addr();
+     const size_t sizeOfBigBuff = BigBuf_max_traceLen();
+     size_t size = 0; 
      uint32_t hi2=0, hi=0, lo=0;
+     int idx=0;
      // Configure to go in 125Khz listen mode
      LFSetupFPGAForADC(95, true);
  
          WDT_HIT();
          if (ledcontrol) LED_A_ON();
  
 -        DoAcquisition125k_internal(-1,true);
 -        // FSK demodulator
 +              DoAcquisition_default(-1,true);
 +              // FSK demodulator
-               size = HIDdemodFSK(dest, sizeof(BigBuf), &hi2, &hi, &lo);
-         WDT_HIT();
-               if (size>0 && lo>0){
+         size = sizeOfBigBuff;  //variable size will change after demod so re initialize it before use
+               idx = HIDdemodFSK(dest, &size, &hi2, &hi, &lo);
+         
+               if (idx>0 && lo>0){
              // final loop, go over previously decoded manchester data and decode into usable tag ID
              // 111000 bit pattern represent start of frame, 01 pattern represents a 1 and 10 represents a 0
              if (hi2 != 0){ //extra large HID tags
              }
              if (findone){
                  if (ledcontrol)       LED_A_OFF();
+                 *high = hi;
+                 *low = lo;
                  return;
              }
              // reset
  
  void CmdEM410xdemod(int findone, int *high, int *low, int ledcontrol)
  {
-     uint8_t *dest = (uint8_t *)BigBuf;
+     uint8_t *dest = BigBuf_get_addr();
  
-       size_t size=0;
+       size_t size=0, idx=0;
      int clk=0, invert=0, errCnt=0;
      uint64_t lo=0;
      // Configure to go in 125Khz listen mode
          WDT_HIT();
          if (ledcontrol) LED_A_ON();
  
 -        DoAcquisition125k_internal(-1,true);
 -        size  = BigBuf_max_traceLen();
 +              DoAcquisition_default(-1,true);
-               size  = sizeof(BigBuf);
++              size  = BigBuf_max_traceLen();
          //Dbprintf("DEBUG: Buffer got");
                //askdemod and manchester decode
                errCnt = askmandemod(dest, &size, &clk, &invert);
          WDT_HIT();
  
          if (errCnt>=0){
-                       lo = Em410xDecode(dest,size);
+                       lo = Em410xDecode(dest, &size, &idx);
              //Dbprintf("DEBUG: EM GOT");
              if (lo>0){
                                Dbprintf("EM TAG ID: %02x%08x - (%05d_%03d_%08d)",
              }
              if (findone){
                  if (ledcontrol)       LED_A_OFF();
+                 *high=lo>>32;
+                 *low=lo & 0xFFFFFFFF;
                  return;
              }
          } else{
  
  void CmdIOdemodFSK(int findone, int *high, int *low, int ledcontrol)
  {
-     uint8_t *dest = (uint8_t *)BigBuf;
+     uint8_t *dest = BigBuf_get_addr();
      int idx=0;
      uint32_t code=0, code2=0;
      uint8_t version=0;
      while(!BUTTON_PRESS()) {
          WDT_HIT();
          if (ledcontrol) LED_A_ON();
 -        DoAcquisition125k_internal(-1,true);
 -        //fskdemod and get start index
 +              DoAcquisition_default(-1,true);
 +              //fskdemod and get start index
          WDT_HIT();
-         idx = IOdemodFSK(dest,sizeof(BigBuf));
+         idx = IOdemodFSK(dest, BigBuf_max_traceLen());
          if (idx>0){
              //valid tag found
  
              if (findone){
                  if (ledcontrol)       LED_A_OFF();
                  //LED_A_OFF();
+                 *high=code;
+                 *low=code2;
                  return;
              }
              code=code2=0;
@@@ -874,11 -964,11 +880,11 @@@ void T55xxWriteBlock(uint32_t Data, uin
  // Read one card block in page 0
  void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode)
  {
-     uint8_t *dest = (uint8_t *)BigBuf;
+     uint8_t *dest = BigBuf_get_addr();
      //int m=0, i=0; //enio adjustment 12/10/14
      uint32_t m=0, i=0;
      FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
-     m = sizeof(BigBuf);
+     m = BigBuf_max_traceLen();
      // Clear destination buffer before sending the command
      memset(dest, 128, m);
      // Connect the A/D to the peak-detected low-frequency path.
  
  // Read card traceability data (page 1)
  void T55xxReadTrace(void){
-     uint8_t *dest = (uint8_t *)BigBuf;
+     uint8_t *dest = BigBuf_get_addr();
      int m=0, i=0;
  
      FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
-     m = sizeof(BigBuf);
+     m = BigBuf_max_traceLen();
      // Clear destination buffer before sending the command
      memset(dest, 128, m);
      // Connect the A/D to the peak-detected low-frequency path.
@@@ -1293,8 -1383,8 +1299,8 @@@ void CopyIndala224toT55x7(int uid1, in
  int DemodPCF7931(uint8_t **outBlocks) {
      uint8_t BitStream[256];
      uint8_t Blocks[8][16];
-     uint8_t *GraphBuffer = (uint8_t *)BigBuf;
-     int GraphTraceLen = sizeof(BigBuf);
+     uint8_t *GraphBuffer = BigBuf_get_addr();
+     int GraphTraceLen = BigBuf_max_traceLen();
      int i, j, lastval, bitidx, half_switch;
      int clock = 64;
      int tolerance = clock / 8;
      int lmin=128, lmax=128;
      uint8_t dir;
  
 -    AcquireRawAdcSamples125k(0);
 +      LFSetupFPGAForADC(95, true);
 +      DoAcquisition_default(0, 0);
 +
  
      lmin = 64;
      lmax = 192;
@@@ -1713,7 -1801,7 +1719,7 @@@ void EM4xLogin(uint32_t Password) 
  void EM4xReadWord(uint8_t Address, uint32_t Pwd, uint8_t PwdMode) {
  
      uint8_t fwd_bit_count;
-     uint8_t *dest = (uint8_t *)BigBuf;
+     uint8_t *dest = BigBuf_get_addr();
      int m=0, i=0;
  
      //If password mode do login
      fwd_bit_count = Prepare_Cmd( FWD_CMD_READ );
      fwd_bit_count += Prepare_Addr( Address );
  
-     m = sizeof(BigBuf);
+     m = BigBuf_max_traceLen();
      // Clear destination buffer before sending the command
      memset(dest, 128, m);
      // Connect the A/D to the peak-detected low-frequency path.
diff --combined armsrc/lfsampling.c
index 6314ac7461218e82e74fcf26b54a0c4b1cd7b987,0000000000000000000000000000000000000000..348549ef5e08df2981ff0b2cec2255523e03bbc8
mode 100644,000000..100644
--- /dev/null
@@@ -1,251 -1,0 +1,252 @@@
-       uint8_t *dest = (uint8_t *)BigBuf;
-       int bufsize = BIGBUF_SIZE;
 +//-----------------------------------------------------------------------------
 +// This code is licensed to you under the terms of the GNU GPL, version 2 or,
 +// at your option, any later version. See the LICENSE.txt file for the text of
 +// the license.
 +//-----------------------------------------------------------------------------
 +// 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, 88, 0 } ;
 +
 +void printConfig()
 +{
 +      Dbprintf("Sampling config: ");
 +      Dbprintf("  [q] divisor:           %d ", config.divisor);
 +      Dbprintf("  [b] bps:               %d ", config.bits_per_sample);
 +      Dbprintf("  [d] decimation:        %d ", config.decimation);
 +      Dbprintf("  [a] averaging:         %d ", config.averaging);
 +      Dbprintf("  [t] trigger threshold: %d ", config.trigger_threshold);
 +}
 +
 +
 +/**
 + * Called from the USB-handler to set the sampling configuration
 + * The sampling config is used for std reading and snooping.
 + *
 + * Other functions may read samples and ignore the sampling config,
 + * such as functions to read the UID from a prox tag or similar.
 + *
 + * Values set to '0' implies no change (except for averaging)
 + * @brief setSamplingConfig
 + * @param 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;
 +
 +      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()
 +{
 +      return &config;
 +}
 +
 +typedef struct {
 +      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)
 +{
 +      int bytepos = stream->position >> 3; // divide by 8
 +      int bitpos = stream->position & 7;
 +      *(stream->buffer+bytepos) |= (bit > 0) <<  (7 - bitpos);
 +      stream->position++;
 +      stream->numbits++;
 +}
 +
 +/**
 +* Setup the FPGA to listen for samples. This method downloads the FPGA bitstream
 +* if not already loaded, sets divisor and starts up the antenna.
 +* @param divisor : 1, 88> 255 or negative ==> 134.8 KHz
 +*                                0 or 95 ==> 125 KHz
 +*
 +**/
 +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
 +      else if (divisor == 0)
 +              FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz
 +      else
 +              FpgaSendCommand(FPGA_CMD_SET_DIVISOR, divisor);
 +
 +      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();
 +}
 +
 +
 +/**
 + * Does the sample acquisition. If threshold is specified, the actual sampling
 + * is not commenced until the threshold has been reached.
 + * This method implements decimation and quantization in order to
 + * be able to provide longer sample traces.
 + * Uses the following global settings:
 + * @param decimation - how much should the signal be decimated. A decimation of N means we keep 1 in N samples, etc.
 + * @param bits_per_sample - bits per sample. Max 8, min 1 bit per sample.
 + * @param averaging If set to true, decimation will use averaging, so that if e.g. decimation is 3, the sample
 + * value that will be used is the average value of the three samples.
 + * @param trigger_threshold - a threshold. The sampling won't commence until this threshold has been reached. Set
 + * to -1 to ignore threshold.
 + * @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)
 +{
 +      //.
++      uint8_t *dest = BigBuf_get_addr();
++    int bufsize = BigBuf_max_traceLen();
++
 +      memset(dest, 0, bufsize);
 +
 +      if(bits_per_sample < 1) bits_per_sample = 1;
 +      if(bits_per_sample > 8) bits_per_sample = 8;
 +
 +      if(decimation < 1) decimation = 1;
 +
 +      // Use a bit stream to handle the output
 +      BitstreamOut data = { dest , 0, 0};
 +      int sample_counter = 0;
 +      uint8_t sample = 0;
 +      //If we want to do averaging
 +      uint32_t sample_sum =0 ;
 +      uint32_t sample_total_numbers =0 ;
 +      uint32_t sample_total_saved =0 ;
 +
 +      while(!BUTTON_PRESS()) {
 +              WDT_HIT();
 +              if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) {
 +                      AT91C_BASE_SSC->SSC_THR = 0x43;
 +                      LED_D_ON();
 +              }
 +              if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY) {
 +                      sample = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
 +                      LED_D_OFF();
 +                      if (trigger_threshold > 0 && sample < trigger_threshold)
 +                              continue;
 +
 +                      trigger_threshold = 0;
 +                      sample_total_numbers++;
 +
 +                      if(averaging)
 +                      {
 +                              sample_sum += sample;
 +                      }
 +                      //Check decimation
 +                      if(decimation > 1)
 +                      {
 +                              sample_counter++;
 +                              if(sample_counter < decimation) continue;
 +                              sample_counter = 0;
 +                      }
 +                      //Averaging
 +                      if(averaging && decimation > 1) {
 +                              sample = sample_sum / decimation;
 +                              sample_sum =0;
 +                      }
 +                      //Store the sample
 +                      sample_total_saved ++;
 +                      if(bits_per_sample == 8){
 +                              dest[sample_total_saved-1] = sample;
 +                              data.numbits = sample_total_saved << 3;//Get the return value correct
 +                              if(sample_total_saved >= bufsize) break;
 +                      }
 +                      else{
 +                              pushBit(&data, sample & 0x80);
 +                              if(bits_per_sample > 1) pushBit(&data, sample & 0x40);
 +                              if(bits_per_sample > 2) pushBit(&data, sample & 0x20);
 +                              if(bits_per_sample > 3) pushBit(&data, sample & 0x10);
 +                              if(bits_per_sample > 4) pushBit(&data, sample & 0x08);
 +                              if(bits_per_sample > 5) pushBit(&data, sample & 0x04);
 +                              if(bits_per_sample > 6) pushBit(&data, sample & 0x02);
 +                              //Not needed, 8bps is covered above
 +                              //if(bits_per_sample > 7)       pushBit(&data, sample & 0x01);
 +                              if((data.numbits >> 3) +1  >= bufsize) break;
 +                      }
 +              }
 +      }
 +
 +      if(!silent)
 +      {
 +              Dbprintf("Done, saved %d out of %d seen samples at %d bits/sample",sample_total_saved, sample_total_numbers,bits_per_sample);
 +              Dbprintf("buffer samples: %02x %02x %02x %02x %02x %02x %02x %02x ...",
 +                                      dest[0], dest[1], dest[2], dest[3], dest[4], dest[5], dest[6], dest[7]);
 +      }
 +      return data.numbits;
 +}
 +/**
 + * @brief Does sample acquisition, ignoring the config values set in the sample_config.
 + * This method is typically used by tag-specific readers who just wants to read the samples
 + * the normal way
 + * @param trigger_threshold
 + * @param silent
 + * @return number of bits sampled
 + */
 +uint32_t DoAcquisition_default(int trigger_threshold, bool silent)
 +{
 +      return DoAcquisition(1,8,0,trigger_threshold,silent);
 +}
 +uint32_t DoAcquisition_config( bool silent)
 +{
 +      return DoAcquisition(config.decimation
 +                                ,config.bits_per_sample
 +                                ,config.averaging
 +                                ,config.trigger_threshold
 +                                ,silent);
 +}
 +
 +uint32_t ReadLF(bool activeField)
 +{
 +      printConfig();
 +      LFSetupFPGAForADC(config.divisor, activeField);
 +      // Now call the acquisition routine
 +      return DoAcquisition_config(false);
 +}
 +
 +/**
 +* Initializes the FPGA for reader-mode (field on), and acquires the samples.
 +* @return number of bits sampled
 +**/
 +uint32_t SampleLF()
 +{
 +      return ReadLF(true);
 +}
 +/**
 +* Initializes the FPGA for snoop-mode (field off), and acquires the samples.
 +* @return number of bits sampled
 +**/
 +
 +uint32_t SnoopLF()
 +{
 +      return ReadLF(false);
 +}
diff --combined client/cmddata.c
index 8f73b4007de21700047bc3f903372211e092214f,8c91f0e115ce84c7f6e934861e784d5341943215..0ec73cbb79b542406bf1afd00df403ed12d9f349
  #include "cmdmain.h"
  #include "cmddata.h"
  #include "lfdemod.h"
 +#include "usb_cmd.h"
 +
  uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN];
+ uint8_t g_debugMode;
  int DemodBufferLen;
  static int CmdHelp(const char *Cmd);
  
  //set the demod buffer with given array of binary (one bit per byte)
  //by marshmellow
- void setDemodBuf(uint8_t *buff,int size)
+ void setDemodBuf(uint8_t *buff, size_t size, size_t startIdx)
  {
-       int i=0;
-       for (; i < size; ++i){
-               DemodBuffer[i]=buff[i];
+       size_t i = 0;
+       for (; i < size; i++){
+               DemodBuffer[i]=buff[startIdx++];
        }
        DemodBufferLen=size;
        return;
  }
  
+ int CmdSetDebugMode(const char *Cmd)
+ {
+   int demod=0;
+   sscanf(Cmd, "%i", &demod);
+   g_debugMode=(uint8_t)demod;
+   return 1;
+ }
  //by marshmellow
  void printDemodBuff()
  {
@@@ -208,7 -215,7 +217,7 @@@ void printEM410x(uint64_t id
  {
    if (id !=0){
        uint64_t iii=1;
-       uint64_t id2lo=0; //id2hi=0,
+       uint64_t id2lo=0;
        uint32_t ii=0;
        uint32_t i=0;
        for (ii=5; ii>0;ii--){
        }
        //output em id
        PrintAndLog("EM TAG ID    : %010llx", id);
-       PrintAndLog("Unique TAG ID: %010llx",  id2lo); //id2hi,
+       PrintAndLog("Unique TAG ID: %010llx",  id2lo);
        PrintAndLog("DEZ 8        : %08lld",id & 0xFFFFFF);
        PrintAndLog("DEZ 10       : %010lld",id & 0xFFFFFF);
        PrintAndLog("DEZ 5.5      : %05lld.%05lld",(id>>16LL) & 0xFFFF,(id & 0xFFFF));
  int CmdEm410xDecode(const char *Cmd)
  {
    uint64_t id=0;
-  // uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
-  // uint32_t i=0;
-  // i=getFromGraphBuf(BitStream);
-       id = Em410xDecode(DemodBuffer,DemodBufferLen);
-   printEM410x(id);
-   if (id>0) return 1;
+   size_t size = DemodBufferLen, idx=0;
+       id = Em410xDecode(DemodBuffer, &size, &idx);
+   if (id>0){
+     setDemodBuf(DemodBuffer, size, idx);
+     if (g_debugMode){
+       PrintAndLog("DEBUG: Printing demod buffer:");
+       printDemodBuff();
+     }
+     printEM410x(id);
+     return 1; 
+   }
    return 0;
  }
  
  //prints binary found and saves in graphbuffer for further commands
  int Cmdaskmandemod(const char *Cmd)
  {
-       int invert=0;
+   int invert=0;
        int clk=0;
    uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
        sscanf(Cmd, "%i %i", &clk, &invert);
    }
  
        size_t BitLen = getFromGraphBuf(BitStream);
-   //  PrintAndLog("DEBUG: Bitlen from grphbuff: %d",BitLen);
+   if (g_debugMode==1) PrintAndLog("DEBUG: Bitlen from grphbuff: %d",BitLen);
    int errCnt=0;
     errCnt = askmandemod(BitStream, &BitLen,&clk,&invert);
        if (errCnt<0||BitLen<16){  //if fatal error (or -1)
-               // PrintAndLog("no data found %d, errors:%d, bitlen:%d, clock:%d",errCnt,invert,BitLen,clk);
+               if (g_debugMode==1) PrintAndLog("no data found %d, errors:%d, bitlen:%d, clock:%d",errCnt,invert,BitLen,clk);
      return 0;
        }
    PrintAndLog("\nUsing Clock: %d - Invert: %d - Bits Found: %d",clk,invert,BitLen);
    }
    PrintAndLog("ASK/Manchester decoded bitstream:");
    // Now output the bitstream to the scrollback by line of 16 bits
-       setDemodBuf(BitStream,BitLen);
+       setDemodBuf(BitStream,BitLen,0);
        printDemodBuff();
    uint64_t lo =0;
-   lo = Em410xDecode(BitStream,BitLen);
+   size_t idx=0;
+   lo = Em410xDecode(BitStream, &BitLen, &idx);
    if (lo>0){
      //set GraphBuffer for clone or sim command
+     setDemodBuf(BitStream, BitLen, idx);
+     if (g_debugMode){
+       PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, BitLen);
+       printDemodBuff();
+     }
      PrintAndLog("EM410x pattern found: ");
      printEM410x(lo);
      return 1;
    }
-   //if (BitLen>16) return 1;
    return 0;
  }
  
@@@ -319,9 -336,14 +338,14 @@@ int Cmdmandecoderaw(const char *Cmd
        printBitStream(BitStream, size);
    if (errCnt==0){
                uint64_t id = 0;
-               id = Em410xDecode(BitStream, size);
-               if (id>0) setDemodBuf(BitStream, size);
-               printEM410x(id);
+     size_t idx=0;
+               id = Em410xDecode(BitStream, &size, &idx);
+               if (id>0){
+       //need to adjust to set bitstream back to manchester encoded data
+       //setDemodBuf(BitStream, size, idx);
+       printEM410x(id);
+     }
    }
    return 1;
  }
  //by marshmellow
  //biphase decode
  //take 01 or 10 = 0 and 11 or 00 = 1
- //takes 1 argument "offset" default = 0 if 1 it will shift the decode by one bit
+ //takes 2 arguments "offset" default = 0 if 1 it will shift the decode by one bit
+ // and "invert" default = 0 if 1 it will invert output
  //  since it is not like manchester and doesn't have an incorrect bit pattern we
  //  cannot determine if our decode is correct or if it should be shifted by one bit
  //  the argument offset allows us to manually shift if the output is incorrect
@@@ -341,8 -364,9 +366,9 @@@ int CmdBiphaseDecodeRaw(const char *Cmd
    int errCnt=0;
        size_t size=0;
    int offset=0;
+   int invert=0;
    int high=0, low=0;
-       sscanf(Cmd, "%i", &offset);
+       sscanf(Cmd, "%i %i", &offset, &invert);
    uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
    //get graphbuffer & high and low
        for (;i<DemodBufferLen;++i){
      return 0;
    }
        size=i;
-       errCnt=BiphaseRawDecode(BitStream, &size, offset);
+       errCnt=BiphaseRawDecode(BitStream, &size, offset, invert);
    if (errCnt>=20){
      PrintAndLog("Too many errors attempting to decode: %d",errCnt);
      return 0;
    return 1;
  }
  
  //by marshmellow
  //takes 2 arguments - clock and invert both as integers
  //attempts to demodulate ask only
@@@ -386,14 -409,15 +411,15 @@@ int Cmdaskrawdemod(const char *Cmd
        errCnt = askrawdemod(BitStream, &BitLen,&clk,&invert);
        if (errCnt==-1||BitLen<16){  //throw away static - allow 1 and -1 (in case of threshold command first)
                PrintAndLog("no data found");
+     if (g_debugMode==1) PrintAndLog("errCnt: %d, BitLen: %d, clk: %d, invert: %d", errCnt, BitLen, clk, invert);
      return 0;
        }
    PrintAndLog("Using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen);
-     //PrintAndLog("Data start pos:%d, lastBit:%d, stop pos:%d, numBits:%d",iii,lastBit,i,bitnum);
-               //move BitStream back to DemodBuffer
-       setDemodBuf(BitStream,BitLen);
+   
+   //move BitStream back to DemodBuffer
+       setDemodBuf(BitStream,BitLen,0);
  
-               //output
+       //output
    if (errCnt>0){
      PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
    }
@@@ -513,10 -537,6 +539,6 @@@ int CmdBitstream(const char *Cmd
        bit ^= 1;
  
      AppendGraph(0, clock, bit);
-       //    for (j = 0; j < (int)(clock/2); j++)
-       //      GraphBuffer[(i * clock) + j] = bit ^ 1;
-       //    for (j = (int)(clock/2); j < clock; j++)
-       //      GraphBuffer[(i * clock) + j] = bit;
    }
  
    RepaintGraphWindow();
@@@ -540,44 -560,28 +562,65 @@@ int CmdDec(const char *Cmd
    RepaintGraphWindow();
    return 0;
  }
 +/**
 + * Undecimate - I'd call it 'interpolate', but we'll save that
 + * name until someone does an actual interpolation command, not just
 + * blindly repeating samples
 + * @param Cmd
 + * @return
 + */
 +int CmdUndec(const char *Cmd)
 +{
 +      if(param_getchar(Cmd, 0) == 'h')
 +      {
 +              PrintAndLog("Usage: data undec [factor]");
 +              PrintAndLog("This function performs un-decimation, by repeating each sample N times");
 +              PrintAndLog("Options:        ");
 +              PrintAndLog("       h            This help");
 +              PrintAndLog("       factor       The number of times to repeat each sample.[default:2]");
 +              PrintAndLog("Example: 'data undec 3'");
 +              return 0;
 +      }
 +
 +      uint8_t factor = param_get8ex(Cmd, 0,2, 10);
 +      //We have memory, don't we?
 +      int swap[MAX_GRAPH_TRACE_LEN] = { 0 };
 +      uint32_t g_index = 0 ,s_index = 0;
 +      while(g_index < GraphTraceLen && s_index < MAX_GRAPH_TRACE_LEN)
 +      {
 +              int count = 0;
 +              for(count = 0; count < factor && s_index+count < MAX_GRAPH_TRACE_LEN; count ++)
 +                      swap[s_index+count] = GraphBuffer[g_index];
 +              s_index+=count;
 +      }
 +
 +      memcpy(GraphBuffer,swap, s_index * sizeof(int));
 +      GraphTraceLen = s_index;
 +      RepaintGraphWindow();
 +      return 0;
 +}
  
+ //by marshmellow
+ //shift graph zero up or down based on input + or -
+ int CmdGraphShiftZero(const char *Cmd)
+ {
+   int shift=0;
+   //set options from parameters entered with the command
+   sscanf(Cmd, "%i", &shift);
+   int shiftedVal=0;
+   for(int i = 0; i<GraphTraceLen; i++){
+     shiftedVal=GraphBuffer[i]+shift;
+     if (shiftedVal>127) 
+       shiftedVal=127;
+     else if (shiftedVal<-127) 
+       shiftedVal=-127;
+     GraphBuffer[i]= shiftedVal;
+   }
+   CmdNorm("");
+   return 0;
+ }
  /* Print our clock rate */
  // uses data from graphbuffer
  int CmdDetectClockRate(const char *Cmd)
@@@ -596,27 -600,44 +639,44 @@@ int CmdFSKrawdemod(const char *Cmd
  {
    //raw fsk demod  no manchester decoding no start bit finding just get binary from wave
    //set defaults
-   int rfLen = 50;
+   int rfLen = 0;
    int invert=0;
-   int fchigh=10;
-   int fclow=8;
+   int fchigh=0;
+   int fclow=0;
    //set options from parameters entered with the command
        sscanf(Cmd, "%i %i %i %i", &rfLen, &invert, &fchigh, &fclow);
  
    if (strlen(Cmd)>0 && strlen(Cmd)<=2) {
-      //rfLen=param_get8(Cmd, 0); //if rfLen option only is used
       if (rfLen==1){
        invert=1;   //if invert option only is used
-       rfLen = 50;
-      } else if(rfLen==0) rfLen=50;
+       rfLen = 0;
+      }
        }
-   PrintAndLog("Args invert: %d - Clock:%d - fchigh:%d - fclow: %d",invert,rfLen,fchigh, fclow);
    uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
        size_t BitLen = getFromGraphBuf(BitStream);
+   //get field clock lengths
+   uint16_t fcs=0;
+   if (fchigh==0 || fclow == 0){
+     fcs=countFC(BitStream, BitLen);
+     if (fcs==0){
+       fchigh=10;
+       fclow=8;
+     }else{
+       fchigh = (fcs >> 8) & 0xFF;
+       fclow = fcs & 0xFF;
+     }
+   }
+   //get bit clock length
+   if (rfLen==0){
+     rfLen = detectFSKClk(BitStream, BitLen, fchigh, fclow);
+     if (rfLen == 0) rfLen = 50;
+   }
+   PrintAndLog("Args invert: %d - Clock:%d - fchigh:%d - fclow: %d",invert,rfLen,fchigh, fclow);
        int size  = fskdemod(BitStream,BitLen,(uint8_t)rfLen,(uint8_t)invert,(uint8_t)fchigh,(uint8_t)fclow);
    if (size>0){
      PrintAndLog("FSK decoded bitstream:");
-               setDemodBuf(BitStream,size);
+               setDemodBuf(BitStream,size,0);
  
      // Now output the bitstream to the scrollback by line of 16 bits
      if(size > (8*32)+2) size = (8*32)+2; //only output a max of 8 blocks of 32 bits  most tags will have full bit stream inside that sample size
@@@ -638,20 -659,32 +698,32 @@@ int CmdFSKdemodHID(const char *Cmd
    uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
        size_t BitLen = getFromGraphBuf(BitStream);
    //get binary from fsk wave
-       size_t size  = HIDdemodFSK(BitStream,BitLen,&hi2,&hi,&lo);
-   if (size<0){
-     PrintAndLog("Error demoding fsk");
+       int idx  = HIDdemodFSK(BitStream,&BitLen,&hi2,&hi,&lo);
+   if (idx<0){
+     if (g_debugMode){
+       if (idx==-1){
+         PrintAndLog("DEBUG: Just Noise Detected");     
+       } else if (idx == -2) {
+         PrintAndLog("DEBUG: Error demoding fsk");
+       } else if (idx == -3) {
+         PrintAndLog("DEBUG: Preamble not found");
+       } else if (idx == -4) {
+         PrintAndLog("DEBUG: Error in Manchester data, SIZE: %d", BitLen);
+       } else {
+         PrintAndLog("DEBUG: Error demoding fsk %d", idx);
+       }   
+     }
+     return 0;
+   }
+   if (hi2==0 && hi==0 && lo==0) {
+     if (g_debugMode) PrintAndLog("DEBUG: Error - no values found");
      return 0;
    }
-   if (hi2==0 && hi==0 && lo==0) return 0;
    if (hi2 != 0){ //extra large HID tags
                PrintAndLog("HID Prox TAG ID: %x%08x%08x (%d)",
         (unsigned int) hi2, (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF);
-               setDemodBuf(BitStream,BitLen);
-     return 1;
    }
    else {  //standard HID tags <38 bits
-     //Dbprintf("TAG ID: %x%08x (%d)",(unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF); //old print cmd
      uint8_t fmtLen = 0;
      uint32_t fc = 0;
      uint32_t cardnum = 0;
                PrintAndLog("HID Prox TAG ID: %x%08x (%d) - Format Len: %dbit - FC: %d - Card: %d",
        (unsigned int) hi, (unsigned int) lo, (unsigned int) (lo>>1) & 0xFFFF,
        (unsigned int) fmtLen, (unsigned int) fc, (unsigned int) cardnum);
-               setDemodBuf(BitStream,BitLen);
-     return 1;
    }
-   return 0;
+   setDemodBuf(BitStream,BitLen,idx);
+   if (g_debugMode){ 
+     PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, BitLen);
+     printDemodBuff();
+   }
+   return 1;
  }
  
+ //by marshmellow
+ //Paradox Prox demod - FSK RF/50 with preamble of 00001111 (then manchester encoded)
+ //print full Paradox Prox ID and some bit format details if found
+ int CmdFSKdemodParadox(const char *Cmd)
+ {
+   //raw fsk demod no manchester decoding no start bit finding just get binary from wave
+   uint32_t hi2=0, hi=0, lo=0;
+   uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
+   size_t BitLen = getFromGraphBuf(BitStream);
+   //get binary from fsk wave
+   int idx = ParadoxdemodFSK(BitStream,&BitLen,&hi2,&hi,&lo);
+   if (idx<0){
+     if (g_debugMode){
+       if (idx==-1){
+         PrintAndLog("DEBUG: Just Noise Detected");     
+       } else if (idx == -2) {
+         PrintAndLog("DEBUG: Error demoding fsk");
+       } else if (idx == -3) {
+         PrintAndLog("DEBUG: Preamble not found");
+       } else if (idx == -4) {
+         PrintAndLog("DEBUG: Error in Manchester data");
+       } else {
+         PrintAndLog("DEBUG: Error demoding fsk %d", idx);
+       }
+     }
+     return 0;
+   }
+   if (hi2==0 && hi==0 && lo==0){
+     if (g_debugMode) PrintAndLog("DEBUG: Error - no value found");
+     return 0;
+   }
+   uint32_t fc = ((hi & 0x3)<<6) | (lo>>26);
+   uint32_t cardnum = (lo>>10)&0xFFFF;
+   
+   PrintAndLog("Paradox TAG ID: %x%08x - FC: %d - Card: %d - Checksum: %02x",
+     hi>>10, (hi & 0x3)<<26 | (lo>>10), fc, cardnum, (lo>>2) & 0xFF );
+   setDemodBuf(BitStream,BitLen,idx);
+   if (g_debugMode){ 
+     PrintAndLog("DEBUG: idx: %d, len: %d, Printing Demod Buffer:", idx, BitLen);
+     printDemodBuff();
+   }
+   return 1;
+ }
  //by marshmellow
  //IO-Prox demod - FSK RF/64 with preamble of 000000001
  //print ioprox ID and some format details
@@@ -705,21 -787,39 +826,39 @@@ int CmdFSKdemodIO(const char *Cmd
    //raw fsk demod no manchester decoding no start bit finding just get binary from wave
    //set defaults
        int idx=0;
-   //something in graphbuffer
-   if (GraphTraceLen < 65) return 0;
+   //something in graphbuffer?
+   if (GraphTraceLen < 65) {
+     if (g_debugMode)PrintAndLog("DEBUG: not enough samples in GraphBuffer");
+     return 0;
+   }
    uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
        size_t BitLen = getFromGraphBuf(BitStream);
    //get binary from fsk wave
-  // PrintAndLog("DEBUG: got buff");
        idx = IOdemodFSK(BitStream,BitLen);
    if (idx<0){
-     //PrintAndLog("Error demoding fsk");
+     if (g_debugMode){
+       if (idx==-1){
+         PrintAndLog("DEBUG: Just Noise Detected");     
+       } else if (idx == -2) {
+         PrintAndLog("DEBUG: not enough samples");
+       } else if (idx == -3) {
+         PrintAndLog("DEBUG: error during fskdemod");        
+       } else if (idx == -4) {
+         PrintAndLog("DEBUG: Preamble not found");
+       } else if (idx == -5) {
+         PrintAndLog("DEBUG: Separator bits not found");
+       } else {
+         PrintAndLog("DEBUG: Error demoding fsk %d", idx);
+       }
+     }
      return 0;
    }
-  // PrintAndLog("DEBUG: Got IOdemodFSK");
    if (idx==0){
-     //PrintAndLog("IO Prox Data not found - FSK Data:");
-     //if (BitLen > 92) printBitStream(BitStream,92);
+     if (g_debugMode==1){
+       PrintAndLog("DEBUG: IO Prox Data not found - FSK Bits: %d",BitLen);
+       if (BitLen > 92) printBitStream(BitStream,92);
+     } 
      return 0;
    }
      //Index map
      //
      //XSF(version)facility:codeone+codetwo (raw)
      //Handle the data
-   if (idx+64>BitLen) return 0;
+   if (idx+64>BitLen) {
+     if (g_debugMode==1) PrintAndLog("not enough bits found - bitlen: %d",BitLen);
+     return 0;
+   }
    PrintAndLog("%d%d%d%d%d%d%d%d %d",BitStream[idx],    BitStream[idx+1],  BitStream[idx+2], BitStream[idx+3], BitStream[idx+4], BitStream[idx+5], BitStream[idx+6], BitStream[idx+7], BitStream[idx+8]);
        PrintAndLog("%d%d%d%d%d%d%d%d %d",BitStream[idx+9],  BitStream[idx+10], BitStream[idx+11],BitStream[idx+12],BitStream[idx+13],BitStream[idx+14],BitStream[idx+15],BitStream[idx+16],BitStream[idx+17]);
    PrintAndLog("%d%d%d%d%d%d%d%d %d facility",BitStream[idx+18], BitStream[idx+19], BitStream[idx+20],BitStream[idx+21],BitStream[idx+22],BitStream[idx+23],BitStream[idx+24],BitStream[idx+25],BitStream[idx+26]);
    uint8_t facilitycode = bytebits_to_byte(BitStream+idx+18,8) ;
    uint16_t number = (bytebits_to_byte(BitStream+idx+36,8)<<8)|(bytebits_to_byte(BitStream+idx+45,8)); //36,9
        PrintAndLog("IO Prox XSF(%02d)%02x:%05d (%08x%08x)",version,facilitycode,number,code,code2);
-       int i;
-       for (i=0;i<64;++i)
-               DemodBuffer[i]=BitStream[idx++];
+   setDemodBuf(BitStream,64,idx);
+       if (g_debugMode){
+     PrintAndLog("DEBUG: idx: %d, Len: %d, Printing demod buffer:",idx,64);
+     printDemodBuff();
+   }
+       return 1;
+ }
+ //by marshmellow
+ //AWID Prox demod - FSK RF/50 with preamble of 00000001  (always a 96 bit data stream)
+ //print full AWID Prox ID and some bit format details if found
+ int CmdFSKdemodAWID(const char *Cmd)
+ {
+   //int verbose=1;
+   //sscanf(Cmd, "%i", &verbose);
+   //raw fsk demod no manchester decoding no start bit finding just get binary from wave
+   uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
+   size_t size = getFromGraphBuf(BitStream);
+   //get binary from fsk wave
+   int idx = AWIDdemodFSK(BitStream, &size);
+   if (idx<=0){
+     if (g_debugMode==1){
+       if (idx == -1)
+         PrintAndLog("DEBUG: Error - not enough samples");
+       else if (idx == -2)
+         PrintAndLog("DEBUG: Error - only noise found");
+       else if (idx == -3)
+         PrintAndLog("DEBUG: Error - problem during FSK demod");
+     //  else if (idx == -3)
+     //    PrintAndLog("Error: thought we had a tag but the parity failed");
+       else if (idx == -4)
+         PrintAndLog("DEBUG: Error - AWID preamble not found");
+       else if (idx == -5)
+         PrintAndLog("DEBUG: Error - Size not correct: %d", size);
+       else
+         PrintAndLog("DEBUG: Error %d",idx);
+     }
+     return 0;
+   }
  
-       DemodBufferLen=64;
+   // Index map
+   // 0            10            20            30              40            50              60
+   // |            |             |             |               |             |               |
+   // 01234567 890 1 234 5 678 9 012 3 456 7 890 1 234 5 678 9 012 3 456 7 890 1 234 5 678 9 012 3 - to 96
+   // -----------------------------------------------------------------------------
+   // 00000001 000 1 110 1 101 1 011 1 101 1 010 0 000 1 000 1 010 0 001 0 110 1 100 0 000 1 000 1
+   // premable bbb o bbb o bbw o fff o fff o ffc o ccc o ccc o ccc o ccc o ccc o wxx o xxx o xxx o - to 96
+   //          |---26 bit---|    |-----117----||-------------142-------------|
+   // b = format bit len, o = odd parity of last 3 bits
+   // f = facility code, c = card number
+   // w = wiegand parity
+   // (26 bit format shown)
+  
+   //get raw ID before removing parities
+   uint32_t rawLo = bytebits_to_byte(BitStream+idx+64,32);
+   uint32_t rawHi = bytebits_to_byte(BitStream+idx+32,32);
+   uint32_t rawHi2 = bytebits_to_byte(BitStream+idx,32);
+   setDemodBuf(BitStream,96,idx);
+   size = removeParity(BitStream, idx+8, 4, 1, 88);
+   if (size != 66){
+     if (g_debugMode==1) PrintAndLog("DEBUG: Error - at parity check-tag size does not match AWID format");
+     return 0;
+   }
+   // ok valid card found!
+   // Index map
+   // 0           10         20        30          40        50        60
+   // |           |          |         |           |         |         |
+   // 01234567 8 90123456 7890123456789012 3 456789012345678901234567890123456
+   // -----------------------------------------------------------------------------
+   // 00011010 1 01110101 0000000010001110 1 000000000000000000000000000000000
+   // bbbbbbbb w ffffffff cccccccccccccccc w xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+   // |26 bit|   |-117--| |-----142------|
+   // b = format bit len, o = odd parity of last 3 bits
+   // f = facility code, c = card number
+   // w = wiegand parity
+   // (26 bit format shown)
+   uint32_t fc = 0;
+   uint32_t cardnum = 0;
+   uint32_t code1 = 0;
+   uint32_t code2 = 0;
+   uint8_t fmtLen = bytebits_to_byte(BitStream,8);
+   if (fmtLen==26){
+     fc = bytebits_to_byte(BitStream+9, 8);
+     cardnum = bytebits_to_byte(BitStream+17, 16);
+     code1 = bytebits_to_byte(BitStream+8,fmtLen);
+     PrintAndLog("AWID Found - BitLength: %d, FC: %d, Card: %d - Wiegand: %x, Raw: %x%08x%08x", fmtLen, fc, cardnum, code1, rawHi2, rawHi, rawLo);
+   } else {
+     cardnum = bytebits_to_byte(BitStream+8+(fmtLen-17), 16);
+     if (fmtLen>32){
+       code1 = bytebits_to_byte(BitStream+8,fmtLen-32);
+       code2 = bytebits_to_byte(BitStream+8+(fmtLen-32),32);
+       PrintAndLog("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x%08x, Raw: %x%08x%08x", fmtLen, cardnum, code1, code2, rawHi2, rawHi, rawLo);
+     } else{
+       code1 = bytebits_to_byte(BitStream+8,fmtLen);
+       PrintAndLog("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x, Raw: %x%08x%08x", fmtLen, cardnum, code1, rawHi2, rawHi, rawLo);
+     }
+   }
+   if (g_debugMode){
+     PrintAndLog("DEBUG: idx: %d, Len: %d Printing Demod Buffer:", idx, 96);
+     printDemodBuff();
+   }
+   //todo - convert hi2, hi, lo to demodbuffer for future sim/clone commands
    return 1;
  }
+ //by marshmellow
+ //Pyramid Prox demod - FSK RF/50 with preamble of 0000000000000001  (always a 128 bit data stream)
+ //print full Farpointe Data/Pyramid Prox ID and some bit format details if found
+ int CmdFSKdemodPyramid(const char *Cmd)
+ {
+   //raw fsk demod no manchester decoding no start bit finding just get binary from wave
+   uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
+   size_t size = getFromGraphBuf(BitStream);
+   //get binary from fsk wave
+   int idx = PyramiddemodFSK(BitStream, &size);
+   if (idx < 0){
+     if (g_debugMode==1){
+       if (idx == -5)
+         PrintAndLog("DEBUG: Error - not enough samples");
+       else if (idx == -1)
+         PrintAndLog("DEBUG: Error - only noise found");
+       else if (idx == -2)
+         PrintAndLog("DEBUG: Error - problem during FSK demod");
+       else if (idx == -3)
+         PrintAndLog("DEBUG: Error - Size not correct: %d", size);
+       else if (idx == -4)
+         PrintAndLog("DEBUG: Error - Pyramid preamble not found");
+       else
+         PrintAndLog("DEBUG: Error - idx: %d",idx);
+     }
+     return 0;
+   }
+   // Index map
+   // 0           10          20          30            40          50          60
+   // |           |           |           |             |           |           |
+   // 0123456 7 8901234 5 6789012 3 4567890 1 2345678 9 0123456 7 8901234 5 6789012 3
+   // -----------------------------------------------------------------------------
+   // 0000000 0 0000000 1 0000000 1 0000000 1 0000000 1 0000000 1 0000000 1 0000000 1
+   // premable  xxxxxxx o xxxxxxx o xxxxxxx o xxxxxxx o xxxxxxx o xxxxxxx o xxxxxxx o
+   // 64    70            80          90          100         110           120
+   // |     |             |           |           |           |             |
+   // 4567890 1 2345678 9 0123456 7 8901234 5 6789012 3 4567890 1 2345678 9 0123456 7
+   // -----------------------------------------------------------------------------
+   // 0000000 1 0000000 1 0000000 1 0110111 0 0011000 1 0000001 0 0001100 1 1001010 0
+   // xxxxxxx o xxxxxxx o xxxxxxx o xswffff o ffffccc o ccccccc o ccccccw o ppppppp o
+   //                                  |---115---||---------71---------|
+   // s = format start bit, o = odd parity of last 7 bits
+   // f = facility code, c = card number
+   // w = wiegand parity, x = extra space for other formats
+   // p = unknown checksum
+   // (26 bit format shown)
+   
+   //get raw ID before removing parities
+   uint32_t rawLo = bytebits_to_byte(BitStream+idx+96,32);
+   uint32_t rawHi = bytebits_to_byte(BitStream+idx+64,32);
+   uint32_t rawHi2 = bytebits_to_byte(BitStream+idx+32,32);
+   uint32_t rawHi3 = bytebits_to_byte(BitStream+idx,32);
+   setDemodBuf(BitStream,128,idx);
+   size = removeParity(BitStream, idx+8, 8, 1, 120);
+   if (size != 105){
+     if (g_debugMode==1) PrintAndLog("DEBUG: Error at parity check-tag size does not match Pyramid format, SIZE: %d, IDX: %d, hi3: %x",size, idx, rawHi3);
+     return 0;
+   }
+   // ok valid card found!
+   // Index map
+   // 0         10        20        30        40        50        60        70
+   // |         |         |         |         |         |         |         |
+   // 01234567890123456789012345678901234567890123456789012345678901234567890
+   // -----------------------------------------------------------------------
+   // 00000000000000000000000000000000000000000000000000000000000000000000000
+   // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+   // 71         80         90          100
+   // |          |          |           |
+   // 1 2 34567890 1234567890123456 7 8901234
+   // ---------------------------------------
+   // 1 1 01110011 0000000001000110 0 1001010
+   // s w ffffffff cccccccccccccccc w ppppppp
+   //     |--115-| |------71------|
+   // s = format start bit, o = odd parity of last 7 bits
+   // f = facility code, c = card number
+   // w = wiegand parity, x = extra space for other formats
+   // p = unknown checksum
+   // (26 bit format shown)
+   //find start bit to get fmtLen
+   int j;
+   for (j=0; j<size; j++){
+     if(BitStream[j]) break;
+   }
+   uint8_t fmtLen = size-j-8;
+   uint32_t fc = 0;
+   uint32_t cardnum = 0;
+   uint32_t code1 = 0;
+   //uint32_t code2 = 0;
+   if (fmtLen==26){
+     fc = bytebits_to_byte(BitStream+73, 8);
+     cardnum = bytebits_to_byte(BitStream+81, 16);
+     code1 = bytebits_to_byte(BitStream+72,fmtLen);
+     PrintAndLog("Pyramid ID Found - BitLength: %d, FC: %d, Card: %d - Wiegand: %x, Raw: %x%08x%08x%08x", fmtLen, fc, cardnum, code1, rawHi3, rawHi2, rawHi, rawLo);
+   } else if (fmtLen==45){
+     fmtLen=42; //end = 10 bits not 7 like 26 bit fmt
+     fc = bytebits_to_byte(BitStream+53, 10);
+     cardnum = bytebits_to_byte(BitStream+63, 32);
+     PrintAndLog("Pyramid ID Found - BitLength: %d, FC: %d, Card: %d - Raw: %x%08x%08x%08x", fmtLen, fc, cardnum, rawHi3, rawHi2, rawHi, rawLo);
+   } else {
+     cardnum = bytebits_to_byte(BitStream+81, 16);
+     if (fmtLen>32){
+       //code1 = bytebits_to_byte(BitStream+(size-fmtLen),fmtLen-32);
+       //code2 = bytebits_to_byte(BitStream+(size-32),32);
+       PrintAndLog("Pyramid ID Found - BitLength: %d -unknown BitLength- (%d), Raw: %x%08x%08x%08x", fmtLen, cardnum, rawHi3, rawHi2, rawHi, rawLo);
+     } else{
+       //code1 = bytebits_to_byte(BitStream+(size-fmtLen),fmtLen);
+       PrintAndLog("Pyramid ID Found - BitLength: %d -unknown BitLength- (%d), Raw: %x%08x%08x%08x", fmtLen, cardnum, rawHi3, rawHi2, rawHi, rawLo);
+     }
+   }
+   if (g_debugMode){
+     PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, 128);
+     printDemodBuff();
+   }
+   return 1;
+ }
  int CmdFSKdemod(const char *Cmd) //old CmdFSKdemod needs updating
  {
    static const int LowTone[]  = {
    PrintAndLog("actual data bits start at sample %d", maxPos);
    PrintAndLog("length %d/%d", highLen, lowLen);
  
-       uint8_t bits[46];
-       bits[sizeof(bits)-1] = '\0';
+   uint8_t bits[46] = {0x00};
  
    // find bit pairs and manchester decode them
    for (i = 0; i < arraylen(bits) - 1; ++i) {
    return 0;
  }
  
+ //by marshmellow
+ //attempt to detect the field clock and bit clock for FSK
+ int CmdFSKfcDetect(const char *Cmd)
+ {
+   uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
+   size_t size = getFromGraphBuf(BitStream);
+   uint16_t ans = countFC(BitStream, size); 
+   if (ans==0) {
+     if (g_debugMode) PrintAndLog("DEBUG: No data found");
+     return 0;
+   }
+   uint8_t fc1, fc2;
+   fc1 = (ans >> 8) & 0xFF;
+   fc2 = ans & 0xFF;
+   uint8_t rf1 = detectFSKClk(BitStream, size, fc1, fc2);
+   if (rf1==0) {
+     if (g_debugMode) PrintAndLog("DEBUG: Clock detect error");
+     return 0;
+   }
+   PrintAndLog("Detected Field Clocks: FC/%d, FC/%d - Bit Clock: RF/%d", fc1, fc2, rf1);
+   return 1;
+ }
+ //by marshmellow
+ //attempt to detect the bit clock for PSK or NRZ modulations
  int CmdDetectNRZpskClockRate(const char *Cmd)
  {
        GetNRZpskClock("",0,0);
        return 0;
  }
  
- int PSKnrzDemod(const char *Cmd){
+ //by marshmellow
+ //attempt to psk1 or nrz demod graph buffer
+ //NOTE CURRENTLY RELIES ON PEAKS :(
+ int PSKnrzDemod(const char *Cmd, uint8_t verbose)
+ {
        int invert=0;
        int clk=0;
        sscanf(Cmd, "%i %i", &clk, &invert);
        int errCnt=0;
        errCnt = pskNRZrawDemod(BitStream, &BitLen,&clk,&invert);
        if (errCnt<0|| BitLen<16){  //throw away static - allow 1 and -1 (in case of threshold command first)
-               //PrintAndLog("no data found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt);
+               if (g_debugMode==1) PrintAndLog("no data found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt);
                return -1;
        }
-       PrintAndLog("Tried PSK/NRZ Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen);
+   if (verbose) PrintAndLog("Tried PSK/NRZ Demod using Clock: %d - invert: %d - Bits Found: %d",clk,invert,BitLen);
  
        //prime demod buffer for output
-       setDemodBuf(BitStream,BitLen);
+       setDemodBuf(BitStream,BitLen,0);
        return errCnt;
  }
  // Indala 26 bit decode
  // optional arguments - same as CmdpskNRZrawDemod (clock & invert)
  int CmdIndalaDecode(const char *Cmd)
  {
-   uint8_t verbose = 1;
    int ans;
    if (strlen(Cmd)>0){
-     if (Cmd[0]=='0'){
-       verbose=0;
-       ans = PSKnrzDemod("32");
-     }else{
-       ans = PSKnrzDemod(Cmd);
-     }
+     ans = PSKnrzDemod(Cmd, 0);
    } else{ //default to RF/32
-     ans = PSKnrzDemod("32");
+     ans = PSKnrzDemod("32", 0);
    }
  
        if (ans < 0){
-               if (verbose
+               if (g_debugMode==1
        PrintAndLog("Error1: %d",ans);
                return 0;
        }
        uint8_t invert=0;
        ans = indala26decode(DemodBuffer,(size_t *) &DemodBufferLen, &invert);
        if (ans < 1) {
-               if (verbose)
+               if (g_debugMode==1)
        PrintAndLog("Error2: %d",ans);
                return -1;
        }
-       char showbits[251];
+       char showbits[251]={0x00};
        if (invert)
-     if (verbose)
+     if (g_debugMode==1)
        PrintAndLog("Had to invert bits");
        //convert UID to HEX
        uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7;
        int idx;
                showbits[idx]='\0';
                PrintAndLog("Indala UID=%s (%x%08x%08x%08x%08x%08x%08x)", showbits, uid1, uid2, uid3, uid4, uid5, uid6, uid7);
        }
+   if (g_debugMode){
+     PrintAndLog("DEBUG: printing demodbuffer:");
+     printDemodBuff();
+   }
        return 1;
  }
  
+ //by marshmellow
+ //attempt to clean psk wave noise after a peak 
+ //NOTE RELIES ON PEAKS :(
  int CmdPskClean(const char *Cmd)
  {
        uint8_t bitStream[MAX_GRAPH_TRACE_LEN]={0};
        return 0;
  }
  
- //by marshmellow
- //takes 2 arguments - clock and invert both as integers
- //attempts to demodulate ask only
- //prints binary found and saves in graphbuffer for further commands
+ // by marshmellow
+ // takes 2 arguments - clock and invert both as integers
+ // attempts to demodulate psk only
+ // prints binary found and saves in demodbuffer for further commands
  int CmdpskNRZrawDemod(const char *Cmd)
  {
-   uint8_t verbose = 1;
    int errCnt;
-   if (strlen(Cmd)>0){
-     if (Cmd[0]=='0')
-       verbose=0;
-   }
-   errCnt = PSKnrzDemod(Cmd);
+  
+   errCnt = PSKnrzDemod(Cmd, 1);
        //output
-       if (errCnt<0) return 0;
+       if (errCnt<0){
+     if (g_debugMode) PrintAndLog("Error demoding: %d",errCnt);  
+     return 0;
+   } 
        if (errCnt>0){
-               if (verbose)
+               if (g_debugMode){
        PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
-       }
-       PrintAndLog("PSK or NRZ demoded bitstream:");
-       // Now output the bitstream to the scrollback by line of 16 bits
-       printDemodBuff();
+       PrintAndLog("PSK or NRZ demoded bitstream:");
+       // Now output the bitstream to the scrollback by line of 16 bits
+       printDemodBuff();
+     }
+       }else{
+     PrintAndLog("PSK or NRZ demoded bitstream:");
+     // Now output the bitstream to the scrollback by line of 16 bits
+     printDemodBuff();  
+     return 1;
+   }
+   return 0;
+ }
  
-       return 1;
+ // by marshmellow
+ // takes same args as cmdpsknrzrawdemod
+ int CmdPSK2rawDemod(const char *Cmd)
+ {
+   int errCnt=0;
+   errCnt=PSKnrzDemod(Cmd, 1);
+   if (errCnt<0){
+     if (g_debugMode) PrintAndLog("Error demoding: %d",errCnt);  
+     return 0;
+   } 
+   psk1TOpsk2(DemodBuffer, DemodBufferLen);
+   if (errCnt>0){
+     if (g_debugMode){
+       PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt);
+       PrintAndLog("PSK2 demoded bitstream:");
+       // Now output the bitstream to the scrollback by line of 16 bits
+       printDemodBuff();
+     }
+   }else{
+     PrintAndLog("PSK2 demoded bitstream:");
+     // Now output the bitstream to the scrollback by line of 16 bits
+     printDemodBuff();  
+   }
+   return 1;
  }
  
  int CmdGrid(const char *Cmd)
@@@ -1034,7 -1426,7 +1465,7 @@@ int CmdHexsamples(const char *Cmd
    int offset = 0;
    char string_buf[25];
    char* string_ptr = string_buf;
-   uint8_t got[40000];
+   uint8_t got[BIGBUF_SIZE];
  
    sscanf(Cmd, "%i %i", &requested, &offset);
  
      requested = 8;
    }
    if (offset + requested > sizeof(got)) {
-     PrintAndLog("Tried to read past end of buffer, <bytes> + <offset> > 40000");
+     PrintAndLog("Tried to read past end of buffer, <bytes> + <offset> > %d", BIGBUF_SIZE);
      return 0;
        }
  
@@@ -1090,79 -1482,25 +1521,79 @@@ int CmdHpf(const char *Cmd
    RepaintGraphWindow();
    return 0;
  }
 +typedef struct {
 +      uint8_t * buffer;
 +      uint32_t numbits;
 +      uint32_t position;
 +}BitstreamOut;
 +
 +bool _headBit( BitstreamOut *stream)
 +{
 +      int bytepos = stream->position >> 3; // divide by 8
 +      int bitpos = (stream->position++) & 7; // mask out 00000111
 +      return (*(stream->buffer + bytepos) >> (7-bitpos)) & 1;
 +}
 +
 +uint8_t getByte(uint8_t bits_per_sample, BitstreamOut* b)
 +{
 +      int i;
 +      uint8_t val = 0;
 +      for(i =0 ; i < bits_per_sample; i++)
 +      {
 +              val |= (_headBit(b) << (7-i));
 +      }
 +      return val;
 +}
  
  int CmdSamples(const char *Cmd)
  {
 -      uint8_t got[BIGBUF_SIZE] = {0x00};
 +      //If we get all but the last byte in bigbuf,
 +      // we don't have to worry about remaining trash
 +      // in the last byte in case the bits-per-sample
 +      // does not line up on byte boundaries
-       uint8_t got[40000-1];
++      uint8_t got[BIGBUF_SIZE-1] = { 0 };
  
        int n = strtol(Cmd, NULL, 0);
        if (n == 0)
 -              n = 20000;
 +              n = sizeof(got);
  
        if (n > sizeof(got))
                n = sizeof(got);
  
 -      PrintAndLog("Reading %d samples from device memory\n", n);
 +      PrintAndLog("Reading %d bytes from device memory\n", n);
        GetFromBigBuf(got,n,0);
 -      WaitForResponse(CMD_ACK,NULL);
 -      for (int j = 0; j < n; j++) {
 -              GraphBuffer[j] = ((int)got[j]) - 128;
 +      PrintAndLog("Data fetched");
 +      UsbCommand response;
 +      WaitForResponse(CMD_ACK, &response);
 +      uint8_t bits_per_sample = 8;
 +
 +      //Old devices without this feature would send 0 at arg[0]
 +      if(response.arg[0] > 0)
 +      {
 +              sample_config *sc = (sample_config *) response.d.asBytes;
 +              PrintAndLog("Samples @ %d bits/smpl, decimation 1:%d ", sc->bits_per_sample
 +                                      , sc->decimation);
 +              bits_per_sample = sc->bits_per_sample;
        }
 -      GraphTraceLen = n;
 +      if(bits_per_sample < 8)
 +      {
 +              PrintAndLog("Unpacking...");
 +              BitstreamOut bout = { got, bits_per_sample * n,  0};
 +              int j =0;
 +              for (j = 0; j * bits_per_sample < n * 8 && j < sizeof(GraphBuffer); j++) {
 +                      uint8_t sample = getByte(bits_per_sample, &bout);
 +                      GraphBuffer[j] = ((int) sample )- 128;
 +              }
 +              GraphTraceLen = j;
 +              PrintAndLog("Unpacked %d samples" , j );
 +      }else
 +      {
 +              for (int j = 0; j < n; j++) {
 +                      GraphBuffer[j] = ((int)got[j]) - 128;
 +              }
 +              GraphTraceLen = n;
 +      }
 +
        RepaintGraphWindow();
        return 0;
  }
@@@ -1221,14 -1559,14 +1652,14 @@@ int CmdTuneSamples(const char *Cmd
  
  int CmdLoad(const char *Cmd)
  {
-    char filename[FILE_PATH_SIZE] = {0x00};
-    int len = 0;
+   char filename[FILE_PATH_SIZE] = {0x00};
+   int len = 0;
  
-    len = strlen(Cmd);
-    if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE;
-    memcpy(filename, Cmd, len);
+   len = strlen(Cmd);
+   if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE;
+   memcpy(filename, Cmd, len);
        
-    FILE *f = fopen(filename, "r");
+   FILE *f = fopen(filename, "r");
    if (!f) {
       PrintAndLog("couldn't open '%s'", filename);
      return 0;
@@@ -1257,6 -1595,8 +1688,8 @@@ int CmdLtrim(const char *Cmd
    RepaintGraphWindow();
    return 0;
  }
+ // trim graph to input argument length
  int CmdRtrim(const char *Cmd)
  {
    int ds = atoi(Cmd);
@@@ -1537,12 -1877,12 +1970,12 @@@ int CmdPlot(const char *Cmd
  
  int CmdSave(const char *Cmd)
  {
-    char filename[FILE_PATH_SIZE] = {0x00};
-    int len = 0;
+   char filename[FILE_PATH_SIZE] = {0x00};
+   int len = 0;
  
-    len = strlen(Cmd);
-    if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE;
-    memcpy(filename, Cmd, len);
+   len = strlen(Cmd);
+   if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE;
+   memcpy(filename, Cmd, len);
     
  
    FILE *f = fopen(filename, "w");
@@@ -1653,19 -1993,23 +2086,23 @@@ static command_t CommandTable[] 
    {"help",          CmdHelp,            1, "This help"},
    {"amp",           CmdAmp,             1, "Amplify peaks"},
    {"askdemod",      Cmdaskdemod,        1, "<0 or 1> -- Attempt to demodulate simple ASK tags"},
-       {"askmandemod",   Cmdaskmandemod,     1, "[clock] [invert<0|1>] -- Attempt to demodulate ASK/Manchester tags and output binary (args optional[clock will try Auto-detect])"},
-       {"askrawdemod",   Cmdaskrawdemod,     1, "[clock] [invert<0|1>] -- Attempt to demodulate ASK tags and output binary (args optional[clock will try Auto-detect])"},
+       {"askmandemod",   Cmdaskmandemod,     1, "[clock] [invert<0|1>] -- Attempt to demodulate ASK/Manchester tags and output binary (args optional)"},
+       {"askrawdemod",   Cmdaskrawdemod,     1, "[clock] [invert<0|1>] -- Attempt to demodulate ASK tags and output bin (args optional)"},
    {"autocorr",      CmdAutoCorr,        1, "<window length> -- Autocorrelation over window"},
-   {"biphaserawdecode",CmdBiphaseDecodeRaw,1,"[offset] Biphase decode binary stream already in graph buffer (offset = bit to start decode from)"},
+   {"biphaserawdecode",CmdBiphaseDecodeRaw,1,"[offset] [invert<0|1>] Biphase decode bin stream in demod buffer (offset = 0|1 bits to shift the decode start)"},
    {"bitsamples",    CmdBitsamples,      0, "Get raw samples as bitstring"},
    {"bitstream",     CmdBitstream,       1, "[clock rate] -- Convert waveform into a bitstream"},
    {"buffclear",     CmdBuffClear,       1, "Clear sample buffer and graph window"},
    {"dec",           CmdDec,             1, "Decimate samples"},
        {"detectclock",   CmdDetectClockRate, 1, "Detect ASK clock rate"},
    {"fskdemod",      CmdFSKdemod,        1, "Demodulate graph window as a HID FSK"},
-   {"fskhiddemod",   CmdFSKdemodHID,     1, "Demodulate graph window as a HID FSK using raw"},
-   {"fskiodemod",    CmdFSKdemodIO,      1, "Demodulate graph window as an IO Prox FSK using raw"},
-       {"fskrawdemod",   CmdFSKrawdemod,     1, "[clock rate] [invert] [rchigh] [rclow] Demodulate graph window from FSK to binary (clock = 50)(invert = 1|0)(rchigh = 10)(rclow=8)"},
+   {"fskawiddemod",  CmdFSKdemodAWID,    1, "Demodulate graph window as an AWID FSK tag using raw"},
+   {"fskfcdetect",   CmdFSKfcDetect,     1, "Try to detect the Field Clock of an FSK wave"},
+   {"fskhiddemod",   CmdFSKdemodHID,     1, "Demodulate graph window as a HID FSK tag using raw"},
+   {"fskiodemod",    CmdFSKdemodIO,      1, "Demodulate graph window as an IO Prox tag FSK using raw"},
+   {"fskpyramiddemod",CmdFSKdemodPyramid,1, "Demodulate graph window as a Pyramid FSK tag using raw"},
+   {"fskparadoxdemod",CmdFSKdemodParadox,1, "Demodulate graph window as a Paradox FSK tag using raw"},
+   {"fskrawdemod",   CmdFSKrawdemod,     1, "[clock rate] [invert] [rchigh] [rclow] Demodulate graph window from FSK to bin (clock = 50)(invert = 1|0)(rchigh = 10)(rclow=8)"},
    {"grid",          CmdGrid,            1, "<x> <y> -- overlay grid on graph window, use zero value to turn off either"},
        {"hexsamples",    CmdHexsamples,      0, "<bytes> [<offset>] -- Dump big buffer as hex bytes"},
    {"hide",          CmdHide,            1, "Hide graph window"},
    {"plot",          CmdPlot,            1, "Show graph window (hit 'h' in window for keystroke help)"},
        {"pskclean",      CmdPskClean,        1, "Attempt to clean psk wave"},
        {"pskdetectclock",CmdDetectNRZpskClockRate, 1, "Detect ASK, PSK, or NRZ clock rate"},
-       {"pskindalademod",CmdIndalaDecode,    1, "[clock] [invert<0|1>] -- Attempt to demodulate psk indala tags and output ID binary & hex (args optional[clock will try Auto-detect])"},
-       {"psknrzrawdemod",CmdpskNRZrawDemod,  1, "[clock] [invert<0|1>] -- Attempt to demodulate psk or nrz tags and output binary (args optional[clock will try Auto-detect])"},
+       {"pskindalademod",CmdIndalaDecode,    1, "[clock] [invert<0|1>] -- Attempt to demodulate psk1 indala tags and output ID binary & hex (args optional)"},
+       {"psk1nrzrawdemod",CmdpskNRZrawDemod, 1, "[clock] [invert<0|1>] -- Attempt to demodulate psk1 or nrz tags and output binary (args optional)"},
+   {"psk2rawdemod",  CmdPSK2rawDemod,    1, "[clock] [invert<0|1>] -- Attempt to demodulate psk2 tags and output binary (args optional)"},
    {"samples",       CmdSamples,         0, "[512 - 40000] -- Get raw samples for graph window"},
    {"save",          CmdSave,            1, "<filename> -- Save trace (from graph window)"},
    {"scale",         CmdScale,           1, "<int> -- Set cursor display scale"},
+   {"setdebugmode",  CmdSetDebugMode,    1, "<0|1> -- Turn on or off Debugging Mode for demods"},
+   {"shiftgraphzero",CmdGraphShiftZero,  1, "<shift> -- Shift 0 for Graphed wave + or - shift value"},
    {"threshold",     CmdThreshold,       1, "<threshold> -- Maximize/minimize every value in the graph window depending on threshold"},
        {"dirthreshold",  CmdDirectionalThreshold,   1, "<thres up> <thres down> -- Max rising higher up-thres/ Min falling lower down-thres, keep rest as prev."},
        {"tune",          CmdTuneSamples,     0, "Get hw tune samples for graph window"},
 -  {"zerocrossings", CmdZerocrossings,   1, "Count time between zero-crossings"},
 +      {"undec",         CmdUndec,         1, "Un-decimate samples by 2"},
 +      {"zerocrossings", CmdZerocrossings,   1, "Count time between zero-crossings"},
    {NULL, NULL, 0, NULL}
  };
  
diff --combined client/cmdlf.c
index 09d9300245c008084337761aa6dd6fcda90b36d0,07a8750f7d20e3b9a3131003276136892ed7824a..f56aa1b7576fe758e5d84cb728f4de9eed02610a
@@@ -356,155 -356,24 +356,155 @@@ int CmdIndalaClone(const char *Cmd
    return 0;
  }
  
 +int usage_lf_read()
 +{
 +      PrintAndLog("Usage: lf read");
 +      PrintAndLog("Options:        ");
 +      PrintAndLog("       h            This help");
 +      PrintAndLog("This function takes no arguments. ");
 +      PrintAndLog("Use 'lf config' to set parameters.");
 +      return 0;
 +}
 +int usage_lf_snoop()
 +{
 +      PrintAndLog("Usage: lf snoop");
 +      PrintAndLog("Options:        ");
 +      PrintAndLog("       h            This help");
 +      PrintAndLog("This function takes no arguments. ");
 +      PrintAndLog("Use 'lf config' to set parameters.");
 +      return 0;
 +}
 +
 +int usage_lf_config()
 +{
 +      PrintAndLog("Usage: lf config [H|<divisor>] [b <bps>] [d <decim>] [a 0|1]");
 +      PrintAndLog("Options:        ");
 +      PrintAndLog("       h             This help");
 +      PrintAndLog("       L             Low frequency (125 KHz)");
 +      PrintAndLog("       H             High frequency (134 KHz)");
 +      PrintAndLog("       q <divisor>   Manually set divisor. 88-> 134KHz, 95-> 125 Hz");
 +      PrintAndLog("       b <bps>       Sets resolution of bits per sample. Default (max): 8");
 +      PrintAndLog("       d <decim>     Sets decimation. A value of N saves only 1 in N samples. Default: 1");
 +      PrintAndLog("       a [0|1]       Averaging - if set, will average the stored sample value when decimating. Default: 1");
 +      PrintAndLog("       t <threshold> Sets trigger threshold. 0 means no threshold");
 +      PrintAndLog("Examples:");
 +      PrintAndLog("      lf config b 8 L");
 +      PrintAndLog("                    Samples at 125KHz, 8bps.");
 +      PrintAndLog("      lf config H b 4 d 3");
 +      PrintAndLog("                    Samples at 134KHz, averages three samples into one, stored with ");
 +      PrintAndLog("                    a resolution of 4 bits per sample.");
 +      PrintAndLog("      lf read");
 +      PrintAndLog("                    Performs a read (active field)");
 +      PrintAndLog("      lf snoop");
 +      PrintAndLog("                    Performs a snoop (no active field)");
 +      return 0;
 +}
 +
 +int CmdLFSetConfig(const char *Cmd)
 +{
 +
 +      uint8_t divisor =  0;//Frequency divisor
 +      uint8_t bps = 0; // Bits per sample
 +      uint8_t decimation = 0; //How many to keep
 +      bool averaging = 1; // Defaults to true
 +      bool errors = FALSE;
 +      int trigger_threshold =-1;//Means no change
 +      uint8_t unsigned_trigg = 0;
 +
 +      uint8_t cmdp =0;
 +      while(param_getchar(Cmd, cmdp) != 0x00)
 +      {
 +              PrintAndLog("working %c", param_getchar(Cmd, cmdp));
 +              switch(param_getchar(Cmd, cmdp))
 +              {
 +              case 'h':
 +                      return usage_lf_config();
 +              case 'H':
 +                      divisor = 88;
 +                      cmdp++;
 +                      break;
 +              case 'L':
 +                      divisor = 95;
 +                      cmdp++;
 +                      break;
 +              case 'q':
 +                      errors |= param_getdec(Cmd,cmdp+1,&divisor);
 +                      cmdp+=2;
 +                      break;
 +              case 't':
 +                      errors |= param_getdec(Cmd,cmdp+1,&unsigned_trigg);
 +                      cmdp+=2;
 +                      if(!errors) trigger_threshold = unsigned_trigg;
 +                      break;
 +              case 'b':
 +                      errors |= param_getdec(Cmd,cmdp+1,&bps);
 +                      cmdp+=2;
 +                      break;
 +              case 'd':
 +                      errors |= param_getdec(Cmd,cmdp+1,&decimation);
 +                      cmdp+=2;
 +                      break;
 +              case 'a':
 +                      averaging = param_getchar(Cmd,cmdp+1) == '1';
 +                      cmdp+=2;
 +                      break;
 +              default:
 +                      PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
 +                      errors = 1;
 +                      break;
 +              }
 +              if(errors) break;
 +      }
 +      if(cmdp == 0)
 +      {
 +              errors = 1;// No args
 +      }
 +
 +      //Validations
 +      if(errors)
 +      {
 +              return usage_lf_config();
 +      }
 +      //Bps is limited to 8, so fits in lower half of arg1
 +      if(bps >> 8) bps = 8;
 +
 +      sample_config config = {
 +              decimation,bps,averaging,divisor,trigger_threshold
 +      };
 +      //Averaging is a flag on high-bit of arg[1]
 +      UsbCommand c = {CMD_SET_LF_SAMPLING_CONFIG};
 +      memcpy(c.d.asBytes,&config,sizeof(sample_config));
 +      SendCommand(&c);
 +      return 0;
 +}
 +
  int CmdLFRead(const char *Cmd)
  {
 -  UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K};
 -
 -  // 'h' means higher-low-frequency, 134 kHz
 -  if(*Cmd == 'h') {
 -    c.arg[0] = 1;
 -  } else if (*Cmd == '\0') {
 -    c.arg[0] = 0;
 -  } else if (sscanf(Cmd, "%"lli, &c.arg[0]) != 1) {
 -              PrintAndLog("Samples 1: 'lf read'");
 -              PrintAndLog("        2: 'lf read h'");
 -              PrintAndLog("        3: 'lf read <divisor>'");
 -    return 0;
 -  }
 -  SendCommand(&c);
 -  WaitForResponse(CMD_ACK,NULL);
 -  return 0;
 +
 +      uint8_t cmdp =0;
 +      if(param_getchar(Cmd, cmdp) == 'h')
 +      {
 +              return usage_lf_read();
 +      }
 +      //And ship it to device
 +      UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K};
 +      SendCommand(&c);
 +      WaitForResponse(CMD_ACK,NULL);
 +      return 0;
 +}
 +
 +int CmdLFSnoop(const char *Cmd)
 +{
 +      uint8_t cmdp =0;
 +      if(param_getchar(Cmd, cmdp) == 'h')
 +      {
 +              return usage_lf_snoop();
 +      }
 +
 +      UsbCommand c = {CMD_LF_SNOOP_RAW_ADC_SAMPLES};
 +      SendCommand(&c);
 +      WaitForResponse(CMD_ACK,NULL);
 +      return 0;
  }
  
  static void ChkBitstream(const char *str)
      }
    }
  }
+ //appears to attempt to simulate manchester
  int CmdLFSim(const char *Cmd)
  {
        int i,j;
@@@ -581,6 -450,33 +581,6 @@@ 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 == '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("usage 1:  snoop");
 -              PrintAndLog("      2:  snoop <l|h> [trigger threshold]");
 -              PrintAndLog("      3:  snoop <divisor> [trigger threshold]");
 -              PrintAndLog("");
 -              PrintAndLog("Sample: lf snoop l 200");
 -              PrintAndLog("      : lf snoop 95 200");
 -    return 0;
 -  }
 -
 -  SendCommand(&c);
 -  WaitForResponse(CMD_ACK,NULL);
 -  return 0;
 -}
  
  int CmdVchDemod(const char *Cmd)
  {
@@@ -682,26 -578,41 +682,41 @@@ int CmdLFfind(const char *Cmd
    }
  
    PrintAndLog("NOTE: some demods output possible binary\n  if it finds something that looks like a tag");
-   PrintAndLog("Checking for known tags:");
+   PrintAndLog("\nChecking for known tags:\n");
    ans=CmdFSKdemodIO("");
    if (ans>0) {
-     PrintAndLog("Valid IO Prox ID Found!");
+     PrintAndLog("\nValid IO Prox ID Found!");
+     return 1;
+   }
+   ans=CmdFSKdemodPyramid("");
+   if (ans>0) {
+     PrintAndLog("\nValid Pyramid ID Found!");
+     return 1;
+   }
+   ans=CmdFSKdemodParadox("");
+   if (ans>0) {
+     PrintAndLog("\nValid Paradox ID Found!");
+     return 1;
+   }
+   ans=CmdFSKdemodAWID("");
+   if (ans>0) {
+     PrintAndLog("\nValid AWID ID Found!");
      return 1;
    }
    ans=CmdFSKdemodHID("");
    if (ans>0) {
-     PrintAndLog("Valid HID Prox ID Found!");
+     PrintAndLog("\nValid HID Prox ID Found!");
      return 1;
    }
    //add psk and indala
-   ans=CmdIndalaDecode("0");
+   ans=CmdIndalaDecode("");
    if (ans>0) {
-     PrintAndLog("Valid Indala ID Found!");
+     PrintAndLog("\nValid Indala ID Found!");
      return 1;
    }
    ans=Cmdaskmandemod("");
    if (ans>0) {
-     PrintAndLog("Valid EM410x ID Found!");
+     PrintAndLog("\nValid EM410x ID Found!");
      return 1;
    }
    PrintAndLog("No Known Tags Found!\n");
@@@ -713,13 -624,12 +728,13 @@@ static command_t CommandTable[] 
    {"help",        CmdHelp,            1, "This help"},
    {"cmdread",     CmdLFCommandRead,   0, "<off period> <'0' period> <'1' period> <command> ['h'] -- Modulate LF reader field to send command before read (all periods in microseconds) (option 'h' for 134)"},
    {"em4x",        CmdLFEM4X,          1, "{ EM4X RFIDs... }"},
 +  {"config",      CmdLFSetConfig,     0, "Set config for LF sampling, bit/sample, decimation, frequency"},
    {"flexdemod",   CmdFlexdemod,       1, "Demodulate samples for FlexPass"},
    {"hid",         CmdLFHID,           1, "{ HID RFIDs... }"},
    {"io",                CmdLFIO,                1, "{ ioProx tags... }"},
    {"indalademod", CmdIndalaDemod,     1, "['224'] -- Demodulate samples for Indala 64 bit UID (option '224' for 224 bit)"},
    {"indalaclone", CmdIndalaClone,     0, "<UID> ['l']-- Clone Indala to T55x7 (tag must be in antenna)(UID in HEX)(option 'l' for 224 UID"},
 -  {"read",        CmdLFRead,          0, "['h' or <divisor>] -- Read 125/134 kHz LF ID-only tag (option 'h' for 134, alternatively: f=12MHz/(divisor+1))"},
 +  {"read",        CmdLFRead,          0, "Read 125/134 kHz LF ID-only tag. Do 'lf read h' for help"},
    {"search",      CmdLFfind,          1, "Read and Search for valid known tag (in offline mode it you can load first then search)"},
    {"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)"},
diff --combined client/graph.h
index 2c448161c522dab6d6dab20c195e61055e8d9a0f,fe35d4f1c858aba645cf322346dfb7ca78487c02..9817d7762d7575714b994927a2bd7e0e2a452400
@@@ -20,9 -20,10 +20,12 @@@ int GetClock(const char *str, int peak
  int GetNRZpskClock(const char *str, int peak, int verbose);
  void setGraphBuf(uint8_t *buff, size_t size);
  
 -#define MAX_GRAPH_TRACE_LEN (1024*128)
+ bool HasGraphData();
+ void DetectHighLowInGraph(int *high, int *low, bool addFuzz); 
 +// Max graph trace len: 40000 (bigbuf) * 8 (at 1 bit per sample)
 +#define MAX_GRAPH_TRACE_LEN (40000 * 8 )
++
  extern int GraphBuffer[MAX_GRAPH_TRACE_LEN];
  extern int GraphTraceLen;
  #endif
Impressum, Datenschutz