diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index 5861b3d17..9fabe1d18 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -104,10 +104,12 @@ #define ISO15693_MAX_COMMAND_LENGTH 45 // allows write single block with the maximum block size of 256bits. Write multiple blocks not supported yet // 32 + 2 crc + 1 -#define ISO15_MAX_FRAME 35 -#define CMD_ID_RESP 5 -#define CMD_READ_RESP 13 -#define CMD_INV_RESP 12 +#define ISO15_MAX_FRAME 35 +#define CMD_ID_RESP 5 +#define CMD_READ_RESP 13 +#define CMD_INV_RESP 12 +#define CMD_SYSINFO_RESP 17 +#define CMD_READBLOCK_RESP 7 //#define Crc(data, len) Crc(CRC_15693, (data), (len)) #define CheckCrc15(data, len) check_crc(CRC_15693, (data), (len)) @@ -1679,27 +1681,7 @@ void SimTagIso15693(uint8_t *uid) { LED_C_ON(); - // Build INVENTORY command - uint8_t resp_inv[CMD_INV_RESP] = {0}; - resp_inv[0] = 0; // No error, no protocol format extension - resp_inv[1] = 0; // DSFID (data storage format identifier). 0x00 = not supported - - // 64-bit UID - resp_inv[2] = uid[7]; - resp_inv[3] = uid[6]; - resp_inv[4] = uid[5]; - resp_inv[5] = uid[4]; - resp_inv[6] = uid[3]; - resp_inv[7] = uid[2]; - resp_inv[8] = uid[1]; - resp_inv[9] = uid[0]; - - // CRC - AddCrc15(resp_inv, 10); - CodeIso15693AsTag(resp_inv, CMD_INV_RESP); - - tosend_t *ts = get_tosend(); enum { NO_FIELD, IDLE, ACTIVATED, SELECTED, HALTED } chip_state = NO_FIELD; @@ -1745,11 +1727,96 @@ void SimTagIso15693(uint8_t *uid) { if ((cmd_len >= 5) && (cmd[0] & ISO15_REQ_INVENTORY) && (cmd[1] == ISO15_CMD_INVENTORY)) { bool slow = !(cmd[0] & ISO15_REQ_DATARATE_HIGH); uint32_t response_time = reader_eof_time + DELAY_ISO15693_VCD_TO_VICC_SIM; + // Build INVENTORY command + uint8_t resp_inv[CMD_INV_RESP] = {0}; + + resp_inv[0] = 0; // No error, no protocol format extension + resp_inv[1] = 0; // DSFID (data storage format identifier). 0x00 = not supported + + // 64-bit UID + resp_inv[2] = uid[7]; + resp_inv[3] = uid[6]; + resp_inv[4] = uid[5]; + resp_inv[5] = uid[4]; + resp_inv[6] = uid[3]; + resp_inv[7] = uid[2]; + resp_inv[8] = uid[1]; + resp_inv[9] = uid[0]; + + // CRC + AddCrc15(resp_inv, 10); + CodeIso15693AsTag(resp_inv, CMD_INV_RESP); + + tosend_t *ts = get_tosend(); + TransmitTo15693Reader(ts->buf, ts->max, &response_time, 0, slow); LogTrace_ISO15693(resp_inv, CMD_INV_RESP, response_time * 32, (response_time * 32) + (ts->max * 32 * 64), NULL, false); chip_state = SELECTED; } + + // GET_SYSTEM_INFO + if ((cmd[1] == ISO15_CMD_SYSINFO)) { + bool slow = !(cmd[0] & ISO15_REQ_DATARATE_HIGH); + uint32_t response_time = reader_eof_time + DELAY_ISO15693_VCD_TO_VICC_SIM; + + // Build GET_SYSTEM_INFO command + uint8_t resp_sysinfo[CMD_SYSINFO_RESP] = {0}; + + resp_sysinfo[0] = 0; // Response flags. + resp_sysinfo[1] = 0x0F; // Information flags. + + // 64-bit UID + resp_sysinfo[2] = uid[7]; + resp_sysinfo[3] = uid[6]; + resp_sysinfo[4] = uid[5]; + resp_sysinfo[5] = uid[4]; + resp_sysinfo[6] = uid[3]; + resp_sysinfo[7] = uid[2]; + resp_sysinfo[8] = uid[1]; + resp_sysinfo[9] = uid[0]; + + resp_sysinfo[10] = 0; // DSFID + resp_sysinfo[11] = 0; // AFI + + resp_sysinfo[12] = 0x1B; // Memory size [0]. + resp_sysinfo[13] = 0x03; // Memory size [1]. + resp_sysinfo[14] = 0x01; // Memory size [2]. + + // CRC + AddCrc15(resp_sysinfo, 15); + CodeIso15693AsTag(resp_sysinfo, CMD_SYSINFO_RESP); + + tosend_t *ts = get_tosend(); + + TransmitTo15693Reader(ts->buf, ts->max, &response_time, 0, slow); + LogTrace_ISO15693(resp_sysinfo, CMD_SYSINFO_RESP, response_time * 32, (response_time * 32) + (ts->max * 32 * 64), NULL, false); + } + + // READ_BLOCK + if ((cmd[1] == ISO15_CMD_READ)) { + bool slow = !(cmd[0] & ISO15_REQ_DATARATE_HIGH); + uint32_t response_time = reader_eof_time + DELAY_ISO15693_VCD_TO_VICC_SIM; + + // Build GET_SYSTEM_INFO command + uint8_t resp_readblock[CMD_READBLOCK_RESP] = {0}; + + resp_readblock[0] = 0; // Response flags. + resp_readblock[1] = 0; // Block data. + resp_readblock[2] = 0; // Block data. + resp_readblock[3] = 0; // Block data. + resp_readblock[4] = 0; // Block data. + + // CRC + AddCrc15(resp_readblock, 5); + CodeIso15693AsTag(resp_readblock, CMD_READBLOCK_RESP); + + tosend_t *ts = get_tosend(); + + + TransmitTo15693Reader(ts->buf, ts->max, &response_time, 0, slow); + LogTrace_ISO15693(resp_readblock, CMD_READBLOCK_RESP, response_time * 32, (response_time * 32) + (ts->max * 32 * 64), NULL, false); + } } switch_off(); diff --git a/test.cmd b/test.cmd new file mode 100644 index 000000000..c70608298 --- /dev/null +++ b/test.cmd @@ -0,0 +1,2 @@ +hw version +hw version