+ iso14a_timeout = 2048; //default
+}
+
+int iso14_apdu(uint8_t * cmd, size_t cmd_len, void * data) {
+ uint8_t real_cmd[cmd_len+4];
+ real_cmd[0] = 0x0a; //I-Block
+ real_cmd[1] = 0x00; //CID: 0 //FIXME: allow multiple selected cards
+ memcpy(real_cmd+2, cmd, cmd_len);
+ AppendCrc14443a(real_cmd,cmd_len+2);
+
+ ReaderTransmit(real_cmd, cmd_len+4);
+ size_t len = ReaderReceive(data);
+ if(!len)
+ return -1; //DATA LINK ERROR
+
+ return len;
+}
+
+
+//-----------------------------------------------------------------------------
+// Read an ISO 14443a tag. Send out commands and store answers.
+//
+//-----------------------------------------------------------------------------
+void ReaderIso14443a(UsbCommand * c, UsbCommand * ack)
+{
+ iso14a_command_t param = c->arg[0];
+ uint8_t * cmd = c->d.asBytes;
+ size_t len = c->arg[1];
+
+ if(param & ISO14A_REQUEST_TRIGGER) iso14a_set_trigger(1);
+
+ if(param & ISO14A_CONNECT) {
+ iso14443a_setup();
+ ack->arg[0] = iso14443a_select_card(ack->d.asBytes, (iso14a_card_select_t *) (ack->d.asBytes+12), NULL);
+ UsbSendPacket((void *)ack, sizeof(UsbCommand));
+ }
+
+ if(param & ISO14A_SET_TIMEOUT) {
+ iso14a_timeout = c->arg[2];
+ }
+
+ if(param & ISO14A_SET_TIMEOUT) {
+ iso14a_timeout = c->arg[2];
+ }
+
+ if(param & ISO14A_APDU) {
+ ack->arg[0] = iso14_apdu(cmd, len, ack->d.asBytes);
+ UsbSendPacket((void *)ack, sizeof(UsbCommand));
+ }
+
+ if(param & ISO14A_RAW) {
+ if(param & ISO14A_APPEND_CRC) {
+ AppendCrc14443a(cmd,len);
+ len += 2;
+ }
+ ReaderTransmit(cmd,len);
+ ack->arg[0] = ReaderReceive(ack->d.asBytes);
+ UsbSendPacket((void *)ack, sizeof(UsbCommand));
+ }
+
+ if(param & ISO14A_REQUEST_TRIGGER) iso14a_set_trigger(0);
+
+ if(param & ISO14A_NO_DISCONNECT)
+ return;
+
+ FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
+ LEDsoff();
+}
+//-----------------------------------------------------------------------------
+// Read an ISO 14443a tag. Send out commands and store answers.
+//
+//-----------------------------------------------------------------------------
+void ReaderMifare(uint32_t parameter)
+{
+ // Mifare AUTH
+ uint8_t mf_auth[] = { 0x60,0x00,0xf5,0x7b };
+ uint8_t mf_nr_ar[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
+
+ uint8_t* receivedAnswer = (((uint8_t *)BigBuf) + 3560); // was 3560 - tied to other size changes
+ traceLen = 0;
+ tracing = false;
+
+ iso14443a_setup();
+