return 1;\r
}\r
\r
+\r
+#define MFU_MAX_RETRIES 5\r
int mifare_ultra_readblock(uint8_t blockNo, uint8_t *blockData)\r
{\r
uint16_t len;\r
uint8_t bt[2];\r
uint8_t receivedAnswer[MAX_FRAME_SIZE];\r
uint8_t receivedAnswerPar[MAX_PARITY_SIZE];\r
- \r
+ uint8_t retries;\r
+ int result = 0;\r
\r
- len = mifare_sendcmd_short(NULL, 1, 0x30, blockNo, receivedAnswer, receivedAnswerPar, NULL);\r
- if (len == 1) {\r
- if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: %02x", receivedAnswer[0]);\r
- return 1;\r
- }\r
- if (len != 18) {\r
- if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: card timeout. len: %x", len);\r
- return 2;\r
+ for (retries = 0; retries < MFU_MAX_RETRIES; retries++) {\r
+ len = mifare_sendcmd_short(NULL, 1, 0x30, blockNo, receivedAnswer, receivedAnswerPar, NULL);\r
+ if (len == 1) {\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: %02x", receivedAnswer[0]);\r
+ result = 1;\r
+ continue;\r
+ }\r
+ if (len != 18) {\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: card timeout. len: %x", len);\r
+ result = 2;\r
+ continue;\r
+ }\r
+\r
+ memcpy(bt, receivedAnswer + 16, 2);\r
+ AppendCrc14443a(receivedAnswer, 16);\r
+ if (bt[0] != receivedAnswer[16] || bt[1] != receivedAnswer[17]) {\r
+ if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd CRC response error.");\r
+ result = 3;\r
+ continue;\r
+ }\r
+\r
+ // No errors encountered; don't retry\r
+ result = 0;\r
+ break;\r
}\r
- \r
- memcpy(bt, receivedAnswer + 16, 2);\r
- AppendCrc14443a(receivedAnswer, 16);\r
- if (bt[0] != receivedAnswer[16] || bt[1] != receivedAnswer[17]) {\r
- if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd CRC response error.");\r
- return 3;\r
+\r
+ if (result != 0) {\r
+ Dbprintf("Cmd Error: too many retries; read failed");\r
+ return result;\r
}\r
- \r
+\r
memcpy(blockData, receivedAnswer, 14);\r
return 0;\r
}\r