关于u-boot同时支持nand启动和Nor启动环境变量的保存位置

uboot,我对你是即爱又恨啊,你当时整了我几近三个多月。还没整理到uboot,看到的好文章先mark一下,以后整理的时候用到。

转自:http://www.eefocus.com/ayayayaya/blog/10-10/196848_87e6f.html

­——华清远见曹忠明

前面我们说过是u-boot同时支持nand flash启动和nor flash启动,可是这个时候就有个环境变量的保存位置的问题了。假如我们设置为环境变量保存在nand上,nor启动时虽然保存环境变量的空间之前有一段空间浪费了,但不会有什么问题,但是假如我们设置为环境变量保存在nor上,nand启动就根本不能访问这段空间更谈何保存环境变量了,理想的情况是更加不同的flash启动把环境变量保存在相应的flash上。那么这是如何实现的呢?

在说如何实现之前我们先把相关的文件列出来(S3C2410为例)

cpu/arm920t/start.S /*用来判断是那种方式启动并实现自搬移*/

include/configs/smdk2410.h /*smdk2410配置文件*/

common/env_flash.c/*nor flash环境变量相关文件*/

common/env_nand.c/*nand flash环境变量相关文件*/

 

1.首先我们在include/configs/smdk2410.h中添加如下代码

#defineCONFIG_ENV_IS_IN_NAND1

#defineCONFIG_ENV_IS_IN_FLASH1

添加上面两句话是为了确保common/env_flash.ccommon/env_nand.c中的内容被编译进uboot,并且添加这两种情况环境变量保存位置信息:

#ifdefCONFIG_ENV_IS_IN_FLASH1

#defineCONFIG_ENV_ADDR(CONFIG_SYS_FLASH_BASE + 0x30000)

#endif

#ifdefCONFIG_ENV_IS_IN_NAND1

#defineCONFIG_ENV_SIZE0x10000

#defineCONFIG_ENV_OFFSET0x30000

#endif

 

2.标志位的设定

在这里我们我们要设置一个标志位用来标识是nor启动还是nand启动。我们在common/nand.c中添加这个标志位的定义

volatile intpbootflag=1; //add by lht1->nor0->nand

然后我们在cpu/arm920t/start.S导入这个变量并判断是nor启动还是nand启动设置这个标志位的值

# define BWSCON0x48000000

dr r0,=BWSCON

ldr r0,[r0]

ands r0,r0,#6

beq nand_boot

/***********/

Nor自搬移代码

/***********/

nand_boot:

ldrr0, =pbootflag

mov r1, #0x0

strr1, [r0]/*设置pbootflag的值为0表示为nand启动*/

/***********/

Nand自搬移代码

/***********/

3.环境变量的保存

通过第一步的操作后,我们的系统中就会有两个env_init函数、saveenv函数和env_relocate_spec函数在common/env_flash.ccommon/env_nand.c中,在我们执行saveenv或者在uboot启动是环境变量重定位的时候就有问题了,为了解决这个问题我们做如下操作。

首先我们把common/env_flash.c中的env_init函数、saveenv函数和env_relocate_spec函数分别改名为nor_env_init函数、nor_saveenv函数和nor_env_relocate_spec函数。

然后我们需要修改common/env_nand.c中的saveenv函数和env_relocate_spec函数为:

修改int env_init(void)函数在函数开始添加如下内容:

if(pbootflag==1)

{

env_name_spec = "NOR";

env_ptr=(env_t *)CONFIG_ENV_ADDR;

return nor_env_init();

}

 

修改intsaveenv(void)函数,在函数开始添加如下内容

if(pbootflag==1)

{

env_name_spec = "NOR";

return nor_saveenv();

}

修改void env_relocate_spec (void)函数,在函数开始添加如下内容

if(pbootflag==1)

{

return nor_env_relocate_spec();

}

这个时候我们的uboot就能够同时支持nor flash启动和nand flash启动并能够把环境变量保存在相应的flash上。

 

猜你喜欢

转载自shangxun.iteye.com/blog/1938706