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