]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/command.c
fix USB send data timing issue in CMD_DOWNLOADED_SIM_SAMPLES_125K
[proxmark3-svn] / client / command.c
index 9bfb18f24a349a449dce842122ff5259c801960d..0d954258c0a8511c47183e02ca7c37753b04daef 100644 (file)
@@ -93,6 +93,12 @@ static void CmdTune(char *str)
        SendCommand(&c);\r
 }\r
 \r
+static void CmdHiTune(char *str)\r
+{\r
+       UsbCommand c={CMD_MEASURE_ANTENNA_TUNING_HF};\r
+       SendCommand(&c);\r
+}\r
+\r
 static void CmdHi15read(char *str)\r
 {\r
        UsbCommand c={CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693};\r
@@ -571,7 +577,6 @@ retest:
 static void CmdEM410xsim(char *str)\r
 {\r
        int i, n, j, h, binary[4], parity[4];\r
-       char *s = "0";\r
 \r
        /* clock is 64 in EM410x tags */\r
        int clock = 64;\r
@@ -622,12 +627,40 @@ static void CmdEM410xsim(char *str)
        }\r
 \r
        /* modulate that biatch */\r
-       Cmdmanchestermod(s);\r
+       Cmdmanchestermod("");\r
 \r
        /* booyah! */\r
        RepaintGraphWindow();\r
+       \r
+       CmdLosim("");\r
+}\r
+\r
+/* simulate an LF Manchester encoded tag with specified bitstream, clock rate and inter-id gap */\r
+static void CmdLosimManchester(char *str)\r
+{\r
+       static int clock, gap;\r
+       static char data[1024], gapstring[8];\r
+       int i;\r
+\r
+       /* get settings/bits */\r
+       sscanf(str, "%i %s %i", &clock, &data[0], &gap);\r
+\r
+       /* clear our graph */\r
+       CmdClearGraph(0);\r
+\r
+       /* fill it with our bitstream */\r
+       for (i= 0; i < strlen(data) ; ++i)\r
+               CmdAppendGraph(0, clock, data[i]- '0');\r
+\r
+       /* modulate */\r
+       Cmdmanchestermod("");\r
+\r
+       /* show what we've done */\r
+       RepaintGraphWindow();\r
 \r
-       CmdLosim(s);\r
+       /* simulate */\r
+       sprintf(&gapstring[0], "%i", gap);\r
+       CmdLosim(gapstring);\r
 }\r
 \r
 static void ChkBitstream(char *str)\r
@@ -648,10 +681,14 @@ static void ChkBitstream(char *str)
 static void CmdLosim(char *str)\r
 {\r
        int i;\r
+       static int gap;\r
+\r
+       sscanf(str,"%i",&gap);\r
 \r
        /* convert to bitstream if necessary */\r
        ChkBitstream(str);\r
 \r
+       PrintToScrollback("Sending data, please wait...");\r
        for (i = 0; i < GraphTraceLen; i += 48) {\r
                UsbCommand c={CMD_DOWNLOADED_SIM_SAMPLES_125K, {i, 0, 0}};\r
                int j;\r
@@ -659,9 +696,11 @@ static void CmdLosim(char *str)
                        c.d.asBytes[j] = GraphBuffer[i+j];\r
                }\r
                SendCommand(&c);\r
+               wait_for_response(CMD_ACK);\r
        }\r
 \r
-       UsbCommand c={CMD_SIMULATE_TAG_125K, {GraphTraceLen, 0, 0}};\r
+       PrintToScrollback("Starting simulator...");\r
+       UsbCommand c={CMD_SIMULATE_TAG_125K, {GraphTraceLen, gap, 0}};\r
        SendCommand(&c);\r
 }\r
 \r
@@ -847,7 +886,15 @@ static int CmdHisamplest(char *str, int nrlow)
 static void CmdHexsamples(char *str)\r
 {\r
        int i, j, n;\r
-       int requested = strtol(str, NULL, 0);\r
+       int requested = 0;\r
+       int offset = 0;\r
+       sscanf(str, "%i %i", &requested, &offset);\r
+       if (offset % 4!=0) {\r
+               PrintToScrollback("Offset must be a multiple of 4");\r
+               return;\r
+       }\r
+       offset = offset/4;                \r
+\r
        int delivered = 0;\r
 \r
        if (requested == 0) {\r
@@ -857,7 +904,7 @@ static void CmdHexsamples(char *str)
                n = requested/4;\r
        }\r
 \r
-       for(i = 0; i < n; i += 12) {\r
+       for(i = offset; i < n+offset; i += 12) {\r
                UsbCommand c = {CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K, {i, 0, 0}};\r
                SendCommand(&c);\r
                wait_for_response(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K);\r
@@ -2825,6 +2872,7 @@ static struct {
 /* low-level hardware control */\r
        {"fpgaoff",                     CmdFPGAOff,                     0, "Set FPGA off"},\r
        {"tune",                        CmdTune,                        0, "Measure antenna tuning"},\r
+       {"hitune",                      CmdHiTune,                      0, "Continuously measure HF antenna tuning"},\r
        {"readmem",                     CmdReadmem,                     0, "[address] -- Read memory at decimal address from flash"},\r
        {"reset",                       CmdReset,                       0, "Reset the Proxmark3"},\r
        {"setlfdivisor",        CmdSetDivisor,          0, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)"},\r
@@ -2836,7 +2884,7 @@ static struct {
 /* data transfer functions */\r
 \r
        {"bitsamples",          CmdBitsamples,          0, "Get raw samples as bitstring"},\r
-       {"hexsamples",          CmdHexsamples,          0, "<blocks> -- Dump big buffer as hex bytes"},\r
+       {"hexsamples",          CmdHexsamples,          0, "<blocks> [<offset>] -- Dump big buffer as hex bytes"},\r
        {"higet",                       CmdHi14read_sim,        0, "<samples> -- Get samples HF, 'analog'"},\r
        {"hisamples",           CmdHisamples,           0, "Get raw samples for HF tag"},\r
        {"hisampless",          CmdHisampless,          0, "<samples> -- Get signed raw samples, HF tag"},\r
@@ -2866,7 +2914,8 @@ static struct {
        {"hi15sim",                     CmdHi15tag,                     0, "Fake an ISO15693 tag"},\r
        {"hidsimtag",           CmdHIDsimTAG,           0, "<ID> -- HID tag simulator"},\r
        {"hisimlisten",         CmdHisimlisten,         0, "Get HF samples as fake tag"},\r
-       {"losim",                       CmdLosim,                       0, "Simulate LF tag"},\r
+       {"losim",                       CmdLosim,                       0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"},\r
+       {"losimman",                    CmdLosimManchester,                     0, "<Clock> <Bitstream> [GAP] Simulate arbitrary Manchester LF tag"},\r
        {"losimbidir",          CmdLosimBidir,          0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"},\r
 \r
 /* card reading functions */\r
@@ -2908,7 +2957,7 @@ static struct {
 void CommandReceived(char *cmd)\r
 {\r
        int i;\r
-       char line[256];\r
+       char line[512];\r
 \r
        PrintToScrollback("> %s", cmd);\r
 \r
@@ -3017,14 +3066,19 @@ void UsbCommandReceived(UsbCommand *c)
        /* Maybe it's a response: */\r
        switch(current_command) {\r
                case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K:\r
-               if (c->cmd != CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K) goto unexpected_response;\r
-               int i;\r
-               for(i=0; i<48; i++) sample_buf[i] = c->d.asBytes[i];\r
-               received_command = c->cmd;\r
-               return;\r
-       default:\r
-       unexpected_response:\r
-               PrintToScrollback("unrecognized command %08x\n", c->cmd);\r
-               break;\r
+                       if (c->cmd != CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K) goto unexpected_response;\r
+                       int i;\r
+                       for(i=0; i<48; i++) sample_buf[i] = c->d.asBytes[i];\r
+                       received_command = c->cmd;\r
+                       return;\r
+               case CMD_DOWNLOADED_SIM_SAMPLES_125K:\r
+                       if (c->cmd != CMD_ACK) goto unexpected_response;\r
+                       // got ACK\r
+                       received_command = c->cmd;\r
+                       return;\r
+               default:\r
+               unexpected_response:\r
+                       PrintToScrollback("unrecognized command %08x\n", c->cmd);\r
+                       break;\r
        }\r
 }\r
Impressum, Datenschutz