summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--utils/jz4740_tools/jz4740_usbtool.c66
1 files changed, 43 insertions, 23 deletions
diff --git a/utils/jz4740_tools/jz4740_usbtool.c b/utils/jz4740_tools/jz4740_usbtool.c
index bc26804bdd..14fed4c878 100644
--- a/utils/jz4740_tools/jz4740_usbtool.c
+++ b/utils/jz4740_tools/jz4740_usbtool.c
@@ -362,7 +362,7 @@ unsigned int read_file(const char *name, unsigned char **buffer)
int len, n;
fd = fopen(name, "rb");
- if (fd < 0)
+ if (fd == NULL)
{
fprintf(stderr, "[ERR] Could not open %s\n", name);
return 0;
@@ -397,12 +397,16 @@ unsigned int read_file(const char *name, unsigned char **buffer)
SEND_COMMAND(VR_SET_DATA_ADDRESS, a); \
fprintf(stderr, " Done!\n");
#define _SEND_FILE(a) fsize = read_file(a, &buffer); \
+ if(fsize == 0) \
+ return -1; \
fprintf(stderr, "[INFO] Sending file %s: %d bytes...", a, fsize); \
SEND_DATA(buffer, fsize); \
free(buffer); \
fprintf(stderr, " Done!\n");
#define _VERIFY_DATA(a,c) fprintf(stderr, "[INFO] Verifying data (%s)...", a); \
fsize = read_file(a, &buffer); \
+ if(fsize == 0) \
+ return -1; \
buffer2 = (unsigned char*)malloc(fsize); \
SEND_COMMAND(VR_SET_DATA_ADDRESS, c); \
SEND_COMMAND(VR_SET_DATA_LENGTH, fsize); \
@@ -424,7 +428,7 @@ unsigned int read_file(const char *name, unsigned char **buffer)
#else
#define _SLEEP(x) sleep(x);
#endif
-int mimic_of(usb_dev_handle *dh)
+int mimic_of(usb_dev_handle *dh, bool vx767)
{
int err, fsize;
unsigned char *buffer, *buffer2;
@@ -495,12 +499,19 @@ int mimic_of(usb_dev_handle *dh)
_GET_CPU;
_FLUSH;
_GET_CPU;
- _STAGE2(0x80E00008);
+ if(vx767)
+ {
+ _STAGE2(0x80E10008);
+ }
+ else
+ {
+ _STAGE2(0x80E00008);
+ }
fprintf(stderr, "[INFO] Done!\n");
return 0;
}
-void jzconnect(int address, unsigned char* buf, int len, int func)
+int jzconnect(int address, unsigned char* buf, int len, int func)
{
struct usb_bus *bus;
struct usb_device *tmp_dev;
@@ -514,26 +525,24 @@ void jzconnect(int address, unsigned char* buf, int len, int func)
if(usb_find_busses() < 0)
{
fprintf(stderr, "[ERR] Could not find any USB busses.\n");
- return;
+ return -2;
}
if (usb_find_devices() < 0)
{
fprintf(stderr, "[ERR] USB devices not found(nor hubs!).\n");
- return;
+ return -3;
}
for (bus = usb_get_busses(); bus; bus = bus->next)
{
for (tmp_dev = bus->devices; tmp_dev; tmp_dev = tmp_dev->next)
{
- //printf("Found Vendor %04x Product %04x\n",tmp_dev->descriptor.idVendor, tmp_dev->descriptor.idProduct);
if (tmp_dev->descriptor.idVendor == VID &&
tmp_dev->descriptor.idProduct == PID)
{
dev = tmp_dev;
goto found;
-
}
}
}
@@ -542,14 +551,14 @@ void jzconnect(int address, unsigned char* buf, int len, int func)
{
fprintf(stderr, "[ERR] Device not found.\n");
fprintf(stderr, "[ERR] Ensure your device is in USB boot mode and run usbtool again.\n");
- return;
+ return -4;
}
found:
if ( (dh = usb_open(dev)) == NULL)
{
fprintf(stderr,"[ERR] Unable to open device.\n");
- return;
+ return -5;
}
err = usb_set_configuration(dh, 1);
@@ -558,7 +567,7 @@ found:
{
fprintf(stderr, "[ERR] usb_set_configuration failed (%d, %s)\n", err, usb_strerror());
usb_close(dh);
- return;
+ return -6;
}
/* "must be called" written in the libusb documentation */
@@ -567,7 +576,7 @@ found:
{
fprintf(stderr, "[ERR] Unable to claim interface (%d, %s)\n", err, usb_strerror());
usb_close(dh);
- return;
+ return -7;
}
fprintf(stderr,"[INFO] Found device, uploading application.\n");
@@ -590,7 +599,8 @@ found:
err = probe_device(dh);
break;
case 6:
- err = mimic_of(dh);
+ case 7:
+ err = mimic_of(dh, (func == 7));
break;
}
@@ -598,6 +608,8 @@ found:
usb_release_interface(dh, 0);
usb_close(dh);
+
+ return err;
}
void print_usage(void)
@@ -608,15 +620,20 @@ void print_usage(void)
fprintf(stderr, "Usage: usbtool [CMD] [FILE] [ADDRESS] [LEN]\n");
#endif
fprintf(stderr, "\t[ADDRESS] has to be in 0xHEXADECIMAL format\n");
- fprintf(stderr, "\t[CMD]:\n\t\t1 -> upload file to specified address and boot from it\n\t\t2 -> read data from [ADDRESS] with length [LEN] to [FILE]\n");
- fprintf(stderr, "\t\t3 -> read device status\n\t\t4 -> probe keys (only Onda VX747)\n");
- fprintf(stderr, "\t\t5 -> same as 1 but do a stage 2 boot\n\t\t6 -> mimic OF fw recovery\n");
+ fprintf(stderr, "\t[CMD]:\n");
+ fprintf(stderr, "\t\t1 -> upload file to specified address and boot from it\n");
+ fprintf(stderr, "\t\t2 -> read data from [ADDRESS] with length [LEN] to [FILE]\n");
+ fprintf(stderr, "\t\t3 -> read device status\n");
+ fprintf(stderr, "\t\t4 -> probe keys (only Onda VX747)\n");
+ fprintf(stderr, "\t\t5 -> same as 1 but do a stage 2 boot\n");
+ fprintf(stderr, "\t\t6 -> mimic VX747 OF fw recovery\n");
+ fprintf(stderr, "\t\t7 -> mimic VX767 OF fw recovery\n");
#ifdef _WIN32
- fprintf(stderr, "\nExample:\n\t usbtool.exe 1 fw.bin 0x80000000");
- fprintf(stderr, "\n\t usbtool.exe 2 save.bin 0x81000000 1024");
+ fprintf(stderr, "\nExample:\n\t usbtool.exe 1 fw.bin 0x80000000\n");
+ fprintf(stderr, "\t usbtool.exe 2 save.bin 0x81000000 1024\n");
#else
- fprintf(stderr, "\nExample:\n\t usbtool 1 fw.bin 0x80000000");
- fprintf(stderr, "\n\t usbtool 2 save.bin 0x81000000 1024");
+ fprintf(stderr, "\nExample:\n\t usbtool 1 fw.bin 0x80000000\n");
+ fprintf(stderr, "\t usbtool 2 save.bin 0x81000000 1024\n");
#endif
}
@@ -682,7 +699,7 @@ int main(int argc, char* argv[])
fprintf(stderr, "[INFO] File size: %d bytes\n", n);
- jzconnect(address, buf, len, cmd);
+ return jzconnect(address, buf, len, cmd);
break;
case 2:
if (sscanf(argv[3], "0x%x", &address) <= 0)
@@ -708,7 +725,7 @@ int main(int argc, char* argv[])
return 6;
}
- jzconnect(address, buf, len, 2);
+ int err = jzconnect(address, buf, len, 2);
n = fwrite(buf, 1, len, fd);
if (n != len)
@@ -718,11 +735,14 @@ int main(int argc, char* argv[])
return 7;
}
fclose(fd);
+
+ return err;
break;
case 3:
case 4:
case 6:
- jzconnect(address, NULL, 0, cmd);
+ case 7:
+ return jzconnect(address, NULL, 0, cmd);
break;
default:
print_usage();