#include <proxmark3.h>
+#include <stdlib.h>
#include "apps.h"
#ifdef WITH_LCD
#include "fonts.h"
void SweepLFrange()
{
BYTE *dest = (BYTE *)BigBuf;
- int i;
+ BYTE dummy[12];
+ int i, peak= 0, ptr= 0;
+ double freq;
// clear buffer
memset(BigBuf,0,sizeof(BigBuf));
for (i=255; i>19; i--) {
FpgaSendCommand(FPGA_CMD_SET_DIVISOR, i);
SpinDelay(20);
- dest[i] = (137500 * AvgAdc(4)) >> 18;
+ dest[i] = (137500 * AvgAdc(ADC_CHAN_LF)) >> 18;
+ 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;
+ }
+ DbpString("Antenna resonates at:");
+ DbpString(dummy);
}
void MeasureAntennaTuning(void)
FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz
FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER | FPGA_LF_READER_USE_125_KHZ);
SpinDelay(20);
- vLf125 = AvgAdc(4);
+ 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;
FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 88); //134.8Khz
FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER | FPGA_LF_READER_USE_134_KHZ);
SpinDelay(20);
- vLf134 = AvgAdc(4);
+ 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(5);
+ 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;
MeasureAntennaTuning();
break;
+ case CMD_LISTEN_READER_FIELD:
+ ListenReaderField(c->ext1);
+ break;
+
case CMD_HID_DEMOD_FSK:
CmdHIDdemodFSK(); // Demodulate HID tag
break;
WDT_HIT();
}
}
+
+// listen for external reader
+void ListenReaderField(int limit)
+{
+ int lf_av, lf_av_new, lf_baseline= -1, lf_count= 0;
+ int hf_av, hf_av_new, hf_baseline= -1, hf_count= 0;
+
+#define LF_ONLY 1
+#define HF_ONLY 2
+
+ LED_A_OFF();
+ LED_B_OFF();
+ LED_C_OFF();
+ LED_D_OFF();
+
+ lf_av= ReadAdc(ADC_CHAN_LF);
+
+ if(limit != HF_ONLY && lf_baseline == -1)
+ {
+ DbpString("LF 125/134 Baseline:");
+ DbpIntegers(lf_av,0,0);
+ lf_baseline= lf_av;
+ }
+
+ hf_av= ReadAdc(ADC_CHAN_HF);
+
+
+ if (limit != LF_ONLY && hf_baseline == -1)
+ {
+ DbpString("HF 13.56 Baseline:");
+ DbpIntegers(hf_av,0,0);
+ hf_baseline= hf_av;
+ }
+
+ for(;;)
+ {
+ if(BUTTON_PRESS())
+ {
+ LED_B_OFF();
+ LED_D_OFF();
+ return;
+ }
+ WDT_HIT();
+
+
+ if (limit != HF_ONLY)
+ {
+ if (abs(lf_av - lf_baseline) > 10)
+ LED_D_ON();
+ else
+ LED_D_OFF();
+ ++lf_count;
+ lf_av_new= ReadAdc(ADC_CHAN_LF);
+ // see if there's a significant change
+ if(abs(lf_av - lf_av_new) > 10)
+ {
+ DbpString("LF 125/134 Field Change:");
+ DbpIntegers(lf_av,lf_av_new,lf_count);
+ lf_av= lf_av_new;
+ lf_count= 0;
+ }
+ }
+
+ if (limit != LF_ONLY)
+ {
+ if (abs(hf_av - hf_baseline) > 10)
+ LED_B_ON();
+ else
+ LED_B_OFF();
+ ++hf_count;
+ hf_av_new= ReadAdc(ADC_CHAN_HF);
+ // see if there's a significant change
+ if(abs(hf_av - hf_av_new) > 10)
+ {
+ DbpString("HF 13.56 Field Change:");
+ DbpIntegers(hf_av,hf_av_new,hf_count);
+ hf_av= hf_av_new;
+ hf_count= 0;
+ }
+ }
+ }
+}