mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
Rewrite command lookup and help command (fix problems with bubble
sort when sorting command name list). Minor cleanup here and there.
This commit is contained in:
parent
d1cbe85b08
commit
9d2b18a0f9
6 changed files with 77 additions and 78 deletions
|
@ -2,6 +2,9 @@
|
||||||
Changes since U-Boot 0.4.0:
|
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:
|
* Merge from "stable branch", tag LABEL_2003_06_28_1800-stable:
|
||||||
- Allow to call sysmon function interactively
|
- Allow to call sysmon function interactively
|
||||||
- PIC on LWMON board needs delay after power-on
|
- PIC on LWMON board needs delay after power-on
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
*/
|
*/
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <command.h>
|
#include <command.h>
|
||||||
|
#include <net.h> /* for print_IPaddr */
|
||||||
|
|
||||||
|
|
||||||
#if (CONFIG_COMMANDS & CFG_CMD_BDI)
|
#if (CONFIG_COMMANDS & CFG_CMD_BDI)
|
||||||
|
|
|
@ -872,6 +872,13 @@ int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||||
return rcode;
|
return rcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cmd_tbl_t U_BOOT_CMD(BOOTD) = MK_CMD_ENTRY(
|
||||||
|
"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(
|
cmd_tbl_t U_BOOT_CMD(BOOTD) = MK_CMD_ENTRY(
|
||||||
"bootd", 1, 1, do_bootd,
|
"bootd", 1, 1, do_bootd,
|
||||||
"bootd - boot default, i.e., run 'bootcmd'\n",
|
"bootd - boot default, i.e., run 'bootcmd'\n",
|
||||||
|
|
|
@ -36,8 +36,10 @@
|
||||||
#include <dataflash.h>
|
#include <dataflash.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (CONFIG_COMMANDS & (CFG_CMD_MEMORY | CFG_CMD_PCI | CFG_CMD_I2C\
|
#if (CONFIG_COMMANDS & (CFG_CMD_MEMORY | \
|
||||||
| CMD_CMD_PORTIO))
|
CFG_CMD_I2C | \
|
||||||
|
CFG_CMD_PCI | \
|
||||||
|
CMD_CMD_PORTIO ) )
|
||||||
int cmd_get_data_size(char* arg, int default_size)
|
int cmd_get_data_size(char* arg, int default_size)
|
||||||
{
|
{
|
||||||
/* Check for a size specification .b, .w or .l.
|
/* Check for a size specification .b, .w or .l.
|
||||||
|
|
|
@ -72,44 +72,44 @@ int do_help (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
|
||||||
|
|
||||||
if (argc == 1) { /*show list of commands */
|
if (argc == 1) { /*show list of commands */
|
||||||
|
|
||||||
int cmd_items = (((int) &__u_boot_cmd_end) -
|
int cmd_items = &__u_boot_cmd_end -
|
||||||
((int) &__u_boot_cmd_start)) /
|
&__u_boot_cmd_start; /* pointer arith! */
|
||||||
sizeof (*cmdtp);
|
cmd_tbl_t *cmd_array[cmd_items];
|
||||||
int end_sort;
|
int i, j, swaps;
|
||||||
cmd_tbl_t *cmd_array[(cmd_items + 1)];
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Make list of commands from .uboot_cmd section */
|
/* Make array of commands from .uboot_cmd section */
|
||||||
cmdtp = (cmd_tbl_t *) & __u_boot_cmd_start;
|
cmdtp = &__u_boot_cmd_start;
|
||||||
for (i = 1; i <= cmd_items; i++) {
|
for (i = 0; i < cmd_items; i++) {
|
||||||
cmd_array[i] = cmdtp;
|
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) {
|
/* Sort command list (trivial bubble sort) */
|
||||||
end_sort = 0;
|
for (i = cmd_items - 1; i > 0; --i) {
|
||||||
*cmd_array[0] = *cmd_array[i];
|
swaps = 0;
|
||||||
*cmd_array[i] = *cmd_array[i + 1];
|
for (j = 0; j < i; ++j) {
|
||||||
*cmd_array[i + 1] = *cmd_array[0];
|
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) */
|
/* print short help (usage) */
|
||||||
for (cmdtp = (cmd_tbl_t *) & __u_boot_cmd_start;
|
for (i = 0; i < cmd_items; i++) {
|
||||||
cmdtp != (cmd_tbl_t *) & __u_boot_cmd_end; cmdtp++) {
|
const char *usage = cmd_array[i]->usage;
|
||||||
|
|
||||||
/* allow user abort */
|
/* allow user abort */
|
||||||
if (ctrlc ())
|
if (ctrlc ())
|
||||||
return 1;
|
return 1;
|
||||||
if (cmdtp->usage == NULL)
|
if (usage == NULL)
|
||||||
continue;
|
continue;
|
||||||
puts (cmdtp->usage);
|
puts (usage);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -181,21 +181,31 @@ cmd_tbl_t U_BOOT_CMD(ECHO) = MK_CMD_ENTRY(
|
||||||
cmd_tbl_t *find_cmd (const char *cmd)
|
cmd_tbl_t *find_cmd (const char *cmd)
|
||||||
{
|
{
|
||||||
cmd_tbl_t *cmdtp;
|
cmd_tbl_t *cmdtp;
|
||||||
|
|
||||||
cmd_tbl_t *cmdtp_temp = &__u_boot_cmd_start; /*Init value */
|
cmd_tbl_t *cmdtp_temp = &__u_boot_cmd_start; /*Init value */
|
||||||
int one_cmd_name = 0;
|
const char *p;
|
||||||
|
int len;
|
||||||
|
int n_found = 0;
|
||||||
|
|
||||||
for (cmdtp = &__u_boot_cmd_start; cmdtp != &__u_boot_cmd_end; cmdtp++) {
|
/*
|
||||||
if ((strncmp (cmd, cmdtp->name, strlen (cmd)) == 0) &&
|
* Some commands allow length modifiers (like "cp.b");
|
||||||
(strlen (cmd) == strlen (cmdtp->name)))
|
* compare command name only until first dot.
|
||||||
return cmdtp;
|
*/
|
||||||
else if (strncmp (cmd, cmdtp->name, strlen (cmd)) == 0) {
|
len = ((p = strchr(cmd, '.')) == NULL) ? strlen (cmd) : (p - cmd);
|
||||||
cmdtp_temp = cmdtp;
|
|
||||||
one_cmd_name++;
|
for (cmdtp = &__u_boot_cmd_start;
|
||||||
} else;
|
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 cmdtp_temp;
|
||||||
|
}
|
||||||
return NULL; /* not found || one_cmd_name >2 */
|
|
||||||
|
return NULL; /* not found or ambiguous command */
|
||||||
}
|
}
|
||||||
|
|
|
@ -401,9 +401,7 @@ void board_init_f (ulong bootflag)
|
||||||
#ifdef CONFIG_LOGBUFFER
|
#ifdef CONFIG_LOGBUFFER
|
||||||
/* reserve kernel log buffer */
|
/* reserve kernel log buffer */
|
||||||
addr -= (LOGBUFF_RESERVE);
|
addr -= (LOGBUFF_RESERVE);
|
||||||
# ifdef DEBUG
|
debug ("Reserving %dk for kernel logbuffer at %08lx\n", LOGBUFF_LEN, addr);
|
||||||
printf ("Reserving %ldk for kernel logbuffer at %08lx\n", LOGBUFF_LEN, addr);
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_PRAM
|
#ifdef CONFIG_PRAM
|
||||||
|
@ -413,16 +411,12 @@ void board_init_f (ulong bootflag)
|
||||||
i = getenv_r ("pram", tmp, sizeof (tmp));
|
i = getenv_r ("pram", tmp, sizeof (tmp));
|
||||||
reg = (i > 0) ? simple_strtoul (tmp, NULL, 10) : CONFIG_PRAM;
|
reg = (i > 0) ? simple_strtoul (tmp, NULL, 10) : CONFIG_PRAM;
|
||||||
addr -= (reg << 10); /* size is in kB */
|
addr -= (reg << 10); /* size is in kB */
|
||||||
# ifdef DEBUG
|
debug ("Reserving %ldk for protected RAM at %08lx\n", reg, addr);
|
||||||
printf ("Reserving %ldk for protected RAM at %08lx\n", reg, addr);
|
|
||||||
# endif
|
|
||||||
#endif /* CONFIG_PRAM */
|
#endif /* CONFIG_PRAM */
|
||||||
|
|
||||||
/* round down to next 4 kB limit */
|
/* round down to next 4 kB limit */
|
||||||
addr &= ~(4096 - 1);
|
addr &= ~(4096 - 1);
|
||||||
#ifdef DEBUG
|
debug ("Top of RAM usable for U-Boot at: %08lx\n", addr);
|
||||||
printf ("Top of RAM usable for U-Boot at: %08lx\n", addr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_LCD
|
#ifdef CONFIG_LCD
|
||||||
/* reserve memory for LCD display (always full pages) */
|
/* reserve memory for LCD display (always full pages) */
|
||||||
|
@ -443,9 +437,7 @@ void board_init_f (ulong bootflag)
|
||||||
addr -= len;
|
addr -= len;
|
||||||
addr &= ~(4096 - 1);
|
addr &= ~(4096 - 1);
|
||||||
|
|
||||||
#ifdef DEBUG
|
debug ("Reserving %ldk for U-Boot at: %08lx\n", len >> 10, addr);
|
||||||
printf ("Reserving %ldk for U-Boot at: %08lx\n", len >> 10, addr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_AMIGAONEG3SE
|
#ifdef CONFIG_AMIGAONEG3SE
|
||||||
gd->relocaddr = addr;
|
gd->relocaddr = addr;
|
||||||
|
@ -455,10 +447,8 @@ void board_init_f (ulong bootflag)
|
||||||
* reserve memory for malloc() arena
|
* reserve memory for malloc() arena
|
||||||
*/
|
*/
|
||||||
addr_sp = addr - TOTAL_MALLOC_LEN;
|
addr_sp = addr - TOTAL_MALLOC_LEN;
|
||||||
#ifdef DEBUG
|
debug ("Reserving %dk for malloc() at: %08lx\n",
|
||||||
printf ("Reserving %dk for malloc() at: %08lx\n",
|
|
||||||
TOTAL_MALLOC_LEN >> 10, addr_sp);
|
TOTAL_MALLOC_LEN >> 10, addr_sp);
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (permanently) allocate a Board Info struct
|
* (permanently) allocate a Board Info struct
|
||||||
|
@ -467,16 +457,12 @@ void board_init_f (ulong bootflag)
|
||||||
addr_sp -= sizeof (bd_t);
|
addr_sp -= sizeof (bd_t);
|
||||||
bd = (bd_t *) addr_sp;
|
bd = (bd_t *) addr_sp;
|
||||||
gd->bd = bd;
|
gd->bd = bd;
|
||||||
#ifdef DEBUG
|
debug ("Reserving %d Bytes for Board Info at: %08lx\n",
|
||||||
printf ("Reserving %d Bytes for Board Info at: %08lx\n",
|
|
||||||
sizeof (bd_t), addr_sp);
|
sizeof (bd_t), addr_sp);
|
||||||
#endif
|
|
||||||
addr_sp -= sizeof (gd_t);
|
addr_sp -= sizeof (gd_t);
|
||||||
id = (gd_t *) addr_sp;
|
id = (gd_t *) addr_sp;
|
||||||
#ifdef DEBUG
|
debug ("Reserving %d Bytes for Global Data at: %08lx\n",
|
||||||
printf ("Reserving %d Bytes for Global Data at: %08lx\n",
|
|
||||||
sizeof (gd_t), addr_sp);
|
sizeof (gd_t), addr_sp);
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Finally, we set up a new (bigger) stack.
|
* Finally, we set up a new (bigger) stack.
|
||||||
|
@ -488,9 +474,7 @@ void board_init_f (ulong bootflag)
|
||||||
addr_sp &= ~0xF;
|
addr_sp &= ~0xF;
|
||||||
*((ulong *) addr_sp)-- = 0;
|
*((ulong *) addr_sp)-- = 0;
|
||||||
*((ulong *) addr_sp)-- = 0;
|
*((ulong *) addr_sp)-- = 0;
|
||||||
#ifdef DEBUG
|
debug ("Stack Pointer at: %08lx\n", addr_sp);
|
||||||
printf ("Stack Pointer at: %08lx\n", addr_sp);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Save local variables to board info struct
|
* Save local variables to board info struct
|
||||||
|
@ -536,9 +520,7 @@ void board_init_f (ulong bootflag)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG
|
debug ("New Stack Pointer is: %08lx\n", addr_sp);
|
||||||
printf ("New Stack Pointer is: %08lx\n", addr_sp);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
WATCHDOG_RESET ();
|
WATCHDOG_RESET ();
|
||||||
|
|
||||||
|
@ -588,9 +570,7 @@ void board_init_r (gd_t *id, ulong dest_addr)
|
||||||
|
|
||||||
gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */
|
gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */
|
||||||
|
|
||||||
#ifdef DEBUG
|
debug ("Now running in RAM - U-Boot at: %08lx\n", dest_addr);
|
||||||
printf ("Now running in RAM - U-Boot at: %08lx\n", dest_addr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
WATCHDOG_RESET ();
|
WATCHDOG_RESET ();
|
||||||
|
|
||||||
|
@ -847,9 +827,7 @@ void board_init_r (gd_t *id, ulong dest_addr)
|
||||||
defined(CONFIG_SPD823TS) )
|
defined(CONFIG_SPD823TS) )
|
||||||
|
|
||||||
WATCHDOG_RESET ();
|
WATCHDOG_RESET ();
|
||||||
# ifdef DEBUG
|
debug ("Reset Ethernet PHY\n");
|
||||||
puts ("Reset Ethernet PHY\n");
|
|
||||||
# endif
|
|
||||||
reset_phy ();
|
reset_phy ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -859,9 +837,7 @@ void board_init_r (gd_t *id, ulong dest_addr)
|
||||||
kgdb_init ();
|
kgdb_init ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG
|
debug ("U-Boot relocated to %08lx\n", dest_addr);
|
||||||
printf ("U-Boot relocated to %08lx\n", dest_addr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enable Interrupts
|
* Enable Interrupts
|
||||||
|
|
Loading…
Reference in a new issue