diff options
-rw-r--r-- | utils/jz4760_tools/usbboot.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/utils/jz4760_tools/usbboot.c b/utils/jz4760_tools/usbboot.c index 0d7c7242fd..b6c378f538 100644 --- a/utils/jz4760_tools/usbboot.c +++ b/utils/jz4760_tools/usbboot.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <libusb.h> | 25 | #include <libusb.h> |
26 | #include <getopt.h> | 26 | #include <getopt.h> |
27 | #include <stdbool.h> | 27 | #include <stdbool.h> |
28 | #include <unistd.h> | ||
28 | 29 | ||
29 | #define VR_GET_CPU_INFO 0 | 30 | #define VR_GET_CPU_INFO 0 |
30 | #define VR_SET_DATA_ADDRESS 1 | 31 | #define VR_SET_DATA_ADDRESS 1 |
@@ -200,12 +201,24 @@ int renumerate(libusb_device_handle **dev) | |||
200 | return 0; | 201 | return 0; |
201 | } | 202 | } |
202 | 203 | ||
204 | int jz_stage1(libusb_device_handle *dev, unsigned long addr, const char *file) | ||
205 | { | ||
206 | int ret = jz_set_addr(dev, addr); | ||
207 | if(ret != 0) | ||
208 | return ret; | ||
209 | ret = jz_download(dev, file); | ||
210 | if(ret != 0) | ||
211 | return ret; | ||
212 | return jz_start1(dev, addr); | ||
213 | } | ||
214 | |||
203 | void usage() | 215 | void usage() |
204 | { | 216 | { |
205 | printf("Usage: usbboot [options]\n"); | 217 | printf("Usage: usbboot [options]\n"); |
206 | printf("\n"); | 218 | printf("\n"); |
207 | printf("Basic options:\n"); | 219 | printf("Basic options:\n"); |
208 | printf(" --stage1 <file> Upload first stage program (<=16Kio)\n"); | 220 | printf(" --stage1 <file> Upload first stage program (<=16Kio)\n"); |
221 | printf(" --s1-addr <addr> Change first stage address (default is 0x80000000)\n"); | ||
209 | printf(" --stage2 <file> Upload second stage program to SDRAM\n"); | 222 | printf(" --stage2 <file> Upload second stage program to SDRAM\n"); |
210 | printf(" --s2-addr <addr> Change second stage address (default is 0x80000000)\n"); | 223 | printf(" --s2-addr <addr> Change second stage address (default is 0x80000000)\n"); |
211 | printf(" --ram <target> Setup SDRAM for <target>, see list below\n"); | 224 | printf(" --ram <target> Setup SDRAM for <target>, see list below\n"); |
@@ -253,9 +266,11 @@ int main(int argc, char **argv) | |||
253 | enum | 266 | enum |
254 | { | 267 | { |
255 | OPT_ADDR = 0x100, OPT_LENGTH, OPT_UPLOAD, OPT_CPUINFO, OPT_DOWNLOAD, | 268 | OPT_ADDR = 0x100, OPT_LENGTH, OPT_UPLOAD, OPT_CPUINFO, OPT_DOWNLOAD, |
256 | OPT_START1, OPT_WAIT, OPT_RENUMERATE, OPT_START2, OPT_FLUSH_CACHES | 269 | OPT_START1, OPT_WAIT, OPT_RENUMERATE, OPT_START2, OPT_FLUSH_CACHES, |
270 | OPT_S1_ADDR, OPT_STAGE1 | ||
257 | }; | 271 | }; |
258 | unsigned long last_length = 0; | 272 | unsigned long last_length = 0; |
273 | unsigned long s1_addr = 0x80000000; | ||
259 | while(1) | 274 | while(1) |
260 | { | 275 | { |
261 | static struct option long_options[] = | 276 | static struct option long_options[] = |
@@ -271,13 +286,16 @@ int main(int argc, char **argv) | |||
271 | {"renumerate", no_argument, 0, OPT_RENUMERATE}, | 286 | {"renumerate", no_argument, 0, OPT_RENUMERATE}, |
272 | {"start2", required_argument, 0, OPT_START2}, | 287 | {"start2", required_argument, 0, OPT_START2}, |
273 | {"flush-caches", no_argument, 0, OPT_FLUSH_CACHES}, | 288 | {"flush-caches", no_argument, 0, OPT_FLUSH_CACHES}, |
289 | {"s1-addr", required_argument, 0, OPT_S1_ADDR}, | ||
290 | {"stage1", required_argument, 0, OPT_STAGE1}, | ||
274 | {0, 0, 0, 0} | 291 | {0, 0, 0, 0} |
275 | }; | 292 | }; |
276 | 293 | ||
277 | int c = getopt_long(argc, argv, "hv", long_options, NULL); | 294 | int c = getopt_long(argc, argv, "hv", long_options, NULL); |
278 | char *end = 0; | 295 | char *end = 0; |
279 | unsigned long param; | 296 | unsigned long param; |
280 | if(c == OPT_ADDR || c == OPT_LENGTH || c == OPT_START1 || c== OPT_WAIT) | 297 | if(c == OPT_ADDR || c == OPT_LENGTH || c == OPT_START1 || c == OPT_WAIT |
298 | || c == OPT_S1_ADDR) | ||
281 | { | 299 | { |
282 | param = strtoul(optarg, &end, 0); | 300 | param = strtoul(optarg, &end, 0); |
283 | if(*end) | 301 | if(*end) |
@@ -333,6 +351,12 @@ int main(int argc, char **argv) | |||
333 | case OPT_FLUSH_CACHES: | 351 | case OPT_FLUSH_CACHES: |
334 | ret = jz_flush_caches(dev); | 352 | ret = jz_flush_caches(dev); |
335 | break; | 353 | break; |
354 | case OPT_S1_ADDR: | ||
355 | s1_addr = param; | ||
356 | break; | ||
357 | case OPT_STAGE1: | ||
358 | ret = jz_stage1(dev, s1_addr, optarg); | ||
359 | break; | ||
336 | } | 360 | } |
337 | if(ret != 0) | 361 | if(ret != 0) |
338 | break; | 362 | break; |
@@ -346,4 +370,4 @@ int main(int argc, char **argv) | |||
346 | libusb_close(dev); | 370 | libusb_close(dev); |
347 | libusb_exit(NULL); | 371 | libusb_exit(NULL); |
348 | return ret; | 372 | return ret; |
349 | } \ No newline at end of file | 373 | } |