
kind of embarrassed that i don't know the answer to this but, short form of question, when i build a u-boot.bin and copy it to NOR flash on my target board, where is the environment stored such that user space fw_printenv and fw_setenv utilities can get at them?
longer form of question: i just used yocto project to build for my MPC8315E-RDB target board, and one of the artifacts generated was "u-boot.bin", apparently ready for copying to NOR flash on this board, NOR flash being at 0xfe000000. i poked around trying to figure out where the environment was stored in that image, and i found the following in include/env_default.h:
... snip ... const uchar default_environment[] = { #endif #ifdef CONFIG_ENV_CALLBACK_LIST_DEFAULT ENV_CALLBACK_VAR "=" CONFIG_ENV_CALLBACK_LIST_DEFAULT "\0" #endif #ifdef CONFIG_ENV_FLAGS_LIST_DEFAULT ENV_FLAGS_VAR "=" CONFIG_ENV_FLAGS_LIST_DEFAULT "\0" #endif #ifdef CONFIG_BOOTARGS "bootargs=" CONFIG_BOOTARGS "\0" #endif #ifdef CONFIG_BOOTCOMMAND "bootcmd=" CONFIG_BOOTCOMMAND "\0" #endif ... etc etc ...
i then checked u-boot.sym and found:
fe04c920 g O .text 00000389 default_environment
and if i "hexdump -C" the "u-boot.bin" file, sure enough, there it is, the apparent beginning of the default environment at 0x0004c920:
0004c900 8d ef 02 2d 25 2e 2a 73 00 00 00 00 25 73 25 64 |...-%.*s....%s%d| 0004c910 2c 25 64 00 70 61 72 74 69 74 69 6f 6e 00 00 00 |,%d.partition...| 0004c920 62 6f 6f 74 63 6d 64 3d 73 65 74 65 6e 76 20 62 |bootcmd=setenv b| 0004c930 6f 6f 74 61 72 67 73 20 72 6f 6f 74 3d 2f 64 65 |ootargs root=/de| 0004c940 76 2f 6e 66 73 20 72 77 20 6e 66 73 72 6f 6f 74 |v/nfs rw nfsroot| 0004c950 3d 24 73 65 72 76 65 72 69 70 3a 24 72 6f 6f 74 |=$serverip:$root| ... and on and on ...
so AFAICT, the default_environment[] ends up in the executable (and, consequently, in flash) i'm assuming based on wherever the linker places it based on the "u-boot.lds" file, correct?
however, if i look at the defn file for this target board, include/configs/MPC8315ERDB.h, i can see the various config settings defining where the environment resides, things like CONFIG_ENV_IS_IN_FLASH, CONFIG_ENV_ADDR and so on:
#if !defined(CONFIG_SYS_RAMBOOT) #define CONFIG_ENV_IS_IN_FLASH 1 #define CONFIG_ENV_ADDR \ (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN) #define CONFIG_ENV_SECT_SIZE 0x10000 /* 64K(one sector) for env */ #define CONFIG_ENV_SIZE 0x2000
and if i build the package u-boot-fw-utils to get the user space utilities "fw_printenv" and "fw_setenv", that package needs to be told where the environment is stored, and that's based on what it gets from the board's header file, which in this case defines:
#define CONFIG_SYS_MONITOR_LEN (384 * 1024) /* Reserve 384 kB for Mon */
which represents an env offset of 0x00060000 into flash.
so what is the correlation between those two addresses? there's the actual address of default_environment[] based on where the linker puts it (0xfe04c920), as opposed to where fw-utils will (apparently) look for the environment (0xfe060000). what's the connection here?
rday