今天导入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中的地址上的原始的环境变量是什么时候写进去的,需要进一步研究