From da586b170276fd44963ec4a8934beaf563feb132 Mon Sep 17 00:00:00 2001 From: pwpiwi Date: Thu, 18 Jun 2015 15:30:56 +0200 Subject: [PATCH] fixing iso14443b (issue #103): - revert removal of FPGA_HF_READER_RX_XCORR_848_KHZ. Need to be able to switch to 424kHz for ISO15693. --- armsrc/iso14443b.c | 8 ++++---- fpga/fpga_hf.bit | Bin 42175 -> 42175 bytes fpga/fpga_hf.v | 8 +++++--- fpga/hi_read_rx_xcorr.v | 22 ++++++++++++++++++---- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index 80f93678..8d1a5cca 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -732,7 +732,7 @@ static void GetSamplesFor14443bDemod(int n, bool quiet) // Signal field is ON with the appropriate LED: LED_D_ON(); // And put the FPGA in the appropriate mode - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR | FPGA_HF_READER_RX_XCORR_848_KHZ); for(;;) { int behindBy = lastRxCounter - AT91C_BASE_PDC_SSC->PDC_RCR; @@ -929,7 +929,7 @@ void ReadSTMemoryIso14443b(uint32_t dwLast) // Signal field is on with the appropriate LED LED_D_ON(); FpgaWriteConfWord( - FPGA_MAJOR_MODE_HF_READER_RX_XCORR); + FPGA_MAJOR_MODE_HF_READER_RX_XCORR | FPGA_HF_READER_RX_XCORR_848_KHZ); SpinDelay(200); // First command: wake up the tag using the INITIATE command @@ -1091,7 +1091,7 @@ void RAMFUNC SnoopIso14443b(void) LEDsoff(); // And put the FPGA in the appropriate mode - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR | FPGA_HF_READER_RX_XCORR_SNOOP); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR | FPGA_HF_READER_RX_XCORR_848_KHZ | FPGA_HF_READER_RX_XCORR_SNOOP); SetAdcMuxFor(GPIO_MUXSEL_HIPKD); // Setup for the DMA. @@ -1228,7 +1228,7 @@ void SendRawCommand14443B(uint32_t datalen, uint32_t recv, uint8_t powerfield, u */ // if(!GETBIT(GPIO_LED_D)) { // if field is off - // FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR); + // FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR | FPGA_HF_READER_RX_XCORR_848_KHZ); // // Signal field is on with the appropriate LED // LED_D_ON(); // SpinDelay(200); diff --git a/fpga/fpga_hf.bit b/fpga/fpga_hf.bit index 717dad13eb67e5ef2cfeb39da3c4a0f6e9e04fd3..49bec2242cb7720524289f3eba1397bbc2a22867 100644 GIT binary patch literal 42175 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 diff --git a/fpga/fpga_hf.v b/fpga/fpga_hf.v index e84081b3..8a465e75 100644 --- a/fpga/fpga_hf.v +++ b/fpga/fpga_hf.v @@ -67,8 +67,10 @@ assign major_mode = conf_word[7:5]; // some fraction of the buffers) wire hi_read_tx_shallow_modulation = conf_word[0]; -// For the high-frequency receive correlator: -// whether to drive the coil (reader) or just short it (snooper) +// For the high-frequency receive correlator: frequency against which to +// correlate. +wire hi_read_rx_xcorr_848 = conf_word[0]; +// and whether to drive the coil (reader) or just short it (snooper) wire hi_read_rx_xcorr_snoop = conf_word[1]; // For the high-frequency simulated tag: what kind of modulation to use. @@ -97,7 +99,7 @@ hi_read_rx_xcorr hrxc( hrxc_ssp_frame, hrxc_ssp_din, ssp_dout, hrxc_ssp_clk, cross_hi, cross_lo, hrxc_dbg, - hi_read_rx_xcorr_snoop + hi_read_rx_xcorr_848, hi_read_rx_xcorr_snoop ); hi_simulate hs( diff --git a/fpga/hi_read_rx_xcorr.v b/fpga/hi_read_rx_xcorr.v index a6a99cd5..4a5de553 100644 --- a/fpga/hi_read_rx_xcorr.v +++ b/fpga/hi_read_rx_xcorr.v @@ -10,7 +10,7 @@ module hi_read_rx_xcorr( ssp_frame, ssp_din, ssp_dout, ssp_clk, cross_hi, cross_lo, dbg, - snoop + xcorr_is_848, snoop ); input pck0, ck_1356meg, ck_1356megb; output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; @@ -20,7 +20,7 @@ module hi_read_rx_xcorr( output ssp_frame, ssp_din, ssp_clk; input cross_hi, cross_lo; output dbg; - input snoop; + input xcorr_is_848, snoop; // Carrier is steady on through this, unless we're snooping. assign pwr_hi = ck_1356megb & (~snoop); @@ -28,8 +28,22 @@ assign pwr_oe1 = 1'b0; assign pwr_oe3 = 1'b0; assign pwr_oe4 = 1'b0; -wire adc_clk = ck_1356megb; - +(* clock_signal = "yes" *) reg fc_div_2; +always @(negedge ck_1356megb) + fc_div_2 <= fc_div_2 + 1; + +(* clock_signal = "yes" *) reg adc_clk; +always @(xcorr_is_848, ck_1356megb, fc_div_2) +if (xcorr_is_848) + // The subcarrier frequency is fc/16; we will sample at fc, so that + // means the subcarrier is 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 ... + adc_clk <= ck_1356megb; +else + // The subcarrier frequency is fc/32; we will sample at fc/2, and + // the subcarrier will look identical. + adc_clk <= fc_div_2; + + // When we're a reader, we just need to do the BPSK demod; but when we're an // eavesdropper, we also need to pick out the commands sent by the reader, // using AM. Do this the same way that we do it for the simulated tag. -- 2.39.5