UBoot支持双启动(Nor and Nand)及环境变量保存的实现

本文所要讲述的是如何使UBoot只编译一次就能支持从Nor Flash和Nand Flash启动,并且在保存环境变量时能够保存在其所在的Flash中.


注意,本文针对的为S3C2410芯片,其他芯片原理相同,可在适当修改代码后进行移植.


我们知道UBoot源码本身直接支持从Nor Flash启动,这是Nor Flash的可执行特性决定的.而针对Nand Flash,则涉及到前4K数据的问题.S3C2410的Nand Flash控制器有一个特殊的功能,就是能在上电后自动将Nand Flash中的前4K数据搬移到4K内部的RAM中,并把0x00000000设置为内部RAM的起始地址,然后CPU从内部RAM的0x000000位置启动,该过程由硬件自动完成.
所以,要使UBoot支持从Nand Flash启动,必须在其前4K代码执行过程中完成将自身复制到RAM中的工作.

但是,我们现在需要让UBoot支持双启动,现在的问题就是该如何判断UBoot是在Nor Flash还是在Nand Flash中呢?呵呵,在S3C2410(S3C2440)中,这个可以通过BWSCON(BUS WIDTH & WAIT CONTROL REGISTER)控制寄存器[2:1]的值进行判断,如果为00则表示是从Nand Flash启动的.因此,我们可以直接通过如下代码进行判断并在BWSCON[2:1]为00时跳转到UBoot复制自身(copy_myself)的代码处:

#define	BWSCON		0x48000000
	ldr		r0, =BWSCON
	ldr 	r0, [r0]
	ands 	r0, r0, #6		@ 判断BWSCON[2:1]是否为00,如果是,则跳转到copy_myself
	beq		copy_myself
好了,双启动问题算是解决了,但是新的问题又来了,这个环境变量又应该如何保存呢?是都保存到Nor Flash还是Nand Flash呢?当然,最好的方式还是保存到各自所在的Flash中.这个可以设置一个标志,在进入Nand Flash启动代码时设置该标志,表示从Nand Flash启动,然后,在保存环境变量时通过该标志的值判断是调用Nor Flash的保存方法还是Nand Flash的保存方法.


下面讲解具体的修改过程(以u-boot-2010.09为例).
首先,修改include/configs/smdk2410.h文件,添加如下宏定义:

#define CONFIG_CMD_ENV	// 开启环境变量操作命令
#define CONFIG_CMD_NAND	// 开启Nand Flash操作命令
#ifdef CONFIG_CMD_NAND
#	define CONFIG_SYS_NAND_BASE            0x4E000000 //Nand配置寄存器基地址
#	define CONFIG_SYS_MAX_NAND_DEVICE      1
#	define CONFIG_MTD_NAND_VERIFY_WRITE    1

#	define CONFIG_NAND_S3C2410
#	define STACK_BASE 0x33f00000   /* 堆栈基址 */
#	define STACK_SIZE 0x8000       /* 堆栈大小 */
#endif

/*---------------------------------------------------------------------
 * Boot From Nor or Nand Flash or both
 */
#define CONFIG_NOR_BOOT
#define CONFIG_NAND_BOOT

#ifdef CONFIG_NOR_BOOT
#	define PHYS_FLASH_1		0x00000000 /* Flash Bank #1 */
#	define CONFIG_SYS_FLASH_BASE		PHYS_FLASH_1

#	define CONFIG_AMD_LV160B	/* 使用AM29LV160DB Nor Flash芯片 */

#	define CONFIG_SYS_MAX_FLASH_BANKS	1	/* max number of memory banks */

/* timeout values are in ticks */
#	define CONFIG_SYS_FLASH_ERASE_TOUT	(5*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
#	define CONFIG_SYS_FLASH_WRITE_TOUT	(5*CONFIG_SYS_HZ) /* Timeout for Flash Write */

#	define	CONFIG_ENV_IS_IN_FLASH	/* 将环境变量保存到Nor Flash中*/
#endif

#ifdef CONFIG_NAND_BOOT
#	define UBOOT_RAM_BASE		0x33f80000
#	define NAND_CTL_BASE		0x4E000000
#	define bINT_CTL(Nb)		__REG(INT_CTL_
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PetaLinux是一个基于Yocto Project的嵌入式Linux开发工具,可用于构建自定义Linux发行版。在PetaLinux中,uboot是用于启动Linux内核的引导加载程序。在uboot中,环境变量是一些可以配置uboot行为的参数。 要将uboot环境变量保存到SD卡中,可以按照以下步骤进行: 1. 在PetaLinux项目中的uboot源代码目录下,找到`include/configs`文件夹,其中包含了与硬件平台相关的uboot配置文件。 2. 打开对应的配置文件,例如`zynq_common.h`。 3. 在配置文件中,找到`#define CONFIG_ENV_IS_IN`宏定义。该宏定义指定了uboot环境变量的存储位置,默认为“nand”或“nor”等闪存设备。 4. 修改`#define CONFIG_ENV_IS_IN`宏定义为`"sd"`,指定uboot环境变量存储在SD卡中。 5. 在配置文件中,找到`#define CONFIG_ENV_OFFSET`宏定义。该宏定义指定了uboot环境变量在存储设备中的偏移地址。 6. 修改`#define CONFIG_ENV_OFFSET`宏定义为SD卡中的偏移地址,例如`0x100000`。 7. 保存并关闭配置文件。 8. 在uboot源代码目录下执行`make clean`命令来清理之前的编译结果。 9. 执行`make`命令重新编译uboot。 10. 将生成的uboot二进制文件烧录到SD卡的启动区域。 11. 将SD卡插入目标设备中,启动设备。 12. 在uboot启动时,可以使用命令`printenv`来验证uboot环境变量是否成功保存在SD卡中。 通过以上步骤,你可以将uboot环境变量保存到SD卡中。这样,在使用SD卡启动设备时,uboot可以从SD卡读取环境变量并进行相应的配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值