CHG: finally, the ticks timer does what it is supposed to do. 32bits and working.

This commit is contained in:
iceman1001 2016-09-29 21:36:43 +02:00
parent fabef615ec
commit c649c43389
4 changed files with 21 additions and 19 deletions

View file

@ -72,7 +72,7 @@ static void setup_timer(void) {
#define RWD_TIME_1 120 // READER_TIME_PAUSE 20us off, 80us on = 100us 80 * 1.5 == 120ticks
#define RWD_TIME_0 60 // READER_TIME_PAUSE 20us off, 40us on = 60us 40 * 1.5 == 60ticks
#define RWD_TIME_PAUSE 30 // 20us == 20 * 1.5 == 30ticks */
#define TAG_BIT_PERIOD 143 // 100us == 100 * 1.5 == 150ticks
#define TAG_BIT_PERIOD 142 // 100us == 100 * 1.5 == 150ticks
#define TAG_FRAME_WAIT 495 // 330us from READER frame end to TAG frame start. 330 * 1.5 == 495
#define RWD_TIME_FUZZ 20 // rather generous 13us, since the peak detector + hysteresis fuzz quite a bit
@ -264,7 +264,6 @@ static void frame_receiveAsReader(struct legic_frame * const f, uint8_t bits) {
if ( bits > 32 ) return;
uint8_t i = bits, edges = 0;
uint16_t lsfr = 0;
uint32_t the_bit = 1, next_bit_at = 0, data = 0;
uint32_t old_level = 0;
volatile uint32_t level = 0;
@ -276,18 +275,19 @@ static void frame_receiveAsReader(struct legic_frame * const f, uint8_t bits) {
// calibrate the prng.
legic_prng_forward(2);
data = lsfr = legic_prng_get_bits(bits);
data = legic_prng_get_bits(bits);
//FIXED time between sending frame and now listening frame. 330us
uint32_t starttime = GET_TICKS;
if ( bits == 6) {
//if ( bits == 6 || bits == 7) {
// its about 9+9 ticks delay from end-send to here.
//WaitTicks( 495 - 9 - 9 );
WaitTicks( 475 );
} else {
WaitTicks( 450 );
}
WaitTicks( 477 );
//} else {
// WaitTicks( 477 );
// }
next_bit_at = GET_TICKS + TAG_BIT_PERIOD;
next_bit_at = GET_TICKS + TAG_BIT_PERIOD;
while ( i-- ){
edges = 0;
@ -400,14 +400,16 @@ int legic_read_byte( uint16_t index, uint8_t cmd_sz) {
uint8_t byte, crc, calcCrc = 0;
uint32_t cmd = (index << 1) | LEGIC_READ;
WaitTicks(366);
//WaitTicks(366);
WaitTicks(330);
//WaitTicks(50);
frame_sendAsReader(cmd, cmd_sz);
frame_receiveAsReader(&current_frame, 12);
// CRC check.
byte = BYTEx(current_frame.data, 0);
crc = BYTEx(current_frame.data, 1);
calcCrc = legic4Crc(LEGIC_READ, index, byte, cmd_sz);
if( calcCrc != crc ) {
@ -416,7 +418,6 @@ int legic_read_byte( uint16_t index, uint8_t cmd_sz) {
}
legic_prng_forward(4);
WaitTicks(50);
return byte;
}
@ -738,7 +739,6 @@ int legic_select_card_iv(legic_card_select_t *p_card, uint8_t iv){
p_card->addrsize = 0;
p_card->cardsize = 0;
return 2;
break;
}
return 0;
}

View file

@ -187,7 +187,7 @@ void StartTicks(void){
AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_ACPA_CLEAR |
AT91C_TC_ACPC_SET | AT91C_TC_ASWTRG_SET;
AT91C_BASE_TC0->TC_RA = 1;
AT91C_BASE_TC0->TC_RC = 0xBFFF + 1; // 0xC000
AT91C_BASE_TC0->TC_RC = 0;
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS; // timer disable
AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_XC1; // from TC0

View file

@ -19,7 +19,7 @@
#include "proxmark3.h"
#ifndef GET_TICKS
# define GET_TICKS ((AT91C_BASE_TC1->TC_CV << 16) | AT91C_BASE_TC0->TC_CV)
# define GET_TICKS (uint32_t)((AT91C_BASE_TC1->TC_CV << 16) | AT91C_BASE_TC0->TC_CV)
#endif
void SpinDelay(int ms);

View file

@ -425,12 +425,14 @@ int CmdLegicRFRead(const char *Cmd) {
uint16_t len = resp.arg[1] & 0x3FF;
if ( isOK ) {
PrintAndLog("use 'hf legic decode'");
}
uint8_t *data = resp.d.asBytes;
PrintAndLog("\nData |");
PrintAndLog("-----------------------------");
PrintAndLog(" %s|\n", sprint_hex(data, len));
// }
} else {
PrintAndLog("failed reading tag");
}
} else {
PrintAndLog("command execution time out");
return 1;