mfu read block: retry block with bad CRC (#584)
authorJames Chambers <jameschambers2@gmail.com>
Fri, 23 Mar 2018 19:26:30 +0000 (15:26 -0400)
committerpwpiwi <pwpiwi@users.noreply.github.com>
Fri, 23 Mar 2018 19:26:30 +0000 (20:26 +0100)
* mfu read block: retry block with bad CRC, command timeout, or unknown response.

armsrc/mifareutil.c

index 38ca934aa01687b542744965981e6eae886a6a1a..684b5e362bdf16db312da24b662d1e8e491b5a11 100644 (file)
@@ -405,31 +405,48 @@ int mifare_ultra_auth(uint8_t *keybytes){
        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
Impressum, Datenschutz