diff options
Diffstat (limited to 'common/env_nvram.c')
| -rw-r--r-- | common/env_nvram.c | 46 | 
1 files changed, 32 insertions, 14 deletions
| diff --git a/common/env_nvram.c b/common/env_nvram.c index 7c7cf9850..6e90f2bcb 100644 --- a/common/env_nvram.c +++ b/common/env_nvram.c @@ -1,5 +1,5 @@  /* - * (C) Copyright 2000-2002 + * (C) Copyright 2000-2010   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.   *   * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com> @@ -44,6 +44,8 @@  #include <command.h>  #include <environment.h>  #include <linux/stddef.h> +#include <search.h> +#include <errno.h>  DECLARE_GLOBAL_DATA_PTR; @@ -59,7 +61,7 @@ char * env_name_spec = "NVRAM";  extern uchar default_environment[]; -uchar env_get_char_spec (int index) +uchar env_get_char_spec(int index)  {  #ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE  	uchar c; @@ -72,40 +74,56 @@ uchar env_get_char_spec (int index)  #endif  } -void env_relocate_spec (void) +void env_relocate_spec(void)  { +	char buf[CONFIG_ENV_SIZE]; +  #if defined(CONFIG_SYS_NVRAM_ACCESS_ROUTINE) -	nvram_read(env_ptr, CONFIG_ENV_ADDR, CONFIG_ENV_SIZE); +	nvram_read(buf, CONFIG_ENV_ADDR, CONFIG_ENV_SIZE);  #else -	memcpy (env_ptr, (void*)CONFIG_ENV_ADDR, CONFIG_ENV_SIZE); +	memcpy(buf, (void*)CONFIG_ENV_ADDR, CONFIG_ENV_SIZE);  #endif +	env_import(buf, 1);  } -int saveenv (void) +int saveenv(void)  { -	int rcode = 0; +	env_t	env_new; +	ssize_t	len; +	char	*res; +	int	rcode = 0; + +	res = (char *)&env_new.data; +	len = hexport('\0', &res, ENV_SIZE); +	if (len < 0) { +		error("Cannot export environment: errno = %d\n", errno); +		return 1; +	} +	env_new.crc = crc32(0, env_new.data, ENV_SIZE); +  #ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE -	nvram_write(CONFIG_ENV_ADDR, env_ptr, CONFIG_ENV_SIZE); +	nvram_write(CONFIG_ENV_ADDR, &env_new, CONFIG_ENV_SIZE);  #else -	if (memcpy ((char *)CONFIG_ENV_ADDR, env_ptr, CONFIG_ENV_SIZE) == NULL) -		    rcode = 1 ; +	if (memcpy((char *)CONFIG_ENV_ADDR, &env_new, CONFIG_ENV_SIZE) == NULL) +		rcode = 1;  #endif  	return rcode;  } -/************************************************************************ +/*   * Initialize Environment use   *   * We are still running from ROM, so data use is limited   */ -int env_init (void) +int env_init(void)  {  #if defined(CONFIG_SYS_NVRAM_ACCESS_ROUTINE)  	ulong crc;  	uchar data[ENV_SIZE]; -	nvram_read (&crc, CONFIG_ENV_ADDR, sizeof(ulong)); -	nvram_read (data, CONFIG_ENV_ADDR+sizeof(ulong), ENV_SIZE); + +	nvram_read(&crc, CONFIG_ENV_ADDR, sizeof(ulong)); +	nvram_read(data, CONFIG_ENV_ADDR+sizeof(ulong), ENV_SIZE);  	if (crc32(0, data, ENV_SIZE) == crc) {  		gd->env_addr  = (ulong)CONFIG_ENV_ADDR + sizeof(long); |