Tiny OTA 是一個針對 i.MX RT 系列的 OTA 參考設計,其包含 MCU 端固件(tota_sbl 和 tota_app)和 PC 端 GUI 工具(MCU-TinyOtaUtility)兩部分。
tota_sbl 是示例 bootloader 程序,其由 MCU ROM 引導啓動,該程序負責檢查 OTA 標誌、校驗兩個 Slot 位置的 tota_app 完整性並選擇高版本跳轉執行,其也支持通過 blhost 協議與上位機通信以更新 tota_app。
tota_app 是示例 application 程序,其就是一個基於 SDK hello world XIP 工程的模板,用户可以基於此模板開發自己的應用。無論 Slot 0 還是 Slot 1 位置的 application 均共享同一個鏈接文件(即永遠被搬移到 Slot 0 位置處運行)。
MCU-TinyOtaUtility 是基於 PyQT5 的上位機工具,其支持 tota_sbl 和 tota_app 的加 OTA 頭操作,還能與 MCU ROM 進行通信以實現 tota_sbl 和 tota_app 的燒寫,同時也支持對 Flash 進行一般讀寫擦操作。
一、特性概述
Tiny OTA 工具:
1. 支持i.MXRT117x
2. 支持i.MXRT118x
3. 支持NOR Flash一般讀寫擦操作
4. 支持UART&USB blhost協議與MCU ROM通信
5. 支持bootloader程序加頭(slot0,1 app start, Magic)與下載
6. 支持application程序加頭(Len, CRC32, Version, Magic)與下載
Tiny OTA 固件:
1. 支持i.MXRT117x
2. 支持i.MXRT118x
4. 支持主核示例程序(對於雙核MCU而言)
4. BL: 僅支持FlexSPI1 XIP application程序管理 (永遠從slot 0位置啓動)
5. BL: 支持CRC32-MPEG2校驗以判斷application完整性
6. BL: 複用軟件reliable update流程(來自於Kinetis Bootloader)
7. BL: 5秒超時內通過UART&USB blhost與上位機通信,否則跳轉進application執行
二、MCU端固件
固件地址 https://github.com/JayHeng/imxrt-tiny-ota-fw/archive/refs/tags/v1.0.zip
IDE版本:IAR EWARM v9.70.1
2.1 tota_app
使用 IAR 打開 \imxrt-tiny-ota-fw\targets\imxrt1180\apps\tota_app\cm33 工程(基於SDK hello world XIP 工程),切換到 flex_nor_debug target(工程選項裏已經設置了 XIP_BOOT_HEADER_ENABLE=0,即生成的 binary 就是裸的 ARM 程序),當前在其鏈接文件裏設定 ARM 程序起始地址在 FlexSPI1 Flash 的 0x28080000 處,編譯生成 tota_app_cm33.bin(bin 起始地址就是 0x28080000),用户可根據需要修改 tota_app 工程鏈接文件裏的 app_image_offset 值。
define symbol m_flash_start = 0x28000000;
define symbol app_image_offset = 0x00080000;
define symbol m_text_start = m_flash_start + app_image_offset;
有了 tota_app_cm33.bin 之後,後續再通過 MCU-TinyOtaUtility 工具加上 OTA 頭(包含 Length、CRC32、Version、Magic)並將其燒寫到 Flash Slot0 或者 Slot1 位置(注意 Slot 0 對應偏移應與 app_image_offset 一致),OTA 信息位置複用了 ARM Vector Table 裏保留的如下幾個 Vector。
2.2 tota_sbl
使用 IAR 打開 \imxrt-tiny-ota-fw\targets\imxrt1180\apps\tota_sbl\cm33 工程(基於SDK flashloader 工程,但是對工程做了一些改動,增加了 ROM boot header,鏈接文件也從 RAM target 改成了標準 XIP target,此外還使能了黑科技,即利用 IDE 特性將除了 init_data_bss 代碼之外的 RO 段全部搬移到 RAM 執行,這樣方便運行後續因 application 搬移需要的 Flash 擦寫操作),當前在其鏈接文件裏設定 ARM 程序起始地址在 FlexSPI1 Flash 的 0x2800B000 處,編譯生成 tota_sbl_cm33.bin(注意 bin 起始地址是 0x28000400,因為包含 fcb 等啓動頭),一般來説我們無需修改 tota_sbl 工程鏈接文件。
define symbol m_flash_start = 0x28000000;
define symbol app_image_offset = 0x0000B000;
define symbol m_text_start = m_flash_start + app_image_offset;
define symbol m_fcb_offset = 0x400;
define symbol m_fcb_start = m_flash_start + m_fcb_offset;
define symbol m_interrupts_ram_start = 0x304A0000;
因為 RT1180 獨特的 TRDC 權限管理,在 tota_sbl 工程配套的 container 裏的 image_entry.size 長度需要覆蓋從 Flash 起始地址一直覆蓋到 Slot 0 全部空間,否則會影響 ROM 跳轉至 tota_sbl 以及 tota_sbl 跳轉到 tota_app 執行。這一點後續可改進為在 tota_sbl 裏設置 TRDC 權限來解決 tota_app 跳轉權限問題,這樣可以減小 container 裏的 image_entry.size 長度(僅需覆蓋 tota_sbl 空間即可)。
有了 tota_sbl_cm33.bin 之後,後續再通過 MCU-TinyOtaUtility 工具加上 OTA 頭(包含 slot0,1 app start, Magic)並將其燒寫到 Flash 起始位置(從 fcb 位置開始),OTA 信息位置依然複用了 ARM Vector Table 裏保留的如下幾個 Vector。這裏的 app load addr 參數功能暫時還未實現,後續可用於拓展支持靈活的 application 加載地址配置。
當 Flash Slot 0,1 處分別有了可用的 application,為了調試方便,我們也可以直接手動修改 tota_sbl 工程的 startup 文件裏的如下參數值,這樣可以直接在線下載調試 tota_sbl 工程,無需通過上位機工具來添加 OTA 頭以及燒寫。
2.3 SBL裏Reliable Update流程
當 SBL 裏 OTA 頭 Magic 校驗通過,且 slot 0,1 地址有效時,SBL 會執行 Reliable Update 流程。
1. 如果 slot 0,1 程序均無效(無 Magic 或者 CRC 校驗失敗),直接進入 ISP 模式等待上位機下載
2. 如果 slot 0 程序有效,slot 1 程序無效,5s 超時後跳轉至 slot 0 程序執行
3. 如果 slot 0 程序無效,slot 1 程序有效,將 slot 1 程序拷貝至 slot 0 位置,5s 超時後跳轉至 slot 0 程序執行
4. 如果 slot 0,1 程序均有效,判斷兩者的程序版本:
- 如果 slot 0 版本不低於 slot 1 版本,5s 超時後跳轉至 slot 0 程序執行
- 如果 slot 0 版本低於 slot 1 版本,將 slot 1 程序拷貝至 slot 0 位置,5s 超時後跳轉至 slot 0 程序執行
三、PC端GUI工具
工具地址 https://github.com/JayHeng/MCU-TinyOtaUtility/archive/refs/tags/v1.0.zip
3.1 建立連接
雙擊 \MCU-TinyOtaUtility\bin\MCU-TinyOtaUtility.exe 打開工具,根據目標板 Flash 連接情況做相應設置,將 RT1180-EVK 開發板啓動模式設置為 ISP 模式,然後連接上 UART 或者 USB cable,點擊 'Connect' 按鈕可在左下角信息框裏看到連接信息。
3.2 OTA下載
準備好了 tota_sbl_cm33.bin 以及 tota_app_cm33.bin 之後,可先點擊界面籃圈指示裏 'Stage1 BL File', 'Slot0/1 App File' 按鈕分別指向對應的路徑,這裏 Slot0/1 可用同一個 application binary 文件。然後設置紅框裏的 'start' 以及 'version' 參數,這裏 Stage1 BL 對應的偏移 0x400,以及 Slot0 App 對應的偏移 0x80000 應與對應工程鏈接文件設置匹配,而 Slot1 App 對應的偏移位置可自由設置;至於 Version 設置,目前最大支持 V255.255 即 2bytes 存儲。設置好了之後,最後點擊 'All In One' 按鈕即可完成三個文件的 OTA 頭添加以及下載(也可分步操作)。
下載完成之後將 RT1180-EVK 開發板啓動模式設置為 Flash Boot 模式,打開串口調試助手可看如下打印信息,這裏設置的 slot 1 版本高於 slot 0,所以我們看到 sbl 將 slot 1 app 拷貝到了 slot 0 位置並跳轉執行。
3.3 一般Flash操作
成功建立連接之後,可對 Flash 指定範圍進行一般讀寫擦操作,注意當前寫操作僅支持 binary 文件格式(.bin)。