From d51b2eda8f91b17dd02cdbd931b089fc8f8d61db Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Wed, 11 Jun 2014 08:42:37 +0200 Subject: [PATCH 1/6] Added enios dirthreshold command, patch from http://www.proxmark.org/forum/viewtopic.php?pid=11577#p11577 --- client/cmddata.c | 37 +++++++++++++++++++++++++++++++++++++ client/cmddata.h | 1 + 2 files changed, 38 insertions(+) diff --git a/client/cmddata.c b/client/cmddata.c index a7b80480..fa54d01a 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -17,6 +17,7 @@ #include "ui.h" #include "graph.h" #include "cmdparser.h" +#include "util.h" #include "cmdmain.h" #include "cmddata.h" @@ -818,6 +819,41 @@ int CmdThreshold(const char *Cmd) return 0; } +int CmdDirectionalThreshold(const char *Cmd) +{ + int8_t upThres = param_get8(Cmd, 0); + int8_t downThres = param_get8(Cmd, 1); + + printf("Applying Up Threshold: %d, Down Threshold: %d\n", upThres, downThres); + + int lastValue = GraphBuffer[0]; + GraphBuffer[0] = 0; // Will be changed at the end, but init 0 as we adjust to last samples value if no threshold kicks in. + + for (int i = 1; i < GraphTraceLen; ++i) { + // Apply first threshold to samples heading up + if (GraphBuffer[i] >= upThres && GraphBuffer[i] > lastValue) + { + lastValue = GraphBuffer[i]; // Buffer last value as we overwrite it. + GraphBuffer[i] = 1; + } + // Apply second threshold to samples heading down + else if (GraphBuffer[i] <= downThres && GraphBuffer[i] < lastValue) + { + lastValue = GraphBuffer[i]; // Buffer last value as we overwrite it. + GraphBuffer[i] = -1; + } + else + { + lastValue = GraphBuffer[i]; // Buffer last value as we overwrite it. + GraphBuffer[i] = GraphBuffer[i-1]; + + } + } + GraphBuffer[0] = GraphBuffer[1]; // Aline with first edited sample. + RepaintGraphWindow(); + return 0; +} + int CmdZerocrossings(const char *Cmd) { // Zero-crossings aren't meaningful unless the signal is zero-mean. @@ -874,6 +910,7 @@ static command_t CommandTable[] = {"scale", CmdScale, 1, " -- Set cursor display scale"}, {"threshold", CmdThreshold, 1, " -- Maximize/minimize every value in the graph window depending on threshold"}, {"zerocrossings", CmdZerocrossings, 1, "Count time between zero-crossings"}, + {"dirthreshold", CmdDirectionalThreshold, 1, " -- Max rising higher up-thres/ Min falling lower down-thres, keep rest as prev."}, {NULL, NULL, 0, NULL} }; diff --git a/client/cmddata.h b/client/cmddata.h index 2f86a941..716c9c39 100644 --- a/client/cmddata.h +++ b/client/cmddata.h @@ -38,6 +38,7 @@ int CmdSamples(const char *Cmd); int CmdSave(const char *Cmd); int CmdScale(const char *Cmd); int CmdThreshold(const char *Cmd); +int CmdDirectionalThreshold(const char *Cmd); int CmdZerocrossings(const char *Cmd); #endif From 7cc204bff881ce1d1833d8e93469f6bbba80c70e Mon Sep 17 00:00:00 2001 From: iZsh Date: Fri, 20 Jun 2014 01:02:59 +0200 Subject: [PATCH 2/6] THIS REQUIRES A BOOTROM UPDATE!! To save FPGA area, split the LF and HF bitstreams and load them on-demand. --- .gitignore | 6 +- armsrc/Makefile | 9 +- armsrc/appmain.c | 9 +- armsrc/apps.h | 28 ++- armsrc/fpgaloader.c | 45 +++- armsrc/hitag2.c | 3 + armsrc/iclass.c | 6 + armsrc/iso14443.c | 4 + armsrc/iso14443a.c | 1 + armsrc/iso15693.c | 5 + armsrc/ldscript | 3 +- armsrc/legicrf.c | 2 + armsrc/lfops.c | 12 + armsrc/mifarecmd.c | 506 ++++++++++++++++++++--------------------- client/Makefile | 6 +- common/ldscript.common | 4 +- fpga/Makefile | 40 ++-- fpga/clk_divider.v | 25 ++ fpga/fpga.bit | Bin 42172 -> 0 bytes fpga/fpga.v | 220 ------------------ fpga/fpga_hf.bit | Bin 0 -> 42175 bytes fpga/fpga_hf.v | 150 ++++++++++++ fpga/fpga_lf.bit | Bin 0 -> 42175 bytes fpga/fpga_lf.v | 125 ++++++++++ fpga/go.bat | 52 ++++- fpga/lo_edge_detect.v | 53 +---- fpga/lo_passthru.v | 44 +--- fpga/lo_read.v | 67 ++---- fpga/xst.scr | 1 - fpga/xst_hf.scr | 1 + fpga/xst_lf.scr | 1 + include/proxmark3.h | 4 + 32 files changed, 771 insertions(+), 661 deletions(-) create mode 100644 fpga/clk_divider.v delete mode 100644 fpga/fpga.bit delete mode 100644 fpga/fpga.v create mode 100644 fpga/fpga_hf.bit create mode 100644 fpga/fpga_hf.v create mode 100644 fpga/fpga_lf.bit create mode 100644 fpga/fpga_lf.v delete mode 100644 fpga/xst.scr create mode 100644 fpga/xst_hf.scr create mode 100644 fpga/xst_lf.scr diff --git a/.gitignore b/.gitignore index 3f6347a0..3b258b3b 100644 --- a/.gitignore +++ b/.gitignore @@ -19,11 +19,13 @@ lua luac fpga/* -!fpga/fpga.bit +!fpga/fpga_lf.bit +!fpga/fpga_hf.bit !fpga/*.v !fpga/Makefile !fpga/fpga.ucf -!fpga/xst.scr +!fpga/xst_lf.scr +!fpga/xst_hf.scr !fpga/go.bat !fpga/sim.tcl diff --git a/armsrc/Makefile b/armsrc/Makefile index 2e5350bb..e10c1001 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -52,10 +52,13 @@ OBJS = $(OBJDIR)/osimage.s19 $(OBJDIR)/fpgaimage.s19 all: $(OBJS) -$(OBJDIR)/fpga.o: fpga.bit - $(OBJCOPY) -O elf32-littlearm -I binary -B arm --redefine-sym _binary____fpga_fpga_bit_start=_binary_fpga_bit_start --redefine-sym _binary____fpga_fpga_bit_end=_binary_fpga_bit_end --prefix-sections=fpga_bit $^ $@ +$(OBJDIR)/fpga_lf.o: fpga_lf.bit + $(OBJCOPY) -O elf32-littlearm -I binary -B arm --redefine-sym _binary____fpga_fpga_lf_bit_start=_binary_fpga_lf_bit_start --redefine-sym _binary____fpga_fpga_lf_bit_end=_binary_fpga_lf_bit_end --prefix-sections=fpga_lf_bit $^ $@ -$(OBJDIR)/fullimage.elf: $(VERSIONOBJ) $(OBJDIR)/fpga.o $(THUMBOBJ) $(ARMOBJ) +$(OBJDIR)/fpga_hf.o: fpga_hf.bit + $(OBJCOPY) -O elf32-littlearm -I binary -B arm --redefine-sym _binary____fpga_fpga_hf_bit_start=_binary_fpga_hf_bit_start --redefine-sym _binary____fpga_fpga_hf_bit_end=_binary_fpga_hf_bit_end --prefix-sections=fpga_hf_bit $^ $@ + +$(OBJDIR)/fullimage.elf: $(VERSIONOBJ) $(OBJDIR)/fpga_lf.o $(OBJDIR)/fpga_hf.o $(THUMBOBJ) $(ARMOBJ) $(CC) $(LDFLAGS) -Wl,-T,ldscript,-Map,$(patsubst %.elf,%.map,$@) -o $@ $^ $(LIBS) $(OBJDIR)/fpgaimage.elf: $(OBJDIR)/fullimage.elf diff --git a/armsrc/appmain.c b/armsrc/appmain.c index b6c32200..b7bc87e7 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -214,6 +214,7 @@ void MeasureAntennaTuning(void) * ( hopefully around 95 if it is tuned to 125kHz!) */ + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); for (i=255; i>19; i--) { WDT_HIT(); @@ -236,6 +237,7 @@ void MeasureAntennaTuning(void) LED_A_ON(); // Let the FPGA drive the high-frequency antenna around 13.56 MHz. + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR); SpinDelay(20); // Vref = 3300mV, and an 10:1 voltage divider on the input @@ -264,6 +266,7 @@ void MeasureAntennaTuningHf(void) for (;;) { // Let the FPGA drive the high-frequency antenna around 13.56 MHz. + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR); SpinDelay(20); // Vref = 3300mV, and an 10:1 voltage divider on the input @@ -286,6 +289,7 @@ void SimulateTagHfListen(void) // We're using this mode just so that I can test it out; the simulated // tag mode would work just as well and be simpler. + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR | FPGA_HF_READER_RX_XCORR_848_KHZ | FPGA_HF_READER_RX_XCORR_SNOOP); // We need to listen to the high-frequency, peak-detected path. @@ -365,6 +369,7 @@ void SendVersion(void) void SamyRun() { DbpString("Stand-alone mode! No PC necessary."); + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); // 3 possible options? no just 2 for now #define OPTS 2 @@ -923,6 +928,7 @@ void UsbPacketReceived(uint8_t *packet, int len) break; case CMD_SET_LF_DIVISOR: + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, c->arg[0]); break; @@ -1017,7 +1023,8 @@ void __attribute__((noreturn)) AppMain(void) AT91C_BASE_SSC->SSC_CR = AT91C_SSC_SWRST; // Load the FPGA image, which we have stored in our flash. - FpgaDownloadAndGo(); + // (the HF version by default) + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); StartTickCount(); diff --git a/armsrc/apps.h b/armsrc/apps.h index 92228b8d..76d1247a 100644 --- a/armsrc/apps.h +++ b/armsrc/apps.h @@ -67,7 +67,8 @@ extern uint32_t BigBuf[]; /// fpga.h void FpgaSendCommand(uint16_t cmd, uint16_t v); void FpgaWriteConfWord(uint8_t v); -void FpgaDownloadAndGo(void); +void FpgaDownloadAndGo(int bitstream_version); +int FpgaGatherBitstreamVersion(); void FpgaGatherVersion(char *dst, int len); void FpgaSetupSsc(void); void SetupSpi(int mode); @@ -77,17 +78,20 @@ bool FpgaSetupSscDma(uint8_t *buf, int len); void SetAdcMuxFor(uint32_t whichGpio); // Definitions for the FPGA commands. -#define FPGA_CMD_SET_CONFREG (1<<12) -#define FPGA_CMD_SET_DIVISOR (2<<12) +#define FPGA_CMD_SET_CONFREG (1<<12) +#define FPGA_CMD_SET_DIVISOR (2<<12) // Definitions for the FPGA configuration word. -#define FPGA_MAJOR_MODE_LF_READER (0<<5) +// LF +#define FPGA_MAJOR_MODE_LF_READER (0<<5) #define FPGA_MAJOR_MODE_LF_EDGE_DETECT (1<<5) -#define FPGA_MAJOR_MODE_HF_READER_TX (2<<5) -#define FPGA_MAJOR_MODE_HF_READER_RX_XCORR (3<<5) -#define FPGA_MAJOR_MODE_HF_SIMULATOR (4<<5) -#define FPGA_MAJOR_MODE_HF_ISO14443A (5<<5) -#define FPGA_MAJOR_MODE_LF_PASSTHRU (6<<5) -#define FPGA_MAJOR_MODE_OFF (7<<5) +#define FPGA_MAJOR_MODE_LF_PASSTHRU (2<<5) +// HF +#define FPGA_MAJOR_MODE_HF_READER_TX (0<<5) +#define FPGA_MAJOR_MODE_HF_READER_RX_XCORR (1<<5) +#define FPGA_MAJOR_MODE_HF_SIMULATOR (2<<5) +#define FPGA_MAJOR_MODE_HF_ISO14443A (3<<5) +// BOTH +#define FPGA_MAJOR_MODE_OFF (7<<5) // Options for LF_EDGE_DETECT #define FPGA_LF_EDGE_DETECT_READER_FIELD (1<<0) // Options for the HF reader, tx to tag @@ -95,14 +99,14 @@ void SetAdcMuxFor(uint32_t whichGpio); // Options for the HF reader, correlating against rx from tag #define FPGA_HF_READER_RX_XCORR_848_KHZ (1<<0) #define FPGA_HF_READER_RX_XCORR_SNOOP (1<<1) -#define FPGA_HF_READER_RX_XCORR_QUARTER_FREQ (1<<2) +#define FPGA_HF_READER_RX_XCORR_QUARTER_FREQ (1<<2) // Options for the HF simulated tag, how to modulate #define FPGA_HF_SIMULATOR_NO_MODULATION (0<<0) #define FPGA_HF_SIMULATOR_MODULATE_BPSK (1<<0) #define FPGA_HF_SIMULATOR_MODULATE_212K (2<<0) #define FPGA_HF_SIMULATOR_MODULATE_424K (4<<0) // Options for ISO14443A -#define FPGA_HF_ISO14443A_SNIFFER (0<<0) +#define FPGA_HF_ISO14443A_SNIFFER (0<<0) #define FPGA_HF_ISO14443A_TAGSIM_LISTEN (1<<0) #define FPGA_HF_ISO14443A_TAGSIM_MOD (2<<0) #define FPGA_HF_ISO14443A_READER_LISTEN (3<<0) diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index d63310a3..2f996bc5 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -252,7 +252,7 @@ static void DownloadFPGA(const char *FpgaImage, int FpgaImageLen, int byterevers static char *bitparse_headers_start; static char *bitparse_bitstream_end; -static int bitparse_initialized; +static int bitparse_initialized = 0; /* Simple Xilinx .bit parser. The file starts with the fixed opaque byte sequence * 00 09 0f f0 0f f0 0f f0 0f f0 00 00 01 * After that the format is 1 byte section type (ASCII character), 2 byte length @@ -322,12 +322,28 @@ int bitparse_find_section(char section_name, char **section_start, unsigned int // Find out which FPGA image format is stored in flash, then call DownloadFPGA // with the right parameters to download the image //----------------------------------------------------------------------------- -extern char _binary_fpga_bit_start, _binary_fpga_bit_end; -void FpgaDownloadAndGo(void) +extern char _binary_fpga_lf_bit_start, _binary_fpga_lf_bit_end; +extern char _binary_fpga_hf_bit_start, _binary_fpga_hf_bit_end; +void FpgaDownloadAndGo(int bitstream_version) { + void *bit_start; + void *bit_end; + + // check whether or not the bitstream is already loaded + if (FpgaGatherBitstreamVersion() == bitstream_version) + return; + + if (bitstream_version == FPGA_BITSTREAM_LF) { + bit_start = &_binary_fpga_lf_bit_start; + bit_end = &_binary_fpga_lf_bit_end; + } else if (bitstream_version == FPGA_BITSTREAM_HF) { + bit_start = &_binary_fpga_hf_bit_start; + bit_end = &_binary_fpga_hf_bit_end; + } else + return; /* Check for the new flash image format: Should have the .bit file at &_binary_fpga_bit_start */ - if(bitparse_init(&_binary_fpga_bit_start, &_binary_fpga_bit_end)) { + if(bitparse_init(bit_start, bit_end)) { /* Successfully initialized the .bit parser. Find the 'e' section and * send its contents to the FPGA. */ @@ -351,6 +367,17 @@ void FpgaDownloadAndGo(void) DownloadFPGA((char*)0x102000, 10524*4, 1); } +int FpgaGatherBitstreamVersion() +{ + char temp[256]; + FpgaGatherVersion(temp, sizeof (temp)); + if (!memcmp("LF", temp, 2)) + return FPGA_BITSTREAM_LF; + else if (!memcmp("HF", temp, 2)) + return FPGA_BITSTREAM_HF; + return FPGA_BITSTREAM_ERR; +} + void FpgaGatherVersion(char *dst, int len) { char *fpga_info; @@ -359,13 +386,15 @@ void FpgaGatherVersion(char *dst, int len) if(!bitparse_find_section('e', &fpga_info, &fpga_info_len)) { strncat(dst, "FPGA image: legacy image without version information", len-1); } else { - strncat(dst, "FPGA image built", len-1); /* USB packets only have 48 bytes data payload, so be terse */ -#if 0 if(bitparse_find_section('a', &fpga_info, &fpga_info_len) && fpga_info[fpga_info_len-1] == 0 ) { - strncat(dst, " from ", len-1); - strncat(dst, fpga_info, len-1); + if (!memcmp("fpga_lf", fpga_info, 7)) + strncat(dst, "LF ", len-1); + else if (!memcmp("fpga_hf", fpga_info, 7)) + strncat(dst, "HF ", len-1); } + strncat(dst, "FPGA image built", len-1); +#if 0 if(bitparse_find_section('b', &fpga_info, &fpga_info_len) && fpga_info[fpga_info_len-1] == 0 ) { strncat(dst, " for ", len-1); strncat(dst, fpga_info, len-1); diff --git a/armsrc/hitag2.c b/armsrc/hitag2.c index 1a0e9b56..9181a62e 100644 --- a/armsrc/hitag2.c +++ b/armsrc/hitag2.c @@ -743,6 +743,7 @@ void SnoopHitag(uint32_t type) { // Set up eavesdropping mode, frequency divisor which will drive the FPGA // and analog mux selection. + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_EDGE_DETECT); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz SetAdcMuxFor(GPIO_MUXSEL_LOPKD); @@ -966,6 +967,7 @@ void SimulateHitagTag(bool tag_mem_supplied, byte_t* data) { // Set up simulator mode, frequency divisor which will drive the FPGA // and analog mux selection. + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_EDGE_DETECT); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz SetAdcMuxFor(GPIO_MUXSEL_LOPKD); @@ -1124,6 +1126,7 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) { bool bStop; bool bQuitTraceFull = false; + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); // Reset the return status bSuccessful = false; diff --git a/armsrc/iclass.c b/armsrc/iclass.c index 8d65b523..9c5e8b2b 100644 --- a/armsrc/iclass.c +++ b/armsrc/iclass.c @@ -689,6 +689,8 @@ void RAMFUNC SnoopIClass(void) // into trace, along with its length and other annotations. //uint8_t *trace = (uint8_t *)BigBuf; + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + // reset traceLen to 0 iso14a_set_tracing(TRUE); iso14a_clear_trace(); @@ -995,6 +997,8 @@ void SimulateIClass(uint8_t arg0, uint8_t *datain) { uint8_t simType = arg0; + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + // Enable and clear the trace tracing = TRUE; traceLen = 0; @@ -1426,6 +1430,8 @@ void ReaderIClass(uint8_t arg0) { uint8_t* resp = (((uint8_t *)BigBuf) + 3560); // was 3560 - tied to other size changes + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + // Reset trace buffer memset(trace, 0x44, RECV_CMD_OFFSET); traceLen = 0; diff --git a/armsrc/iso14443.c b/armsrc/iso14443.c index 5e8eddd2..7a445bcb 100644 --- a/armsrc/iso14443.c +++ b/armsrc/iso14443.c @@ -350,6 +350,7 @@ void SimulateIso14443Tag(void) int cmdsRecvd = 0; + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); memset(receivedCmd, 0x44, 400); CodeIso14443bAsTag(response1, sizeof(response1)); @@ -867,6 +868,7 @@ void ReadSTMemoryIso14443(uint32_t dwLast) { uint8_t i = 0x00; + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); // Make sure that we start from off, since the tags are stateful; // confusing things will happen if we don't reset them between reads. LED_D_OFF(); @@ -1011,6 +1013,7 @@ void RAMFUNC SnoopIso14443(void) // response from the tag. int triggered = TRUE; + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); // The command (reader -> tag) that we're working on receiving. uint8_t *receivedCmd = (uint8_t *)(BigBuf) + DEMOD_TRACE_SIZE; // The response (tag -> reader) that we're working on receiving. @@ -1196,6 +1199,7 @@ done: void SendRawCommand14443B(uint32_t datalen, uint32_t recv,uint8_t powerfield, uint8_t data[]) { + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); if(!powerfield) { // Make sure that we start from off, since the tags are stateful; diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 9afe0788..099e1d68 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1763,6 +1763,7 @@ int iso14443a_select_card(byte_t* uid_ptr, iso14a_card_select_t* p_hi14a_card, u } void iso14443a_setup(uint8_t fpga_minor_mode) { + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); // Set up the synchronous serial port FpgaSetupSsc(); // connect Demodulated Signal to ADC: diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index 63e72c14..ed7beb6f 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -606,6 +606,7 @@ void AcquireRawAdcSamplesIso15693(void) int8_t prev = 0; + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); BuildIdentifyRequest(); SetAdcMuxFor(GPIO_MUXSEL_HIPKD); @@ -687,6 +688,7 @@ void RecordRawAdcSamplesIso15693(void) int8_t prev = 0; + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); // Setup SSC FpgaSetupSsc(); @@ -753,6 +755,7 @@ void Iso15693InitReader() { LED_C_OFF(); LED_D_OFF(); + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); // Setup SSC // FpgaSetupSsc(); @@ -1015,6 +1018,7 @@ void ReaderIso15693(uint32_t parameter) // Blank arrays memset(BigBuf + 3660, 0, 300); + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); // Setup SSC FpgaSetupSsc(); @@ -1165,6 +1169,7 @@ void SimTagIso15693(uint32_t parameter) // Blank arrays memset(answer1, 0, 100); + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); // Setup SSC FpgaSetupSsc(); diff --git a/armsrc/ldscript b/armsrc/ldscript index dcb04bf0..d0be3b6a 100644 --- a/armsrc/ldscript +++ b/armsrc/ldscript @@ -21,7 +21,8 @@ ENTRY(Vector) SECTIONS { .fpgaimage : { - *(fpga_bit.data) + *(fpga_lf_bit.data) + *(fpga_hf_bit.data) } >fpgaimage :fpgaimage .start : { diff --git a/armsrc/legicrf.c b/armsrc/legicrf.c index f2eb680b..3fbdf5cb 100644 --- a/armsrc/legicrf.c +++ b/armsrc/legicrf.c @@ -310,6 +310,7 @@ static uint32_t perform_setup_phase_rwd(int iv) } static void LegicCommonInit(void) { + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); SetAdcMuxFor(GPIO_MUXSEL_HIPKD); FpgaSetupSsc(); FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_TX); @@ -687,6 +688,7 @@ void LegicRfSimulate(int phase, int frame, int reqresp) legic_frame_drift = frame; legic_reqresp_drift = reqresp; + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); SetAdcMuxFor(GPIO_MUXSEL_HIPKD); FpgaSetupSsc(); FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR | FPGA_HF_SIMULATOR_MODULATE_212K); diff --git a/armsrc/lfops.c b/armsrc/lfops.c index 76c4b44e..a0fa870b 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -17,6 +17,7 @@ void AcquireRawAdcSamples125k(int divisor) { + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); if ( (divisor == 1) || (divisor < 0) || (divisor > 255) ) FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 88); //134.8Khz else if (divisor == 0) @@ -69,6 +70,7 @@ void ModThenAcquireRawAdcSamples125k(int delay_off, int period_0, int period_1, int at134khz; /* Make sure the tag is reset */ + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); SpinDelay(2500); @@ -158,6 +160,7 @@ void ReadTItag(void) uint32_t threshold = (sampleslo - sampleshi + 1)>>1; // TI tags charge at 134.2Khz + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 88); //134.8Khz // Place FPGA in passthrough mode, in this mode the CROSS_LO line @@ -365,6 +368,7 @@ void AcquireTiType(void) // if not provided a valid crc will be computed from the data and written. void WriteTItag(uint32_t idhi, uint32_t idlo, uint16_t crc) { + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); if(crc == 0) { crc = update_crc16(crc, (idlo)&0xff); crc = update_crc16(crc, (idlo>>8)&0xff); @@ -436,6 +440,7 @@ void SimulateTagLowFrequency(int period, int gap, int ledcontrol) int i; uint8_t *tab = (uint8_t *)BigBuf; + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_EDGE_DETECT); AT91C_BASE_PIOA->PIO_PER = GPIO_SSC_DOUT | GPIO_SSC_CLK; @@ -602,6 +607,7 @@ void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol) int m=0, n=0, i=0, idx=0, found=0, lastval=0; uint32_t hi2=0, hi=0, lo=0; + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); @@ -815,6 +821,7 @@ void CmdIOdemodFSK(int findone, int *high, int *low, int ledcontrol) uint32_t code=0, code2=0; //uint32_t hi2=0, hi=0, lo=0; + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); @@ -1132,6 +1139,7 @@ void CmdIOdemodFSK(int findone, int *high, int *low, int ledcontrol) // Write one bit to card void T55xxWriteBit(int bit) { + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); if (bit == 0) @@ -1147,6 +1155,7 @@ void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMod { unsigned int i; + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); @@ -1191,6 +1200,7 @@ void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) uint8_t *dest = (uint8_t *)BigBuf; int m=0, i=0; + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); m = sizeof(BigBuf); // Clear destination buffer before sending the command memset(dest, 128, m); @@ -1255,6 +1265,7 @@ void T55xxReadTrace(void){ uint8_t *dest = (uint8_t *)BigBuf; int m=0, i=0; + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); m = sizeof(BigBuf); // Clear destination buffer before sending the command memset(dest, 128, m); @@ -1970,6 +1981,7 @@ void SendForward(uint8_t fwd_bit_count) { LED_D_ON(); //Field on + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index c934a280..6a491b53 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -91,66 +91,66 @@ void MifareReadBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain) FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); // iso14a_set_tracing(TRUE); - -} - -void MifareUReadBlock(uint8_t arg0,uint8_t *datain) -{ - // params - uint8_t blockNo = arg0; - - // variables - byte_t isOK = 0; - byte_t dataoutbuf[16]; - uint8_t uid[10]; - uint32_t cuid; - - // clear trace - iso14a_clear_trace(); + +} + +void MifareUReadBlock(uint8_t arg0,uint8_t *datain) +{ + // params + uint8_t blockNo = arg0; + + // variables + byte_t isOK = 0; + byte_t dataoutbuf[16]; + uint8_t uid[10]; + uint32_t cuid; + + // clear trace + iso14a_clear_trace(); iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); - - LED_A_ON(); - LED_B_OFF(); - LED_C_OFF(); - - while (true) { - if(!iso14443a_select_card(uid, NULL, &cuid)) { - if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card"); - break; - }; - - if(mifare_ultra_readblock(cuid, blockNo, dataoutbuf)) { - if (MF_DBGLEVEL >= 1) Dbprintf("Read block error"); - break; - }; - - if(mifare_ultra_halt(cuid)) { - if (MF_DBGLEVEL >= 1) Dbprintf("Halt error"); - break; - }; - - isOK = 1; - break; - } - - if (MF_DBGLEVEL >= 2) DbpString("READ BLOCK FINISHED"); - - // add trace trailer - memset(uid, 0x44, 4); - LogTrace(uid, 4, 0, 0, TRUE); - LED_B_ON(); - cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,16); - LED_B_OFF(); - - - // Thats it... - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - LEDsoff(); -} - -//----------------------------------------------------------------------------- -// Select, Authenticaate, Read an MIFARE tag. -// read sector (data = 4 x 16 bytes = 64 bytes) + + LED_A_ON(); + LED_B_OFF(); + LED_C_OFF(); + + while (true) { + if(!iso14443a_select_card(uid, NULL, &cuid)) { + if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card"); + break; + }; + + if(mifare_ultra_readblock(cuid, blockNo, dataoutbuf)) { + if (MF_DBGLEVEL >= 1) Dbprintf("Read block error"); + break; + }; + + if(mifare_ultra_halt(cuid)) { + if (MF_DBGLEVEL >= 1) Dbprintf("Halt error"); + break; + }; + + isOK = 1; + break; + } + + if (MF_DBGLEVEL >= 2) DbpString("READ BLOCK FINISHED"); + + // add trace trailer + memset(uid, 0x44, 4); + LogTrace(uid, 4, 0, 0, TRUE); + LED_B_ON(); + cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,16); + LED_B_OFF(); + + + // Thats it... + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + LEDsoff(); +} + +//----------------------------------------------------------------------------- +// Select, Authenticaate, Read an MIFARE tag. +// read sector (data = 4 x 16 bytes = 64 bytes) //----------------------------------------------------------------------------- void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain) { @@ -242,72 +242,72 @@ void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain) FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); // iso14a_set_tracing(TRUE); - -} - -void MifareUReadCard(uint8_t arg0, uint8_t *datain) -{ - // params - uint8_t sectorNo = arg0; - - // variables - byte_t isOK = 0; - byte_t dataoutbuf[16 * 4]; - uint8_t uid[10]; - uint32_t cuid; - - // clear trace - iso14a_clear_trace(); -// iso14a_set_tracing(false); - + +} + +void MifareUReadCard(uint8_t arg0, uint8_t *datain) +{ + // params + uint8_t sectorNo = arg0; + + // variables + byte_t isOK = 0; + byte_t dataoutbuf[16 * 4]; + uint8_t uid[10]; + uint32_t cuid; + + // clear trace + iso14a_clear_trace(); +// iso14a_set_tracing(false); + iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); - - LED_A_ON(); - LED_B_OFF(); - LED_C_OFF(); - - while (true) { - if(!iso14443a_select_card(uid, NULL, &cuid)) { - if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card"); - break; - }; - for(int sec=0;sec<16;sec++){ - if(mifare_ultra_readblock(cuid, sectorNo * 4 + sec, dataoutbuf + 4 * sec)) { - if (MF_DBGLEVEL >= 1) Dbprintf("Read block %d error",sec); - break; - }; - } - if(mifare_ultra_halt(cuid)) { - if (MF_DBGLEVEL >= 1) Dbprintf("Halt error"); - break; - }; - - isOK = 1; - break; - } - - if (MF_DBGLEVEL >= 2) DbpString("READ CARD FINISHED"); - - // add trace trailer - memset(uid, 0x44, 4); - LogTrace(uid, 4, 0, 0, TRUE); - - LED_B_ON(); - cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,64); - //cmd_send(CMD_ACK,isOK,0,0,dataoutbuf+32, 32); - LED_B_OFF(); - - // Thats it... - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - LEDsoff(); -// iso14a_set_tracing(TRUE); - -} - - -//----------------------------------------------------------------------------- -// Select, Authenticaate, Read an MIFARE tag. -// read block + + LED_A_ON(); + LED_B_OFF(); + LED_C_OFF(); + + while (true) { + if(!iso14443a_select_card(uid, NULL, &cuid)) { + if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card"); + break; + }; + for(int sec=0;sec<16;sec++){ + if(mifare_ultra_readblock(cuid, sectorNo * 4 + sec, dataoutbuf + 4 * sec)) { + if (MF_DBGLEVEL >= 1) Dbprintf("Read block %d error",sec); + break; + }; + } + if(mifare_ultra_halt(cuid)) { + if (MF_DBGLEVEL >= 1) Dbprintf("Halt error"); + break; + }; + + isOK = 1; + break; + } + + if (MF_DBGLEVEL >= 2) DbpString("READ CARD FINISHED"); + + // add trace trailer + memset(uid, 0x44, 4); + LogTrace(uid, 4, 0, 0, TRUE); + + LED_B_ON(); + cmd_send(CMD_ACK,isOK,0,0,dataoutbuf,64); + //cmd_send(CMD_ACK,isOK,0,0,dataoutbuf+32, 32); + LED_B_OFF(); + + // Thats it... + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + LEDsoff(); +// iso14a_set_tracing(TRUE); + +} + + +//----------------------------------------------------------------------------- +// Select, Authenticaate, Read an MIFARE tag. +// read block //----------------------------------------------------------------------------- void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain) { @@ -384,137 +384,137 @@ void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain) FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); // iso14a_set_tracing(TRUE); - -} - -void MifareUWriteBlock(uint8_t arg0, uint8_t *datain) -{ - // params - uint8_t blockNo = arg0; - byte_t blockdata[16]; - - memset(blockdata,'\0',16); - memcpy(blockdata, datain,16); - - // variables - byte_t isOK = 0; - uint8_t uid[10]; - uint32_t cuid; - - // clear trace - iso14a_clear_trace(); - // iso14a_set_tracing(false); - + +} + +void MifareUWriteBlock(uint8_t arg0, uint8_t *datain) +{ + // params + uint8_t blockNo = arg0; + byte_t blockdata[16]; + + memset(blockdata,'\0',16); + memcpy(blockdata, datain,16); + + // variables + byte_t isOK = 0; + uint8_t uid[10]; + uint32_t cuid; + + // clear trace + iso14a_clear_trace(); + // iso14a_set_tracing(false); + iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); - - LED_A_ON(); - LED_B_OFF(); - LED_C_OFF(); - - while (true) { - if(!iso14443a_select_card(uid, NULL, &cuid)) { - if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card"); - break; - }; - - if(mifare_ultra_writeblock(cuid, blockNo, blockdata)) { - if (MF_DBGLEVEL >= 1) Dbprintf("Write block error"); - break; - }; - - if(mifare_ultra_halt(cuid)) { - if (MF_DBGLEVEL >= 1) Dbprintf("Halt error"); - break; - }; - - isOK = 1; - break; - } - - if (MF_DBGLEVEL >= 2) DbpString("WRITE BLOCK FINISHED"); - - // add trace trailer - memset(uid, 0x44, 4); - LogTrace(uid, 4, 0, 0, TRUE); - - LED_B_ON(); - cmd_send(CMD_ACK,isOK,0,0,0,0); -// UsbSendPacket((uint8_t *)&ack, sizeof(UsbCommand)); - LED_B_OFF(); - - - // Thats it... - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - LEDsoff(); -// iso14a_set_tracing(TRUE); - -} - -void MifareUWriteBlock_Special(uint8_t arg0, uint8_t *datain) -{ - // params - uint8_t blockNo = arg0; - byte_t blockdata[4]; - - memcpy(blockdata, datain,4); - - // variables - byte_t isOK = 0; - uint8_t uid[10]; - uint32_t cuid; - - // clear trace - iso14a_clear_trace(); - // iso14a_set_tracing(false); - + + LED_A_ON(); + LED_B_OFF(); + LED_C_OFF(); + + while (true) { + if(!iso14443a_select_card(uid, NULL, &cuid)) { + if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card"); + break; + }; + + if(mifare_ultra_writeblock(cuid, blockNo, blockdata)) { + if (MF_DBGLEVEL >= 1) Dbprintf("Write block error"); + break; + }; + + if(mifare_ultra_halt(cuid)) { + if (MF_DBGLEVEL >= 1) Dbprintf("Halt error"); + break; + }; + + isOK = 1; + break; + } + + if (MF_DBGLEVEL >= 2) DbpString("WRITE BLOCK FINISHED"); + + // add trace trailer + memset(uid, 0x44, 4); + LogTrace(uid, 4, 0, 0, TRUE); + + LED_B_ON(); + cmd_send(CMD_ACK,isOK,0,0,0,0); +// UsbSendPacket((uint8_t *)&ack, sizeof(UsbCommand)); + LED_B_OFF(); + + + // Thats it... + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + LEDsoff(); +// iso14a_set_tracing(TRUE); + +} + +void MifareUWriteBlock_Special(uint8_t arg0, uint8_t *datain) +{ + // params + uint8_t blockNo = arg0; + byte_t blockdata[4]; + + memcpy(blockdata, datain,4); + + // variables + byte_t isOK = 0; + uint8_t uid[10]; + uint32_t cuid; + + // clear trace + iso14a_clear_trace(); + // iso14a_set_tracing(false); + iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); - - LED_A_ON(); - LED_B_OFF(); - LED_C_OFF(); - - while (true) { - if(!iso14443a_select_card(uid, NULL, &cuid)) { - if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card"); - break; - }; - - if(mifare_ultra_special_writeblock(cuid, blockNo, blockdata)) { - if (MF_DBGLEVEL >= 1) Dbprintf("Write block error"); - break; - }; - - if(mifare_ultra_halt(cuid)) { - if (MF_DBGLEVEL >= 1) Dbprintf("Halt error"); - break; - }; - - isOK = 1; - break; - } - - if (MF_DBGLEVEL >= 2) DbpString("WRITE BLOCK FINISHED"); - - // add trace trailer - memset(uid, 0x44, 4); - LogTrace(uid, 4, 0, 0, TRUE); - - LED_B_ON(); - cmd_send(CMD_ACK,isOK,0,0,0,0); -// UsbSendPacket((uint8_t *)&ack, sizeof(UsbCommand)); - LED_B_OFF(); - - - // Thats it... - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - LEDsoff(); -// iso14a_set_tracing(TRUE); - -} - -// Return 1 if the nonce is invalid else return 0 -int valid_nonce(uint32_t Nt, uint32_t NtEnc, uint32_t Ks1, byte_t * parity) { - return ((oddparity((Nt >> 24) & 0xFF) == ((parity[0]) ^ oddparity((NtEnc >> 24) & 0xFF) ^ BIT(Ks1,16))) & \ + + LED_A_ON(); + LED_B_OFF(); + LED_C_OFF(); + + while (true) { + if(!iso14443a_select_card(uid, NULL, &cuid)) { + if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card"); + break; + }; + + if(mifare_ultra_special_writeblock(cuid, blockNo, blockdata)) { + if (MF_DBGLEVEL >= 1) Dbprintf("Write block error"); + break; + }; + + if(mifare_ultra_halt(cuid)) { + if (MF_DBGLEVEL >= 1) Dbprintf("Halt error"); + break; + }; + + isOK = 1; + break; + } + + if (MF_DBGLEVEL >= 2) DbpString("WRITE BLOCK FINISHED"); + + // add trace trailer + memset(uid, 0x44, 4); + LogTrace(uid, 4, 0, 0, TRUE); + + LED_B_ON(); + cmd_send(CMD_ACK,isOK,0,0,0,0); +// UsbSendPacket((uint8_t *)&ack, sizeof(UsbCommand)); + LED_B_OFF(); + + + // Thats it... + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + LEDsoff(); +// iso14a_set_tracing(TRUE); + +} + +// Return 1 if the nonce is invalid else return 0 +int valid_nonce(uint32_t Nt, uint32_t NtEnc, uint32_t Ks1, byte_t * parity) { + return ((oddparity((Nt >> 24) & 0xFF) == ((parity[0]) ^ oddparity((NtEnc >> 24) & 0xFF) ^ BIT(Ks1,16))) & \ (oddparity((Nt >> 16) & 0xFF) == ((parity[1]) ^ oddparity((NtEnc >> 16) & 0xFF) ^ BIT(Ks1,8))) & \ (oddparity((Nt >> 8) & 0xFF) == ((parity[2]) ^ oddparity((NtEnc >> 8) & 0xFF) ^ BIT(Ks1,0)))) ? 1 : 0; } diff --git a/client/Makefile b/client/Makefile index 6d75b4bb..e4a3580b 100644 --- a/client/Makefile +++ b/client/Makefile @@ -24,8 +24,10 @@ QTLDLIBS = -L$(QTDIR)/lib -lQtCore4 -lQtGui4 MOC = $(QTDIR)/bin/moc LUAPLATFORM = mingw else ifeq ($(platform),Darwin) -CXXFLAGS = -I/Library/Frameworks/QtGui.framework/Versions/Current/Headers -I/Library/Frameworks/QtCore.framework/Versions/Current/Headers -QTLDLIBS = -framework QtGui -framework QtCore +#CXXFLAGS = -I/Library/Frameworks/QtGui.framework/Versions/Current/Headers -I/Library/Frameworks/QtCore.framework/Versions/Current/Headers +#QTLDLIBS = -framework QtGui -framework QtCore +CXXFLAGS = -I$(QTDIR)/include -I$(QTDIR)/include/QtCore -I$(QTDIR)/include/QtGui +QTLDLIBS = -F/opt/local/Library/Frameworks -framework QtGui -framework QtCore MOC = moc LUAPLATFORM = macosx else diff --git a/common/ldscript.common b/common/ldscript.common index 7cde5891..f1b63550 100644 --- a/common/ldscript.common +++ b/common/ldscript.common @@ -13,8 +13,8 @@ MEMORY { bootphase1 : ORIGIN = 0x00100000, LENGTH = 0x200 /* Phase 1 bootloader: Copies real bootloader to RAM */ bootphase2 : ORIGIN = 0x00100200, LENGTH = 0x2000 - 0x200 /* Main bootloader code, stored in Flash, executed from RAM */ - fpgaimage : ORIGIN = 0x00102000, LENGTH = 64k - 0x2000 /* Place where the FPGA image will end up */ - osimage : ORIGIN = 0x00110000, LENGTH = 256K - 64k /* Place where the main OS will end up */ + fpgaimage : ORIGIN = 0x00102000, LENGTH = 96k - 0x2000 /* Place where the FPGA image will end up */ + osimage : ORIGIN = 0x00118000, LENGTH = 256K - 96k /* Place where the main OS will end up */ ram : ORIGIN = 0x00200000, LENGTH = 64K - 0x20 /* RAM, minus small common area */ commonarea : ORIGIN = 0x00200000 + 64K - 0x20, LENGTH = 0x20 /* Communication between bootloader and main OS */ } diff --git a/fpga/Makefile b/fpga/Makefile index 12aeaaae..1aaa9f76 100644 --- a/fpga/Makefile +++ b/fpga/Makefile @@ -1,31 +1,33 @@ include ../common/Makefile.common -all: fpga.ngc fpga.ngd fpga.ncd fpga-placed.ncd fpga.bit +all: fpga_lf.bit fpga_hf.bit clean: - $(DELETE) fpga.bgn fpga.drc fpga.ncd fpga.ngd fpga_par.xrpt fpga-placed.pad fpga-placed.par fpga-placed.xpi fpga_usage.xml xlnx_auto_0.ise xst.srp - $(DELETE) fpga.map fpga.ngc fpga_ngdbuild.xrpt fpga.pcf fpga-placed_pad.csv fpga-placed.ptwx fpga.rbt xlnx_auto_0_xdb - $(DELETE) fpga.bld fpga.mrp fpga.ngc_xst.xrpt fpga.ngm fpga-placed.ncd fpga-placed_pad.txt fpga-placed.unroutes fpga_summary.xml netlist.lst xst + $(DELETE) *.bgn *.drc *.ncd *.ngd *_par.xrpt *-placed.* *-placed_pad.* *_usage.xml xst_hf.srp xst_lf.srp + $(DELETE) *.map *.ngc *.xrpt *.pcf *.rbt *_auto_* *.bld *.mrp *.ngm *.unroutes *_summary.xml netlist.lst xst -fpga.ngc: fpga.v fpga.ucf xst.scr util.v lo_edge_detect.v lo_read.v lo_passthru.v hi_simulate.v hi_read_tx.v hi_read_rx_xcorr.v hi_iso14443a.v - $(DELETE) fpga.ngc - $(XILINX_TOOLS_PREFIX)xst -ifn xst.scr +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 + $(DELETE) $@ + $(XILINX_TOOLS_PREFIX)xst -ifn xst_hf.scr -fpga.ngd: fpga.ngc - $(DELETE) fpga.ngd - $(XILINX_TOOLS_PREFIX)ngdbuild -aul -p xc2s30-5-vq100 -nt timestamp -uc fpga.ucf fpga.ngc fpga.ngd +fpga_lf.ngc: fpga_lf.v fpga.ucf xst_lf.scr util.v clk_divider.v lo_edge_detect.v lo_read.v lo_passthru.v + $(DELETE) $@ + $(XILINX_TOOLS_PREFIX)xst -ifn xst_lf.scr -fpga.ncd: fpga.ngd - $(DELETE) fpga.ncd - $(XILINX_TOOLS_PREFIX)map -p xc2s30-5-vq100 fpga.ngd +%.ngd: %.ngc + $(DELETE) $@ + $(XILINX_TOOLS_PREFIX)ngdbuild -aul -p xc2s30-5-vq100 -nt timestamp -uc fpga.ucf $< $@ -fpga-placed.ncd: fpga.ncd - $(DELETE) fpga-placed.ncd - $(XILINX_TOOLS_PREFIX)par fpga.ncd fpga-placed.ncd +%.ncd: %.ngd + $(DELETE) $@ + $(XILINX_TOOLS_PREFIX)map -p xc2s30-5-vq100 $< -fpga.bit: fpga-placed.ncd - $(DELETE) fpga.bit fpga.drc fpga.rbt - $(XILINX_TOOLS_PREFIX)bitgen fpga-placed.ncd fpga.bit +%-placed.ncd: %.ncd + $(DELETE) $@ + $(XILINX_TOOLS_PREFIX)par $< $@ +%.bit: %-placed.ncd + $(DELETE) $@ $*.drc $*.rbt + $(XILINX_TOOLS_PREFIX)bitgen $< $@ .PHONY: all clean help help: diff --git a/fpga/clk_divider.v b/fpga/clk_divider.v new file mode 100644 index 00000000..882af5cc --- /dev/null +++ b/fpga/clk_divider.v @@ -0,0 +1,25 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2014 iZsh +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +module clk_divider(input clk, input [7:0] divisor, output [7:0] div_cnt, output div_clk); + + reg [7:0] div_cnt_ = 0; + reg div_clk_; + assign div_cnt = div_cnt_; + assign div_clk = div_clk_; + + always @(posedge clk) + begin + if(div_cnt == divisor) begin + div_cnt_ <= 8'd0; + div_clk_ = !div_clk_; + end else + div_cnt_ <= div_cnt_ + 1; + end + +endmodule + diff --git a/fpga/fpga.bit b/fpga/fpga.bit deleted file mode 100644 index e5ea4fcd33b41a65cf776e06d388ebfcad02bff9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42172 zcmb@ve{>Yrl`gvbR7oznT67_VM`L5B)RIYqTcVK&!C00Gf%7zm33B3@;og;XSKB5Y zB^PJpByS$cWM+<9!Zbf@+JtdP!p$u(Nfd|7Gy-D*4lc0lG+4$8&y#T+#?xkGM|OxK z+r$<>4DZ{g`j>d?-u3=?nzbg!r9<~Qb5lstE`2R-~xR=umdF98{_2he^dVV)8d5ZrT-4Z$)PT4xSy&me*C}q z(WUyu|A#)7_P_WD_1N)0NBr;lkl&~Jf7eI<|ErJsl0Wd&YpId~GLS&ydJ1Ien{>U@ zbF{9#U-j`S&d|%$;)W)*EA(=Idm?mMYo&jepLSytS{$ztKhk>F*i6+qV@SM9o0Cns z=%Dzyos#vg@%PoPuKJ`ZMyQV>SRlcTc^(>}?02c5--st8{^xkJ_R{8x9}OEBagH`q z6Z!=A8XGAh(K(|h)PQDTJb}23Wvb7K7isZuD5J%!U&=)?lrb&6hx_CL&(KG7y9`fg zm+30CduW^ySJHRzlSxvald$&Ei}Y3cL`Hj8UXpEI7@tFLQ=5wqv~-(4CtJ}fw^Af^ zV+LbBg7KIc?OXI4d%pbh3DJxVgdeZsv(y)`rOET!PchGoSB9)7C?==HgNw1n_$P2P zZIE>dbDelS@U(m|XRf>9zd74w%$>GQ82;yU8zD@`B{Qz^=d|LxX2v@HlUij}T&wms zj&sv92Bzbvc|B`kUhioiJAZGr_lM8-jfw<+)j-8LxuA|*%Q1&{>YAPGQKKK`|sJK9}tGxz+4-vj*rQwaKunjdR0ABU<^I`}df= zcG3T?PI^P1q$MIOwVX9cZNv>47j3jkYNuhs_%W;(oMY7NgwxuO=z?fNV`hUmL2XMz zX-)XwCH23ijkL%!)8b8eh?*QTt*r@ecAA`MT1$|{pHo}WV1Jk9;a6fz9_np!R-|v} z*EdpA!bpose=Q8XKl#|2m}6REIIxeo)+<#$LIouomCi5!v$(z9^S6Kb)A}5ZN*#m1-IETN416Y zG4Z^#20Ed)JD69czg~;2H)v=yLZ%cp4N)^1K|45rFYT0Kx<7ZLVwm>LwU=sEP{){~ zJb0aUiI`(pLIir$+-L2fLv$a{y#b9#0u5cv#rxs8`)lFW?7>h6ov?*rT%aZXcwiS! zEN$ApeMM<6y{EUW$uc+lFvouJb;HAv3sZHZ`ZLkb2=-XFRkA^mB z5&5S%F^R5C(sV_X{%fL18mqxuMF%m@mMgX}i+RzwF#L5NfX}>2ZE=`Y2xD&Y;2c`Tuboye zG@*Uj|1L>mHSh^+gKx8Q$obBJFs}?|s`g<3hIf^|776FzAzy~i3{99ZF=AjJ_Gogs z>eH)#DfKjcSx$4sJM78=lA?|wM1OiS*;!+e zi1_y9&DvuhnbmX_TQtX?<8;boLu4~nj51=ezZTAnoPJ5P$*ocwabBdudThP+L+8az zvlq(L7x61&Ulr}%))T;7EN)#mrM*R019y1yC$tIQz8q_hfu$T}cWOO11LoO3^A-ay z>KN9vfM0h;Pq2=)_SFw!X;+C4zM3|DfCK=5HyDOj2 z8`#i__*D(qYD}0}@zuH?$wt@shPYwPzsOwxg%W-dy$4qrwy_V7Q!E==pmjR`NejJj zJW#~1eY{@F!*^?=bj8Q7i_X9K0G;;jYoOveEO%Qc{AvUCYO@SyV8VEEGBjvL{PpUb zk){ozaXIY0#@SDG(u_A7w1FD4#=>N^|DHWKlnp72IVwI!Pbcems5cmo%f_+jH!&}p z_eN*UF@aszVJ;TSBsT3a09lm2KcVca+F$qVtO4hwY)gl8o4e&jXHbS+bpL_ZCPS{a z#Q&~N@?G32sqLakL*ds1jq9z94n_QW7akIDe1q16Ml-`!gFHdaPAF|^{&%_h8s`wa zvAIJubRKddPRJ5-Xk#D(|E$@TvaiJzaNUBTjeWRN?@SvN3xRqOCuNDx`1Tdmb=oHZ zTNYg9K4+I>bcq`3C403|U9hhmRS6mb!iH0(O_L&0)3{z+;AFcp1~%kZeEZsY)0huQ zuOODVaJKCm;qB&|;$yvSb@(%qH~Kc(gIiz+VC%ig|R zXtj9*{kd$(g)V4^=@%(9E^Cy>uNnVD8$xy7BVE9+hi#1KYcLs%$BXuei2t66cHl|9 zXWR|g>KB+-&%7OCE7c8Sg5=wmT{DcC+N0AfQH6Lug1J|lPT#0{31#^8BEkD@(Sq=Y zEnaLw{DfY1T08(y9xEk{+iG4Z?QI9KAH&wTyhP7%qljN0I`Emt;pgACP6ha%YfI$I zMzgnPLZjtzw)bBBeqJxnOo?|I26*tW_u4)k1Iq*p_*D_3BL@0x5#!EAn!~>`XtRiT z!ML#V_@yJtC9El7Kkudn1;?16&3y{^Rkenpme(Rjo>=4oMi&EE_j`|GJidLoH@!k1 z1rWx2j9>cgUU*`~q+r5QRl=`|59w;?_T1)4?L)duEfn$q0V7}mp;ycBOFxo`xaLsx zTQnpiwviMOBb97QM2AEv;Ek+xfXgNPGT;WK!mlACA`F?d;ai$I z!0h7wx;wMR=u-a@e)D6_GhHn;q35-)cZ|$vzb6(i@vj4&A9?L^>xI7aG%1hTz^@0; zXiJ2P{0sQyT+*9|!Af#+!iig^FKMvyF}H z4;?#!F~9GxMXq9%yeZ~liB<&fDE*6v2#h+t?e?285E||;f^t7yd z(^&W94feyyTU=wc$oiktX@s0hM%;@nygy4H*zw^|Tr=czv{0gP8ao<4;9qcY&q~m) zNe9a`%ncyg?R(G|txRwq=3gJsAZV9%jxNdO9Oz_7KS|)Hi?w+L{Mt!RF>Epa+K+96 zeK?yQCR-XkqKIFQ^<`|z)BG?H0sKlUL$Cxkc( zpJU;3)Sd_bvOi=P-K#PGIw<$Lfclg4Dey0|h+l8O*R@l)7h7vGu!O>-Lhq5Sh9gSk~?j@~OHPV_OXpv7aZ zt++*QbRtf0RGbF~`5VXlSFzA}glb)L^eJj| z%o=eg?O$$psWJEPn0@@JcW(TZ_#^$C<|`1lK*YS@4)H<(zZg$3o}Kl;FYw&0;EWhN zNuDA}wu^b4^zF+H+=MCb@`6fF z5CF2S&%AE;123k1U5xvmGhkHHRk^?ocWS3$jCZ)^;n#-*AWd91j@bBPi3v_>ZTcy%J%@(puh+ng?ewo~UtMC94q_PL zd&KN6#E1RnL&kkwsN0Uo0aY)> zCg4T0{<`m-m7=T;p7I0jEFoTH#~2eQsC6tnq~*U$62d3KEL`oJoTQ`H^zE47d(`#{ zIv4TlGW{FvPhw|IVD9Y+xXQKiDz!-LLvOjVWq51rQHnU=R_74=HSI#6_^xpz8JS2O z61hD8s)#u|B>J$1cGzn=X%2~V`r)of4)&ER*jJ^2$V!?X>C(MhL9M^*b$=erI ztp&wX)A840ReIT4x~MmMv5e;V_T}DmhOY3|Vo3U!+GW^55Xg)SvncSd3Q!o??xIgK zz1-Vg7kXbU+^2Kc2}S<(E**(Bx$qk{ZDyYG41~l(GV;cXGW@~_Z45Pyy@H^9ld-UJ z1P(;;lmdRu*lR(iBlCcW0FIRmg%<_;!jmF?!7VcvK4S_2TA_!q*{lhkn>_%_8@Oj||!vxqL@^YZ+Q@e8o!23L#b zx(%{10WNd1@sw=Lfsy6)L*N(2V^hdBr%n66sa1yK+DiJs_!jtAnSO}Xxr4B^Mjgyc zqH&oQ&f_PQYF@s6*lJ_f*-X1!yq|aJH5>Dam*W>C3%#l*Xdwt}l*TtBXJ~`LLPxNO zU#uTC+QwpWJ#CQlcY`y&PLHP_%wh0F{Nh~~qiOvemAs}B+YjRKtFdFIA!hpabZ)5u9`PlI-i(`(>g;jz9VekuM{6YlNviP(IpF{0fJr`K2HU+h;0z3}(61{-qL z=ipM_k{t6xyb}I*Nqr6PmM(KA!i-;2(^t)O^;`0Y4z^`sXZrXRXaMFyL)$JsNk1X{ zipj{KTGgm5*q2WG9NPl~+(M60tjnxUGE#$OvlhqON8#5bHT(Q)oIu2q%lyH^Q8)Sa zwFCT1jqr^2D-8aQ1janfp2UHD74eJbwV$KGg%~qWN8=}|PdR=8t*X`sZAvL376GE6 zu|kS6{6Z|@z^ga#m@(x_HD<@Gg-{0%;MyT&!T50k(CPviyFemV@(DjRJmEfPZ28 z1;;yHwIM^v6)ZY2BU_Ox;TPLiENwK2Q@qE{!oH5tJ}|P)Hu`k&TDXDP^mM$@3-%<> z=-AJrW>4f_ji+_&=R^s=ZdS74%I=vL#V_O?W5BP|&Utx9F5F#)U&bY;)x&hg1)NNl z-MhTxD9>NyU+{;c3v!`x#Pcsp$c7gJ05Y#Vw{^UPUpwhpz?SiK#6KIX#$n?j1QiEs z8i&n$MG?PP!@s}ZxHmaze}@_=+7o$&4lsTtLMp z+VoH)YyM2cC<#k}j-BUU**iT;Vv8CQj2_Yl4|OGNLc_32{A)m_WRq*`0Df(hfUQh2 zMw^FiFKQR?Yx%6V=v3+sJJh}G26{p6_Yl~xHI7R#DYt}QM}f<*lpJvRiiRnF34R_( zox_tnesx(c%&OT4C1*yvC+%jhYL6B}-~lGipJTIKWGjL)4zd9(nlVr3}Ort?*d(-S-3~QmroX0OWP)(1@I@joqRMWv!UCvkwE^|=cn={5s z_(feF#kYinX3zx1hpQr5h~DS%*nLI)Fhl35T@QEp@y4-mLe1;h;c(6@;@6wGixPen zx~Q5C2VKyO)lN$e=#c{zSvUE1C?{R`S3^^d)_ z#MW1|v9lk~Yr89ay03^|=Rvy$ySJ|X?wsIDJ6hHN+Qtw+H#?#2S~33xv~ub#bJOuC zNiSkUNIdH%2O{&L*+TxS6a4GvRJR5QTS0xUy&8>I48<9{Fy=gd{g9rO^~+Zr0LE>s zi#RKG0J}GUwHc$u{MRgIh~Qt_wFaGK%<$uIdMBLbHF(c?{jfU#{L+B1H$cOGPb$nE zrVDh`K`c>*Uza`DV1K<$ll{%Kvfl(_b-=&8V*ab*HsDv&9`o&ax00_Pim0(kMx>Dw zLEqPbf7uy|>6@XdNu_VxCXjKKP&@|ECy!qiXbwETldQ21Xt1w!k(&^Y)s5D!fwytk zmIsXMNugC|{ms!2Wy^h_UEc(dwYag#l76_y2LECYc}@bCI}!2$3piTNl=#>C^b)*Z zIE#3GrG!g?Fr~kgT#yK5HS+n_Ug-1xrp&6NhJNK!s#oX{=I=|3`7g@QBeiwM*#_

IF0zP%j>{UE^8bcI;QphNMaG^A6TDM;nm|#Xch3hbkt0X`1L;hky^%9dD`pr61C()qtNS4 z8H#_=a%Ia>zrX8<4);D*{jR;0>T{i2l8eQoPQ5fHO8Q|P$B@UMF^)^w8|gH5bTrTo ziYzr`M^QgCbe4Sp0VBbrw2__;>Xc^tqJn)9^o{r6{onz{un+gMnG?MV`wCel{csfV z{Iee1;29skK*Yp3@hr8EmhcPlMqRrh-q%`z%L}~FgtmZ&AtY`YE#MdGH|W_fG<{Eg zn2d>(1F8tx1tf~tK%zW;as3APmu@To1(u6#&!7(K-OXdRO8B)GZm_8qFcG6o#(iE? zCT)9@0Y{Wh=J^-RVE*+FUI=9gGy<7-OF!}s=bRQjbY3H0-$4C_b&1g`qm2LyFhMfU z!t);m5xcRRf7zMT?09{QPCCt5ge!G)GSTd8IZ(o{8015Vk z16I=P+eJ?2_|UFFXtWZLjS!+v#HwdFcDj4IxXrgO@UOtrz3#3QOK|IDBSQc;ez@D{ zOcwbUv#ofi!L;ibJ>!KfGo*i>;@)gBi}(dzX|<0+ExhbpwPt$ZU(VzPgx?cW_*cAn zbQKdLxIwQf4O~7UnqA;>UO!xk`i*C;PkH7;fa6~Rwj8UPb%{FJX&3OzuivPfFqep% zo$pBd4O&-ya{yH+<@lxQHyW}CiDUGA2W#3|9SZabH0GA+hjdX4X2Px+rPtj-8Tv9( zYR3WfD|0KR@Grm?%>?a2{;Ns$`CMkcGX=i_i^gL}$Mm0|cu#1X2EA7<=>{V!<6rwk za{|`gAOKsdjh#U_>ZQ#+U}Q!7LfR|QfE^_o0-W|jaMBPd=g69!cXIbW*;B^}{^>8ipp5aHd%uy0eSyuIPdie(iy8+4EcCxq2FkcowF7lBZ%YmsfM06vQ38JHOLAM&%f{$!yRBn>H9G&&Zgs*| z-$~#1qJD!A7FuC>Kk$oTJ*nAD#H?5`|AqPuIw~XXG`D(*aagvbQ{#P6deoUeWaPBF zeEW*(Auuv~5_`<(JtFszQDhny5l!~Q`Fi|8`ypcXmKE7p3x&Z zb%*d1Mg7JHy>)9=UDXlPfQt7$m=Z)lc}Ujwi&g{M8@6?)08dmi;9XS@Rz za$8>$PZsn;X!us6G@*GK|0KWUnLX8K0*Y<*d`9~3Fi|tYtUqVQtH-FdG^h3CNExIW22GF^bOtml?+==kW{rAswlMK9&)40LPKD=1%PyWLTQK6^Dgg z&=1i^Hf>)K7hfTyDUZSQ&e0L4$ub9EgDT!INbxT+<9Brg`XCzum$%S<9nLczgjM^C zu@>`clKA$uz@0(IWX#1{91CaaNm$&+y$K`KpcYPO830+kgV^sfealxA->&H4K3?E` z%whqBj%#r_Ldfe);$J}7_Npeq0#qLf{xvil8D-qDHq%@W_!W~w^2y_9r za_$>776wBd8!hayIDia^uG)kNHjv5!$?CXiVhy&#WAf zsD)yl76*(Dda*eC^LxwTs58i0sn5v;GWKP_*8GW?mxTi83GK4}s<+U?OpExnhv0v_ zP~42^Cjyycp$y&+3JkJa_;YNYd$z*Hcx>C~P1>|6_vuOFFxKKQ)$>f>_w6fJ;ZP>f zP#rY{RVT;XEao)=@2nmap${C@I4yWM$bTIQou}LBI!7DDOZcC|C?in}nhOyN{A*UunS}Mkq)BvA zZ~k{RulKNC*uBO2!?er*wqV_}1w!=W25g5Q!sk}>lxUD*eRbA&lp&W8HIb0Me0`4gAH#->7wZozxc)FALpJ!}CTd3h3o-4L)yRmI*B=^_ zm{-`VpAhHaF6Q^c(4ZAqD@y!}#=r~W4rmu(3l1Oj1iS!^*~m@kaehBie=vP0u-ob0 z2}t@ixlZR!IO<;b=c=?Q= z*NJIPhRaAA=z^t4Rx$sz$GV`m(R6w1*fu2zre|WNDa7+r^+T98(#mxrYYf66XsADQ zmKcbr%k;yeR8Ph*Ske}+B>>zRfDRDZ4L$0lzZNmr7bx&6(c6P7>50<~=P|Dk?Q)_l z)ED)`8tW+4jQ}0K(DCCqV4@2ZLhB_IhMtmsSnYiD@cyyTh3o#o{e%2;F4U>D$(+2+ z{=~ZL-tq0rxXFd$0oia++e^PO+KwX+`>u7N;vc4=O1Y>XzE29k3xAMq;8bhcR!Vb9zg5ca|#_3i!np3z6rIeH}6SsfY|4DWKSlRVE?d2t>)!vU2N~}O%tkq z<8OMjGx~o(Hk{96{>T>+i}|mM^hbGn26`{*=fRhOUo8B#Fkddqe;q<}Xrz$#LjLPs z3~WqC!Hkp2l=H7cG%sb?fB@*&j9j$_-O5~xdw8$$*D z<;?m$!onr)$X@LfCWtc8o!TGh#dLEn)(YO#!}H1op2eGQm-FA&t^&VMRO9=35U~lf zh+liLluNd-Y$z}3ZNrF3@|y6Ta{dJ*N*lXb!lkBBq~Q=t5VYI_$!32o#wu3Y`>beY znk_0Ea2^kd<`MKkV{x)9|MhckmkYI!6JZY~%rDSsG#XiyEAp=p{KjIZY9RuU53E)% zya1aGIdR}lIsZ~=%6m=FE-ce3%u6-O@T-Df%Mv-=h1kn0Z@C1S{b(KqPk`!KHt%oIR2m47*QqH_m)INUN9+WipNw7bhF=U>htXU=jX z9c)OT&vJ~pQJ|uu3q-8Mzv$3%Jh21=8J2Rk=m!o$=(r~TwUFR0m|v*DGrxeoL1tP0 z>yQ2IiLG5TArf+Y_^S4bdm-9>jehu?V>y5=zfV<}#W;LMBq;g1CR0Jf523br7k4od_uU8sVq z^y5Q!)-ULU5ofg!kc2c`)#J+$CrG^K$HBjpeMJL%2pN{M^YeYygjFG;tuU@kKLqWv zP}v-C zs_CTkL%XCO*4WP)Phj^V48wj-!q9fw8yo;fPIUWriuyz3zZTrLWu5jbG#Z(9Eum9# zzZ+Yv%@gc46#u$tD6ftpF>00JoYsv^+a|HuiuiSruJ+&V!VM~a=z=DH$oQ3jhs^7T z12cATG&l@v`gf**GPoRJ8Ed)F=jZwFnd=V^TDKBb=RAFf=1Zfaa+LZFpm~{on3Zs# zqnPqA^uw48l6cMrIkTqKB&Yc?+rX@!+8=Zr9^X6Emqkvhb#Leg%ifK=DB=0b^uu#> zHPMy~r~7^fEI={vHuwZMhvTRaDB>3gC4Fr?#ueHx>&SnNYU}6}>Ni%7mh-QpT28{N z|EK;_(X`7rGjkI0M!oFrD)FzVbLj5f1m^NCu&HS`Bsj!=_%-K}{IxK21KST_SRB84 z0`r2Qp$}t$8_egIsj3_Ce1w2sDrYBS>G}kDY+sg11^k+%%K_8_j0RXpydw}E)iQ__ zevT(4{qQ0oi)RC^n(2&$@XPCdrT^0e;#}lksNaxHjHgIf$wfKToW$he24vF9_}2(Q z$F{KqkUIMzej<*t2aSedG|KoFdwyf_ee-BDRU-ez{3{tbjz*Dx`HJ-PH2lVERP8~d zo=X?qMP1=C{`CwPBHTreLkKRgWc)(@i-D{Rzu^5O?6g5D(R-ivGwY%1~R}_96{i5t2K*8k$(*dL>E%!zc3v&FF#*7QRH70 ziaBd=jolxXoJLy265#d^O4f!QcLDV0ja0?bU<@{HEsHi#N zF}K;=m{-QXvb?5b5(F5Dg{%iU#cOU5?Sk{0oaq>0}HMBY>=of7P)6=|b3CPFT&tauj0Is!{E9wa5B!?Kzi`CE z`^2dEDcInC2aAisKc^itox;CJRck~H7AQFXMMG{A0ny6qH*{uO9lE|xx6y!4VDQD@ zOZI%mS0N56iukol!MY}|djqgFh?t}gK=0su+!X!=7AZF;B5;GwB5CH5T+z`kqecD| zRrOIZ??zjkw2{~IOb9r{fg<);k$>gGu=~V+AnkRFcVjmPX1dzXk2-n<^8SQ;9no& zb3)_Sv3}T|fIlqqubqHVq?PXt)<6oG>qQ?B0M;2ua+UEf)o0jD!1NBF5HXslKBEJC zE%foo<~?TDykzh9B01CDbRA{9sE6SH6wh74w`Bc2KQQZO^g(CK>F~Q+)P6tBu%%sf zuDTrePOaYn|8li+HkQEShJ%^r(5HxBP;v~E-{;K5aFvj2&f+DglfPyB3)&#ZNG|dY zLvo%6N$`x=5ZK)e&tK$UG468=ePY((C~6qESP@*Nll%B$pG(%Aji7?fN zqGkMRE!LvtSSSa14S|pvvmdW!rq*vf>)n|{><0(pg_(aLu&3}u3BRuR_%*4urbcYk z&-a-BfOrEyR)$|^>2QCO4a{xzva2I;m6v2ItYBuV$acjg>SWf^b8?W^tE3-Fo(1US zIeM4cdodjr5|zU*;up?(u-ob7a#II(nt7s$UbK|wA1&aQje5xYW*7$6i|M3!dD&+n zkSZW6;@3*7g~Jywoihv*~y4n6!3m)Y>KWj>dkpVw$*g7^GD1wuz1@8{9a zHzqFGZCSupH@(P+He?p-=W)K0s;F}*o4FB#ei+=zfudJlf4I$lI$0G_sk*0=jc;_W z6JITixyQG!PPQ)@OF**<(Gf2;k&25)5gV(yf6lkBan$!-3Eq)LwLJJ&rgaEm;or$q zE@E0&`(^>Zaym-T#i|sn35TkTe*qDT;0ZIbZKSjd!#W4F!ZAG+kLk_cO3VC_^XoJ_ z&vN|Q=rt{4NzmFDK;ZGcYMrr(9d!x6#KwMj>}_!GSkqBsTlJoNpUR?s*q~zt9iz76 zdFowmFYUHOC727N1F(Q!vtK_CsD(E^E3$GBiLiQ?^E*7|V*UJ>g*sR#Y%TjO-cQ@; zsv7MTC|O88}6iV|Y@+FXzhk1$Bt$uh{?LwcsF__79|lsctCtik~9?WgTo?phqzt+FA=5*cF`Z zY@kni5J-#sYbVg^i^6y)iPB$c7*+?tP^^ePhz4!mV|ERrm0g{(1?Darn1oh2eKd#X zUaa5vXSyhHylwz4?q&Ue2YU}!zX)F!bG2K2`$GO}`9(gfxJNsK`okqidm%RF92w?S z!Y})>3-|sG=I)vU2OcbxXks3ndr?o{?Lv^fBP&Hz}U18^cN|9-L+BUlS~HbS2#*uLW22U;!~Mf}>! zs{V7PoY#c8@Ad#>;5))Tjt|V^mo-c6sL^n`<+=!T(XkM+Pf64R@WSQepIqP>W?Q4- zUux%r?B3^3m>=s`cwXRN{+f2F`uQau?CYHM8@v|4U!wz_@+v;3h+kL>%mU%AS_{Ca z_BT57FN|jjej$X&z#o2JL0jd&$YdZkfq6~vTPB(a+>G~w%+WW*hXDm!laXK1!*c#v zmH$$GxPJZvih9Ttj}YqTJ-}AK0RQrk5j$O}`Z!f;URa%FML7OCUD5C0d5u=u+-bmn zKR_!D@>(yS|GMs75Fe=eh#`IZ%KoX!FFR(Bs38c6p3zfz#(0<>WPLu*za**pc~&_2 z*jGKL>P|%;?rqH7$edAqSEr6lAK~1cE#@bI-8q2xNkS1z_Qtq)EstLnod0SYf~DMM zpQPr2(39E)dVxg@@UQ&mP!8c!n+SWRk_|~Yy}T%QT36p?Ape#3kev2Xu%!wS#}$65 zK8k+@fL7bZo3znsy4&2|!9rr>OA5d6cKG}k=f80D=@l_%qfeJAlFyToB7W)gl#Xcm zZZX`^YsHqEGdlF#A>EydU;b4g%e7|c zx=h4g@bR7N4^_77a~%umhjv}3@i|c=du@fer~UVwKfm08^F#}2y(*-&GlemtiIT6}{f#HRBVLaph=cxKae+d}uP^Y&|d&|kM&TIa9srn5c z&5{4&KvAOZ3-}d6qb&c${0kwv!R|uB#Vtl-J{pnZJQ_a##qlBhMo~6gEH(kilzkm1 z-;V_lh9UY|@pUoVRo?#E zTy5OKrj=+g3&3WB?NlasJgDDr^8WBc!u=ZwU*1Oz%m5NuZKus=w0C)^9s<1a#LI+)2bMCOn3G9?h$Kg+jmWQzDz!Tbvm zK4K(nErd^L$cA8KlKc4UCpD#9KW7Gm2VA)V)s5BWruJecM$kj{`}WO3BM+7MZ1ohN9nTFvIS?vEXi0DI$gjoY5l?2 zcskOP`mXsE8cIY`xZkE;-{eIWMt1;r;{08yigA%7I}Oa;LW7RoZw5p_NXsUpM!X+T zw(Q}oYs!cufevf2UXi3JlU#qeTR^cd@~>agh_k;Yc3j&_lXgq`x-soG^(6GKny0JJ z$psGRkgpS4?^d|{tPFG6JSysK2=$l!HFd0?&~XR)Jopzo*ffHZxs-Jf$!ynZd>e#* z2wT}r!T$kng=0k0+}&YdNQ(%I((K0)xeBEp(f~LJr^|WaaHl~6H9~gb{wO;z-C3Wm zO9ZC{Z>9r)0CRQqpU{T%EnLgj>VFQOUw+QYc%eFQ8I|^`)^vHyTIfMhtj6-<2j`ca zk1ZTqe$zkZFdQB=&(lZz zY1X3mHwwrJKJ{w}UR{En>41zS01x9OJLM!$G+E|1yv?W?oql=1B}(#ng2A!EO6 z@TSE%H$hSUoMQd_lgZa;aG+@~^DkN?8=o}i^_>Ks!!C>UhaLiMlx+y?)d^Zm(@A>+ z6&-PG$oew<5M_r>RXU7qY&1JnJ2ah`I3rIa@-|3oXrtKeL|NB5BzMDhf(=G*$0FZ| z)Sd@^1s);3b|V5Hi_UYV{ZcHnA6Z)O7^7wRufTdjjX)P-l6_8hS1q4kuAndSle|7Z zRCS*~*`ZyPZMKa`xx}tYX%Rdbv{zQ&L8;~iIC#!m zK3{(b_s%I}XcxbkE`5QNeP)q=T@Ev^&9XTYAp=i2uMsZ8V!yZgEHnVwlG08 zuXr#RP;0^YFAjUEB#uW-(j97E@M8+UY^{qsxi=yICGz}B>4&3m@Bauy1LnS6*~5Lj z3dO$+n3XDM8dcbtfYRqYt6KE5A%&2^@(Xy@?ZO@H5sbFbs3T}!w9lC5tiv>{^i>j-@k!* z^@ks#%MR9yr-KBa_4f|Xv@*eC&fkByIOML_L%3gy5Ra`5ybaGE8ZwLbNA09f6U&CM zlnu0tf<5BQ3@G+&afS2C&JPSO+c3tHuhRw@b>RyB8$Gf9i3A$O`VEd_V#CJb;9BZS z+A=sKIATP>dAx*Q%)gq_2vzn|` zT3i`^A;KTqx}&~XzR+Lxci{9Q2u@9}ZF5 zl5oFP?`8*{Uh>&T`{1ahx{;%#AHwsujfej$z10tg-(B?@9R9~%yHjNq@M}i^(B@;o z1N4U6*Bu%S?4gg-El&6v{ScCbga=4f-xn|>fb4L3H}kLZ{1?LA?^_*rid|$ckH)dM z`yjZPJZ5FfdH$8alLo$4w9~Mt0e$Z4Wd7y*x+4EdYY%{bMI6PyaR0`iT~~%*dw9(3 z)rXUawH#FsaKSyAfagD1z%MK%_!nR+p=a%bX!P03Clg%JF@=ALrai_Uq`fxLeu*e1 zsvmXWA*bkv3|oJ?M65(;)ZiHl#n#?^v%b$vW$pfh&vSG@k_!q^5SsM&NUVC!)ycmN2$GXOQf_8OLKirEkH^p&^ zq!o?B$72UJ@1;LFLoaZ=>aS_q=U)ec8Ao{wKoSz&iR5#xHoAGW@bXZBKunVT%_or!8?1Z@g5}57qgv_;lO&P&5$| zSUJ;8;@(|ZKf?N98GadaC>T%raTMSuL^#OI1?Oe@;gJB&f5n;a&~)SnlRq*xTF@ag z;Bg6FQ%C7z3%%*ME`$D#jp!V3hvN-}JIYR>AL4F9C@>ktzc3x(7Y2Wnak-fP;&pFM z^R*jj;B)o>=ug`D&$0Qt7{9=d$(&H*0Vy8B1pAy%^LVD{hjuMcI6tq5_%ii+7;_Q7 z{QEa{xk!5{Aj_fgC%LWimR#)={Q3YW6XwrR{7dw$O&-UMQrF;@0k(znU->Y@JTJk& zcwXiBWjBwY1~@-27mZ_y<`KM~vignvM%}RaDcBdst7an7O8;ir$D>94P@VsB>)tWH zSr~II$Rkc+=YY8rzI}B<-#8-F*_`~`-N^jJw{bXP+LZbYoC=3psQ4E&nKARWnv-%+ zR+ZIn0IfL8V68yOhDi+v!QlO-UsJ#F)#a-!jp+bl{_mM<^cQ_zP+q?QlYut|Bn1Fc zJL(_6O*M*NjQjDSuOF(?g@%9vvUKo)_(m8}ZCacv*cUwia+E-*^UDAQ)F0kSy%N## z6#SZ$xVJ~$e~6*3O7Zzz8nm}a?JYk(RQGQjJBquQ09$IzXKwsZpz;BQ^acE?t>9mA zzNs*;S2usk;uB$^DfJr}5)x>|{0p+-qmkXLY!m7?UhwTpo&O4u18id0!kBB5+<v%umlxE+TU8(fdDf(d~4gHYIHkzcF+qT32|6)b)q`wxverV@P z_T>tkGLzsS<@Fo5FL!Q|ukH2sa~ykhi&2*~%j)MryK*SoxMJoDIk*7h1-Wk=1!?aH zHg}(YIS0QNKG=88_bu*?V_e9=v2l@qA)fbI605lWQ2E1gt*vGR6&>)0W%V1lf5XAI zpYg}j)A#jF{We!fmg?tsI*1sLm--~c8NDBc9Mg*Wq0RcCP;*BEAZ|vJZ#vRb_LcS5 z-M@chFb5BCF7L<8H=!f7c#YT8Z@~28g+8+Gi!|x9def)YZ_qy`@HwqYlv`zMU$;k4 z(Gi*`;Fmi8MNNxME~`@_;W_PZoT@X%t z<^4vyV>zYC^`^zk^Iunat53jv9bx~R(b&E)p3JrQg)zgu`{|+cI9R0oVFAAa6PN|) zB+u(|y4_X>&v6jU1|y66d|6u0lXPMx&TZMWzXE<9_hv+K?)cA)!DOC$rYf>-Uo-}^ z>Ih{r_FB(OikOskq@y!lJik0+i$Kax82B6;mp~Fe$G$HmcHalQh!^ndKkaNM#xrUz z#35zO>yW0=iEMLE=uoMC{(y7YX|D_?`am$P_CVOf1h1rdUZwi^pU{go(1GprMQ1Py zy4?t-(ELlhA4|7+KLfuKP(f{+^uLu>d(9Io2oB^hfjk!L=lT9#?5Ma=C#FfQr@>N& zhErn>YW^2f7k`c&xSsm?ELE+jw6|}o%c)B(_HD0A7?V)`9q!X<81x(>kl6X?Xqpuu2j<&S!bJ_$@lT3E(iWq#IKi= zeJQ++#nsb|C&U zaZ>{kywPA;{XD~#!T7Z?pkS*8D(GBJgo!-=nz6?@6m4=kEwKl=3Hu&&o=uO?+|@=` zseT?OtUXSbFH`q#^n}vdE%u4p!%W1YzCIrfaO~IW%};A1LD--(KRxrURhRaQtY)X{z64xYfAHM@E=`1q=AKiuyd%khk3x zvibt{FQOL0jBjJJ8Bz36_T>gXVQfg=>qW7jjqf;+5xT^ghVS714WsP-jmpTebjDt} zc;?OeFZx?tod3E)ugjJx_iyagmn4u%$Y{TJFRTUTA~`PJ0S_t1uZwi0w|xTlA1<<9 zMl^=PfJM$r`&tsXPp??N@jvvZqK&$l5VdO_?rQw(impuyz4aCl%@Ok`!S;^)7oG0~a~KMrWS)Y-OrRa$#HeW~{FapqrEoWCnz zy-!!%_7lhoEkyZHyF1-O{XD7&dVvmk{?&`2AGVu@j7{1X(@i8Ucg`Xn;&J4HXVQDS`(E*h}}LUj0fgX2R&qr|^NN@x90oa2jp zfrG#}#D@}%GX8aPyGm1XyrJaKx%Opu(7_%n>W6#j3g4H)xC|nOhIx^3*};<%{}S+i zobEhFAMC;B3~Eu>m&$vN7VxW;HrnlKJoK!C@f@t5>!9u{hw&8nS70sJ7RIdR<=Ebe z1ChH3Nq?SKvHp;6+d$@Mop_y4i1>!NZr%-e(l`MkR;)i%*UmHB8gW3xJWQvv;TW}2 zdHvxt;)Y=eP>f>9}J3BhPfSGQs;0`k{QW%g@ykG<^OXgLwgME$3g}2D|DN zQ^kiX!M`TN4j5707x1KrUqA3R?5P^Z2zktn;Ea{qC@Je)JSpNA&`RC($ZN{+VWx6p zBI((uG550i`I9+#0EVr6PW*^CC7UwLSDm%o(K`JQRC4YB;^3eyGYDm~D;e-vB58 zw$4|6?4VKNU(gR3h4b^mbY9UGS}&!p;a`HQ4b}Ot#RNfMldvh}%%k8G{V-o`IIL)w zSsm=hnDI8I@UM*tU>x3$o-bMXk=U4;mk3VL4^LpIG5p~U-9`XO`bX4)z>5V3~lYtAok$~AG>#yB08sGon!SS)doRPR*&)n^y% z%Yff_67lVzryNL`eh3K2*7ANni28YK<60Ut>N?OE_i=E*XiKVU!*$y0^nnBs%fgR+ zi2PSM|N2>O(ot;doP~p6o+-_7CXWI}G=+b)Guu-4_vXUm=Jka7Ll^$AjDI~%_)91} zo&$u7ZgRrHU0#0uh98GBe(@b0st*opc!0Ls5JNV0Vay)fB7T^Ep+3s@Eg5R?@LD9{ z90&WBBL8|uxj5y=ls|Oqql5r2hcUn7e;41sffOXW0vzaY;1gW!OAZ>#@g%Pwa{lXT zMDY|fTsWDW*6jQd{7aiC;urM8A&Hb0{4*WOfv03~5#k{^kKhlB_{ABYd>_t#0RrYi z!&g2$=dXpKBb|qNMcHR&2-l@X6@En}=2gV6Z{a8?swjEPI8@Gqk3tZDfn>`0mr8rF zpI40>Vo02jrSL=vzb+E$H;y$i{{l_E1?&DkDdJqre|c8cmE8ynp>Mc2Zp;@7onwNT z!{8@$h40ylEdEXy-;iG&B50o6$McDfPk=%kucuWerd^ z-t0B**G33`;G;jZTbplO3iACVz(KWtvK4df&CI_za@csRX^ru?sHYJxnl?;)?${ zihm^rsfskuKBl)iod2@EW?K`p#QNb$t2w>W)}qUK@Hi1x z#4n&#Cw85qy@!4HtTlglGcI*^6etw=*IV)uJpZaR_yzu)M*_}sj((w9InN?~{dF9- zi83TL&_*Zn1@m#7+d7m`PfGaZ=f6h9LGg%H@0h;~E_CvLQKgXoTCRhC;qS}bEw(%B zw}XiNQe5xsvjAje_;s&!aUA)tNBe&2W>E-)VP~JKnjD>m?*Wp$xxn##N1RzP0sn$c76Nv2k^N89+8gKb-8uEL`nD8?dz_?A9~* zD*GztzrepFu5rjheuNvG0Bl{6S0w`bNo~|$uL1o16jgS3ENRhGwS4TW;}shqHH;hE z@|a@LcHkFs$DKl5-YCp_ldnp?tiFU_-T3q4%qDq6f;{fj{y>*#kbOe_yV6+E3tjD2cwyg&eSrgetXEnsToJ#dbuo1% zaEA=xt~@&Bwn+H-Nge#l0~X|SKvMtjG-S`8(Rp6P^o^ZZrX&LyYU3Hd3iTVPHnb3v zaM>a9U;l@>P5fS}zo^1}9QIL$P8RTsq9{kHPLk`qXbVpvHP$qbUlRATT@19zSbC-% z;6e_Bg7MYO-EExeF1#blSc0|s9H99r_1>3<0`3jU+b~85+w0FS!mG~E<9>0xqL70_lfE_cM zSC{dxyf;2aSzZeUXgqP?sEhpT8Bj$vi*pQQ-gOMnS6Rm{=U@D<_@9pmKIdEfoRyiG zMf_svRSn}ZZMF;J!4pIv1^!jBvVg)PpeOkW?uSpnyvq1j-t)iipniU=NNQ43_?Jq1 z#et`u)jAB=8sUpLoNMx5{=6{GxmJ)c6d1kQg^tP8Nkq-HHMvb=q%`wzh{Fy`YR8Y~;azToR@L=Hv# zDvntZu>{;ZKWS%1R?-jgM0tK6CNLfUU!n0r3BOd@i{q#w5gXDKBfF-4Lk+c8f@Jw) zjyX{ta}WECeEkOF`!LeVJ`uzFQH>&g6~{a#m>9;&##5|6+*2Ae{2{|u@n4nnLw*~+ z+bJVrijfuZE1&ja{riL&|E=_5Y>H3h%&KH>M`g6$JA_7bnbIh6A+;1|&9Dri^B#1b=5vxRJ*c=3n`U@eDocDCyo$mZ47>|0>#7(hoS5eev9j{0p&! z@4hbMec%AHZ}08nF#Iz9mG1*0=9GLLdx>)XmG>&Kbu-BT z6&m>`(pDdXqU}I}R^#tLS4cGY4?b z|FCpNp50J8UaeXh_`-)bf);pF8iW=;-Zo?}^R|78)D@cV+I0&7v9k zd4&R>r@!!K#Vc0&jUF`qiX3l7TzB$gmV||~NT+~m1kf-rFoXYlX}-^$31JX6sWj}e zMj(lEna0xmJAB^3+xRc^m;P%(!+|#^>s-$XMPgNb4wZ7xpdGnj-Rd1p=uMR!YTWf#Dn2{_s*7Q!Z zKhrs**e5Y-b>J`QFXXI5h2N;b?g@N`pE&vNqRPNh*_EiNtte~U?LYBHjQ=mNMIGBR zbidKXn^x~%YFnK;+4*^WM!Q?SlK50@mEZU@8shF=^`!7!&wr-kq24bf{;GD?3&qBD z`6pg}E$;k`_K-Z2_+)L>3##!awbNb*Jk)z8@qg9c(0XG)I7|ebFccq1u~TQ zd~J=F--j4;(Y}g}ME`30dZR-6A48b?y>fNp`r3+zXWZNGH!AM!?M(b-?W{tdJDrN2 zz!&JRXqKlMpQjpbtW;0(-*smPC1kB#X<&PDLv7dub}pXC!k9aBUcnB-N~(rhI2$X7 zC#60WPHz|TaI*wA;(rmE)e&&KdvG0gMZvyE3v_w+#Ak&nmX$T+J@zc4!h!v$9~7{W z#pbITf#qypusD8_??HEV2$Ft6mm97fHJ~i?rZ~l0_%6(yy$#zJOokhofQ17J zDjyX{6bWfU0h$X2r8p!64MmDWG$}z8wCjVMD1wMYItnPRBn5&dMP%O0&U?G-@m&rH z1QP4UpWc4^-p-qO^UeO*;Dw?NE8xc|(Dkk@%+X~fv-Nco9!8F_SW-nS$o2Cx4ez=J zkp`6o=*b!1V?Xni*N3l$uWZkLPGG*$8@{M5Dvj0F7g+!l4qttl3_dckjKz|wtFHx3 z)tw8jXyA3l3kD3(lKSaH!AsuDVpcL(A`8XB%eK`B{|Mmy1k4gZ3sGQ7l$6}Tr!Ecn z%s-i0m{Turz^(X9czoS}c34Lsj71WuY9*kOYQZt94l!}&o4q}MVX(bvL49-Hm+^Es z*q$Q_oEtqq`f>Ef=&lQxa}@B{Pxn9Z&FwF~dQ*el@3Vk+KfSpA!_4pB-uTUc(^4$4~Bmc<1b;-rmfY`@g=;98o$iulkRAwc!|O)M6re895#kXy%kA z%p0W3x(9IAy6(zIKGgjK70y~ zKutN|a&kDbGf|flfsT{8S0a_>TSGnh`)p~24X`29m~~IYf(0qSe~TI zIM3sRuM$6zILr^ll3pYl(1E}O%So&r+y_g_?|V(*g2WB<#&wwm8iD0V)YF_Uvp^$| zR=-5oyRg;juQh``2gLT6MYnW8T}554?K!}5BG%=MzLU`JQh(jMz9hDNQ#JcoO&>Tw zCC3AuzIRDH2x|)ez_16R+RsX z18fc>z{;2SPNoM#2gKG7RA52YqjCeTJ7AY$t$6)mGwjxb_Z*;X4u#ZmoK7eC3C1{* zqNn9pt1!zk14XgqY7{iQjtC|I>aWaNEZgUoGi#(&h4TWfl{yK9^TxB~4SDP4na7X2 zKvKJUjs&nM#MTjLIi4n6&VePO{H?m2mtzv>cQ}?S$7H$7oSZJRKpViE(g1ISoRm|( z3z(Bp8XRwsJvmG{_&|qVwD~}wIw;M-6>XspouFhVLOf+L4vCYj`O-m_+$Y8BU=I=F zz!7K%r{-0YWuxB9tRHg#$F1e0VbG?sqnkNX1AIT~nmpyZfH?=WOP`Z5htuK$;`neZ z6gS`^v|tet4h~`YX=h_$C^ArFpvXXxfg%G%28s+68NhWCu9tAZgzF_)q@&0{ zk%1xuMFxrt6d5Qo@PEqy-sQ*pE*o!zpzs^YA;{WMa$xzD5O(x_xR%m>hUsl7>*P;i ChxqLP diff --git a/fpga/fpga.v b/fpga/fpga.v deleted file mode 100644 index a083ae5c..00000000 --- a/fpga/fpga.v +++ /dev/null @@ -1,220 +0,0 @@ -//----------------------------------------------------------------------------- -// The FPGA is responsible for interfacing between the A/D, the coil drivers, -// and the ARM. In the low-frequency modes it passes the data straight -// through, so that the ARM gets raw A/D samples over the SSP. In the high- -// frequency modes, the FPGA might perform some demodulation first, to -// reduce the amount of data that we must send to the ARM. -// -// I am not really an FPGA/ASIC designer, so I am sure that a lot of this -// could be improved. -// -// Jonathan Westhues, March 2006 -// Added ISO14443-A support by Gerhard de Koning Gans, April 2008 -//----------------------------------------------------------------------------- - -`include "lo_read.v" -`include "lo_passthru.v" -`include "lo_edge_detect.v" -`include "hi_read_tx.v" -`include "hi_read_rx_xcorr.v" -`include "hi_simulate.v" -`include "hi_iso14443a.v" -`include "util.v" - -module fpga( - spck, miso, mosi, ncs, - pck0, ck_1356meg, ck_1356megb, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, adc_noe, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - cross_hi, cross_lo, - dbg -); - input spck, mosi, ncs; - output miso; - input pck0, ck_1356meg, ck_1356megb; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk, adc_noe; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - input cross_hi, cross_lo; - output dbg; - -//assign pck0 = pck0i; -// IBUFG #(.IOSTANDARD("DEFAULT") ) pck0b( -// .O(pck0), -// .I(pck0i) -// ); -//assign spck = spcki; -// IBUFG #(.IOSTANDARD("DEFAULT") ) spckb( - // .O(spck), - // .I(spcki) -// ); - - -//----------------------------------------------------------------------------- -// The SPI receiver. This sets up the configuration word, which the rest of -// the logic looks at to determine how to connect the A/D and the coil -// drivers (i.e., which section gets it). Also assign some symbolic names -// to the configuration bits, for use below. -//----------------------------------------------------------------------------- - -reg [15:0] shift_reg; -reg [7:0] divisor; -reg [7:0] conf_word; - -// 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 -// glitching, or else we will glitch the transmitted carrier. -always @(posedge ncs) -begin - case(shift_reg[15:12]) - 4'b0001: conf_word <= shift_reg[7:0]; // FPGA_CMD_SET_CONFREG - 4'b0010: divisor <= shift_reg[7:0]; // FPGA_CMD_SET_DIVISOR - endcase -end - -always @(posedge spck) -begin - if(~ncs) - begin - shift_reg[15:1] <= shift_reg[14:0]; - shift_reg[0] <= mosi; - end -end - -wire [2:0] major_mode; -assign major_mode = conf_word[7:5]; - -// For the low-frequency configuration: -wire lo_is_125khz; -assign lo_is_125khz = conf_word[3]; - -// For the high-frequency transmit configuration: modulation depth, either -// 100% (just quite driving antenna, steady LOW), or shallower (tri-state -// some fraction of the buffers) -wire hi_read_tx_shallow_modulation; -assign hi_read_tx_shallow_modulation = conf_word[0]; - -// For the high-frequency receive correlator: frequency against which to -// correlate. -wire hi_read_rx_xcorr_848; -assign 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; -assign hi_read_rx_xcorr_snoop = conf_word[1]; - -// Divide the expected subcarrier frequency for hi_read_rx_xcorr by 4 -wire hi_read_rx_xcorr_quarter; -assign hi_read_rx_xcorr_quarter = conf_word[2]; - -// For the high-frequency simulated tag: what kind of modulation to use. -wire [2:0] hi_simulate_mod_type; -assign hi_simulate_mod_type = conf_word[2:0]; - -// For the high-frequency simulated tag: what kind of modulation to use. -wire lf_field; -assign lf_field = conf_word[0]; - -//----------------------------------------------------------------------------- -// And then we instantiate the modules corresponding to each of the FPGA's -// major modes, and use muxes to connect the outputs of the active mode to -// the output pins. -//----------------------------------------------------------------------------- - -lo_read lr( - pck0, ck_1356meg, ck_1356megb, - lr_pwr_lo, lr_pwr_hi, lr_pwr_oe1, lr_pwr_oe2, lr_pwr_oe3, lr_pwr_oe4, - adc_d, lr_adc_clk, - lr_ssp_frame, lr_ssp_din, ssp_dout, lr_ssp_clk, - cross_hi, cross_lo, - lr_dbg, - lo_is_125khz, divisor -); - -lo_passthru lp( - pck0, ck_1356meg, ck_1356megb, - lp_pwr_lo, lp_pwr_hi, lp_pwr_oe1, lp_pwr_oe2, lp_pwr_oe3, lp_pwr_oe4, - adc_d, lp_adc_clk, - lp_ssp_frame, lp_ssp_din, ssp_dout, lp_ssp_clk, - cross_hi, cross_lo, - lp_dbg, divisor -); - -lo_edge_detect ls( - pck0, ck_1356meg, ck_1356megb, - ls_pwr_lo, ls_pwr_hi, ls_pwr_oe1, ls_pwr_oe2, ls_pwr_oe3, ls_pwr_oe4, - adc_d, ls_adc_clk, - ls_ssp_frame, ls_ssp_din, ssp_dout, ls_ssp_clk, - cross_hi, cross_lo, - ls_dbg, divisor, - lf_field -); - -hi_read_tx ht( - pck0, ck_1356meg, ck_1356megb, - ht_pwr_lo, ht_pwr_hi, ht_pwr_oe1, ht_pwr_oe2, ht_pwr_oe3, ht_pwr_oe4, - adc_d, ht_adc_clk, - ht_ssp_frame, ht_ssp_din, ssp_dout, ht_ssp_clk, - cross_hi, cross_lo, - ht_dbg, - hi_read_tx_shallow_modulation -); - -hi_read_rx_xcorr hrxc( - pck0, ck_1356meg, ck_1356megb, - hrxc_pwr_lo, hrxc_pwr_hi, hrxc_pwr_oe1, hrxc_pwr_oe2, hrxc_pwr_oe3, hrxc_pwr_oe4, - adc_d, hrxc_adc_clk, - hrxc_ssp_frame, hrxc_ssp_din, ssp_dout, hrxc_ssp_clk, - cross_hi, cross_lo, - hrxc_dbg, - hi_read_rx_xcorr_848, hi_read_rx_xcorr_snoop, hi_read_rx_xcorr_quarter -); - -hi_simulate hs( - pck0, ck_1356meg, ck_1356megb, - hs_pwr_lo, hs_pwr_hi, hs_pwr_oe1, hs_pwr_oe2, hs_pwr_oe3, hs_pwr_oe4, - adc_d, hs_adc_clk, - hs_ssp_frame, hs_ssp_din, ssp_dout, hs_ssp_clk, - cross_hi, cross_lo, - hs_dbg, - hi_simulate_mod_type -); - -hi_iso14443a hisn( - pck0, ck_1356meg, ck_1356megb, - hisn_pwr_lo, hisn_pwr_hi, hisn_pwr_oe1, hisn_pwr_oe2, hisn_pwr_oe3, hisn_pwr_oe4, - adc_d, hisn_adc_clk, - hisn_ssp_frame, hisn_ssp_din, ssp_dout, hisn_ssp_clk, - cross_hi, cross_lo, - hisn_dbg, - hi_simulate_mod_type -); - -// Major modes: -// 000 -- LF reader (generic) -// 001 -- LF simulated tag (generic) -// 010 -- HF reader, transmitting to tag; modulation depth selectable -// 011 -- HF reader, receiving from tag, correlating as it goes; frequency selectable -// 100 -- HF simulated tag -// 101 -- HF ISO14443-A -// 110 -- LF passthrough -// 111 -- everything off - -mux8 mux_ssp_clk (major_mode, ssp_clk, lr_ssp_clk, ls_ssp_clk, ht_ssp_clk, hrxc_ssp_clk, hs_ssp_clk, hisn_ssp_clk, lp_ssp_clk, 1'b0); -mux8 mux_ssp_din (major_mode, ssp_din, lr_ssp_din, ls_ssp_din, ht_ssp_din, hrxc_ssp_din, hs_ssp_din, hisn_ssp_din, lp_ssp_din, 1'b0); -mux8 mux_ssp_frame (major_mode, ssp_frame, lr_ssp_frame, ls_ssp_frame, ht_ssp_frame, hrxc_ssp_frame, hs_ssp_frame, hisn_ssp_frame, lp_ssp_frame, 1'b0); -mux8 mux_pwr_oe1 (major_mode, pwr_oe1, lr_pwr_oe1, ls_pwr_oe1, ht_pwr_oe1, hrxc_pwr_oe1, hs_pwr_oe1, hisn_pwr_oe1, lp_pwr_oe1, 1'b0); -mux8 mux_pwr_oe2 (major_mode, pwr_oe2, lr_pwr_oe2, ls_pwr_oe2, ht_pwr_oe2, hrxc_pwr_oe2, hs_pwr_oe2, hisn_pwr_oe2, lp_pwr_oe2, 1'b0); -mux8 mux_pwr_oe3 (major_mode, pwr_oe3, lr_pwr_oe3, ls_pwr_oe3, ht_pwr_oe3, hrxc_pwr_oe3, hs_pwr_oe3, hisn_pwr_oe3, lp_pwr_oe3, 1'b0); -mux8 mux_pwr_oe4 (major_mode, pwr_oe4, lr_pwr_oe4, ls_pwr_oe4, ht_pwr_oe4, hrxc_pwr_oe4, hs_pwr_oe4, hisn_pwr_oe4, lp_pwr_oe4, 1'b0); -mux8 mux_pwr_lo (major_mode, pwr_lo, lr_pwr_lo, ls_pwr_lo, ht_pwr_lo, hrxc_pwr_lo, hs_pwr_lo, hisn_pwr_lo, lp_pwr_lo, 1'b0); -mux8 mux_pwr_hi (major_mode, pwr_hi, lr_pwr_hi, ls_pwr_hi, ht_pwr_hi, hrxc_pwr_hi, hs_pwr_hi, hisn_pwr_hi, lp_pwr_hi, 1'b0); -mux8 mux_adc_clk (major_mode, adc_clk, lr_adc_clk, ls_adc_clk, ht_adc_clk, hrxc_adc_clk, hs_adc_clk, hisn_adc_clk, lp_adc_clk, 1'b0); -mux8 mux_dbg (major_mode, dbg, lr_dbg, ls_dbg, ht_dbg, hrxc_dbg, hs_dbg, hisn_dbg, lp_dbg, 1'b0); - -// In all modes, let the ADC's outputs be enabled. -assign adc_noe = 1'b0; - -endmodule diff --git a/fpga/fpga_hf.bit b/fpga/fpga_hf.bit new file mode 100644 index 0000000000000000000000000000000000000000..5389428c5539eb60eee9f27b6956ca950aa79b15 GIT binary patch literal 42175 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

eu*}zWMx6WDri0MtNP{{*8u|VkeY~bQJ-m} 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 literal 0 HcmV?d00001 diff --git a/fpga/fpga_hf.v b/fpga/fpga_hf.v new file mode 100644 index 00000000..ff7c904a --- /dev/null +++ b/fpga/fpga_hf.v @@ -0,0 +1,150 @@ +//----------------------------------------------------------------------------- +// The FPGA is responsible for interfacing between the A/D, the coil drivers, +// and the ARM. In the low-frequency modes it passes the data straight +// through, so that the ARM gets raw A/D samples over the SSP. In the high- +// frequency modes, the FPGA might perform some demodulation first, to +// reduce the amount of data that we must send to the ARM. +// +// I am not really an FPGA/ASIC designer, so I am sure that a lot of this +// could be improved. +// +// Jonathan Westhues, March 2006 +// Added ISO14443-A support by Gerhard de Koning Gans, April 2008 +//----------------------------------------------------------------------------- + +`include "hi_read_tx.v" +`include "hi_read_rx_xcorr.v" +`include "hi_simulate.v" +`include "hi_iso14443a.v" +`include "util.v" + +module fpga_hf( + input spck, output miso, input mosi, input ncs, + input pck0, input ck_1356meg, input ck_1356megb, + output pwr_lo, output pwr_hi, + output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, + input [7:0] adc_d, output adc_clk, output adc_noe, + output ssp_frame, output ssp_din, input ssp_dout, output ssp_clk, + input cross_hi, input cross_lo, + output dbg +); + +//----------------------------------------------------------------------------- +// The SPI receiver. This sets up the configuration word, which the rest of +// the logic looks at to determine how to connect the A/D and the coil +// drivers (i.e., which section gets it). Also assign some symbolic names +// to the configuration bits, for use below. +//----------------------------------------------------------------------------- + +reg [15:0] shift_reg; +reg [7:0] conf_word; + +// 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 +// glitching, or else we will glitch the transmitted carrier. +always @(posedge ncs) +begin + case(shift_reg[15:12]) + 4'b0001: conf_word <= shift_reg[7:0]; // FPGA_CMD_SET_CONFREG + endcase +end + +always @(posedge spck) +begin + if(~ncs) + begin + shift_reg[15:1] <= shift_reg[14:0]; + shift_reg[0] <= mosi; + end +end + +wire [2:0] major_mode; +assign major_mode = conf_word[7:5]; + +// For the high-frequency transmit configuration: modulation depth, either +// 100% (just quite driving antenna, steady LOW), or shallower (tri-state +// some fraction of the buffers) +wire hi_read_tx_shallow_modulation = conf_word[0]; + +// 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]; + +// Divide the expected subcarrier frequency for hi_read_rx_xcorr by 4 +wire hi_read_rx_xcorr_quarter = conf_word[2]; + +// For the high-frequency simulated tag: what kind of modulation to use. +wire [2:0] hi_simulate_mod_type = conf_word[2:0]; + +//----------------------------------------------------------------------------- +// And then we instantiate the modules corresponding to each of the FPGA's +// major modes, and use muxes to connect the outputs of the active mode to +// the output pins. +//----------------------------------------------------------------------------- + +hi_read_tx ht( + pck0, ck_1356meg, ck_1356megb, + ht_pwr_lo, ht_pwr_hi, ht_pwr_oe1, ht_pwr_oe2, ht_pwr_oe3, ht_pwr_oe4, + adc_d, ht_adc_clk, + ht_ssp_frame, ht_ssp_din, ssp_dout, ht_ssp_clk, + cross_hi, cross_lo, + ht_dbg, + hi_read_tx_shallow_modulation +); + +hi_read_rx_xcorr hrxc( + pck0, ck_1356meg, ck_1356megb, + hrxc_pwr_lo, hrxc_pwr_hi, hrxc_pwr_oe1, hrxc_pwr_oe2, hrxc_pwr_oe3, hrxc_pwr_oe4, + adc_d, hrxc_adc_clk, + hrxc_ssp_frame, hrxc_ssp_din, ssp_dout, hrxc_ssp_clk, + cross_hi, cross_lo, + hrxc_dbg, + hi_read_rx_xcorr_848, hi_read_rx_xcorr_snoop, hi_read_rx_xcorr_quarter +); + +hi_simulate hs( + pck0, ck_1356meg, ck_1356megb, + hs_pwr_lo, hs_pwr_hi, hs_pwr_oe1, hs_pwr_oe2, hs_pwr_oe3, hs_pwr_oe4, + adc_d, hs_adc_clk, + hs_ssp_frame, hs_ssp_din, ssp_dout, hs_ssp_clk, + cross_hi, cross_lo, + hs_dbg, + hi_simulate_mod_type +); + +hi_iso14443a hisn( + pck0, ck_1356meg, ck_1356megb, + hisn_pwr_lo, hisn_pwr_hi, hisn_pwr_oe1, hisn_pwr_oe2, hisn_pwr_oe3, hisn_pwr_oe4, + adc_d, hisn_adc_clk, + hisn_ssp_frame, hisn_ssp_din, ssp_dout, hisn_ssp_clk, + cross_hi, cross_lo, + hisn_dbg, + hi_simulate_mod_type +); + +// Major modes: + +// 000 -- HF reader, transmitting to tag; modulation depth selectable +// 001 -- HF reader, receiving from tag, correlating as it goes; frequency selectable +// 010 -- HF simulated tag +// 011 -- HF ISO14443-A +// 111 -- everything off + +mux8 mux_ssp_clk (major_mode, ssp_clk, ht_ssp_clk, hrxc_ssp_clk, hs_ssp_clk, hisn_ssp_clk, 1'b0, 1'b0, 1'b0, 1'b0); +mux8 mux_ssp_din (major_mode, ssp_din, ht_ssp_din, hrxc_ssp_din, hs_ssp_din, hisn_ssp_din, 1'b0, 1'b0, 1'b0, 1'b0); +mux8 mux_ssp_frame (major_mode, ssp_frame, ht_ssp_frame, hrxc_ssp_frame, hs_ssp_frame, hisn_ssp_frame, 1'b0, 1'b0, 1'b0, 1'b0); +mux8 mux_pwr_oe1 (major_mode, pwr_oe1, ht_pwr_oe1, hrxc_pwr_oe1, hs_pwr_oe1, hisn_pwr_oe1, 1'b0, 1'b0, 1'b0, 1'b0); +mux8 mux_pwr_oe2 (major_mode, pwr_oe2, ht_pwr_oe2, hrxc_pwr_oe2, hs_pwr_oe2, hisn_pwr_oe2, 1'b0, 1'b0, 1'b0, 1'b0); +mux8 mux_pwr_oe3 (major_mode, pwr_oe3, ht_pwr_oe3, hrxc_pwr_oe3, hs_pwr_oe3, hisn_pwr_oe3, 1'b0, 1'b0, 1'b0, 1'b0); +mux8 mux_pwr_oe4 (major_mode, pwr_oe4, ht_pwr_oe4, hrxc_pwr_oe4, hs_pwr_oe4, hisn_pwr_oe4, 1'b0, 1'b0, 1'b0, 1'b0); +mux8 mux_pwr_lo (major_mode, pwr_lo, ht_pwr_lo, hrxc_pwr_lo, hs_pwr_lo, hisn_pwr_lo, 1'b0, 1'b0, 1'b0, 1'b0); +mux8 mux_pwr_hi (major_mode, pwr_hi, ht_pwr_hi, hrxc_pwr_hi, hs_pwr_hi, hisn_pwr_hi, 1'b0, 1'b0, 1'b0, 1'b0); +mux8 mux_adc_clk (major_mode, adc_clk, ht_adc_clk, hrxc_adc_clk, hs_adc_clk, hisn_adc_clk, 1'b0, 1'b0, 1'b0, 1'b0); +mux8 mux_dbg (major_mode, dbg, ht_dbg, hrxc_dbg, hs_dbg, hisn_dbg, 1'b0, 1'b0, 1'b0, 1'b0); + +// In all modes, let the ADC's outputs be enabled. +assign adc_noe = 1'b0; + +endmodule diff --git a/fpga/fpga_lf.bit b/fpga/fpga_lf.bit new file mode 100644 index 0000000000000000000000000000000000000000..133ea9924b546523b0128737e5082cc723406319 GIT binary patch literal 42175 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 ..\armsrc\fpgaimg.c +perl ..\tools\rbt2c.pl fpga_lf.rbt > ..\armsrc\fpgaimg.c :done diff --git a/fpga/lo_edge_detect.v b/fpga/lo_edge_detect.v index 8458ee69..af600b83 100644 --- a/fpga/lo_edge_detect.v +++ b/fpga/lo_edge_detect.v @@ -7,34 +7,18 @@ //----------------------------------------------------------------------------- module lo_edge_detect( - pck0, ck_1356meg, ck_1356megb, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - cross_hi, cross_lo, - dbg, - divisor, - lf_field + input pck0, input [7:0] pck_cnt, input pck_divclk, + output pwr_lo, output pwr_hi, + output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, + input [7:0] adc_d, output adc_clk, + output ssp_frame, input ssp_dout, output ssp_clk, + input cross_lo, + output dbg, + input lf_field ); - input pck0, ck_1356meg, ck_1356megb; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - input cross_hi, cross_lo; - output dbg; - input [7:0] divisor; - input lf_field; -// Divide the clock to be used for the ADC -reg [7:0] pck_divider; -reg clk_state; - -wire tag_modulation; -assign tag_modulation = ssp_dout & !lf_field; -wire reader_modulation; -assign reader_modulation = !ssp_dout & lf_field & clk_state; +wire tag_modulation = ssp_dout & !lf_field; +wire reader_modulation = !ssp_dout & lf_field & pck_divclk; // No logic, straight through. assign pwr_oe1 = 1'b0; // not used in LF mode @@ -46,20 +30,7 @@ assign pwr_lo = reader_modulation; assign pwr_hi = 1'b0; assign dbg = ssp_frame; -always @(posedge pck0) -begin - if(pck_divider == divisor[7:0]) - begin - pck_divider <= 8'd0; - clk_state = !clk_state; - end - else - begin - pck_divider <= pck_divider + 1; - end -end - -assign adc_clk = ~clk_state; +assign adc_clk = ~pck_divclk; // Toggle the output with hysteresis // Set to high if the ADC value is above 200 @@ -70,7 +41,7 @@ reg output_state; always @(posedge pck0) begin - if((pck_divider == 8'd7) && !clk_state) begin + if((pck_cnt == 8'd7) && !pck_divclk) begin is_high = (adc_d >= 8'd190); is_low = (adc_d <= 8'd70); end diff --git a/fpga/lo_passthru.v b/fpga/lo_passthru.v index 5c59d11c..933728eb 100644 --- a/fpga/lo_passthru.v +++ b/fpga/lo_passthru.v @@ -4,42 +4,14 @@ //----------------------------------------------------------------------------- module lo_passthru( - pck0, ck_1356meg, ck_1356megb, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - cross_hi, cross_lo, - dbg, divisor + input pck_divclk, + output pwr_lo, output pwr_hi, + output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, + output adc_clk, + output ssp_din, input ssp_dout, + input cross_lo, + output dbg ); - input pck0, ck_1356meg, ck_1356megb; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - input cross_hi, cross_lo; - output dbg; - input [7:0] divisor; - -reg [7:0] pck_divider; -reg ant_lo; - -// this task runs on the rising egde of pck0 clock (24Mhz) and creates ant_lo -// which is high for (divisor+1) pck0 cycles and low for the same duration -// ant_lo is therefore a 50% duty cycle clock signal with a frequency of -// 12Mhz/(divisor+1) which drives the antenna as well as the ADC clock adc_clk -always @(posedge pck0) -begin - if(pck_divider == divisor[7:0]) - begin - pck_divider <= 8'd0; - ant_lo = !ant_lo; - end - else - begin - pck_divider <= pck_divider + 1; - end -end // the antenna is modulated when ssp_dout = 1, when 0 the // antenna drivers stop modulating and go into listen mode @@ -47,7 +19,7 @@ assign pwr_oe3 = 1'b0; assign pwr_oe1 = ssp_dout; assign pwr_oe2 = ssp_dout; assign pwr_oe4 = ssp_dout; -assign pwr_lo = ant_lo && ssp_dout; +assign pwr_lo = pck_divclk && ssp_dout; assign pwr_hi = 1'b0; assign adc_clk = 1'b0; assign ssp_din = cross_lo; diff --git a/fpga/lo_read.v b/fpga/lo_read.v index e6f245ca..f2d79127 100644 --- a/fpga/lo_read.v +++ b/fpga/lo_read.v @@ -7,65 +7,34 @@ //----------------------------------------------------------------------------- module lo_read( - pck0, ck_1356meg, ck_1356megb, - pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4, - adc_d, adc_clk, - ssp_frame, ssp_din, ssp_dout, ssp_clk, - cross_hi, cross_lo, - dbg, - lo_is_125khz, divisor + input pck0, input [7:0] pck_cnt, input pck_divclk, + output pwr_lo, output pwr_hi, + output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, + input [7:0] adc_d, output adc_clk, + output ssp_frame, output ssp_din, output ssp_clk, + output dbg ); - input pck0, ck_1356meg, ck_1356megb; - output pwr_lo, pwr_hi, pwr_oe1, pwr_oe2, pwr_oe3, pwr_oe4; - input [7:0] adc_d; - output adc_clk; - input ssp_dout; - output ssp_frame, ssp_din, ssp_clk; - input cross_hi, cross_lo; - output dbg; - input lo_is_125khz; // redundant signal, no longer used anywhere - input [7:0] divisor; reg [7:0] to_arm_shiftreg; -reg [7:0] pck_divider; -reg ant_lo; - -// this task runs on the rising egde of pck0 clock (24Mhz) and creates ant_lo -// which is high for (divisor+1) pck0 cycles and low for the same duration -// ant_lo is therefore a 50% duty cycle clock signal with a frequency of -// 12Mhz/(divisor+1) which drives the antenna as well as the ADC clock adc_clk -always @(posedge pck0) -begin - if(pck_divider == divisor[7:0]) - begin - pck_divider <= 8'd0; - ant_lo = !ant_lo; - end - else - begin - pck_divider <= pck_divider + 1; - end -end // this task also runs at pck0 frequency (24Mhz) and is used to serialize // the ADC output which is then clocked into the ARM SSP. -// because ant_lo always transitions when pck_divider = 0 we use the -// pck_divider counter to sync our other signals off it -// we read the ADC value when pck_divider=7 and shift it out on counts 8..15 +// because pck_divclk always transitions when pck_cnt = 0 we use the +// pck_div counter to sync our other signals off it +// we read the ADC value when pck_cnt=7 and shift it out on counts 8..15 always @(posedge pck0) begin - if((pck_divider == 8'd7) && !ant_lo) - to_arm_shiftreg <= adc_d; - else - begin - to_arm_shiftreg[7:1] <= to_arm_shiftreg[6:0]; + if((pck_cnt == 8'd7) && !pck_divclk) + to_arm_shiftreg <= adc_d; + else begin + to_arm_shiftreg[7:1] <= to_arm_shiftreg[6:0]; // simulation showed a glitch occuring due to the LSB of the shifter // not being set as we shift bits out // this ensures the ssp_din remains low after a transfer and suppresses // the glitch that would occur when the last data shifted out ended in // a 1 bit and the next data shifted out started with a 0 bit - to_arm_shiftreg[0] <= 1'b0; + to_arm_shiftreg[0] <= 1'b0; end end @@ -83,11 +52,11 @@ end // ssp_clk |_| |_| |_| |_| |_| |_| |_| |_| |_| |_ // serialized SSP data is gated by ant_lo to suppress unwanted signal -assign ssp_din = to_arm_shiftreg[7] && !ant_lo; +assign ssp_din = to_arm_shiftreg[7] && !pck_divclk; // SSP clock always runs at 24Mhz assign ssp_clk = pck0; // SSP frame is gated by ant_lo and goes high when pck_divider=8..15 -assign ssp_frame = (pck_divider[7:3] == 5'd1) && !ant_lo; +assign ssp_frame = (pck_cnt[7:3] == 5'd1) && !pck_divclk; // unused signals tied low assign pwr_hi = 1'b0; assign pwr_oe1 = 1'b0; @@ -95,9 +64,9 @@ assign pwr_oe2 = 1'b0; assign pwr_oe3 = 1'b0; assign pwr_oe4 = 1'b0; // this is the antenna driver signal -assign pwr_lo = ant_lo; +assign pwr_lo = pck_divclk; // ADC clock out of phase with antenna driver -assign adc_clk = ~ant_lo; +assign adc_clk = ~pck_divclk; // ADC clock also routed to debug pin assign dbg = adc_clk; endmodule diff --git a/fpga/xst.scr b/fpga/xst.scr deleted file mode 100644 index 406bbeee..00000000 --- a/fpga/xst.scr +++ /dev/null @@ -1 +0,0 @@ -run -ifn fpga.v -ifmt Verilog -ofn fpga.ngc -ofmt NGC -p xc2s30-5-vq100 -opt_mode Speed -opt_level 1 -ent fpga diff --git a/fpga/xst_hf.scr b/fpga/xst_hf.scr new file mode 100644 index 00000000..dd2fdc85 --- /dev/null +++ b/fpga/xst_hf.scr @@ -0,0 +1 @@ +run -ifn fpga_hf.v -ifmt Verilog -ofn fpga_hf.ngc -ofmt NGC -p xc2s30-5-vq100 -top fpga_hf -opt_mode area -opt_level 2 -resource_sharing yes -fsm_style bram -fsm_encoding compact diff --git a/fpga/xst_lf.scr b/fpga/xst_lf.scr new file mode 100644 index 00000000..2d6c7e95 --- /dev/null +++ b/fpga/xst_lf.scr @@ -0,0 +1 @@ +run -ifn fpga_lf.v -ifmt Verilog -ofn fpga_lf.ngc -ofmt NGC -p xc2s30-5-vq100 -top fpga_lf -opt_mode area -opt_level 2 -resource_sharing yes -fsm_style bram -fsm_encoding compact diff --git a/include/proxmark3.h b/include/proxmark3.h index ce263ca1..8c9417da 100644 --- a/include/proxmark3.h +++ b/include/proxmark3.h @@ -60,6 +60,10 @@ #define SPI_FPGA_MODE 0 #define SPI_LCD_MODE 1 +#define FPGA_BITSTREAM_ERR 0 +#define FPGA_BITSTREAM_LF 1 +#define FPGA_BITSTREAM_HF 2 + #define TRUE 1 #define FALSE 0 From 62638f87dba4d889dbbee1a88d37a3b8a3d30d78 Mon Sep 17 00:00:00 2001 From: iZsh Date: Fri, 20 Jun 2014 12:29:58 +0200 Subject: [PATCH 3/6] armsrc/fpgaloader.c: forgot the copyright notice --- armsrc/fpgaloader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index 2f996bc5..077b378a 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -1,5 +1,6 @@ //----------------------------------------------------------------------------- // Jonathan Westhues, April 2006 +// iZsh , 2014 // // This code is licensed to you under the terms of the GNU GPL, version 2 or, // at your option, any later version. See the LICENSE.txt file for the text of @@ -8,7 +9,6 @@ // Routines to load the FPGA image, and then to configure the FPGA's major // mode once it is configured. //----------------------------------------------------------------------------- - #include "proxmark3.h" #include "apps.h" #include "util.h" From fa57f6e12e23c7b78d24902926d1122b31cb2c67 Mon Sep 17 00:00:00 2001 From: iZsh Date: Fri, 20 Jun 2014 12:38:58 +0200 Subject: [PATCH 4/6] fpga/fpga_hf.v, fpga_lf.v, lo_edge_detect.v, lo_passthru.v, lo_read.v: copyright notice --- fpga/fpga_hf.v | 1 + fpga/fpga_lf.v | 2 +- fpga/lo_edge_detect.v | 1 + fpga/lo_passthru.v | 1 + fpga/lo_read.v | 1 + 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/fpga/fpga_hf.v b/fpga/fpga_hf.v index ff7c904a..a2100df6 100644 --- a/fpga/fpga_hf.v +++ b/fpga/fpga_hf.v @@ -10,6 +10,7 @@ // // Jonathan Westhues, March 2006 // Added ISO14443-A support by Gerhard de Koning Gans, April 2008 +// iZsh , June 2014 //----------------------------------------------------------------------------- `include "hi_read_tx.v" diff --git a/fpga/fpga_lf.v b/fpga/fpga_lf.v index 8dea68d7..1e20aa90 100644 --- a/fpga/fpga_lf.v +++ b/fpga/fpga_lf.v @@ -9,7 +9,7 @@ // could be improved. // // Jonathan Westhues, March 2006 -// Added ISO14443-A support by Gerhard de Koning Gans, April 2008 +// iZsh , June 2014 //----------------------------------------------------------------------------- `include "lo_read.v" diff --git a/fpga/lo_edge_detect.v b/fpga/lo_edge_detect.v index af600b83..2856e5c6 100644 --- a/fpga/lo_edge_detect.v +++ b/fpga/lo_edge_detect.v @@ -4,6 +4,7 @@ // (because it is so slow). // // Jonathan Westhues, April 2006 +// iZsh , June 2014 //----------------------------------------------------------------------------- module lo_edge_detect( diff --git a/fpga/lo_passthru.v b/fpga/lo_passthru.v index 933728eb..3507f660 100644 --- a/fpga/lo_passthru.v +++ b/fpga/lo_passthru.v @@ -2,6 +2,7 @@ // For reading TI tags, we need to place the FPGA in pass through mode // and pass everything through to the ARM //----------------------------------------------------------------------------- +// iZsh , June 2014 module lo_passthru( input pck_divclk, diff --git a/fpga/lo_read.v b/fpga/lo_read.v index f2d79127..b1fa7fc7 100644 --- a/fpga/lo_read.v +++ b/fpga/lo_read.v @@ -4,6 +4,7 @@ // The A/D samples at that same rate and the result is serialized. // // Jonathan Westhues, April 2006 +// iZsh , June 2014 //----------------------------------------------------------------------------- module lo_read( From b014c96d685962e4d4eea887b211397ba17fbf3d Mon Sep 17 00:00:00 2001 From: iZsh Date: Sat, 21 Jun 2014 21:33:54 +0200 Subject: [PATCH 5/6] new command "lf snoop" to snoop raw ADC values fpga/lo_read.v (lf_field): new argument. fpga/fpga_lf.v: modify accordingly. armsrc/apps.h (FPGA_MAJOR_MODE_LF_READER): Rename as FPGA_MAJOR_MODE_LF_ADC. armsrc/apps.h (FPGA_LF_ADC_READER_FIELD): New LF option. armsrc/lfops.c: Modify accordingly. client/cmdlf.c (CmdLFSnoop): New command. armsrc/appmain.c, armsrc/lfops.c, client/cmdlf.h, include/usb_cmd.h: Modify accordingly. --- armsrc/appmain.c | 6 ++++- armsrc/apps.h | 9 ++++--- armsrc/lfops.c | 60 +++++++++++++++++++++++++++------------------- client/cmdlf.c | 23 ++++++++++++++++++ client/cmdlf.h | 1 + fpga/fpga_lf.bit | Bin 42175 -> 42175 bytes fpga/fpga_lf.v | 2 +- fpga/lo_read.v | 5 ++-- include/usb_cmd.h | 1 + 9 files changed, 75 insertions(+), 32 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index b7bc87e7..8c224b6a 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -215,7 +215,7 @@ void MeasureAntennaTuning(void) */ FpgaDownloadAndGo(FPGA_BITSTREAM_LF); - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); for (i=255; i>19; i--) { WDT_HIT(); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, i); @@ -638,6 +638,10 @@ void UsbPacketReceived(uint8_t *packet, int len) case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K: ModThenAcquireRawAdcSamples125k(c->arg[0],c->arg[1],c->arg[2],c->d.asBytes); break; + case CMD_LF_SNOOP_RAW_ADC_SAMPLES: + SnoopLFRawAdcSamples(c->arg[0], c->arg[1]); + cmd_send(CMD_ACK,0,0,0,0,0); + break; case CMD_HID_DEMOD_FSK: CmdHIDdemodFSK(0, 0, 0, 1); // Demodulate HID tag break; diff --git a/armsrc/apps.h b/armsrc/apps.h index 76d1247a..4c7fa190 100644 --- a/armsrc/apps.h +++ b/armsrc/apps.h @@ -59,7 +59,8 @@ void ToSendStuffBit(int b); void ToSendReset(void); void ListenReaderField(int limit); void AcquireRawAdcSamples125k(int at134khz); -void DoAcquisition125k(void); +void SnoopLFRawAdcSamples(int divisor, int trigger_threshold); +void DoAcquisition125k(int trigger_threshold); extern int ToSendMax; extern uint8_t ToSend[]; extern uint32_t BigBuf[]; @@ -82,8 +83,8 @@ void SetAdcMuxFor(uint32_t whichGpio); #define FPGA_CMD_SET_DIVISOR (2<<12) // Definitions for the FPGA configuration word. // LF -#define FPGA_MAJOR_MODE_LF_READER (0<<5) -#define FPGA_MAJOR_MODE_LF_EDGE_DETECT (1<<5) +#define FPGA_MAJOR_MODE_LF_ADC (0<<5) +#define FPGA_MAJOR_MODE_LF_EDGE_DETECT (1<<5) #define FPGA_MAJOR_MODE_LF_PASSTHRU (2<<5) // HF #define FPGA_MAJOR_MODE_HF_READER_TX (0<<5) @@ -92,6 +93,8 @@ void SetAdcMuxFor(uint32_t whichGpio); #define FPGA_MAJOR_MODE_HF_ISO14443A (3<<5) // BOTH #define FPGA_MAJOR_MODE_OFF (7<<5) +// Options for LF_ADC +#define FPGA_LF_ADC_READER_FIELD (1<<0) // Options for LF_EDGE_DETECT #define FPGA_LF_EDGE_DETECT_READER_FIELD (1<<0) // Options for the HF reader, tx to tag diff --git a/armsrc/lfops.c b/armsrc/lfops.c index a0fa870b..6b131c26 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -15,7 +15,7 @@ #include "crc16.h" #include "string.h" -void AcquireRawAdcSamples125k(int divisor) +void LFSetupFPGAForADC(int divisor, bool lf_field) { FpgaDownloadAndGo(FPGA_BITSTREAM_LF); if ( (divisor == 1) || (divisor < 0) || (divisor > 255) ) @@ -25,23 +25,30 @@ void AcquireRawAdcSamples125k(int divisor) else FpgaSendCommand(FPGA_CMD_SET_DIVISOR, divisor); - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | (lf_field ? FPGA_LF_ADC_READER_FIELD : 0)); // Connect the A/D to the peak-detected low-frequency path. SetAdcMuxFor(GPIO_MUXSEL_LOPKD); - // Give it a bit of time for the resonant antenna to settle. SpinDelay(50); - // Now set up the SSC to get the ADC samples that are now streaming at us. FpgaSetupSsc(); +} - // Now call the acquisition routine - DoAcquisition125k(); +void AcquireRawAdcSamples125k(int divisor) +{ + LFSetupFPGAForADC(divisor, true); + DoAcquisition125k(-1); +} + +void SnoopLFRawAdcSamples(int divisor, int trigger_threshold) +{ + LFSetupFPGAForADC(divisor, false); + DoAcquisition125k(trigger_threshold); } // split into two routines so we can avoid timing issues after sending commands // -void DoAcquisition125k(void) +void DoAcquisition125k(int trigger_threshold) { uint8_t *dest = (uint8_t *)BigBuf; int n = sizeof(BigBuf); @@ -56,9 +63,12 @@ void DoAcquisition125k(void) } if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY) { dest[i] = (uint8_t)AT91C_BASE_SSC->SSC_RHR; - i++; LED_D_OFF(); - if (i >= n) break; + if (trigger_threshold != -1 && dest[i] < trigger_threshold) + continue; + else + trigger_threshold = -1; + if (++i >= n) break; } } Dbprintf("buffer samples: %02x %02x %02x %02x %02x %02x %02x %02x ...", @@ -85,7 +95,7 @@ void ModThenAcquireRawAdcSamples125k(int delay_off, int period_0, int period_1, else FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Give it a bit of time for the resonant antenna to settle. SpinDelay(50); @@ -105,7 +115,7 @@ void ModThenAcquireRawAdcSamples125k(int delay_off, int period_0, int period_1, else FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); LED_D_ON(); if(*(command++) == '0') SpinDelayUs(period_0); @@ -120,10 +130,10 @@ void ModThenAcquireRawAdcSamples125k(int delay_off, int period_0, int period_1, else FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // now do the read - DoAcquisition125k(); + DoAcquisition125k(-1); } /* blank r/w tag data stream @@ -609,7 +619,7 @@ void CmdHIDdemodFSK(int findone, int *high, int *low, int ledcontrol) FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Connect the A/D to the peak-detected low-frequency path. SetAdcMuxFor(GPIO_MUXSEL_LOPKD); @@ -823,7 +833,7 @@ void CmdIOdemodFSK(int findone, int *high, int *low, int ledcontrol) FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Connect the A/D to the peak-detected low-frequency path. SetAdcMuxFor(GPIO_MUXSEL_LOPKD); @@ -1141,7 +1151,7 @@ void T55xxWriteBit(int bit) { FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); if (bit == 0) SpinDelayUs(WRITE_0); else @@ -1157,7 +1167,7 @@ void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMod FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Give it a bit of time for the resonant antenna to settle. // And for the tag to fully power up @@ -1189,7 +1199,7 @@ void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMod // Now perform write (nominal is 5.6 ms for T55x7 and 18ms for E5550, // so wait a little more) FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); SpinDelay(20); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); } @@ -1211,7 +1221,7 @@ void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) LED_D_ON(); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Give it a bit of time for the resonant antenna to settle. // And for the tag to fully power up @@ -1237,7 +1247,7 @@ void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) // Turn field on to read the response FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Now do the acquisition i = 0; @@ -1276,7 +1286,7 @@ void T55xxReadTrace(void){ LED_D_ON(); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Give it a bit of time for the resonant antenna to settle. // And for the tag to fully power up @@ -1292,7 +1302,7 @@ void T55xxReadTrace(void){ // Turn field on to read the response FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Now do the acquisition i = 0; @@ -1983,7 +1993,7 @@ void SendForward(uint8_t fwd_bit_count) { //Field on FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Give it a bit of time for the resonant antenna to settle. // And for the tag to fully power up @@ -1995,7 +2005,7 @@ void SendForward(uint8_t fwd_bit_count) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); // field off SpinDelayUs(55*8); //55 cycles off (8us each)for 4305 FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER);//field on + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);//field on SpinDelayUs(16*8); //16 cycles on (8us each) // now start writting @@ -2007,7 +2017,7 @@ void SendForward(uint8_t fwd_bit_count) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); // field off SpinDelayUs(23*8); //16-4 cycles off (8us each) FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz - FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER);//field on + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);//field on SpinDelayUs(9*8); //16 cycles on (8us each) } } diff --git a/client/cmdlf.c b/client/cmdlf.c index 387e60d5..22aa1e05 100644 --- a/client/cmdlf.c +++ b/client/cmdlf.c @@ -450,6 +450,28 @@ int CmdLFSimManchester(const char *Cmd) return 0; } +int CmdLFSnoop(const char *Cmd) +{ + UsbCommand c = {CMD_LF_SNOOP_RAW_ADC_SAMPLES}; + // 'h' means higher-low-frequency, 134 kHz + c.arg[0] = 0; + c.arg[1] = -1; + if (*Cmd == 0) { + // empty + } else if (*Cmd == 'l') { + sscanf(Cmd, "l %"lli, &c.arg[1]); + } else if(*Cmd == 'h') { + c.arg[0] = 1; + sscanf(Cmd, "h %"lli, &c.arg[1]); + } else if (sscanf(Cmd, "%"lli" %"lli, &c.arg[0], &c.arg[1]) < 1) { + PrintAndLog("use 'snoop' or 'snoop {l,h} [trigger threshold]', or 'snoop [trigger threshold]'"); + return 0; + } + SendCommand(&c); + WaitForResponse(CMD_ACK,NULL); + return 0; +} + int CmdVchDemod(const char *Cmd) { // Is this the entire sync pattern, or does this also include some @@ -540,6 +562,7 @@ static command_t CommandTable[] = {"sim", CmdLFSim, 0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"}, {"simbidir", CmdLFSimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"}, {"simman", CmdLFSimManchester, 0, " [GAP] Simulate arbitrary Manchester LF tag"}, + {"snoop", CmdLFSnoop, 0, "['l'|'h'|] [trigger threshold]-- Snoop LF (l:125khz, h:134khz)"}, {"ti", CmdLFTI, 1, "{ TI RFIDs... }"}, {"hitag", CmdLFHitag, 1, "{ Hitag tags and transponders... }"}, {"vchdemod", CmdVchDemod, 1, "['clone'] -- Demodulate samples for VeriChip"}, diff --git a/client/cmdlf.h b/client/cmdlf.h index 471e4e0c..7278754b 100644 --- a/client/cmdlf.h +++ b/client/cmdlf.h @@ -21,6 +21,7 @@ int CmdLFRead(const char *Cmd); int CmdLFSim(const char *Cmd); int CmdLFSimBidir(const char *Cmd); int CmdLFSimManchester(const char *Cmd); +int CmdLFSnoop(const char *Cmd); int CmdVchDemod(const char *Cmd); #endif diff --git a/fpga/fpga_lf.bit b/fpga/fpga_lf.bit index 133ea9924b546523b0128737e5082cc723406319..d9c7515ea737c6ae3bcddf7d21fc3c9ed2220795 100644 GIT binary patch delta 7464 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 delta 7393 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 diff --git a/fpga/fpga_lf.v b/fpga/fpga_lf.v index 1e20aa90..81976375 100644 --- a/fpga/fpga_lf.v +++ b/fpga/fpga_lf.v @@ -80,7 +80,7 @@ lo_read lr( lr_pwr_lo, lr_pwr_hi, lr_pwr_oe1, lr_pwr_oe2, lr_pwr_oe3, lr_pwr_oe4, adc_d, lr_adc_clk, lr_ssp_frame, lr_ssp_din, lr_ssp_clk, - lr_dbg + lr_dbg, lf_field ); lo_passthru lp( diff --git a/fpga/lo_read.v b/fpga/lo_read.v index b1fa7fc7..a6d077b9 100644 --- a/fpga/lo_read.v +++ b/fpga/lo_read.v @@ -13,7 +13,8 @@ module lo_read( output pwr_oe1, output pwr_oe2, output pwr_oe3, output pwr_oe4, input [7:0] adc_d, output adc_clk, output ssp_frame, output ssp_din, output ssp_clk, - output dbg + output dbg, + input lf_field ); reg [7:0] to_arm_shiftreg; @@ -65,7 +66,7 @@ assign pwr_oe2 = 1'b0; assign pwr_oe3 = 1'b0; assign pwr_oe4 = 1'b0; // this is the antenna driver signal -assign pwr_lo = pck_divclk; +assign pwr_lo = lf_field & pck_divclk; // ADC clock out of phase with antenna driver assign adc_clk = ~pck_divclk; // ADC clock also routed to debug pin diff --git a/include/usb_cmd.h b/include/usb_cmd.h index 9c25555d..4b1fc2b6 100644 --- a/include/usb_cmd.h +++ b/include/usb_cmd.h @@ -96,6 +96,7 @@ typedef struct { #define CMD_ISO_15693_COMMAND_DONE 0x0314 #define CMD_ISO_15693_FIND_AFI 0x0315 #define CMD_ISO_15693_DEBUG 0x0316 +#define CMD_LF_SNOOP_RAW_ADC_SAMPLES 0x0317 // For Hitag2 transponders #define CMD_SNOOP_HITAG 0x0370 From e17437f985b1c955b3a2e3cab4f9146db54631a1 Mon Sep 17 00:00:00 2001 From: ikarus Date: Thu, 26 Jun 2014 10:50:23 +0200 Subject: [PATCH 6/6] Keep the PM3 code repo clean of website/wiki stuff. --- _Sidebar.md | 10 ---------- images/Hirose-connector.png | Bin 32635 -> 0 bytes images/prox3-straight.jpg | Bin 68416 -> 0 bytes images/proxmark3-parts-2.jpg | Bin 37784 -> 0 bytes 4 files changed, 10 deletions(-) delete mode 100644 _Sidebar.md delete mode 100644 images/Hirose-connector.png delete mode 100644 images/prox3-straight.jpg delete mode 100644 images/proxmark3-parts-2.jpg diff --git a/_Sidebar.md b/_Sidebar.md deleted file mode 100644 index fcffb6c0..00000000 --- a/_Sidebar.md +++ /dev/null @@ -1,10 +0,0 @@ -# Proxmark Wiki - * [Home Page](HomePage) - * [Getting Started](GettingStarted) - * [Hardware](Hardware) - * *Software / firmware* - * [Linux (Gentoo)](Gentoo Linux) - * [Windows](Windows) - * *Usage* - * [EM4102 Walk through](EM4102 1.pm3 Walkthrough) - * [Command Reference](commands) \ No newline at end of file diff --git a/images/Hirose-connector.png b/images/Hirose-connector.png deleted file mode 100644 index 4c1690374cbb39bdcf2203b6fd4cfec4adfccf88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32635 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�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

Y}`3{w*OVsDN0$WGI%!I^GyKM0- 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

92VE`g+?ojMoOn1`oegmQD8JbT`W4I5)$%yEDa* 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 NH~zn^g4zCh|9`Z!qWAy+