diff options
Diffstat (limited to 'common/command.c')
-rw-r--r-- | common/command.c | 330 |
1 files changed, 86 insertions, 244 deletions
diff --git a/common/command.c b/common/command.c index 842e784d6a..607c74616a 100644 --- a/common/command.c +++ b/common/command.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2000 + * (C) Copyright 2000-2003 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * * See file CREDITS for list of people who contributed to this @@ -27,93 +27,6 @@ #include <common.h> #include <command.h> -#include <cmd_cache.h> -#include <cmd_mem.h> -#include <cmd_boot.h> -#include <cmd_flash.h> -#include <cmd_bootm.h> -#include <cmd_net.h> -#include <cmd_nvedit.h> -#include <cmd_misc.h> -#include <cmd_kgdb.h> -#include <cmd_ide.h> -#include <cmd_disk.h> -#include <cmd_console.h> -#include <cmd_reginfo.h> -#include <cmd_pcmcia.h> -#include <cmd_autoscript.h> -#include <cmd_diag.h> - -#include <cmd_eeprom.h> -#include <cmd_i2c.h> -#include <cmd_spi.h> -#include <cmd_immap.h> -#include <cmd_rtc.h> - -#include <cmd_elf.h> -#include <cmd_fdc.h> /* Floppy support */ -#include <cmd_usb.h> /* USB support */ -#include <cmd_scsi.h> -#include <cmd_pci.h> -#include <cmd_mii.h> -#include <cmd_dcr.h> /* 4xx DCR register access */ -#include <cmd_doc.h> -#include <cmd_nand.h> -#include <cmd_jffs2.h> -#include <cmd_fpga.h> - -#include <cmd_bsp.h> /* board special functions */ - -#include <cmd_bedbug.h> -#include <cmd_elf.h> - -#include <cmd_dtt.h> - -#include <cmd_vfd.h> /* load a bitmap to the VFDs on TRAB */ -#include <cmd_log.h> -#include <cmd_fdos.h> -#include <cmd_bmp.h> -#include <cmd_portio.h> -#include <cmd_mmc.h> -#include <cmd_fat.h> - -#ifdef CONFIG_AMIGAONEG3SE -#include <cmd_menu.h> -#include <cmd_boota.h> -#endif - -/* - * HELP command - */ -#define CMD_TBL_HELP MK_CMD_TBL_ENTRY( \ - "help", 1, CFG_MAXARGS, 1, do_help, \ - "help - print online help\n", \ - "[command ...]\n" \ - " - 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" \ - ), - -#define CMD_TBL_QUES MK_CMD_TBL_ENTRY( \ - "?", 1, CFG_MAXARGS, 1, do_help, \ - "? - alias for 'help'\n", \ - NULL \ - ), - -#define CMD_TBL_VERS MK_CMD_TBL_ENTRY( \ - "version", 4, 1, 1, do_version, \ - "version - print monitor version\n", \ - NULL \ - ), - -#define CMD_TBL_ECHO MK_CMD_TBL_ENTRY( \ - "echo", 4, CFG_MAXARGS, 1, do_echo, \ - "echo - echo args to console\n", \ - "[args..]\n" \ - " - echo args to console; \\c suppresses newline\n" \ - ), int do_version (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) @@ -152,32 +65,59 @@ do_echo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) * 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 do_help (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) { int i; int rcode = 0; - if (argc == 1) { /* print short help (usage) */ + if (argc == 1) { /*show list of commands */ + + int cmd_items = (((int) &__u_boot_cmd_end) - + ((int) &__u_boot_cmd_start)) / + sizeof (*cmdtp); + int end_sort; + cmd_tbl_t *cmd_array[(cmd_items + 1)]; + int i; + + /* Make list of commands from .uboot_cmd section */ + cmdtp = (cmd_tbl_t *) & __u_boot_cmd_start; + for (i = 1; i <= cmd_items; i++) { + cmd_array[i] = cmdtp; + cmdtp++; + } + /* Sort command list */ + end_sort = 0; + for (i = 1; end_sort != 1 || i <= cmd_items - 1; i++) { + if (i == cmd_items) { /* Last command */ + end_sort = 1; + i = 1; + } + + if (strcmp (cmd_array[i]->name, cmd_array[i + 1]->name) > 0) { + end_sort = 0; + *cmd_array[0] = *cmd_array[i]; + *cmd_array[i] = *cmd_array[i + 1]; + *cmd_array[i + 1] = *cmd_array[0]; + } + } - for (cmdtp=&cmd_tbl[0]; cmdtp->name; cmdtp++) { + /* print short help (usage) */ + for (cmdtp = (cmd_tbl_t *) & __u_boot_cmd_start; + cmdtp != (cmd_tbl_t *) & __u_boot_cmd_end; cmdtp++) { /* allow user abort */ - if (ctrlc()) + if (ctrlc ()) return 1; - if (cmdtp->usage == NULL) continue; puts (cmdtp->usage); } - return 0; } - /* * command help (long version) */ - for (i=1; i<argc; ++i) { - if ((cmdtp = find_cmd(argv[i])) != NULL) { + for (i = 1; i < argc; ++i) { + if ((cmdtp = find_cmd (argv[i])) != NULL) { #ifdef CFG_LONGHELP /* found - print (long) help info */ puts (cmdtp->name); @@ -196,164 +136,66 @@ do_help (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } else { printf ("Unknown command '%s' - try 'help'" " without arguments for list of all" - " known commands\n\n", - argv[i] - ); + " known commands\n\n", argv[i] + ); rcode = 1; } } return rcode; } + +cmd_tbl_t U_BOOT_CMD(HELP) = MK_CMD_ENTRY( + "help", CFG_MAXARGS, 1, do_help, + "help - print online help\n", + "[command ...]\n" + " - 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" +); + +cmd_tbl_t U_BOOT_CMD(QUES) = MK_CMD_ENTRY( + "?", CFG_MAXARGS, 1, do_help, + "? - alias for 'help'\n", + NULL +); + +cmd_tbl_t U_BOOT_CMD(VERS) = MK_CMD_ENTRY( + "version", 1, 1, do_version, + "version - print monitor version\n", + NULL +); + +cmd_tbl_t U_BOOT_CMD(ECHO) = MK_CMD_ENTRY( + "echo", CFG_MAXARGS, 1, do_echo, + "echo - echo args to console\n", + "[args..]\n" + " - echo args to console; \\c suppresses newline\n" +); + /*************************************************************************** * find command table entry for a command */ -cmd_tbl_t *find_cmd(const char *cmd) +cmd_tbl_t *find_cmd (const char *cmd) { cmd_tbl_t *cmdtp; - /* Search command table - Use linear search - it's a small table */ - for (cmdtp = &cmd_tbl[0]; cmdtp->name; cmdtp++) { - if (strncmp (cmd, cmdtp->name, cmdtp->lmin) == 0) + cmd_tbl_t *cmdtp_temp = &__u_boot_cmd_start; /*Init value */ + int one_cmd_name = 0; + + for (cmdtp = &__u_boot_cmd_start; cmdtp != &__u_boot_cmd_end; cmdtp++) { + if ((strncmp (cmd, cmdtp->name, strlen (cmd)) == 0) && + (strlen (cmd) == strlen (cmdtp->name))) return cmdtp; + else if (strncmp (cmd, cmdtp->name, strlen (cmd)) == 0) { + cmdtp_temp = cmdtp; + one_cmd_name++; + } else; } - return NULL; /* not found */ -} + if (one_cmd_name == 1) + return cmdtp_temp; -/* - * The commands in this table are sorted alphabetically by the - * command name and in descending order by the command name string - * length. This is to prevent conflicts in command name parsing. - * Please ensure that new commands are added according to that rule. - * Please use $(TOPDIR)/doc/README.commands as a reference AND make - * sure it gets updated. - */ - -cmd_tbl_t cmd_tbl[] = { - CMD_TBL_ASKENV - CMD_TBL_ASM - CMD_TBL_AUTOSCRIPT - CMD_TBL_BASE - CMD_TBL_BDINFO - CMD_TBL_BMP -#ifdef CONFIG_AMIGAONEG3SE - CMD_TBL_BOOTA -#endif - CMD_TBL_BOOTELF - CMD_TBL_BOOTM - CMD_TBL_BOOTP - CMD_TBL_BOOTVX - CMD_TBL_BOOTD - CMD_TBL_BREAK - CMD_TBL_BRGINFO - CMD_TBL_CARINFO - CMD_TBL_JFFS2_CHPART - CMD_TBL_CMP - CMD_TBL_CONINFO - CMD_TBL_CONTINUE - CMD_TBL_CP - CMD_TBL_CRC - CMD_TBL_DATE - CMD_TBL_DCACHE - CMD_TBL_DHCP - CMD_TBL_DIAG - CMD_TBL_DISK - CMD_TBL_DMAINFO - CMD_TBL_DIS - CMD_TBL_DOCBOOT - CMD_TBL_DOC - CMD_TBL_DTT - CMD_TBL_ECHO - CMD_TBL_EEPROM - CMD_TBL_FAT - CMD_TBL_FCCINFO - CMD_TBL_FLERASE - CMD_TBL_FDC - CMD_TBL_FDOS_BOOT - CMD_TBL_FDOS_LS - CMD_TBL_FLINFO - CMD_TBL_FPGA - CMD_TBL_JFFS2_FSINFO - CMD_TBL_JFFS2_FSLOAD - CMD_TBL_GETDCR - CMD_TBL_GO - CMD_TBL_HELP - CMD_TBL_HWFLOW - CMD_TBL_I2CINFO - CMD_TBL_ICACHE -#ifdef CONFIG_8260 - CMD_TBL_ICINFO -#endif - CMD_TBL_IMD - CMD_TBL_IMM - CMD_TBL_INM - CMD_TBL_IMW - CMD_TBL_PORTIO_IN - CMD_TBL_ICRC - CMD_TBL_IPROBE - CMD_TBL_ILOOP - CMD_TBL_ISDRAM - CMD_TBL_IDE - CMD_TBL_IMINFO - CMD_TBL_IOPINFO - CMD_TBL_IOPSET - CMD_TBL_IRQINFO - CMD_TBL_KGDB - CMD_TBL_LOADB - CMD_TBL_LOADS - CMD_TBL_LOG - CMD_TBL_LOOP - CMD_TBL_JFFS2_LS - CMD_TBL_MCCINFO - CMD_TBL_MMC - CMD_TBL_MD - CMD_TBL_MEMCINFO -#ifdef CONFIG_AMIGAONEG3SE - CMD_TBL_MENU -#endif - CMD_TBL_MII - CMD_TBL_MM - CMD_TBL_MTEST - CMD_TBL_MUXINFO - CMD_TBL_MW - CMD_TBL_NAND - CMD_TBL_NANDBOOT - CMD_TBL_NEXT - CMD_TBL_NM - CMD_TBL_PING - CMD_TBL_PORTIO_OUT - CMD_TBL_PCI - CMD_TBL_PRINTENV - CMD_TBL_PROTECT - CMD_TBL_RARPB - CMD_TBL_RDUMP - CMD_TBL_PINIT - CMD_TBL_REGINFO - CMD_TBL_RESET - CMD_TBL_RUN - CMD_TBL_SAVEENV - CMD_TBL_SAVES - CMD_TBL_SCCINFO - CMD_TBL_SCSIBOOT - CMD_TBL_SCSI - CMD_TBL_SETDCR - CMD_TBL_SETENV - CMD_TBL_SIINFO - CMD_TBL_SITINFO - CMD_TBL_SIUINFO - CMD_TBL_MISC /* sleep */ - CMD_TBL_SMCINFO - CMD_TBL_SPIINFO - CMD_TBL_SPI - CMD_TBL_STACK - CMD_TBL_STEP - CMD_TBL_TFTPB - CMD_TBL_USBBOOT - CMD_TBL_USB - CMD_TBL_VERS - CMD_TBL_BSP - CMD_TBL_VFD - CMD_TBL_QUES /* keep this ("help") the last entry */ - /* the following entry terminates this table */ - MK_CMD_TBL_ENTRY( NULL, 0, 0, 0, NULL, NULL, NULL ) -}; + return NULL; /* not found || one_cmd_name >2 */ +} |