u-boot-2012.04.01移植(十)设置默认环境变量及实现环境变量的保存

本文详细介绍了在U-Boot中设置默认环境变量的过程,包括如何定义和保存环境变量,以及如何配置NAND Flash分区,以便更好地管理和使用启动参数。

启动时有如下提示信息,告知使用默认环境变量,我们可以在程序中自己设置默认环境变量

*** Warning - bad CRC, using default environment

搜索using default environment定位到common/env_common.c:175:

grep “using default environment” * -nR

函数开头出现环境变量列表:default_environment,跟踪到

const uchar default_environment[] = {
#ifdef	CONFIG_BOOTARGS
	"bootargs="	CONFIG_BOOTARGS			"\0"
#endif
#ifdef	CONFIG_BOOTCOMMAND
	"bootcmd="	CONFIG_BOOTCOMMAND		"\0"
#endif
#ifdef	CONFIG_RAMBOOTCOMMAND
	"ramboot="	CONFIG_RAMBOOTCOMMAND		"\0"
#endif
#ifdef	CONFIG_NFSBOOTCOMMAND
	"nfsboot="	CONFIG_NFSBOOTCOMMAND		"\0"
#endif
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
	"bootdelay="	MK_STR(CONFIG_BOOTDELAY)	"\0"
#endif
#if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
	"baudrate="	MK_STR(CONFIG_BAUDRATE)		"\0"
#endif
#ifdef	CONFIG_LOADS_ECHO
	"loads_echo="	MK_STR(CONFIG_LOADS_ECHO)	"\0"
#endif
#ifdef	CONFIG_ETHADDR
	"ethaddr="	MK_STR(CONFIG_ETHADDR)		"\0"
#endif
#ifdef	CONFIG_ETH1ADDR
	"eth1addr="	MK_STR(CONFIG_ETH1ADDR)		"\0"
#endif
#ifdef	CONFIG_ETH2ADDR
	"eth2addr="	MK_STR(CONFIG_ETH2ADDR)		"\0"
#endif
#ifdef	CONFIG_ETH3ADDR
	"eth3addr="	MK_STR(CONFIG_ETH3ADDR)		"\0"
#endif
#ifdef	CONFIG_ETH4ADDR
	"eth4addr="	MK_STR(CONFIG_ETH4ADDR)		"\0"
#endif
#ifdef	CONFIG_ETH5ADDR
	"eth5addr="	MK_STR(CONFIG_ETH5ADDR)		"\0"
#endif
#ifdef	CONFIG_IPADDR
	"ipaddr="	MK_STR(CONFIG_IPADDR)		"\0"
#endif
#ifdef	CONFIG_SERVERIP
	"serverip="	MK_STR(CONFIG_SERVERIP)		"\0"
#endif
#ifdef	CONFIG_SYS_AUTOLOAD
	"autoload="	CONFIG_SYS_AUTOLOAD		"\0"
#endif
#ifdef	CONFIG_PREBOOT
	"preboot="	CONFIG_PREBOOT			"\0"
#endif
#ifdef	CONFIG_ROOTPATH
	"rootpath="	CONFIG_ROOTPATH			"\0"
#endif
#ifdef	CONFIG_GATEWAYIP
	"gatewayip="	MK_STR(CONFIG_GATEWAYIP)	"\0"
#endif
#ifdef	CONFIG_NETMASK
	"netmask="	MK_STR(CONFIG_NETMASK)		"\0"
#endif
#ifdef	CONFIG_HOSTNAME
	"hostname="	MK_STR(CONFIG_HOSTNAME)		"\0"
#endif
#ifdef	CONFIG_BOOTFILE
	"bootfile="	CONFIG_BOOTFILE			"\0"
#endif
#ifdef	CONFIG_LOADADDR
	"loadaddr="	MK_STR(CONFIG_LOADADDR)		"\0"
#endif
#ifdef	CONFIG_CLOCKS_IN_MHZ
	"clocks_in_mhz=1\0"
#endif
#if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0)
	"pcidelay="	MK_STR(CONFIG_PCI_BOOTDELAY)	"\0"
#endif
#ifdef	CONFIG_EXTRA_ENV_SETTINGS
	CONFIG_EXTRA_ENV_SETTINGS
#endif
	"\0"
};

在设置某些环境变量之前,可以先规划一下flash分区,并在u-boot中利用mtdparts命令来打印分区信息,试验发现u-boot仍未配置这个命令

虚拟机中输入以下命令定位到common/Makefile:129

grep "mtdparts" * -nR | grep Makefile

配置这个命令需要定义宏:CONFIG_CMD_MTDPARTS

在include/configs/smdk2440.h中定义它(如果之前没定义)

#define CONFIG_CMD_MTDPARTS

mtdparts是一个命令,可以用于打印出分区信息,它本身可能也是一个命令行参数,尝试用下面命令搜索,定位到许多配置文件

grep mtdparts * -nR | grep \#define

仿照其它配置文件的定义,在include/configs/smdk2440.h定义我们的宏:

#define CONFIG_MTD_DEVICE
#define MTDIDS_DEFAULT          "nand0=JZ2440-0"
#define MTDPARTS_DEFAULT        "mtdparts=JZ2440-0:256k(u-boot),"      \
												 "128k(params),"			\
												 "4m(kernel),"		\
												 "-(rootfs)" 					

至此分区表就设置好了,在u-boot菜单中输入下面命令后,即可正常使用mtd相关命令

mtdparts default

为了简便起见,让u-boot启动时自动执行这条命令

修改arch/arm/lib/board.c

        run_command(“mtdparts default”, 0);
	for (;;) {
		main_loop();
	}

 

回到环境变量的设置

在include/configs/smdk2440.h定义一些默认环境变量

#define CONFIG_NETMASK		255.255.255.0    //子网掩码
#define CONFIG_IPADDR		192.168.0.200    //开发板ip
#define CONFIG_SERVERIP		192.168.0.100    //服务器ip
    
#define CONFIG_BOOTARGS		"console=ttySAC0,115200 root=/dev/mtdblock3"    //启动参数
#define CONFIG_BOOTCOMMAND	"nand read 30000000 kernel; bootm 30000000"    //启动命令
#define CONFIG_ETHADDR		00:0c:29:4c:4b:85    

其中先设置分区是为了定义启动命令参数时不直接使用起始地址、内核大小,而是使用分区名称

 

从nor flash上启动,可以通过save命令来保存环境变量;但是nand flash启动时,这为开发带来不便

u-boot菜单中输入下面给命令查看帮助save命令的信息

? save

帮助信息为:

saveenv - save environment variables to persistent storage

Usage:
saveenv 

在虚拟机中输入下面命令定位到common/env_nand.c:174

grep "saveenv(" * -nR

 

找到编译env_nand.c所需要的宏CONFIG_ENV_IS_IN_NAND

cat common/Makefile | grep env_nand

在include/configs/smdk2440.h中flash和environment相关区域中定义宏:

,并且将相似的宏:CONFIG_ENV_IS_IN_FLASH注释掉

//#define CONFIG_ENV_IS_IN_FLASH
#define CONFIG_ENV_IS_IN_NAND

分析common/env_nand.c可以知道,还需要定义表示存储地址、块大小、擦除块大小的宏CONFIG_ENV_OFFSET、CONFIG_ENV_SIZE,取消CONFIG_ENV_ADDR的定义

#if 0
#define CONFIG_ENV_ADDR			(CONFIG_SYS_FLASH_BASE + 0x070000)
#endif
#define CONFIG_ENV_OFFSET	0x00040000
#if 0
#define CONFIG_ENV_IS_IN_FLASH
#endif
#define CONFIG_ENV_IS_IN_NAND
#if 0
#define CONFIG_ENV_SIZE			0x10000
#endif
#define CONFIG_ENV_SIZE		0x20000
#define CONFIG_ENV_RANGE	CONFIG_ENV_SIZE

 

重新编译烧写u-boot就能使用新的默认环境变量,并且修改环境变量后能通过save命令将其保存

使用mtdparts命令可以打印分区信息

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值