Add command for handling DDR ECC registers on MPC8349EE MDS board.
[oweals/u-boot.git] / common / main.c
index 73f8ff9f0bed86169cf5e5f83c10ccb240790c90..445cb18491b0688eaad32a774583a5203ac1c21b 100644 (file)
@@ -26,7 +26,9 @@
 #include <common.h>
 #include <watchdog.h>
 #include <command.h>
-#include <malloc.h>
+#ifdef CONFIG_MODEM_SUPPORT
+#include <malloc.h>            /* for free() prototype */
+#endif
 
 #ifdef CFG_HUSH_PARSER
 #include <hush.h>
@@ -102,6 +104,18 @@ static __inline__ int abortboot(int bootdelay)
        u_int presskey_max = 0;
        u_int i;
 
+#ifdef CONFIG_SILENT_CONSOLE
+       {
+               DECLARE_GLOBAL_DATA_PTR;
+
+               if (gd->flags & GD_FLG_SILENT) {
+                       /* Restore serial console */
+                       console_assign (stdout, "serial");
+                       console_assign (stderr, "serial");
+               }
+       }
+#endif
+
 #  ifdef CONFIG_AUTOBOOT_PROMPT
        printf (CONFIG_AUTOBOOT_PROMPT, bootdelay);
 #  endif
@@ -177,9 +191,24 @@ static __inline__ int abortboot(int bootdelay)
        }
 #  if DEBUG_BOOTKEYS
        if (!abort)
-               printf("key timeout\n");
+               puts ("key timeout\n");
 #  endif
 
+#ifdef CONFIG_SILENT_CONSOLE
+       {
+               DECLARE_GLOBAL_DATA_PTR;
+
+               if (abort) {
+                       /* permanently enable normal console output */
+                       gd->flags &= ~(GD_FLG_SILENT);
+               } else if (gd->flags & GD_FLG_SILENT) {
+                       /* Restore silent console */
+                       console_assign (stdout, "nulldev");
+                       console_assign (stderr, "nulldev");
+               }
+       }
+#endif
+
        return abort;
 }
 
@@ -219,7 +248,7 @@ static __inline__ int abortboot(int bootdelay)
        if (bootdelay >= 0) {
                if (tstc()) {   /* we got a key press   */
                        (void) getc();  /* consume input        */
-                       printf ("\b\b\b 0");
+                       puts ("\b\b\b 0");
                        abort = 1;      /* don't auto boot      */
                }
        }
@@ -318,7 +347,7 @@ void main_loop (void)
 #ifdef CONFIG_MODEM_SUPPORT
        debug ("DEBUG: main_loop:   do_mdm_init=%d\n", do_mdm_init);
        if (do_mdm_init) {
-               uchar *str = strdup(getenv("mdm_cmd"));
+               char *str = strdup(getenv("mdm_cmd"));
                setenv ("preboot", str);  /* set or delete definition */
                if (str != NULL)
                        free (str);
@@ -338,6 +367,10 @@ void main_loop (void)
        u_boot_hush_start ();
 #endif
 
+#ifdef CONFIG_AUTO_COMPLETE
+       install_auto_complete();
+#endif
+
 #ifdef CONFIG_PREBOOT
        if ((p = getenv ("preboot")) != NULL) {
 # ifdef CONFIG_AUTOBOOT_KEYED
@@ -401,7 +434,7 @@ void main_loop (void)
            s = getenv("menucmd");
            if (s) {
 # ifndef CFG_HUSH_PARSER
-               run_command (s, bd, 0);
+               run_command (s, 0);
 # else
                parse_string_outer(s, FLAG_PARSE_SEMICOLON |
                                    FLAG_EXIT_FROM_LOOP);
@@ -446,7 +479,7 @@ void main_loop (void)
                else if (len == -2) {
                        /* -2 means timed out, retry autoboot
                         */
-                       printf("\nTimed out waiting for command\n");
+                       puts ("\nTimed out waiting for command\n");
 # ifdef CONFIG_RESET_TO_RETRY
                        /* Reinit board to run initialization code again */
                        do_reset (NULL, 0, 0, NULL);
@@ -457,7 +490,7 @@ void main_loop (void)
 #endif
 
                if (len == -1)
-                       printf ("<INTERRUPT>\n");
+                       puts ("<INTERRUPT>\n");
                else
                        rc = run_command (lastcommand, flag);
 
@@ -478,7 +511,7 @@ void init_cmd_timeout(void)
        char *s = getenv ("bootretry");
 
        if (s != NULL)
-               retry_time = (int)simple_strtoul(s, NULL, 10);
+               retry_time = (int)simple_strtol(s, NULL, 10);
        else
                retry_time =  CONFIG_BOOT_RETRY_TIME;
 
@@ -547,6 +580,9 @@ int readline (const char *const prompt)
                        puts ("\r\n");
                        return (p - console_buffer);
 
+               case '\0':                              /* nul                  */
+                       continue;
+
                case 0x03:                              /* ^C - break           */
                        console_buffer[0] = '\0';       /* discard input */
                        return (-1);
@@ -578,6 +614,14 @@ int readline (const char *const prompt)
                         */
                        if (n < CFG_CBSIZE-2) {
                                if (c == '\t') {        /* expand TABs          */
+#ifdef CONFIG_AUTO_COMPLETE
+                                       /* if auto completion triggered just continue */
+                                       *p = '\0';
+                                       if (cmd_auto_complete(prompt, console_buffer, &n, &col)) {
+                                               p = console_buffer + n; /* reset */
+                                               continue;
+                                       }
+#endif
                                        puts (tab_seq+(col&07));
                                        col += 8 - (col&07);
                                } else {
@@ -684,8 +728,8 @@ static void process_macros (const char *input, char *output)
        int inputcnt  = strlen (input);
        int outputcnt = CFG_CBSIZE;
        int state = 0;  /* 0 = waiting for '$'  */
-                       /* 1 = waiting for '('  */
-                       /* 2 = waiting for ')'  */
+                       /* 1 = waiting for '(' or '{' */
+                       /* 2 = waiting for ')' or '}' */
                        /* 3 = waiting for '''  */
 #ifdef DEBUG_PARSER
        char *output_start = output;
@@ -723,7 +767,7 @@ static void process_macros (const char *input, char *output)
                }
                break;
            case 1:                     /* Waiting for (        */
-               if (c == '(') {
+               if (c == '(' || c == '{') {
                        state++;
                        varname_start = input;
                } else {
@@ -738,7 +782,7 @@ static void process_macros (const char *input, char *output)
                }
                break;
            case 2:                     /* Waiting for )        */
-               if (c == ')') {
+               if (c == ')' || c == '}') {
                        int i;
                        char envname[CFG_CBSIZE], *envval;
                        int envcnt = input-varname_start-1; /* Varname # of chars */
@@ -875,7 +919,10 @@ int run_command (const char *cmd, int flag)
                process_macros (token, finaltoken);
 
                /* Extract arguments */
-               argc = parse_line (finaltoken, argv);
+               if ((argc = parse_line (finaltoken, argv)) == 0) {
+                       rc = -1;        /* no command at all */
+                       continue;
+               }
 
                /* Look up command in command table */
                if ((cmdtp = find_cmd(argv[0])) == NULL) {
@@ -898,12 +945,12 @@ int run_command (const char *cmd, int flag)
                        printf ("[%s]\n", finaltoken);
 #endif
                        if (flag & CMD_FLAG_BOOTD) {
-                               printf ("'bootd' recursion detected\n");
+                               puts ("'bootd' recursion detected\n");
                                rc = -1;
                                continue;
-                       }
-                       else
+                       } else {
                                flag |= CMD_FLAG_BOOTD;
+                       }
                }
 #endif /* CFG_CMD_BOOTD */