From c2ab5e8c4e1e5ac3bf28199711fcb8dc34bb42a9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 7 Oct 2016 20:23:57 +0200 Subject: [PATCH] FIX: "hf list legic" annotation now correct prints byte and value for "legic write" command --- armsrc/legicrf.c | 18 ++++++++---------- client/cmdhf.c | 19 ++++++++++++++++++- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/armsrc/legicrf.c b/armsrc/legicrf.c index 4b4a6ff6..a8cad9b7 100644 --- a/armsrc/legicrf.c +++ b/armsrc/legicrf.c @@ -419,11 +419,10 @@ bool legic_write_byte(uint16_t index, uint8_t byte, uint8_t addr_sz) { 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; @@ -470,7 +469,7 @@ bool legic_write_byte(uint16_t index, uint8_t byte, uint8_t addr_sz) { 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 +537,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 | %d | %d | %d", len + offset, len, data[len] ); isOK = 0; goto OUT; } - --len; WDT_HIT(); } OUT: diff --git a/client/cmdhf.c b/client/cmdhf.c index bc8d2ecc..44ad9700 100644 --- a/client/cmdhf.c +++ b/client/cmdhf.c @@ -372,6 +372,7 @@ void annotateIso14443b(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize) { // Quite simpel tag void annotateLegic(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize){ uint8_t bitsend = cmd[0]; + uint8_t cmdBit = (cmd[1] & 1); switch (bitsend){ case 7: snprintf(exp, size, "IV 0x%02X", cmd[1]); @@ -388,7 +389,7 @@ void annotateLegic(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize){ } case 9: case 11: { - uint8_t cmdBit = (cmd[1] & 1); + uint16_t address = (cmd[2] << 7) | cmd[1] >> 1; if (cmdBit == LEGIC_READ) @@ -398,6 +399,22 @@ void annotateLegic(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize){ snprintf(exp, size, "WRITE Byte(%d)", address); break; } + case 21: { + if (cmdBit == LEGIC_WRITE ) { + uint16_t address = ((cmd[2] << 7) | cmd[1] >> 1) & 0xFF; + uint8_t val = (cmd[3] & 1 ) << 7 | cmd[2] >> 1; + snprintf(exp, size, "WRITE Byte(%d) %02X", address, val); + } + break; + } + case 23: { + if (cmdBit == LEGIC_WRITE ) { + uint16_t address = ((cmd[2] << 7) | cmd[1] >> 1) & 0x3FF; + uint8_t val = (cmd[3] & 0x7 ) << 5 | cmd[2] >> 3; + snprintf(exp, size, "WRITE Byte(%d) %02X", address, val); + } + break; + } case 12: default: break; -- 2.39.5