forked from len0rd/rockbox
adfuload: Improve arguments parsing
Change-Id: If18975f13d20bb7f7232cafdb4ea87fa516b5750
This commit is contained in:
parent
d11704fed5
commit
df2ac7428f
1 changed files with 89 additions and 43 deletions
|
@ -258,24 +258,29 @@ static void adfu_execute(libusb_device_handle *hdev, uint32_t address)
|
||||||
|
|
||||||
static void usage(char *name)
|
static void usage(char *name)
|
||||||
{
|
{
|
||||||
printf("usage: (sudo) %s [-e] -s1 stage1.bin -s2 stage2.bin\n", name);
|
printf("usage: (sudo) %s [-u vid:pid] [-e] -s1 stage1.bin -s2 stage2.bin\n", name);
|
||||||
printf("stage1.bin - binary of the stage1 (ADEC_N63.BIN for example)\n");
|
printf("stage1.bin Binary of the stage1 (ADEC_N63.BIN for example)\n");
|
||||||
printf("stage2.bin - binary of the custom user code\n");
|
printf("stage2.bin Binary of the custom user code\n");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("options:\n");
|
printf("options:\n");
|
||||||
printf("-e - encode stage1 binary as needed by brom adfu mode\n");
|
printf("-u|--usb vid:pid Override device PID and PID (default 0x%04x:0x%04x)\n",
|
||||||
|
VENDORID, PRODUCTID);
|
||||||
|
printf("-e Encode stage1 binary as needed by brom adfu mode\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
int main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
uint16_t pid = PRODUCTID;
|
||||||
|
uint16_t vid = VENDORID;
|
||||||
|
|
||||||
libusb_device_handle *hdev;
|
libusb_device_handle *hdev;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int i = 1;
|
int i = 1;
|
||||||
uint8_t *buf;
|
uint8_t *buf;
|
||||||
uint32_t filesize, filesize_round;
|
uint32_t filesize, filesize_round;
|
||||||
char *s1_filename, *s2_filename;
|
char *s1_filename = NULL, *s2_filename = NULL;
|
||||||
bool encode = false;
|
bool encode = false;
|
||||||
FILE *fp;
|
FILE *fp = NULL;
|
||||||
|
|
||||||
while (i < argc)
|
while (i < argc)
|
||||||
{
|
{
|
||||||
|
@ -306,6 +311,35 @@ int main (int argc, char **argv)
|
||||||
s2_filename = argv[i];
|
s2_filename = argv[i];
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
else if ((strcmp(argv[i],"-u")==0) || (strcmp(argv[i],"--usb")==0))
|
||||||
|
{
|
||||||
|
if (i + 1 == argc)
|
||||||
|
{
|
||||||
|
fprintf(stderr,"Missing argument for USB IDs\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
char *svid = argv[i + 1];
|
||||||
|
char *spid = strchr(svid, ':');
|
||||||
|
if(svid == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr,"Invalid argument for USB IDs (missing ':')\n");
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
char *end;
|
||||||
|
vid = strtoul(svid, &end, 0);
|
||||||
|
if(*end != ':')
|
||||||
|
{
|
||||||
|
fprintf(stderr,"Invalid argument for USB VID\n");
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
pid = strtoul(spid + 1, &end, 0);
|
||||||
|
if(*end)
|
||||||
|
{
|
||||||
|
fprintf(stderr,"Invalid argument for USB PID\n");
|
||||||
|
return -4;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
|
@ -313,6 +347,12 @@ int main (int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!s1_filename)
|
||||||
|
{
|
||||||
|
usage(argv[0]);
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
|
||||||
/* print banner */
|
/* print banner */
|
||||||
fprintf(stderr,"adfuload " VERSION "\n");
|
fprintf(stderr,"adfuload " VERSION "\n");
|
||||||
fprintf(stderr,"(C) Marcin Bukat 2013\n");
|
fprintf(stderr,"(C) Marcin Bukat 2013\n");
|
||||||
|
@ -322,10 +362,10 @@ int main (int argc, char **argv)
|
||||||
/* initialize libusb */
|
/* initialize libusb */
|
||||||
libusb_init(NULL);
|
libusb_init(NULL);
|
||||||
|
|
||||||
hdev = libusb_open_device_with_vid_pid(NULL, VENDORID, PRODUCTID);
|
hdev = libusb_open_device_with_vid_pid(NULL, vid, pid);
|
||||||
if (hdev == NULL)
|
if (hdev == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[error]: can't open device with VID:PID=0x%0x:0x%0x\n", VENDORID, PRODUCTID);
|
fprintf(stderr, "[error]: can't open device with VID:PID = 0x%0x:0x%0x\n", vid, pid);
|
||||||
libusb_exit(NULL);
|
libusb_exit(NULL);
|
||||||
return -4;
|
return -4;
|
||||||
}
|
}
|
||||||
|
@ -401,7 +441,6 @@ int main (int argc, char **argv)
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
fprintf(stderr, "[info]: file %s\n", s2_filename);
|
|
||||||
|
|
||||||
if (encode)
|
if (encode)
|
||||||
{
|
{
|
||||||
|
@ -420,45 +459,52 @@ int main (int argc, char **argv)
|
||||||
adfu_execute(hdev, 0xb4040000);
|
adfu_execute(hdev, 0xb4040000);
|
||||||
/* Now ADEC_N63.BIN should be operational */
|
/* Now ADEC_N63.BIN should be operational */
|
||||||
|
|
||||||
/* upload custom binary and run it */
|
if (s2_filename)
|
||||||
fp = fopen(s2_filename, "rb");
|
|
||||||
|
|
||||||
if (fp == NULL)
|
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[error]: could not open file \"%s\"\n", s2_filename);
|
fprintf(stderr, "[info]: file %s\n", s2_filename);
|
||||||
ret = -20;
|
|
||||||
goto end;
|
/* upload custom binary and run it */
|
||||||
|
fp = fopen(s2_filename, "rb");
|
||||||
|
|
||||||
|
if (fp == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "[error]: could not open file \"%s\"\n", s2_filename);
|
||||||
|
ret = -20;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
filesize = (uint32_t)ftell(fp);
|
||||||
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
|
||||||
|
buf = realloc(buf, filesize);
|
||||||
|
|
||||||
|
if (buf == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "[error]: can't allocate %d bytes of memory\n", filesize);
|
||||||
|
ret = -21;
|
||||||
|
goto end_fclose;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fread(buf, 1, filesize, fp) != filesize)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "[error]: can't read file: %s\n", s2_filename);
|
||||||
|
ret = -22;
|
||||||
|
goto end_free;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "[info]: file %s\n", s2_filename);
|
||||||
|
/* upload binary to the begining of DRAM */
|
||||||
|
adfu_upload(hdev, buf, filesize, 0xa0000000);
|
||||||
|
adfu_execute(hdev, 0xa0000000);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
fseek(fp, 0, SEEK_END);
|
fp = NULL;
|
||||||
filesize = (uint32_t)ftell(fp);
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
|
||||||
|
|
||||||
buf = realloc(buf, filesize);
|
|
||||||
|
|
||||||
if (buf == NULL)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "[error]: can't allocate %d bytes of memory\n", filesize);
|
|
||||||
ret = -21;
|
|
||||||
goto end_fclose;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fread(buf, 1, filesize, fp) != filesize)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "[error]: can't read file: %s\n", s2_filename);
|
|
||||||
ret = -22;
|
|
||||||
goto end_free;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "[info]: file %s\n", s2_filename);
|
|
||||||
/* upload binary to the begining of DRAM */
|
|
||||||
adfu_upload(hdev, buf, filesize, 0xa0000000);
|
|
||||||
adfu_execute(hdev, 0xa0000000);
|
|
||||||
|
|
||||||
end_free:
|
end_free:
|
||||||
free(buf);
|
if (buf) {free(buf);}
|
||||||
end_fclose:
|
end_fclose:
|
||||||
fclose(fp);
|
if (fp) {fclose(fp);}
|
||||||
end:
|
end:
|
||||||
libusb_close(hdev);
|
libusb_close(hdev);
|
||||||
libusb_exit(NULL);
|
libusb_exit(NULL);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue