Kinio 回報問題 登入

OTA 與韌體格式

讀完你會知道:韌體包(SWFW v2)的格式、平台怎麼決定給哪台設備哪一版、開發機怎麼推。

韌體包的格式

Kinio 的韌體包是 SWFW v2:固定長度的表頭、若干個部件、一段簽章,整包 4 KB 對齊。

表頭裡有幾個欄位是硬性的:

欄位意義
product機種。這是最重要的一欄,不符一律不給、不下載、不燒
version韌體版本
hw_version硬體版本
min_fw_version最低可升版本(跨版升級的護欄)
flagscritical(不可略過)、no_downgrade(禁止降版)等

部件可以是 MTD 分區映像、檔案、子包或純資料。簽章用 ECDSA P-256,簽的是從第 0 byte 到簽章區之前的全部內容。

機種是硬閘門,六道都比對

從上傳到燒錄,平台與設備在六個點比對同一件事:這包韌體的 product 是不是這台設備的機種。

  1. 上傳時:表頭的 product 必須等於你登記的機種,否則拒收。
  2. 建立發佈時:發佈綁定機種。
  3. 決策時:只有機種、硬體版本都對、且不違反降版規則的設備才會收到。
  4. 下載連結:連結綁定這一次任務、這台設備、這個機種與版本,換一台就用不了。
  5. 供應時:再比對一次才給檔案。
  6. 設備端:先看表頭的 product,不對就不下載;下載後驗整包雜湊、驗簽章、再驗每個部件的雜湊。

這六道是分開的,任何一道不過就停。設備端那一道不能省 —— 它是最後一道防線。

發佈流程

上傳韌體包  →  建立發佈  →  設定對象  →  啟用(灰度)
  • 上傳:平台驗表頭與部件雜湊。沒簽章的話可以由平台代簽(開發階段方便);已經簽過的只認平台信任的金鑰。
  • 發佈:同一個機種、硬體版本、通道,同時只有一個「啟用中」的發佈。
  • 對象:可以指定白名單、排除名單,或設定灰度比例。
  • 灰度:比例是用發佈 id 與 AID 算出來的穩定雜湊,同一台設備不會今天在圈內明天在圈外。

發佈可以暫停與下架。已經在下載中的不會被中斷,但新的設備不會再拿到。

設備端要做的事

  1. 收到 ota_start 指令,裡面有任務 id、版本、機種、下載網址、雜湊與大小。
  2. 先比對機種,不符就直接回報失敗,不要下載。
  3. 下載,驗整包雜湊,驗表頭與簽章,驗每個部件。
  4. 寫入,設好 A/B 或回滾標記。
  5. 重開機,用新版本重新連線。
  6. 回報新的韌體版本,並送 ota.success 事件。

過程中要送 ota.progress,失敗要送 ota.failed 並說明原因。

防磚的三條規則

  1. 看門狗要在寫入前就開著,寫入卡住要能自己重開。
  2. 記憶體不夠就不要開始。低記憶體時先暫停其他工作,寧可這輪不升級。
  3. 能回滾。新版本開機後沒有在時限內回報成功,就自動回舊版。

舊設備怎麼更新

v1/v2、v3 與其他品牌原廠設備的韌體包會原樣放進 SWFW 的一個部件裡。平台驗完外層之後剝掉外殼,用各家原本的協定把內層包發下去。對這些設備來說,更新流程和以前一樣,但走的是同一套發佈與灰度機制。