From 12401d8dbc7639009d90e3a5c8933cbedc2816dc Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Sat, 7 Jun 2014 21:39:52 +0200 Subject: [PATCH 1/4] Added 424KHz mode for iso 15693 simulation --- fpga/hi_simulate.v | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fpga/hi_simulate.v b/fpga/hi_simulate.v index efaf452fa..c04ade80b 100644 --- a/fpga/hi_simulate.v +++ b/fpga/hi_simulate.v @@ -89,7 +89,9 @@ always @(mod_type or ssp_clk or ssp_dout) else if(mod_type == 3'b001) modulating_carrier <= ssp_dout ^ ssp_clk_divider[3]; // XOR means BPSK else if(mod_type == 3'b010) - modulating_carrier <= ssp_dout & ssp_clk_divider[5]; // switch 212kHz subcarrier on/off + modulating_carrier <= ssp_dout & ssp_clk_divider[5]; // switch 212kHz subcarrier on/off + else if(mod_type == 3'b100) + modulating_carrier <= ssp_dout & ssp_clk_divider[4]; // switch 424kHz modulation on/off else modulating_carrier <= 1'b0; // yet unused @@ -105,5 +107,8 @@ assign pwr_oe4 = modulating_carrier; assign pwr_oe3 = 1'b0; assign dbg = after_hysteresis; +//reg dbg; +//always @(ssp_dout) +// dbg <= ssp_dout; endmodule From 83fd67ba0bf3c525f7dd8b3b6ce8137ce644c3ac Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Sat, 7 Jun 2014 21:40:47 +0200 Subject: [PATCH 2/4] Added mode for 424k modulation (iso 15693) --- armsrc/apps.h | 1 + 1 file changed, 1 insertion(+) diff --git a/armsrc/apps.h b/armsrc/apps.h index e21b5ce5e..92228b8db 100644 --- a/armsrc/apps.h +++ b/armsrc/apps.h @@ -100,6 +100,7 @@ void SetAdcMuxFor(uint32_t whichGpio); #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_TAGSIM_LISTEN (1<<0) From 94090295a742e44b9e33e2909ab8b4a823ccec20 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Sat, 7 Jun 2014 21:44:45 +0200 Subject: [PATCH 3/4] new fpga image for better iso15693 simulation --- fpga/fpga.bit | Bin 42172 -> 42172 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fpga/fpga.bit b/fpga/fpga.bit index e773ef9326d66be61c29bc6c169be07d9703a364..e5ea4fcd33b41a65cf776e06d388ebfcad02bff9 100644 GIT binary patch literal 42172 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 ChxqLP literal 42172 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 From e3dc1e4cf50cac8af65b062ab7ce6cf1a01bd5fc Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Sat, 7 Jun 2014 21:49:56 +0200 Subject: [PATCH 4/4] Minor changes in iclass.c --- armsrc/iclass.c | 69 ++++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/armsrc/iclass.c b/armsrc/iclass.c index e876132e7..8d65b523b 100644 --- a/armsrc/iclass.c +++ b/armsrc/iclass.c @@ -1075,6 +1075,12 @@ void SimulateIClass(uint8_t arg0, uint8_t *datain) CodeIClassTagAnswer(response4, sizeof(response4)); memcpy(resp4, ToSend, ToSendMax); resp4Len = ToSendMax; + + // Start from off (no field generated) + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + SpinDelay(200); + + // We need to listen to the high-frequency, peak-detected path. SetAdcMuxFor(GPIO_MUXSEL_HIPKD); FpgaSetupSsc(); @@ -1085,10 +1091,17 @@ void SimulateIClass(uint8_t arg0, uint8_t *datain) LED_A_ON(); for(;;) { LED_B_OFF(); + //Signal tracer + // Can be used to get a trigger for an oscilloscope.. + LED_C_OFF(); + if(!GetIClassCommandFromReader(receivedCmd, &len, 100)) { DbpString("button press"); break; } + //Signal tracer + LED_C_ON(); + // Okay, look at the command now. if(receivedCmd[0] == 0x0a) { @@ -1188,41 +1201,34 @@ void SimulateIClass(uint8_t arg0, uint8_t *datain) static int SendIClassAnswer(uint8_t *resp, int respLen, int delay) { - int i = 0, u = 0, d = 0; + int i = 0, d=0;//, u = 0, d = 0; uint8_t b = 0; - // return 0; - // Modulate Manchester - // FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_TAGSIM_MOD424); - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_TAGSIM_MOD); + + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR|FPGA_HF_SIMULATOR_MODULATE_424K); + AT91C_BASE_SSC->SSC_THR = 0x00; FpgaSetupSsc(); - - // send cycle - for(;;) { - if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { - volatile uint8_t b = (uint8_t)AT91C_BASE_SSC->SSC_RHR; - (void)b; + while(!BUTTON_PRESS()) { + if((AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY)){ + b = AT91C_BASE_SSC->SSC_RHR; (void) b; } - if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { + if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)){ + b = 0x00; if(d < delay) { - b = 0x00; d++; } - else if(i >= respLen) { - b = 0x00; - u++; - } else { - b = resp[i]; - u++; - if(u > 1) { i++; u = 0; } + else { + if( i < respLen){ + b = resp[i]; + //Hack + //b = 0xAC; + } + i++; } AT91C_BASE_SSC->SSC_THR = b; + } - if(u > 4) break; - } - if(BUTTON_PRESS()) { - break; - } + if (i > respLen +4) break; } return 0; @@ -1236,7 +1242,6 @@ static int SendIClassAnswer(uint8_t *resp, int respLen, int delay) static void TransmitIClassCommand(const uint8_t *cmd, int len, int *samples, int *wait) { int c; - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_READER_MOD); AT91C_BASE_SSC->SSC_THR = 0x00; FpgaSetupSsc(); @@ -1312,12 +1317,12 @@ void CodeIClassCommand(const uint8_t * cmd, int len) b = cmd[i]; for(j = 0; j < 4; j++) { for(k = 0; k < 4; k++) { - if(k == (b & 3)) { - ToSend[++ToSendMax] = 0x0f; - } - else { - ToSend[++ToSendMax] = 0x00; - } + if(k == (b & 3)) { + ToSend[++ToSendMax] = 0x0f; + } + else { + ToSend[++ToSendMax] = 0x00; + } } b >>= 2; }