Merged sweeplf into tune command

This commit is contained in:
d18c7db 2009-07-13 11:20:29 +00:00
parent ec130f9c59
commit e7aee94e6a
3 changed files with 54 additions and 90 deletions

View file

@ -240,92 +240,55 @@ static int AvgAdc(int ch)
return (a + 15) >> 5;
}
void MeasureAntennaTuning(void)
{
BYTE *dest = (BYTE *)BigBuf;
int i, ptr = 0, adcval = 0, peak = 0, peakv = 0, peakf = 0;;
int vLf125 = 0, vLf134 = 0, vHf = 0; // in mV
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
* 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!)
* 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!)
*/
void SweepLFrange()
{
BYTE *dest = (BYTE *)BigBuf;
char dummy[12];
int i, peak= 0, ptr= 0;
double freq;
// clear buffer
memset(BigBuf,0,sizeof(BigBuf));
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;
}
peakv = adcval;
peak = dest[i];
peakf = 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;
}
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;

View file

@ -1,3 +1,11 @@
@echo off
echo ********************************************************************
echo * REMEMBER: hold button down for the duration of the FLASH process *
echo ********************************************************************
REM next line is a dummy. It causes PM3 to reboot and enter the FLASH process
..\winsrc\prox.exe load ..\armsrc\obj\osimage.s19
REM these actually do the real work
..\winsrc\prox.exe load ..\armsrc\obj\osimage.s19
..\winsrc\prox.exe fpga ..\armsrc\obj\fpgaimage.s19

View file

@ -2571,14 +2571,6 @@ static void CmdSetDivisor(char *str)
}
}
static void CmdSweepLF(char *str)
{
UsbCommand c;
c.cmd = CMD_SWEEP_LF;
SendCommand(&c, FALSE);
}
typedef void HandlerFunction(char *cmdline);
/* in alphabetic order */
@ -2647,7 +2639,6 @@ static struct {
{"scale", CmdScale,1, "<int> -- Set cursor display scale"},
{"setlfdivisor", CmdSetDivisor,0, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)"},
{"sri512read", CmdSri512read,0, "<int> -- Read contents of a SRI512 tag"},
{"sweeplf", CmdSweepLF,0, " Sweep through LF freq range, store results in buffer and show resonant frequency of antenna"},
{"tibits", CmdTibits,0, " Get raw bits for TI-type LF tag"},
{"tidemod", CmdTidemod,0, " Demodulate raw bits for TI-type LF tag"},
{"tiread", CmdTiread,0, " Read a TI-type 134 kHz tag"},
@ -2663,7 +2654,7 @@ static struct {
char *description;
} CommandExtendedHelp[]= {
{"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."},
{"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."},
{"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."},
};
//-----------------------------------------------------------------------------
@ -2751,19 +2742,25 @@ void UsbCommandReceived(UsbCommand *c)
break;
case CMD_MEASURED_ANTENNA_TUNING: {
int zLf, zHf;
int peakv, peakf;
int vLf125, vLf134, vHf;
vLf125 = c->ext1 & 0xffff;
vLf134 = c->ext1 >> 16;
vHf = c->ext2;
zLf = c->ext3 & 0xffff;
zHf = c->ext3 >> 16;
PrintToScrollback("# LF antenna @ %3d mA / %5d mV [%d ohms] 125Khz",
vLf125/zLf, vLf125, zLf);
PrintToScrollback("# LF antenna @ %3d mA / %5d mV [%d ohms] 134Khz",
vLf134/((zLf*125)/134), vLf134, (zLf*125)/134);
PrintToScrollback("# HF antenna @ %3d mA / %5d mV [%d ohms] 13.56Mhz",
vHf/zHf, vHf, zHf);
vHf = c->ext2 & 0xffff;;
peakf = c->ext3 & 0xffff;
peakv = c->ext3 >> 16;
PrintToScrollback("# LF antenna: %.2f V @ 125.00Khz", vLf125/1000.0);
PrintToScrollback("# LF antenna: %.2f V @ 134.00Khz", vLf134/1000.0);
PrintToScrollback("# LF optimal: %.2f V @ %.2fKHz", peakv/1000.0, 12000.0/(peakf+1));
PrintToScrollback("# HF antenna: %.2f V @ 13.56Mhz", vHf/1000.0);
if (peakv<2000)
PrintToScrollback("# Your LF antenna is unusable.");
else if (peakv<10000)
PrintToScrollback("# Your LF antenna is marginal.");
if (vHf<2000)
PrintToScrollback("# Your HF antenna is unusable.");
else if (vHf<5000)
PrintToScrollback("# Your HF antenna is marginal.");
break;
}
default: