diff options
| author | Wolfgang Denk <wd@denx.de> | 2010-09-28 23:30:47 +0200 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2010-09-28 23:30:47 +0200 | 
| commit | 2e6e1772c0e34871769be4aef79748fe3e47d953 (patch) | |
| tree | 00e4e19d7bccd2a1cd5753854ff4c2b8a26bebb0 /common/env_onenand.c | |
| parent | 1e4e5ef0469050f014aee1204dae8a9ab6053e49 (diff) | |
| parent | 3df61957938586c512c17e72d83551d190400981 (diff) | |
| download | olio-uboot-2014.01-2e6e1772c0e34871769be4aef79748fe3e47d953.tar.xz olio-uboot-2014.01-2e6e1772c0e34871769be4aef79748fe3e47d953.zip | |
Merge branch 'next' of /home/wd/git/u-boot/next
Conflicts:
	include/ppc4xx.h
Signed-off-by: Wolfgang Denk <wd@denx.de>
Diffstat (limited to 'common/env_onenand.c')
| -rw-r--r-- | common/env_onenand.c | 65 | 
1 files changed, 36 insertions, 29 deletions
| diff --git a/common/env_onenand.c b/common/env_onenand.c index cf997bf7e..02cb5354f 100644 --- a/common/env_onenand.c +++ b/common/env_onenand.c @@ -1,4 +1,7 @@  /* + * (C) Copyright 2010 DENX Software Engineering + * Wolfgang Denk <wd@denx.de> + *   * (C) Copyright 2005-2009 Samsung Electronics   * Kyungmin Park <kyungmin.park@samsung.com>   * @@ -26,6 +29,8 @@  #include <environment.h>  #include <linux/stddef.h>  #include <malloc.h> +#include <search.h> +#include <errno.h>  #include <linux/mtd/compat.h>  #include <linux/mtd/mtd.h> @@ -44,17 +49,13 @@ char *env_name_spec = "OneNAND";  #ifdef ENV_IS_EMBEDDED  extern uchar environment[]; -env_t *env_ptr = (env_t *) (&environment[0]); -#else /* ! ENV_IS_EMBEDDED */ -static unsigned char onenand_env[ONENAND_MAX_ENV_SIZE]; -env_t *env_ptr = (env_t *) onenand_env;  #endif /* ENV_IS_EMBEDDED */  DECLARE_GLOBAL_DATA_PTR;  uchar env_get_char_spec(int index)  { -	return (*((uchar *) (gd->env_addr + index))); +	return (*((uchar *)(gd->env_addr + index)));  }  void env_relocate_spec(void) @@ -63,48 +64,57 @@ void env_relocate_spec(void)  #ifdef CONFIG_ENV_ADDR_FLEX  	struct onenand_chip *this = &onenand_chip;  #endif -	loff_t env_addr; -	int use_default = 0; +	int rc;  	size_t retlen; +#ifdef ENV_IS_EMBEDDED +	char *buf = (char *)&environment[0]; +#else +	loff_t env_addr = CONFIG_ENV_ADDR; +	char onenand_env[ONENAND_MAX_ENV_SIZE]; +	char *buf = (char *)&onenand_env[0]; +#endif /* ENV_IS_EMBEDDED */ -	env_addr = CONFIG_ENV_ADDR; -#ifdef CONFIG_ENV_ADDR_FLEX +#ifndef ENV_IS_EMBEDDED +# ifdef CONFIG_ENV_ADDR_FLEX  	if (FLEXONENAND(this))  		env_addr = CONFIG_ENV_ADDR_FLEX; -#endif +# endif  	/* Check OneNAND exist */  	if (mtd->writesize)  		/* Ignore read fail */  		mtd->read(mtd, env_addr, ONENAND_MAX_ENV_SIZE, -			     &retlen, (u_char *) env_ptr); +			     &retlen, (u_char *)buf);  	else  		mtd->writesize = MAX_ONENAND_PAGESIZE; +#endif /* !ENV_IS_EMBEDDED */ -	if (crc32(0, env_ptr->data, ONENAND_ENV_SIZE(mtd)) != env_ptr->crc) -		use_default = 1; - -	if (use_default) { -		memcpy(env_ptr->data, default_environment, -		       ONENAND_ENV_SIZE(mtd)); -		env_ptr->crc = -		    crc32(0, env_ptr->data, ONENAND_ENV_SIZE(mtd)); -	} - -	gd->env_addr = (ulong) & env_ptr->data; -	gd->env_valid = 1; +	rc = env_import(buf, 1); +	if (rc) +		gd->env_valid = 1;  }  int saveenv(void)  { +	env_t	env_new; +	ssize_t	len; +	char	*res;  	struct mtd_info *mtd = &onenand_mtd;  #ifdef CONFIG_ENV_ADDR_FLEX  	struct onenand_chip *this = &onenand_chip;  #endif -	loff_t env_addr = CONFIG_ENV_ADDR; +	loff_t	env_addr = CONFIG_ENV_ADDR; +	size_t	retlen;  	struct erase_info instr = {  		.callback	= NULL,  	}; -	size_t retlen; + +	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);  	instr.len = CONFIG_ENV_SIZE;  #ifdef CONFIG_ENV_ADDR_FLEX @@ -122,11 +132,8 @@ int saveenv(void)  		return 1;  	} -	/* update crc */ -	env_ptr->crc = crc32(0, env_ptr->data, ONENAND_ENV_SIZE(mtd)); -  	if (mtd->write(mtd, env_addr, ONENAND_MAX_ENV_SIZE, &retlen, -	     (u_char *) env_ptr)) { +	     (u_char *)&env_new)) {  		printf("OneNAND: write failed at 0x%llx\n", instr.addr);  		return 2;  	} |