关于u-boot同时支持nand启动和Nor启动环境变量的保存位置
2010-10-12 18:30
267 查看
——华清远见 曹忠明
前面我们说过是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. [/b]首先我们在[/b]include/configs/smdk2410.h[/b]中添加如下代码[/b][/b]
#define CONFIG_ENV_IS_IN_NAND 1[/i]
#define CONFIG_ENV_IS_IN_FLASH 1
添加上面两句话是为了确保common/env_flash.c和common/env_nand.c中的内容被编译进uboot,并且添加这两种情况环境变量保存位置信息:
#ifdef CONFIG_ENV_IS_IN_FLASH 1
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x30000)[/i]
#endif[/i]
#ifdef CONFIG_ENV_IS_IN_NAND 1[/i]
#define CONFIG_ENV_SIZE 0x10000[/i]
#define CONFIG_ENV_OFFSET 0x30000
#endif[/i]
[/i]
2. [/b]标志位的设定[/b][/b]
在这里我们我们要设置一个标志位用来标识是nor启动还是nand启动。我们在common/nand.c中添加这个标志位的定义
volatile int pbootflag=1; //add by lht 1->nor 0->nand
然后我们在cpu/arm920t/start.S导入这个变量并判断是nor启动还是nand启动设置这个标志位的值
# define BWSCON 0x48000000
dr r0,=BWSCON
ldr r0,[r0]
ands r0,r0,#6
beq nand_boot
/***********/
Nor 自搬移代码
/***********/
nand_boot:
ldr r0, =pbootflag
mov r1, #0x0
str r1, [r0] /*设置pbootflag的值为0表示为nand启动*/
/***********/
Nand 自搬移代码
/***********/
3. [/b]环境变量的保存[/b][/b]
通过第一步的操作后,我们的系统中就会有两个env_init函数、saveenv函数和env_relocate_spec函数在common/env_flash.c和common/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();
}
修改int saveenv(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上。
如果您喜欢这篇文章,可以加华清远见老师为好友,单击以下链接即可:
http://student.csdn.net/invite.php?u=45153&c=8af704eb3cd8e773
(作者:华清远见嵌入式培训中心 www.embedu.org www.farsight.com.cn )
前面我们说过是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. [/b]首先我们在[/b]include/configs/smdk2410.h[/b]中添加如下代码[/b][/b]
#define CONFIG_ENV_IS_IN_NAND 1[/i]
#define CONFIG_ENV_IS_IN_FLASH 1
添加上面两句话是为了确保common/env_flash.c和common/env_nand.c中的内容被编译进uboot,并且添加这两种情况环境变量保存位置信息:
#ifdef CONFIG_ENV_IS_IN_FLASH 1
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x30000)[/i]
#endif[/i]
#ifdef CONFIG_ENV_IS_IN_NAND 1[/i]
#define CONFIG_ENV_SIZE 0x10000[/i]
#define CONFIG_ENV_OFFSET 0x30000
#endif[/i]
[/i]
2. [/b]标志位的设定[/b][/b]
在这里我们我们要设置一个标志位用来标识是nor启动还是nand启动。我们在common/nand.c中添加这个标志位的定义
volatile int pbootflag=1; //add by lht 1->nor 0->nand
然后我们在cpu/arm920t/start.S导入这个变量并判断是nor启动还是nand启动设置这个标志位的值
# define BWSCON 0x48000000
dr r0,=BWSCON
ldr r0,[r0]
ands r0,r0,#6
beq nand_boot
/***********/
Nor 自搬移代码
/***********/
nand_boot:
ldr r0, =pbootflag
mov r1, #0x0
str r1, [r0] /*设置pbootflag的值为0表示为nand启动*/
/***********/
Nand 自搬移代码
/***********/
3. [/b]环境变量的保存[/b][/b]
通过第一步的操作后,我们的系统中就会有两个env_init函数、saveenv函数和env_relocate_spec函数在common/env_flash.c和common/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();
}
修改int saveenv(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上。
如果您喜欢这篇文章,可以加华清远见老师为好友,单击以下链接即可:
http://student.csdn.net/invite.php?u=45153&c=8af704eb3cd8e773
(作者:华清远见嵌入式培训中心 www.embedu.org www.farsight.com.cn )
相关文章推荐
- 关于u-boot同时支持nand启动和Nor启动环境变量的保存位置
- 关于u-boot同时支持nand启动和Nor启动 环境变量的保存位置
- 关于u-boot同时支持nand启动和Nor启动环境变量的保存位置
- UBoot支持双启动(Nor and Nand)及环境变量保存的实现
- 2013.10u-boot移植之增加nand保存环境变量
- s5pv210 uboot-2012-10移植(八) 之支持SD卡保存环境变量
- U-Boot移植--环境变量保存位置
- s5pv210 uboot-2012-10移植(八) 之支持SD卡保存环境变量
- uboot for s3c2410 nandboot 使用saveenv保存环境变量
- 移植u-boot2012.04.1 -》2440 (五)支持 nand nor 两种启动方式(完结)
- uboot for s3c2410 nandboot 使用saveenv保存环境变量
- u-boot-2009.11在mini2440上的移植,关于SDRAM&NOR&NAND启动的几点疑惑
- Mac 启动加载文件位置(可设置环境变量)
- u-boot2010.03 移植篇(三)-----进一步修改start.S,smdk6410.h,支持nand启动及配置DM9000网卡
- 移植u-boot-2012.04.01到jz2440开发板之修改代码支持NAND启动
- Linux 启动文件、设置环境变量的位置
- Linux 启动文件、设置环境变量的位置
- U-boot实现Nand/Nor 双启动
- 【Linux 移植 】——4、移植 u-boot-2012.04.01 之 支持NAND启动
- Mac 启动加载文件位置(可设置环境变量)