diff options
Diffstat (limited to 'common/command.c')
-rw-r--r-- | common/command.c | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/common/command.c b/common/command.c new file mode 100644 index 0000000..2f50e6d --- /dev/null +++ b/common/command.c @@ -0,0 +1,328 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/* + * Command Processor Table + */ + +#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_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_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 */ + +/* + * 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[]) +{ + extern char version_string[]; + printf ("\n%s\n", version_string); + return 0; +} + +int +do_echo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + int i, putnl = 1; + + for (i = 1; i < argc; i++) { + char *p = argv[i], c; + + if (i > 1) + putc(' '); + while ((c = *p++) != '\0') + if (c == '\\' && *p == 'c') { + putnl = 0; + p++; + } + else + putc(c); + } + + if (putnl) + putc('\n'); + return 0; +} + +/* + * 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) { /* print short help (usage) */ + + for (cmdtp=&cmd_tbl[0]; cmdtp->name; cmdtp++) { + /* allow user abort */ + 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) { +#ifdef CFG_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 /* CFG_LONGHELP */ + } + else { + printf ("Unknown command '%s' - try 'help'" + " without arguments for list of all" + " known commands\n\n", + argv[i] + ); + rcode = 1; + } + } + return rcode; +} + +/*************************************************************************** + * find command table entry for a command + */ +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) + return cmdtp; + } + return NULL; /* not found */ +} + +/* + * 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_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_FCCINFO + CMD_TBL_FLERASE + CMD_TBL_FDC + 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_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_LOOP + CMD_TBL_JFFS2_LS + CMD_TBL_MCCINFO + CMD_TBL_MD + CMD_TBL_MEMCINFO + CMD_TBL_MII + CMD_TBL_MM + CMD_TBL_MTEST + CMD_TBL_MUXINFO + CMD_TBL_MW + CMD_TBL_NEXT + CMD_TBL_NM + 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_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 ) +}; |