]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/appmain.c
New mode define for FPGA
[proxmark3-svn] / armsrc / appmain.c
index 09f11f03670f2a6308b784580f79d56dc0cfd884..b539e6676ccccb5dbb674e64b918b350e29387c1 100644 (file)
@@ -240,92 +240,55 @@ static int AvgAdc(int ch)
        return (a + 15) >> 5;
 }
 
-/*
- * Sweeps the useful LF range of the proxmark from
- * 46.8kHz (divisor=255) to 600kHz (divisor=19) and
- * reads the voltage in the antenna: the result is a graph
- * which should clearly show the resonating frequency of your
- * LF antenna ( hopefully around 90 if it is tuned to 125kHz!)
- */
-void SweepLFrange()
+void MeasureAntennaTuning(void)
 {
        BYTE *dest = (BYTE *)BigBuf;
-       char dummy[12];
-       int i, peak= 0, ptr= 0;
-       double freq;
+       int i, ptr = 0, adcval = 0, peak = 0, peakv = 0, peakf = 0;;
+       int vLf125 = 0, vLf134 = 0, vHf = 0;    // in mV
 
-       // clear buffer
+       UsbCommand c;
+
+       DbpString("Measuring antenna characteristics, please wait.");
        memset(BigBuf,0,sizeof(BigBuf));
 
+/*
+ * Sweeps the useful LF range of the proxmark from
+ * 46.8kHz (divisor=255) to 600kHz (divisor=19) and
+ * read the voltage in the antenna, the result left
+ * in the buffer is a graph which should clearly show
+ * the resonating frequency of your LF antenna
+ * ( hopefully around 95 if it is tuned to 125kHz!)
+ */
        FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER);
        for (i=255; i>19; i--) {
                FpgaSendCommand(FPGA_CMD_SET_DIVISOR, i);
                SpinDelay(20);
-               dest[i] = (137500 * AvgAdc(ADC_CHAN_LF)) >> 18;
+               // Vref = 3.3V, and a 10000:240 voltage divider on the input
+               // can measure voltages up to 137500 mV
+               adcval = ((137500 * AvgAdc(ADC_CHAN_LF)) >> 10);
+               if (i==95)      vLf125 = adcval; // voltage at 125Khz
+               if (i==89)      vLf134 = adcval; // voltage at 134Khz
+
+               dest[i] = adcval>>8; // scale int to fit in byte for graphing purposes
                if(dest[i] > peak) {
-                       peak= dest[i];
-                       ptr= i;
-                       }
-       }
-       dummy[11]= '\0';
-       dummy[10]= 'z';
-       dummy[9]= 'H';
-       dummy[8]= 'k';
-       dummy[7]= ' ';
-       freq= 12000000/(ptr + 1);
-       for(i= 6; i > 3 ; --i) {
-               dummy[i]= '0' + ((int) freq) % 10;
-               freq /= 10;
+                       peakv = adcval;
+                       peak = dest[i];
+                       peakf = i;
+                       ptr = i;
                }
-       dummy[3]= '.';
-       for(i= 2; i >= 0 ; --i) {
-               dummy[i]= '0' + ((int) freq) % 10;
-               freq /= 10;
-               }
-       DbpString("Antenna resonates at:");
-       DbpString(dummy);
-}
-
-void MeasureAntennaTuning(void)
-{
-// Impedances are Zc = 1/(j*omega*C), in ohms
-#define LF_TUNING_CAP_Z        1273    //  1 nF @ 125   kHz
-#define HF_TUNING_CAP_Z        235             // 50 pF @ 13.56 MHz
-
-       int vLf125, vLf134, vHf;        // in mV
-
-       UsbCommand c;
-
-       // Let the FPGA drive the low-frequency antenna around 125 kHz.
-       FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz
-       FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER | FPGA_LF_READER_USE_125_KHZ);
-       SpinDelay(20);
-       vLf125 = AvgAdc(ADC_CHAN_LF);
-       // Vref = 3.3V, and a 10000:240 voltage divider on the input
-       // can measure voltages up to 137500 mV
-       vLf125 = (137500 * vLf125) >> 10;
-
-       // Let the FPGA drive the low-frequency antenna around 134 kHz.
-       FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 88); //134.8Khz
-       FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER | FPGA_LF_READER_USE_134_KHZ);
-       SpinDelay(20);
-       vLf134 = AvgAdc(ADC_CHAN_LF);
-       // Vref = 3.3V, and a 10000:240 voltage divider on the input
-       // can measure voltages up to 137500 mV
-       vLf134 = (137500 * vLf134) >> 10;
+       }
 
        // Let the FPGA drive the high-frequency antenna around 13.56 MHz.
        FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
        SpinDelay(20);
-       vHf = AvgAdc(ADC_CHAN_HF);
        // Vref = 3300mV, and an 10:1 voltage divider on the input
        // can measure voltages up to 33000 mV
-       vHf = (33000 * vHf) >> 10;
+       vHf = (33000 * AvgAdc(ADC_CHAN_HF)) >> 10;
 
        c.cmd = CMD_MEASURED_ANTENNA_TUNING;
        c.ext1 = (vLf125 << 0) | (vLf134 << 16);
        c.ext2 = vHf;
-       c.ext3 = (LF_TUNING_CAP_Z << 0) | (HF_TUNING_CAP_Z << 16);
+       c.ext3 =  peakf | (peakv << 16);
        UsbSendPacket((BYTE *)&c, sizeof(c));
 }
 
@@ -836,10 +799,6 @@ void UsbPacketReceived(BYTE *packet, int len)
                case CMD_READ_MEM:
                        ReadMem(c->ext1);
                        break;
-               case CMD_SWEEP_LF:
-                       SweepLFrange();
-                       break;
-
                case CMD_SET_LF_DIVISOR:
                        FpgaSendCommand(FPGA_CMD_SET_DIVISOR, c->ext1);
                        break;
@@ -883,10 +842,10 @@ void AppMain(void)
        memset(BigBuf,0,sizeof(BigBuf));
        SpinDelay(100);
 
-    LED_D_OFF();
-    LED_C_OFF();
-    LED_B_OFF();
-    LED_A_OFF();
+       LED_D_OFF();
+       LED_C_OFF();
+       LED_B_OFF();
+       LED_A_OFF();
 
        UsbStart();
 
@@ -912,14 +871,14 @@ void AppMain(void)
        LCDInit();
 
        // test text on different colored backgrounds
-    LCDString(" The quick brown fox  ",        &FONT6x8,1,1+8*0,WHITE  ,BLACK );
-    LCDString("  jumped over the     ",        &FONT6x8,1,1+8*1,BLACK  ,WHITE );
-    LCDString("     lazy dog.        ",        &FONT6x8,1,1+8*2,YELLOW ,RED   );
-    LCDString(" AaBbCcDdEeFfGgHhIiJj ",        &FONT6x8,1,1+8*3,RED    ,GREEN );
-    LCDString(" KkLlMmNnOoPpQqRrSsTt ",        &FONT6x8,1,1+8*4,MAGENTA,BLUE  );
-    LCDString("UuVvWwXxYyZz0123456789",        &FONT6x8,1,1+8*5,BLUE   ,YELLOW);
-    LCDString("`-=[]_;',./~!@#$%^&*()",        &FONT6x8,1,1+8*6,BLACK  ,CYAN  );
-    LCDString("     _+{}|:\\\"<>?     ",&FONT6x8,1,1+8*7,BLUE  ,MAGENTA);
+       LCDString(" The quick brown fox  ",     &FONT6x8,1,1+8*0,WHITE  ,BLACK );
+       LCDString("  jumped over the     ",     &FONT6x8,1,1+8*1,BLACK  ,WHITE );
+       LCDString("     lazy dog.        ",     &FONT6x8,1,1+8*2,YELLOW ,RED   );
+       LCDString(" AaBbCcDdEeFfGgHhIiJj ",     &FONT6x8,1,1+8*3,RED    ,GREEN );
+       LCDString(" KkLlMmNnOoPpQqRrSsTt ",     &FONT6x8,1,1+8*4,MAGENTA,BLUE  );
+       LCDString("UuVvWwXxYyZz0123456789",     &FONT6x8,1,1+8*5,BLUE   ,YELLOW);
+       LCDString("`-=[]_;',./~!@#$%^&*()",     &FONT6x8,1,1+8*6,BLACK  ,CYAN  );
+       LCDString("     _+{}|:\\\"<>?     ",&FONT6x8,1,1+8*7,BLUE  ,MAGENTA);
 
        // color bands
        LCDFill(0, 1+8* 8, 132, 8, BLACK);
@@ -988,9 +947,14 @@ void SamyRun()
                                                
                        // record
                        DbpString("Starting recording");
-                       
+
+                       // wait for button to be released
+                       while(BUTTON_PRESS())
+                               WDT_HIT();
+
                        /* need this delay to prevent catching some weird data */
                        SpinDelay(500);
+
                        CmdHIDdemodFSK(1, &high[selected], &low[selected], 0);
                        DbpString("Recorded");
                        DbpIntegers(selected, high[selected], low[selected]);
@@ -1020,9 +984,18 @@ void SamyRun()
                        {
                                LED(LED_GREEN, 0);
                                DbpString("Playing");
+                               // wait for button to be released
+                               while(BUTTON_PRESS())
+                                       WDT_HIT();
                                DbpIntegers(selected, high[selected], low[selected]);
                                CmdHIDsimTAG(high[selected], low[selected], 0);
                                DbpString("Done playing");
+                               if (BUTTON_HELD(1000) > 0)
+                                       {
+                                       DbpString("Exiting");
+                                       LEDsoff();
+                                       return;
+                                       }
                                
                                /* We pressed a button so ignore it here with a delay */
                                SpinDelay(300);
@@ -1033,6 +1006,9 @@ void SamyRun()
                                LEDsoff();
                                LED(selected + 1, 0);
                        }
+                       else
+                               while(BUTTON_PRESS())
+                                       WDT_HIT();
                }
        }
 }
Impressum, Datenschutz