uboot之Saveenv(20120401)
一、调用流程。
env_init()
int env_init(void) { gd->env_addr = (ulong)&default_environment[0]; gd->env_valid = 0; return 0; }
==>env_relocate();
void env_relocate(void) { #if defined(CONFIG_NEEDS_MANUAL_RELOC) env_reloc(); #endif if (gd->env_valid == 0) { #if defined(CONFIG_ENV_IS_NOWHERE) /* Environment not changable */ set_default_env(NULL); #else bootstage_error(BOOTSTAGE_ID_NET_CHECKSUM); set_default_env("!bad CRC"); #endif } else { env_relocate_spec(); } }
这里有一个
bootstage_error(BOOTSTAGE_ID_NET_CHECKSUM);(bootstage.c)
是什么作用呢?
当第二次开机的时候就会执行:env_relocate_spec,
这个函数将会从nor or nand flash load boot envrionment(By call env_import func)
Then if check CRC failed, set_default_env func will be called.
二、和saveenv相关的宏定义
#define CONFIG_SYS_NO_FLASH 1
#define CONFIG_CMD_SAVEENV 1
#define CONFIG_ENV_OFFSET 0x00010000
#define ENV_PART_NAME "bootenv"
#define OFFSET_IN_ENV_PART 0x000000
#define CONFIG_ENV_SIZE (16*1024)