痞子衡維護(hù)的 NXP-MCUBootUtility 工具距離上一個(gè)版本(v2.3)發(fā)布過(guò)去 3 個(gè)月了,這一次痞子衡為大家?guī)?lái)了小版本升級(jí) v2.3.1(第一次做 x.y.z 中 z 級(jí)別更新),這個(gè)版本主要有兩個(gè)比較重要的改動(dòng)需要跟大家特別說(shuō)明一下。
一、v2.3.1 更新記錄
二、兩個(gè)不可忽視的更新
> 改進(jìn): 在使用 Flashloader 里擦除操作時(shí),某些情況下需要先檢查目標(biāo)區(qū)域是否為空
> 修復(fù): 當(dāng)連接得到的 flash Page/Sector/Block Size 信息有誤時(shí),無(wú)法做進(jìn)一步下載
2.1 確定指定 Flash 區(qū)域?yàn)榉强蘸笤俨?/strong>
我們知道,工具對(duì)于 i.MXRT1xxx 系列開(kāi)發(fā)板的外掛 Flash 擦寫(xiě)支持是通過(guò)加載二級(jí)
Flashloader 來(lái)實(shí)現(xiàn)的,而 Flashloader 來(lái)自于 SDK 包中的
boardsevkimxrt1xxxbootloader_examplesflashloader 工程。
Flashloader 中集成了完整的 FlexSPI NOR Flash 驅(qū)動(dòng),對(duì)于擦除操作,我們知道很多 Flash 都同時(shí)支持 4KB 和 64KB 擦除粒度,因?yàn)?Flashloader 是因 i.MXRT 芯片而異的,每個(gè)芯片的
具體 Flashloader 對(duì)于擦除的處理不盡相同,目前主要有兩個(gè)策略:
策略 1:永遠(yuǎn)用 64KB 的粒度去做擦除。
策略 2:混合使用 4KB 和 64KB 的粒度來(lái)做擦除,大區(qū)域先用 64KB,到小區(qū)域再用 4KB 細(xì)化。
對(duì)于工具 v1.1 及之前版本,這兩種策略的 Flashloader 配合工具使用都不會(huì)有問(wèn)題。但是從 v1.2 開(kāi)始,工具配合使用策略 1 的 Flashloader 會(huì)有一些問(wèn)題。目前已知 RT1050 在 HAB 加密模式下,一鍵下載 App 后去回讀會(huì)發(fā)現(xiàn)偏移 0x2000 之后本該是 App 的地方全是 0xFF,沒(méi)能正確下載,原因是工具流程里會(huì)在下載完 App 之后寫(xiě)一次 FDCB,而做擦除時(shí)因?yàn)榱6仁?64KB,所以誤擦了已下載的 App。
因此 v2.3.1 里的解決方案是,先判斷 FDCB 區(qū)域是否為全 0xFF,如果是的話(huà),就不做擦除了,直接寫(xiě) FDCB。這個(gè)不是完美的解決方案,最好的方案還是修改 Flashloader 去使用策略 2 的擦除方法。
2.2 不依賴(lài)讀回的 Page/Sector/Block 信息去下載
工具在一鍵下載前首先需要連接上主芯片,在連接過(guò)程中會(huì)在左下角芯片狀態(tài)窗口顯示 Flash 的 Page/Sector/Block 信息,這個(gè)信息是從哪里來(lái)的呢?不同的情況下來(lái)源不同:
情況 1:如果當(dāng)前 Flash 是全空的(或者沒(méi)有 FDCB),那么 Flashloader 會(huì)讀取 Flash 中的 SFDP 表,根據(jù) SFDP 表中的信息(包含 Page/Sector/Block Size)自動(dòng)生成用于啟動(dòng)的 512bytes 的 FDCB 寫(xiě)入 Flash 的起始地址處,并在軟件界面同步顯示。
情況 2:如果 Flash 中已有 FDCB(這個(gè) FDCB 可能來(lái)自于 SDK 里的啟動(dòng)頭,也可能是 Flashloader 讀 SFDP 表生成的),那么 Flashloader 便會(huì)復(fù)用這個(gè)信息,不再重新寫(xiě)入 FDCB。
對(duì)于情況 2 中的 FDCB 來(lái)自于 SDK 里的啟動(dòng)頭,如果啟動(dòng)頭中沒(méi)有填充有效的 Page/Sector/Block Size 信息,那么在工具窗口你會(huì)看到 Page/Sector/Block Size = 0x0/0xFFFFFFFF 的情況下,在這種情況下工具無(wú)法再進(jìn)行后續(xù)下載,因?yàn)?v2.3 之前工具會(huì)用 Page/Sector Size 對(duì)擦除或燒寫(xiě)的長(zhǎng)度做對(duì)齊,顯然無(wú)法用 0x0/0xFFFFFFFF 做有效的對(duì)齊。
v2.3.1 做了改進(jìn),不再?gòu)?qiáng)制用 Page/Sector Size 對(duì)擦除或燒寫(xiě)的長(zhǎng)度做對(duì)齊,因?yàn)?Flashloader 里本身就對(duì)傳入的區(qū)域參數(shù)做了對(duì)齊處理。
至此,這次更新的主要特性便介紹完了。MCUBootUtility 項(xiàng)目地址為 https://github.com/JayHeng/NXP-MCUBootUtility, 雖然當(dāng)前版本(v2.3.1)功能已經(jīng)非常完備,你還是可以在此基礎(chǔ)上再添加自己想要的功能。如此神器,還不快快去下載試用?