天天看點

uboot-環境變量

參考部分:http://www.cnblogs.com/biaohc/p/6398515.html

環境變量的作用:

首先我們先要搞清楚uboot中環境變量的作用,uboot中環境變量的作用就是在不改變源碼、不用重新編譯的情況下,可以使我們通過

設定環境變量的值來改變uboot的一些設定,如bootdelay時間、機器碼的值等等。

env_ptr代表flash的位址。其中CFG_ENV_ADDR為0x70000,對應于norflash的第10個塊位址(flash信号為AM29LV800BB),環境變量獨占居一個資料塊,是以說可以進行單獨儲存。

env_t *env_ptr = (env_t *)CFG_ENV_ADDR;
           
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;
           

環境變量的結構env_t,CRC是對資料的校驗值,flag,表明環境變量是否有效,crc準備。

關于環境變量的函數分析

一、int  env_init(void);環境變量的初始化

int  env_init(void)
{
#ifdef CONFIG_OMAP2420H4
	int flash_probe(void);

	if(flash_probe() == 0)
		goto bad_flash;
#endif
	if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) {
		gd->env_addr  = (ulong)&(env_ptr->data);
		gd->env_valid = 1;
		return(0);
	}
#ifdef CONFIG_OMAP2420H4
bad_flash:
#endif
	gd->env_addr  = (ulong)&default_environment[0];
	gd->env_valid = 0;
	return (0);
}
           

函數中對預設的env_t位址進行校驗,flash中是否有資料存在,如果有直接将全局變量中gd中的env_addr指向flash的env_t空間,并将gd的有效标志位置1.如果flash中不存在環境變量的值,将gd的環境指針指向程式中預設值,有效值為0.

二、void env_relocate (void)

void env_relocate (void)
{
	DEBUGF ("%s[%d] offset = 0x%lx\n", __FUNCTION__,__LINE__,
		gd->reloc_off);

#ifdef CONFIG_AMIGAONEG3SE
	enable_nvram();
#endif

#ifdef ENV_IS_EMBEDDED
	/*
	 * The environment buffer is embedded with the text segment,
	 * just relocate the environment pointer
	 */
	env_ptr = (env_t *)((ulong)env_ptr + gd->reloc_off);
	DEBUGF ("%s[%d] embedded ENV at %p\n", __FUNCTION__,__LINE__,env_ptr);
#else
	/*
	 * We must allocate a buffer for the environment
	 */
	env_ptr = (env_t *)malloc (CFG_ENV_SIZE);
	DEBUGF ("%s[%d] malloced ENV at %p\n", __FUNCTION__,__LINE__,env_ptr);
#endif

	/*
	 * After relocation to RAM, we can always use the "memory" functions
	 */
	env_get_char = env_get_char_memory;

	if (gd->env_valid == 0) {
#if defined(CONFIG_GTH)	|| defined(CFG_ENV_IS_NOWHERE)	/* Environment not changable */
		puts ("Using default environment\n\n");
#else
		puts ("*** Warning - bad CRC, using default environment\n\n");
		SHOW_BOOT_PROGRESS (-1);
#endif

		if (sizeof(default_environment) > ENV_SIZE)
		{
			puts ("*** Error - default environment is too large\n\n");
			return;
		}

		memset (env_ptr, 0, sizeof(env_t));
		memcpy (env_ptr->data,
			default_environment,
			sizeof(default_environment));
#ifdef CFG_REDUNDAND_ENVIRONMENT
		env_ptr->flags = 0xFF;
#endif
		env_crc_update ();
		gd->env_valid = 1;
	}
	else {
		env_relocate_spec ();
	}
	gd->env_addr = (ulong)&(env_ptr->data);

#ifdef CONFIG_AMIGAONEG3SE
	disable_nvram();
#endif
}
           

分析:沒有定義ENV_IS_EMBEDED,環境變量的位址為0x70000,前面有448KB。在記憶體中配置設定一個環境變量的空間。将環境變量拷貝到記憶體中。

環境變量相關的函數:int saveenv(void);void setenv     (char *, char *);都會調用環境變量

繼續閱讀