mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-20 21:33:47 -07:00
fix HF simulation
This commit is contained in:
parent
fade194bbe
commit
36f2234121
6 changed files with 85 additions and 33 deletions
|
@ -208,12 +208,11 @@ void MeasureAntennaTuning(void) {
|
||||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
|
||||||
SpinDelay(50);
|
SpinDelay(50);
|
||||||
|
|
||||||
|
#if defined RDV4
|
||||||
|
payload.v_hf = (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10;
|
||||||
|
#else
|
||||||
payload.v_hf = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10;
|
payload.v_hf = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10;
|
||||||
|
#endif
|
||||||
// RDV40 will hit the roof, try other ADC channel used in that hardware revision.
|
|
||||||
if (payload.v_hf > MAX_ADC_HF_VOLTAGE - 300) {
|
|
||||||
payload.v_hf = (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
||||||
reply_ng(CMD_MEASURE_ANTENNA_TUNING, PM3_SUCCESS, (uint8_t *)&payload, sizeof(payload));
|
reply_ng(CMD_MEASURE_ANTENNA_TUNING, PM3_SUCCESS, (uint8_t *)&payload, sizeof(payload));
|
||||||
|
@ -222,16 +221,13 @@ void MeasureAntennaTuning(void) {
|
||||||
|
|
||||||
// Measure HF in milliVolt
|
// Measure HF in milliVolt
|
||||||
uint16_t MeasureAntennaTuningHfData(void) {
|
uint16_t MeasureAntennaTuningHfData(void) {
|
||||||
uint16_t volt = 0;
|
|
||||||
uint16_t avg = AvgAdc(ADC_CHAN_HF);
|
|
||||||
volt = (MAX_ADC_HF_VOLTAGE * avg) >> 10;
|
|
||||||
bool use_high = (volt > MAX_ADC_HF_VOLTAGE - 300);
|
|
||||||
|
|
||||||
if (use_high) {
|
#if defined RDV4
|
||||||
volt = (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10;
|
return (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10;
|
||||||
// volt = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10;
|
#else
|
||||||
}
|
return (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10;
|
||||||
return volt;
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Measure LF in milliVolt
|
// Measure LF in milliVolt
|
||||||
|
@ -532,7 +528,6 @@ void ListenReaderField(uint8_t limit) {
|
||||||
uint16_t lf_av = 0, lf_av_new, lf_baseline = 0, lf_max = 0;
|
uint16_t lf_av = 0, lf_av_new, lf_baseline = 0, lf_max = 0;
|
||||||
uint16_t hf_av = 0, hf_av_new, hf_baseline = 0, hf_max = 0;
|
uint16_t hf_av = 0, hf_av_new, hf_baseline = 0, hf_max = 0;
|
||||||
uint16_t mode = 1, display_val, display_max;
|
uint16_t mode = 1, display_val, display_max;
|
||||||
bool use_high = false;
|
|
||||||
|
|
||||||
// switch off FPGA - we don't want to measure our own signal
|
// switch off FPGA - we don't want to measure our own signal
|
||||||
// 20180315 - iceman, why load this before and then turn off?
|
// 20180315 - iceman, why load this before and then turn off?
|
||||||
|
@ -549,15 +544,12 @@ void ListenReaderField(uint8_t limit) {
|
||||||
|
|
||||||
if (limit == HF_ONLY) {
|
if (limit == HF_ONLY) {
|
||||||
|
|
||||||
hf_av = hf_max = AvgAdc(ADC_CHAN_HF);
|
#if defined RDV4
|
||||||
|
|
||||||
// iceman, useless, since we are measuring readerfield, not our field. My tests shows a max of 20v from a reader.
|
// iceman, useless, since we are measuring readerfield, not our field. My tests shows a max of 20v from a reader.
|
||||||
// RDV40 will hit the roof, try other ADC channel used in that hardware revision.
|
hf_av = hf_max = AvgAdc(ADC_CHAN_HF_RDV40);
|
||||||
use_high = (((MAX_ADC_HF_VOLTAGE * hf_max) >> 10) > MAX_ADC_HF_VOLTAGE - 300);
|
#else
|
||||||
if (use_high) {
|
hf_av = hf_max = AvgAdc(ADC_CHAN_HF);
|
||||||
hf_av = hf_max = AvgAdc(ADC_CHAN_HF_RDV40);
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
Dbprintf("HF 13.56MHz Baseline: %dmV", (MAX_ADC_HF_VOLTAGE * hf_av) >> 10);
|
Dbprintf("HF 13.56MHz Baseline: %dmV", (MAX_ADC_HF_VOLTAGE * hf_av) >> 10);
|
||||||
hf_baseline = hf_av;
|
hf_baseline = hf_av;
|
||||||
}
|
}
|
||||||
|
@ -608,8 +600,11 @@ void ListenReaderField(uint8_t limit) {
|
||||||
LED_B_OFF();
|
LED_B_OFF();
|
||||||
}
|
}
|
||||||
|
|
||||||
hf_av_new = (use_high) ? AvgAdc(ADC_CHAN_HF_RDV40) : AvgAdc(ADC_CHAN_HF);
|
#if defined RDV4
|
||||||
|
hf_av_new = AvgAdc(ADC_CHAN_HF_RDV40);
|
||||||
|
#else
|
||||||
|
hf_av_new = AvgAdc(ADC_CHAN_HF);
|
||||||
|
#endif
|
||||||
// see if there's a significant change
|
// see if there's a significant change
|
||||||
if (ABS(hf_av - hf_av_new) > REPORT_CHANGE) {
|
if (ABS(hf_av - hf_av_new) > REPORT_CHANGE) {
|
||||||
Dbprintf("HF 13.56MHz Field Change: %5dmV", (MAX_ADC_HF_VOLTAGE * hf_av_new) >> 10);
|
Dbprintf("HF 13.56MHz Field Change: %5dmV", (MAX_ADC_HF_VOLTAGE * hf_av_new) >> 10);
|
||||||
|
|
|
@ -1787,7 +1787,13 @@ int EmGetCmd(uint8_t *received, uint16_t *len, uint8_t *par) {
|
||||||
ADC_MODE_PRESCALE(63) |
|
ADC_MODE_PRESCALE(63) |
|
||||||
ADC_MODE_STARTUP_TIME(1) |
|
ADC_MODE_STARTUP_TIME(1) |
|
||||||
ADC_MODE_SAMPLE_HOLD_TIME(15);
|
ADC_MODE_SAMPLE_HOLD_TIME(15);
|
||||||
|
|
||||||
|
#if defined RDV4
|
||||||
|
AT91C_BASE_ADC->ADC_CHER = ADC_CHANNEL(ADC_CHAN_HF_RDV40);
|
||||||
|
#else
|
||||||
AT91C_BASE_ADC->ADC_CHER = ADC_CHANNEL(ADC_CHAN_HF);
|
AT91C_BASE_ADC->ADC_CHER = ADC_CHANNEL(ADC_CHAN_HF);
|
||||||
|
#endif
|
||||||
|
|
||||||
// start ADC
|
// start ADC
|
||||||
AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;
|
AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;
|
||||||
|
|
||||||
|
@ -1811,12 +1817,19 @@ int EmGetCmd(uint8_t *received, uint16_t *len, uint8_t *par) {
|
||||||
++check;
|
++check;
|
||||||
|
|
||||||
// test if the field exists
|
// test if the field exists
|
||||||
if (AT91C_BASE_ADC->ADC_SR & ADC_END_OF_CONVERSION(ADC_CHAN_HF)) {
|
#if defined RDV4
|
||||||
|
if (AT91C_BASE_ADC->ADC_SR & ADC_END_OF_CONVERSION(ADC_CHAN_HF_RDV40)) {
|
||||||
|
|
||||||
analogCnt++;
|
analogCnt++;
|
||||||
analogAVG += AT91C_BASE_ADC->ADC_CDR[ADC_CHAN_HF];
|
|
||||||
|
analogAVG += AT91C_BASE_ADC->ADC_CDR[ADC_CHAN_HF_RDV40];
|
||||||
|
|
||||||
AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;
|
AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;
|
||||||
|
|
||||||
if (analogCnt >= 32) {
|
if (analogCnt >= 32) {
|
||||||
|
|
||||||
if ((MAX_ADC_HF_VOLTAGE_RDV40 * (analogAVG / analogCnt) >> 10) < MF_MINFIELDV) {
|
if ((MAX_ADC_HF_VOLTAGE_RDV40 * (analogAVG / analogCnt) >> 10) < MF_MINFIELDV) {
|
||||||
|
|
||||||
if (timer == 0) {
|
if (timer == 0) {
|
||||||
timer = GetTickCount();
|
timer = GetTickCount();
|
||||||
} else {
|
} else {
|
||||||
|
@ -1832,6 +1845,35 @@ int EmGetCmd(uint8_t *received, uint16_t *len, uint8_t *par) {
|
||||||
analogAVG = 0;
|
analogAVG = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if (AT91C_BASE_ADC->ADC_SR & ADC_END_OF_CONVERSION(ADC_CHAN_HF)) {
|
||||||
|
|
||||||
|
analogCnt++;
|
||||||
|
|
||||||
|
analogAVG += AT91C_BASE_ADC->ADC_CDR[ADC_CHAN_HF];
|
||||||
|
|
||||||
|
AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;
|
||||||
|
|
||||||
|
if (analogCnt >= 32) {
|
||||||
|
|
||||||
|
if ((MAX_ADC_HF_VOLTAGE * (analogAVG / analogCnt) >> 10) < MF_MINFIELDV) {
|
||||||
|
|
||||||
|
if (timer == 0) {
|
||||||
|
timer = GetTickCount();
|
||||||
|
} else {
|
||||||
|
// 50ms no field --> card to idle state
|
||||||
|
if (GetTickCountDelta(timer) > 50) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
timer = 0;
|
||||||
|
}
|
||||||
|
analogCnt = 0;
|
||||||
|
analogAVG = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// receive and test the miller decoding
|
// receive and test the miller decoding
|
||||||
if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
|
if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
|
||||||
|
|
|
@ -635,7 +635,12 @@ void SimulateIso14443bTag(uint32_t pupi) {
|
||||||
|
|
||||||
// find reader field
|
// find reader field
|
||||||
if (cardSTATE == SIM_NOFIELD) {
|
if (cardSTATE == SIM_NOFIELD) {
|
||||||
|
|
||||||
|
#if defined RDV4
|
||||||
|
vHf = (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10;
|
||||||
|
#else
|
||||||
vHf = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10;
|
vHf = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10;
|
||||||
|
#endif
|
||||||
if (vHf > MF_MINFIELDV) {
|
if (vHf > MF_MINFIELDV) {
|
||||||
cardSTATE = SIM_IDLE;
|
cardSTATE = SIM_IDLE;
|
||||||
LED_A_ON();
|
LED_A_ON();
|
||||||
|
|
|
@ -537,7 +537,13 @@ void Mifare1ksim(uint16_t flags, uint8_t exitAfterNReads, uint8_t *datain, uint1
|
||||||
|
|
||||||
// find reader field
|
// find reader field
|
||||||
if (cardSTATE == MFEMUL_NOFIELD) {
|
if (cardSTATE == MFEMUL_NOFIELD) {
|
||||||
vHf = (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF)) >> 10;
|
|
||||||
|
#if defined RDV4
|
||||||
|
vHf = (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10;
|
||||||
|
#else
|
||||||
|
vHf = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (vHf > MF_MINFIELDV) {
|
if (vHf > MF_MINFIELDV) {
|
||||||
cardSTATE_TO_IDLE();
|
cardSTATE_TO_IDLE();
|
||||||
LED_A_ON();
|
LED_A_ON();
|
||||||
|
|
|
@ -52,10 +52,11 @@ void ReadThinFilm(void) {
|
||||||
uint16_t FpgaSendQueueDelay;
|
uint16_t FpgaSendQueueDelay;
|
||||||
|
|
||||||
uint16_t ReadReaderField(void) {
|
uint16_t ReadReaderField(void) {
|
||||||
uint16_t hf_av = AvgAdc(ADC_CHAN_HF);
|
#if defined RDV4
|
||||||
if (((MAX_ADC_HF_VOLTAGE * hf_av) >> 10) > MAX_ADC_HF_VOLTAGE - 300)
|
return AvgAdc(ADC_CHAN_HF_RDV40);
|
||||||
hf_av = AvgAdc(ADC_CHAN_HF_RDV40);
|
#else
|
||||||
return hf_av;
|
return AvgAdc(ADC_CHAN_HF);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CodeThinfilmAsTag(const uint8_t *cmd, uint16_t len) {
|
static void CodeThinfilmAsTag(const uint8_t *cmd, uint16_t len) {
|
||||||
|
@ -119,13 +120,16 @@ void SimulateThinFilm(uint8_t *data, size_t len) {
|
||||||
CodeThinfilmAsTag(data, len);
|
CodeThinfilmAsTag(data, len);
|
||||||
|
|
||||||
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
|
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
|
||||||
|
|
||||||
// Set up the synchronous serial port
|
// Set up the synchronous serial port
|
||||||
FpgaSetupSsc();
|
FpgaSetupSsc();
|
||||||
|
|
||||||
// connect Demodulated Signal to ADC:
|
// connect Demodulated Signal to ADC:
|
||||||
SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
|
SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
|
||||||
|
|
||||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_TAGSIM_MOD);
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_TAGSIM_MOD);
|
||||||
SpinDelay(100);
|
SpinDelay(100);
|
||||||
|
|
||||||
uint16_t hf_baseline = ReadReaderField();
|
uint16_t hf_baseline = ReadReaderField();
|
||||||
|
|
||||||
// Start the timer
|
// Start the timer
|
||||||
|
|
|
@ -56,7 +56,7 @@ endef
|
||||||
PLTNAME = Unknown Platform
|
PLTNAME = Unknown Platform
|
||||||
|
|
||||||
ifeq ($(PLATFORM),PM3RDV4)
|
ifeq ($(PLATFORM),PM3RDV4)
|
||||||
PLATFORM_DEFS = -DWITH_SMARTCARD -DWITH_FLASH
|
PLATFORM_DEFS = -DWITH_SMARTCARD -DWITH_FLASH -DRDV4
|
||||||
PLTNAME = Proxmark3 rdv4
|
PLTNAME = Proxmark3 rdv4
|
||||||
else ifeq ($(PLATFORM),PM3OTHER)
|
else ifeq ($(PLATFORM),PM3OTHER)
|
||||||
PLTNAME = Proxmark3 Generic target
|
PLTNAME = Proxmark3 Generic target
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue