]> 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 3370748ef198457a8e6dd8ddf0ecff2de86f30bd..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
@@ -132,6 +138,12 @@ static void CmdHi14areader(char *str)
        SendCommand(&c);\r
 }\r
 \r
+static void CmdHi14amifare(char *str)\r
+{\r
+       UsbCommand c={CMD_READER_MIFARE, {strtol(str, NULL, 0), 0, 0}};\r
+       SendCommand(&c);\r
+}\r
+\r
 static void CmdHi15reader(char *str)\r
 {\r
        UsbCommand c={CMD_READER_ISO_15693, {strtol(str, NULL, 0), 0, 0}};\r
@@ -202,12 +214,6 @@ static void CmdHi14asnoop(char *str)
        SendCommand(&c);\r
 }\r
 \r
-static void CmdLegicRfSim(char *str)\r
-{\r
-       UsbCommand c={CMD_SIMULATE_TAG_LEGIC_RF};\r
-       SendCommand(&c);\r
-}\r
-\r
 static void CmdLegicRfRead(char *str)\r
 {\r
        UsbCommand c={CMD_READER_LEGIC_RF};\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
@@ -2801,81 +2848,96 @@ static struct {
        int             offline;  // 1 if the command can be used when in offline mode\r
        char            *docString;\r
 } CommandTable[] = {\r
-       {"amp",                 CmdAmp,                 1, "Amplify peaks"},\r
-       {"askdemod",            Cmdaskdemod,            1, "<0|1> -- Attempt to demodulate simple ASK tags"},\r
+/* plot window / data buffer manipulation */\r
+       {"buffclear",           CmdBuffClear,           1, "Clear sample buffer and graph window"},\r
+       {"load",                        CmdLoad,                        1, "<filename> -- Load trace (to graph window"},\r
+       {"save",                        CmdSave,                        1, "<filename> -- Save trace (from graph window)"},\r
+       {"amp",                         CmdAmp,                         1, "Amplify peaks"},\r
        {"autocorr",            CmdAutoCorr,            1, "<window length> -- Autocorrelation over window"},\r
-       {"bitsamples",          CmdBitsamples,          0, "Get raw samples as bitstring"},\r
+       {"dec",                         CmdDec,                         1, "Decimate samples"},\r
+       {"hpf",                         CmdHpf,                         1, "Remove DC offset from trace"},\r
+       {"ltrim",                       CmdLtrim,                       1, "<samples> -- Trim samples from left of trace"},\r
+       {"norm",                        CmdNorm,                        1, "Normalize max/min to +/-500"},\r
+       {"plot",                        CmdPlot,                        1, "Show graph window"},\r
+       {"hide",                        CmdHide,                        1, "Hide graph window"},\r
+       {"grid",                        CmdGrid,                        1, "<x> <y> -- overlay grid on graph window, use zero value to turn off either"},\r
+       {"threshold",           CmdThreshold,           1, "Maximize/minimize every value in the graph window depending on threshold"},\r
+       {"zerocrossings",       CmdZerocrossings,       1, "Count time between zero-crossings"},\r
+       {"scale",                       CmdScale,                       1, "<int> -- Set cursor display scale"},\r
        {"bitstream",           Cmdbitstream,           1, "[clock rate] -- Convert waveform into a bitstream"},\r
-       {"buffclear",           CmdBuffClear,           1, "Clear sample buffer and graph window"},\r
-       {"dec",                 CmdDec,                 1, "Decimate samples"},\r
        {"detectclock",         Cmddetectclockrate,     1, "Detect clock rate"},\r
+       {"exit",                        CmdQuit,                        1, "Exit program"},\r
+       {"quit",                        CmdQuit,                        1, "Exit program"},\r
+\r
+/* 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
+       {"setmux",                      CmdSetMux,                      0, "<loraw|hiraw|lopkd|hipkd> -- Set the ADC mux to a specific value"},\r
+       {"version",                     CmdVersion,                     0, "Show version inforation about the connected Proxmark"},\r
+       {"lcd",                         CmdLcd,                         0, "<HEX command> <count> -- Send command/data to LCD"},\r
+       {"lcdreset",            CmdLcdReset,            0, "Hardware reset LCD"},\r
+\r
+/* data transfer functions */\r
+\r
+       {"bitsamples",          CmdBitsamples,          0, "Get raw samples as bitstring"},\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
+       {"hisamplest",          CmdHi14readt,           0, "Get samples HF, for testing"},\r
+       {"losamples",           CmdLosamples,           0, "[128 - 16000] -- Get raw samples for LF tag"},\r
        {"detectreader",        CmdDetectReader,        0, "['l'|'h'] -- Detect external reader field (option 'l' or 'h' to limit to LF or HF)"},\r
+\r
+/* (de-)modulation */\r
+\r
+       {"askdemod",            Cmdaskdemod,            1, "<0|1> -- Attempt to demodulate simple ASK tags"},\r
+       {"flexdemod",           CmdFlexdemod,           1, "Demodulate samples for FlexPass"},\r
+       {"fskdemod",            CmdFSKdemod,            1, "Demodulate graph window as a HID FSK"},\r
+       {"hi14bdemod",          CmdHi14bdemod,          1, "Demodulate ISO14443 Type B from tag"},\r
+       {"hi15demod",           CmdHi15demod,           1, "Demodulate ISO15693 from tag"},\r
+       {"hiddemod",            CmdHiddemod,            1, "Demodulate HID Prox Card II (not optimal)"},\r
+       {"hidfskdemod",         CmdHIDdemodFSK,         0, "Realtime HID FSK demodulator"},\r
+       {"indalademod",         CmdIndalademod,         1, "['224'] -- Demodulate samples for Indala 64 bit UID (option '224' for 224 bit)"},\r
+       {"mandemod",            Cmdmanchesterdemod,     1, "[i] [clock rate] -- Manchester demodulate binary stream (option 'i' to invert output)"},\r
+       {"manmod",                      Cmdmanchestermod,       1, "[clock rate] -- Manchester modulate a binary stream"},\r
+       {"tidemod",                     CmdTIDemod,                     1, "Demodulate raw bits for TI-type LF tag"},\r
+       {"vchdemod",            CmdVchdemod,            1, "['clone'] -- Demodulate samples for VeriChip"},\r
+\r
+/* simulation */\r
        {"em410xsim",           CmdEM410xsim,           1, "<UID> -- Simulate EM410x tag"},\r
+       {"hi14sim",                     CmdHi14sim,                     0, "Fake ISO 14443 tag"},\r
+       {"hi14asim",            CmdHi14asim,            0, "<UID> -- Fake ISO 14443a tag"},\r
+       {"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, "[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
        {"em410xread",          CmdEM410xread,          1, "[clock rate] -- Extract ID from EM410x tag"},\r
        {"em410xwatch",         CmdEM410xwatch,         0, "Watches for EM410x tags"},\r
        {"em4x50read",          CmdEM4x50read,          1, "Extract data from EM4x50 tag"},\r
-       {"exit",                CmdQuit,                1, "Exit program"},\r
-       {"flexdemod",           CmdFlexdemod,           1, "Demodulate samples for FlexPass"},\r
-       {"fpgaoff",             CmdFPGAOff,             0, "Set FPGA off"},\r
-       {"fskdemod",            CmdFSKdemod,            1, "Demodulate graph window as a HID FSK"},\r
-       {"grid",                CmdGrid,                1, "<x> <y> -- overlay grid on graph window, use zero value to turn off either"},\r
-       {"hexsamples",          CmdHexsamples,          0, "<blocks> -- Dump big buffer as hex bytes"},\r
        {"hi14alist",           CmdHi14alist,           0, "List ISO 14443a history"},\r
+       {"hi14amifare",         CmdHi14amifare,         0, "Read out sector 0 parity error messages"},\r
        {"hi14areader",         CmdHi14areader,         0, "Act like an ISO14443 Type A reader"},\r
-       {"hi14asim",            CmdHi14asim,            0, "<UID> -- Fake ISO 14443a tag"},\r
        {"hi14asnoop",          CmdHi14asnoop,          0, "Eavesdrop ISO 14443 Type A"},\r
-       {"hi14bdemod",          CmdHi14bdemod,          1, "Demodulate ISO14443 Type B from tag"},\r
        {"hi14list",            CmdHi14list,            0, "List ISO 14443 history"},\r
        {"hi14read",            CmdHi14read,            0, "Read HF tag (ISO 14443)"},\r
-       {"hi14sim",             CmdHi14sim,             0, "Fake ISO 14443 tag"},\r
        {"hi14snoop",           CmdHi14snoop,           0, "Eavesdrop ISO 14443"},\r
-       {"hi15demod",           CmdHi15demod,           1, "Demodulate ISO15693 from tag"},\r
        {"hi15read",            CmdHi15read,            0, "Read HF tag (ISO 15693)"},\r
        {"hi15reader",          CmdHi15reader,          0, "Act like an ISO15693 reader"},\r
-       {"hi15sim",             CmdHi15tag,             0, "Fake an ISO15693 tag"},\r
-       {"hiddemod",            CmdHiddemod,            1, "Demodulate HID Prox Card II (not optimal)"},\r
-       {"hide",                CmdHide,                1, "Hide graph window"},\r
-       {"hidfskdemod",         CmdHIDdemodFSK,         0, "Realtime HID FSK demodulator"},\r
-       {"hidsimtag",           CmdHIDsimTAG,           0, "<ID> -- HID tag simulator"},\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
-       {"hisamplest",          CmdHi14readt,           0, "Get samples HF, for testing"},\r
-       {"hisimlisten",         CmdHisimlisten,         0, "Get HF samples as fake tag"},\r
-       {"hpf",                 CmdHpf,                 1, "Remove DC offset from trace"},\r
-       {"indalademod",         CmdIndalademod,         0, "['224'] -- Demodulate samples for Indala 64 bit UID (option '224' for 224 bit)"},\r
-       {"lcd",                 CmdLcd,                 0, "<HEX command> <count> -- Send command/data to LCD"},\r
-       {"lcdreset",            CmdLcdReset,            0, "Hardware reset LCD"},\r
-       {"legicrfsim",          CmdLegicRfSim,          0, "Start the LEGIC RF tag simulator"},\r
        {"legicrfread",         CmdLegicRfRead,         0, "Start the LEGIC RF reader"},\r
-       {"load",                CmdLoad,                1, "<filename> -- Load trace (to graph window"},\r
        {"locomread",           CmdLoCommandRead,       0, "<off period> <'0' period> <'1' period> <command> ['h'] -- Modulate LF reader field to send command before read (all periods in microseconds) (option 'h' for 134)"},\r
-       {"loread",              CmdLoread,              0, "['h'] -- Read 125/134 kHz LF ID-only tag (option 'h' for 134)"},\r
-       {"losamples",           CmdLosamples,           0, "[128 - 16000] -- Get raw samples for LF tag"},\r
-       {"losim",               CmdLosim,               0, "Simulate LF tag"},\r
-       {"losimbidir",          CmdLosimBidir,          0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"},\r
-       {"ltrim",               CmdLtrim,               1, "<samples> -- Trim samples from left of trace"},\r
-       {"mandemod",            Cmdmanchesterdemod,     1, "[i] [clock rate] -- Manchester demodulate binary stream (option 'i' to invert output)"},\r
-       {"manmod",              Cmdmanchestermod,       1, "[clock rate] -- Manchester modulate a binary stream"},\r
-       {"norm",                CmdNorm,                1, "Normalize max/min to +/-500"},\r
-       {"plot",                CmdPlot,                1, "Show graph window"},\r
-       {"quit",                CmdQuit,                1, "Quit program"},\r
-       {"readmem",             CmdReadmem,             0, "[address] -- Read memory at decimal address from flash"},\r
-       {"reset",               CmdReset,               0, "Reset the Proxmark3"},\r
-       {"save",                CmdSave,                1, "<filename> -- Save trace (from graph window)"},\r
-       {"scale",               CmdScale,               1, "<int> -- Set cursor display scale"},\r
-       {"setlfdivisor",        CmdSetDivisor,          0, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)"},\r
-       {"setmux",              CmdSetMux,              0, "<loraw|hiraw|lopkd|hipkd> -- Set the ADC mux to a specific value"},\r
+       {"loread",                      CmdLoread,                      0, "['h'] -- Read 125/134 kHz LF ID-only tag (option 'h' for 134)"},\r
        {"sri512read",          CmdSri512read,          0, "<int> -- Read contents of a SRI512 tag"},\r
        {"srix4kread",          CmdSrix4kread,          0, "<int> -- Read contents of a SRIX4K tag"},\r
-       {"tidemod",             CmdTIDemod,             1, "Demodulate raw bits for TI-type LF tag"},\r
-       {"tiread",              CmdTIRead,              0, "Read and decode a TI 134 kHz tag"},\r
-       {"tiwrite",             CmdTIWrite,             0, "Write new data to a r/w TI 134 kHz tag"},\r
-       {"threshold",           CmdThreshold,           1, "Maximize/minimize every value in the graph window depending on threshold"},\r
-       {"tune",                CmdTune,                0, "Measure antenna tuning"},\r
-       {"vchdemod",            CmdVchdemod,            0, "['clone'] -- Demodulate samples for VeriChip"},\r
-       {"version",             CmdVersion,             0, "Show version inforation about the connected Proxmark"},\r
-       {"zerocrossings",       CmdZerocrossings,       1, "Count time between zero-crossings"},\r
+       {"tiread",                      CmdTIRead,                      0, "Read and decode a TI 134 kHz tag"},\r
+       {"tiwrite",                     CmdTIWrite,                     0, "Write new data to a r/w TI 134 kHz tag"},\r
 };\r
 \r
 static struct {\r
@@ -2895,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
@@ -3004,15 +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
-               printf("stored 48 samples\n");\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