Jz4740 USB utility:
* Fix potential segmentation faults * Add support for the VX767 git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18252 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
16d32d59ab
commit
438e36337c
1 changed files with 43 additions and 23 deletions
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue