mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-14 18:48:13 -07:00
chg: iclass fixes. better timings, to get 280us vs 330us (default) time before card response.
This commit is contained in:
parent
501182ca06
commit
03867018f1
1 changed files with 40 additions and 17 deletions
|
@ -55,7 +55,13 @@
|
|||
#include "protocols.h"
|
||||
#include "ticks.h"
|
||||
|
||||
static int timeout = 4096;
|
||||
static int g_wait = 300;
|
||||
static int timeout = 2900;
|
||||
static uint32_t time_rdr = 0;
|
||||
static uint32_t time_delta = 0;
|
||||
static uint32_t time_delta_wait = 0;
|
||||
static uint32_t time_response = 0;
|
||||
|
||||
static int SendIClassAnswer(uint8_t *resp, int respLen, uint16_t delay);
|
||||
int doIClassSimulation(int simulationMode, uint8_t *reader_mac_buf);
|
||||
|
||||
|
@ -151,7 +157,7 @@ typedef struct {
|
|||
static tUartIc Uart;
|
||||
|
||||
static void OnError(uint8_t reason) {
|
||||
reply_old(CMD_ACK, 0, reason, 0, 0, 0);
|
||||
reply_mix(CMD_ACK, 0, reason, 0, 0, 0);
|
||||
switch_off();
|
||||
}
|
||||
|
||||
|
@ -160,10 +166,12 @@ static void uart_reset(void) {
|
|||
Uart.synced = false;
|
||||
Uart.frame = false;
|
||||
}
|
||||
|
||||
static void uart_init(uint8_t *data) {
|
||||
Uart.buf = data;
|
||||
uart_reset();
|
||||
}
|
||||
|
||||
static void uart_bit(uint8_t bit) {
|
||||
static uint8_t buf = 0xff;
|
||||
static uint8_t n_buf;
|
||||
|
@ -1427,7 +1435,6 @@ int doIClassSimulation(int simulationMode, uint8_t *reader_mac_buf) {
|
|||
uint32_t time_0 = GetCountSspClk();
|
||||
uint32_t t2r_stime = 0, t2r_etime = 0;
|
||||
uint32_t r2t_stime, r2t_etime = 0;
|
||||
|
||||
LED_A_ON();
|
||||
bool buttonPressed = false;
|
||||
|
||||
|
@ -1717,6 +1724,8 @@ static void TransmitIClassCommand(const uint8_t *cmd, int len, int *samples, int
|
|||
bool firstpart = true;
|
||||
uint8_t sendbyte;
|
||||
|
||||
time_rdr = 0;
|
||||
|
||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_READER_MOD);
|
||||
AT91C_BASE_SSC->SSC_THR = 0x00;
|
||||
|
||||
|
@ -1755,6 +1764,8 @@ static void TransmitIClassCommand(const uint8_t *cmd, int len, int *samples, int
|
|||
}
|
||||
}
|
||||
|
||||
time_rdr = GetCountSspClk();
|
||||
|
||||
if (samples) {
|
||||
if (wait)
|
||||
*samples = (c + *wait) << 3;
|
||||
|
@ -1827,7 +1838,7 @@ void ReaderTransmitIClass(uint8_t *frame, int len) {
|
|||
// If a response is captured return TRUE
|
||||
// If it takes too long return FALSE
|
||||
//-----------------------------------------------------------------------------
|
||||
static int GetIClassAnswer(uint8_t *receivedResponse, int maxLen, int *samples, int *elapsed) {
|
||||
static int GetIClassAnswer(uint8_t *receivedResponse, int maxLen, int *samples, int *wait) {
|
||||
// buffer needs to be 512 bytes
|
||||
// maxLen is not used...
|
||||
|
||||
|
@ -1837,13 +1848,16 @@ static int GetIClassAnswer(uint8_t *receivedResponse, int maxLen, int *samples,
|
|||
// Setup UART/DEMOD to receive
|
||||
DemodIcInit(receivedResponse);
|
||||
|
||||
if (elapsed) *elapsed = 0;
|
||||
|
||||
// Set FPGA mode to "reader listen mode", no modulation (listen
|
||||
// only, since we are receiving, not transmitting).
|
||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_READER_LISTEN);
|
||||
SpinDelayUs(320); //310 Tout= 330us (iso15603-2) (330/21.3) take consideration for clock increments.
|
||||
|
||||
time_delta = GetCountSspClk() - time_rdr;
|
||||
|
||||
SpinDelayUs(g_wait); //310 Tout= 330us (iso15603-2) (330/21.3) take consideration for clock increments.
|
||||
time_delta_wait = GetCountSspClk() - time_rdr - time_delta;
|
||||
|
||||
uint32_t foo = GetCountSspClk();
|
||||
// clear RXRDY:
|
||||
uint8_t b = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
|
||||
(void)b;
|
||||
|
@ -1861,15 +1875,16 @@ static int GetIClassAnswer(uint8_t *receivedResponse, int maxLen, int *samples,
|
|||
}
|
||||
|
||||
// keep tx buffer in a defined state anyway.
|
||||
/*
|
||||
if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
|
||||
AT91C_BASE_SSC->SSC_THR = 0x00;
|
||||
// To make use of exact timing of next command from reader!!
|
||||
if (elapsed)(*elapsed)++;
|
||||
}
|
||||
|
||||
*/
|
||||
// Wait for byte be become available in rx holding register
|
||||
if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
|
||||
if (c >= timeout) return false;
|
||||
|
||||
if ( GetCountSspClk() - foo > timeout) return false;
|
||||
// if (c >= timeout) return false;
|
||||
|
||||
c++;
|
||||
|
||||
|
@ -1881,25 +1896,28 @@ static int GetIClassAnswer(uint8_t *receivedResponse, int maxLen, int *samples,
|
|||
if (ManchesterDecoding_iclass(b & 0x0f)) {
|
||||
if (samples)
|
||||
*samples = c << 3;
|
||||
|
||||
time_response = GetCountSspClk() - foo;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int ReaderReceiveIClass(uint8_t *receivedAnswer) {
|
||||
int samples = 0;
|
||||
|
||||
if (!GetIClassAnswer(receivedAnswer, 0, &samples, NULL))
|
||||
return false;
|
||||
if (GetIClassAnswer(receivedAnswer, 0, &samples, NULL) == false)
|
||||
return 0;
|
||||
|
||||
rsamples += samples;
|
||||
|
||||
LogTrace(receivedAnswer, Demod.len, rsamples, rsamples, NULL, false);
|
||||
|
||||
if (samples == 0)
|
||||
return false;
|
||||
return 0;
|
||||
|
||||
return Demod.len;
|
||||
}
|
||||
|
@ -1924,7 +1942,7 @@ void setupIclassReader() {
|
|||
// Now give it time to spin up.
|
||||
// Signal field is on with the appropriate LED
|
||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_READER_MOD);
|
||||
SpinDelay(300);
|
||||
SpinDelay(500);
|
||||
|
||||
StartCountSspClk();
|
||||
|
||||
|
@ -1936,13 +1954,20 @@ bool sendCmdGetResponseWithRetries(uint8_t *command, size_t cmdsize, uint8_t *re
|
|||
|
||||
ReaderTransmitIClass(command, cmdsize);
|
||||
|
||||
|
||||
//iceman - if received size is bigger than expected, we smash the stack here
|
||||
// since its called with fixed sized arrays
|
||||
|
||||
// update/write commadn takes 4ms to 15ms before responding
|
||||
if ( command[0] == ICLASS_CMD_UPDATE )
|
||||
g_wait = 15000;
|
||||
|
||||
uint8_t got_n = ReaderReceiveIClass(resp);
|
||||
|
||||
// 0xBB is the internal debug separator byte..
|
||||
if (expected_size != got_n || (resp[0] == 0xBB || resp[7] == 0xBB || resp[2] == 0xBB)) {
|
||||
//try again
|
||||
SpinDelayUs(400);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -2396,8 +2421,6 @@ void iClass_Authentication_fast(uint64_t arg0, uint64_t arg1, uint8_t *datain) {
|
|||
if (isOK)
|
||||
goto out;
|
||||
|
||||
SpinDelayUs(400); //iClass (iso15693-2) should timeout after 330us.
|
||||
|
||||
// Auth Sequence MUST begin with reading e-purse. (block2)
|
||||
// Card selected, now read e-purse (cc) (block2) (only 8 bytes no CRC)
|
||||
ReaderTransmitIClass(readcheck_cc, sizeof(readcheck_cc));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue