#include <stdio.h>
#include <stdlib.h>
+#include <stdbool.h>
#include <unistd.h>
#include <usb.h>
#include <strings.h>
#include <errno.h>
-#include "translate.h"
#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;
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));
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);
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) {