[U-Boot] [PATCH] Add support for setting environment variable from RAM.

Peter Tyser ptyser at xes-inc.com
Tue Feb 3 17:00:00 CET 2009


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.

> +	"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?

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.

Best,
Peter



More information about the U-Boot mailing list