紀錄一下這幾天的工作, 還是一如以往自己要看文件跟驗證操作步驟,說好的原廠跟ARM 的支援都沒想像中是該領域的大神。

做 Capsule Update 第一個困擾我的是一開始是Linaro 的Paul Liu 有一個demo for i.MX8MM (就是幫Compulab 的 iot gateway 做的一個版本,它好玩的地方是它選用的更新格式是 CONFIG_EFI_CAPSULE_FIRMWARE_FIT 這個 FIT 方式,估計是因為它改用binman SPL 跟U-Boot 本身是分離的,但是System Ready IR 其他地方的文件是CONFIG_EFI_CAPSULE_FIRMWARE_RAW 這邊開始分歧。

現在成功的狀況下可以知道 CONFIG_EFI_CAPSULE_FIRMWARE_RAW 是比較簡單的方式,它就是看指令把該檔案寫到指定的地方而已

那怎樣產生該 Capsule 檔案,直接用uboot-imx tools/mkeficapsule 即可,所以用imx-mkimage 產生實際的bootloader file:flash.bin 然後拷貝到uboot-imx 路徑下,執行下列指令即可

./tools/mkeficapsule --raw flash.bin --index 1 capsule1.bin

然後把檔案弄到 EFI Partitions 上面,因為手上的版子都是EVT 一堆問題,就還是開進linux 下透過掛載檔案系統的方式把檔案放進去

這時出現第二個難題是到底怎樣的指令是對的,實際上U-Boot 的Capsule Update 是利用直接就已經被實做出來的DFU 功能 所以關鍵點在DFU 上面,但是這個功能我之前沒使用過,所以有一些疑問跟測試

實際上就是 dfu_alt_info 這行引導DFU 將檔案寫到那去

mmc 2=1 raw 0 0x2000 mmcpart 1 # 表示 mmcblk2 用raw mode 從block 0開始寫入,一共寫入 0x2000(8096), mmcpart 1 表示 mmcblkXboot0

下面就是完整的步驟

u-boot=> env set dfu_alt_info "mmc 2=1 raw 0 0x2000 mmcpart 1"
u-boot=> saveenv
u-boot=> efidebug boot add 0 Boot0000 mmc 2:1 capsule1.bin
u-boot=> efidebug boot next 0
u-boot=> setenv -e -nv -bs -rt -v OsIndications =0x04
u-boot=> fatload mmc 2:1 $loadaddr EFI/capsule1.bin
u-boot=> fatwrite mmc 2:1 ${loadaddr} /EFI/UpdateCapsule/capsule1.bin 0x${filesize}
u-boot=> efidebug capsule disk-update
u-boot=> reset


This free site is ad-supported. Learn more