also added a missing \n in the help messages Signed-off-by: Frans Meulenbroeks <fransmeulenbro...@gmail.com> --- common/cmd_usb.c | 391 ++++++++++++++++++++++++++++++++---------------------- 1 files changed, 233 insertions(+), 158 deletions(-)
as discussed before on the mailing list tested on sheevaplug diff --git a/common/cmd_usb.c b/common/cmd_usb.c index 9de515c..ef80d78 100644 --- a/common/cmd_usb.c +++ b/common/cmd_usb.c @@ -502,199 +502,274 @@ int do_usbboot(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } #endif /* CONFIG_USB_STORAGE */ +static int do_usb_reset(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ + int i; -/****************************************************************************** - * usb command intepreter - */ -int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) + usb_stop(); + printf("(Re)start USB...\n"); + i = usb_init(); +#ifdef CONFIG_USB_STORAGE + /* try to recognize storage devices immediately */ + if (i >= 0) + usb_stor_curr_dev = usb_stor_scan(1); +#endif + return 0; +} + +extern char usb_started; + +static int do_usb_tree(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) { + if (!usb_started) { + printf("USB is stopped. Please issue 'usb start' first.\n"); + return 1; + } + printf("\nDevice Tree:\n"); + usb_show_tree(usb_get_dev_index(0)); + return 0; +} +static int do_usb_info(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ + int d; int i; struct usb_device *dev = NULL; - extern char usb_started; -#ifdef CONFIG_USB_STORAGE - block_dev_desc_t *stor_dev; -#endif - if ((strncmp(argv[1], "reset", 5) == 0) || - (strncmp(argv[1], "start", 5) == 0)) { - usb_stop(); - printf("(Re)start USB...\n"); - i = usb_init(); -#ifdef CONFIG_USB_STORAGE - /* try to recognize storage devices immediately */ - if (i >= 0) - usb_stor_curr_dev = usb_stor_scan(1); -#endif + if (!usb_started) { + printf("USB is stopped. Please issue 'usb start' first.\n"); + return 1; + } + + if (argc == 1) { + for (d = 0; d < USB_MAX_DEVICE; d++) { + dev = usb_get_dev_index(d); + if (dev == NULL) + break; + usb_display_desc(dev); + usb_display_config(dev); + } return 0; + } else { + i = simple_strtoul(argv[1], NULL, 16); + printf("config for device %d\n", i); + for (d = 0; d < USB_MAX_DEVICE; d++) { + dev = usb_get_dev_index(d); + if (dev == NULL) + break; + if (dev->devnum == i) + break; + } + if (dev == NULL) { + printf("*** NO Device avaiable ***\n"); + return 0; + } else { + usb_display_desc(dev); + usb_display_config(dev); + } } - if (strncmp(argv[1], "stop", 4) == 0) { + return 0; +} + +#if defined(CONFIG_USB_STORAGE) +static int do_usb_stop(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ #ifdef CONFIG_USB_KEYBOARD - if (argc == 2) { - if (usb_kbd_deregister() != 0) { - printf("USB not stopped: usbkbd still" - " using USB\n"); - return 1; - } - } else { - /* forced stop, switch console in to serial */ - console_assign(stdin, "serial"); - usb_kbd_deregister(); + if (argc == 1) { + if (usb_kbd_deregister() != 0) { + printf("USB not stopped: usbkbd still" + " using USB\n"); + return 1; } -#endif - printf("stopping USB..\n"); - usb_stop(); - return 0; + } else { + /* forced stop, switch console in to serial */ + console_assign(stdin, "serial"); + usb_kbd_deregister(); } +#endif + printf("stopping USB..\n"); + usb_stop(); + return 0; +} + +static int do_usb_storage(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ if (!usb_started) { printf("USB is stopped. Please issue 'usb start' first.\n"); return 1; } - if (strncmp(argv[1], "tree", 4) == 0) { - printf("\nDevice Tree:\n"); - usb_show_tree(usb_get_dev_index(0)); - return 0; + return usb_stor_info(); +} + +static int do_usb_dev(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ + block_dev_desc_t *stor_dev; + + if (!usb_started) { + printf("USB is stopped. Please issue 'usb start' first.\n"); + return 1; } - if (strncmp(argv[1], "inf", 3) == 0) { - int d; - if (argc == 2) { - for (d = 0; d < USB_MAX_DEVICE; d++) { - dev = usb_get_dev_index(d); - if (dev == NULL) - break; - usb_display_desc(dev); - usb_display_config(dev); - } - return 0; - } else { - int d; - - i = simple_strtoul(argv[2], NULL, 16); - printf("config for device %d\n", i); - for (d = 0; d < USB_MAX_DEVICE; d++) { - dev = usb_get_dev_index(d); - if (dev == NULL) - break; - if (dev->devnum == i) - break; - } - if (dev == NULL) { - printf("*** NO Device avaiable ***\n"); - return 0; - } else { - usb_display_desc(dev); - usb_display_config(dev); - } + if (argc == 2) { + int dev = (int)simple_strtoul(argv[1], NULL, 10); + printf("\nUSB device %d: ", dev); + if (dev >= USB_MAX_STOR_DEV) { + printf("unknown device\n"); + return 1; } + printf("\n Device %d: ", dev); + stor_dev = usb_stor_get_dev(dev); + dev_print(stor_dev); + if (stor_dev->type == DEV_TYPE_UNKNOWN) + return 1; + usb_stor_curr_dev = dev; + printf("... is now current device\n"); + return 0; + } else { + printf("\nUSB device %d: ", usb_stor_curr_dev); + stor_dev = usb_stor_get_dev(usb_stor_curr_dev); + dev_print(stor_dev); + if (stor_dev->type == DEV_TYPE_UNKNOWN) + return 1; return 0; } -#ifdef CONFIG_USB_STORAGE - if (strncmp(argv[1], "stor", 4) == 0) - return usb_stor_info(); - - if (strncmp(argv[1], "part", 4) == 0) { - int devno, ok = 0; - if (argc == 2) { - for (devno = 0; devno < USB_MAX_STOR_DEV; ++devno) { - stor_dev = usb_stor_get_dev(devno); - if (stor_dev->type != DEV_TYPE_UNKNOWN) { - ok++; - if (devno) - printf("\n"); - printf("print_part of %x\n", devno); - print_part(stor_dev); - } - } - } else { - devno = simple_strtoul(argv[2], NULL, 16); + return 0; +} + +static int do_usb_part(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ + int devno, ok = 0; + block_dev_desc_t *stor_dev; + + if (!usb_started) { + printf("USB is stopped. Please issue 'usb start' first.\n"); + return 1; + } + if (argc == 1) { + for (devno = 0; devno < USB_MAX_STOR_DEV; ++devno) { stor_dev = usb_stor_get_dev(devno); if (stor_dev->type != DEV_TYPE_UNKNOWN) { ok++; + if (devno) + printf("\n"); printf("print_part of %x\n", devno); print_part(stor_dev); } } - if (!ok) { - printf("\nno USB devices available\n"); - return 1; + } else { + devno = simple_strtoul(argv[1], NULL, 16); + stor_dev = usb_stor_get_dev(devno); + if (stor_dev->type != DEV_TYPE_UNKNOWN) { + ok++; + printf("print_part of %x\n", devno); + print_part(stor_dev); } - return 0; } - if (strcmp(argv[1], "read") == 0) { - if (usb_stor_curr_dev < 0) { - printf("no current device selected\n"); - return 1; - } - if (argc == 5) { - unsigned long addr = simple_strtoul(argv[2], NULL, 16); - unsigned long blk = simple_strtoul(argv[3], NULL, 16); - unsigned long cnt = simple_strtoul(argv[4], NULL, 16); - unsigned long n; - printf("\nUSB read: device %d block # %ld, count %ld" - " ... ", usb_stor_curr_dev, blk, cnt); - stor_dev = usb_stor_get_dev(usb_stor_curr_dev); - n = stor_dev->block_read(usb_stor_curr_dev, blk, cnt, - (ulong *)addr); - printf("%ld blocks read: %s\n", n, - (n == cnt) ? "OK" : "ERROR"); - if (n == cnt) - return 0; - return 1; - } + if (!ok) { + printf("\nno USB devices available\n"); + return 1; } - if (strcmp(argv[1], "write") == 0) { - if (usb_stor_curr_dev < 0) { - printf("no current device selected\n"); - return 1; - } - if (argc == 5) { - unsigned long addr = simple_strtoul(argv[2], NULL, 16); - unsigned long blk = simple_strtoul(argv[3], NULL, 16); - unsigned long cnt = simple_strtoul(argv[4], NULL, 16); - unsigned long n; - printf("\nUSB write: device %d block # %ld, count %ld" - " ... ", usb_stor_curr_dev, blk, cnt); - stor_dev = usb_stor_get_dev(usb_stor_curr_dev); - n = stor_dev->block_write(usb_stor_curr_dev, blk, cnt, - (ulong *)addr); - printf("%ld blocks write: %s\n", n, - (n == cnt) ? "OK" : "ERROR"); - if (n == cnt) - return 0; - return 1; - } + return 0; +} + +static int do_usb_read(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ + block_dev_desc_t *stor_dev; + + if (!usb_started) { + printf("USB is stopped. Please issue 'usb start' first.\n"); + return 1; } - if (strncmp(argv[1], "dev", 3) == 0) { - if (argc == 3) { - int dev = (int)simple_strtoul(argv[2], NULL, 10); - printf("\nUSB device %d: ", dev); - if (dev >= USB_MAX_STOR_DEV) { - printf("unknown device\n"); - return 1; - } - printf("\n Device %d: ", dev); - stor_dev = usb_stor_get_dev(dev); - dev_print(stor_dev); - if (stor_dev->type == DEV_TYPE_UNKNOWN) - return 1; - usb_stor_curr_dev = dev; - printf("... is now current device\n"); - return 0; - } else { - printf("\nUSB device %d: ", usb_stor_curr_dev); - stor_dev = usb_stor_get_dev(usb_stor_curr_dev); - dev_print(stor_dev); - if (stor_dev->type == DEV_TYPE_UNKNOWN) - return 1; + if (usb_stor_curr_dev < 0) { + printf("no current device selected\n"); + return 1; + } + if (argc == 4) { + unsigned long addr = simple_strtoul(argv[1], NULL, 16); + unsigned long blk = simple_strtoul(argv[2], NULL, 16); + unsigned long cnt = simple_strtoul(argv[3], NULL, 16); + unsigned long n; + printf("\nUSB read: device %d block # %ld, count %ld" + " ... ", usb_stor_curr_dev, blk, cnt); + stor_dev = usb_stor_get_dev(usb_stor_curr_dev); + n = stor_dev->block_read(usb_stor_curr_dev, blk, cnt, + (ulong *)addr); + printf("%ld blocks read: %s\n", n, + (n == cnt) ? "OK" : "ERROR"); + if (n == cnt) return 0; - } - return 0; } -#endif /* CONFIG_USB_STORAGE */ cmd_usage(cmdtp); return 1; } +static int do_usb_write(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ + block_dev_desc_t *stor_dev; + + if (!usb_started) { + printf("USB is stopped. Please issue 'usb start' first.\n"); + return 1; + } + if (usb_stor_curr_dev < 0) { + printf("no current device selected\n"); + return 1; + } + if (argc == 4) { + unsigned long addr = simple_strtoul(argv[1], NULL, 16); + unsigned long blk = simple_strtoul(argv[2], NULL, 16); + unsigned long cnt = simple_strtoul(argv[3], NULL, 16); + unsigned long n; + printf("\nUSB write: device %d block # %ld, count %ld" + " ... ", usb_stor_curr_dev, blk, cnt); + stor_dev = usb_stor_get_dev(usb_stor_curr_dev); + n = stor_dev->block_write(usb_stor_curr_dev, blk, cnt, + (ulong *)addr); + printf("%ld blocks write: %s\n", n, + (n == cnt) ? "OK" : "ERROR"); + if (n == cnt) + return 0; + } + cmd_usage(cmdtp); + return 1; +} +#endif /* CONFIG_USB_STORAGE */ + +static cmd_tbl_t cmd_usb_sub[] = { + U_BOOT_CMD_MKENT(reset, 1, 0, do_usb_reset, "", ""), + U_BOOT_CMD_MKENT(start, 1, 0, do_usb_reset, "", ""), + U_BOOT_CMD_MKENT(tree, 1, 0, do_usb_tree, "", ""), + U_BOOT_CMD_MKENT(info, 2, 0, do_usb_info, "", ""), +#if defined(CONFIG_USB_STORAGE) + U_BOOT_CMD_MKENT(stop, 2, 0, do_usb_stop, "", ""), + U_BOOT_CMD_MKENT(storage, 1, 0, do_usb_storage, "", ""), + U_BOOT_CMD_MKENT(dev, 2, 0, do_usb_dev, "", ""), + U_BOOT_CMD_MKENT(part, 2, 0, do_usb_part, "", ""), + U_BOOT_CMD_MKENT(read, 4, 0, do_usb_read, "", ""), + U_BOOT_CMD_MKENT(write, 4, 0, do_usb_write, "", ""), +#endif /* CONFIG_USB_STORAGE */ +}; + +/****************************************************************************** + * usb command intepreter + */ +static int do_usb(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ + cmd_tbl_t *c; + + /* Strip off leading 'usb' command argument */ + argc--; + argv++; + + c = find_cmd_tbl(argv[0], &cmd_usb_sub[0], ARRAY_SIZE(cmd_usb_sub)); + + if (c) { + return c->cmd(cmdtp, flag, argc, argv); + } else { + cmd_usage(cmdtp); + return 1; + } +} + #ifdef CONFIG_USB_STORAGE U_BOOT_CMD( usb, 5, 1, do_usb, @@ -708,7 +783,7 @@ U_BOOT_CMD( "usb part [dev] - print partition table of one or all USB storage" " devices\n" "usb read addr blk# cnt - read `cnt' blocks starting at block `blk#'\n" - " to memory address `addr'" + " to memory address `addr'\n" "usb write addr blk# cnt - write `cnt' blocks starting at block `blk#'\n" " from memory address `addr'" ); -- 1.6.4.2 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot