]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/usb.c
fix USB send data timing issue in CMD_DOWNLOADED_SIM_SAMPLES_125K
[proxmark3-svn] / client / usb.c
index 8f5f38a7179736f69b851157a7ea8d25c25c4c22..e0836b826e17f66f6d80f040dd9fd4fb95b1a423 100644 (file)
@@ -1,6 +1,5 @@
 #include <stdio.h>
 #include <stdlib.h>
-#include <stdint.h>
 #include <stdbool.h>
 #include <unistd.h>
 #include <usb.h>
@@ -9,18 +8,20 @@
 
 #include "prox.h"
 #include "proxmark3.h"
-
+#include "../include/usb_cmd.h"
 usb_dev_handle *devh = NULL;
 static unsigned int claimed_iface = 0;
 unsigned char return_on_error = 0;
 unsigned char error_occured = 0;
+extern unsigned int current_command;
 
-void SendCommand(UsbCommand *c, bool wantAck) {
+void SendCommand(UsbCommand *c) {
        int ret;
 
 #if 0
        printf("Sending %d bytes\n", sizeof(UsbCommand));
 #endif
+       current_command = c->cmd;
        ret = usb_bulk_write(devh, 0x01, (char*)c, sizeof(UsbCommand), 1000);
        if (ret<0) {
                error_occured = 1;
@@ -40,18 +41,9 @@ void SendCommand(UsbCommand *c, bool wantAck) {
                
                return;
        }
-
-       if(wantAck) {
-               UsbCommand ack;
-               ReceiveCommand(&ack);
-               if(ack.cmd != CMD_ACK) {
-                       printf("bad ACK\n");
-                       exit(-1);
-               }
-       }
 }
 
-int ReceiveCommandP(UsbCommand *c) {
+bool ReceiveCommandPoll(UsbCommand *c) {
        int ret;
 
        bzero(c, sizeof(UsbCommand));
@@ -60,7 +52,7 @@ int ReceiveCommandP(UsbCommand *c) {
                if (ret != -ETIMEDOUT) {
                        error_occured = 1;
                        if (return_on_error)
-                               return 0;
+                               return false;
 
                        fprintf(stderr, "read failed: %s(%d)!\nTrying to reopen device...\n",
                                usb_strerror(), ret);
@@ -73,34 +65,26 @@ int ReceiveCommandP(UsbCommand *c) {
                        printf(PROXPROMPT);
                        fflush(NULL);
 
-                       return 0;
+                       return false;
                }
        } else {
                if (ret && (ret < sizeof(UsbCommand))) {
                        fprintf(stderr, "Read only %d instead of requested %d bytes!\n",
                                ret, (int)sizeof(UsbCommand));
                }
-
-#if 0
-               {
-                       int i;
-
-                       printf("Read %d bytes\n", ret);
-                       for (i = 0; i < ret; i++) {
-                               printf("0x%02X ", ((unsigned char*)c)[i]);
-                               if (!((i+1)%8))
-                                       printf("\n");
-                       }
-                       printf("\n");
-               }
-#endif
        }
 
-       return ret;
+       return ret > 0;
 }
 
 void ReceiveCommand(UsbCommand *c) {
-       while(ReceiveCommandP(c)<0) {}
+//     printf("%s()\n", __FUNCTION__);
+       int retval = 0;
+       do {
+               retval = ReceiveCommandPoll(c);
+               if (retval != 1) printf("ReceiveCommandPoll returned %d\n", retval);
+       } while(retval<0);
+//     printf("recv %x\n", c->cmd);
 }
 
 usb_dev_handle* findProxmark(int verbose, unsigned int *iface) {
Impressum, Datenschutz