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 : { INITCALLS }
__u_boot_initcalls_end = .; __u_boot_initcalls_end = .;
__u_boot_cmd_start = .; __u_boot_cmd_start = .;
__u_boot_cmd : { *(.u_boot_cmd) } __u_boot_cmd : { U_BOOT_CMDS }
__u_boot_cmd_end = .; __u_boot_cmd_end = .;
__preinit_array_start = .; __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) U_BOOT_CMD_START(go)
.maxargs = CONFIG_MAXARGS, .maxargs = CONFIG_MAXARGS,
.cmd = do_go, .cmd = do_go,
.usage = "go - start application at address 'addr'\n", .usage = "start application at address 'addr'",
U_BOOT_CMD_HELP( U_BOOT_CMD_HELP(
"addr [arg ...]\n - start application at address 'addr'\n" "addr [arg ...]\n - start application at address 'addr'\n"
" passing 'arg' as arguments\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) U_BOOT_CMD_START(reset)
.maxargs = CONFIG_MAXARGS, .maxargs = CONFIG_MAXARGS,
.cmd = do_reset, .cmd = do_reset,
.usage = "reset - Perform RESET of the CPU\n", .usage = "Perform RESET of the CPU",
U_BOOT_CMD_END 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) U_BOOT_CMD_START(bootm)
.maxargs = CONFIG_MAXARGS, .maxargs = CONFIG_MAXARGS,
.cmd = do_bootm, .cmd = do_bootm,
.usage = "bootm - boot application image from memory\n", .usage = "boot application image from memory",
U_BOOT_CMD_HELP( U_BOOT_CMD_HELP(
"[addr [arg ...]]\n - boot application image stored in memory\n" "[addr [arg ...]]\n - boot application image stored in memory\n"
"\tpassing arguments 'arg ...'; when booting a Linux kernel,\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) U_BOOT_CMD_START(boot)
.maxargs = 1, .maxargs = 1,
.cmd = do_bootd, .cmd = do_bootd,
.usage = "boot - boot default, i.e., run 'bootcmd'\n", .usage = "boot default, i.e., run 'bootcmd'",
U_BOOT_CMD_END U_BOOT_CMD_END
#if (CONFIG_COMMANDS & CFG_CMD_IMI) #if (CONFIG_COMMANDS & CFG_CMD_IMI)

View File

@ -77,6 +77,6 @@ no_optarg_out:
U_BOOT_CMD_START(echo) U_BOOT_CMD_START(echo)
.maxargs = CONFIG_MAXARGS, .maxargs = CONFIG_MAXARGS,
.cmd = do_echo, .cmd = do_echo,
.usage = "echo - echo args to console\n", .usage = "echo args to console",
U_BOOT_CMD_END U_BOOT_CMD_END

View File

@ -70,7 +70,7 @@ static char *screenline(char *line, int *pos)
return lbuf; return lbuf;
} }
int setpos(char *line, int position) static int setpos(char *line, int position)
{ {
int i = 0; int i = 0;
int linepos = 0; int linepos = 0;
@ -475,5 +475,5 @@ out:
U_BOOT_CMD_START(edit) U_BOOT_CMD_START(edit)
.maxargs = 2, .maxargs = 2,
.cmd = do_edit, .cmd = do_edit,
.usage = "edit <file> - edit a file\n", .usage = "edit a file",
U_BOOT_CMD_END U_BOOT_CMD_END

View File

@ -72,5 +72,5 @@ out:
U_BOOT_CMD_START(exec) U_BOOT_CMD_START(exec)
.maxargs = CONFIG_MAXARGS, .maxargs = CONFIG_MAXARGS,
.cmd = do_exec, .cmd = do_exec,
.usage = "exec <files> - execute a script\n", .usage = "execute a script",
U_BOOT_CMD_END 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) U_BOOT_CMD_START(erase)
.maxargs = CONFIG_MAXARGS, .maxargs = CONFIG_MAXARGS,
.cmd = do_flerase, .cmd = do_flerase,
.usage = "erase - erase FLASH memory\n", .usage = "erase FLASH memory",
U_BOOT_CMD_HELP("write me\n") U_BOOT_CMD_HELP("write me\n")
U_BOOT_CMD_END 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) U_BOOT_CMD_START(protect)
.maxargs = 4, .maxargs = 4,
.cmd = do_protect, .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_HELP("write me\n")
U_BOOT_CMD_END 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; 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) U_BOOT_CMD_START(ls)
.maxargs = CONFIG_MAXARGS, .maxargs = CONFIG_MAXARGS,
.cmd = do_ls, .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 U_BOOT_CMD_END
static int do_cd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 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; 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) U_BOOT_CMD_START(cd)
.maxargs = 2, .maxargs = 2,
.cmd = do_cd, .cmd = do_cd,
.usage = "cd - change current directory\n", .usage = "change working directory",
U_BOOT_CMD_HELP(cmd_cd_help)
U_BOOT_CMD_END U_BOOT_CMD_END
static int do_pwd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 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) U_BOOT_CMD_START(pwd)
.maxargs = 2, .maxargs = 2,
.cmd = do_pwd, .cmd = do_pwd,
.usage = "pwd - display current directory\n", .usage = "print working directory",
U_BOOT_CMD_END U_BOOT_CMD_END
static int do_mkdir (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) static int do_mkdir (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{ {
int ret; int i = 1;
ret = mkdir(argv[1]); if (argc < 2) {
if (ret) { u_boot_cmd_usage(cmdtp);
perror("mkdir");
return 1; 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; return 0;
} }
static char cmd_mkdir_help[] =
"Usage: mkdir [directories]\n"
"Create new directories\n";
U_BOOT_CMD_START(mkdir) U_BOOT_CMD_START(mkdir)
.maxargs = 2, .maxargs = CONFIG_MAXARGS,
.cmd = do_mkdir, .cmd = do_mkdir,
.usage = "mkdir - create a new directory\n", .usage = "make directories",
U_BOOT_CMD_HELP(cmd_mkdir_help)
U_BOOT_CMD_END U_BOOT_CMD_END
static int do_rm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) static int do_rm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{ {
int ret; int i = 1;
ret = unlink(argv[1]); if (argc < 2) {
if (ret) { u_boot_cmd_usage(cmdtp);
perror("rm");
return 1; 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; return 0;
} }
static char cmd_rm_help[] =
"Usage: rm [FILES]\n"
"Remove files\n";
U_BOOT_CMD_START(rm) U_BOOT_CMD_START(rm)
.maxargs = 2, .maxargs = CONFIG_MAXARGS,
.cmd = do_rm, .cmd = do_rm,
.usage = "rm - remove files\n", .usage = "remove files",
U_BOOT_CMD_HELP(cmd_rm_help)
U_BOOT_CMD_END U_BOOT_CMD_END
static int do_rmdir (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) static int do_rmdir (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{ {
int ret; int i = 1;
ret = rmdir(argv[1]); if (argc < 2) {
if (ret) { u_boot_cmd_usage(cmdtp);
perror("rmdir");
return 1; 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; 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) U_BOOT_CMD_START(rmdir)
.maxargs = 2, .maxargs = CONFIG_MAXARGS,
.cmd = do_rmdir, .cmd = do_rmdir,
.usage = "rmdir <dir> - remove directories\n", .usage = "remove directorie(s)",
U_BOOT_CMD_HELP(cmd_rmdir_help)
U_BOOT_CMD_END U_BOOT_CMD_END
static int do_mount (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 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) { if (argc != 4) {
printf ("Usage:\n%s\n", cmdtp->usage); u_boot_cmd_usage(cmdtp);
return 1; return 1;
} }
@ -243,11 +290,23 @@ static int do_mount (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
return 0; 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) U_BOOT_CMD_START(mount)
.maxargs = 4, .maxargs = 4,
.cmd = do_mount, .cmd = do_mount,
.usage = "mount - mount a filesystem to a device\n", .usage = "mount a filesystem to a device",
U_BOOT_CMD_HELP(" <device> <type> <path> add a filesystem of type 'type' on the given device") U_BOOT_CMD_HELP(cmd_mount_help)
U_BOOT_CMD_END U_BOOT_CMD_END
static int do_umount (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 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; int ret = 0;
if (argc != 2) { if (argc != 2) {
printf ("Usage:\n%s\n", cmdtp->usage); u_boot_cmd_usage(cmdtp);
return 1; return 1;
} }
@ -264,13 +323,17 @@ static int do_umount (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
return 1; return 1;
} }
return 0; 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) U_BOOT_CMD_START(umount)
.maxargs = 2, .maxargs = 2,
.cmd = do_umount, .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 U_BOOT_CMD_END
static int do_cat ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 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; int fd, i;
char *buf; char *buf;
int err = 0; int err = 0;
int args = 1;
fd = open(argv[1], 0); if (argc < 2) {
if (fd < 0) { u_boot_cmd_usage(cmdtp);
perror("open");
return 1; return 1;
} }
buf = xmalloc(1024); buf = xmalloc(1024);
while((ret = read(fd, buf, 1024)) > 0) { while (args < argc) {
for(i = 0; i < ret; i++) { fd = open(argv[args], 0);
if (isprint(buf[i]) || buf[i] == '\n' || buf[i] == '\t') if (fd < 0) {
putc(buf[i]); printf("could not open %s: %s\n", argv[args], errno_str());
else
putc('.');
}
if(ctrlc()) {
err = 1;
goto out; 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: out:
free(buf); free(buf);
close(fd);
return err; 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) U_BOOT_CMD_START(cat)
.maxargs = 2, .maxargs = CONFIG_MAXARGS,
.cmd = do_cat, .cmd = do_cat,
.usage = "cat - bla bla\n", .usage = "Concatenate FILE(s)",
U_BOOT_CMD_HELP(cmd_cat_help)
U_BOOT_CMD_END U_BOOT_CMD_END

View File

@ -176,11 +176,30 @@ out:
return errno; 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) U_BOOT_CMD_START(md)
.maxargs = CONFIG_MAXARGS, .maxargs = CONFIG_MAXARGS,
.cmd = do_mem_md, .cmd = do_mem_md,
.usage = "md - memory display\n", .usage = "memory display",
U_BOOT_CMD_HELP("write me\n") U_BOOT_CMD_HELP(cmd_md_help)
U_BOOT_CMD_END U_BOOT_CMD_END
int do_mem_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) int do_mem_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
@ -265,11 +284,16 @@ out:
return errno; 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) U_BOOT_CMD_START(mw)
.maxargs = CONFIG_MAXARGS, .maxargs = CONFIG_MAXARGS,
.cmd = do_mem_mw, .cmd = do_mem_mw,
.usage = "mw - memory write (fill)\n", .usage = "memory write (fill)",
U_BOOT_CMD_HELP("write me\n") U_BOOT_CMD_HELP(cmd_mw_help)
U_BOOT_CMD_END U_BOOT_CMD_END
int do_mem_cmp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) int do_mem_cmp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
@ -442,11 +466,19 @@ out:
return ret; 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) U_BOOT_CMD_START(cp)
.maxargs = CONFIG_MAXARGS, .maxargs = CONFIG_MAXARGS,
.cmd = do_cp, .cmd = do_cp,
.usage = "cp - copy files\n", .usage = "copy files",
U_BOOT_CMD_HELP("write me\n") U_BOOT_CMD_HELP(cmd_cp_help)
U_BOOT_CMD_END U_BOOT_CMD_END
#ifndef CONFIG_CRC32_VERIFY #ifndef CONFIG_CRC32_VERIFY
@ -624,7 +656,7 @@ device_initcall(mem_init);
U_BOOT_CMD_START(cmp) U_BOOT_CMD_START(cmp)
.maxargs = 4, .maxargs = 4,
.cmd = do_mem_cmp, .cmd = do_mem_cmp,
.usage = "cmp - memory compare\n", .usage = "memory compare",
U_BOOT_CMD_HELP("write me\n") U_BOOT_CMD_HELP("write me\n")
U_BOOT_CMD_END U_BOOT_CMD_END
@ -633,7 +665,7 @@ U_BOOT_CMD_END
U_BOOT_CMD_START(crc32) U_BOOT_CMD_START(crc32)
.maxargs = 4, .maxargs = 4,
.cmd = do_mem_crc, .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_HELP("address count [addr]\n - compute CRC32 checksum [save at addr]\n")
U_BOOT_CMD_END 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) U_BOOT_CMD_START(sleep)
.maxargs = 2, .maxargs = 2,
.cmd = do_sleep, .cmd = do_sleep,
.usage = "sleep - delay execution for n secondsnn", .usage = "delay execution for n seconds",
U_BOOT_CMD_END U_BOOT_CMD_END
#endif #endif
@ -71,7 +71,7 @@ int do_clear (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
U_BOOT_CMD_START(clear) U_BOOT_CMD_START(clear)
.maxargs = 1, .maxargs = 1,
.cmd = do_clear, .cmd = do_clear,
.usage = "clear - clear screen\n", .usage = "clear screen",
U_BOOT_CMD_END U_BOOT_CMD_END
#endif #endif
@ -86,7 +86,7 @@ int do_meminfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
U_BOOT_CMD_START(meminfo) U_BOOT_CMD_START(meminfo)
.maxargs = 1, .maxargs = 1,
.cmd = do_meminfo, .cmd = do_meminfo,
.usage = "meminfo - print info about memory usage\n", .usage = "print info about memory usage",
U_BOOT_CMD_END U_BOOT_CMD_END
#endif #endif
@ -97,7 +97,7 @@ int do_irqinfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
U_BOOT_CMD_START(irqinfo) U_BOOT_CMD_START(irqinfo)
.maxargs = 1, .maxargs = 1,
.cmd = do_irqinfo, .cmd = do_irqinfo,
.usage = "irqinfo - print information about IRQs\n", .usage = "print information about IRQs",
U_BOOT_CMD_END U_BOOT_CMD_END
#endif /* CONFIG_COMMANDS & CFG_CMD_IRQ */ #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) U_BOOT_CMD_START(bootp)
.maxargs = 3, .maxargs = 3,
.cmd = do_bootp, .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_HELP("[loadAddress] [bootfilename]\n")
U_BOOT_CMD_END 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); 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) U_BOOT_CMD_START(tftpboot)
.maxargs = 3, .maxargs = 3,
.cmd = do_tftpb, .cmd = do_tftpb,
.usage = "tftpboot- boot image via network using TFTP protocol\n", .usage = "boot image via network using TFTP protocol",
U_BOOT_CMD_HELP("[loadAddress] [bootfilename]\n") U_BOOT_CMD_HELP(cmd_tftpboot_help)
U_BOOT_CMD_END U_BOOT_CMD_END
int do_rarpb (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 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) U_BOOT_CMD_START(rarpboot)
.maxargs = 3, .maxargs = 3,
.cmd = do_rarpb, .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_HELP("[loadAddress] [bootfilename]\n")
U_BOOT_CMD_END 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) U_BOOT_CMD_START(dhcp)
.maxargs = 3, .maxargs = 3,
.cmd = do_dhcp, .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 U_BOOT_CMD_END
#endif /* CONFIG_NET_DHCP */ #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) U_BOOT_CMD_START(nfs)
.maxargs = 3, .maxargs = 3,
.cmd = do_nfs, .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_HELP("[loadAddress] [host ip addr:bootfilename]\n")
U_BOOT_CMD_END 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) U_BOOT_CMD_START(cdp)
.maxargs = 1, .maxargs = 1,
.cmd = do_cdp, .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_HELP("[loadAddress] [host ip addr:bootfilename]\n")
U_BOOT_CMD_END 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) U_BOOT_CMD_START(version)
.maxargs = 1, .maxargs = 1,
.cmd = do_version, .cmd = do_version,
.usage = "version - print monitor version\n", .usage = "print monitor version",
U_BOOT_CMD_END U_BOOT_CMD_END
int int
@ -54,7 +54,7 @@ do_true (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
U_BOOT_CMD_START(true) U_BOOT_CMD_START(true)
.maxargs = 1, .maxargs = 1,
.cmd = do_true, .cmd = do_true,
.usage = "true - return 0\n", .usage = "do nothing, successfully",
U_BOOT_CMD_END U_BOOT_CMD_END
int int
@ -66,7 +66,7 @@ do_false (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
U_BOOT_CMD_START(false) U_BOOT_CMD_START(false)
.maxargs = 1, .maxargs = 1,
.cmd = do_false, .cmd = do_false,
.usage = "false - return 1\n", .usage = "do nothing, unsuccessfully",
U_BOOT_CMD_END U_BOOT_CMD_END
#ifdef CONFIG_HUSH_PARSER #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); char *buf = xzalloc(CONFIG_CBSIZE);
if (argc < 3) { if (argc < 3) {
printf ("Usage:\n%s\n", cmdtp->usage); u_boot_cmd_usage(cmdtp);
return 1; return 1;
} }
@ -92,10 +92,15 @@ do_readline (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
return 0; 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) U_BOOT_CMD_START(readline)
.maxargs = 3, .maxargs = 3,
.cmd = do_readline, .cmd = do_readline,
.usage = "readline - \n", .usage = "prompt for user input",
U_BOOT_CMD_HELP(cmd_readline_help)
U_BOOT_CMD_END U_BOOT_CMD_END
int int
@ -225,9 +230,9 @@ U_BOOT_CMD_START(test)
.aliases = test_aliases, .aliases = test_aliases,
.maxargs = CONFIG_MAXARGS, .maxargs = CONFIG_MAXARGS,
.cmd = do_test, .cmd = do_test,
.usage = "test - minimal test like /bin/sh\n", .usage = "minimal test like /bin/sh",
U_BOOT_CMD_HELP( U_BOOT_CMD_HELP(
"[args..]\n" "[args..]\n"
" - test functionality\n") " - test functionality\n")
U_BOOT_CMD_END U_BOOT_CMD_END
@ -238,119 +243,97 @@ do_exit (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
r = 0; r = 0;
if (argc > 1) if (argc > 1)
r = simple_strtoul(argv[1], NULL, 10); r = simple_strtoul(argv[1], NULL, 0);
return -r - 2; return -r - 2;
} }
U_BOOT_CMD_START(exit) U_BOOT_CMD_START(exit)
.maxargs = 1, .maxargs = 2,
.cmd = do_exit, .cmd = do_exit,
.usage = "exit - exit script\n", .usage = "exit script",
U_BOOT_CMD_END U_BOOT_CMD_END
#endif #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 * Use puts() instead of printf() to avoid printf buffer overflow
* for long help messages * for long help messages
*/ */
int do_help (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) 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 */ if (argc == 1) { /*show list of commands */
int cmd_items = &__u_boot_cmd_end - int cmd_items = &__u_boot_cmd_end -
&__u_boot_cmd_start; /* pointer arith! */ &__u_boot_cmd_start; /* pointer arith! */
cmd_tbl_t *cmd_array[cmd_items]; int i;
int i, j, swaps;
/* 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; cmdtp = &__u_boot_cmd_start;
for (i = 0; i < cmd_items; i++) { for (i = 0; i < cmd_items; i++) {
cmd_array[i] = cmdtp++; /* print short help (usage) */
}
/* 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;
/* allow user abort */ /* allow user abort */
if (ctrlc ()) if (ctrlc ())
return 1; return 1;
if (usage == NULL) if (!cmdtp->usage)
continue; continue;
puts (usage); printf("%10s - %s\n", cmdtp->name, cmdtp->usage);
cmdtp++;
} }
return 0; return 0;
} }
/* /*
* command help (long version) * command help (long version)
*/ */
for (i = 1; i < argc; ++i) { if ((cmdtp = find_cmd (argv[1])) != NULL) {
if ((cmdtp = find_cmd (argv[i])) != NULL) { u_boot_cmd_usage(cmdtp);
#ifdef CONFIG_LONGHELP return 0;
/* found - print (long) help info */ } else {
puts (cmdtp->name); printf ("Unknown command '%s' - try 'help'"
putc (' '); " without arguments for list of all"
if (cmdtp->help) { " known commands\n\n", argv[1]
puts (cmdtp->help); );
} else { return 1;
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;
}
} }
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) U_BOOT_CMD_START(help)
.maxargs = 2, .maxargs = 2,
.cmd = do_help, .cmd = do_help,
.aliases = help_aliases, .aliases = help_aliases,
.usage = "help - print online help\n", .usage = "print online help",
U_BOOT_CMD_HELP( U_BOOT_CMD_HELP(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")
U_BOOT_CMD_END U_BOOT_CMD_END
#endif /* CONFIG_CMD_HELP */
/*************************************************************************** /***************************************************************************
* find command table entry for a command * 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) U_BOOT_CMD_START(printenv)
.maxargs = CONFIG_MAXARGS, .maxargs = CONFIG_MAXARGS,
.cmd = do_printenv, .cmd = do_printenv,
.usage = "printenv- print environment variables\n", .usage = "print environment variables",
U_BOOT_CMD_HELP( U_BOOT_CMD_HELP(
"\n - print values of all environment variables\n" "\n - print values of all environment variables\n"
"printenv name ...\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) U_BOOT_CMD_START(setenv)
.maxargs = CONFIG_MAXARGS, .maxargs = CONFIG_MAXARGS,
.cmd = do_setenv, .cmd = do_setenv,
.usage = "setenv - set environment variables\n", .usage = "set environment variables",
U_BOOT_CMD_HELP( U_BOOT_CMD_HELP(
"name value ...\n" "name value ...\n"
" - set environment variable 'name' to 'value ...'\n" " - set environment variable 'name' to 'value ...'\n"

View File

@ -97,6 +97,7 @@ out:
#ifdef __U_BOOT__ #ifdef __U_BOOT__
int do_saveenv(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) int do_saveenv(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{ {
int ret;
char *filename, *dirname; char *filename, *dirname;
printf("saving environment\n"); printf("saving environment\n");
@ -109,13 +110,24 @@ int do_saveenv(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
else else
filename = argv[1]; 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) U_BOOT_CMD_START(saveenv)
.maxargs = 3, .maxargs = 3,
.cmd = do_saveenv, .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 U_BOOT_CMD_END
#endif /* __U_BOOT__ */ #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); 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) U_BOOT_CMD_START(loadenv)
.maxargs = 3, .maxargs = 3,
.cmd = do_loadenv, .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 U_BOOT_CMD_END
#endif /* __U_BOOT__ */ #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; 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]; char buf[MAX_DRIVER_NAME];
int i = 0; int i = 0;
/* This is lame. Devices should to able to have children */ /* This is lame. Devices should to able to have children */
while(1) { while (1) {
sprintf(buf, "%s.%d", dev->id, i); sprintf(buf, "%s.%d", physdev->id, i);
p = device_from_spec_str(buf, NULL); dev = device_from_spec_str(buf, NULL);
if (p) if (dev) {
unregister_device(p); struct partition *part = dev->type_data;
unregister_device(dev);
free(part);
}
else else
break; break;
i++; i++;
@ -58,7 +61,6 @@ int mtd_part_do_parse_one (struct partition *part, const char *str, char **endp)
ulong size; ulong size;
char *end; char *end;
char buf[MAX_DRIVER_NAME]; char buf[MAX_DRIVER_NAME];
int ro = 0;
memset(buf, 0, MAX_DRIVER_NAME); 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; str = end;
if (*str == 'r' && *(str + 1) == 'o') { if (*str == 'r' && *(str + 1) == 'o') {
ro = 1; part->readonly = 1;
end = (char *)(str + 2); end = (char *)(str + 2);
} }
@ -165,6 +167,25 @@ int do_addpart ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
return 0; 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[]) int do_delpart ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{ {
struct device_d *dev; struct device_d *dev;
@ -185,27 +206,19 @@ int do_delpart ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
return 0; return 0;
} }
U_BOOT_CMD_START(addpart) static char cmd_delpart_help[] =
.maxargs = 2, "Usage: delpart <dev>\n"
.cmd = do_addpart, "Delete partitions previously added to a device with addpart.\n"
.usage = "addpart - add a partition table to a device\n", "Note: You have to specify the device as 'devid', _not_ as '/dev/devid'. This\n"
U_BOOT_CMD_END "will likely change soon.\n";
U_BOOT_CMD_START(delpart) U_BOOT_CMD_START(delpart)
.maxargs = 2, .maxargs = 2,
.cmd = do_delpart, .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 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) static int part_erase(struct device_d *dev, size_t count, unsigned long offset)
{ {
struct partition *part = dev->type_data; 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; 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 = { struct driver_d part_driver = {
.name = "partition", .name = "partition",
.probe = part_probe, .probe = part_probe,
.read = part_read, .remove = part_remove,
.write = part_write, .read = part_read,
.erase = part_erase, .write = part_write,
.erase = part_erase,
}; };
static int partition_init(void) static int partition_init(void)

View File

@ -9,3 +9,4 @@
*(.initcall.6) \ *(.initcall.6) \
*(.initcall.7) *(.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 */ /* common/command.c */
cmd_tbl_t *find_cmd(const char *cmd); cmd_tbl_t *find_cmd(const char *cmd);
void u_boot_cmd_usage(cmd_tbl_t *cmdtp);
#ifdef CONFIG_AUTO_COMPLETE #ifdef CONFIG_AUTO_COMPLETE
extern void install_auto_complete(void); 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 * 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 Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))
#define U_BOOT_CMD_START(_name) \ #define U_BOOT_CMD_START(_name) \
const cmd_tbl_t __u_boot_cmd_##_name \ const cmd_tbl_t __u_boot_cmd_##_name \
Struct_Section = { \ __attribute__ ((unused,section (".u_boot_cmd_" __stringify(_name)))) = { \
.name = #_name, .name = #_name,
#define U_BOOT_CMD_END \ #define U_BOOT_CMD_END \

View File

@ -6,6 +6,8 @@ struct device_d;
struct partition { struct partition {
int num; int num;
int readonly;
unsigned long offset; unsigned long offset;
struct device_d *physdev; 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) void unregister_device(struct device_d *old_dev)
{ {
struct device_d *dev; struct device_d *dev;
// printf("unregister_device: %s\n",old_dev->name); printf("unregister_device: %s\n",old_dev->name);
dev = first_device; dev = first_device;
while (dev) { while (dev) {
if (!strcmp(dev->next->name, old_dev->name)) { if (!strcmp(dev->next->id, old_dev->id)) {
if (old_dev->driver) if (old_dev->driver)
old_dev->driver->remove(old_dev); old_dev->driver->remove(old_dev);
dev->next = old_dev->next; dev->next = old_dev->next;
@ -521,8 +521,15 @@ int do_devinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
return 0; 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) U_BOOT_CMD_START(devinfo)
.maxargs = 2, .maxargs = 2,
.cmd = do_devinfo, .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 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) U_BOOT_CMD_START(ping)
.maxargs = 2, .maxargs = 2,
.cmd = do_ping, .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 U_BOOT_CMD_END