痞子衡維護(hù)的 NXP-MCUBootUtility 工具距離上一個(gè)大版本(v3.4.0)發(fā)布過(guò)去半年了,這一次痞子衡為大家?guī)?lái)了版本升級(jí) v3.5.0,這個(gè)版本主要有幾個(gè)非常重要的更新需要跟大家特別說(shuō)明一下。
一、v3.5更新記錄
二、幾個(gè)不可忽視的更新
2.1 支持串行NOR雙程序啟動(dòng)下載
部分 i.MXRT 型號(hào) BootROM 支持串行 NOR Flash 的雙程序啟動(dòng),這意味著在這些型號(hào)上用戶可以不用額外設(shè)計(jì)二級(jí) bootloader 也可以完成本地 OTA 升級(jí)。
之前痞子衡把所有支持雙程序啟動(dòng)的 i.MXRT 型號(hào)都試了一遍,一共寫(xiě)了三篇文章,在文中痞子衡是借助 MCUBootUtility v3.4 里的通用編程器來(lái)手動(dòng)做兩個(gè) image 的下載的,并且 image 版本頭添加,以及 Fuse 燒寫(xiě)也都是手工完成的,步驟稍顯復(fù)雜。
《i.MXRT1060,1010上串行NOR Flash冗余程序啟動(dòng)設(shè)計(jì)》
《i.MXRT1170上串行NOR Flash雙程序可交替啟動(dòng)設(shè)計(jì)》
《i.MXRT500,600系列上串行NOR Flash雙程序可交替啟動(dòng)設(shè)計(jì)》
在 MCUBootUtility v3.5 上再去做同樣的事情就簡(jiǎn)單多了,只需要在 FlexSPI NOR Device Configuration 界面里設(shè)置雙程序啟動(dòng)相關(guān)參數(shù)即可,工具會(huì)自動(dòng)完成后續(xù)所有事情(燒寫(xiě)相應(yīng) Fuse、添加 image 版本頭,燒寫(xiě)兩份 image 進(jìn) Flash)。
- Note1: Image 1 offset 保持默認(rèn) 0,即不使能雙程序下載;如果設(shè)為非 0,這個(gè)值也會(huì)被燒寫(xiě)進(jìn) Fuse。Note2: Image 0/1 version 如果保持 none 值,在雙程序下載使能的情況下實(shí)際等同于 0xFFFF 值。
2.2 支持串行NOR的ECC方式下載
在部分增強(qiáng)型 i.MXRT 型號(hào)上(比如 i.MXRT1170),芯片內(nèi)部增加了很多 ECC 方面設(shè)計(jì),從 RAM 到 Flash 再到 Fuse,全部都有 ECC 保護(hù),這樣芯片可放心用于那些對(duì)穩(wěn)定性要求高的產(chǎn)品場(chǎng)合(比如汽車)。
在 i.MXRT1170 上是 XECC 模塊負(fù)責(zé)了 FlexSPI 外設(shè)連接的 Flash 上 ECC 處理,痞子衡之前為此寫(xiě)過(guò)一篇文章 《i.MXRT1170 XECC功能特點(diǎn)及其保護(hù)串行NOR Flash和SDRAM之道》。但是官方 SDK 里提供的 Flashloader (路徑在 SDK_2.11.0_MIMXRT1170-EVKboardsevkmimxrt1170bootloader_examplesflashloader)并不支持 ECC 方式的寫(xiě)入,而 MCUBootUtility 正是借助這個(gè)官方 Flashloader 完成 Flash 的擦寫(xiě)的,所以我們需要改這個(gè)官方 Flashloader,為此痞子衡創(chuàng)建了一個(gè)項(xiàng)目:
- 包含ECC功能的Flashloader項(xiàng)目:https://github.com/JayHeng/imxrt-ecc-flashloader
在 imxrt-ecc-flashloader 工程里,痞子衡引入了 XECC 模塊驅(qū)動(dòng),并且將 ECC 功能集成到了 set-property 13 和 write-memory 這兩個(gè)命令里。這里有兩個(gè)注意點(diǎn),一是:使能 ECC 寫(xiě)入后,寫(xiě)入首地址需要以 4KB 對(duì)齊(在 XECC 模塊的限制下做的設(shè)定),二是:使能 ECC 寫(xiě)入后,擦除長(zhǎng)度需要是 image 長(zhǎng)度的兩倍(XECC 原理決定的)。
// 初始化 Flash
blhost -u -- fill-memory 0x20200000 0x4 0xC0000005
blhost -u -- fill-memory 0x20200004 0x4 0x0
blhost -u -- configure-memory 0x9 0x20200000
// 關(guān)閉 ECC 寫(xiě)入功能,復(fù)位 XECC 模塊(默認(rèn)配置)
blhost -u -- set-property 13 0
// 擦除 Flash 前 16KB 空間
blhost -u -- flash-erase-region 0x30000000 0x4000
// 正常寫(xiě)入 Flash
blhost -u -- write-memory 0x30000000 bt_image_16KB.bin 0x9
// 使能 ECC 寫(xiě)入功能
blhost -u -- set-property 13 1
// 擦除 Flash 前 32KB 空間
blhost -u -- flash-erase-region 0x30000000 0x8000
// 先初始化 XECC 模塊,然后以 ECC 方式寫(xiě)入 Flash(寫(xiě)入地址需要以 4KB 對(duì)齊)
blhost -u -- write-memory 0x30000000 bt_image_16KB.bin 0x9
// 每一次寫(xiě)完 Flash 需要關(guān)閉 ECC 寫(xiě)入功能
blhost -u -- set-property 13 0
痞子衡將 imxrt-ecc-flashloader 工程生成的可執(zhí)行文件(CM4版本)放到了 NXP-MCUBootUtilitysrctargetsMIMXRT1176flashloader_user.srec,讓工具用這個(gè)含 ECC 功能的 Flashloader,并且在工具通用編程器界面增加了 ECC Write 按鈕,這個(gè)按鈕可以一鍵完成 .bin 格式文件的 ECC 方式下載。
- Note: v3.5版本工具里沒(méi)有自動(dòng)集成 ECC 使能的 Fuse 位燒寫(xiě),因?yàn)?Fuse 燒寫(xiě)完,芯片需要復(fù)位一次,XECC 才生效,所以用戶需要自己手動(dòng)燒寫(xiě) Fuse。
至此,這次更新的主要特性便介紹完了。MCUBootUtility項(xiàng)目地址如下。雖然當(dāng)前版本(v3.5.0)功能已經(jīng)非常完備,你還是可以在此基礎(chǔ)上再添加自己想要的功能。如此神器,還不快快去下載試用?
- 地址1:https://github.com/NXPMicro/mcu-boot-utility地址2:https://github.com/JayHeng/NXP-MCUBootUtility地址3:https://gitee.com/jayheng/NXP-MCUBootUtility