diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2012-12-13 16:02:58 +0100 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2012-12-13 16:02:58 +0100 |
commit | 788bf2e3b25a52fa0dca3cf1266a6570391b83a7 (patch) | |
tree | 62feb4693bf3af5ca6fa92b15676745edc7edc26 | |
parent | 153bc0d7ec9f261072d18dde6d4356394ad4c1dc (diff) |
imxtools/sbloader: implement stmp36xx recovery support
Change-Id: I6cfb432cd474ca00d7dff77577c0aa499b78fe2d
-rw-r--r-- | utils/imxtools/sbtools/sbloader.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/utils/imxtools/sbtools/sbloader.c b/utils/imxtools/sbtools/sbloader.c index 854bb85965..a5bc8c18fb 100644 --- a/utils/imxtools/sbtools/sbloader.c +++ b/utils/imxtools/sbtools/sbloader.c @@ -24,6 +24,10 @@ #include <libusb.h> #include <stdint.h> +#ifndef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + void put32le(uint8_t *buf, uint32_t i) { *buf++ = i & 0xff; @@ -67,8 +71,8 @@ int send_hid(libusb_device_handle *dev, int xfer_size, uint8_t *data, int size, libusb_detach_kernel_driver(dev, 0); libusb_detach_kernel_driver(dev, 4); - libusb_claim_interface (dev, 0); - libusb_claim_interface (dev, 4); + libusb_claim_interface(dev, 0); + libusb_claim_interface(dev, 4); uint8_t *xfer_buf = malloc(1 + xfer_size); uint8_t *p = xfer_buf; @@ -129,6 +133,30 @@ int send_hid(libusb_device_handle *dev, int xfer_size, uint8_t *data, int size, int send_recovery(libusb_device_handle *dev, int xfer_size, uint8_t *data, int size, int nr_xfers) { + (void) nr_xfers; + // there should be no kernel driver attached but in doubt... + libusb_detach_kernel_driver(dev, 0); + libusb_claim_interface(dev, 0); + + int sent = 0; + while(sent < size) + { + int xfered; + int len = MIN(size - sent, xfer_size); + int ret = libusb_bulk_transfer(dev, 1, data + sent, len, &xfered, 1000); + if(ret < 0) + { + printf("transfer error at send offset %d\n", sent); + return 1; + } + if(xfered == 0) + { + printf("empty transfer at step offset %d\n", sent); + return 2; + } + sent += xfered; + } + return 0; } int main(int argc, char **argv) |