]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdlft55xx.c
corrected Eagle files
[proxmark3-svn] / client / cmdlft55xx.c
index e0f89153d5f5e779eca02d784b1ef1ede7992fe2..887547248abe6e3945a4f6153bbcd493972d0e93 100644 (file)
@@ -37,7 +37,7 @@ int usage_t55xx_config(){
        PrintAndLog("Options:        ");\r
        PrintAndLog("       h                        This help");\r
        PrintAndLog("       b <8|16|32|40|50|64|100|128>     Set bitrate");\r
-       PrintAndLog("       d <FSK|FSK1|FSK1a|FSK2|FSK2a|ASK|PSK1|PSK2|NZ|BI|BIa>  Set demodulation FSK / ASK / PSK / NZ / Biphase / Biphase A");\r
+       PrintAndLog("       d <FSK|FSK1|FSK1a|FSK2|FSK2a|ASK|PSK1|PSK2|NRZ|BI|BIa>  Set demodulation FSK / ASK / PSK / NRZ / Biphase / Biphase A");\r
        PrintAndLog("       i [1]                            Invert data signal, defaults to normal");\r
        PrintAndLog("       o [offset]                       Set offset, where data should start decode in bitstream");\r
        PrintAndLog("");\r
@@ -50,24 +50,24 @@ int usage_t55xx_config(){
 }\r
 int usage_t55xx_read(){\r
        PrintAndLog("Usage:  lf t55xx read <block> <password>");\r
-    PrintAndLog("     <block>, block number to read. Between 0-7");\r
-    PrintAndLog("     <password>, OPTIONAL password (8 hex characters)");\r
-    PrintAndLog("");\r
+       PrintAndLog("     <block>, block number to read. Between 0-7");\r
+       PrintAndLog("     <password>, OPTIONAL password (8 hex characters)");\r
+       PrintAndLog("");\r
        PrintAndLog("Examples:");\r
-    PrintAndLog("      lf t55xx read 0           - read data from block 0");\r
+       PrintAndLog("      lf t55xx read 0           - read data from block 0");\r
        PrintAndLog("      lf t55xx read 0 feedbeef  - read data from block 0 password feedbeef");\r
        PrintAndLog("");\r
        return 0;\r
 }\r
 int usage_t55xx_write(){\r
        PrintAndLog("Usage:  lf t55xx wr <block> <data> [password]");\r
-    PrintAndLog("     <block>, block number to read. Between 0-7");\r
+       PrintAndLog("     <block>, block number to write. Between 0-7");\r
        PrintAndLog("     <data>,  4 bytes of data to write (8 hex characters)");\r
-    PrintAndLog("     [password], OPTIONAL password 4bytes (8 hex characters)");\r
-    PrintAndLog("");\r
+       PrintAndLog("     [password], OPTIONAL password 4bytes (8 hex characters)");\r
+       PrintAndLog("");\r
        PrintAndLog("Examples:");\r
-    PrintAndLog("      lf t55xx wd 3 11223344           - write 11223344 to block 3");\r
-       PrintAndLog("      lf t55xx wd 3 11223344 feedbeef  - write 11223344 to block 3 password feedbeef");\r
+       PrintAndLog("      lf t55xx wr 3 11223344           - write 11223344 to block 3");\r
+       PrintAndLog("      lf t55xx wr 3 11223344 feedbeef  - write 11223344 to block 3 password feedbeef");\r
        PrintAndLog("");\r
        return 0;\r
 }\r
@@ -242,6 +242,7 @@ int CmdT55xxReadBlock(const char *Cmd) {
                c.d.asBytes[0] = 0x1; \r
        }\r
 \r
+       clearCommandBuffer();\r
        SendCommand(&c);\r
        if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {\r
                PrintAndLog("command execution time out");\r
@@ -262,17 +263,15 @@ int CmdT55xxReadBlock(const char *Cmd) {
 \r
 bool DecodeT55xxBlock(){\r
        \r
-       char buf[10] = {0x00};\r
+       char buf[30] = {0x00};\r
        char *cmdStr = buf;\r
        int ans = 0;\r
        uint8_t bitRate[8] = {8,16,32,40,50,64,100,128};\r
-\r
        DemodBufferLen = 0x00;\r
 \r
        //trim 1/2 a clock from beginning\r
        snprintf(cmdStr, sizeof(buf),"%d", bitRate[config.bitrate]/2 );\r
        CmdLtrim(cmdStr);\r
-\r
        switch( config.modulation ){\r
                case DEMOD_FSK:\r
                        snprintf(cmdStr, sizeof(buf),"%d %d", bitRate[config.bitrate], config.inverted );\r
@@ -290,7 +289,7 @@ bool DecodeT55xxBlock(){
                        break;\r
                case DEMOD_ASK:\r
                        snprintf(cmdStr, sizeof(buf),"%d %d 0", bitRate[config.bitrate], config.inverted );\r
-                       ans = ASKmanDemod(cmdStr, FALSE, FALSE);\r
+                       ans = ASKDemod(cmdStr, FALSE, FALSE, 1);\r
                        break;\r
                case DEMOD_PSK1:\r
                        snprintf(cmdStr, sizeof(buf),"%d %d 0", bitRate[config.bitrate], config.inverted );\r
@@ -337,114 +336,141 @@ bool tryDetectModulation(){
        char cmdStr[8] = {0};\r
        uint8_t hits = 0;\r
        t55xx_conf_block_t tests[15];\r
-       \r
+       int bitRate=0;\r
+       uint8_t fc1 = 0, fc2 = 0, clk=0;\r
+       save_restoreGB(1);\r
        if (GetFskClock("", FALSE, FALSE)){ \r
-               uint8_t fc1 = 0, fc2 = 0, clk=0;\r
                fskClocks(&fc1, &fc2, &clk, FALSE);\r
                sprintf(cmdStr,"%d", clk/2);\r
                CmdLtrim(cmdStr);\r
-               if ( FSKrawDemod("0 0", FALSE) && test(DEMOD_FSK, &tests[hits].offset)){\r
+               if ( FSKrawDemod("0 0", FALSE) && test(DEMOD_FSK, &tests[hits].offset, &bitRate)){\r
                        tests[hits].modulation = DEMOD_FSK;\r
                        if (fc1==8 && fc2 == 5)\r
                                tests[hits].modulation = DEMOD_FSK1a;\r
                        else if (fc1==10 && fc2 == 8)\r
                                tests[hits].modulation = DEMOD_FSK2;\r
-\r
+                       tests[hits].bitrate = bitRate;\r
                        tests[hits].inverted = FALSE;\r
                        tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
                        ++hits;\r
                }\r
-               if ( FSKrawDemod("0 1", FALSE) && test(DEMOD_FSK, &tests[hits].offset)) {\r
+               if ( FSKrawDemod("0 1", FALSE) && test(DEMOD_FSK, &tests[hits].offset, &bitRate)) {\r
                        tests[hits].modulation = DEMOD_FSK;\r
-                       if (fc1==8 && fc2 == 5)\r
+                       if (fc1 == 8 && fc2 == 5)\r
                                tests[hits].modulation = DEMOD_FSK1;\r
-                       else if (fc1==10 && fc2 == 8)\r
+                       else if (fc1 == 10 && fc2 == 8)\r
                                tests[hits].modulation = DEMOD_FSK2a;\r
 \r
+                       tests[hits].bitrate = bitRate;\r
                        tests[hits].inverted = TRUE;\r
                        tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
                        ++hits;\r
                }\r
        } else {\r
-               if ( ASKmanDemod("0 0 1", FALSE, FALSE) && test(DEMOD_ASK, &tests[hits].offset)) {\r
-                       tests[hits].modulation = DEMOD_ASK;\r
-                       tests[hits].inverted = FALSE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
+               clk = GetAskClock("", FALSE, FALSE);\r
+               if (clk>0) {\r
+                       sprintf(cmdStr,"%d", clk/2);\r
+                       CmdLtrim(cmdStr);\r
+                       if ( ASKDemod("0 0 0", FALSE, FALSE, 1) && test(DEMOD_ASK, &tests[hits].offset, &bitRate)) {\r
+                               tests[hits].modulation = DEMOD_ASK;\r
+                               tests[hits].bitrate = bitRate;\r
+                               tests[hits].inverted = FALSE;\r
+                               tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                               ++hits;\r
                        }\r
-\r
-               if ( ASKmanDemod("0 1 1", FALSE, FALSE)  && test(DEMOD_ASK, &tests[hits].offset)) {\r
-                       tests[hits].modulation = DEMOD_ASK;\r
-                       tests[hits].inverted = TRUE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
+                       if ( ASKDemod("0 1 0", FALSE, FALSE, 1)  && test(DEMOD_ASK, &tests[hits].offset, &bitRate)) {\r
+                               tests[hits].modulation = DEMOD_ASK;\r
+                               tests[hits].bitrate = bitRate;\r
+                               tests[hits].inverted = TRUE;\r
+                               tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                               ++hits;\r
+                       }\r
+                       if ( ASKbiphaseDemod("0 0 0 0", FALSE) && test(DEMOD_BI, &tests[hits].offset, &bitRate) ) {\r
+                               tests[hits].modulation = DEMOD_BI;\r
+                               tests[hits].bitrate = bitRate;\r
+                               tests[hits].inverted = FALSE;\r
+                               tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                               ++hits;\r
+                       }\r
+                       if ( ASKbiphaseDemod("0 0 1 0", FALSE) && test(DEMOD_BIa, &tests[hits].offset, &bitRate) ) {\r
+                               tests[hits].modulation = DEMOD_BIa;\r
+                               tests[hits].bitrate = bitRate;\r
+                               tests[hits].inverted = TRUE;\r
+                               tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                               ++hits;\r
                        }\r
-               \r
-               if ( NRZrawDemod("0 0 1", FALSE)  && test(DEMOD_NRZ, &tests[hits].offset)) {\r
-                       tests[hits].modulation = DEMOD_NRZ;\r
-                       tests[hits].inverted = FALSE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
                }\r
+               //undo trim from ask\r
+               save_restoreGB(0);\r
+               clk = GetNrzClock("", FALSE, FALSE);\r
+               if (clk>0) {\r
+                       sprintf(cmdStr,"%d", clk/2);\r
+                       CmdLtrim(cmdStr);\r
+                       if ( NRZrawDemod("0 0 1", FALSE)  && test(DEMOD_NRZ, &tests[hits].offset, &bitRate)) {\r
+                               tests[hits].modulation = DEMOD_NRZ;\r
+                               tests[hits].bitrate = bitRate;\r
+                               tests[hits].inverted = FALSE;\r
+                               tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                               ++hits;\r
+                       }\r
 \r
-               if ( NRZrawDemod("0 1 1", FALSE)  && test(DEMOD_NRZ, &tests[hits].offset)) {\r
-                       tests[hits].modulation = DEMOD_NRZ;\r
-                       tests[hits].inverted = TRUE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
+                       if ( NRZrawDemod("0 1 1", FALSE)  && test(DEMOD_NRZ, &tests[hits].offset, &bitRate)) {\r
+                               tests[hits].modulation = DEMOD_NRZ;\r
+                               tests[hits].bitrate = bitRate;\r
+                               tests[hits].inverted = TRUE;\r
+                               tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                               ++hits;\r
                        }\r
-               \r
-               if ( PSKDemod("0 0 1", FALSE) && test(DEMOD_PSK1, &tests[hits].offset)) {\r
-                       tests[hits].modulation = DEMOD_PSK1;\r
-                       tests[hits].inverted = FALSE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
                }\r
                \r
-               if ( PSKDemod("0 1 1", FALSE) && test(DEMOD_PSK1, &tests[hits].offset)) {\r
-                       tests[hits].modulation = DEMOD_PSK1;\r
-                       tests[hits].inverted = TRUE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
-               }\r
-\r
-               // PSK2 - needs a call to psk1TOpsk2.\r
-               if ( PSKDemod("0 0 1", FALSE)) {\r
-                       psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
-                       if (test(DEMOD_PSK2, &tests[hits].offset)){\r
-                               tests[hits].modulation = DEMOD_PSK2;\r
+               //undo trim from nrz\r
+               save_restoreGB(0);\r
+               clk = GetPskClock("", FALSE, FALSE);\r
+               if (clk>0) {\r
+                       PrintAndLog("clk %d",clk);\r
+                       sprintf(cmdStr,"%d", clk/2);\r
+                       CmdLtrim(cmdStr);       \r
+                       if ( PSKDemod("0 0 1", FALSE) && test(DEMOD_PSK1, &tests[hits].offset, &bitRate)) {\r
+                               tests[hits].modulation = DEMOD_PSK1;\r
+                               tests[hits].bitrate = bitRate;\r
                                tests[hits].inverted = FALSE;\r
                                tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
                                ++hits;\r
                        }\r
-               } // inverse waves does not affect this demod\r
-\r
-               // PSK3 - needs a call to psk1TOpsk2.\r
-               if ( PSKDemod("0 0 1", FALSE)) {\r
-                       psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
-                       if (test(DEMOD_PSK3, &tests[hits].offset)){\r
-                               tests[hits].modulation = DEMOD_PSK3;\r
-                               tests[hits].inverted = FALSE;\r
+                       if ( PSKDemod("0 1 1", FALSE) && test(DEMOD_PSK1, &tests[hits].offset, &bitRate)) {\r
+                               tests[hits].modulation = DEMOD_PSK1;\r
+                               tests[hits].bitrate = bitRate;\r
+                               tests[hits].inverted = TRUE;\r
                                tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
                                ++hits;\r
                        }\r
-               } // inverse waves does not affect this demod\r
-       \r
-               if ( ASKbiphaseDemod("0 0 0 1", FALSE) && test(DEMOD_BI, &tests[hits].offset) ) {\r
-                       tests[hits].modulation = DEMOD_BI;\r
-                       tests[hits].inverted = FALSE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
-               }\r
-               if ( ASKbiphaseDemod("0 0 1 1", FALSE) && test(DEMOD_BIa, &tests[hits].offset) ) {\r
-                       tests[hits].modulation = DEMOD_BIa;\r
-                       tests[hits].inverted = TRUE;\r
-                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
-                       ++hits;\r
+                       // PSK2 - needs a call to psk1TOpsk2.\r
+                       if ( PSKDemod("0 0 1", FALSE)) {\r
+                               psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
+                               if (test(DEMOD_PSK2, &tests[hits].offset, &bitRate)){\r
+                                       tests[hits].modulation = DEMOD_PSK2;\r
+                                       tests[hits].bitrate = bitRate;\r
+                                       tests[hits].inverted = FALSE;\r
+                                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                                       ++hits;\r
+                               }\r
+                       } // inverse waves does not affect this demod\r
+                       // PSK3 - needs a call to psk1TOpsk2.\r
+                       if ( PSKDemod("0 0 1", FALSE)) {\r
+                               psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
+                               if (test(DEMOD_PSK3, &tests[hits].offset, &bitRate)){\r
+                                       tests[hits].modulation = DEMOD_PSK3;\r
+                                       tests[hits].bitrate = bitRate;\r
+                                       tests[hits].inverted = FALSE;\r
+                                       tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
+                                       ++hits;\r
+                               }\r
+                       } // inverse waves does not affect this demod\r
                }\r
        }               \r
        if ( hits == 1) {\r
                config.modulation = tests[0].modulation;\r
+               config.bitrate = tests[0].bitrate;\r
                config.inverted = tests[0].inverted;\r
                config.offset = tests[0].offset;\r
                config.block0 = tests[0].block0;\r
@@ -504,35 +530,27 @@ bool testBitRate(uint8_t readRate, uint8_t mod){
                case DEMOD_FSK2:\r
                case DEMOD_FSK2a:\r
                        detRate = GetFskClock("",FALSE, FALSE); \r
-                       if (expected[readRate] == detRate) {\r
-                               config.bitrate = readRate;\r
+                       if (expected[readRate] == detRate) \r
                                return TRUE;\r
-                       }\r
                        break;\r
                case DEMOD_ASK:\r
                case DEMOD_BI:\r
                case DEMOD_BIa:\r
                        detRate = GetAskClock("",FALSE, FALSE); \r
-                       if (expected[readRate] == detRate) {\r
-                               config.bitrate = readRate;\r
+                       if (expected[readRate] == detRate) \r
                                return TRUE;\r
-                       }\r
                        break;\r
                case DEMOD_PSK1:\r
                case DEMOD_PSK2:\r
                case DEMOD_PSK3:\r
                        detRate = GetPskClock("",FALSE, FALSE); \r
-                       if (expected[readRate] == detRate) {\r
-                               config.bitrate = readRate;\r
+                       if (expected[readRate] == detRate)\r
                                return TRUE;\r
-                       }\r
                        break;\r
                case DEMOD_NRZ:\r
                        detRate = GetNrzClock("",FALSE, FALSE); \r
-                       if (expected[readRate] == detRate) {\r
-                               config.bitrate = readRate;\r
+                       if (expected[readRate] == detRate)\r
                                return TRUE;\r
-                       }\r
                        break;\r
                default:\r
                        return FALSE;\r
@@ -540,9 +558,9 @@ bool testBitRate(uint8_t readRate, uint8_t mod){
        return FALSE;\r
 }\r
 \r
-bool test(uint8_t mode, uint8_t *offset){\r
+bool test(uint8_t mode, uint8_t *offset, int *fndBitRate){\r
 \r
-       if ( !DemodBufferLen) return FALSE;\r
+       if ( DemodBufferLen < 64 ) return FALSE;\r
        uint8_t si = 0;\r
        for (uint8_t idx = 0; idx < 64; idx++){\r
                si = idx;\r
@@ -555,7 +573,8 @@ bool test(uint8_t mode, uint8_t *offset){
                if ( resv > 0x00) continue;\r
 \r
                uint8_t xtRate   = PackBits(si, 3, DemodBuffer); si += 3;     //extended mode part of rate\r
-               uint8_t bitRate  = PackBits(si, 3, DemodBuffer); si += 3;     //bit rate\r
+               int bitRate  = PackBits(si, 3, DemodBuffer); si += 3;     //bit rate\r
+               if (bitRate > 7) continue;\r
                uint8_t extend   = PackBits(si, 1, DemodBuffer); si += 1;     //bit 15 extended mode\r
                uint8_t modread  = PackBits(si, 5, DemodBuffer); si += 5+2+1; \r
                //uint8_t pskcr   = PackBits(si, 2, DemodBuffer); si += 2+1;  //could check psk cr\r
@@ -571,6 +590,7 @@ bool test(uint8_t mode, uint8_t *offset){
                //test modulation\r
                if (!testModulation(mode, modread)) continue;\r
                if (!testBitRate(bitRate, mode)) continue;\r
+               *fndBitRate = bitRate;\r
                *offset = idx;\r
                return TRUE;\r
        }\r
@@ -651,6 +671,7 @@ int CmdT55xxWriteBlock(const char *Cmd)
        }\r
        \r
        UsbCommand c = {CMD_T55XX_WRITE_BLOCK, {data, block, 0}};\r
+       UsbCommand resp;\r
        c.d.asBytes[0] = 0x0; \r
 \r
        PrintAndLog("Writing to block: %d  data  : 0x%08X", block, data);\r
@@ -661,7 +682,12 @@ int CmdT55xxWriteBlock(const char *Cmd)
                c.d.asBytes[0] = 0x1; \r
                PrintAndLog("pwd   : 0x%08X", password);\r
        }\r
+       clearCommandBuffer();\r
        SendCommand(&c);\r
+       if (!WaitForResponseTimeout(CMD_ACK, &resp, 1000)){\r
+               PrintAndLog("Error occurred, device did not ACK write operation. (May be due to old firmware)");\r
+               return -1;\r
+       }\r
        return 0;\r
 }\r
 \r
@@ -760,10 +786,10 @@ int CmdT55xxInfo(const char *Cmd){
        \r
        if (strlen(Cmd)==0)\r
                AquireData( CONFIGURATION_BLOCK );\r
-       \r
+\r
        if (!DecodeT55xxBlock()) return 1;\r
 \r
-       if ( !DemodBufferLen) return 1;\r
+       if ( DemodBufferLen < 32) return 1;\r
 \r
        uint8_t si = config.offset;\r
        uint32_t bl0      = PackBits(si, 32, DemodBuffer);\r
@@ -859,6 +885,7 @@ int AquireData( uint8_t block ){
                // c.d.asBytes[0] = 0x1; \r
        // }\r
 \r
+       clearCommandBuffer();\r
        SendCommand(&c);\r
        if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {\r
                PrintAndLog("command execution time out");\r
@@ -873,7 +900,8 @@ int AquireData( uint8_t block ){
 }\r
 \r
 char * GetBitRateStr(uint32_t id){\r
-       static char buf[20];\r
+       static char buf[25];\r
+\r
        char *retStr = buf;\r
                switch (id){\r
                case 0: \r
Impressum, Datenschutz