Hi Wolfgang,

I could think of some situations where the new env command
is helpful. But more during development than for production systems.

Switching between environment profiles would be cool. And a "env default -f"
behavior that keeps MAC addresses and serial# is also on my wishlist.

I did some testing on our PMC440 with environment in EEPROM.
Please see some comments below.

On Saturday 17 July 2010 21:45, Wolfgang Denk wrote:
> diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c
> index 8c86f15..976a30b 100644
> --- a/common/cmd_nvedit.c
> +++ b/common/cmd_nvedit.c
...
> +/*
> + * env export [-t | -b | -c] addr [size]
> + *   -t:     export as text format; if size is given, data will be
> + *           padded with '\0' bytes; if not, one terminating '\0'
> + *           will be added (which is included in the "filesize"
> + *           setting so you can for exmple copy this to flash and
> + *           keep the termination).
> + *   -b:     export as binary format (name=value pairs separated by
> + *           '\0', list end marked by double "\0\0")
> + *   -c:     export as checksum protected environment format as
> + *           used for example by "saveenv" command
> + *   addr:   memory address where environment gets stored
> + *   size:   size of output buffer
> + *
...
> +static int do_env_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const 
> argv[])
> +{
> +     char    buf[32];
> +     char    *addr, *cmd, *res;
> +     size_t  size;
> +     ssize_t len;
> +     env_t   *envp = (env_t *)addr;
addr is uninitialized. declaration is enough here.
> +     char    sep = '\n';
> +     int     chk = 0;
> +     int     fmt = 0;
> +
> +     cmd = *argv;
> +
> +     while (--argc > 0 && **++argv == '-') {
I'd like some more braces for readability.

> +             char *arg = *argv;
> +             while (*++arg) {
> +                     switch (*arg) {
> +                     case 'b':               /* raw binary format */
> +                             if (fmt++)
> +                                     goto sep_err;
> +                             sep = '\0';
> +                             break;
> +                     case 'c':               /* external checksum format */
> +                             if (fmt++)
> +                                     goto sep_err;
> +                             sep = '\0';
> +                             chk = 1;
> +                             break;
> +                     case 't':               /* text format */
> +                             if (fmt++)
> +                                     goto sep_err;
> +                             sep = '\n';
> +                             break;
> +                     default:
> +                             cmd_usage(cmdtp);
> +                             return 1;
> +                     }
> +             }
> +     }
>  
> -/**************************************************/
> +     if (argc < 1) {
> +             cmd_usage(cmdtp);
> +             return 1;
> +     }
> +
> +     addr = (char *)simple_strtoul(argv[0], NULL, 16);
> +
> +     if (argc == 2) {
> +             size = simple_strtoul(argv[1], NULL, 16);
> +             memset(addr, '\0', size);
> +     } else {
> +             size = 0;
> +     }
> +
> +     if (sep) {              /* export as text file */
> +             len = hexport(sep, &addr, size);
> +             if (len < 0) {
> +                     error("Cannot export environment: errno = %d\n",
> +                             errno);
> +                     return 1;
> +             }
> +             sprintf(buf, "%zX", len);
> +             setenv("filesize", buf);
> +
> +             return 0;
> +     }
> +
> +     if (chk) {              /* export as checksum protected block */
Add:
                envp = (env_t *)addr;
> +             res = (char *)&envp->data;
> +     } else {                /* export as raw binary data */
> +             res = (char *)&addr;
Should'n this be 
                res = addr;

> +     }
> +
> +     len = hexport('\0', &res, ENV_SIZE);
> +     if (len < 0) {
> +             error("Cannot export environment: errno = %d\n",
> +                     errno);
> +             return 1;
> +     }
> +
> +     if (chk) {
> +             envp->crc   = crc32(0, envp->data, ENV_SIZE);
> +#ifdef CONFIG_ENV_ADDR_REDUND
> +             envp->flags = ACTIVE_FLAG;
> +#endif
> +     }
> +     sprintf(buf, "%zX", len + offsetof(env_t,data));
> +     setenv("filesize", buf);
> +
> +     return 0;
> +
> +sep_err:
> +     printf("## %s: only one of \"-b\", \"-c\" or \"-t\" allowed\n",
> +             cmd);
> +     return 1;
> +}
> +
...


Fixes for non-building board (AR405, CANBT, PMC440) will come up shortly.

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

Reply via email to