1. cmd
命令行可以用setenv printenv saveenv
uboot\u-boot-2020.04\cmd\nvedit.c
setenv -> do_env_set -> _do_env_set -> hsearch_r(env_htab)
printenv -> do_env_print -> env_print -> hsearch_r(env_htab)
saveenv -> do_env_save -> env_save
env_htab为env hash table,方便快速查找env变量。
example:
setenv ethaddr 64:00:F1:11:22:33 //eth0
setenv eth1addr 64:00:F1:44:55:66 //eth1
saveenv
2. env_load & env_save
uboot\u-boot-2020.04\env\mmc.c
U_BOOT_ENV_LOCATION(mmc) = {.location = ENVL_MMC,ENV_NAME("MMC").load = env_mmc_load,
#ifndef CONFIG_SPL_BUILD.save = env_save_ptr(env_mmc_save),
#if defined(CONFIG_CMD_ERASEENV).erase = env_mmc_erase,
#endif
#endif
};
env_load -> drv->load -> env_mmc_load -> mmc_get_env_addr & read_env & env_import( -> himport_r(&env_htab) ) & gd->env_addr
env_save -> drv->save -> env_mmc_save -> env_export & mmc_get_env_addr & write_env --> emmc
注:
env_import,导入env到hash table
env_export,从hash table导出到env
uboot启动时调用env_relocate -> env_load
emmc中有个env分区专门用来存储env变量
从mmc获得env分区信息:
mmc_get_env_addr -> mmc_offset
#ifdef USE_GPT_PARTITONret = part_get_info_by_name(blk_dev_desc, "env", &part_info);if (ret == -1) {printf("%s: get env partition info fail\n", __FUNCTION__);}#elseret = get_part_info(blk_dev_desc,"env", &part_info);if(ret == -1) {printf("%s: get env partition info fail\n", __FUNCTION__);}#endifelse {defvalue = part_info.start * part_info.blksz;}
3. env_set & env_get
代码中可以用 env_set & env_get
uboot\u-boot-2020.04\cmd\nvedit.c
env_get -> hsearch_r(env_htab) | env_get_f -> env_get_char -> env_get_char_spec -> (gd->env_addr + index)
env_set -> _do_env_set -> hsearch_r(env_htab)
代码中修改环境变量,然后保存到emmc:
env_load(); //非必须
env_set("partions",buf);
env_save();