

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

# Microchip Curiosity PIC32MZEF 的示範開機載入器
<a name="microchip-bootloader"></a>

**重要**  <a name="deprecation-message-demo"></a>
此示範託管在已棄用的 Amazon-FreeRTOS 儲存庫上。我們建議您在建立新專案時從[這裡開始](freertos-getting-started-modular.md)。如果您已經有以現在已棄用 Amazon-FreeRTOS 儲存庫為基礎的現有 FreeRTOS 專案，請參閱 [Amazon-FreeRTOS Github 儲存庫遷移指南](github-repo-migration.md)。 FreeRTOS 

**注意**  
為與 Microchip 達成一致，我們將從 FreeRTOS 參考整合儲存庫主分支移除 Curiosity PIC32MZEF (DM320104)，並且不會再將其帶入新版本。Microchip 已發出[正式通知](https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/DM320104)，表示不再建議將 PIC32MZEF (DM320104) 用於新設計。PIC32MZEF 專案和原始程式碼仍然可以透過先前的版本標籤存取。Microchip 建議客戶使用 Curiosity [ PIC32MZ-EF-2.0 開發板 (DM320209)](https://devices.amazonaws.com/detail/a3G0h0000077I69EAE/Curiosity-PIC32MZ-EF-2-0-Development-Board) 進行新設計。PIC32MZv1 平台仍可在 FreeRTOS 參考整合儲存庫的 [v202012.00](https://github.com/aws/amazon-freertos/tree/202012.00) 中找到。不過，FreeRTOS 參考的 [v202107.00](https://github.com/aws/amazon-freertos/tree/202107.00) 不再支援平台。

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

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

開機載入器支援下列 OTA 所需的功能：
+ 在裝置上維護應用程式映像，並在其間切換。
+ 允許自主測試執行收到的 OTA 映像並在失敗時復原。
+ 檢查 OTA 更新映像的簽章和版本。

**注意**  
若要設定和執行 FreeRTOS 示範，請遵循中的步驟[FreeRTOS 入門](freertos-getting-started.md)。

## 開機載入器狀態
<a name="bootloader-states"></a>

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

![\[使用通知錯誤選項啟動引導載入器狀態機器，顯示初始化、驗證、執行狀態和錯誤狀態。\]](http://docs.aws.amazon.com/zh_tw/freertos/latest/userguide/images/bootloader-states.png)


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


| 開機載入器狀態 | 描述 | 
| --- | --- | 
|  初始化  |  開機載入器處於初始化狀態。  | 
|  驗證  |  開機載入器正在驗證裝置上出現的映像。  | 
|  執行映像  |  開機載入器正在啟動選取的映像。  | 
|  執行預設  |  開機載入器正在啟動預設映像。  | 
|  錯誤  |  開機載入器處於錯誤狀態。  | 

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

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

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

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

## 快閃裝置
<a name="flash-device"></a>

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

![\[記憶體配置圖顯示分別映射至開機載入器、Application Bank 0 和 Application Bank 1 的較低開機快閃記憶體、較低程式快閃記憶體 1MB 和 2MB 區域的較高程式快閃記憶體。\]](http://docs.aws.amazon.com/zh_tw/freertos/latest/userguide/images/flash-device.png)


## 應用程式映像結構
<a name="application-image-structure"></a>

![\[OTA 映像結構會顯示標頭、描述符、應用程式二進位 （由簽署者服務簽署） 和結尾區段，其中包含魔術程式碼、序號、開始和結束地址、執行地址、硬體 ID 等欄位。\]](http://docs.aws.amazon.com/zh_tw/freertos/latest/userguide/images/application-image-structure.png)


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


| 元件 | 大小 (位元組) | 
| --- | --- | 
|  映像標頭  |  8 位元組  | 
|  映像描述項  |  24 位元組  | 
|  應用程式二進位  |   < 1 MB - (324)  | 
|  預告片  |  292 位元組  | 

## 映像標頭
<a name="image-header"></a>

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


| 標頭欄位 | 大小 (位元組) | 
| --- | --- | 
|  神奇代碼  |  7 位元組  | 
|  映像旗標  |  1 位元組  | 

### 神奇代碼
<a name="magic-code"></a>

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

### 映像旗標
<a name="image-flags"></a>

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

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


| Status | Value | 描述 | 
| --- | --- | --- | 
|  新映像  |  0xFF  |  應用程式映像是新的且從未執行過。  | 
|  遞交等待中  |  0xFE  |  應用程式映像標示為測試執行。  | 
|  有效  |  0xFC  |  應用程式映像標示為有效和已遞交。  | 
|  無效  |  0xF8  |  應用程式映像標示為無效。  | 

## 映像描述項
<a name="image-descriptor"></a>

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


| 描述項欄位 | 大小 (位元組) | 
| --- | --- | 
|  序號  |  4 位元組  | 
|  起始地址  |  4 位元組  | 
|  結束地址  |  4 位元組  | 
|  執行地址  |  4 位元組  | 
|  硬體 ID  |  4 位元組  | 
|  已預留  |  4 位元組  | 

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

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

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

**執行地址**  
映像的執行地址。

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

**已預留**  
已預留供日後使用。

## 映像尾部
<a name="image-trailer"></a>

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


| 尾部欄位 | 大小 (位元組) | 
| --- | --- | 
|  簽章類型  |  32 位元組  | 
|  簽章大小  |  4 位元組  | 
|  簽章  |  256 位元組  | 

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

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

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

## 開機載入器組態
<a name="bootloader-configuration"></a>

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

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

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

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

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

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

## 建置開機載入器
<a name="building-bootloader"></a>

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

### 開機載入器預先建置步驟
<a name="bootloader-pre-build"></a>

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