From d5a108ece39a1a32dd888f33937b5db8d9b3ba70 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Thu, 5 Jul 2007 18:01:55 +0200 Subject: svn_rev_462 - Add help texts for many commands. - Let the linker sort the command table. - Add support for multiple argmuments in several commands (mkdir, rmdir, rm, cat) --- common/cmd_boot.c | 4 +- common/cmd_bootm.c | 4 +- common/cmd_echo.c | 2 +- common/cmd_edit.c | 4 +- common/cmd_exec.c | 2 +- common/cmd_flash.c | 4 +- common/cmd_fs.c | 164 ++++++++++++++++++++++++++++++++++++++------------- common/cmd_mem.c | 48 ++++++++++++--- common/cmd_misc.c | 8 +-- common/cmd_net.c | 18 +++--- common/command.c | 137 +++++++++++++++++++----------------------- common/env.c | 4 +- common/environment.c | 26 +++++++- common/partition.c | 91 ++++++++++++++++++---------- 14 files changed, 333 insertions(+), 183 deletions(-) (limited to 'common') diff --git a/common/cmd_boot.c b/common/cmd_boot.c index 43fc18259b..af549c9f5c 100644 --- a/common/cmd_boot.c +++ b/common/cmd_boot.c @@ -76,7 +76,7 @@ int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(go) .maxargs = CONFIG_MAXARGS, .cmd = do_go, - .usage = "go - start application at address 'addr'\n", + .usage = "start application at address 'addr'", U_BOOT_CMD_HELP( "addr [arg ...]\n - start application at address 'addr'\n" " passing 'arg' as arguments\n") @@ -87,5 +87,5 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); U_BOOT_CMD_START(reset) .maxargs = CONFIG_MAXARGS, .cmd = do_reset, - .usage = "reset - Perform RESET of the CPU\n", + .usage = "Perform RESET of the CPU", U_BOOT_CMD_END diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index db4c296677..19b6238213 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -440,7 +440,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(bootm) .maxargs = CONFIG_MAXARGS, .cmd = do_bootm, - .usage = "bootm - boot application image from memory\n", + .usage = "boot application image from memory", U_BOOT_CMD_HELP( "[addr [arg ...]]\n - boot application image stored in memory\n" "\tpassing arguments 'arg ...'; when booting a Linux kernel,\n" @@ -677,7 +677,7 @@ int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(boot) .maxargs = 1, .cmd = do_bootd, - .usage = "boot - boot default, i.e., run 'bootcmd'\n", + .usage = "boot default, i.e., run 'bootcmd'", U_BOOT_CMD_END #if (CONFIG_COMMANDS & CFG_CMD_IMI) diff --git a/common/cmd_echo.c b/common/cmd_echo.c index b31887b955..1314f2d971 100644 --- a/common/cmd_echo.c +++ b/common/cmd_echo.c @@ -77,6 +77,6 @@ no_optarg_out: U_BOOT_CMD_START(echo) .maxargs = CONFIG_MAXARGS, .cmd = do_echo, - .usage = "echo - echo args to console\n", + .usage = "echo args to console", U_BOOT_CMD_END diff --git a/common/cmd_edit.c b/common/cmd_edit.c index 00e5644ae5..26bb970b2b 100644 --- a/common/cmd_edit.c +++ b/common/cmd_edit.c @@ -70,7 +70,7 @@ static char *screenline(char *line, int *pos) return lbuf; } -int setpos(char *line, int position) +static int setpos(char *line, int position) { int i = 0; int linepos = 0; @@ -475,5 +475,5 @@ out: U_BOOT_CMD_START(edit) .maxargs = 2, .cmd = do_edit, - .usage = "edit - edit a file\n", + .usage = "edit a file", U_BOOT_CMD_END diff --git a/common/cmd_exec.c b/common/cmd_exec.c index 9d9d206a82..1057bc1b8e 100644 --- a/common/cmd_exec.c +++ b/common/cmd_exec.c @@ -72,5 +72,5 @@ out: U_BOOT_CMD_START(exec) .maxargs = CONFIG_MAXARGS, .cmd = do_exec, - .usage = "exec - execute a script\n", + .usage = "execute a script", U_BOOT_CMD_END diff --git a/common/cmd_flash.c b/common/cmd_flash.c index 4d45f943f7..db059dba58 100644 --- a/common/cmd_flash.c +++ b/common/cmd_flash.c @@ -84,7 +84,7 @@ int do_flerase (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(erase) .maxargs = CONFIG_MAXARGS, .cmd = do_flerase, - .usage = "erase - erase FLASH memory\n", + .usage = "erase FLASH memory", U_BOOT_CMD_HELP("write me\n") U_BOOT_CMD_END @@ -120,6 +120,6 @@ int do_protect (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(protect) .maxargs = 4, .cmd = do_protect, - .usage = "protect - enable or disable FLASH write protection\n", + .usage = "enable or disable FLASH write protection", U_BOOT_CMD_HELP("write me\n") U_BOOT_CMD_END diff --git a/common/cmd_fs.c b/common/cmd_fs.c index 6a0b4f7d44..bbbf8d006d 100644 --- a/common/cmd_fs.c +++ b/common/cmd_fs.c @@ -115,10 +115,16 @@ static int do_ls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 0; } +static char cmd_ls_help[] = +"Usage: ls [OPTION]... [FILE]...\n" +"List information about the FILEs (the current directory by default).\n" +" -R list subdirectories recursively\n"; + U_BOOT_CMD_START(ls) .maxargs = CONFIG_MAXARGS, .cmd = do_ls, - .usage = "ls - list a file or directory\n", + .usage = "list a file or directory", + U_BOOT_CMD_HELP(cmd_ls_help) U_BOOT_CMD_END static int do_cd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) @@ -138,10 +144,15 @@ static int do_cd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 0; } +static char cmd_cd_help[] = +"Usage: cd [directory]\n" +"change to directory. If called without argument, change to /\n"; + U_BOOT_CMD_START(cd) .maxargs = 2, .cmd = do_cd, - .usage = "cd - change current directory\n", + .usage = "change working directory", + U_BOOT_CMD_HELP(cmd_cd_help) U_BOOT_CMD_END static int do_pwd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) @@ -153,64 +164,100 @@ static int do_pwd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(pwd) .maxargs = 2, .cmd = do_pwd, - .usage = "pwd - display current directory\n", + .usage = "print working directory", U_BOOT_CMD_END static int do_mkdir (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { - int ret; + int i = 1; - ret = mkdir(argv[1]); - if (ret) { - perror("mkdir"); + if (argc < 2) { + u_boot_cmd_usage(cmdtp); return 1; } + while (i < argc) { + if (mkdir(argv[i])) { + printf("could not create %s: %s\n", argv[i], errno_str()); + return 1; + } + i++; + } + return 0; } +static char cmd_mkdir_help[] = +"Usage: mkdir [directories]\n" +"Create new directories\n"; + U_BOOT_CMD_START(mkdir) - .maxargs = 2, + .maxargs = CONFIG_MAXARGS, .cmd = do_mkdir, - .usage = "mkdir - create a new directory\n", + .usage = "make directories", + U_BOOT_CMD_HELP(cmd_mkdir_help) U_BOOT_CMD_END static int do_rm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { - int ret; + int i = 1; - ret = unlink(argv[1]); - if (ret) { - perror("rm"); + if (argc < 2) { + u_boot_cmd_usage(cmdtp); return 1; } + while (i < argc) { + if (unlink(argv[i])) { + printf("could not remove %s: %s\n", argv[i], errno_str()); + return 1; + } + i++; + } + return 0; } +static char cmd_rm_help[] = +"Usage: rm [FILES]\n" +"Remove files\n"; + U_BOOT_CMD_START(rm) - .maxargs = 2, + .maxargs = CONFIG_MAXARGS, .cmd = do_rm, - .usage = "rm - remove files\n", + .usage = "remove files", + U_BOOT_CMD_HELP(cmd_rm_help) U_BOOT_CMD_END static int do_rmdir (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { - int ret; + int i = 1; - ret = rmdir(argv[1]); - if (ret) { - perror("rmdir"); + if (argc < 2) { + u_boot_cmd_usage(cmdtp); return 1; } + while (i < argc) { + if (rmdir(argv[i])) { + printf("could not remove %s: %s\n", argv[i], errno_str()); + return 1; + } + i++; + } + return 0; } +static char cmd_rmdir_help[] = +"Usage: rmdir [directories]\n" +"Remove directories. The directories have to be empty.\n"; + U_BOOT_CMD_START(rmdir) - .maxargs = 2, + .maxargs = CONFIG_MAXARGS, .cmd = do_rmdir, - .usage = "rmdir - remove directories\n", + .usage = "remove directorie(s)", + U_BOOT_CMD_HELP(cmd_rmdir_help) U_BOOT_CMD_END static int do_mount (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) @@ -232,7 +279,7 @@ static int do_mount (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } if (argc != 4) { - printf ("Usage:\n%s\n", cmdtp->usage); + u_boot_cmd_usage(cmdtp); return 1; } @@ -243,11 +290,23 @@ static int do_mount (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 0; } +static char cmd_mount_help[] = +"Usage: mount: list mounted filesystems\n" +"or: mount \n" +"\n" +"Mount a filesystem of a given type to a mountpoint.\n" +" can be one of /dev/* or some arbitrary string if no\n" +"device is needed for this driver (for example ramfs).\n" +" is the filesystem driver to use. Try the 'devinfo' command\n" +"for a list of available drivers.\n" +" must be an empty directory descending directly from the\n" +"root directory.\n"; + U_BOOT_CMD_START(mount) .maxargs = 4, .cmd = do_mount, - .usage = "mount - mount a filesystem to a device\n", - U_BOOT_CMD_HELP(" add a filesystem of type 'type' on the given device") + .usage = "mount a filesystem to a device", + U_BOOT_CMD_HELP(cmd_mount_help) U_BOOT_CMD_END static int do_umount (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) @@ -255,7 +314,7 @@ static int do_umount (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) int ret = 0; if (argc != 2) { - printf ("Usage:\n%s\n", cmdtp->usage); + u_boot_cmd_usage(cmdtp); return 1; } @@ -264,13 +323,17 @@ static int do_umount (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 1; } return 0; - } +static char cmd_umount_help[] = +"Usage: umount \n" +"umount a filesystem mounted on a specific mountpoint\n"; + U_BOOT_CMD_START(umount) .maxargs = 2, .cmd = do_umount, - .usage = "umount - umount a filesystem mounted on \n", + .usage = "umount a filesystem", + U_BOOT_CMD_HELP(cmd_umount_help) U_BOOT_CMD_END static int do_cat ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) @@ -279,36 +342,53 @@ static int do_cat ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) int fd, i; char *buf; int err = 0; + int args = 1; - fd = open(argv[1], 0); - if (fd < 0) { - perror("open"); + if (argc < 2) { + u_boot_cmd_usage(cmdtp); return 1; } buf = xmalloc(1024); - while((ret = read(fd, buf, 1024)) > 0) { - for(i = 0; i < ret; i++) { - if (isprint(buf[i]) || buf[i] == '\n' || buf[i] == '\t') - putc(buf[i]); - else - putc('.'); - } - if(ctrlc()) { - err = 1; + while (args < argc) { + fd = open(argv[args], 0); + if (fd < 0) { + printf("could not open %s: %s\n", argv[args], errno_str()); goto out; } + + while((ret = read(fd, buf, 1024)) > 0) { + for(i = 0; i < ret; i++) { + if (isprint(buf[i]) || buf[i] == '\n' || buf[i] == '\t') + putc(buf[i]); + else + putc('.'); + } + if(ctrlc()) { + err = 1; + close(fd); + goto out; + } + } + close(fd); + args++; } + out: free(buf); - close(fd); return err; } +static char cmd_cat_help[] = +"Usage: cat [FILES]\n" +"Concatenate files on stdout. Currently only printable characters\n" +"and \\n and \\t are printed, but this should be optional\n"; + U_BOOT_CMD_START(cat) - .maxargs = 2, + .maxargs = CONFIG_MAXARGS, .cmd = do_cat, - .usage = "cat - bla bla\n", + .usage = "Concatenate FILE(s)", + U_BOOT_CMD_HELP(cmd_cat_help) U_BOOT_CMD_END diff --git a/common/cmd_mem.c b/common/cmd_mem.c index beea5b0c9e..eaa7c4653e 100644 --- a/common/cmd_mem.c +++ b/common/cmd_mem.c @@ -176,11 +176,30 @@ out: return errno; } +static char cmd_md_help[] = +"Usage md [OPTIONS] \n" +"display (hexdump) a memory region.\n" +"options:\n" +" -f display file (default /dev/mem)\n" +" -b output in bytes\n" +" -w output in halfwords (16bit)\n" +" -l output in words (32bit)\n" +"\n" +"Memory regions:\n" +"Memory regions can be specified in two different forms: start+size\n" +"or start-end, If is ommitted it defaults to 0. If end is ommited it\n" +"defaults to the end of the device, except for interactive commands like md\n" +"and mw for which it defaults to 0x100.\n" +"Sizes can be specified as decimal, or if prefixed with 0x as hexadecimal.\n" +"an optional suffix of k, M or G is for kibibytes, Megabytes or Gigabytes,\n" +"respectively\n"; + + U_BOOT_CMD_START(md) .maxargs = CONFIG_MAXARGS, .cmd = do_mem_md, - .usage = "md - memory display\n", - U_BOOT_CMD_HELP("write me\n") + .usage = "memory display", + U_BOOT_CMD_HELP(cmd_md_help) U_BOOT_CMD_END int do_mem_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) @@ -265,11 +284,16 @@ out: return errno; } +static char cmd_mw_help[] = +"Usage mw [OPTIONS] \n" +"Write value(s) to the specifies region.\n" +"see 'help md' for supported options.\n"; + U_BOOT_CMD_START(mw) .maxargs = CONFIG_MAXARGS, .cmd = do_mem_mw, - .usage = "mw - memory write (fill)\n", - U_BOOT_CMD_HELP("write me\n") + .usage = "memory write (fill)", + U_BOOT_CMD_HELP(cmd_mw_help) U_BOOT_CMD_END int do_mem_cmp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) @@ -442,11 +466,19 @@ out: return ret; } +static char cmd_cp_help[] = +"Usage: cp \n" +"cp copies file to .\n" +"Currently only this form is supported and you have to specify the exact target\n" +"filename (not a target directory).\n" +"Note: This command was previously used as memory copy. Currently there is no\n" +"equivalent command for this. This must be fixed of course.\n"; + U_BOOT_CMD_START(cp) .maxargs = CONFIG_MAXARGS, .cmd = do_cp, - .usage = "cp - copy files\n", - U_BOOT_CMD_HELP("write me\n") + .usage = "copy files", + U_BOOT_CMD_HELP(cmd_cp_help) U_BOOT_CMD_END #ifndef CONFIG_CRC32_VERIFY @@ -624,7 +656,7 @@ device_initcall(mem_init); U_BOOT_CMD_START(cmp) .maxargs = 4, .cmd = do_mem_cmp, - .usage = "cmp - memory compare\n", + .usage = "memory compare", U_BOOT_CMD_HELP("write me\n") U_BOOT_CMD_END @@ -633,7 +665,7 @@ U_BOOT_CMD_END U_BOOT_CMD_START(crc32) .maxargs = 4, .cmd = do_mem_crc, - .usage = "crc32 - checksum calculation\n", + .usage = "checksum calculation", U_BOOT_CMD_HELP("address count [addr]\n - compute CRC32 checksum [save at addr]\n") U_BOOT_CMD_END diff --git a/common/cmd_misc.c b/common/cmd_misc.c index 63d0a6fdbe..cd14dc0f6b 100644 --- a/common/cmd_misc.c +++ b/common/cmd_misc.c @@ -55,7 +55,7 @@ int do_sleep (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(sleep) .maxargs = 2, .cmd = do_sleep, - .usage = "sleep - delay execution for n secondsnn", + .usage = "delay execution for n seconds", U_BOOT_CMD_END #endif @@ -71,7 +71,7 @@ int do_clear (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(clear) .maxargs = 1, .cmd = do_clear, - .usage = "clear - clear screen\n", + .usage = "clear screen", U_BOOT_CMD_END #endif @@ -86,7 +86,7 @@ int do_meminfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(meminfo) .maxargs = 1, .cmd = do_meminfo, - .usage = "meminfo - print info about memory usage\n", + .usage = "print info about memory usage", U_BOOT_CMD_END #endif @@ -97,7 +97,7 @@ int do_irqinfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); U_BOOT_CMD_START(irqinfo) .maxargs = 1, .cmd = do_irqinfo, - .usage = "irqinfo - print information about IRQs\n", + .usage = "print information about IRQs", U_BOOT_CMD_END #endif /* CONFIG_COMMANDS & CFG_CMD_IRQ */ diff --git a/common/cmd_net.c b/common/cmd_net.c index 4f7018143c..73681016db 100644 --- a/common/cmd_net.c +++ b/common/cmd_net.c @@ -96,7 +96,7 @@ int do_bootp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(bootp) .maxargs = 3, .cmd = do_bootp, - .usage = "bootp\t- boot image via network using BootP/TFTP protocol\n", + .usage = "boot image via network using BootP/TFTP protocol", U_BOOT_CMD_HELP("[loadAddress] [bootfilename]\n") U_BOOT_CMD_END @@ -105,11 +105,15 @@ int do_tftpb (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return netboot_common (TFTP, cmdtp, argc, argv); } +static char cmd_tftpboot_help[] = +"Usage: tftpboot \n" +"Load a file via network using BootP/TFTP protocol\n"; + U_BOOT_CMD_START(tftpboot) .maxargs = 3, .cmd = do_tftpb, - .usage = "tftpboot- boot image via network using TFTP protocol\n", - U_BOOT_CMD_HELP("[loadAddress] [bootfilename]\n") + .usage = "boot image via network using TFTP protocol", + U_BOOT_CMD_HELP(cmd_tftpboot_help) U_BOOT_CMD_END int do_rarpb (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) @@ -120,7 +124,7 @@ int do_rarpb (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(rarpboot) .maxargs = 3, .cmd = do_rarpb, - .usage = "rarpboot- boot image via network using RARP/TFTP protocol\n", + .usage = "boot image via network using RARP/TFTP protocol", U_BOOT_CMD_HELP("[loadAddress] [bootfilename]\n") U_BOOT_CMD_END @@ -141,7 +145,7 @@ int do_dhcp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(dhcp) .maxargs = 3, .cmd = do_dhcp, - .usage = "dhcp\t- invoke DHCP client to obtain IP/boot params\n", + .usage = "invoke DHCP client to obtain IP/boot params", U_BOOT_CMD_END #endif /* CONFIG_NET_DHCP */ @@ -155,7 +159,7 @@ int do_nfs (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(nfs) .maxargs = 3, .cmd = do_nfs, - .usage = "nfs\t- boot image via network using NFS protocol\n", + .usage = "boot image via network using NFS protocol", U_BOOT_CMD_HELP("[loadAddress] [host ip addr:bootfilename]\n") U_BOOT_CMD_END @@ -238,7 +242,7 @@ int do_cdp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(cdp) .maxargs = 1, .cmd = do_cdp, - .usage = "cdp\t- Perform CDP network configuration\n", + .usage = "Perform CDP network configuration", U_BOOT_CMD_HELP("[loadAddress] [host ip addr:bootfilename]\n") U_BOOT_CMD_END diff --git a/common/command.c b/common/command.c index 3e5440e816..dfe672f2ac 100644 --- a/common/command.c +++ b/common/command.c @@ -42,7 +42,7 @@ do_version (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(version) .maxargs = 1, .cmd = do_version, - .usage = "version - print monitor version\n", + .usage = "print monitor version", U_BOOT_CMD_END int @@ -54,7 +54,7 @@ do_true (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(true) .maxargs = 1, .cmd = do_true, - .usage = "true - return 0\n", + .usage = "do nothing, successfully", U_BOOT_CMD_END int @@ -66,7 +66,7 @@ do_false (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(false) .maxargs = 1, .cmd = do_false, - .usage = "false - return 1\n", + .usage = "do nothing, unsuccessfully", U_BOOT_CMD_END #ifdef CONFIG_HUSH_PARSER @@ -77,7 +77,7 @@ do_readline (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) char *buf = xzalloc(CONFIG_CBSIZE); if (argc < 3) { - printf ("Usage:\n%s\n", cmdtp->usage); + u_boot_cmd_usage(cmdtp); return 1; } @@ -92,10 +92,15 @@ do_readline (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 0; } +static char cmd_readline_help[] = +"Usage: readline VAR\n" +"readline reads a line of user input into variable VAR.\n"; + U_BOOT_CMD_START(readline) .maxargs = 3, .cmd = do_readline, - .usage = "readline - \n", + .usage = "prompt for user input", + U_BOOT_CMD_HELP(cmd_readline_help) U_BOOT_CMD_END int @@ -225,9 +230,9 @@ U_BOOT_CMD_START(test) .aliases = test_aliases, .maxargs = CONFIG_MAXARGS, .cmd = do_test, - .usage = "test - minimal test like /bin/sh\n", + .usage = "minimal test like /bin/sh", U_BOOT_CMD_HELP( - "[args..]\n" + "[args..]\n" " - test functionality\n") U_BOOT_CMD_END @@ -238,119 +243,97 @@ do_exit (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) r = 0; if (argc > 1) - r = simple_strtoul(argv[1], NULL, 10); + r = simple_strtoul(argv[1], NULL, 0); return -r - 2; } U_BOOT_CMD_START(exit) - .maxargs = 1, + .maxargs = 2, .cmd = do_exit, - .usage = "exit - exit script\n", + .usage = "exit script", U_BOOT_CMD_END #endif -#ifdef CONFIG_CMD_HELP +void u_boot_cmd_usage(cmd_tbl_t *cmdtp) +{ +#ifdef CONFIG_LONGHELP + /* found - print (long) help info */ + if (cmdtp->help) { + puts (cmdtp->help); + } else { + puts (cmdtp->name); + putc (' '); + puts ("- No help available.\n"); + } + putc ('\n'); +#else /* no long help available */ + if (cmdtp->usage) + puts (cmdtp->usage); +#endif /* CONFIG_LONGHELP */ +} + /* * Use puts() instead of printf() to avoid printf buffer overflow * for long help messages */ int do_help (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) { - int i; - int rcode = 0; - if (argc == 1) { /*show list of commands */ - int cmd_items = &__u_boot_cmd_end - &__u_boot_cmd_start; /* pointer arith! */ - cmd_tbl_t *cmd_array[cmd_items]; - int i, j, swaps; + int i; - /* Make array of commands from .uboot_cmd section */ + /* No need to sort the command list. The linker already did + * this for us. + */ cmdtp = &__u_boot_cmd_start; for (i = 0; i < cmd_items; i++) { - cmd_array[i] = cmdtp++; - } - - /* Sort command list (trivial bubble sort) */ - for (i = cmd_items - 1; i > 0; --i) { - swaps = 0; - for (j = 0; j < i; ++j) { - if (strcmp (cmd_array[j]->name, - cmd_array[j + 1]->name) > 0) { - cmd_tbl_t *tmp; - tmp = cmd_array[j]; - cmd_array[j] = cmd_array[j + 1]; - cmd_array[j + 1] = tmp; - ++swaps; - } - } - if (!swaps) - break; - } - - /* print short help (usage) */ - for (i = 0; i < cmd_items; i++) { - const char *usage = cmd_array[i]->usage; + /* print short help (usage) */ /* allow user abort */ if (ctrlc ()) return 1; - if (usage == NULL) + if (!cmdtp->usage) continue; - puts (usage); + printf("%10s - %s\n", cmdtp->name, cmdtp->usage); + cmdtp++; } return 0; } /* * command help (long version) */ - for (i = 1; i < argc; ++i) { - if ((cmdtp = find_cmd (argv[i])) != NULL) { -#ifdef CONFIG_LONGHELP - /* found - print (long) help info */ - puts (cmdtp->name); - putc (' '); - if (cmdtp->help) { - puts (cmdtp->help); - } else { - puts ("- No help available.\n"); - rcode = 1; - } - putc ('\n'); -#else /* no long help available */ - if (cmdtp->usage) - puts (cmdtp->usage); -#endif /* CONFIG_LONGHELP */ - } else { - printf ("Unknown command '%s' - try 'help'" - " without arguments for list of all" - " known commands\n\n", argv[i] - ); - rcode = 1; - } + if ((cmdtp = find_cmd (argv[1])) != NULL) { + u_boot_cmd_usage(cmdtp); + return 0; + } else { + printf ("Unknown command '%s' - try 'help'" + " without arguments for list of all" + " known commands\n\n", argv[1] + ); + return 1; } - return rcode; } -char *help_aliases[] = { "?", NULL}; +static char cmd_help_help[] = +"Show help information (for 'command')\n" +"'help' prints online help for the monitor commands.\n\n" +"Without arguments, it prints a short usage message for all commands.\n\n" +"To get detailed help information for specific commands you can type\n" +"'help' with one or more command names as arguments.\n"; + +static char *help_aliases[] = { "?", NULL}; U_BOOT_CMD_START(help) .maxargs = 2, .cmd = do_help, .aliases = help_aliases, - .usage = "help - print online help\n", - U_BOOT_CMD_HELP( - " - show help information (for 'command')\n" - "'help' prints online help for the monitor commands.\n\n" - "Without arguments, it prints a short usage message for all commands.\n\n" - "To get detailed help information for specific commands you can type\n" - "'help' with one or more command names as arguments.\n") + .usage = "print online help", + U_BOOT_CMD_HELP(cmd_help_help) U_BOOT_CMD_END -#endif /* CONFIG_CMD_HELP */ /*************************************************************************** * find command table entry for a command diff --git a/common/env.c b/common/env.c index 7d5a02162f..e8f841e46b 100644 --- a/common/env.c +++ b/common/env.c @@ -129,7 +129,7 @@ int do_printenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(printenv) .maxargs = CONFIG_MAXARGS, .cmd = do_printenv, - .usage = "printenv- print environment variables\n", + .usage = "print environment variables", U_BOOT_CMD_HELP( "\n - print values of all environment variables\n" "printenv name ...\n" @@ -152,7 +152,7 @@ int do_setenv ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD_START(setenv) .maxargs = CONFIG_MAXARGS, .cmd = do_setenv, - .usage = "setenv - set environment variables\n", + .usage = "set environment variables", U_BOOT_CMD_HELP( "name value ...\n" " - set environment variable 'name' to 'value ...'\n" diff --git a/common/environment.c b/common/environment.c index 0e1b475e01..416eb060d9 100644 --- a/common/environment.c +++ b/common/environment.c @@ -97,6 +97,7 @@ out: #ifdef __U_BOOT__ int do_saveenv(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { + int ret; char *filename, *dirname; printf("saving environment\n"); @@ -109,13 +110,24 @@ int do_saveenv(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) else filename = argv[1]; - return envfs_save(filename, dirname); + ret = envfs_save(filename, dirname); + if (ret) + printf("saveenv failed\n"); + return ret; } +static char cmd_saveenv_help[] = +"Usage: saveenv [DIRECTORY] [ENVFS]\n" +"Save the files in to the persistent storage device .\n" +" is normally a block in flash, but could be any other file.\n" +"If ommitted defaults to /env and defaults to /dev/env0.\n" +"Note that envfs can only handle files. Directories are skipped silently.\n"; + U_BOOT_CMD_START(saveenv) .maxargs = 3, .cmd = do_saveenv, - .usage = "saveenv - save environment to persistent storage\n", + .usage = "save environment to persistent storage", + U_BOOT_CMD_HELP(cmd_saveenv_help) U_BOOT_CMD_END #endif /* __U_BOOT__ */ @@ -208,9 +220,17 @@ int do_loadenv(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return envfs_load(filename, dirname); } +static char cmd_loadenv_help[] = +"Usage: loadenv [DIRECTORY] [ENVFS]\n" +"Load the persistent storage contained in to the directory\n" +".\n" +"If ommitted defaults to /env and defaults to /dev/env0.\n" +"Note that envfs can only handle files. Directories are skipped silently.\n"; + U_BOOT_CMD_START(loadenv) .maxargs = 3, .cmd = do_loadenv, - .usage = "loadenv - load environment from persistent storage\n", + .usage = "load environment from persistent storage", + U_BOOT_CMD_HELP(cmd_loadenv_help) U_BOOT_CMD_END #endif /* __U_BOOT__ */ diff --git a/common/partition.c b/common/partition.c index e27010d577..15d44305f1 100644 --- a/common/partition.c +++ b/common/partition.c @@ -35,18 +35,21 @@ struct device_d *dev_add_partition(struct device_d *dev, unsigned long offset, s return 0; } -static void dev_del_partitions(struct device_d *dev) +static void dev_del_partitions(struct device_d *physdev) { - struct device_d *p; + struct device_d *dev; char buf[MAX_DRIVER_NAME]; int i = 0; /* This is lame. Devices should to able to have children */ - while(1) { - sprintf(buf, "%s.%d", dev->id, i); - p = device_from_spec_str(buf, NULL); - if (p) - unregister_device(p); + while (1) { + sprintf(buf, "%s.%d", physdev->id, i); + dev = device_from_spec_str(buf, NULL); + if (dev) { + struct partition *part = dev->type_data; + unregister_device(dev); + free(part); + } else break; i++; @@ -58,7 +61,6 @@ int mtd_part_do_parse_one (struct partition *part, const char *str, char **endp) ulong size; char *end; char buf[MAX_DRIVER_NAME]; - int ro = 0; memset(buf, 0, MAX_DRIVER_NAME); @@ -95,7 +97,7 @@ int mtd_part_do_parse_one (struct partition *part, const char *str, char **endp) str = end; if (*str == 'r' && *(str + 1) == 'o') { - ro = 1; + part->readonly = 1; end = (char *)(str + 2); } @@ -165,6 +167,25 @@ int do_addpart ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 0; } +static char cmd_addpart_help[] = +"Usage: addpart \n" +"addpart adds a partition description to a device. The partition description\n" +"has the form\n" +"dev:size1(name1)[ro],size2(name2)[ro],...\n" +" is the device name under /dev. Size can be given in decimal or if\n" +"prefixed with 0x in hex. Sizes can have an optional suffix K,M,G. The size\n" +"of the last partition can be specified as '-' for the remaining space of the\n" +"device.\n" +"This format is the same as used in the Linux kernel for cmdline mtd partitions.\n" +"Note That this command has to be reworked and will probably change it's API."; + +U_BOOT_CMD_START(addpart) + .maxargs = 2, + .cmd = do_addpart, + .usage = "add a partition table to a device", + U_BOOT_CMD_HELP(cmd_addpart_help) +U_BOOT_CMD_END + int do_delpart ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { struct device_d *dev; @@ -185,27 +206,19 @@ int do_delpart ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 0; } -U_BOOT_CMD_START(addpart) - .maxargs = 2, - .cmd = do_addpart, - .usage = "addpart - add a partition table to a device\n", -U_BOOT_CMD_END +static char cmd_delpart_help[] = +"Usage: delpart \n" +"Delete partitions previously added to a device with addpart.\n" +"Note: You have to specify the device as 'devid', _not_ as '/dev/devid'. This\n" +"will likely change soon.\n"; U_BOOT_CMD_START(delpart) .maxargs = 2, .cmd = do_delpart, - .usage = "delpart - delete a partition table from a device\n", + .usage = "delete a partition table from a device", + U_BOOT_CMD_HELP(cmd_delpart_help) U_BOOT_CMD_END -static int part_probe(struct device_d *dev) -{ - struct partition *part = dev->type_data; - - printf("registering partition %s on device %s (size=0x%08x, name=%s)\n", - dev->id, part->physdev->id, dev->size, part->name); - return 0; -} - static int part_erase(struct device_d *dev, size_t count, unsigned long offset) { struct partition *part = dev->type_data; @@ -227,15 +240,33 @@ static ssize_t part_write(struct device_d *dev, const void *buf, size_t count, u { struct partition *part = dev->type_data; - return dev_write(part->physdev, buf, count, offset + part->offset, flags); + if (part->readonly) + return -EROFS; + else + return dev_write(part->physdev, buf, count, offset + part->offset, flags); +} + +static int part_probe(struct device_d *dev) +{ + struct partition *part = dev->type_data; + + printf("registering partition %s on device %s (size=0x%08x, name=%s)\n", + dev->id, part->physdev->id, dev->size, part->name); + return 0; +} + +static int part_remove(struct device_d *dev) +{ + return 0; } struct driver_d part_driver = { - .name = "partition", - .probe = part_probe, - .read = part_read, - .write = part_write, - .erase = part_erase, + .name = "partition", + .probe = part_probe, + .remove = part_remove, + .read = part_read, + .write = part_write, + .erase = part_erase, }; static int partition_init(void) -- cgit v1.2.3