Dear Wolfgang Denk, In message <1279395948-25864-6-git-send-email...@denx.de> you wrote: > Motivation: > > * Old environment code used a pessimizing implementation: > - variable lookup used linear search => slow > - changed/added variables were added at the end, i. e. most > frequently used variables had the slowest access times => slow > - each setenv() would calculate the CRC32 checksum over the whole > environment block => slow > * "redundant" envrionment was locked down to two copies > * No easy way to implement features like "reset to factory defaults", > or to select one out of several pre-defined (previously saved) sets > of environment settings ("profiles") > * No easy way to import or export environment settings > > ====================================================================== > > API Changes: > > - Variable names starting with '#' are no longer allowed > > I didn't find any such variable names being used; it is highly > recommended to follow standard conventions and start variable names > with an alphanumeric character > > - "printenv" will now print a backslash at the end of all but the last > lines of a multi-line variable value. > > Multi-line variables have never been formally defined, allthough > there is no reason not to use them. Now we define rules how to deal > with them, allowing for import and export. > > - Function forceenv() and the related code in saveenv() was removed. > At the moment this is causing build problems for the only user of > this code (schmoogie - which has no entry in MAINTAINERS); may be > fixed later by implementing the "env set -f" feature. > > Inconsistencies: > > - "printenv" will '\\'-escape the '\n' in multi-line variables, while > "printenv var" will not do that. > > ====================================================================== > > Advantages: > > - "printenv" output much better readable (sorted) > - faster! > - extendable (additional variable properties can be added) > - new, powerful features like "factory reset" or easy switching > between several different environment settings ("profiles") > > Disadvantages: > > - Image size grows by typically 5...7 KiB (might shrink a bit again on > systems with redundant environment with a following patch series) > > ====================================================================== > > Implemented: > > - env command with subcommands: > > - env print [arg ...] > > same as "printenv": print environment > > - env set [-f] name [arg ...] > > same as "setenv": set (and delete) environment variables > > ["-f" - force setting even for read-only variables - not > implemented yet.] > > - end delete [-f] name > > not implemented yet > > ["-f" - force delete even for read-only variables] > > - env save > > same as "saveenv": save environment > > - env export [-t | -b | -c] addr [size] > > export internal representation (hash table) in formats usable for > persistent storage or processing: > > -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 > > With "-c" and size is NOT given, then the export command will > format the data as currently used for the persistent storage, > i. e. it will use CONFIG_ENV_SECT_SIZE as output block size and > prepend a valid CRC32 checksum and, in case of resundant > environment, a "current" redundancy flag. If size is given, this > value will be used instead of CONFIG_ENV_SECT_SIZE; again, CRC32 > checksum and redundancy flag will be inserted. > > With "-b" and "-t", always only the real data (including a > terminating '\0' byte) will be written; here the optional size > argument will be used to make sure not to overflow the user > provided buffer; the command will abort if the size is not > sufficient. Any remainign space will be '\0' padded. > > On successful return, the variable "filesize" will be set. > Note that filesize includes the trailing/terminating '\0' > byte(s). > > Usage szenario: create a text snapshot/backup of the current > settings: > > => env export -t 100000 > => era ${backup_addr} +${filesize} > => cp.b 100000 ${backup_addr} ${filesize} > > Re-import this snapshot, deleting all other settings: > > => env import -d -t ${backup_addr} > > - env import [-d] [-t | -b | -c] addr [size] > > import external format (text or binary) into hash table, > optionally deleting existing values: > > -d: delete existing environment before importing; > otherwise overwrite / append to existion definitions > -t: assume text format; either "size" must be given or the > text data must be '\0' terminated > -b: assume binary format ('\0' separated, "\0\0" terminated) > -c: assume checksum protected environment format > addr: memory address to read from > size: length of input data; if missing, proper '\0' > termination is mandatory > > - env default -f > > reset default environment: drop all environment settings and load > default environment > > - env ask name [message] [size] > > same as "askenv": ask for environment variable > > - env edit name > > same as "editenv": edit environment variable > > - env run > > same as "run": run commands in an environment variable > > ====================================================================== > > TODO: > > - drop default env as implemented now; provide a text file based > initialization instead (eventually using several text files to > incrementally build it from common blocks) and a tool to convert it > into a binary blob / object file. > > - It would be nice if we could add wildcard support for environment > variables; this is needed for variable name auto-completion, > but it would also be nice to be able to say "printenv ip*" or > "printenv *addr*" > > - Some boards don't link any more due to the grown code size: > AR405, CANBT, DU405, PMC440, canyonlands, sc3, sequoia, socrates. > > => cc: Matthias Fuchs <matthias.fu...@esd-electronics.com>, > Stefan Roese <s...@denx.de>, > Heiko Schocher <h...@denx.de> > > - Dropping forceenv() causes build problems on schmoogie > > => cc: Sergey Kubushyn <k...@koi8.net> > > - Build tested on PPC and ARM only; runtime tested with NOR and NAND > flash only => needs testing!! > > Signed-off-by: Wolfgang Denk <w...@denx.de> > Cc: Matthias Fuchs <matthias.fu...@esd-electronics.com>, > Cc: Stefan Roese <s...@denx.de>, > Cc: Heiko Schocher <h...@denx.de> > Cc: Sergey Kubushyn <k...@koi8.net> > --- > README | 8 + > board/zeus/zeus.c | 25 +-- > common/cmd_nvedit.c | 655 > +++++++++++++++++++++++++++++++++--------------- > common/command.c | 3 +- > common/dlmalloc.c | 25 +- > common/env_common.c | 125 +++++----- > common/env_dataflash.c | 114 ++++++---- > common/env_eeprom.c | 85 ++++--- > common/env_flash.c | 245 ++++++++++--------- > common/env_mgdisk.c | 33 +-- > common/env_nand.c | 188 ++++++++------ > common/env_nowhere.c | 11 +- > common/env_nvram.c | 46 +++- > common/env_onenand.c | 65 +++--- > common/env_sf.c | 132 ++++++----- > common/exports.c | 1 - > include/environment.h | 5 +- > lib/hashtable.c | 32 ++- > 18 files changed, 1094 insertions(+), 704 deletions(-)
Applied to "next" branch. [With changes as suggested by Matthias Fuchs - thanks!] Best regards, Wolfgang Denk -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de What is tolerance? -- it is the consequence of humanity. We are all formed of frailty and error; let us pardon reciprocally each other's folly -- that is the first law of nature. - Voltaire _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot