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.c和common/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.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();
}
修改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上。
相关推荐
2、自动识别S3C2440的启动方式,并能够将环境变量的保存到对应的位置 3、支持网卡芯片DM9000 4、支持不同NAND Flash的读写,并自动识别所使用的nand flash是512B/page还是2KB/page,实现在64MB\128MB\256MB\1GB NAND...
- **定义和位置**:`global_data` 结构体定义在 `/Uboot114/u-boot-1.1.4/include/asm-arm/global_data.h` 文件中,它是 U-Boot 运行过程中全局数据的集中存储地。 - **用途**:`global_data` 包含了大量的全局...
- `save` 命令用于将修改后的环境变量保存到NorFlash中。例如:`saveenv`。 4. **修改环境变量以适应SEP4020开发板:** - 根据开发板的具体要求调整环境变量。例如,更改`bootcmd`为指向正确内核映像的位置;调整...
环境变量用于保存重要的配置信息,例如内核映像的位置、启动参数等。可以通过`printenv`和`setenv`等命令来查看和设置环境变量。 - **4.2.3 串口传输命令** `sf`命令用于与串口进行数据交互,可以用来下载或...
U-boot不仅支持常见的嵌入式操作系统,如Linux、QNX、VxWorks等,还支持多种存储介质,包括NAND Flash、NOR Flash、SD/MMC卡、USB设备等,极大地提升了其通用性和灵活性。 ### 3. 开发环境搭建 开发环境搭建是U-...
这部分内容讨论了NAND闪存的工作原理以及如何设计U-Boot来支持从NAND闪存启动,为开发者提供了一个实用的解决方案。 4. **给Kernel传递参数**:U-Boot能够向内核传递必要的启动参数,这部分内容解释了如何实现这一...
- 由于NAND Flash无法直接启动,因此需要通过设置U-Boot的`bootcmd`环境变量来实现自动启动: - `setenv bootcmd 'nand read 0xE0A00000 0x400000 0x200000; nand read 0xE1100000 0x600000 0x800000; nand read 0...
- **环境变量与相关指令**:U-Boot支持定义和修改环境变量,这些变量可以保存重要的启动参数。 - **串口传输命令**:例如`loadb`用于从串口加载二进制文件。 - **网络命令**:如`tftp`命令可以从TFTP服务器下载...
环境变量是U-boot中用于保存系统状态和配置信息的数据结构。常见的环境变量包括`bootcmd`(定义启动命令)、`bootargs`(定义启动参数)等。这些变量可以被修改并保存到非易失性存储器中。 #### 三、Linux内核 **...
(3)将从Nor Flash启动改成从 NAND Flash启动 在文件中找到 195-201 代码,并在 201行后面添加如下代码: 195 copy_loop: 196 ldmia r0!, {r3-r10} /* copy from source address [r0] */ 197 stmiar1!, {r3-r10...
3. 设置环境变量,以便可以在任何位置调用arm-linux-gcc编译器: - 编辑`/etc/profile`文件并添加以下行: ``` export PATH=/usr/local/arm/3.4.1/bin:$PATH ``` - 保存并关闭文件。 - 执行`source /etc/profile...