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
+
+ UsbCommand c;
- // clear buffer
+ 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;
- }
- dummy[3]= '.';
- for(i= 2; i >= 0 ; --i) {
- dummy[i]= '0' + ((int) freq) % 10;
- freq /= 10;
+ peakv = adcval;
+ peak = dest[i];
+ peakf = i;
+ ptr = i;
}
- 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));
}
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;
@echo off\r
+echo ********************************************************************\r
+echo * REMEMBER: hold button down for the duration of the FLASH process *\r
+echo ********************************************************************\r
+\r
+REM next line is a dummy. It causes PM3 to reboot and enter the FLASH process\r
..\winsrc\prox.exe load ..\armsrc\obj\osimage.s19\r
+\r
+REM these actually do the real work\r
..\winsrc\prox.exe load ..\armsrc\obj\osimage.s19\r
+..\winsrc\prox.exe fpga ..\armsrc\obj\fpgaimage.s19\r
}\r
}\r
\r
-static void CmdSweepLF(char *str)\r
-{\r
- UsbCommand c;\r
- c.cmd = CMD_SWEEP_LF;\r
- SendCommand(&c, FALSE);\r
-}\r
-\r
-\r
typedef void HandlerFunction(char *cmdline);\r
\r
/* in alphabetic order */\r
{"scale", CmdScale,1, "<int> -- Set cursor display scale"},\r
{"setlfdivisor", CmdSetDivisor,0, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)"},\r
{"sri512read", CmdSri512read,0, "<int> -- Read contents of a SRI512 tag"},\r
- {"sweeplf", CmdSweepLF,0, " Sweep through LF freq range, store results in buffer and show resonant frequency of antenna"},\r
{"tibits", CmdTibits,0, " Get raw bits for TI-type LF tag"},\r
{"tidemod", CmdTidemod,0, " Demodulate raw bits for TI-type LF tag"},\r
{"tiread", CmdTiread,0, " Read a TI-type 134 kHz tag"},\r
char *description;\r
} CommandExtendedHelp[]= {\r
{"detectreader","'l'|'h'","'l' specifies LF antenna scan only, 'h' specifies HF antenna scan only.","Monitor antenna for changes in voltage. Output is in three fields: CHANGED, CURRENT, PERIOD,\nwhere CHANGED is the value just changed from, CURRENT is the current value and PERIOD is the\nnumber of program loops since the last change.\n\nThe RED LED indicates LF field detected, and the GREEN LED indicates HF field detected."},\r
- {"sweeplf","","","Drive LF antenna at all divisor range values (19 - 255) and store the results in the output\nbuffer. Issuing 'losamples' and then 'plot' commands will display the resulting peak. 12MHz\ndivided by the peak's position plus one gives the antenna's resonant frequency. For convenience,\nthis value is also printed out by the command."},\r
+ {"tune","","","Drive LF antenna at all divisor range values (19 - 255) and store the results in the output\nbuffer. Issuing 'losamples' and then 'plot' commands will display the resulting peak. 12MHz\ndivided by the peak's position plus one gives the antenna's resonant frequency. For convenience,\nthis value is also printed out by the command."},\r
};\r
\r
//-----------------------------------------------------------------------------\r
break;\r
\r
case CMD_MEASURED_ANTENNA_TUNING: {\r
- int zLf, zHf;\r
+ int peakv, peakf;\r
int vLf125, vLf134, vHf;\r
vLf125 = c->ext1 & 0xffff;\r
vLf134 = c->ext1 >> 16;\r
- vHf = c->ext2;\r
- zLf = c->ext3 & 0xffff;\r
- zHf = c->ext3 >> 16;\r
- PrintToScrollback("# LF antenna @ %3d mA / %5d mV [%d ohms] 125Khz",\r
- vLf125/zLf, vLf125, zLf);\r
- PrintToScrollback("# LF antenna @ %3d mA / %5d mV [%d ohms] 134Khz",\r
- vLf134/((zLf*125)/134), vLf134, (zLf*125)/134);\r
- PrintToScrollback("# HF antenna @ %3d mA / %5d mV [%d ohms] 13.56Mhz",\r
- vHf/zHf, vHf, zHf);\r
+ vHf = c->ext2 & 0xffff;;\r
+ peakf = c->ext3 & 0xffff;\r
+ peakv = c->ext3 >> 16;\r
+ PrintToScrollback("# LF antenna: %.2f V @ 125.00Khz", vLf125/1000.0);\r
+ PrintToScrollback("# LF antenna: %.2f V @ 134.00Khz", vLf134/1000.0);\r
+ PrintToScrollback("# LF optimal: %.2f V @ %.2fKHz", peakv/1000.0, 12000.0/(peakf+1));\r
+ PrintToScrollback("# HF antenna: %.2f V @ 13.56Mhz", vHf/1000.0);\r
+ if (peakv<2000)\r
+ PrintToScrollback("# Your LF antenna is unusable."); \r
+ else if (peakv<10000)\r
+ PrintToScrollback("# Your LF antenna is marginal.");\r
+ if (vHf<2000)\r
+ PrintToScrollback("# Your HF antenna is unusable."); \r
+ else if (vHf<5000)\r
+ PrintToScrollback("# Your HF antenna is marginal.");\r
break;\r
}\r
default:\r