sort when sorting command name list). Minor cleanup here and there.
Changes since U-Boot 0.4.0:
======================================================================
+* Rewrite command lookup and help command (fix problems with bubble
+ sort when sorting command name list). Minor cleanup here and there.
+
* Merge from "stable branch", tag LABEL_2003_06_28_1800-stable:
- Allow to call sysmon function interactively
- PIC on LWMON board needs delay after power-on
*/
#include <common.h>
#include <command.h>
+#include <net.h> /* for print_IPaddr */
#if (CONFIG_COMMANDS & CFG_CMD_BDI)
}
cmd_tbl_t U_BOOT_CMD(BOOTD) = MK_CMD_ENTRY(
- "bootd", 1, 1, do_bootd,
+ "boot", 1, 1, do_bootd,
+ "boot - boot default, i.e., run 'bootcmd'\n",
+ NULL
+);
+
+/* keep old command name "bootd" for backward compatibility */
+cmd_tbl_t U_BOOT_CMD(BOOTD) = MK_CMD_ENTRY(
+ "bootd", 1, 1, do_bootd,
"bootd - boot default, i.e., run 'bootcmd'\n",
NULL
);
#include <dataflash.h>
#endif
-#if (CONFIG_COMMANDS & (CFG_CMD_MEMORY | CFG_CMD_PCI | CFG_CMD_I2C\
- | CMD_CMD_PORTIO))
+#if (CONFIG_COMMANDS & (CFG_CMD_MEMORY | \
+ CFG_CMD_I2C | \
+ CFG_CMD_PCI | \
+ CMD_CMD_PORTIO ) )
int cmd_get_data_size(char* arg, int default_size)
{
/* Check for a size specification .b, .w or .l.
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++;
+ int cmd_items = &__u_boot_cmd_end -
+ &__u_boot_cmd_start; /* pointer arith! */
+ cmd_tbl_t *cmd_array[cmd_items];
+ int i, j, swaps;
+
+ /* Make array of commands from .uboot_cmd section */
+ cmdtp = &__u_boot_cmd_start;
+ for (i = 0; i < cmd_items; i++) {
+ cmd_array[i] = 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];
+ /* 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 (cmdtp = (cmd_tbl_t *) & __u_boot_cmd_start;
- cmdtp != (cmd_tbl_t *) & __u_boot_cmd_end; cmdtp++) {
+ for (i = 0; i < cmd_items; i++) {
+ const char *usage = cmd_array[i]->usage;
+
/* allow user abort */
if (ctrlc ())
return 1;
- if (cmdtp->usage == NULL)
+ if (usage == NULL)
continue;
- puts (cmdtp->usage);
+ puts (usage);
}
return 0;
}
cmd_tbl_t *find_cmd (const char *cmd)
{
cmd_tbl_t *cmdtp;
-
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;
+ const char *p;
+ int len;
+ int n_found = 0;
+
+ /*
+ * Some commands allow length modifiers (like "cp.b");
+ * compare command name only until first dot.
+ */
+ len = ((p = strchr(cmd, '.')) == NULL) ? strlen (cmd) : (p - cmd);
+
+ for (cmdtp = &__u_boot_cmd_start;
+ cmdtp != &__u_boot_cmd_end;
+ cmdtp++) {
+ if (strncmp (cmd, cmdtp->name, len) == 0) {
+ if (len == strlen (cmdtp->name))
+ return cmdtp; /* full match */
+
+ cmdtp_temp = cmdtp; /* abbreviated command ? */
+ n_found++;
+ }
}
- if (one_cmd_name == 1)
+ if (n_found == 1) { /* exactly one match */
return cmdtp_temp;
+ }
- return NULL; /* not found || one_cmd_name >2 */
+ return NULL; /* not found or ambiguous command */
}
#ifdef CONFIG_LOGBUFFER
/* reserve kernel log buffer */
addr -= (LOGBUFF_RESERVE);
-# ifdef DEBUG
- printf ("Reserving %ldk for kernel logbuffer at %08lx\n", LOGBUFF_LEN, addr);
-# endif
+ debug ("Reserving %dk for kernel logbuffer at %08lx\n", LOGBUFF_LEN, addr);
#endif
#ifdef CONFIG_PRAM
i = getenv_r ("pram", tmp, sizeof (tmp));
reg = (i > 0) ? simple_strtoul (tmp, NULL, 10) : CONFIG_PRAM;
addr -= (reg << 10); /* size is in kB */
-# ifdef DEBUG
- printf ("Reserving %ldk for protected RAM at %08lx\n", reg, addr);
-# endif
+ debug ("Reserving %ldk for protected RAM at %08lx\n", reg, addr);
#endif /* CONFIG_PRAM */
/* round down to next 4 kB limit */
addr &= ~(4096 - 1);
-#ifdef DEBUG
- printf ("Top of RAM usable for U-Boot at: %08lx\n", addr);
-#endif
+ debug ("Top of RAM usable for U-Boot at: %08lx\n", addr);
#ifdef CONFIG_LCD
/* reserve memory for LCD display (always full pages) */
addr -= len;
addr &= ~(4096 - 1);
-#ifdef DEBUG
- printf ("Reserving %ldk for U-Boot at: %08lx\n", len >> 10, addr);
-#endif
+ debug ("Reserving %ldk for U-Boot at: %08lx\n", len >> 10, addr);
#ifdef CONFIG_AMIGAONEG3SE
gd->relocaddr = addr;
* reserve memory for malloc() arena
*/
addr_sp = addr - TOTAL_MALLOC_LEN;
-#ifdef DEBUG
- printf ("Reserving %dk for malloc() at: %08lx\n",
+ debug ("Reserving %dk for malloc() at: %08lx\n",
TOTAL_MALLOC_LEN >> 10, addr_sp);
-#endif
/*
* (permanently) allocate a Board Info struct
addr_sp -= sizeof (bd_t);
bd = (bd_t *) addr_sp;
gd->bd = bd;
-#ifdef DEBUG
- printf ("Reserving %d Bytes for Board Info at: %08lx\n",
+ debug ("Reserving %d Bytes for Board Info at: %08lx\n",
sizeof (bd_t), addr_sp);
-#endif
addr_sp -= sizeof (gd_t);
id = (gd_t *) addr_sp;
-#ifdef DEBUG
- printf ("Reserving %d Bytes for Global Data at: %08lx\n",
+ debug ("Reserving %d Bytes for Global Data at: %08lx\n",
sizeof (gd_t), addr_sp);
-#endif
/*
* Finally, we set up a new (bigger) stack.
addr_sp &= ~0xF;
*((ulong *) addr_sp)-- = 0;
*((ulong *) addr_sp)-- = 0;
-#ifdef DEBUG
- printf ("Stack Pointer at: %08lx\n", addr_sp);
-#endif
+ debug ("Stack Pointer at: %08lx\n", addr_sp);
/*
* Save local variables to board info struct
#endif
#endif
-#ifdef DEBUG
- printf ("New Stack Pointer is: %08lx\n", addr_sp);
-#endif
+ debug ("New Stack Pointer is: %08lx\n", addr_sp);
WATCHDOG_RESET ();
gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */
-#ifdef DEBUG
- printf ("Now running in RAM - U-Boot at: %08lx\n", dest_addr);
-#endif
+ debug ("Now running in RAM - U-Boot at: %08lx\n", dest_addr);
WATCHDOG_RESET ();
defined(CONFIG_SPD823TS) )
WATCHDOG_RESET ();
-# ifdef DEBUG
- puts ("Reset Ethernet PHY\n");
-# endif
+ debug ("Reset Ethernet PHY\n");
reset_phy ();
#endif
kgdb_init ();
#endif
-#ifdef DEBUG
- printf ("U-Boot relocated to %08lx\n", dest_addr);
-#endif
+ debug ("U-Boot relocated to %08lx\n", dest_addr);
/*
* Enable Interrupts