summaryrefslogtreecommitdiff
path: root/utils/jz4760_tools/usbboot.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/jz4760_tools/usbboot.c')
-rw-r--r--utils/jz4760_tools/usbboot.c30
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
204int 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
203void usage() 215void 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}