mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 13:00:42 -07:00
iso15 sniff: improve iso15 FSK decoding (ARM part)
This commit is contained in:
parent
b2c5a52fd7
commit
3e784557fc
1 changed files with 187 additions and 144 deletions
|
@ -1280,21 +1280,22 @@ void AcquireRawAdcSamplesIso15693(void) {
|
||||||
|
|
||||||
typedef struct DecodeTagFSK {
|
typedef struct DecodeTagFSK {
|
||||||
enum {
|
enum {
|
||||||
|
STATE_FSK_ERROR,
|
||||||
STATE_FSK_BEFORE_SOF,
|
STATE_FSK_BEFORE_SOF,
|
||||||
STATE_FSK_SOF_484,
|
STATE_FSK_SOF_484,
|
||||||
STATE_FSK_SOF_424,
|
STATE_FSK_SOF_424,
|
||||||
STATE_FSK_SOF_END,
|
STATE_FSK_SOF_END_484,
|
||||||
|
STATE_FSK_SOF_END_424,
|
||||||
STATE_FSK_RECEIVING_DATA_484,
|
STATE_FSK_RECEIVING_DATA_484,
|
||||||
STATE_FSK_RECEIVING_DATA_424,
|
STATE_FSK_RECEIVING_DATA_424,
|
||||||
STATE_FSK_EOF,
|
STATE_FSK_EOF
|
||||||
STATE_FSK_ERROR
|
|
||||||
} state;
|
} state;
|
||||||
enum {
|
enum {
|
||||||
LOGIC0_PART1,
|
LOGIC0_PART1,
|
||||||
LOGIC1_PART1,
|
LOGIC1_PART1,
|
||||||
LOGIC0_PART2,
|
LOGIC0_PART2,
|
||||||
LOGIC1_PART2,
|
LOGIC1_PART2,
|
||||||
SOF
|
SOF
|
||||||
} lastBit;
|
} lastBit;
|
||||||
uint8_t count;
|
uint8_t count;
|
||||||
uint8_t bitCount;
|
uint8_t bitCount;
|
||||||
|
@ -1309,7 +1310,6 @@ static void DecodeTagFSKReset(DecodeTagFSK_t *DecodeTag) {
|
||||||
DecodeTag->bitCount = 0;
|
DecodeTag->bitCount = 0;
|
||||||
DecodeTag->len = 0;
|
DecodeTag->len = 0;
|
||||||
DecodeTag->shiftReg = 0;
|
DecodeTag->shiftReg = 0;
|
||||||
DbpString("FSK tag reset");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DecodeTagFSKInit(DecodeTagFSK_t *DecodeTag, uint8_t *data, uint16_t max_len) {
|
static void DecodeTagFSKInit(DecodeTagFSK_t *DecodeTag, uint8_t *data, uint16_t max_len) {
|
||||||
|
@ -1320,7 +1320,7 @@ static void DecodeTagFSKInit(DecodeTagFSK_t *DecodeTag, uint8_t *data, uint16_t
|
||||||
|
|
||||||
// Performances of this function are crutial for stability
|
// Performances of this function are crutial for stability
|
||||||
// as it is called in real time for every samples
|
// as it is called in real time for every samples
|
||||||
static int RAMFUNC Handle15693FSKSamplesFromTag(uint8_t freq, DecodeTagFSK_t *DecodeTag, bool recv_speed, int samples)
|
static int RAMFUNC Handle15693FSKSamplesFromTag(uint8_t freq, DecodeTagFSK_t *DecodeTag, bool recv_speed)
|
||||||
{
|
{
|
||||||
switch(DecodeTag->state) {
|
switch(DecodeTag->state) {
|
||||||
case STATE_FSK_BEFORE_SOF:
|
case STATE_FSK_BEFORE_SOF:
|
||||||
|
@ -1334,16 +1334,15 @@ static int RAMFUNC Handle15693FSKSamplesFromTag(uint8_t freq, DecodeTagFSK_t *De
|
||||||
|
|
||||||
case STATE_FSK_SOF_484:
|
case STATE_FSK_SOF_484:
|
||||||
//DbpString("STATE_FSK_SOF_484");
|
//DbpString("STATE_FSK_SOF_484");
|
||||||
|
if (FREQ_IS_424(freq) && SEOF_COUNT(DecodeTag->count, recv_speed))
|
||||||
if (FREQ_IS_484(freq) && !MAX_COUNT(DecodeTag->count, recv_speed)) // still in SOF at 484
|
|
||||||
{
|
|
||||||
DecodeTag->count++;
|
|
||||||
}
|
|
||||||
else if (FREQ_IS_424(freq) && SEOF_COUNT(DecodeTag->count, recv_speed))
|
|
||||||
{ // SOF part1 continue at 424
|
{ // SOF part1 continue at 424
|
||||||
DecodeTag->state = STATE_FSK_SOF_424;
|
DecodeTag->state = STATE_FSK_SOF_424;
|
||||||
DecodeTag->count = 1;
|
DecodeTag->count = 1;
|
||||||
}
|
}
|
||||||
|
else if (FREQ_IS_484(freq) && !MAX_COUNT(DecodeTag->count, recv_speed)) // still in SOF at 484
|
||||||
|
{
|
||||||
|
DecodeTag->count++;
|
||||||
|
}
|
||||||
else // SOF failed, roll back
|
else // SOF failed, roll back
|
||||||
{
|
{
|
||||||
DecodeTag->state = STATE_FSK_BEFORE_SOF;
|
DecodeTag->state = STATE_FSK_BEFORE_SOF;
|
||||||
|
@ -1352,103 +1351,136 @@ static int RAMFUNC Handle15693FSKSamplesFromTag(uint8_t freq, DecodeTagFSK_t *De
|
||||||
|
|
||||||
case STATE_FSK_SOF_424:
|
case STATE_FSK_SOF_424:
|
||||||
//DbpString("STATE_FSK_SOF_424");
|
//DbpString("STATE_FSK_SOF_424");
|
||||||
|
if (FREQ_IS_484(freq) && SEOF_COUNT(DecodeTag->count, recv_speed))
|
||||||
if (FREQ_IS_424(freq) && !MAX_COUNT(DecodeTag->count, recv_speed)) // still in SOF at 424
|
|
||||||
DecodeTag->count++;
|
|
||||||
else if (FREQ_IS_484(freq) && SEOF_COUNT(DecodeTag->count, recv_speed))
|
|
||||||
{ // SOF part 1 finished
|
{ // SOF part 1 finished
|
||||||
DecodeTag->state = STATE_FSK_SOF_END;
|
DecodeTag->state = STATE_FSK_SOF_END_484;
|
||||||
DecodeTag->count = 1;
|
DecodeTag->count = 1;
|
||||||
}
|
}
|
||||||
|
else if (FREQ_IS_424(freq) && !MAX_COUNT(DecodeTag->count, recv_speed)) // still in SOF at 424
|
||||||
|
DecodeTag->count++;
|
||||||
else // SOF failed, roll back
|
else // SOF failed, roll back
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
Dbprintf("SOF_424 failed: freq=%d, count=%d, recv_speed=%d", freq, DecodeTag->count, recv_speed);
|
Dbprintf("SOF_424 failed: freq=%d, count=%d, recv_speed=%d", freq, DecodeTag->count, recv_speed);
|
||||||
|
#endif
|
||||||
DecodeTag->state = STATE_FSK_BEFORE_SOF;
|
DecodeTag->state = STATE_FSK_BEFORE_SOF;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STATE_FSK_SOF_END:
|
case STATE_FSK_SOF_END_484:
|
||||||
if (FREQ_IS_484(freq) && !MAX_COUNT(DecodeTag->count, recv_speed)) // still in SOF_END (484)
|
if (FREQ_IS_424(freq) && LOGIC_COUNT(DecodeTag->count, recv_speed))
|
||||||
DecodeTag->count++;
|
{
|
||||||
else if (FREQ_IS_424(freq) && LOGIC_COUNT(DecodeTag->count, recv_speed))
|
DecodeTag->state = STATE_FSK_SOF_END_424;
|
||||||
{ // SOF END finished or SOF END 1st part finished
|
|
||||||
DecodeTag->count = 0;
|
|
||||||
if (DecodeTag->lastBit == SOF)
|
|
||||||
{ // SOF finished at 424
|
|
||||||
if (DEBUG)
|
|
||||||
DbpString("Receiving data !");
|
|
||||||
DecodeTag->state = STATE_FSK_RECEIVING_DATA_424;
|
|
||||||
LED_C_ON();
|
|
||||||
}
|
|
||||||
DecodeTag->lastBit = SOF;
|
|
||||||
}
|
|
||||||
else if (FREQ_IS_424(freq) && !MAX_COUNT(DecodeTag->count, recv_speed)) // still in SOF_END (424)
|
|
||||||
DecodeTag->count++;
|
|
||||||
else if (DecodeTag->lastBit == SOF && FREQ_IS_484(freq) &&
|
|
||||||
LOGIC_COUNT(DecodeTag->count, recv_speed))
|
|
||||||
{ // SOF finished at 484
|
|
||||||
DecodeTag->state = STATE_FSK_RECEIVING_DATA_484;
|
|
||||||
DecodeTag->count = 1;
|
DecodeTag->count = 1;
|
||||||
LED_C_ON();
|
|
||||||
}
|
}
|
||||||
else // SOF failed, roll back
|
else if (FREQ_IS_484(freq) && !MAX_COUNT(DecodeTag->count, recv_speed)) // still in SOF_END_484
|
||||||
|
DecodeTag->count++;
|
||||||
|
else // SOF failed, roll back
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
Dbprintf("SOF_END failed: freq=%d, count=%d, recv_speed=%d", freq, DecodeTag->count, recv_speed);
|
Dbprintf("SOF_END_484 failed: freq=%d, count=%d, recv_speed=%d", freq, DecodeTag->count, recv_speed);
|
||||||
|
#endif
|
||||||
DecodeTag->state = STATE_FSK_BEFORE_SOF;
|
DecodeTag->state = STATE_FSK_BEFORE_SOF;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case STATE_FSK_SOF_END_424:
|
||||||
|
if (FREQ_IS_484(freq) && LOGIC_COUNT(DecodeTag->count, recv_speed))
|
||||||
|
{ // SOF finished at 484
|
||||||
|
DecodeTag->count = 1;
|
||||||
|
DecodeTag->lastBit = SOF;
|
||||||
|
DecodeTag->state = STATE_FSK_RECEIVING_DATA_484;
|
||||||
|
LED_C_ON();
|
||||||
|
}
|
||||||
|
else if (FREQ_IS_424(freq) && LOGIC_COUNT(DecodeTag->count-2, recv_speed))
|
||||||
|
{ // SOF finished at 424 (wait count+2 to be sure that next freq is 424)
|
||||||
|
DecodeTag->count = 2;
|
||||||
|
DecodeTag->lastBit = SOF;
|
||||||
|
DecodeTag->state = STATE_FSK_RECEIVING_DATA_424;
|
||||||
|
LED_C_ON();
|
||||||
|
}
|
||||||
|
else if (FREQ_IS_424(freq) && !MAX_COUNT(DecodeTag->count, recv_speed)) // still in SOF_END_424
|
||||||
|
DecodeTag->count++;
|
||||||
|
else // SOF failed, roll back
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (DEBUG)
|
||||||
|
Dbprintf("SOF_END_424 failed: freq=%d, count=%d, recv_speed=%d", freq, DecodeTag->count, recv_speed);
|
||||||
|
#endif
|
||||||
|
DecodeTag->state = STATE_FSK_BEFORE_SOF;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
case STATE_FSK_RECEIVING_DATA_424:
|
case STATE_FSK_RECEIVING_DATA_424:
|
||||||
if (DecodeTag->lastBit == LOGIC1_PART1 &&
|
if (FREQ_IS_484(freq) && LOGIC_COUNT(DecodeTag->count, recv_speed))
|
||||||
LOGIC_COUNT(DecodeTag->count, recv_speed))
|
{
|
||||||
{ // logic 1 finished
|
if (DecodeTag->lastBit == LOGIC1_PART1)
|
||||||
DecodeTag->lastBit = LOGIC1_PART2;
|
{ // logic 1 finished, goto 484
|
||||||
DecodeTag->count = 0;
|
DecodeTag->lastBit = LOGIC1_PART2;
|
||||||
|
|
||||||
DecodeTag->shiftReg >>= 1;
|
DecodeTag->shiftReg >>= 1;
|
||||||
DecodeTag->shiftReg |= 0x80;
|
DecodeTag->shiftReg |= 0x80;
|
||||||
DecodeTag->bitCount++;
|
DecodeTag->bitCount++;
|
||||||
if (DecodeTag->bitCount == 8) {
|
if (DecodeTag->bitCount == 8) {
|
||||||
DecodeTag->output[DecodeTag->len++] = DecodeTag->shiftReg;
|
DecodeTag->output[DecodeTag->len++] = DecodeTag->shiftReg;
|
||||||
if (DecodeTag->len > DecodeTag->max_len) {
|
if (DecodeTag->len > DecodeTag->max_len) {
|
||||||
// buffer overflow, give up
|
// buffer overflow, give up
|
||||||
LED_C_OFF();
|
LED_C_OFF();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
DecodeTag->bitCount = 0;
|
DecodeTag->bitCount = 0;
|
||||||
DecodeTag->shiftReg = 0;
|
DecodeTag->shiftReg = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (FREQ_IS_424(freq) && !MAX_COUNT(DecodeTag->count, recv_speed)) // still at 424
|
else
|
||||||
|
{ // end of LOGIC0_PART1
|
||||||
|
DecodeTag->lastBit = LOGIC0_PART1;
|
||||||
|
}
|
||||||
|
DecodeTag->count = 1;
|
||||||
|
DecodeTag->state = STATE_FSK_RECEIVING_DATA_484;
|
||||||
|
}
|
||||||
|
else if (FREQ_IS_424(freq) && LOGIC_COUNT(DecodeTag->count-2, recv_speed) &&
|
||||||
|
DecodeTag->lastBit == LOGIC1_PART1)
|
||||||
|
{ // logic 1 finished, stay in 484
|
||||||
|
DecodeTag->lastBit = LOGIC1_PART2;
|
||||||
|
|
||||||
|
DecodeTag->shiftReg >>= 1;
|
||||||
|
DecodeTag->shiftReg |= 0x80;
|
||||||
|
DecodeTag->bitCount++;
|
||||||
|
if (DecodeTag->bitCount == 8) {
|
||||||
|
DecodeTag->output[DecodeTag->len++] = DecodeTag->shiftReg;
|
||||||
|
if (DecodeTag->len > DecodeTag->max_len) {
|
||||||
|
// buffer overflow, give up
|
||||||
|
LED_C_OFF();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
DecodeTag->bitCount = 0;
|
||||||
|
DecodeTag->shiftReg = 0;
|
||||||
|
}
|
||||||
|
DecodeTag->count = 2;
|
||||||
|
}
|
||||||
|
else if (FREQ_IS_424(freq) && !MAX_COUNT(DecodeTag->count, recv_speed)) // still at 424
|
||||||
DecodeTag->count++;
|
DecodeTag->count++;
|
||||||
else if (FREQ_IS_484(freq) && LOGIC_COUNT(DecodeTag->count, recv_speed) &&
|
|
||||||
DecodeTag->lastBit >= LOGIC0_PART2)
|
|
||||||
{ // end of LOGIC0_PART1
|
|
||||||
DecodeTag->count = 1;
|
|
||||||
DecodeTag->state = STATE_FSK_RECEIVING_DATA_484;
|
|
||||||
DecodeTag->lastBit = LOGIC0_PART1;
|
|
||||||
}
|
|
||||||
else if (FREQ_IS_484(freq) && MIN_COUNT(DecodeTag->count, recv_speed))
|
|
||||||
{ // it was just the end of the previous block
|
|
||||||
DecodeTag->count = 1;
|
|
||||||
DecodeTag->state = STATE_FSK_RECEIVING_DATA_484;
|
|
||||||
}
|
|
||||||
else if (FREQ_IS_484(freq) && DecodeTag->lastBit == LOGIC0_PART2 &&
|
else if (FREQ_IS_484(freq) && DecodeTag->lastBit == LOGIC0_PART2 &&
|
||||||
SEOF_COUNT(DecodeTag->count, recv_speed))
|
SEOF_COUNT(DecodeTag->count, recv_speed))
|
||||||
{ // EOF has started
|
{ // EOF has started
|
||||||
|
#ifdef DEBUG
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
Dbprintf("RECEIVING_DATA_424 failed: freq=%d, count=%d, recv_speed=%d", freq, DecodeTag->count, recv_speed);
|
Dbprintf("RECEIVING_DATA_424->EOF: freq=%d, count=%d, recv_speed=%d, lastbit=%d, state=%d", freq, DecodeTag->count, recv_speed, DecodeTag->lastBit, DecodeTag->state);
|
||||||
|
#endif
|
||||||
DecodeTag->count = 1;
|
DecodeTag->count = 1;
|
||||||
DecodeTag->state = STATE_FSK_EOF;
|
DecodeTag->state = STATE_FSK_EOF;
|
||||||
LED_C_OFF();
|
LED_C_OFF();
|
||||||
}
|
}
|
||||||
else // error
|
else // error
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
Dbprintf("RECEIVING_DATA_424 error: freq=%d, count=%d, recv_speed=%d", freq, DecodeTag->count, recv_speed);
|
Dbprintf("RECEIVING_DATA_424 error: freq=%d, count=%d, recv_speed=%d, lastbit=%d, state=%d", freq, DecodeTag->count, recv_speed, DecodeTag->lastBit, DecodeTag->state);
|
||||||
|
#endif
|
||||||
DecodeTag->state = STATE_FSK_ERROR;
|
DecodeTag->state = STATE_FSK_ERROR;
|
||||||
LED_C_OFF();
|
LED_C_OFF();
|
||||||
return true;
|
return true;
|
||||||
|
@ -1456,43 +1488,59 @@ static int RAMFUNC Handle15693FSKSamplesFromTag(uint8_t freq, DecodeTagFSK_t *De
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STATE_FSK_RECEIVING_DATA_484:
|
case STATE_FSK_RECEIVING_DATA_484:
|
||||||
if (DecodeTag->lastBit == LOGIC0_PART1 &&
|
if (FREQ_IS_424(freq) && LOGIC_COUNT(DecodeTag->count, recv_speed))
|
||||||
LOGIC_COUNT(DecodeTag->count, recv_speed))
|
{
|
||||||
{ // logic 0 finished
|
if (DecodeTag->lastBit == LOGIC0_PART1)
|
||||||
DecodeTag->lastBit = LOGIC0_PART2;
|
{ // logic 0 finished, goto 424
|
||||||
DecodeTag->count = 0;
|
DecodeTag->lastBit = LOGIC0_PART2;
|
||||||
|
|
||||||
DecodeTag->shiftReg >>= 1;
|
DecodeTag->shiftReg >>= 1;
|
||||||
DecodeTag->bitCount++;
|
DecodeTag->bitCount++;
|
||||||
if (DecodeTag->bitCount == 8) {
|
if (DecodeTag->bitCount == 8) {
|
||||||
DecodeTag->output[DecodeTag->len++] = DecodeTag->shiftReg;
|
DecodeTag->output[DecodeTag->len++] = DecodeTag->shiftReg;
|
||||||
if (DecodeTag->len > DecodeTag->max_len) {
|
if (DecodeTag->len > DecodeTag->max_len) {
|
||||||
// buffer overflow, give up
|
// buffer overflow, give up
|
||||||
LED_C_OFF();
|
LED_C_OFF();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
DecodeTag->bitCount = 0;
|
DecodeTag->bitCount = 0;
|
||||||
DecodeTag->shiftReg = 0;
|
DecodeTag->shiftReg = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{ // end of LOGIC1_PART1
|
||||||
|
DecodeTag->lastBit = LOGIC1_PART1;
|
||||||
|
}
|
||||||
|
DecodeTag->count = 1;
|
||||||
|
DecodeTag->state = STATE_FSK_RECEIVING_DATA_424;
|
||||||
|
}
|
||||||
|
else if (FREQ_IS_484(freq) && LOGIC_COUNT(DecodeTag->count-2, recv_speed) &&
|
||||||
|
DecodeTag->lastBit == LOGIC0_PART1)
|
||||||
|
{ // logic 0 finished, stay in 424
|
||||||
|
DecodeTag->lastBit = LOGIC0_PART2;
|
||||||
|
|
||||||
|
DecodeTag->shiftReg >>= 1;
|
||||||
|
DecodeTag->bitCount++;
|
||||||
|
if (DecodeTag->bitCount == 8) {
|
||||||
|
DecodeTag->output[DecodeTag->len++] = DecodeTag->shiftReg;
|
||||||
|
if (DecodeTag->len > DecodeTag->max_len) {
|
||||||
|
// buffer overflow, give up
|
||||||
|
LED_C_OFF();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
DecodeTag->bitCount = 0;
|
||||||
|
DecodeTag->shiftReg = 0;
|
||||||
|
}
|
||||||
|
DecodeTag->count = 2;
|
||||||
|
}
|
||||||
else if (FREQ_IS_484(freq) && !MAX_COUNT(DecodeTag->count, recv_speed)) // still at 484
|
else if (FREQ_IS_484(freq) && !MAX_COUNT(DecodeTag->count, recv_speed)) // still at 484
|
||||||
DecodeTag->count++;
|
DecodeTag->count++;
|
||||||
else if (FREQ_IS_424(freq) && LOGIC_COUNT(DecodeTag->count, recv_speed) &&
|
else // error
|
||||||
DecodeTag->lastBit >= LOGIC0_PART2)
|
|
||||||
{ // end of LOGIC1_PART1
|
|
||||||
DecodeTag->count = 1;
|
|
||||||
DecodeTag->state = STATE_FSK_RECEIVING_DATA_424;
|
|
||||||
DecodeTag->lastBit = LOGIC1_PART1;
|
|
||||||
}
|
|
||||||
else if (FREQ_IS_424(freq) && MIN_COUNT(DecodeTag->count, recv_speed))
|
|
||||||
{ // it was just the end of the previous block
|
|
||||||
DecodeTag->count = 1;
|
|
||||||
DecodeTag->state = STATE_FSK_RECEIVING_DATA_424;
|
|
||||||
}
|
|
||||||
else // error
|
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
Dbprintf("RECEIVING_DATA_484 error: freq=%d, count=%d, recv_speed=%d", freq, DecodeTag->count, recv_speed);
|
Dbprintf("RECEIVING_DATA_484 error: freq=%d, count=%d, recv_speed=%d, lastbit=%d, state=%d", freq, DecodeTag->count, recv_speed, DecodeTag->lastBit, DecodeTag->state);
|
||||||
|
#endif
|
||||||
LED_C_OFF();
|
LED_C_OFF();
|
||||||
DecodeTag->state = STATE_FSK_ERROR;
|
DecodeTag->state = STATE_FSK_ERROR;
|
||||||
return true;
|
return true;
|
||||||
|
@ -1508,14 +1556,20 @@ static int RAMFUNC Handle15693FSKSamplesFromTag(uint8_t freq, DecodeTagFSK_t *De
|
||||||
}
|
}
|
||||||
else // error
|
else // error
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
Dbprintf("EOF error: freq=%d, count=%d, recv_speed=%d", freq, DecodeTag->count, recv_speed);
|
Dbprintf("EOF error: freq=%d, count=%d, recv_speed=%d", freq, DecodeTag->count, recv_speed);
|
||||||
|
#endif
|
||||||
DecodeTag->state = STATE_FSK_ERROR;
|
DecodeTag->state = STATE_FSK_ERROR;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case STATE_FSK_ERROR:
|
case STATE_FSK_ERROR:
|
||||||
LED_C_OFF();
|
LED_C_OFF();
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (DEBUG)
|
||||||
|
Dbprintf("FSK error: freq=%d, count=%d, recv_speed=%d", freq, DecodeTag->count, recv_speed);
|
||||||
|
#endif
|
||||||
return true; // error
|
return true; // error
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1587,7 +1641,9 @@ void SniffIso15693(uint8_t jam_search_len, uint8_t *jam_search_string) {
|
||||||
dma_start_time = GetCountSspClk() & 0xfffffff0;
|
dma_start_time = GetCountSspClk() & 0xfffffff0;
|
||||||
}
|
}
|
||||||
|
|
||||||
volatile uint16_t sniffdata = *upTo++;
|
volatile uint16_t sniffdata;
|
||||||
|
volatile uint16_t sniffdata_prev = sniffdata;
|
||||||
|
sniffdata = *upTo++;
|
||||||
|
|
||||||
// we have read all of the DMA buffer content
|
// we have read all of the DMA buffer content
|
||||||
if (upTo >= dma->buf + DMA_BUFFER_SIZE) {
|
if (upTo >= dma->buf + DMA_BUFFER_SIZE) {
|
||||||
|
@ -1618,7 +1674,7 @@ void SniffIso15693(uint8_t jam_search_len, uint8_t *jam_search_string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// no need to try decoding reader data if the tag is sending
|
// no need to try decoding reader data if the tag is sending
|
||||||
if (tag_is_active == false) {
|
if (!tag_is_active) {
|
||||||
|
|
||||||
if (Handle15693SampleFromReader((sniffdata & 0x02) >> 1, &dreader)) {
|
if (Handle15693SampleFromReader((sniffdata & 0x02) >> 1, &dreader)) {
|
||||||
|
|
||||||
|
@ -1634,7 +1690,7 @@ void SniffIso15693(uint8_t jam_search_len, uint8_t *jam_search_string) {
|
||||||
expect_fast_answer = dreader.output[0] & ISO15_REQ_DATARATE_HIGH;
|
expect_fast_answer = dreader.output[0] & ISO15_REQ_DATARATE_HIGH;
|
||||||
}
|
}
|
||||||
// And ready to receive another command.
|
// And ready to receive another command.
|
||||||
DecodeReaderReset(&dreader);
|
//DecodeReaderReset(&dreader); // already reseted
|
||||||
DecodeTagReset(&dtag);
|
DecodeTagReset(&dtag);
|
||||||
DecodeTagFSKReset(&dtagfsk);
|
DecodeTagFSKReset(&dtagfsk);
|
||||||
reader_is_active = false;
|
reader_is_active = false;
|
||||||
|
@ -1653,7 +1709,7 @@ void SniffIso15693(uint8_t jam_search_len, uint8_t *jam_search_string) {
|
||||||
expect_fast_answer = dreader.output[0] & ISO15_REQ_DATARATE_HIGH;
|
expect_fast_answer = dreader.output[0] & ISO15_REQ_DATARATE_HIGH;
|
||||||
}
|
}
|
||||||
// And ready to receive another command
|
// And ready to receive another command
|
||||||
DecodeReaderReset(&dreader);
|
//DecodeReaderReset(&dreader); // already reseted
|
||||||
DecodeTagReset(&dtag);
|
DecodeTagReset(&dtag);
|
||||||
DecodeTagFSKReset(&dtagfsk);
|
DecodeTagFSKReset(&dtagfsk);
|
||||||
reader_is_active = false;
|
reader_is_active = false;
|
||||||
|
@ -1663,7 +1719,7 @@ void SniffIso15693(uint8_t jam_search_len, uint8_t *jam_search_string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reader_is_active == false && expect_tag_answer) { // no need to try decoding tag data if the reader is currently sending or no answer expected yet
|
if (!reader_is_active && expect_tag_answer) { // no need to try decoding tag data if the reader is currently sending or no answer expected yet
|
||||||
|
|
||||||
if (!expect_fsk_answer)
|
if (!expect_fsk_answer)
|
||||||
{
|
{
|
||||||
|
@ -1691,48 +1747,35 @@ void SniffIso15693(uint8_t jam_search_len, uint8_t *jam_search_string) {
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Handle15693FSKSamplesFromTag((sniffdata >> 2) & 0x3, &dtagfsk, expect_fast_answer, samples-fsksamples)) {
|
if (FREQ_IS_0((sniffdata >> 2) & 0x3)) // tolerate 1 00
|
||||||
uint32_t eof_time = dma_start_time + (samples * 16) - DELAY_TAG_TO_ARM_SNIFF; // end of EOF
|
sniffdata = sniffdata_prev;
|
||||||
if (dtagfsk.lastBit == SOF) {
|
|
||||||
eof_time -= (8 * 16); // needed 8 additional samples to confirm single SOF (iCLASS)
|
|
||||||
}
|
|
||||||
uint32_t sof_time = eof_time
|
|
||||||
- dtagfsk.len * 8 * 8 * 16 // time for byte transfers
|
|
||||||
- (32 * 16) // time for SOF transfer
|
|
||||||
- (dtagfsk.lastBit != SOF ? (32 * 16) : 0); // time for EOF transfer
|
|
||||||
|
|
||||||
LogTrace_ISO15693(dtagfsk.output, dtagfsk.len, (sof_time * 4), (eof_time * 4), NULL, false);
|
if (Handle15693FSKSamplesFromTag((sniffdata >> 2) & 0x3, &dtagfsk, expect_fast_answer)) {
|
||||||
// And ready to receive another response.
|
|
||||||
DecodeTagFSKReset(&dtagfsk);
|
|
||||||
DecodeTagReset(&dtag);
|
|
||||||
DecodeReaderReset(&dreader);
|
|
||||||
expect_tag_answer = false;
|
|
||||||
tag_is_active = false;
|
|
||||||
expect_fsk_answer = false;
|
expect_fsk_answer = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (Handle15693FSKSamplesFromTag(sniffdata & 0xFF, &dtagfsk, expect_fast_answer)) {
|
else {
|
||||||
|
tag_is_active = (dtagfsk.state >= STATE_FSK_RECEIVING_DATA_484);
|
||||||
|
}
|
||||||
|
if (!expect_fsk_answer)
|
||||||
|
{ // FSK answer no more expected: switch back to ASK
|
||||||
|
if (dtagfsk.len > 0)
|
||||||
|
{
|
||||||
|
uint32_t eof_time = dma_start_time + (samples * 16) - DELAY_TAG_TO_ARM_SNIFF; // end of EOF
|
||||||
|
if (dtagfsk.lastBit == SOF) {
|
||||||
|
eof_time -= (8 * 16); // needed 8 additional samples to confirm single SOF (iCLASS)
|
||||||
|
}
|
||||||
|
uint32_t sof_time = eof_time
|
||||||
|
- dtagfsk.len * 8 * 8 * 16 // time for byte transfers
|
||||||
|
- (32 * 16) // time for SOF transfer
|
||||||
|
- (dtagfsk.lastBit != SOF ? (32 * 16) : 0); // time for EOF transfer
|
||||||
|
|
||||||
uint32_t eof_time = dma_start_time + (samples * 16) - DELAY_TAG_TO_ARM_SNIFF; // end of EOF
|
LogTrace_ISO15693(dtagfsk.output, dtagfsk.len, (sof_time * 4), (eof_time * 4), NULL, false);
|
||||||
if (dtagfsk.lastBit == SOF) {
|
|
||||||
eof_time -= (8 * 16); // needed 8 additional samples to confirm single SOF (iCLASS)
|
|
||||||
}
|
}
|
||||||
uint32_t sof_time = eof_time
|
|
||||||
- dtagfsk.len * 8 * 8 * 16 // time for byte transfers
|
|
||||||
- (32 * 16) // time for SOF transfer
|
|
||||||
- (dtagfsk.lastBit != SOF ? (32 * 16) : 0); // time for EOF transfer
|
|
||||||
|
|
||||||
LogTrace_ISO15693(dtagfsk.output, dtagfsk.len, (sof_time * 4), (eof_time * 4), NULL, false);
|
|
||||||
// And ready to receive another response.
|
|
||||||
DecodeTagFSKReset(&dtagfsk);
|
DecodeTagFSKReset(&dtagfsk);
|
||||||
DecodeTagReset(&dtag);
|
|
||||||
DecodeReaderReset(&dreader);
|
DecodeReaderReset(&dreader);
|
||||||
expect_tag_answer = false;
|
expect_tag_answer = false;
|
||||||
tag_is_active = false;
|
tag_is_active = false;
|
||||||
expect_fsk_answer = false;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
tag_is_active = (dtagfsk.state >= STATE_FSK_RECEIVING_DATA_484);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue