From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Nelson Date: Tue, 03 Feb 2009 11:56:46 -0700 Subject: [U-Boot] [PATCH] Add support for setting environment variable from RAM. In-Reply-To: <1233676800.19784.1463.camel@localhost.localdomain> References: <> <1233674891-8270-1-git-send-email-eric.nelson@boundarydevices.com> <1233676800.19784.1463.camel@localhost.localdomain> Message-ID: <4988936E.3070504@boundarydevices.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hello Peter, Peter Tyser wrote: > Hi Eric, > > On Tue, 2009-02-03 at 08:28 -0700, Eric Nelson (Boundary Devices) wrote: >> /************************************************************************ >> + * Set a new environment variable from RAM. >> + * Requires three arguments: the variable name, a memory address and a length. >> + * >> + * Deletes the environment variable if the length is zero. >> + */ >> +int do_ramenv(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) >> +{ >> + unsigned long len, i; >> + char *addr; >> + >> + if (argc != 4) { >> + cmd_usage(cmdtp); >> + return 1; >> + } >> + addr = (char *)simple_strtol(argv[2], NULL, 16); >> + len = simple_strtol(argv[3], NULL, 16); >> + if (!addr || !len) { >> + cmd_usage(cmdtp); >> + return 1; >> + } >> + addr[len] = '\0'; >> + for (i = 0; i < len; i++) { >> + /* turn newlines into semicolon */ >> + if (addr[i] == '\n') >> + addr[i] = ';'; /* ignore dos-style newlines */ >> + if (addr[i] == '\r') >> + addr[i] = ' '; /* accept sh-comments and discard them */ >> + if (addr[i] == '#') { >> + while (addr[i] && addr[i] != '\n') >> + addr[i++] = ' '; >> + i--; >> + } >> + } >> + setenv(argv[1], addr); >> + return 0; >> +} >> + >> +/************************************************************************ >> * Look up variable from environment, >> * return address of storage for that variable, >> * or NULL if not found >> @@ -605,6 +643,14 @@ U_BOOT_CMD( >> " - delete environment variable 'name'\n" >> ); >> >> +U_BOOT_CMD( >> + ramenv, 4, 0, do_ramenv, >> + "ramenv - get environment variable from ram\n", > > The "ramenv - " and "\n" are no longer used in the above line. > Oops. Can you tell I started by implementing this on an older source tree? Re-reading it, the comment should probably also say "set environment variable from ram" instead of "get...". If there's interest, I'll happily re-submit the patch. >> + "name addr maxlen\n" >> + " - set environment variable 'name' from addr 'addr'\n" >> + " - delete environment variable if maxlen is 0\n" >> +); >> + >> #if defined(CONFIG_CMD_ASKENV) >> >> U_BOOT_CMD( > > In the email thread you mentioned above, Detlev mentions 2 alternatives > to the "ramenv" command - loading a uImage script and running it via > autoscr, or modifying autoscr to be able to raw files (non-uImages). > Both of these methods seem cleaner and more flexible at a glance. Is > there a specific reason using autoscr wouldn't work for your setup? > The customer requesting this feature operates in a regulated environment with pretty strict rules about separation of code and data. Autoscr is kind of a big stick for what we're trying to achieve: (configuring an LCD with settings from a file on SD card). > For example, what is the process to load multiple environment variables > with the ramenv command? If I understand correctly, in order to load 10 > environment variables you'd have to repeat the process of "load a file > to RAM, run ramenv" 10 times? That seems much more difficult than > loading 1 file with 10 environment variables and running autoscr once. > That's certainly true, although once you have an environment variable you could use it for iteration... Our particular need is just for a single environment variable, so the update works pretty well. I started by updating our 'lcdpanel' U-Boot command to read from file, but this is much more useful. > Best, > Peter > Regards, Eric