+ //Signal end of transmission
+ cmd_send(CMD_ACK,
+ 0,//data length
+ 0,//Failed blocks?
+ 0,//Not used ATM
+ card_data, 0);
+
+ LED_A_OFF();
+}
+
+void iClass_ReadCheck(uint8_t blockNo, uint8_t keyType) {
+ uint8_t readcheck[] = { keyType, blockNo };
+ uint8_t resp[] = {0,0,0,0,0,0,0,0};
+ size_t isOK = 0;
+ isOK = sendCmdGetResponseWithRetries(readcheck, sizeof(readcheck), resp, sizeof(resp), 6);
+ cmd_send(CMD_ACK,isOK,0,0,0,0);
+}
+
+void iClass_Authentication(uint8_t *MAC) {
+ uint8_t check[] = { ICLASS_CMD_CHECK, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+ uint8_t resp[ICLASS_BUFFER_SIZE];
+ memcpy(check+5,MAC,4);
+ bool isOK;
+ isOK = sendCmdGetResponseWithRetries(check, sizeof(check), resp, 4, 6);
+ cmd_send(CMD_ACK,isOK,0,0,0,0);
+}
+bool iClass_ReadBlock(uint8_t blockNo, uint8_t *readdata) {
+ uint8_t readcmd[] = {ICLASS_CMD_READ_OR_IDENTIFY, blockNo, 0x00, 0x00}; //0x88, 0x00 // can i use 0C?
+ char bl = blockNo;
+ uint16_t rdCrc = iclass_crc16(&bl, 1);
+ readcmd[2] = rdCrc >> 8;
+ readcmd[3] = rdCrc & 0xff;
+ uint8_t resp[] = {0,0,0,0,0,0,0,0,0,0};
+ bool isOK = false;
+
+ //readcmd[1] = blockNo;
+ isOK = sendCmdGetResponseWithRetries(readcmd, sizeof(readcmd), resp, 10, 10);
+ memcpy(readdata, resp, sizeof(resp));
+
+ return isOK;
+}
+
+void iClass_ReadBlk(uint8_t blockno) {
+ uint8_t readblockdata[] = {0,0,0,0,0,0,0,0,0,0};
+ bool isOK = false;
+ isOK = iClass_ReadBlock(blockno, readblockdata);
+ cmd_send(CMD_ACK, isOK, 0, 0, readblockdata, 8);
+}
+
+void iClass_Dump(uint8_t blockno, uint8_t numblks) {
+ uint8_t readblockdata[] = {0,0,0,0,0,0,0,0,0,0};
+ bool isOK = false;
+ uint8_t blkCnt = 0;
+
+ BigBuf_free();
+ uint8_t *dataout = BigBuf_malloc(255*8);
+ if (dataout == NULL){
+ Dbprintf("out of memory");
+ FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
+ LED_D_OFF();
+ cmd_send(CMD_ACK,0,1,0,0,0);
+ LED_A_OFF();
+ return;