diff options
Diffstat (limited to 'utils/imxtools/sbtools')
-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 @@ | |||
24 | #include <libusb.h> | 24 | #include <libusb.h> |
25 | #include <stdint.h> | 25 | #include <stdint.h> |
26 | 26 | ||
27 | #ifndef MIN | ||
28 | #define MIN(a,b) ((a) < (b) ? (a) : (b)) | ||
29 | #endif | ||
30 | |||
27 | void put32le(uint8_t *buf, uint32_t i) | 31 | void put32le(uint8_t *buf, uint32_t i) |
28 | { | 32 | { |
29 | *buf++ = i & 0xff; | 33 | *buf++ = i & 0xff; |
@@ -67,8 +71,8 @@ int send_hid(libusb_device_handle *dev, int xfer_size, uint8_t *data, int size, | |||
67 | libusb_detach_kernel_driver(dev, 0); | 71 | libusb_detach_kernel_driver(dev, 0); |
68 | libusb_detach_kernel_driver(dev, 4); | 72 | libusb_detach_kernel_driver(dev, 4); |
69 | 73 | ||
70 | libusb_claim_interface (dev, 0); | 74 | libusb_claim_interface(dev, 0); |
71 | libusb_claim_interface (dev, 4); | 75 | libusb_claim_interface(dev, 4); |
72 | 76 | ||
73 | uint8_t *xfer_buf = malloc(1 + xfer_size); | 77 | uint8_t *xfer_buf = malloc(1 + xfer_size); |
74 | uint8_t *p = xfer_buf; | 78 | uint8_t *p = xfer_buf; |
@@ -129,6 +133,30 @@ int send_hid(libusb_device_handle *dev, int xfer_size, uint8_t *data, int size, | |||
129 | 133 | ||
130 | int send_recovery(libusb_device_handle *dev, int xfer_size, uint8_t *data, int size, int nr_xfers) | 134 | int send_recovery(libusb_device_handle *dev, int xfer_size, uint8_t *data, int size, int nr_xfers) |
131 | { | 135 | { |
136 | (void) nr_xfers; | ||
137 | // there should be no kernel driver attached but in doubt... | ||
138 | libusb_detach_kernel_driver(dev, 0); | ||
139 | libusb_claim_interface(dev, 0); | ||
140 | |||
141 | int sent = 0; | ||
142 | while(sent < size) | ||
143 | { | ||
144 | int xfered; | ||
145 | int len = MIN(size - sent, xfer_size); | ||
146 | int ret = libusb_bulk_transfer(dev, 1, data + sent, len, &xfered, 1000); | ||
147 | if(ret < 0) | ||
148 | { | ||
149 | printf("transfer error at send offset %d\n", sent); | ||
150 | return 1; | ||
151 | } | ||
152 | if(xfered == 0) | ||
153 | { | ||
154 | printf("empty transfer at step offset %d\n", sent); | ||
155 | return 2; | ||
156 | } | ||
157 | sent += xfered; | ||
158 | } | ||
159 | return 0; | ||
132 | } | 160 | } |
133 | 161 | ||
134 | int main(int argc, char **argv) | 162 | int main(int argc, char **argv) |