summaryrefslogtreecommitdiff
path: root/utils/imxtools/sbtools
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2012-12-13 16:02:58 +0100
committerAmaury Pouly <amaury.pouly@gmail.com>2012-12-13 16:02:58 +0100
commit788bf2e3b25a52fa0dca3cf1266a6570391b83a7 (patch)
tree62feb4693bf3af5ca6fa92b15676745edc7edc26 /utils/imxtools/sbtools
parent153bc0d7ec9f261072d18dde6d4356394ad4c1dc (diff)
downloadrockbox-788bf2e3b25a52fa0dca3cf1266a6570391b83a7.tar.gz
rockbox-788bf2e3b25a52fa0dca3cf1266a6570391b83a7.zip
imxtools/sbloader: implement stmp36xx recovery support
Change-Id: I6cfb432cd474ca00d7dff77577c0aa499b78fe2d
Diffstat (limited to 'utils/imxtools/sbtools')
-rw-r--r--utils/imxtools/sbtools/sbloader.c32
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
27void put32le(uint8_t *buf, uint32_t i) 31void 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
130int send_recovery(libusb_device_handle *dev, int xfer_size, uint8_t *data, int size, int nr_xfers) 134int 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
134int main(int argc, char **argv) 162int main(int argc, char **argv)