openwrt設置uboot環境變量在flash上的存儲地址


 1.分析如下

ubootenv_add_app_config

ubootenv_add_uci_config "/dev/mtd1" "0x40000" "0x2000"  "0x20000"

 

這兩個函數定義在文件package/boot/uboot-envtools/files/uboot-envtools.sh中,先來解析以上語句:

/dev/mtd1 : 指定boot_env所在flash上的分區

0x40000 : 指定boot_env所在分區上的偏移量(這個參數有點費解,這個參數是否是多余的?

0x2000 :指定uboot的環境變量存儲空間大小,注意這個大小,必須與在package/boot/uboot-${boardname}/Makefile中定義的ENV_SIZE大小一致,否則會報CRC校驗出錯,比如mtd2分區的大小為1MiB,uboot指定的大小為0x40000,那么應該使用0x40000

0x20000 :指定flash的sector大小

ubootenv_add_app_config這個函數就是將"/dev/mtd1" "0x40000" "0x2000"  "0x20000" 這些內容追加到/etc/fw_env.config

 

2.舉例論證

筆者使用的flash分區如下:

root@OpenWrt:/# cat /proc/mtd
dev: size erasesize name
mtd0: 00200000 00040000 "u-boot"
mtd1: 00100000 00040000 "u-boot-env"
mtd2: 00100000 00040000 "dts"
mtd3: 00800000 00040000 "kernel"

mtd4: 00800000 00040000 "rootfs"

flash的扇區大小為0x40000=256KiB

uboot的環境變量保存在flash的mtd1分區上

那么/etc/fw_env.config的值如下:

/dev/mtd1 0x0000 0x40000  0x40000

0x0000:這個值為0比較費解

第一個0x40000來自uboot的宏定義ENV_SIZE

第二個0x40000來自uboot的宏定義CONFIG_ENV_SECT_SIZE

 

3.fw_printenv和fw_setenv報錯分析(假設只有其中一項參數不正確)

3.1 當指定的環境變量大小不正確時提示:

root@OpenWrt:/etc# fw_printenv

Warning: Bad CRC, using default environment

3.2 當指定的第一個參數分區偏移量不正確且該值不等於該分區在flash的偏移量大小:

root@OpenWrt:/etc# fw_printenv
Warning: Bad CRC, using default environment

3.3 當指定的分區偏移量沒有與flash的sector大小成倍數時:

root@OpenWrt:/etc# fw_printenv
Environment does not start on (erase) block boundary

3.4 當指定的第一個參數分區偏移量等於該分區在flash上的偏移量時:

可以讀取出環境變量,但是沒法修改環境變量,錯誤提示如下:

root@OpenWrt:/etc# fw_setenv bootdelay 4
MTD erase error on /dev/mtd2: Invalid argument
Error: can't write fw_env to flash


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM