>
> Hi Nitin,
>
> > Hi!
> >
> > I am doing env settings some thing like this,
> >
> > ROOT1=/dev/mmcblk0p1
> > ROOT2=/dev/mmcblk0p2
> > ROOT=${ROOT1}
> > bootargs1=console=ttyS0,115200n8 mem=256M noinitrd rw rootdelay=1 ${ROOT}
> >
> > when I say 'setenv bootargs ${bootargs1}', ${ROOT} gets resolved to 'ROOT1',
> it does not get completely resolved to '/dev/mmcblk0p1'.
> >
> > Is there something fundamentally wrong in setting the env variables
> > this way?
>
> There is nothing fundamentally wrong - it will simply not work ;)  No,
> seriously, you want U-Boot to do two evaluation passes over bootargs,
> which we cannot do.  In a regular shell this would be done by a separate
> "eval" or backtick round, but we lack this.

I recall impl. something like this for the old shell. It enabled me
to do:

 linuxip=ip=$(ipaddr)::$(gatewayip):$(netmask):$(hostname):$(linuxif):off
 tboot=setenv bootargs $(linuxroot) $(linuxip) $(extra);tftp 100000; bootm 
100000

it was fairly simple to do but I don't think WD applied it since the old shell 
was obsolete

I guess it would not be hard to do the same for hush. If I fund the correct 
commit
it looked like this for the old shell:

Index: main.c
===================================================================
--- main.c      (revision 15)
+++ main.c      (revision 16)
@@ -463,9 +463,9 @@

 /****************************************************************************/

-static void process_macros (const char *input, char *output)
+static int process_macros (const char *input, char *output)
 {
-       char c, prev;
+       char c, prev, macro_processed =0;
        const char *varname_start;
        int inputcnt  = strlen (input);
        int outputcnt = CFG_CBSIZE;
@@ -540,6 +540,7 @@
                                }
                        /* Look for another '$' */
                        state = 0;
+                       macro_processed = 1;
                }
                break;
            }
@@ -549,7 +550,7 @@

        if (outputcnt)
                *output = 0;
-
+       return macro_processed;
 #ifdef DEBUG_PARSER
        printf ("[PROCESS_MACROS] OUTPUT len %d: \"%s\"\n",
                strlen(output_start), output_start);
@@ -580,6 +581,7 @@
        char *token;                    /* start of token in cmdbuf     */
        char *sep;                      /* end of token (separator) in cmdbuf */
        char finaltoken[CFG_CBSIZE];
+       char tmptoken[CFG_CBSIZE];
        char *str = cmdbuf;
        char *argv[CFG_MAXARGS + 1];    /* NULL terminated      */
        int argc;
@@ -631,7 +633,11 @@
 #endif

                /* find macros in this token and replace them */
-               process_macros (token, finaltoken);
+               if(process_macros (token, finaltoken)){
+                 strcpy(tmptoken,finaltoken);
+                 while(process_macros (tmptoken, finaltoken))
+                       strcpy(tmptoken,finaltoken);
+               }

                /* Extract arguments */
                argc = parse_line (finaltoken, argv);


    Jocke

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to