转载:http://blog.chinaunix.net/uid-28236237-id-3867041.html
U-boot中通过环境参数保存一些配置,这些配置可以通过修改环境参数、保存环境参数、读取环境参数等操作进行灵活的配置,便于调试开发。这篇文章主要来分析一下u-boot中环境参数的实现。文章主要分为四个部分,第一是环境参数的存储格式,第二部分是环境参数的初始化,第三部分是环境参数的读取,第四个部分是环境参数保存过程。
首先,我们来看一下环境参数的存储格式。一般嵌入式系统的第一个分区是boot分区,而环境参数一般会采用一种格式保存到boot代码区之后,当然,这个位置不能超出第一个分区的边界。
typedef struct environment_s
{
unsigned long crc; /* CRC32 over data bytes */
#ifdef CFG_REDUNDAND_ENVIRONMENT
unsigned char flags; /* active/obsolete flags */
#endif
unsigned char data[ENV_SIZE]; /* Environment data */
} env_t;
|
环境参数就是以这样的格式存储到flash上的,其中crc表示对整个环境参数数据的校验码。Data中保存环境参数,参数的组织格式是这样的。
static uchar default_environment[] =
{
#if defined(CONFIG_BOOTARGS)
"bootargs=" CONFIG_BOOTARGS " "
#endif
#if defined(CONFIG_BOOTCOMMAND)
"bootcmd=" CONFIG_BOOTCOMMAND " "
#endif
#if defined(CONFIG_RAMBOOTCOMMAND)
"ramboot=" CONFIG_RAMBOOTCOMMAND " "
#endif
#if defined(CONFIG_NFSBOOTCOMMAND)
"nfsboot=" CONFIG_NFSBOOTCOMMAND " "
#endif
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
"bootdelay=" MK_STR (CONFIG_BOOTDELAY) " "
#endif
#if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
"baudrate=" MK_STR (CONFIG_BAUDRATE) " "
#endif
#ifdef CONFIG_LOADS_ECHO
"loads_echo=" MK_STR (CONFIG_LOADS_ECHO) " "
#endif
#ifdef CONFIG_ETHADDR
"ethaddr=" MK_STR (CONFIG_ETHADDR) " "
#endif
#ifdef CONFIG_ETH1ADDR
"eth1addr=" MK_STR (CONFIG_ETH1ADDR) " "
#endif
#ifdef CONFIG_ETH2ADDR
"eth2addr=" MK_STR (CONFIG_ETH2ADDR) " "
#endif
#ifdef CONFIG_ETH3ADDR
"eth3addr=" MK_STR (CONFIG_ETH3ADDR) " "
#endif
#ifdef CONFIG_ETHPRIME
"ethprime=" CONFIG_ETHPRIME " "
#endif
#ifdef CONFIG_IPADDR
"ipaddr=" MK_STR (CONFIG_IPADDR) " "
#endif
#ifdef CONFIG_SERVERIP
"serverip=" MK_STR (CONFIG_SERVERIP) " "
#endif
#ifdef CFG_AUTOLOAD
"autoload=" CFG_AUTOLOAD " "
#endif
#ifdef CONFIG_ROOTPATH
"rootpath=" MK_STR (CONFIG_ROOTPATH) " "
#endif
#ifdef CONFIG_GATEWAYIP
"gatewayip=" MK_STR (CONFIG_GATEWAYIP) " "
#endif
#ifdef CONFIG_NETMASK
"netmask=" MK_STR (CONFIG_NETMASK) " "
#endif
#ifdef CONFIG_HOSTNAME
"hostname=" MK_STR (CONFIG_HOSTNAME) " "
#endif
#ifdef CONFIG_BOOTFILE
"bootfile=" MK_STR (CONFIG_BOOTFILE) " "
#endif
#ifdef CONFIG_LOADADDR
"loadaddr=" MK_STR (CONFIG_LOADADDR) " "
#endif
#ifdef CONFIG_PREBOOT
"preboot=" CONFIG_PREBOOT " "
#endif
#ifdef CONFIG_CLOCKS_IN_MHZ
"clocks_in_mhz=" "1" " "
#endif
#if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0)
"pcidelay=" MK_STR (CONFIG_PCI_BOOTDELAY) " "
#endif
#ifdef CONFIG_EXTRA_ENV_SETTINGS
CONFIG_EXTRA_ENV_SETTINGS
#endif
" " /* Termimate env_t data with 2 NULs */
};
|
实际上就是”xxxx=xxxx”’