> For the complete documentation index, see [llms.txt](https://cavedu.gitbook.io/linkit-7697/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cavedu.gitbook.io/linkit-7697/linkit-7697-arduinoide/kai-fa-zhi-nan/fota-geng-xin.md).

# FOTA 更新

**FOTA** 是 Firmware Over the Air 的縮寫，意指可用 Wi-Fi 透過無線方式更新開發板上的韌體。

LinkIt 7697 提供了 **LHTTPUpdate** 函式庫，讓開發者可從給定的 **HTTP** URL 下載並燒錄更新 LinkIt 7697 的 sketch 應用程式，達成 FOTA 無線更新應用程式的功能。&#x20;

### 範例 <a href="#fotaupdate-fan-li" id="fotaupdate-fan-li"></a>

* 將 LinkIt 7697 Arduino BSP 更新至 **v0.10.5** 或更新的版本。
* 在 **Tools > Board** 選單中選擇 **LinkIt 7697**。
* 開啟 **Examples > LHTTPUpdate > LHTTPUpdate** 範例。
* 依照使用的 Wi-Fi AP 組態，更新程式碼中的 **ssid** 與 **pass** 資訊：

  ```
  char ssid[] = "yourapssid";      // your WPA2 network SSID (AP name)
  char pass[] = "yourpassword";    // your WPA2 network password
  ```
* 點選 **Upload** 按鈕將 sketch 上傳至 LinkIt 7697。
* 上傳完成後，開啟 **Serial Monitor** (baudrate 為 9600)。
* 會看到下列的系統訊息：

  ```
  HTTPUpdate example begins.
  Attempting to connect to SSID: yourssid
  Connected to wifi
  Begin downloading new firmware
  Press RST key to reboot to updated firmware version.
  After reboot, it may take a while to update the firmware.
  The USR LED lights up during the update process.
  ```

  這表示系統已從 <http://download.labs.mediatek.com/resource/fota_example.bin> 將範例 **FOTA binary** 的 bin 檔下載至 LinkIt 7697。
* 此時按下 **RST** 按鈕，系統即會重新開機，並將剛剛下載的 FOTA binary 程式 (fota\_example.bin) 燒錄至 LinkIt 7697 以取代原本的 sketch。
* 約經過三秒鐘燒錄時間後，會看見開發板橘色 LED 閃爍，表示板上的 sketch 已完成替換為新的 "blinking" sketch。&#x20;

### 運作機制 <a href="#fotaupdate-yun-zuo-ji-zhi" id="fotaupdate-yun-zuo-ji-zhi"></a>

範例程式碼透過呼叫下列 API，從 <http://download.labs.mediatek.com/resource/fota_example.bin> 下載 **FOTA binary** 的 bin 檔，並將之燒錄至 flash：

```
fotaUpdater.update(fotaBinaryURL);
```

**FOTA binary** 是經過前處理的 sketch bin 檔，為一種經過壓縮並帶有 checksum 資訊的檔案格式，以確保韌體更新過程中發生的錯誤可被即時偵測。

執行 **update()** 函式時，FOTA binary 會先被寫入至 flash 的 **FOTA** 區間。整個 flash 的區間劃分如下：

![](/files/xBPQoRQ4dLGWYaAewixZ)

完成寫入 **FOTA** **binary** 至 FOTA 區間後，**update()** 函式會將 **FOTA** 區間標示為等待被更新的狀態。

接著系統重新開機，**bootloader** 偵測到 FOTA 區間有新韌體等待被更新時，即會將之解壓縮並檢查 checksum，一切無誤的話便把新韌體燒錄至 **CM4 firmware** 的區間：

![](/files/BPqYPH07FSK705Ei0nUn)

CM4 firmware 區間燒錄完成後即完成 sketch 應用程式更新，結束整個 FOTA 處理程序。

### 如何生成 FOTA Binary <a href="#fotaupdate-ru-he-sheng-cheng-fotabinary" id="fotaupdate-ru-he-sheng-cheng-fotabinary"></a>

前文提到 **FOTA binary** 是經過前處理的 sketch bin 檔，以下將說明如何將正常的 sketch binary 檔轉換為 FOTA binary：

* 從 <https://docs.labs.mediatek.com/resource/mt7687-mt7697/zh_tw/downloads> 下載 **FOTA ROM Package** 工具。
* 針對要轉換的 Arduino sketch，在 Arduino IDE 選單中選取 **Sketch > Export Compiled Binary** 產生該 sketch 的 binary 檔案。
* 依照 **FOTA ROM Package** 的說明進行相關設定與轉換。以下將示範在 Windows 下的轉換方法：

#### Windows 版的 FOTA ROM Package 工具 <a href="#fotaupdatewindows-ban-de-fotarompackage-gong-ju" id="fotaupdatewindows-ban-de-fotarompackage-gong-ju"></a>

假設 FOTA ROM Package 的根目錄在 **$FOTA\_ROOT**：

* 將 **$FOTA\_ROOT\\\_ini\template\mt7697\FOTARomPacker.ini** 檔案拷貝至 **$FOTA\_ROOT\\\_ini** 目錄。
* 開啟 **$FOTA\_ROOT\\\_ini\FOTARomPacker.ini** 如下：

  ```
  [General Setting]
  Base_Directory=.\_Load\mt7697

  [CM4 bin]
  File=fota_example.bin
  Start_Address=0x79000
  Partition_Size=0x1ED000
  Is_Compressed=true
  ```

  修改 **File** 欄位的內容，填入之前從 Arduino IDE 輸出的 sketch binary 檔的路徑。&#x20;

{% hint style="danger" %}
請**勿**修改 **Start\_Address**、**Partiion\_Size**、和 **Is\_Compressed** 欄位，這幾個值需固定與 LinkIt 7697 flash 分區資訊一致。
{% endhint %}

* 將 sketch binary 拷貝至 **$FOTA\_ROOT\\\_Load\mt7697**。
* 執行 **gen\_image.bat** 批次檔。
* 產生的 FOTA binary 會放在 **\_Output** 目錄。

取得 FOTA binary 後，開發者即可將之放在 HTTP 伺服器上，透過在 sketch 中使用 **LHTTPUpdate.update()** 函式呼叫，下載並燒錄該 FOTA binary 至開發板。
