UBI is a better place for the environment on NAND devices because it handles wear-leveling and bad blocks. Gluebi is needed in Linux to access the env as an MTD partition. Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>master
parent
a7eb1d66c7
commit
2b74433f36
@ -0,0 +1,103 @@ |
||||
/*
|
||||
* (c) Copyright 2012 by National Instruments, |
||||
* Joe Hershberger <joe.hershberger@ni.com> |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of |
||||
* the License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
|
||||
#include <command.h> |
||||
#include <environment.h> |
||||
#include <errno.h> |
||||
#include <malloc.h> |
||||
#include <search.h> |
||||
#include <ubi_uboot.h> |
||||
#undef crc32 |
||||
|
||||
char *env_name_spec = "UBI"; |
||||
|
||||
env_t *env_ptr; |
||||
|
||||
DECLARE_GLOBAL_DATA_PTR; |
||||
|
||||
int env_init(void) |
||||
{ |
||||
/* use default */ |
||||
gd->env_addr = (ulong)&default_environment[0]; |
||||
gd->env_valid = 1; |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
#ifdef CONFIG_CMD_SAVEENV |
||||
int saveenv(void) |
||||
{ |
||||
ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1); |
||||
ssize_t len; |
||||
char *res; |
||||
|
||||
res = (char *)&env_new->data; |
||||
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL); |
||||
if (len < 0) { |
||||
error("Cannot export environment: errno = %d\n", errno); |
||||
return 1; |
||||
} |
||||
|
||||
if (ubi_part(CONFIG_ENV_UBI_PART, NULL)) { |
||||
printf("\n** Cannot find mtd partition \"%s\"\n", |
||||
CONFIG_ENV_UBI_PART); |
||||
return 1; |
||||
} |
||||
|
||||
env_new->crc = crc32(0, env_new->data, ENV_SIZE); |
||||
|
||||
if (ubi_volume_write(CONFIG_ENV_UBI_VOLUME, (void *)env_new, |
||||
CONFIG_ENV_SIZE)) { |
||||
printf("\n** Unable to write env to %s:%s **\n", |
||||
CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME); |
||||
return 1; |
||||
} |
||||
|
||||
puts("done\n"); |
||||
return 0; |
||||
} |
||||
#endif /* CONFIG_CMD_SAVEENV */ |
||||
|
||||
void env_relocate_spec(void) |
||||
{ |
||||
ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE); |
||||
|
||||
if (ubi_part(CONFIG_ENV_UBI_PART, NULL)) { |
||||
printf("\n** Cannot find mtd partition \"%s\"\n", |
||||
CONFIG_ENV_UBI_PART); |
||||
set_default_env(NULL); |
||||
return; |
||||
} |
||||
|
||||
if (ubi_volume_read(CONFIG_ENV_UBI_VOLUME, (void *)&buf, |
||||
CONFIG_ENV_SIZE)) { |
||||
printf("\n** Unable to read env from %s:%s **\n", |
||||
CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME); |
||||
set_default_env(NULL); |
||||
return; |
||||
} |
||||
|
||||
env_import(buf, 1); |
||||
} |
Loading…
Reference in new issue