启动时有如下提示信息,告知使用默认环境变量,我们可以在程序中自己设置默认环境变量
*** 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命令可以打印分区信息
本文详细介绍了在U-Boot中设置默认环境变量的过程,包括如何定义和保存环境变量,以及如何配置NAND Flash分区,以便更好地管理和使用启动参数。
882

被折叠的 条评论
为什么被折叠?



