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;
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;
}
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:
// 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]);
}
case 9:
case 11: {
- uint8_t cmdBit = (cmd[1] & 1);
+
uint16_t address = (cmd[2] << 7) | cmd[1] >> 1;
if (cmdBit == LEGIC_READ)
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;