mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 21:03:48 -07:00
send sync signal to clock when reset
This commit is contained in:
parent
9ec32e1fe8
commit
b993236be2
4 changed files with 60 additions and 27 deletions
|
@ -1148,6 +1148,9 @@ void SniffHitag2(void) {
|
||||||
// Enable and reset counter
|
// Enable and reset counter
|
||||||
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
||||||
|
|
||||||
|
// Assert a sync signal. This sets all timers to 0 on next active clock edge
|
||||||
|
AT91C_BASE_TCB->TCB_BCR = 1;
|
||||||
|
|
||||||
int frame_count = 0, response = 0, overflow = 0, lastbit = 1, tag_sof = 4;
|
int frame_count = 0, response = 0, overflow = 0, lastbit = 1, tag_sof = 4;
|
||||||
bool rising_edge = false, reader_frame = false, bSkip = true;
|
bool rising_edge = false, reader_frame = false, bSkip = true;
|
||||||
uint8_t rx[HITAG_FRAME_LEN];
|
uint8_t rx[HITAG_FRAME_LEN];
|
||||||
|
@ -1293,11 +1296,15 @@ void SniffHitag2(void) {
|
||||||
// Reset the timer to restart while-loop that receives frames
|
// Reset the timer to restart while-loop that receives frames
|
||||||
AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG;
|
AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG;
|
||||||
AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG;
|
AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG;
|
||||||
|
|
||||||
|
// Assert a sync signal. This sets all timers to 0 on next active clock edge
|
||||||
|
AT91C_BASE_TCB->TCB_BCR = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
LEDsoff();
|
LEDsoff();
|
||||||
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS;
|
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS;
|
||||||
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
|
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
|
||||||
|
|
||||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
||||||
set_tracing(false);
|
set_tracing(false);
|
||||||
|
|
||||||
|
|
|
@ -246,6 +246,9 @@ void lf_init(bool reader, bool simulate) {
|
||||||
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
||||||
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
||||||
|
|
||||||
|
// Assert a sync signal. This sets all timers to 0 on next active clock edge
|
||||||
|
AT91C_BASE_TCB->TCB_BCR = 1;
|
||||||
|
|
||||||
// Prepare data trace
|
// Prepare data trace
|
||||||
uint32_t bufsize = 10000;
|
uint32_t bufsize = 10000;
|
||||||
|
|
||||||
|
|
|
@ -14,13 +14,17 @@
|
||||||
#define ALLOC 16
|
#define ALLOC 16
|
||||||
|
|
||||||
size_t DemodPCF7931(uint8_t **outBlocks) {
|
size_t DemodPCF7931(uint8_t **outBlocks) {
|
||||||
|
|
||||||
|
// 2021 iceman, memor
|
||||||
uint8_t bits[256] = {0x00};
|
uint8_t bits[256] = {0x00};
|
||||||
uint8_t blocks[8][16];
|
uint8_t blocks[8][16];
|
||||||
|
|
||||||
uint8_t *dest = BigBuf_get_addr();
|
uint8_t *dest = BigBuf_get_addr();
|
||||||
|
|
||||||
int GraphTraceLen = BigBuf_max_traceLen();
|
int GraphTraceLen = BigBuf_max_traceLen();
|
||||||
if (GraphTraceLen > 18000)
|
if (GraphTraceLen > 18000) {
|
||||||
GraphTraceLen = 18000;
|
GraphTraceLen = 18000;
|
||||||
|
}
|
||||||
|
|
||||||
int i = 2, j, lastval, bitidx, half_switch;
|
int i = 2, j, lastval, bitidx, half_switch;
|
||||||
int clock = 64;
|
int clock = 64;
|
||||||
|
@ -38,15 +42,17 @@ size_t DemodPCF7931(uint8_t **outBlocks) {
|
||||||
/* Find first local max/min */
|
/* Find first local max/min */
|
||||||
if (dest[1] > dest[0]) {
|
if (dest[1] > dest[0]) {
|
||||||
while (i < GraphTraceLen) {
|
while (i < GraphTraceLen) {
|
||||||
if (!(dest[i] > dest[i - 1]) && dest[i] > lmax)
|
if (!(dest[i] > dest[i - 1]) && dest[i] > lmax) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
dir = 0;
|
dir = 0;
|
||||||
} else {
|
} else {
|
||||||
while (i < GraphTraceLen) {
|
while (i < GraphTraceLen) {
|
||||||
if (!(dest[i] < dest[i - 1]) && dest[i] < lmin)
|
if (!(dest[i] < dest[i - 1]) && dest[i] < lmin) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
dir = 1;
|
dir = 1;
|
||||||
|
@ -58,6 +64,7 @@ size_t DemodPCF7931(uint8_t **outBlocks) {
|
||||||
block_done = 0;
|
block_done = 0;
|
||||||
|
|
||||||
for (bitidx = 0; i < GraphTraceLen; i++) {
|
for (bitidx = 0; i < GraphTraceLen; i++) {
|
||||||
|
|
||||||
if ((dest[i - 1] > dest[i] && dir == 1 && dest[i] > lmax) || (dest[i - 1] < dest[i] && dir == 0 && dest[i] < lmin)) {
|
if ((dest[i - 1] > dest[i] && dir == 1 && dest[i] > lmax) || (dest[i - 1] < dest[i] && dir == 0 && dest[i] < lmin)) {
|
||||||
lc = i - lastval;
|
lc = i - lastval;
|
||||||
lastval = i;
|
lastval = i;
|
||||||
|
@ -66,8 +73,8 @@ size_t DemodPCF7931(uint8_t **outBlocks) {
|
||||||
// Tolerance is 1/8 of clock rate (arbitrary)
|
// Tolerance is 1/8 of clock rate (arbitrary)
|
||||||
if (ABS(lc - clock / 4) < tolerance) {
|
if (ABS(lc - clock / 4) < tolerance) {
|
||||||
// 16T0
|
// 16T0
|
||||||
if ((i - pmc) == lc) { /* 16T0 was previous one */
|
if ((i - pmc) == lc) { // 16T0 was previous one
|
||||||
/* It's a PMC ! */
|
// It's a PMC
|
||||||
i += (128 + 127 + 16 + 32 + 33 + 16) - 1;
|
i += (128 + 127 + 16 + 32 + 33 + 16) - 1;
|
||||||
lastval = i;
|
lastval = i;
|
||||||
pmc = 0;
|
pmc = 0;
|
||||||
|
@ -77,8 +84,8 @@ size_t DemodPCF7931(uint8_t **outBlocks) {
|
||||||
}
|
}
|
||||||
} else if (ABS(lc - clock / 2) < tolerance) {
|
} else if (ABS(lc - clock / 2) < tolerance) {
|
||||||
// 32TO
|
// 32TO
|
||||||
if ((i - pmc) == lc) { /* 16T0 was previous one */
|
if ((i - pmc) == lc) { // 16T0 was previous one
|
||||||
/* It's a PMC ! */
|
// It's a PMC !
|
||||||
i += (128 + 127 + 16 + 32 + 33) - 1;
|
i += (128 + 127 + 16 + 32 + 33) - 1;
|
||||||
lastval = i;
|
lastval = i;
|
||||||
pmc = 0;
|
pmc = 0;
|
||||||
|
@ -95,8 +102,9 @@ size_t DemodPCF7931(uint8_t **outBlocks) {
|
||||||
// Error
|
// Error
|
||||||
if (++warnings > 10) {
|
if (++warnings > 10) {
|
||||||
|
|
||||||
if (DBGLEVEL >= DBG_EXTENDED)
|
if (DBGLEVEL >= DBG_EXTENDED) {
|
||||||
Dbprintf("Error: too many detection errors, aborting.");
|
Dbprintf("Error: too many detection errors, aborting");
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -122,13 +130,19 @@ size_t DemodPCF7931(uint8_t **outBlocks) {
|
||||||
block_done = 0;
|
block_done = 0;
|
||||||
half_switch = 0;
|
half_switch = 0;
|
||||||
}
|
}
|
||||||
if (i < GraphTraceLen)
|
|
||||||
|
if (i < GraphTraceLen) {
|
||||||
dir = (dest[i - 1] > dest[i]) ? 0 : 1;
|
dir = (dest[i - 1] > dest[i]) ? 0 : 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (bitidx == 255)
|
|
||||||
|
if (bitidx == 255) {
|
||||||
bitidx = 0;
|
bitidx = 0;
|
||||||
warnings = 0;
|
}
|
||||||
if (num_blocks == 4) break;
|
|
||||||
|
if (num_blocks == 4) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
memcpy(outBlocks, blocks, 16 * num_blocks);
|
memcpy(outBlocks, blocks, 16 * num_blocks);
|
||||||
return num_blocks;
|
return num_blocks;
|
||||||
|
@ -138,10 +152,11 @@ bool IsBlock0PCF7931(uint8_t *block) {
|
||||||
// assuming all RFU bits are set to 0
|
// assuming all RFU bits are set to 0
|
||||||
// if PAC is enabled password is set to 0
|
// if PAC is enabled password is set to 0
|
||||||
if (block[7] == 0x01) {
|
if (block[7] == 0x01) {
|
||||||
if (!memcmp(block, "\x00\x00\x00\x00\x00\x00\x00", 7)
|
if (!memcmp(block, "\x00\x00\x00\x00\x00\x00\x00", 7) &&
|
||||||
&& !memcmp(block + 9, "\x00\x00\x00\x00\x00\x00\x00", 7)) {
|
!memcmp(block + 9, "\x00\x00\x00\x00\x00\x00\x00", 7)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (block[7] == 0x00) {
|
} else if (block[7] == 0x00) {
|
||||||
if (!memcmp(block + 9, "\x00\x00\x00\x00\x00\x00\x00", 7)) {
|
if (!memcmp(block + 9, "\x00\x00\x00\x00\x00\x00\x00", 7)) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -158,14 +173,14 @@ bool IsBlock1PCF7931(uint8_t *block) {
|
||||||
uint8_t rlb = block[15];
|
uint8_t rlb = block[15];
|
||||||
|
|
||||||
if (block[10] == 0
|
if (block[10] == 0
|
||||||
&& block[11] == 0
|
&& block[11] == 0
|
||||||
&& block[12] == 0
|
&& block[12] == 0
|
||||||
&& block[13] == 0) {
|
&& block[13] == 0) {
|
||||||
// block 1 is sent only if (RLB >= 1 && RFB <= 1) or RB1 enabled
|
// block 1 is sent only if (RLB >= 1 && RFB <= 1) or RB1 enabled
|
||||||
if (rfb <= rlb
|
if (rfb <= rlb
|
||||||
&& rfb <= 9
|
&& rfb <= 9
|
||||||
&& rlb <= 9
|
&& rlb <= 9
|
||||||
&& ((rfb <= 1 && rlb >= 1) || rb1)) {
|
&& ((rfb <= 1 && rlb >= 1) || rb1)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -211,8 +226,9 @@ void ReadPCF7931(void) {
|
||||||
// exit if too many errors during reading
|
// exit if too many errors during reading
|
||||||
if (tries > 50 && (2 * errors > tries)) {
|
if (tries > 50 && (2 * errors > tries)) {
|
||||||
|
|
||||||
if (DBGLEVEL >= DBG_INFO)
|
if (DBGLEVEL >= DBG_INFO) {
|
||||||
Dbprintf("[!!] Error reading the tag, only partial content");
|
Dbprintf("[!!] Error reading the tag, only partial content");
|
||||||
|
}
|
||||||
|
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
@ -461,27 +477,32 @@ void SendCmdPCF7931(uint32_t *tab) {
|
||||||
//initialization of the timer
|
//initialization of the timer
|
||||||
AT91C_BASE_PMC->PMC_PCER |= (0x1 << AT91C_ID_TC0);
|
AT91C_BASE_PMC->PMC_PCER |= (0x1 << AT91C_ID_TC0);
|
||||||
AT91C_BASE_TCB->TCB_BMR = AT91C_TCB_TC0XC0S_NONE | AT91C_TCB_TC1XC1S_TIOA0 | AT91C_TCB_TC2XC2S_NONE;
|
AT91C_BASE_TCB->TCB_BMR = AT91C_TCB_TC0XC0S_NONE | AT91C_TCB_TC1XC1S_TIOA0 | AT91C_TCB_TC2XC2S_NONE;
|
||||||
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS; // timer disable
|
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS; // timer disable
|
||||||
AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV3_CLOCK; //clock at 48/32 MHz
|
AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV3_CLOCK; // clock at 48/32 MHz
|
||||||
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN;
|
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN;
|
||||||
|
|
||||||
|
// Assert a sync signal. This sets all timers to 0 on next active clock edge
|
||||||
AT91C_BASE_TCB->TCB_BCR = 1;
|
AT91C_BASE_TCB->TCB_BCR = 1;
|
||||||
|
|
||||||
tempo = AT91C_BASE_TC0->TC_CV;
|
tempo = AT91C_BASE_TC0->TC_CV;
|
||||||
for (u = 0; tab[u] != 0; u += 3) {
|
for (u = 0; tab[u] != 0; u += 3) {
|
||||||
// modulate antenna
|
// modulate antenna
|
||||||
HIGH(GPIO_SSC_DOUT);
|
HIGH(GPIO_SSC_DOUT);
|
||||||
while (tempo != tab[u])
|
while (tempo != tab[u]) {
|
||||||
tempo = AT91C_BASE_TC0->TC_CV;
|
tempo = AT91C_BASE_TC0->TC_CV;
|
||||||
|
}
|
||||||
|
|
||||||
// stop modulating antenna
|
// stop modulating antenna
|
||||||
LOW(GPIO_SSC_DOUT);
|
LOW(GPIO_SSC_DOUT);
|
||||||
while (tempo != tab[u + 1])
|
while (tempo != tab[u + 1]) {
|
||||||
tempo = AT91C_BASE_TC0->TC_CV;
|
tempo = AT91C_BASE_TC0->TC_CV;
|
||||||
|
}
|
||||||
|
|
||||||
// modulate antenna
|
// modulate antenna
|
||||||
HIGH(GPIO_SSC_DOUT);
|
HIGH(GPIO_SSC_DOUT);
|
||||||
while (tempo != tab[u + 2])
|
while (tempo != tab[u + 2]) {
|
||||||
tempo = AT91C_BASE_TC0->TC_CV;
|
tempo = AT91C_BASE_TC0->TC_CV;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LED_A_OFF();
|
LED_A_OFF();
|
||||||
|
|
|
@ -125,6 +125,8 @@ void StartCountUS(void) {
|
||||||
|
|
||||||
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
||||||
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
||||||
|
|
||||||
|
// Assert a sync signal. This sets all timers to 0 on next active clock edge
|
||||||
AT91C_BASE_TCB->TCB_BCR = 1;
|
AT91C_BASE_TCB->TCB_BCR = 1;
|
||||||
|
|
||||||
while (AT91C_BASE_TC1->TC_CV > 0);
|
while (AT91C_BASE_TC1->TC_CV > 0);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue