1. 程式人生 > >Uboot根據讀寫eeprom啟動標記,設定不同bootcmd和bootargs啟動引數

Uboot根據讀寫eeprom啟動標記,設定不同bootcmd和bootargs啟動引數

要實現此功能大體上分如下步驟:

# 第一,uboot讀寫eeprom,根據讀到的值x (x = [ 0、1、2、3、... ...])組成(bootcmd<x>, bootargs<x>);然後獲取這組值,來設定bootcmd和bootargs。

# 第二,pc機端把(bootcmd<x>, bootargs<x>)等uboot引數寫入到文字檔案中,最終生成正確的二進位制檔案;之後和uboot映象合成帶引數區的bootloader。

程式碼實現步驟:

# 第一步、在common/main.c檔案的main_loop函式中


在以下三行的程式碼前
s = getenv ("bootcmd");


debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>");
新增如下程式碼:

static int Set_Boot_Param (unsigned char i2c_device_chip, unsigned char rmii);

// 省略... ...

#define CONFIG_BOOT_CTL

#ifdef CONFIG_BOOT_CTL
{
	Set_Boot_Param (i2c_device_chip, rmii);
}
#endif /* CONFIG_BOOT_CTL */
/* --------------------------------------------------- */

		s = getenv ("bootcmd");

		debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>");

		if (bootdelay >= 0 && s && !abortboot (bootdelay)) {

// 省略... ...

static int Set_Boot_Param (unsigned char i2c_device_chip, unsigned char rmii)
{
	uchar flags[8];
	uchar mac[18];
	unsigned int offset;


	char *p_bootcmdx;
	char *p_bootargsx;
	char bootcmd_name[16];
	char bootargs_name[16];
	char bootargsbuf[512];


	/* delete bootcmd and bootarg, if exist */
	if (getenv ("bootcmd") ||
		getenv ("bootargs"))
	{
		setenv ("bootcmd", NULL);
		setenv ("bootargs", NULL);
		saveenv ();
	}


	/* reset flags */
	memset (flags, 0, sizeof (flags));
	memset (mac, 0, sizeof (mac));
	/* get 8 chars from eeprom */
	eeprom_read_flags (flags, sizeof (flags), i2c_device_chip);
	eeprom_read_mac (mac, sizeof (mac), i2c_device_chip);


	/* reset bootcmd_name & bootargs_name & bootargsbuf */
	memset (bootcmd_name, 0, sizeof (bootcmd_name));
	memset (bootargs_name, 0, sizeof (bootargs_name));
	memset (bootargsbuf, 0, sizeof (bootargsbuf));


	sprintf (bootcmd_name, "bootcmd%d", flags[0]);
	sprintf (bootargs_name, "bootargs%d", flags[0]);


	p_bootcmdx = getenv (bootcmd_name);
	p_bootargsx = getenv (bootargs_name);


	if ((NULL == p_bootcmdx) || (NULL == p_bootargsx))
	{
		p_bootcmdx = getenv ("bootcmd0");
		p_bootargsx = getenv ("bootargs0");
		/* write eeprom */
		//...
	}


	if ((NULL != p_bootcmdx) && (NULL != p_bootargsx))
	{
		sprintf (bootargsbuf, "flags=%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x ",
			flags[0], flags[1], flags[2], flags[3], flags[4], flags[5], flags[6], flags[7]);
		strcat (bootargsbuf, p_bootargsx);
		sprintf (bootargsbuf, "%s rmii=%d", bootargsbuf, rmii);


		strcat (bootargsbuf, " nwhwconf=device:eth0,hwaddr:");
		strcat (bootargsbuf, mac);


		setenv("bootcmd", p_bootcmdx);
		setenv("bootargs", bootargsbuf);
	}


	#if 0
	printf ("########\n");
	printf ("%s=%s", bootcmd_name, p_bootcmdx);
	printf ("\n\n");
	printf ("%s=%s", bootargs_name, bootargsbuf);
	printf ("\n########\n");
	#endif


	return 0;
}
# 使用說明:
1、板子啟動之後設定如下的bootcmd<x>和bootargs<x>組合:
第0組
bootcmd0=""
bootargs0=""
第1組
bootcmd1=""
bootargs1=""


imw 51 0.2 0 1# 使用第0組
imw 51 0.2 1 1# 使用第1組


2、若沒有設定,則需手動設定bootcmd和bootargs。


########
注意事項:
########
如果執行save操作,一定要在它之前執行setenv bootcmd; setenv bootargs; save;
否則,設定的bootcmd和bootargs字串會出現錯位。