View a markdown version of this page

Microchip Curiosity PIC32MZEF 的示範開機載入器 - FreeRTOS

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Microchip Curiosity PIC32MZEF 的示範開機載入器

重要

此示範託管在已棄用的 Amazon-FreeRTOS 儲存庫上。我們建議您在建立新專案時從這裡開始。如果您已經有以現在已棄用的 Amazon-FreeRTOS 儲存庫為基礎的現有 FreeRTOS 專案,請參閱 Amazon-FreeRTOS Github 儲存庫遷移指南。 FreeRTOS

注意

根據與 Microchip 的協議,我們將從 FreeRTOS 參考整合儲存庫主分支中移除 Curiosity PIC32MZEF (DM320104),並且不會再將其帶入新版本。Microchip 已發出正式通知,指出不再建議將 PIC32MZEF (DM320104) 用於新設計。PIC32MZEF 專案和原始程式碼仍然可以透過先前的版本標籤存取。Microchip 建議客戶使用 Curiosity PIC32MZ-EF-2.0 開發板 (DM320209) 進行新設計。PIC32MZv1 平台仍然可以在 FreeRTOS 參考整合儲存庫的 v202012.00 中找到。不過,FreeRTOS 參考的 v202107.00 不再支援平台。

此示範開機載入器實作韌體版本檢查、加密簽章驗證和應用程式自主測試。這些功能支援 FreeRTOS over-the-air(OTA) 韌體更新。

韌體驗證包含驗證遠端接收之新韌體的可靠性和完整性。開機載入器在啟動之前會驗證應用程式的加密簽章。示範會使用橢圓曲線數位簽章演算法 (ECDSA) 而不是 SHA-256。提供的公用程式,可用於產生可在裝置上刷新的已簽署應用程式。

開機載入器支援下列 OTA 所需的功能:

  • 在裝置上維護應用程式映像,並在其間切換。

  • 允許自主測試執行收到的 OTA 映像並在失敗時復原。

  • 檢查 OTA 更新映像的簽章和版本。

注意

若要設定和執行 FreeRTOS 示範,請遵循中的步驟FreeRTOS 入門。

開機載入器狀態

以下狀態機器中會顯示開機載入器程序。

使用通知錯誤選項啟動開機載入器狀態機器,顯示初始化、驗證、執行狀態和錯誤狀態。

下表描述開機載入器狀態。

開機載入器狀態 說明

初始化

開機載入器處於初始化狀態。

驗證

開機載入器正在驗證裝置上出現的映像。

執行映像

開機載入器正在啟動選取的映像。

執行預設

開機載入器正在啟動預設映像。

錯誤

開機載入器處於錯誤狀態。

在先前的圖表中,Execute Image 和 Execute Default 皆會顯示為 Execution 狀態。

開機載入器執行狀態

開機載入器處於 Execution 狀態,並準備好啟動所選的已驗證映像。如果要啟動的映像位於上層區塊中,則在執行映像之前會切換區塊,因為應用程式一律針對較低層區塊建置。

開機載入器預設執行狀態

如果啟用了啟動預設映像的組態選項,則開機載入器將從預設執行地址啟動應用程式。除了偵錯外,此選項必須停用。

開機載入器錯誤狀態

開機載入器處於錯誤狀態,且裝置上不存在有效映像。開機載入器必須通知使用者。預設實作會向主控台傳送日誌訊息,並無限期快速閃爍電路板上的 LED。

快閃裝置

Microchip Curiosity PIC32MZEF 平台包含 2 MB 的內部程式快閃,分為兩個區塊。此快閃支援這兩個區塊之間的記憶體映射切換與即時更新。示範開機載入器在個別的較低啟動快閃區域中設定。

記憶體配置圖顯示分別映射至開機載入器、Application Bank 0 和 Application Bank 1MB 和 2MB 區域的較高程式快閃記憶體。

應用程式映像結構

OTA 映像結構顯示標頭、描述項、應用程式二進位 (由簽署者服務簽署) 和結尾區段,其中包含魔術程式碼、序號、開始和結束地址、執行地址、硬體 ID 等欄位。

此圖顯示存放在裝置每個區塊中應用程式映像的主要元件。

元件 大小 (位元組)

映像標頭

8 位元組

映像描述項

24 位元組

應用程式二進位

< 1 MB - (324)

預告片

292 位元組

映像標頭

裝置上的應用程式映像,必須以包含神奇代碼和映像旗標的標頭做為開頭。

標頭欄位 大小 (位元組)

神奇代碼

7 位元組

映像旗標

1 位元組

神奇代碼

裝置上的映像必須以神奇代碼開頭。預設神奇代碼為 @AFRTOS。開機載入器在啟動映像之前,會檢查是否存在有效的神奇代碼。這是驗證的第一步。

映像旗標

影像旗標用於存放應用程式映像的狀態。旗標用於 OTA 程序。兩個區塊的映像旗標會判斷裝置的狀態。如果執行映像標記為遞交等待中,則表示裝置處於 OTA 自主測試階段。即使裝置上的映像標記為有效,也會在每次啟動時執行相同的驗證步驟。如果映像標記為新映像,則開機載入器會將其標記為遞交等待中,並在驗證後將其啟動以進行自主測試。開機載入器也會初始化並啟動監視程式計時器,在新的 OTA 映像未通過自主測試時,裝置會重新啟動並且開機載入器會透過清除映像來拒絕映像,並執行先前有效的映像。

裝置只能具有一個有效的映像。另一個映像可以是新的 OTA 映像,或遞交等待中 (自主測試)。OTA 更新成功之後,舊映像會從裝置中清除。

狀態 Value 說明

新映像

0xFF

應用程式映像是新的且從未執行過。

遞交等待中

0xFE

應用程式映像標示為測試執行。

有效

0xFC

應用程式映像標示為有效和已遞交。

無效

0xF8

應用程式映像標示為無效。

映像描述項

快閃裝置上的應用程式映像,必須包含映像標頭後面的映像描述項。映像描述項由建置後公用程式產生,該公用程式會使用組態檔案 (ota-descriptor.config) 來產生適當的描述項,並將其附加至應用程式二進位中。此建構後步驟的輸出是可用於 OTA 的二進位映像。

描述項欄位 大小 (位元組)

序號

4 位元組

起始地址

4 位元組

結束地址

4 位元組

執行地址

4 位元組

硬體 ID

4 位元組

已預留

4 位元組

序號

建置新 OTA 映像之前,必須遞增新序號。請參閱 ota-descriptor.config 檔案。開機載入器使用此數量來決定要啟動的映像。有效值為 1 到 4294967295。

起始地址

裝置上應用程式映像的起始地址。由於映像描項已附加至應用程式二進位,所以此地址是映像描述項的起始。

結束地址

裝置上應用程式映像的結束地址,不含映像尾部。

執行地址

映像的執行地址。

硬體 ID

開機載入器用於驗證 OTA 映像的唯一硬體 ID,針對正確的平台所建置。

已預留

已預留供日後使用。

映像尾部

映像尾部會附加至應用程式二進位。包含簽章類型字串、簽章大小和映像的簽章。

尾部欄位 大小 (位元組)

簽章類型

32 位元組

簽章大小

4 位元組

簽章

256 位元組

簽章類型

簽章類型是表示正在使用之加密演算法的字串,並用做尾部的標記。開機載入器支援橢圓曲線數位簽章演算法 (ECDSA)。預設為 sig-sha256-ecdsa。

簽章大小

加密簽章的大小 (以位元組為單位)。

簽章

以映像描述項前綴的應用程式二進位檔案加密簽章。

開機載入器組態

基本的開機載入器組態選項會在 freertos/vendors/microchip/boards/curiosity_pic32mzef/bootloader/config_files/aws_boot_config.h 中提供。某些選項僅供偵錯之用。

啟用預設啟動

允許從預設地址執行應用程式,並且必須僅針對偵錯啟用。映像會從預設地址執行,且不需任何驗證。

啟用加密簽章驗證

啟動時啟用加密簽章驗證。從裝置清除失敗的映像。此選項僅供偵錯之用,且必須在生產環境中保持啟用。

清除無效的映像

如果該區塊的映像驗證失敗,則啟用完整區塊清除。此選項供偵錯之用,且必須在生產環境中保持啟用。

啟用硬體 ID 驗證

允許驗證 OTA 映像描述項中的硬體 ID,以及在開機載入器中設定的硬體 ID。此為選用,如果不需要硬體 ID 驗證,則可以將其停用。

啟用地址驗證

允許驗證 OTA 映像描述項中的起始、結束和執行地址。建議您保持啟用此選項。

建置開機載入器

示範開機載入器會包含在 FreeRTOS 原始程式碼儲存庫中 的 專案freertos/vendors/microchip/boards/curiosity_pic32mzef/aws_demos/mplab/中,做為可載入的aws_demos專案。當 aws_demos 專案建置時,會先建置開機載入器,接著建置應用程式。最終輸出是統一的十六進位映像,包含開機載入器和應用程式。會提供 factory_image_generator.py 公用程式,以產生具有加密簽章的統一十六進位映像。開機載入器公用程式指令碼位於 freertos/demos/ota/bootloader/utility/。

開機載入器預先建置步驟

此預先建置步驟會執行稱為 codesigner_cert_utility.py 的公有程式指令碼,從程式碼簽署憑證中擷取公有金鑰,並產生包含 Abstract Syntax Notation One (ASN.1) 編碼格式公有金鑰的 C 標頭檔案。此標頭會編譯至開機載入器專案。產生的標頭包含兩個常數:公有金鑰的陣列和金鑰長度。開機載入器專案也可以在沒有 aws_demos 的情況下建置,並可以做為一般應用程式進行偵錯。