mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-14 18:48:13 -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);
|
||||
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;
|
||||
|
||||
// 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;
|
||||
}
|
||||
#endif
|
||||
|
||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
||||
reply_ng(CMD_MEASURE_ANTENNA_TUNING, PM3_SUCCESS, (uint8_t *)&payload, sizeof(payload));
|
||||
|
@ -222,16 +221,13 @@ void MeasureAntennaTuning(void) {
|
|||
|
||||
// Measure HF in milliVolt
|
||||
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) {
|
||||
volt = (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10;
|
||||
// volt = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10;
|
||||
}
|
||||
return volt;
|
||||
#if defined RDV4
|
||||
return (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10;
|
||||
#else
|
||||
return (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
// 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 hf_av = 0, hf_av_new, hf_baseline = 0, hf_max = 0;
|
||||
uint16_t mode = 1, display_val, display_max;
|
||||
bool use_high = false;
|
||||
|
||||
// switch off FPGA - we don't want to measure our own signal
|
||||
// 20180315 - iceman, why load this before and then turn off?
|
||||
|
@ -549,15 +544,12 @@ void ListenReaderField(uint8_t limit) {
|
|||
|
||||
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.
|
||||
// RDV40 will hit the roof, try other ADC channel used in that hardware revision.
|
||||
use_high = (((MAX_ADC_HF_VOLTAGE * hf_max) >> 10) > MAX_ADC_HF_VOLTAGE - 300);
|
||||
if (use_high) {
|
||||
hf_av = hf_max = AvgAdc(ADC_CHAN_HF_RDV40);
|
||||
}
|
||||
|
||||
hf_av = hf_max = AvgAdc(ADC_CHAN_HF_RDV40);
|
||||
#else
|
||||
hf_av = hf_max = AvgAdc(ADC_CHAN_HF);
|
||||
#endif
|
||||
Dbprintf("HF 13.56MHz Baseline: %dmV", (MAX_ADC_HF_VOLTAGE * hf_av) >> 10);
|
||||
hf_baseline = hf_av;
|
||||
}
|
||||
|
@ -608,8 +600,11 @@ void ListenReaderField(uint8_t limit) {
|
|||
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
|
||||
if (ABS(hf_av - hf_av_new) > REPORT_CHANGE) {
|
||||
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_STARTUP_TIME(1) |
|
||||
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);
|
||||
#endif
|
||||
|
||||
// start ADC
|
||||
AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;
|
||||
|
||||
|
@ -1811,12 +1817,19 @@ int EmGetCmd(uint8_t *received, uint16_t *len, uint8_t *par) {
|
|||
++check;
|
||||
|
||||
// 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++;
|
||||
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;
|
||||
|
||||
if (analogCnt >= 32) {
|
||||
|
||||
if ((MAX_ADC_HF_VOLTAGE_RDV40 * (analogAVG / analogCnt) >> 10) < MF_MINFIELDV) {
|
||||
|
||||
if (timer == 0) {
|
||||
timer = GetTickCount();
|
||||
} else {
|
||||
|
@ -1832,6 +1845,35 @@ int EmGetCmd(uint8_t *received, uint16_t *len, uint8_t *par) {
|
|||
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
|
||||
if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
|
||||
|
|
|
@ -635,7 +635,12 @@ void SimulateIso14443bTag(uint32_t pupi) {
|
|||
|
||||
// find reader field
|
||||
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;
|
||||
#endif
|
||||
if (vHf > MF_MINFIELDV) {
|
||||
cardSTATE = SIM_IDLE;
|
||||
LED_A_ON();
|
||||
|
|
|
@ -537,7 +537,13 @@ void Mifare1ksim(uint16_t flags, uint8_t exitAfterNReads, uint8_t *datain, uint1
|
|||
|
||||
// find reader field
|
||||
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) {
|
||||
cardSTATE_TO_IDLE();
|
||||
LED_A_ON();
|
||||
|
|
|
@ -52,10 +52,11 @@ void ReadThinFilm(void) {
|
|||
uint16_t FpgaSendQueueDelay;
|
||||
|
||||
uint16_t ReadReaderField(void) {
|
||||
uint16_t hf_av = AvgAdc(ADC_CHAN_HF);
|
||||
if (((MAX_ADC_HF_VOLTAGE * hf_av) >> 10) > MAX_ADC_HF_VOLTAGE - 300)
|
||||
hf_av = AvgAdc(ADC_CHAN_HF_RDV40);
|
||||
return hf_av;
|
||||
#if defined RDV4
|
||||
return AvgAdc(ADC_CHAN_HF_RDV40);
|
||||
#else
|
||||
return AvgAdc(ADC_CHAN_HF);
|
||||
#endif
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
|
||||
|
||||
// Set up the synchronous serial port
|
||||
FpgaSetupSsc();
|
||||
|
||||
// connect Demodulated Signal to ADC:
|
||||
SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
|
||||
|
||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_TAGSIM_MOD);
|
||||
SpinDelay(100);
|
||||
|
||||
uint16_t hf_baseline = ReadReaderField();
|
||||
|
||||
// Start the timer
|
||||
|
|
|
@ -56,7 +56,7 @@ endef
|
|||
PLTNAME = Unknown Platform
|
||||
|
||||
ifeq ($(PLATFORM),PM3RDV4)
|
||||
PLATFORM_DEFS = -DWITH_SMARTCARD -DWITH_FLASH
|
||||
PLATFORM_DEFS = -DWITH_SMARTCARD -DWITH_FLASH -DRDV4
|
||||
PLTNAME = Proxmark3 rdv4
|
||||
else ifeq ($(PLATFORM),PM3OTHER)
|
||||
PLTNAME = Proxmark3 Generic target
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue