diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 7c58fd7e6..15d939a35 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -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); diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index b68edf58a..abfe07f10 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -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)) { diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index d68ddd044..31f2cae58 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -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(); diff --git a/armsrc/mifaresim.c b/armsrc/mifaresim.c index 80881c416..0dcbe404a 100644 --- a/armsrc/mifaresim.c +++ b/armsrc/mifaresim.c @@ -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(); diff --git a/armsrc/thinfilm.c b/armsrc/thinfilm.c index 46fa5a920..e4b2e9b23 100644 --- a/armsrc/thinfilm.c +++ b/armsrc/thinfilm.c @@ -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 diff --git a/common_arm/Makefile.hal b/common_arm/Makefile.hal index 8fe070582..455672e5f 100644 --- a/common_arm/Makefile.hal +++ b/common_arm/Makefile.hal @@ -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