X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/e4d57949dfd8ee457f10adc89c4aba641090e346..4409bf6ef3e89f6f55ab8028ba56afa98fd32a42:/armsrc/legicrf.c diff --git a/armsrc/legicrf.c b/armsrc/legicrf.c index 4b4a6ff6..ae24f007 100644 --- a/armsrc/legicrf.c +++ b/armsrc/legicrf.c @@ -405,31 +405,30 @@ int legic_read_byte( uint16_t index, uint8_t cmd_sz) { bool legic_write_byte(uint16_t index, uint8_t byte, uint8_t addr_sz) { bool isOK = false; - uint8_t i = 80, edges = 0; + int8_t i = 40; + uint8_t edges = 0; uint8_t cmd_sz = addr_sz+1+8+4; //crc+data+cmd; uint32_t steps = 0, next_bit_at, start, crc, old_level = 0; - /* +/* crc_clear(&legic_crc); crc_update(&legic_crc, 0, 1); // CMD_WRITE crc_update(&legic_crc, index, addr_sz); crc_update(&legic_crc, byte, 8); - uint32_t crc = crc_finish(&legic_crc); - */ + crc = crc_finish(&legic_crc); +*/ crc = legic4Crc(LEGIC_WRITE, index, byte, addr_sz+1); // send write command - uint32_t cmd; - cmd = ((crc & 0xF ) << (addr_sz+1+8)); // CRC - cmd |= byte << (addr_sz+1); // Data - cmd |= ((index & 0xFF) << 1); // index - cmd |= LEGIC_WRITE; // CMD + uint32_t cmd = LEGIC_WRITE; + cmd |= index << 1; // index + cmd |= byte << (addr_sz+1); // Data + cmd |= (crc & 0xF ) << (addr_sz+1+8); // CRC /* Bitbang the response */ - SHORT_COIL; - AT91C_BASE_PIOA->PIO_PER = GPIO_SSC_DOUT; + //AT91C_BASE_PIOA->PIO_PER = GPIO_SSC_DOUT; - WaitTicks(330); + WaitTicks(240); frame_sendAsReader(cmd, cmd_sz); @@ -439,8 +438,7 @@ bool legic_write_byte(uint16_t index, uint8_t byte, uint8_t addr_sz) { // ACK, - one single "1" bit after 3.6ms // 3.6ms = 3600us * 1.5 = 5400ticks. - WaitTicks(5000); - //WaitTicks(330); + WaitTicks(5300); next_bit_at = GET_TICKS + TAG_BIT_PERIOD; @@ -467,10 +465,10 @@ bool legic_write_byte(uint16_t index, uint8_t byte, uint8_t addr_sz) { goto OUT; } } - + OUT: ; // log - uint8_t cmdbytes[] = {cmd_sz, isOK, BYTEx(steps, 0), BYTEx(steps, 1) }; + uint8_t cmdbytes[] = {1, isOK, BYTEx(steps, 0), BYTEx(steps, 1) }; LogTrace(cmdbytes, sizeof(cmdbytes), start, GET_TICKS, NULL, FALSE); return isOK; } @@ -538,13 +536,12 @@ void LegicRfWriter(uint16_t offset, uint16_t len, uint8_t iv, uint8_t *data) { LED_B_ON(); while( len > 0 ) { - - if ( !legic_write_byte( len + offset + LOWERLIMIT, data[len-1], card.addrsize) ) { - Dbprintf("operation failed @ 0x%03.3x", len-1); + --len; + if ( !legic_write_byte( len + offset, data[len], card.addrsize) ) { + Dbprintf("operation failed | %02X | %02X | %02X", len + offset, len, data[len] ); isOK = 0; goto OUT; } - --len; WDT_HIT(); } OUT: