今天导入lcd屏的参数,却发现屏幕显示不正常
于是fbset -s看了一下当前framebuffer的参数是否正确,果然错误,也就是cmdline没有传入正确的lcd参数,所以cat /proc/cmdline查看了一下,然后需要修改cmdline。
追了一下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中的地址上的原始的环境变量是什么时候写进去的,需要进一步研究