通过打印信息抓到
fdtdec_get_config_int: load-environment
Loading Environment from SPI Flash
之后开始加载qspi driver
initr_env
should_load_env
env_relocate
env_load
static int initr_env(void) { /* initialize environment */ if (should_load_env()) //返回1 执行env_relocate
env_relocate(); else set_default_env(NULL); #ifdef CONFIG_OF_CONTROL env_set_addr("fdtcontroladdr", gd->fdt_blob); #endif /* Initialize from environment */ load_addr = env_get_ulong("loadaddr", 16, load_addr); return 0; }
static int should_load_env(void) { #ifdef CONFIG_OF_CONTROL return fdtdec_get_config_int(gd->fdt_blob, "load-environment", 1); //返回1 #elif defined CONFIG_DELAY_ENVIRONMENT return 0; #else return 1; #endif }
int fdtdec_get_config_int(const void *blob, const char *prop_name, int default_val) { int config_node; debug("%s: %s\n", __func__, prop_name); config_node = fdt_path_offset(blob, "/config"); //没有config这个节点 config_node <0
if (config_node < 0) return default_val; //返回1 return fdtdec_get_int(blob, config_node, prop_name, default_val); }
void env_relocate(void) { #if defined(CONFIG_NEEDS_MANUAL_RELOC) //不执行 env_reloc(); env_fix_drivers(); env_htab.change_ok += gd->reloc_off; #endif if (gd->env_valid == ENV_INVALID) { //board_init_f env_init gd->env_valid = ENV_VALID; #if defined(CONFIG_ENV_IS_NOWHERE) || defined(CONFIG_SPL_BUILD) /* Environment not changable */ set_default_env(NULL); #else bootstage_error(BOOTSTAGE_ID_NET_CHECKSUM); set_default_env("!bad CRC"); #endif } else { env_load(); } }
int env_load(void) { struct env_driver *drv; int prio; for (prio = 0; (drv = env_driver_lookup(ENVOP_LOAD, prio)); prio++) { int ret; if (!drv->load) continue; if (!env_has_inited(drv->location)) continue; printf("Loading Environment from %s... ", drv->name); ret = drv->load(); //此处感觉先要加载qpsi controller的驱动 if (ret) printf("Failed (%d)\n", ret); else printf("OK\n"); if (!ret) return 0; } return -ENODEV; }
config_node
原文:https://www.cnblogs.com/idyllcheung/p/13977572.html