嵌入式系統 - 建立 OpenWrt 的韌體更新檔案


執行命令為 /sbin/sysupgrade firmware.bin

註:
/sbin/sysupgrade 是 script 的文字檔(會 include /lib/upgrade/ 裡面的檔案)
firmware.bin 是韌體檔案


步驟一

在 /lib/upgrade/platform.sh 的 func platform_check_image() 會檢查 firmware.bin 是否合法

註:會下此命令查詢
dumpimage -l ${img} | awk '/^ Image.*(.*)/ { print gensub(/Image .* \((.*)\)/,"\\1", $0) }' 


在 platform_check_image()裡,增加判斷字串,如下:

local mandatory_kernel="kernel@1"
image_has_mandatory_section $1 ${mandatory_kernel} && {\
mandatory_section_found=1
}

或用 mkimage 建立內建支援的字串


步驟二

/lib/upgrade/common.sh 的 do_upgrade() 會再進入 platform_do_upgrade()
可能會需要在 platform_do_upgrade() 的 case "$board" in 增加板子的型號


步驟三

之後進入 flash_section() 的 case "${sec}" in
並選擇其中一項進行更新,我選擇的是 ubi*
(在 mkimage 時 .its 內容的 images 名稱字串)


步驟四

最後會進入 do_flash_ubi()
(把不需要的 Fail safe upgrade 功能關掉)




附錄:

rootfs.cfg

[kernel]
mode=ubi
image=arch/arm64/boot/Image.itb
vol_id=0
vol_type=dynamic
vol_name=kernel

[config_data]
mode=ubi
vol_size=25MiB
vol_id=1
vol_type=dynamic
vol_name=config_data


# ubinize -m 2048 -p 128KiB -o rootfs.ubi rootfs.cfg


rootfs.its

/dts-v1/;

/ {
description = "ARM64 OpenWrt FIT (Flattened Image Tree)";
#address-cells = <1>;

images {
ubi@rootfs {
description = "ARM64 OpenWrt Linux-4.4.60";
data = /incbin/("rootfs.ubi");
type = "ramdisk";
arch = "arm64";
compression = "gzip";
os = "linux";
hash@1 {
algo = "crc32";
};
hash@2 {
algo = "sha1";
};
};

};

configurations {
default = "config@1";

config@1 {
description = "ARM64 OpenWrt Linux-4.4.60";
ramdisk = "ubi@rootfs";
};
};
};


# mkimage -f rootfs.its rootfs.itb


沒有留言:

張貼留言