9
0
Fork 0

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)
This commit is contained in:
Sascha Hauer 2007-07-05 18:01:55 +02:00 committed by Sascha Hauer
parent 321dc1bf8f
commit d5a108ece3
20 changed files with 353 additions and 189 deletions

View File

@ -83,7 +83,7 @@ SECTIONS
__u_boot_initcalls : { INITCALLS }
__u_boot_initcalls_end = .;
__u_boot_cmd_start = .;
__u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd : { U_BOOT_CMDS }
__u_boot_cmd_end = .;
__preinit_array_start = .;

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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 <file> - edit a file\n",
.usage = "edit a file",
U_BOOT_CMD_END

View File

@ -72,5 +72,5 @@ out:
U_BOOT_CMD_START(exec)
.maxargs = CONFIG_MAXARGS,
.cmd = do_exec,
.usage = "exec <files> - execute a script\n",
.usage = "execute a script",
U_BOOT_CMD_END

View File

@ -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

View File

@ -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 <dir> - 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 <device> <fstype> <mountpoint>\n"
"\n"
"Mount a filesystem of a given type to a mountpoint.\n"
"<device> can be one of /dev/* or some arbitrary string if no\n"
"device is needed for this driver (for example ramfs).\n"
"<fstype> is the filesystem driver to use. Try the 'devinfo' command\n"
"for a list of available drivers.\n"
"<mountpoint> 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(" <device> <type> <path> 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 <mountpoint>\n"
"umount a filesystem mounted on a specific mountpoint\n";
U_BOOT_CMD_START(umount)
.maxargs = 2,
.cmd = do_umount,
.usage = "umount <path> - umount a filesystem mounted on <path>\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

View File

@ -176,11 +176,30 @@ out:
return errno;
}
static char cmd_md_help[] =
"Usage md [OPTIONS] <region>\n"
"display (hexdump) a memory region.\n"
"options:\n"
" -f <file> 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 <start> 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] <region> <value(s)>\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 <source> <destination>\n"
"cp copies file <source> to <destination>.\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

View File

@ -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 */

View File

@ -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 <localfile> <remotefile>\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

View File

@ -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 <prompt> 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

View File

@ -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"

View File

@ -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 <directory> to the persistent storage device <envfs>.\n"
"<envfs> is normally a block in flash, but could be any other file.\n"
"If ommitted <directory> defaults to /env and <envfs> 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 <envfs> to the directory\n"
"<directory>.\n"
"If ommitted <directory> defaults to /env and <envfs> 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__ */

View File

@ -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 <partition description>\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"
"<dev> 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 <dev>\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)

View File

@ -9,3 +9,4 @@
*(.initcall.6) \
*(.initcall.7)
#define U_BOOT_CMDS *(SORT_BY_NAME(.u_boot_cmd*))

View File

@ -60,6 +60,7 @@ extern cmd_tbl_t __u_boot_cmd_end;
/* common/command.c */
cmd_tbl_t *find_cmd(const char *cmd);
void u_boot_cmd_usage(cmd_tbl_t *cmdtp);
#ifdef CONFIG_AUTO_COMPLETE
extern void install_auto_complete(void);
@ -89,12 +90,15 @@ typedef void command_t (cmd_tbl_t *, int, int, char *[]);
* to include/cmd_confdefs.h
*/
#define __stringify_1(x) #x
#define __stringify(x) __stringify_1(x)
#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))
#define U_BOOT_CMD_START(_name) \
const cmd_tbl_t __u_boot_cmd_##_name \
Struct_Section = { \
__attribute__ ((unused,section (".u_boot_cmd_" __stringify(_name)))) = { \
.name = #_name,
#define U_BOOT_CMD_END \

View File

@ -6,6 +6,8 @@ struct device_d;
struct partition {
int num;
int readonly;
unsigned long offset;
struct device_d *physdev;

View File

@ -127,12 +127,12 @@ int register_device(struct device_d *new_device)
void unregister_device(struct device_d *old_dev)
{
struct device_d *dev;
// printf("unregister_device: %s\n",old_dev->name);
printf("unregister_device: %s\n",old_dev->name);
dev = first_device;
while (dev) {
if (!strcmp(dev->next->name, old_dev->name)) {
if (!strcmp(dev->next->id, old_dev->id)) {
if (old_dev->driver)
old_dev->driver->remove(old_dev);
dev->next = old_dev->next;
@ -521,8 +521,15 @@ int do_devinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
return 0;
}
static char cmd_devinfo_help[] =
"Usage: devinfo [DEVICE]\n"
"If called without arguments devinfo shows a summary about known devices and\n"
"drivers. If called with a device id as argument devinfo shows more detailed\n"
"informations about this device and its parameters.\n";
U_BOOT_CMD_START(devinfo)
.maxargs = 2,
.cmd = do_devinfo,
.usage = "devinfo - display info about devices and drivers\n",
.usage = "display info about devices and drivers",
U_BOOT_CMD_HELP(cmd_devinfo_help)
U_BOOT_CMD_END

View File

@ -112,5 +112,5 @@ int do_ping (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
U_BOOT_CMD_START(ping)
.maxargs = 2,
.cmd = do_ping,
.usage = "ping\t- send ICMP ECHO_REQUEST to network host\n",
.usage = "send ICMP ECHO_REQUEST to network host",
U_BOOT_CMD_END