mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 21:03:48 -07:00
tosend into bigbuff
This commit is contained in:
parent
a6c240fe3b
commit
d6f65f8578
2 changed files with 129 additions and 106 deletions
|
@ -729,62 +729,61 @@ void RAMFUNC SniffIso14443a(uint8_t param) {
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
static void CodeIso14443aAsTagPar(const uint8_t *cmd, uint16_t len, uint8_t *par, bool collision) {
|
static void CodeIso14443aAsTagPar(const uint8_t *cmd, uint16_t len, uint8_t *par, bool collision) {
|
||||||
|
|
||||||
//uint8_t localCol = 0;
|
tosend_reset();
|
||||||
ToSendReset();
|
|
||||||
|
tosend_t *ts = get_tosend();
|
||||||
|
|
||||||
// Correction bit, might be removed when not needed
|
// Correction bit, might be removed when not needed
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
ToSendStuffBit(1); // <-----
|
tosend_stuffbit(1); // <-----
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
|
|
||||||
// Send startbit
|
// Send startbit
|
||||||
ToSend[++ToSendMax] = SEC_D;
|
ts->buf[++ts->max] = SEC_D;
|
||||||
LastProxToAirDuration = 8 * ToSendMax - 4;
|
LastProxToAirDuration = 8 * ts->max - 4;
|
||||||
|
|
||||||
for (uint16_t i = 0; i < len; i++) {
|
for (uint16_t i = 0; i < len; i++) {
|
||||||
uint8_t b = cmd[i];
|
uint8_t b = cmd[i];
|
||||||
|
|
||||||
// Data bits
|
// Data bits
|
||||||
for (uint16_t j = 0; j < 8; j++) {
|
for (uint16_t j = 0; j < 8; j++) {
|
||||||
//if (collision && (localCol >= colpos)){
|
|
||||||
if (collision) {
|
if (collision) {
|
||||||
ToSend[++ToSendMax] = SEC_COLL;
|
ts->buf[++ts->max] = SEC_COLL;
|
||||||
//localCol++;
|
|
||||||
} else {
|
} else {
|
||||||
if (b & 1) {
|
if (b & 1) {
|
||||||
ToSend[++ToSendMax] = SEC_D;
|
ts->buf[++ts->max] = SEC_D;
|
||||||
} else {
|
} else {
|
||||||
ToSend[++ToSendMax] = SEC_E;
|
ts->buf[++ts->max] = SEC_E;
|
||||||
}
|
}
|
||||||
b >>= 1;
|
b >>= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (collision) {
|
if (collision) {
|
||||||
ToSend[++ToSendMax] = SEC_COLL;
|
ts->buf[++ts->max] = SEC_COLL;
|
||||||
LastProxToAirDuration = 8 * ToSendMax;
|
LastProxToAirDuration = 8 * ts->max;
|
||||||
} else {
|
} else {
|
||||||
// Get the parity bit
|
// Get the parity bit
|
||||||
if (par[i >> 3] & (0x80 >> (i & 0x0007))) {
|
if (par[i >> 3] & (0x80 >> (i & 0x0007))) {
|
||||||
ToSend[++ToSendMax] = SEC_D;
|
ts->buf[++ts->max] = SEC_D;
|
||||||
LastProxToAirDuration = 8 * ToSendMax - 4;
|
LastProxToAirDuration = 8 * ts->max - 4;
|
||||||
} else {
|
} else {
|
||||||
ToSend[++ToSendMax] = SEC_E;
|
ts->buf[++ts->max] = SEC_E;
|
||||||
LastProxToAirDuration = 8 * ToSendMax;
|
LastProxToAirDuration = 8 * ts->max;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send stopbit
|
// Send stopbit
|
||||||
ToSend[++ToSendMax] = SEC_F;
|
ts->buf[++ts->max] = SEC_F;
|
||||||
|
|
||||||
// Convert from last byte pos to length
|
// Convert from last byte pos to length
|
||||||
ToSendMax++;
|
ts->max++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CodeIso14443aAsTagEx(const uint8_t *cmd, uint16_t len, bool collision) {
|
static void CodeIso14443aAsTagEx(const uint8_t *cmd, uint16_t len, bool collision) {
|
||||||
|
@ -799,37 +798,39 @@ static void CodeIso14443aAsTag(const uint8_t *cmd, uint16_t len) {
|
||||||
static void Code4bitAnswerAsTag(uint8_t cmd) {
|
static void Code4bitAnswerAsTag(uint8_t cmd) {
|
||||||
uint8_t b = cmd;
|
uint8_t b = cmd;
|
||||||
|
|
||||||
ToSendReset();
|
tosend_reset();
|
||||||
|
|
||||||
|
tosend_t *ts = get_tosend();
|
||||||
|
|
||||||
// Correction bit, might be removed when not needed
|
// Correction bit, might be removed when not needed
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
ToSendStuffBit(1); // 1
|
tosend_stuffbit(1); // 1
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
|
|
||||||
// Send startbit
|
// Send startbit
|
||||||
ToSend[++ToSendMax] = SEC_D;
|
ts->buf[++ts->max] = SEC_D;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < 4; i++) {
|
for (uint8_t i = 0; i < 4; i++) {
|
||||||
if (b & 1) {
|
if (b & 1) {
|
||||||
ToSend[++ToSendMax] = SEC_D;
|
ts->buf[++ts->max] = SEC_D;
|
||||||
LastProxToAirDuration = 8 * ToSendMax - 4;
|
LastProxToAirDuration = 8 * ts->max - 4;
|
||||||
} else {
|
} else {
|
||||||
ToSend[++ToSendMax] = SEC_E;
|
ts->buf[++ts->max] = SEC_E;
|
||||||
LastProxToAirDuration = 8 * ToSendMax;
|
LastProxToAirDuration = 8 * ts->max;
|
||||||
}
|
}
|
||||||
b >>= 1;
|
b >>= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send stopbit
|
// Send stopbit
|
||||||
ToSend[++ToSendMax] = SEC_F;
|
ts->buf[++ts->max] = SEC_F;
|
||||||
|
|
||||||
// Convert from last byte pos to length
|
// Convert from last byte pos to length
|
||||||
ToSendMax++;
|
ts->max++;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -887,32 +888,36 @@ bool prepare_tag_modulation(tag_response_info_t *response_info, size_t max_buffe
|
||||||
// Prepare the tag modulation bits from the message
|
// Prepare the tag modulation bits from the message
|
||||||
CodeIso14443aAsTag(response_info->response, response_info->response_n);
|
CodeIso14443aAsTag(response_info->response, response_info->response_n);
|
||||||
|
|
||||||
|
tosend_t *ts = get_tosend();
|
||||||
|
|
||||||
// Make sure we do not exceed the free buffer space
|
// Make sure we do not exceed the free buffer space
|
||||||
if (ToSendMax > max_buffer_size) {
|
if (ts->max > max_buffer_size) {
|
||||||
Dbprintf("ToSend buffer, Out-of-bound, when modulating bits for tag answer:");
|
Dbprintf("ToSend buffer, Out-of-bound, when modulating bits for tag answer:");
|
||||||
Dbhexdump(response_info->response_n, response_info->response, false);
|
Dbhexdump(response_info->response_n, response_info->response, false);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy the byte array, used for this modulation to the buffer position
|
// Copy the byte array, used for this modulation to the buffer position
|
||||||
memcpy(response_info->modulation, ToSend, ToSendMax);
|
memcpy(response_info->modulation, ts->buf, ts->max);
|
||||||
|
|
||||||
// Store the number of bytes that were used for encoding/modulation and the time needed to transfer them
|
// Store the number of bytes that were used for encoding/modulation and the time needed to transfer them
|
||||||
response_info->modulation_n = ToSendMax;
|
response_info->modulation_n = ts->max;
|
||||||
response_info->ProxToAirDuration = LastProxToAirDuration;
|
response_info->ProxToAirDuration = LastProxToAirDuration;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool prepare_allocated_tag_modulation(tag_response_info_t *response_info, uint8_t **buffer, size_t *max_buffer_size) {
|
bool prepare_allocated_tag_modulation(tag_response_info_t *response_info, uint8_t **buffer, size_t *max_buffer_size) {
|
||||||
|
|
||||||
|
tosend_t *ts = get_tosend();
|
||||||
|
|
||||||
// Retrieve and store the current buffer index
|
// Retrieve and store the current buffer index
|
||||||
response_info->modulation = *buffer;
|
response_info->modulation = *buffer;
|
||||||
|
|
||||||
// Forward the prepare tag modulation function to the inner function
|
// Forward the prepare tag modulation function to the inner function
|
||||||
if (prepare_tag_modulation(response_info, *max_buffer_size)) {
|
if (prepare_tag_modulation(response_info, *max_buffer_size)) {
|
||||||
// Update the free buffer offset and the remaining buffer size
|
// Update the free buffer offset and the remaining buffer size
|
||||||
*buffer += ToSendMax;
|
*buffer += ts->max;
|
||||||
*max_buffer_size -= ToSendMax;
|
*max_buffer_size -= ts->max;
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
@ -1638,12 +1643,14 @@ static void PrepareDelayedTransfer(uint16_t delay) {
|
||||||
for (uint16_t i = 0; i < delay; i++)
|
for (uint16_t i = 0; i < delay; i++)
|
||||||
bitmask |= (0x01 << i);
|
bitmask |= (0x01 << i);
|
||||||
|
|
||||||
ToSend[ToSendMax++] = 0x00;
|
tosend_t *ts = get_tosend();
|
||||||
|
|
||||||
for (uint16_t i = 0; i < ToSendMax; i++) {
|
ts->buf[ts->max++] = 0x00;
|
||||||
uint8_t bits_to_shift = ToSend[i] & bitmask;
|
|
||||||
ToSend[i] = ToSend[i] >> delay;
|
for (uint16_t i = 0; i < ts->max; i++) {
|
||||||
ToSend[i] = ToSend[i] | (bits_shifted << (8 - delay));
|
uint8_t bits_to_shift = ts->buf[i] & bitmask;
|
||||||
|
ts->buf[i] = ts->buf[i] >> delay;
|
||||||
|
ts->buf[i] = ts->buf[i] | (bits_shifted << (8 - delay));
|
||||||
bits_shifted = bits_to_shift;
|
bits_shifted = bits_to_shift;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1701,11 +1708,12 @@ static void TransmitFor14443a(const uint8_t *cmd, uint16_t len, uint32_t *timing
|
||||||
static void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8_t *par) {
|
static void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8_t *par) {
|
||||||
int last = 0;
|
int last = 0;
|
||||||
|
|
||||||
ToSendReset();
|
tosend_reset();
|
||||||
|
tosend_t *ts = get_tosend();
|
||||||
|
|
||||||
// Start of Communication (Seq. Z)
|
// Start of Communication (Seq. Z)
|
||||||
ToSend[++ToSendMax] = SEC_Z;
|
ts->buf[++ts->max] = SEC_Z;
|
||||||
LastProxToAirDuration = 8 * (ToSendMax + 1) - 6;
|
LastProxToAirDuration = 8 * (ts->max + 1) - 6;
|
||||||
|
|
||||||
size_t bytecount = nbytes(bits);
|
size_t bytecount = nbytes(bits);
|
||||||
// Generate send structure for the data bits
|
// Generate send structure for the data bits
|
||||||
|
@ -1717,17 +1725,17 @@ static void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, cons
|
||||||
for (j = 0; j < bitsleft; j++) {
|
for (j = 0; j < bitsleft; j++) {
|
||||||
if (b & 1) {
|
if (b & 1) {
|
||||||
// Sequence X
|
// Sequence X
|
||||||
ToSend[++ToSendMax] = SEC_X;
|
ts->buf[++ts->max] = SEC_X;
|
||||||
LastProxToAirDuration = 8 * (ToSendMax + 1) - 2;
|
LastProxToAirDuration = 8 * (ts->max + 1) - 2;
|
||||||
last = 1;
|
last = 1;
|
||||||
} else {
|
} else {
|
||||||
if (last == 0) {
|
if (last == 0) {
|
||||||
// Sequence Z
|
// Sequence Z
|
||||||
ToSend[++ToSendMax] = SEC_Z;
|
ts->buf[++ts->max] = SEC_Z;
|
||||||
LastProxToAirDuration = 8 * (ToSendMax + 1) - 6;
|
LastProxToAirDuration = 8 * (ts->max + 1) - 6;
|
||||||
} else {
|
} else {
|
||||||
// Sequence Y
|
// Sequence Y
|
||||||
ToSend[++ToSendMax] = SEC_Y;
|
ts->buf[++ts->max] = SEC_Y;
|
||||||
last = 0;
|
last = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1739,17 +1747,17 @@ static void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, cons
|
||||||
// Get the parity bit
|
// Get the parity bit
|
||||||
if (par[i >> 3] & (0x80 >> (i & 0x0007))) {
|
if (par[i >> 3] & (0x80 >> (i & 0x0007))) {
|
||||||
// Sequence X
|
// Sequence X
|
||||||
ToSend[++ToSendMax] = SEC_X;
|
ts->buf[++ts->max] = SEC_X;
|
||||||
LastProxToAirDuration = 8 * (ToSendMax + 1) - 2;
|
LastProxToAirDuration = 8 * (ts->max + 1) - 2;
|
||||||
last = 1;
|
last = 1;
|
||||||
} else {
|
} else {
|
||||||
if (last == 0) {
|
if (last == 0) {
|
||||||
// Sequence Z
|
// Sequence Z
|
||||||
ToSend[++ToSendMax] = SEC_Z;
|
ts->buf[++ts->max] = SEC_Z;
|
||||||
LastProxToAirDuration = 8 * (ToSendMax + 1) - 6;
|
LastProxToAirDuration = 8 * (ts->max + 1) - 6;
|
||||||
} else {
|
} else {
|
||||||
// Sequence Y
|
// Sequence Y
|
||||||
ToSend[++ToSendMax] = SEC_Y;
|
ts->buf[++ts->max] = SEC_Y;
|
||||||
last = 0;
|
last = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1759,16 +1767,16 @@ static void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, cons
|
||||||
// End of Communication: Logic 0 followed by Sequence Y
|
// End of Communication: Logic 0 followed by Sequence Y
|
||||||
if (last == 0) {
|
if (last == 0) {
|
||||||
// Sequence Z
|
// Sequence Z
|
||||||
ToSend[++ToSendMax] = SEC_Z;
|
ts->buf[++ts->max] = SEC_Z;
|
||||||
LastProxToAirDuration = 8 * (ToSendMax + 1) - 6;
|
LastProxToAirDuration = 8 * (ts->max + 1) - 6;
|
||||||
} else {
|
} else {
|
||||||
// Sequence Y
|
// Sequence Y
|
||||||
ToSend[++ToSendMax] = SEC_Y;
|
ts->buf[++ts->max] = SEC_Y;
|
||||||
}
|
}
|
||||||
ToSend[++ToSendMax] = SEC_Y;
|
ts->buf[++ts->max] = SEC_Y;
|
||||||
|
|
||||||
// Convert to length of command:
|
// Convert to length of command:
|
||||||
ToSendMax++;
|
ts->max++;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -1970,7 +1978,8 @@ int EmSendCmd14443aRaw(uint8_t *resp, uint16_t respLen) {
|
||||||
|
|
||||||
int EmSend4bit(uint8_t resp) {
|
int EmSend4bit(uint8_t resp) {
|
||||||
Code4bitAnswerAsTag(resp);
|
Code4bitAnswerAsTag(resp);
|
||||||
int res = EmSendCmd14443aRaw(ToSend, ToSendMax);
|
tosend_t *ts = get_tosend();
|
||||||
|
int res = EmSendCmd14443aRaw(ts->buf, ts->max);
|
||||||
// do the tracing for the previous reader request and this tag answer:
|
// do the tracing for the previous reader request and this tag answer:
|
||||||
uint8_t par[1] = {0x00};
|
uint8_t par[1] = {0x00};
|
||||||
GetParity(&resp, 1, par);
|
GetParity(&resp, 1, par);
|
||||||
|
@ -1991,7 +2000,9 @@ int EmSendCmdPar(uint8_t *resp, uint16_t respLen, uint8_t *par) {
|
||||||
}
|
}
|
||||||
int EmSendCmdParEx(uint8_t *resp, uint16_t respLen, uint8_t *par, bool collision) {
|
int EmSendCmdParEx(uint8_t *resp, uint16_t respLen, uint8_t *par, bool collision) {
|
||||||
CodeIso14443aAsTagPar(resp, respLen, par, collision);
|
CodeIso14443aAsTagPar(resp, respLen, par, collision);
|
||||||
int res = EmSendCmd14443aRaw(ToSend, ToSendMax);
|
tosend_t *ts = get_tosend();
|
||||||
|
int res = EmSendCmd14443aRaw(ts->buf, ts->max);
|
||||||
|
|
||||||
// do the tracing for the previous reader request and this tag answer:
|
// do the tracing for the previous reader request and this tag answer:
|
||||||
EmLogTrace(Uart.output,
|
EmLogTrace(Uart.output,
|
||||||
Uart.len,
|
Uart.len,
|
||||||
|
@ -2152,7 +2163,8 @@ void ReaderTransmitBitsPar(uint8_t *frame, uint16_t bits, uint8_t *par, uint32_t
|
||||||
|
|
||||||
CodeIso14443aBitsAsReaderPar(frame, bits, par);
|
CodeIso14443aBitsAsReaderPar(frame, bits, par);
|
||||||
// Send command to tag
|
// Send command to tag
|
||||||
TransmitFor14443a(ToSend, ToSendMax, timing);
|
tosend_t *ts = get_tosend();
|
||||||
|
TransmitFor14443a(ts->buf, ts->max, timing);
|
||||||
if (g_trigger) LED_A_ON();
|
if (g_trigger) LED_A_ON();
|
||||||
|
|
||||||
LogTrace(frame, nbytes(bits), (LastTimeProxToAirStart << 4) + DELAY_ARM2AIR_AS_READER, ((LastTimeProxToAirStart + LastProxToAirDuration) << 4) + DELAY_ARM2AIR_AS_READER, par, true);
|
LogTrace(frame, nbytes(bits), (LastTimeProxToAirStart << 4) + DELAY_ARM2AIR_AS_READER, ((LastTimeProxToAirStart + LastProxToAirDuration) << 4) + DELAY_ARM2AIR_AS_READER, par, true);
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 4sample
|
// 4sample
|
||||||
#define SEND4STUFFBIT(x) ToSendStuffBit(x);ToSendStuffBit(x);ToSendStuffBit(x);ToSendStuffBit(x);
|
#define SEND4STUFFBIT(x) tosend_stuffbit(x);tosend_stuffbit(x);tosend_stuffbit(x);tosend_stuffbit(x);
|
||||||
|
|
||||||
static void iso14b_set_timeout(uint32_t timeout);
|
static void iso14b_set_timeout(uint32_t timeout);
|
||||||
static void iso14b_set_maxframesize(uint16_t size);
|
static void iso14b_set_maxframesize(uint16_t size);
|
||||||
|
@ -140,7 +140,7 @@ static uint32_t iso14b_timeout = TR0;
|
||||||
static void CodeIso14443bAsTag(const uint8_t *cmd, int len) {
|
static void CodeIso14443bAsTag(const uint8_t *cmd, int len) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ToSendReset();
|
tosend_reset();
|
||||||
|
|
||||||
// Transmit a burst of ones, as the initial thing that lets the
|
// Transmit a burst of ones, as the initial thing that lets the
|
||||||
// reader get phase sync.
|
// reader get phase sync.
|
||||||
|
@ -199,8 +199,9 @@ static void CodeIso14443bAsTag(const uint8_t *cmd, int len) {
|
||||||
SEND4STUFFBIT(1);
|
SEND4STUFFBIT(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tosend_t *ts = get_tosend();
|
||||||
// Convert from last byte pos to length
|
// Convert from last byte pos to length
|
||||||
ToSendMax++;
|
ts->max++;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -543,24 +544,32 @@ void SimulateIso14443bTag(uint32_t pupi) {
|
||||||
uint16_t len, cmdsReceived = 0;
|
uint16_t len, cmdsReceived = 0;
|
||||||
int cardSTATE = SIM_NOFIELD;
|
int cardSTATE = SIM_NOFIELD;
|
||||||
int vHf = 0; // in mV
|
int vHf = 0; // in mV
|
||||||
|
|
||||||
|
tosend_t *ts = get_tosend();
|
||||||
|
|
||||||
uint8_t *receivedCmd = BigBuf_malloc(MAX_FRAME_SIZE);
|
uint8_t *receivedCmd = BigBuf_malloc(MAX_FRAME_SIZE);
|
||||||
|
|
||||||
// prepare "ATQB" tag answer (encoded):
|
// prepare "ATQB" tag answer (encoded):
|
||||||
CodeIso14443bAsTag(respATQB, sizeof(respATQB));
|
CodeIso14443bAsTag(respATQB, sizeof(respATQB));
|
||||||
uint8_t *encodedATQB = BigBuf_malloc(ToSendMax);
|
uint8_t *encodedATQB = BigBuf_malloc(ts->max);
|
||||||
uint16_t encodedATQBLen = ToSendMax;
|
uint16_t encodedATQBLen = ts->max;
|
||||||
memcpy(encodedATQB, ToSend, ToSendMax);
|
memcpy(encodedATQB, ts->buf, ts->max);
|
||||||
|
|
||||||
|
|
||||||
// prepare "OK" tag answer (encoded):
|
// prepare "OK" tag answer (encoded):
|
||||||
CodeIso14443bAsTag(respOK, sizeof(respOK));
|
CodeIso14443bAsTag(respOK, sizeof(respOK));
|
||||||
uint8_t *encodedOK = BigBuf_malloc(ToSendMax);
|
uint8_t *encodedOK = BigBuf_malloc(ts->max);
|
||||||
uint16_t encodedOKLen = ToSendMax;
|
uint16_t encodedOKLen = ts->max;
|
||||||
memcpy(encodedOK, ToSend, ToSendMax);
|
memcpy(encodedOK, ts->buf, ts->max);
|
||||||
|
|
||||||
// Simulation loop
|
// Simulation loop
|
||||||
while (!BUTTON_PRESS() && !data_available()) {
|
while (BUTTON_PRESS() == false) {
|
||||||
WDT_HIT();
|
WDT_HIT();
|
||||||
|
|
||||||
|
//iceman: limit with 2000 times..
|
||||||
|
if (data_available()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// find reader field
|
// find reader field
|
||||||
if (cardSTATE == SIM_NOFIELD) {
|
if (cardSTATE == SIM_NOFIELD) {
|
||||||
|
@ -669,7 +678,7 @@ void SimulateIso14443bTag(uint32_t pupi) {
|
||||||
if (DBGLEVEL >= DBG_DEBUG)
|
if (DBGLEVEL >= DBG_DEBUG)
|
||||||
Dbprintf("Emulator stopped. Trace length: %d ", BigBuf_get_traceLen());
|
Dbprintf("Emulator stopped. Trace length: %d ", BigBuf_get_traceLen());
|
||||||
|
|
||||||
switch_off(); //simulate
|
switch_off(); //simulate
|
||||||
}
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
@ -967,9 +976,10 @@ static void TransmitFor14443b_AsReader(void) {
|
||||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD);
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD);
|
||||||
|
|
||||||
LED_B_ON();
|
LED_B_ON();
|
||||||
|
tosend_t *ts = get_tosend();
|
||||||
for (int c = 0; c < ToSendMax; c++) {
|
|
||||||
uint8_t data = ToSend[c];
|
for (int c = 0; c < ts->max; c++) {
|
||||||
|
uint8_t data = ts->buf[c];
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
uint16_t send_word = (data & 0x80) ? 0x0000 : 0xffff;
|
uint16_t send_word = (data & 0x80) ? 0x0000 : 0xffff;
|
||||||
|
|
||||||
|
@ -1006,48 +1016,48 @@ static void CodeIso14443bAsReader(const uint8_t *cmd, int len) {
|
||||||
* 1 "stuffbit" = 1ETU (9us)
|
* 1 "stuffbit" = 1ETU (9us)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ToSendReset();
|
tosend_reset();
|
||||||
|
|
||||||
// Send SOF
|
// Send SOF
|
||||||
// 10-11 ETUs of ZERO
|
// 10-11 ETUs of ZERO
|
||||||
for (int i = 0; i < 10; i++)
|
for (int i = 0; i < 10; i++)
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
|
|
||||||
|
|
||||||
// 2-3 ETUs of ONE
|
// 2-3 ETUs of ONE
|
||||||
ToSendStuffBit(1);
|
tosend_stuffbit(1);
|
||||||
ToSendStuffBit(1);
|
tosend_stuffbit(1);
|
||||||
|
|
||||||
// Sending cmd, LSB
|
// Sending cmd, LSB
|
||||||
// from here we add BITS
|
// from here we add BITS
|
||||||
for (int i = 0; i < len; i++) {
|
for (int i = 0; i < len; i++) {
|
||||||
// Start bit
|
// Start bit
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
// Data bits
|
// Data bits
|
||||||
uint8_t b = cmd[i];
|
uint8_t b = cmd[i];
|
||||||
|
|
||||||
ToSendStuffBit(b & 1);
|
tosend_stuffbit(b & 1);
|
||||||
ToSendStuffBit((b >> 1) & 1);
|
tosend_stuffbit((b >> 1) & 1);
|
||||||
ToSendStuffBit((b >> 2) & 1);
|
tosend_stuffbit((b >> 2) & 1);
|
||||||
ToSendStuffBit((b >> 3) & 1);
|
tosend_stuffbit((b >> 3) & 1);
|
||||||
ToSendStuffBit((b >> 4) & 1);
|
tosend_stuffbit((b >> 4) & 1);
|
||||||
ToSendStuffBit((b >> 5) & 1);
|
tosend_stuffbit((b >> 5) & 1);
|
||||||
ToSendStuffBit((b >> 6) & 1);
|
tosend_stuffbit((b >> 6) & 1);
|
||||||
ToSendStuffBit((b >> 7) & 1);
|
tosend_stuffbit((b >> 7) & 1);
|
||||||
|
|
||||||
// Stop bit
|
// Stop bit
|
||||||
ToSendStuffBit(1);
|
tosend_stuffbit(1);
|
||||||
// EGT extra guard time
|
// EGT extra guard time
|
||||||
// For PCD it ranges 0-57us (1etu = 9us)
|
// For PCD it ranges 0-57us (1etu = 9us)
|
||||||
// ToSendStuffBit(1);
|
// tosend_stuffbit(1);
|
||||||
// ToSendStuffBit(1);
|
// tosend_stuffbit(1);
|
||||||
// ToSendStuffBit(1);
|
// tosend_stuffbit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send EOF
|
// Send EOF
|
||||||
// 10-11 ETUs of ZERO
|
// 10-11 ETUs of ZERO
|
||||||
for (int i = 0; i < 10; i++)
|
for (int i = 0; i < 10; i++)
|
||||||
ToSendStuffBit(0);
|
tosend_stuffbit(0);
|
||||||
|
|
||||||
// Transition time. TR0 - guard time
|
// Transition time. TR0 - guard time
|
||||||
// 8ETUS minum?
|
// 8ETUS minum?
|
||||||
|
@ -1056,11 +1066,12 @@ static void CodeIso14443bAsReader(const uint8_t *cmd, int len) {
|
||||||
|
|
||||||
// ensure that last byte is filled up
|
// ensure that last byte is filled up
|
||||||
for (int i = 0; i < 8 ; ++i)
|
for (int i = 0; i < 8 ; ++i)
|
||||||
ToSendStuffBit(1);
|
tosend_stuffbit(1);
|
||||||
|
|
||||||
// TR1 - Synchronization time
|
// TR1 - Synchronization time
|
||||||
// Convert from last character reference to length
|
// Convert from last character reference to length
|
||||||
ToSendMax++;
|
tosend_t *ts = get_tosend();
|
||||||
|
ts->max++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue