Uboot根據讀寫eeprom啟動標記,設定不同bootcmd和bootargs啟動引數
阿新 • • 發佈:2018-12-31
要實現此功能大體上分如下步驟:
# 第一,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字串會出現錯位。