]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
lf sim fixes/creations correct now
authormarshmellow42 <marshmellowrf@gmail.com>
Fri, 6 Mar 2015 17:28:54 +0000 (12:28 -0500)
committermarshmellow42 <marshmellowrf@gmail.com>
Fri, 6 Mar 2015 17:28:54 +0000 (12:28 -0500)
fixed lf simpsk
fixed lf em em410xsim
fixed lf sim  (can go right from lf search to lf sim if you have a
strong antenna - if not use a demod first)

armsrc/lfops.c
client/cmddata.c
client/cmddata.h
client/cmdlf.c
client/cmdlf.h
client/cmdlfem4x.c
client/graph.c

index 3684eaaf83d834fac14275f0b354a9222510bf67..13cf296712e4dc1aa81b974fc6b9082bca0b1552 100644 (file)
@@ -438,86 +438,6 @@ void SimulateTagLowFrequency(int period, int gap, int ledcontrol)
     }
 }
 
-//Testing to fix timing issues by marshmellow (MM)
-void SimulateTagLowFrequencyMM(int period, int gap, int ledcontrol)
-{
-    int i;
-    uint8_t *tab = BigBuf_get_addr();
-
-    FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
-    FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_EDGE_DETECT);
-
-    AT91C_BASE_PIOA->PIO_PER = GPIO_SSC_DOUT | GPIO_SSC_CLK;
-
-    AT91C_BASE_PIOA->PIO_OER = GPIO_SSC_DOUT;
-    AT91C_BASE_PIOA->PIO_ODR = GPIO_SSC_CLK;
-
- #define SHORT_COIL()   LOW(GPIO_SSC_DOUT)
- #define OPEN_COIL()        HIGH(GPIO_SSC_DOUT)
-
-    i = 0;
-    while(!BUTTON_PRESS()) {
-
-        WDT_HIT();
-        //wait until reader carrier is HIGH
-        while(!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)) {
-            WDT_HIT();
-        }
-        if (i>0){
-            if (tab[i]!=tab[i-1]){
-                // transition
-                if (ledcontrol)
-                    LED_D_ON();
-
-                // modulate coil
-                if(tab[i])
-                    OPEN_COIL();
-                else
-                    SHORT_COIL();
-
-                if (ledcontrol)
-                    LED_D_OFF();
-
-            } else { //no transition
-                //NOTE: it appears the COIL transition messes with the detection of the carrier, so if a transition happened
-                //  skip test for readers Carrier = LOW, otherwise we get a bit behind
-                
-                //wait until reader carrier is LOW
-                while(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK) {
-                    WDT_HIT();
-                }                
-            }
-        } else {
-            // transition
-            if (ledcontrol)
-                LED_D_ON();
-
-            // modulate coil
-            if(tab[i])
-                OPEN_COIL();
-            else
-                SHORT_COIL();
-
-            if (ledcontrol)
-                LED_D_OFF();
-        }
-        WDT_HIT();
-      
-               
-        i++;
-        if(i == period) {      
-            // end of data stream, gap then repeat
-            i = 0;
-            if (gap) {
-                SHORT_COIL();
-                SpinDelayUs(gap);
-            }
-        }
-    }
-    DbpString("Stopped");
-    return;
-}
-
 #define DEBUG_FRAME_CONTENTS 1
 void SimulateTagLowFrequencyBidir(int divisor, int t0)
 {
@@ -586,7 +506,7 @@ static void fcAll(uint8_t c, int *n, uint8_t clock, uint16_t *modCnt)
     for (idx=0; idx < (uint8_t) clock/c; idx++){
         // loop through field clock length - put 1/2 FC length 1's and 1/2 0's per field clock wave (to create the wave)
         for (fcCnt=0; fcCnt < c; fcCnt++){  //fudge slow transition from low to high - shorten wave by 1
-            if (fcCnt < c/2+1){
+            if (fcCnt < c/2){
                 dest[((*n)++)]=0;
             } else {
                 //fudge low to high transition
@@ -600,7 +520,7 @@ static void fcAll(uint8_t c, int *n, uint8_t clock, uint16_t *modCnt)
     if ((mod>0) && modAdjOk){  //fsk2 
         if ((*modCnt % modAdj) == 0){ //if 4th 8 length wave in a rf/50 add extra 8 length wave
             for (fcCnt=0; fcCnt < c; fcCnt++){  //fudge slow transition from low to high - shorten wave by 1
-                if (fcCnt < c/2+1){
+                if (fcCnt < c/2){
                     dest[((*n)++)]=0;
                 } else {
                     //if (c==8 && fcCnt==5) continue; 
@@ -637,7 +557,7 @@ void CmdHIDsimTAG(int hi, int lo, int ledcontrol)
     */
 
     if (hi>0xFFF) {
-        DbpString("Tags can only have 44 bits.");
+        DbpString("Tags can only have 44 bits. - USE lf simfsk for larger tags");
         return;
     }
     fc(0,&n);
@@ -701,7 +621,8 @@ void CmdFSKsimTAG(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
         }
     }
     Dbprintf("Simulating with fcHigh: %d, fcLow: %d, clk: %d, invert: %d, n: %d",fcHigh, fcLow, clk, invert, n);
-    Dbprintf("First 64:");
+     WDT_HIT();
+    /*Dbprintf("First 64:");
     uint8_t *dest = BigBuf_get_addr();
     i=0;
     Dbprintf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", dest[i],dest[i+1],dest[i+2],dest[i+3],dest[i+4],dest[i+5],dest[i+6],dest[i+7],dest[i+8],dest[i+9],dest[i+10],dest[i+11],dest[i+12],dest[i+13],dest[i+14],dest[i+15]);
@@ -733,10 +654,10 @@ void CmdFSKsimTAG(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
     Dbprintf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", dest[i],dest[i+1],dest[i+2],dest[i+3],dest[i+4],dest[i+5],dest[i+6],dest[i+7],dest[i+8],dest[i+9],dest[i+10],dest[i+11],dest[i+12],dest[i+13],dest[i+14],dest[i+15]);
     i+=16;
     Dbprintf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", dest[i],dest[i+1],dest[i+2],dest[i+3],dest[i+4],dest[i+5],dest[i+6],dest[i+7],dest[i+8],dest[i+9],dest[i+10],dest[i+11],dest[i+12],dest[i+13],dest[i+14],dest[i+15]);
-           
+    */     
     if (ledcontrol)
         LED_A_ON();
-    SimulateTagLowFrequencyMM(n, 0, ledcontrol);
+    SimulateTagLowFrequency(n, 0, ledcontrol);
 
     if (ledcontrol)
         LED_A_OFF();
@@ -779,7 +700,6 @@ void CmdASKsimTag(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
     uint8_t manchester = arg1 & 1;
     uint8_t separator = arg2 & 1;
     uint8_t invert = (arg2 >> 8) & 1;
-    WDT_HIT();
     for (i=0; i<size; i++){
         askSimBit(BitStream[i]^invert, &n, clk, manchester);
     }
@@ -801,7 +721,7 @@ void CmdASKsimTag(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
 
     if (ledcontrol)
         LED_A_ON();
-    SimulateTagLowFrequencyMM(n, 0, ledcontrol);
+    SimulateTagLowFrequency(n, 0, ledcontrol);
 
     if (ledcontrol)
         LED_A_OFF();
@@ -815,13 +735,14 @@ static void pskSimBit(uint8_t waveLen, int *n, uint8_t clk, uint8_t *curPhase, b
     int i = 0;
     if (phaseChg){
         // write phase change
-        for (i=0; i < waveLen/2; i++){
+        for (idx=0; idx < waveLen/2; idx++){
             dest[((*n)++)] = *curPhase^1;
         }
-        for (i=0; i < waveLen/2; i++){
+        for (idx=0; idx < waveLen/2; idx++){
             dest[((*n)++)] = *curPhase;
         }
         *curPhase ^= 1;
+        i+=waveLen;
     }
     //write each normal clock wave for the clock duration
     for (; i < clk; i+=waveLen){
@@ -844,8 +765,8 @@ void CmdPSKsimTag(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
     uint8_t invert = arg2 & 0xFF;
     //uint8_t phase = carrier/2; //extra phase changing bits = 1/2 a carrier wave to change the phase
     //uint8_t invert = (arg2 >> 8) & 1;
-    uint8_t curPhase = 0;
     WDT_HIT();
+    uint8_t curPhase = 0;
     for (i=0; i<size; i++){
         if (BitStream[i] == curPhase){
             pskSimBit(carrier, &n, clk, &curPhase, FALSE);
@@ -854,6 +775,7 @@ void CmdPSKsimTag(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
         }            
     }
     Dbprintf("Simulating with Carrier: %d, clk: %d, invert: %d, n: %d",carrier, clk, invert, n);
+    WDT_HIT();
     Dbprintf("First 128:");
     uint8_t *dest = BigBuf_get_addr();
     i=0;
@@ -875,7 +797,7 @@ void CmdPSKsimTag(uint16_t arg1, uint16_t arg2, size_t size, uint8_t *BitStream)
            
     if (ledcontrol)
         LED_A_ON();
-    SimulateTagLowFrequencyMM(n, 0, ledcontrol);
+    SimulateTagLowFrequency(n, 0, ledcontrol);
 
     if (ledcontrol)
         LED_A_OFF();
index b8b95c049a223a640b1c4d7a6a30bf28bf40b163..966e2a00398a661860958be0f278d3be4cdff9f8 100644 (file)
@@ -133,20 +133,19 @@ int CmdAmp(const char *Cmd)
  * Updates the Graph trace with 0/1 values
  *
  * Arguments:
- * c : 0 or 1
+ * c : 0 or 1  (or invert)
  */
- //this method is dependant on all highs and lows to be the same(or clipped)  this creates issues[marshmellow] it also ignores the clock
+ //this method ignores the clock
+
+ //this function strictly converts highs and lows to 1s and 0s for each sample in the graphbuffer
 int Cmdaskdemod(const char *Cmd)
 {
   int i;
   int c, high = 0, low = 0;
 
-  // TODO: complain if we do not give 2 arguments here !
-  // (AL - this doesn't make sense! we're only using one argument!!!)
   sscanf(Cmd, "%i", &c);
 
-  /* Detect high and lows and clock */
-       // (AL - clock???)
+  /* Detect high and lows */
   for (i = 0; i < GraphTraceLen; ++i)
   {
     if (GraphBuffer[i] > high)
@@ -176,9 +175,9 @@ int Cmdaskdemod(const char *Cmd)
      * down)
      */
     //[marhsmellow] change == to >= for high and <= for low for fuzz
-    if ((GraphBuffer[i] == high) && (GraphBuffer[i - 1] == c)) {
+    if ((GraphBuffer[i] >= high) && (GraphBuffer[i - 1] == c)) {
       GraphBuffer[i] = 1 - c;
-    } else if ((GraphBuffer[i] == low) && (GraphBuffer[i - 1] == (1 - c))){
+    } else if ((GraphBuffer[i] <= low) && (GraphBuffer[i - 1] == (1 - c))){
       GraphBuffer[i] = c;
     } else {
       /* No transition */
@@ -189,6 +188,23 @@ int Cmdaskdemod(const char *Cmd)
   return 0;
 }
 
+//this function strictly converts >1 to 1 and <1 to 0 for each sample in the graphbuffer
+int CmdGetBitStream(const char *Cmd)
+{
+  int i;
+  CmdHpf(Cmd);
+  for (i = 0; i < GraphTraceLen; i++) {
+    if (GraphBuffer[i] >= 1) {
+      GraphBuffer[i] = 1;
+    } else {
+      GraphBuffer[i] = 0;
+    }
+  }
+  RepaintGraphWindow();
+  return 0;
+}
+
+
 //by marshmellow
 void printBitStream(uint8_t BitStream[], uint32_t bitLen)
 {
@@ -1954,6 +1970,7 @@ int CmdHide(const char *Cmd)
   return 0;
 }
 
+//zero mean GraphBuffer
 int CmdHpf(const char *Cmd)
 {
   int i;
@@ -2561,6 +2578,7 @@ static command_t CommandTable[] =
   {"fskpyramiddemod",CmdFSKdemodPyramid,1, "Demodulate a Pyramid FSK tag from GraphBuffer"},
   {"fskparadoxdemod",CmdFSKdemodParadox,1, "Demodulate a Paradox FSK tag from GraphBuffer"},
   //{"fskrawdemod",   CmdFSKrawdemod,     1, "[clock rate] [invert] [rchigh] [rclow] Demodulate graph window from FSK to bin (clock = 50)(invert = 1|0)(rchigh = 10)(rclow=8)"},
+  {"getbitstream",  CmdGetBitStream,    1, "Convert GraphBuffer's >=1 values to 1 and <1 to 0"},
   {"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"},
index 673a2ba065667b273cc65698e73ad7e1260b539f..a746d89f7190412f1fdbd75de5c5b3a02355d13a 100644 (file)
@@ -39,6 +39,7 @@ int CmdFSKrawdemod(const char *Cmd);
 int CmdPSK1rawDemod(const char *Cmd);
 int CmdPSK2rawDemod(const char *Cmd);
 int CmdGrid(const char *Cmd);
+int CmdGetBitStream(const char *Cmd);
 int CmdHexsamples(const char *Cmd);
 int CmdHide(const char *Cmd);
 int CmdHpf(const char *Cmd);
index 1222b3cec2f3e0e898359bf0e008fa9c5d4ef4f8..1c53c20492e8c8e05c4fec640235c34b0477fae6 100644 (file)
@@ -510,11 +510,11 @@ int CmdLFSnoop(const char *Cmd)
 static void ChkBitstream(const char *str)
 {
   int i;
-
   /* convert to bitstream if necessary */
        for (i = 0; i < (int)(GraphTraceLen / 2); i++){
                if (GraphBuffer[i] > 1 || GraphBuffer[i] < 0) {
-      CmdBitstream(str);
+      CmdGetBitStream("");
       break;
     }
   }
@@ -528,6 +528,7 @@ int CmdLFSim(const char *Cmd)
   sscanf(Cmd, "%i", &gap);
 
   /* convert to bitstream if necessary */
+
   ChkBitstream(Cmd);
 
   //can send 512 bits at a time (1 byte sent per bit...)
@@ -878,6 +879,7 @@ int CmdLFpskSim(const char *Cmd)
   uint16_t arg1, arg2;
   arg1 = clk << 8 | carrier;
   arg2 = invert;
+
   UsbCommand c = {CMD_PSK_SIM_TAG, {arg1, arg2, DemodBufferLen}};
   if (DemodBufferLen > USB_CMD_DATA_SIZE) {
     PrintAndLog("DemodBuffer too long for current implementation - length: %d - max: %d", DemodBufferLen, USB_CMD_DATA_SIZE);
@@ -885,6 +887,7 @@ int CmdLFpskSim(const char *Cmd)
   PrintAndLog("DEBUG: Sending DemodBuffer Length: %d", DemodBufferLen);
   memcpy(c.d.asBytes, DemodBuffer, DemodBufferLen);
   SendCommand(&c);
+  
   return 0;
 }
 
@@ -899,6 +902,7 @@ int CmdLFSimBidir(const char *Cmd)
 }
 
 /* simulate an LF Manchester encoded tag with specified bitstream, clock rate and inter-id gap */
+/*
 int CmdLFSimManchester(const char *Cmd)
 {
   static int clock, gap;
@@ -919,7 +923,7 @@ int CmdLFSimManchester(const char *Cmd)
   CmdLFSim(gapstring);
   return 0;
 }
-
+*/
 
 int CmdVchDemod(const char *Cmd)
 {
@@ -1111,11 +1115,11 @@ static command_t CommandTable[] =
   {"read",        CmdLFRead,          0, "Read 125/134 kHz LF ID-only tag. Do 'lf read h' for help"},
   {"search",      CmdLFfind,          1, "[offline] ['u'] Read and Search for valid known tag (in offline mode it you can load first then search) - 'u' to search for unknown tags"},
   {"sim",         CmdLFSim,           0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"},
-  {"simask",      CmdLFaskSim,        0, "[clock] [invert <1|0>] [manchester/raw <'m'|'r'>] [trs separator 's'] [d <hexdata>] -- Simulate LF ASK tag from demodbuffer or input"},
+  {"simask",      CmdLFaskSim,        0, "[clock] [invert <1|0>] [manchester/raw <'m'|'r'>] [msg separator 's'] [d <hexdata>] -- Simulate LF ASK tag from demodbuffer or input"},
   {"simfsk",      CmdLFfskSim,        0, "[c <clock>] [i] [H <fcHigh>] [L <fcLow>] [d <hexdata>] -- Simulate LF FSK tag from demodbuffer or input"},
   {"simpsk",      CmdLFpskSim,        0, "[1|2|3] [c <clock>] [i] [r <carrier>] [d <raw hex to sim>] -- Simulate LF PSK tag from demodbuffer or input"},
   {"simbidir",    CmdLFSimBidir,      0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"},
-  {"simman",      CmdLFSimManchester, 0, "<Clock> <Bitstream> [GAP] Simulate arbitrary Manchester LF tag"},
+  //{"simman",      CmdLFSimManchester, 0, "<Clock> <Bitstream> [GAP] Simulate arbitrary Manchester LF tag"},
   {"snoop",       CmdLFSnoop,         0, "['l'|'h'|<divisor>] [trigger threshold]-- Snoop LF (l:125khz, h:134khz)"},
   {"ti",          CmdLFTI,            1, "{ TI RFIDs... }"},
   {"hitag",       CmdLFHitag,         1, "{ Hitag tags and transponders... }"},
index 18a28b10ba80b46e542350401325ab547e2ea8b2..254d8807b5aef5f40870910fc19239b93fda0510 100644 (file)
@@ -23,7 +23,7 @@ int CmdLFaskSim(const char *Cmd);
 int CmdLFfskSim(const char *Cmd);
 int CmdLFpskSim(const char *Cmd);
 int CmdLFSimBidir(const char *Cmd);
-int CmdLFSimManchester(const char *Cmd);
+//int CmdLFSimManchester(const char *Cmd);
 int CmdLFSnoop(const char *Cmd);
 int CmdVchDemod(const char *Cmd);
 int CmdLFfind(const char *Cmd);
index 232d56357cfa4ffd99e9f0a3f048d9696778bc74..f6671bcdb27586eb376e147d9df30ed27cdaf17a 100644 (file)
@@ -266,7 +266,7 @@ int CmdEM410xSim(const char *Cmd)
     /* stop bit */
   AppendGraph(1, clock, 0);
  
-  CmdLFSim("240"); //240 start_gap.
+  CmdLFSim("0"); //240 start_gap.
   return 0;
 }
 
index 243da4664b18a2ec365a77c3adb02a922ecf7c43..190dfe8f731dc9fbcd1a299261312e02c409b569 100644 (file)
@@ -24,10 +24,10 @@ void AppendGraph(int redraw, int clock, int bit)
   int i;
   //set first half the clock bit (all 1's or 0's for a 0 or 1 bit) 
   for (i = 0; i < (int)(clock / 2); ++i)
-    GraphBuffer[GraphTraceLen++] = bit ^ 1;
+    GraphBuffer[GraphTraceLen++] = bit ;
   //set second half of the clock bit (all 0's or 1's for a 0 or 1 bit)
   for (i = (int)(clock / 2); i < clock; ++i)
-    GraphBuffer[GraphTraceLen++] = bit;
+    GraphBuffer[GraphTraceLen++] = bit ^ 1;
 
   if (redraw)
     RepaintGraphWindow();
Impressum, Datenschutz