From 2e37c04a1579153e8d4cd05932e994883ca5a013 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 12 Jan 2020 15:33:06 +0100 Subject: [PATCH] Add: 'hf plot' - implement function from offical repo (piwi) --- armsrc/fpgaloader.c | 19 +++++++- armsrc/fpgaloader.h | 8 ++-- fpga/Makefile | 2 +- fpga/fpga_hf.bit | Bin 42175 -> 42175 bytes fpga/fpga_hf.v | 108 +++++++++++++++++++++++++++++++++++++------- fpga/fpga_lf.bit | Bin 42175 -> 42175 bytes fpga/hi_get_trace.v | 0 7 files changed, 115 insertions(+), 22 deletions(-) mode change 100755 => 100644 fpga/hi_get_trace.v diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index 87213df96..9b7e83470 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -400,8 +400,10 @@ static int bitparse_find_section(int bitstream_version, char section_name, uint3 void FpgaDownloadAndGo(int bitstream_version) { // check whether or not the bitstream is already loaded - if (downloaded_bitstream == bitstream_version) + if (downloaded_bitstream == bitstream_version) { + FpgaEnableTracing(); return; + } // Send waiting time extension request as this will take a while send_wtx(1500); @@ -437,6 +439,8 @@ void FpgaDownloadAndGo(int bitstream_version) { // Send a 16 bit command/data pair to the FPGA. // The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 // where C is the 4 bit command and D is the 12 bit data +// +// @params cmd and v gets or over eachother. Take careful note of overlapping bits. //----------------------------------------------------------------------------- void FpgaSendCommand(uint16_t cmd, uint16_t v) { SetupSpi(SPI_FPGA_MODE); @@ -449,10 +453,21 @@ void FpgaSendCommand(uint16_t cmd, uint16_t v) { // vs. clone vs. etc.). This is now a special case of FpgaSendCommand() to // avoid changing this function's occurence everywhere in the source code. //----------------------------------------------------------------------------- -void FpgaWriteConfWord(uint8_t v) { +void FpgaWriteConfWord(uint16_t v) { FpgaSendCommand(FPGA_CMD_SET_CONFREG, v); } +//----------------------------------------------------------------------------- +// enable/disable FPGA internal tracing +//----------------------------------------------------------------------------- +void FpgaEnableTracing(void) { + FpgaSendCommand(FPGA_CMD_TRACE_ENABLE, 1); +} + +void FpgaDisableTracing(void) { + FpgaSendCommand(FPGA_CMD_TRACE_ENABLE, 0); +} + //----------------------------------------------------------------------------- // Set up the CMOS switches that mux the ADC: four switches, independently // closable, but should only close one at a time. Not an FPGA thing, but diff --git a/armsrc/fpgaloader.h b/armsrc/fpgaloader.h index 90d020333..5399db4ed 100644 --- a/armsrc/fpgaloader.h +++ b/armsrc/fpgaloader.h @@ -41,7 +41,7 @@ thres| x x x x x x x x */ // Definitions for the FPGA commands. -// HF / LF +// BOTH HF / LF #define FPGA_CMD_SET_CONFREG (1<<12) // C // LF @@ -67,7 +67,7 @@ thres| x x x x x x x x #define FPGA_MAJOR_MODE_HF_ISO18092 (5<<5) // D #define FPGA_MAJOR_MODE_HF_GET_TRACE (6<<5) // D -// BOTH +// BOTH HF / LF #define FPGA_MAJOR_MODE_OFF (7<<5) // D // Options for LF_READER @@ -107,7 +107,9 @@ thres| x x x x x x x x #define FPGA_HF_ISO18092_FLAG_READER 0x4 // 0100 enables antenna power, to act as a reader instead of tag void FpgaSendCommand(uint16_t cmd, uint16_t v); -void FpgaWriteConfWord(uint8_t v); +void FpgaWriteConfWord(uint16_t v); +void FpgaEnableTracing(void); +void FpgaDisableTracing(void); void FpgaDownloadAndGo(int bitstream_version); // void FpgaGatherVersion(int bitstream_version, char *dst, int len); void FpgaSetupSsc(void); diff --git a/fpga/Makefile b/fpga/Makefile index 8ea5d89f0..0d2bb1625 100644 --- a/fpga/Makefile +++ b/fpga/Makefile @@ -11,7 +11,7 @@ clean: $(Q)$(RM) *.map *.ngc *.xrpt *.pcf *.rbt *.bld *.mrp *.ngm *.unroutes *_summary.xml netlist.lst $(Q)$(RMDIR) *_auto_* xst -fpga_hf.ngc: fpga_hf.v fpga.ucf xst_hf.scr util.v hi_simulate.v hi_read_tx.v hi_read_rx_xcorr.v hi_iso14443a.v hi_sniffer.v hi_flite.v +fpga_hf.ngc: fpga_hf.v fpga.ucf xst_hf.scr util.v hi_simulate.v hi_read_tx.v hi_read_rx_xcorr.v hi_iso14443a.v hi_sniffer.v hi_flite.v hi_get_trace.v $(Q)$(RM) $@ $(info [-] XST $@) $(Q)$(XILINX_TOOLS_PREFIX)xst -ifn xst_hf.scr diff --git a/fpga/fpga_hf.bit b/fpga/fpga_hf.bit index ae66d510fa02ca3e7181036f0f8e2bf134ebf884..9a054eec60c9bb30acbe343f4c6685039cd9d260 100644 GIT binary patch literal 42175 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 literal 42175 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, June 2014 +// Piwi, Feb 2019 //----------------------------------------------------------------------------- + +// Defining commands, modes and options. This must be aligned to the definitions in fpgaloader.h +// Note: the definitions here are without shifts + +// Commands: `define FPGA_CMD_SET_CONFREG 1 +`define FPGA_CMD_TRACE_ENABLE 2 + +// Major modes: +`define FPGA_MAJOR_MODE_HF_READER_TX 0 +`define FPGA_MAJOR_MODE_HF_READER_RX_XCORR 1 +`define FPGA_MAJOR_MODE_HF_SIMULATOR 2 +`define FPGA_MAJOR_MODE_HF_ISO14443A 3 +`define FPGA_MAJOR_MODE_HF_SNOOP 4 +`define FPGA_MAJOR_MODE_HF_ISO18092 5 +`define FPGA_MAJOR_MODE_HF_GET_TRACE 6 +`define FPGA_MAJOR_MODE_OFF 7 + +// Options for the generic HF reader +// Options for the HF reader, tx to tag +`define FPGA_HF_READER_TX_SHALLOW_MOD 1 + +// Options for the HF reader, correlating against rx from tag +`define FPGA_HF_READER_RX_XCORR_848_KHZ 1 +`define FPGA_HF_READER_RX_XCORR_SNOOP 2 +`define FPGA_HF_READER_RX_XCORR_QUARTER 4 + +// Options for the HF simulated tag, how to modulate +`define FPGA_HF_SIMULATOR_NO_MODULATION 0 +`define FPGA_HF_SIMULATOR_MODULATE_BPSK 1 +`define FPGA_HF_SIMULATOR_MODULATE_212K 2 +`define FPGA_HF_SIMULATOR_MODULATE_424K 4 +`define FPGA_HF_SIMULATOR_MODULATE_424K_8BIT 5 + +// Options for ISO14443A +`define FPGA_HF_ISO14443A_SNIFFER 0 +`define FPGA_HF_ISO14443A_TAGSIM_LISTEN 1 +`define FPGA_HF_ISO14443A_TAGSIM_MOD 2 +`define FPGA_HF_ISO14443A_READER_LISTEN 3 +`define FPGA_HF_ISO14443A_READER_MOD 4 + +//options for ISO18092 / Felica +`define FPGA_HF_ISO18092_FLAG_NOMOD 1 // 0001 disable modulation module +`define FPGA_HF_ISO18092_FLAG_424K 2 // 0010 should enable 414k mode (untested). No autodetect +`define FPGA_HF_ISO18092_FLAG_READER 4 // 0100 enables antenna power, to act as a reader instead of tag `include "hi_read_tx.v" `include "hi_read_rx_xcorr.v" @@ -22,6 +67,7 @@ `include "hi_sniffer.v" `include "util.v" `include "hi_flite.v" +`include "hi_get_trace.v" module fpga_hf( input spck, output miso, input mosi, input ncs, @@ -41,8 +87,33 @@ module fpga_hf( // to the configuration bits, for use below. //----------------------------------------------------------------------------- +/* + Attempt to write up how its hooked up. Iceman 2020. + + Communication between ARM / FPGA is done inside armsrc/fpgaloader.c see: function FpgaSendCommand() + Send 16 bit command / data pair to FPGA + The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 + where + C is 4bit command + D is 12bit data + + shift_reg receive this 16bit frame + + +-----+--------- frame layout -------------------- +bit | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +-----+------------------------------------------- +cmd | x x x x +major| x x x +opt | x x +divi | x x x x x x x x +thres| x x x x x x x x +-----+------------------------------------------- +*/ + reg [15:0] shift_reg; reg [7:0] conf_word; +reg trace_enable; // We switch modes between transmitting to the 13.56 MHz tag and receiving // from it, which means that we must make sure that we can do so without @@ -50,10 +121,8 @@ reg [7:0] conf_word; always @(posedge ncs) begin case(shift_reg[15:12]) - `FPGA_CMD_SET_CONFREG: - begin - conf_word <= shift_reg[7:0]; - end + `FPGA_CMD_SET_CONFREG: conf_word <= shift_reg[7:0]; + `FPGA_CMD_TRACE_ENABLE: trace_enable <= shift_reg[0]; endcase end @@ -152,6 +221,13 @@ hi_flite hfl( hi_simulate_mod_type ); +hi_get_trace gt( + ck_1356megb, + adc_d, trace_enable, major_mode, + gt_ssp_frame, gt_ssp_din, gt_ssp_clk +); + + // Major modes: // 000 -- HF reader, transmitting to tag; modulation depth selectable @@ -160,20 +236,20 @@ hi_flite hfl( // 011 -- HF ISO14443-A // 100 -- HF Snoop // 101 -- Felica modem, reusing HF reader -// 110 -- none +// 110 -- HF get trace // 111 -- everything off -mux8 mux_ssp_clk (major_mode, ssp_clk, ht_ssp_clk, hrxc_ssp_clk, hs_ssp_clk, hisn_ssp_clk, he_ssp_clk, hfl_ssp_clk, 1'b0, 1'b0); -mux8 mux_ssp_din (major_mode, ssp_din, ht_ssp_din, hrxc_ssp_din, hs_ssp_din, hisn_ssp_din, he_ssp_din, hfl_ssp_din, 1'b0, 1'b0); -mux8 mux_ssp_frame (major_mode, ssp_frame, ht_ssp_frame, hrxc_ssp_frame, hs_ssp_frame, hisn_ssp_frame, he_ssp_frame, hfl_ssp_frame, 1'b0, 1'b0); -mux8 mux_pwr_oe1 (major_mode, pwr_oe1, ht_pwr_oe1, hrxc_pwr_oe1, hs_pwr_oe1, hisn_pwr_oe1, he_pwr_oe1, hfl_pwr_oe1, 1'b0, 1'b0); -mux8 mux_pwr_oe2 (major_mode, pwr_oe2, ht_pwr_oe2, hrxc_pwr_oe2, hs_pwr_oe2, hisn_pwr_oe2, he_pwr_oe2, hfl_pwr_oe2, 1'b0, 1'b0); -mux8 mux_pwr_oe3 (major_mode, pwr_oe3, ht_pwr_oe3, hrxc_pwr_oe3, hs_pwr_oe3, hisn_pwr_oe3, he_pwr_oe3, hfl_pwr_oe3, 1'b0, 1'b0); -mux8 mux_pwr_oe4 (major_mode, pwr_oe4, ht_pwr_oe4, hrxc_pwr_oe4, hs_pwr_oe4, hisn_pwr_oe4, he_pwr_oe4, hfl_pwr_oe4, 1'b0, 1'b0); -mux8 mux_pwr_lo (major_mode, pwr_lo, ht_pwr_lo, hrxc_pwr_lo, hs_pwr_lo, hisn_pwr_lo, he_pwr_lo, hfl_pwr_lo, 1'b0, 1'b0); -mux8 mux_pwr_hi (major_mode, pwr_hi, ht_pwr_hi, hrxc_pwr_hi, hs_pwr_hi, hisn_pwr_hi, he_pwr_hi, hfl_pwr_hi, 1'b0, 1'b0); -mux8 mux_adc_clk (major_mode, adc_clk, ht_adc_clk, hrxc_adc_clk, hs_adc_clk, hisn_adc_clk, he_adc_clk, hfl_adc_clk, 1'b0, 1'b0); -mux8 mux_dbg (major_mode, dbg, ht_dbg, hrxc_dbg, hs_dbg, hisn_dbg, he_dbg, hfl_dbg, 1'b0, 1'b0); +mux8 mux_ssp_clk (major_mode, ssp_clk, ht_ssp_clk, hrxc_ssp_clk, hs_ssp_clk, hisn_ssp_clk, he_ssp_clk, hfl_ssp_clk, gt_ssp_clk, 1'b0); +mux8 mux_ssp_din (major_mode, ssp_din, ht_ssp_din, hrxc_ssp_din, hs_ssp_din, hisn_ssp_din, he_ssp_din, hfl_ssp_din, gt_ssp_din, 1'b0); +mux8 mux_ssp_frame (major_mode, ssp_frame, ht_ssp_frame, hrxc_ssp_frame, hs_ssp_frame, hisn_ssp_frame, he_ssp_frame, hfl_ssp_frame, gt_ssp_frame, 1'b0); +mux8 mux_pwr_oe1 (major_mode, pwr_oe1, ht_pwr_oe1, hrxc_pwr_oe1, hs_pwr_oe1, hisn_pwr_oe1, he_pwr_oe1, hfl_pwr_oe1, 1'b0, 1'b0); +mux8 mux_pwr_oe2 (major_mode, pwr_oe2, ht_pwr_oe2, hrxc_pwr_oe2, hs_pwr_oe2, hisn_pwr_oe2, he_pwr_oe2, hfl_pwr_oe2, 1'b0, 1'b0); +mux8 mux_pwr_oe3 (major_mode, pwr_oe3, ht_pwr_oe3, hrxc_pwr_oe3, hs_pwr_oe3, hisn_pwr_oe3, he_pwr_oe3, hfl_pwr_oe3, 1'b0, 1'b0); +mux8 mux_pwr_oe4 (major_mode, pwr_oe4, ht_pwr_oe4, hrxc_pwr_oe4, hs_pwr_oe4, hisn_pwr_oe4, he_pwr_oe4, hfl_pwr_oe4, 1'b0, 1'b0); +mux8 mux_pwr_lo (major_mode, pwr_lo, ht_pwr_lo, hrxc_pwr_lo, hs_pwr_lo, hisn_pwr_lo, he_pwr_lo, hfl_pwr_lo, 1'b0, 1'b0); +mux8 mux_pwr_hi (major_mode, pwr_hi, ht_pwr_hi, hrxc_pwr_hi, hs_pwr_hi, hisn_pwr_hi, he_pwr_hi, hfl_pwr_hi, 1'b0, 1'b0); +mux8 mux_adc_clk (major_mode, adc_clk, ht_adc_clk, hrxc_adc_clk, hs_adc_clk, hisn_adc_clk, he_adc_clk, hfl_adc_clk, 1'b0, 1'b0); +mux8 mux_dbg (major_mode, dbg, ht_dbg, hrxc_dbg, hs_dbg, hisn_dbg, he_dbg, hfl_dbg, 1'b0, 1'b0); // In all modes, let the ADC's outputs be enabled. assign adc_noe = 1'b0; diff --git a/fpga/fpga_lf.bit b/fpga/fpga_lf.bit index 133e12b828095ae49ec164a1e516727d8d98838e..dd64db8a7762141fcee85b6fb5cb9af3a4705313 100644 GIT binary patch delta 21 dcmdmgl4<`*rU{N5hNf1=hE@tj8$HXG003E#2a*5) delta 21 dcmdmgl4<`*rU{N53I