新路程------imx6 uboot环境变量的初始化(1)

来源:互联网 发布:网络通讯员职责 编辑:程序博客网 时间:2024/06/06 03:55

  今天追了一下uboot中环境变量的初始化

按照linux手册上的说法,环境变量定义在mx6q_sabresd.h中

我们用的是lvds则

#if defined(CONFIG_LVDS)
#define IPU_OUTPUT_MODE_LVDS
#define CONFIG_EXTRA_ENV_SETTINGS\
"netdev=eth0\0"\
"ethprime=FEC0\0"\
"uboot=u-boot.bin\0"\
"kernel=uImage\0"\
"nfsroot=/opt/eldk/arm\0"\
"bootargs_base=setenv bootargs console=ttymxc0,115200 video=mxcfb0:dev=ldb,LDB-WXGA,if=RGB24,bpp=32 ldb=sep0 video=mxcfb1:dev=hdmi,1920x1080M@60,if=RGB24,bpp=32 video=mxcfb2:off\0"\
"bootargs_nfs=setenv bootargs ${bootargs} root=/dev/nfs "\
"ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0"\
"bootcmd_net=run bootargs_base bootargs_nfs; "\
"tftpboot ${loadaddr} ${kernel}; bootm\0"\
"bootargs_mmc=setenv bootargs ${bootargs} ip=none "     \
"root=/dev/mmcblk0p1 rootwait\0"                \
"bootcmd_mmc=run bootargs_base bootargs_mmc; "   \
"mmc dev 3; " \
"mmc read ${loadaddr} 0x800 0x2900; bootm\0"\
"bootcmd=run bootcmd_mmc\0"    

也就是说修改这里的bootargs即可

在Env_common.c中的

uchar default_environment[] = {

#ifdef  CONFIG_EXTRA_ENV_SETTINGS
CONFIG_EXTRA_ENV_SETTINGS
               #endif

set_default_env()里用到

而set_default_env()则是在env_relocate()里也就是第一次env为空时读取默认的,再后面的启动都是用已经存在的env了

首先是/lib_arm/board.c里的void start_armboot (void)

env_relocate ();

然后

void env_relocate (void)
{

env_ptr = (env_t *)malloc (CONFIG_ENV_SIZE);

env_relocate_spec ();


gd->env_addr = (ulong)&(env_ptr->data); //zhege gd结构体将会在之后充当全局的环境变量地址保存者

......

}

之后在Env_mmc.c里

env_relocate_spec ();

void env_relocate_spec(void)
{
#if !defined(ENV_IS_EMBEDDED)
printf("=========find_mmc_device");
struct mmc *mmc = find_mmc_device(mmc_env_devno);


if (init_mmc_for_env(mmc))
return;

if (read_env(mmc, CONFIG_ENV_SIZE, CONFIG_ENV_OFFSET, env_ptr))
return use_default(); //这里从emmc中获取到环境变量

if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)
return use_default();

gd->env_valid = 1;
#endif
}

接下来看

inline int read_env(struct mmc *mmc, unsigned long size,
unsigned long offset, const void *buffer)
{
uint blk_start, blk_cnt, n;
    printf("=========read_env\n");
blk_start = ALIGN(offset, mmc->read_bl_len) / mmc->read_bl_len;
blk_cnt   = ALIGN(size, mmc->read_bl_len) / mmc->read_bl_len;


n = mmc->block_dev.block_read(mmc_env_devno, blk_start,  //从这个blk_start开始的地址中读取环境变量数据到buffer中
blk_cnt, (uchar *)buffer);


return (n == blk_cnt) ? 0 : -1;
}

到现在为止并没有发现emmc中的地址上的原始的环境变量是什么时候写进去的,需要进一步研究

0 0
原创粉丝点击