X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/7fe9b0b742d7dae9c5af1d292d11840b5c3cbfae..a553f2674865fa544d04ca7b8194e30c008644ae:/client/proxusb.c diff --git a/client/proxusb.c b/client/proxusb.c index be37fc69..0a50b991 100644 --- a/client/proxusb.c +++ b/client/proxusb.c @@ -1,3 +1,13 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2010 iZsh +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// USB utilities +//----------------------------------------------------------------------------- + #include #include #include @@ -6,10 +16,16 @@ #include #include +#include "sleep.h" #include "proxusb.h" #include "proxmark3.h" #include "usb_cmd.h" +// It seems to be missing for mingw +#ifndef ETIMEDOUT +#define ETIMEDOUT 116 +#endif + usb_dev_handle *devh = NULL; static unsigned int claimed_iface = 0; unsigned char return_on_error = 0; @@ -37,7 +53,7 @@ void SendCommand(UsbCommand *c) usb_close(devh); devh = NULL; } - while(!(devh=OpenProxmark(0))) { sleep(1); } + while(!OpenProxmark(0)) { sleep(1); } printf(PROXPROMPT); fflush(NULL); @@ -49,7 +65,7 @@ bool ReceiveCommandPoll(UsbCommand *c) { int ret; - bzero(c, sizeof(UsbCommand)); + memset(c, 0, sizeof (UsbCommand)); ret = usb_bulk_read(devh, 0x82, (char*)c, sizeof(UsbCommand), 500); if (ret<0) { if (ret != -ETIMEDOUT) { @@ -64,7 +80,7 @@ bool ReceiveCommandPoll(UsbCommand *c) usb_close(devh); devh = NULL; } - while(!(devh=OpenProxmark(0))) { sleep(1); } + while(!OpenProxmark(0)) { sleep(1); } printf(PROXPROMPT); fflush(NULL); @@ -130,7 +146,7 @@ usb_dev_handle* OpenProxmark(int verbose) usb_dev_handle *handle = NULL; unsigned int iface; -#ifndef __APPLE__ +#ifdef __linux__ handle = findProxmark(verbose, &iface); if (!handle) return NULL; @@ -143,20 +159,28 @@ usb_dev_handle* OpenProxmark(int verbose) if (!handle) return NULL; -#ifndef __APPLE__ +#ifdef __linux__ /* detach kernel driver first */ ret = usb_detach_kernel_driver_np(handle, iface); /* don't complain if no driver attached */ if (ret<0 && ret != -61 && verbose) fprintf(stderr, "detach kernel driver failed: (%d) %s!\n", ret, usb_strerror()); #endif + + // Needed for Windows. Optional for Mac OS and Linux + ret = usb_set_configuration(handle, 1); + if (ret < 0) { + if (verbose) + fprintf(stderr, "configuration set failed: %s!\n", usb_strerror()); + return NULL; + } + ret = usb_claim_interface(handle, iface); if (ret < 0) { if (verbose) fprintf(stderr, "claim failed: %s!\n", usb_strerror()); return NULL; } - claimed_iface = iface; devh = handle; return handle; @@ -166,4 +190,5 @@ void CloseProxmark(void) { usb_release_interface(devh, claimed_iface); usb_close(devh); + devh = NULL; }