summaryrefslogtreecommitdiffstats
path: root/commands/dfu.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2014-08-07 13:13:58 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2014-08-07 20:34:28 +0200
commit7782c08047fc44874caf1c03c153a070f9ac557a (patch)
tree54ef13545a93221b2b4598822c3f3b830c2c82d4 /commands/dfu.c
parent038be0fbb5e983a498752b283319ba926f994a4b (diff)
parent46ff98b011c86511a8585a01fa3c4fbb774c9c54 (diff)
downloadbarebox-7782c08047fc44874caf1c03c153a070f9ac557a.tar.gz
barebox-7782c08047fc44874caf1c03c153a070f9ac557a.tar.xz
Merge branch 'for-next/usb-gadget'
Conflicts: commands/Makefile common/Kconfig common/Makefile drivers/usb/gadget/dfu.c
Diffstat (limited to 'commands/dfu.c')
-rw-r--r--commands/dfu.c136
1 files changed, 10 insertions, 126 deletions
diff --git a/commands/dfu.c b/commands/dfu.c
index 7f78f3bbc2..3f52bbdd98 100644
--- a/commands/dfu.c
+++ b/commands/dfu.c
@@ -24,71 +24,7 @@
#include <fs.h>
#include <xfuncs.h>
#include <usb/dfu.h>
-
-#define PARSE_DEVICE 0
-#define PARSE_NAME 1
-#define PARSE_FLAGS 2
-
-static int dfu_do_parse_one(char *partstr, char **endstr, struct usb_dfu_dev *dfu)
-{
- int i = 0, state = PARSE_DEVICE;
- char device[PATH_MAX];
- char name[PATH_MAX];
-
- memset(device, 0, sizeof(device));
- memset(name, 0, sizeof(name));
- dfu->flags = 0;
-
- while (*partstr && *partstr != ',') {
- switch (state) {
- case PARSE_DEVICE:
- if (*partstr == '(') {
- state = PARSE_NAME;
- i = 0;
- } else {
- device[i++] = *partstr;
- }
- break;
- case PARSE_NAME:
- if (*partstr == ')') {
- state = PARSE_FLAGS;
- i = 0;
- } else {
- name[i++] = *partstr;
- }
- break;
- case PARSE_FLAGS:
- switch (*partstr) {
- case 's':
- dfu->flags |= DFU_FLAG_SAFE;
- break;
- case 'r':
- dfu->flags |= DFU_FLAG_READBACK;
- break;
- case 'c':
- dfu->flags |= DFU_FLAG_CREATE;
- break;
- default:
- return -EINVAL;
- }
- break;
- default:
- return -EINVAL;
- }
- partstr++;
- }
-
- if (state != PARSE_FLAGS)
- return -EINVAL;
-
- dfu->name = xstrdup(name);
- dfu->dev = xstrdup(device);
- if (*partstr == ',')
- partstr++;
- *endstr = partstr;
-
- return 0;
-}
+#include <linux/err.h>
/* dfu /dev/self0(bootloader)sr,/dev/nand0.root.bb(root)
*
@@ -97,73 +33,26 @@ static int dfu_do_parse_one(char *partstr, char **endstr, struct usb_dfu_dev *df
*/
static int do_dfu(int argc, char *argv[])
{
- int opt, n = 0;
- struct usb_dfu_pdata pdata;
- char *endptr, *argstr;
+ struct f_dfu_opts opts;
+ char *argstr;
struct usb_dfu_dev *dfu_alts = NULL;
- char *manufacturer = "barebox";
- const char *productname = barebox_get_model();
- u16 idVendor = 0, idProduct = 0;
int ret;
- while((opt = getopt(argc, argv, "m:p:V:P:")) > 0) {
- switch(opt) {
- case 'm':
- manufacturer = optarg;
- break;
- case 'p':
- productname = optarg;
- break;
- case 'V':
- idVendor = simple_strtoul(optarg, NULL, 0);
- break;
- case 'P':
- idProduct = simple_strtoul(optarg, NULL, 0);
- break;
- }
- }
-
if (argc != optind + 1)
return COMMAND_ERROR_USAGE;
argstr = argv[optind];
- if (!idProduct && !idVendor) {
- idVendor = 0x1d50; /* Openmoko, Inc */
- idProduct = 0x60a2; /* barebox bootloader USB DFU Mode */
- }
-
- if ((idProduct && !idVendor) || (!idProduct && idVendor)) {
- printf("Only one of vendor id or product id given\n");
- return -EINVAL;
+ opts.files = file_list_parse(argstr);
+ if (IS_ERR(opts.files)) {
+ ret = PTR_ERR(opts.files);
+ goto out;
}
- for (n = 0; *argstr; n++) {
- dfu_alts = xrealloc(dfu_alts, sizeof(*dfu_alts) * (n + 1));
- if (dfu_do_parse_one(argstr, &endptr, &dfu_alts[n])) {
- printf("parse error\n");
- ret = -EINVAL;
- goto out;
- }
- argstr = endptr;
- }
-
- pdata.alts = dfu_alts;
- pdata.num_alts = n;
-
- pdata.manufacturer = manufacturer;
- pdata.productname = productname;
- pdata.idVendor = idVendor;
- pdata.idProduct = idProduct;
-
- ret = usb_dfu_register(&pdata);
+ ret = usb_dfu_register(&opts);
+ file_list_free(opts.files);
out:
- while (n) {
- n--;
- free(dfu_alts[n].name);
- free(dfu_alts[n].dev);
- };
free(dfu_alts);
@@ -182,17 +71,12 @@ BAREBOX_CMD_HELP_TEXT("'s': safe mode (download the complete image before flashi
BAREBOX_CMD_HELP_TEXT("'r': readback of the firmware is allowed; ")
BAREBOX_CMD_HELP_TEXT("'c': the file will be created (for use with regular files).")
BAREBOX_CMD_HELP_TEXT("")
-BAREBOX_CMD_HELP_TEXT("Options:")
-BAREBOX_CMD_HELP_OPT ("-m STR", "Manufacturer string (barebox)")
-BAREBOX_CMD_HELP_OPT ("-p STR", "product string")
-BAREBOX_CMD_HELP_OPT ("-V ID", "vendor id")
-BAREBOX_CMD_HELP_OPT ("-P ID", "product id")
BAREBOX_CMD_HELP_END
BAREBOX_CMD_START(dfu)
.cmd = do_dfu,
BAREBOX_CMD_DESC("device firmware update")
- BAREBOX_CMD_OPTS("[-mpVP] DESC")
+ BAREBOX_CMD_OPTS("DESC")
BAREBOX_CMD_GROUP(CMD_GRP_MISC)
BAREBOX_CMD_HELP(cmd_dfu_help)
BAREBOX_CMD_END