OTA 與韌體格式
讀完你會知道:韌體包(SWFW v2)的格式、平台怎麼決定給哪台設備哪一版、開發機怎麼推。
韌體包的格式
Kinio 的韌體包是 SWFW v2:固定長度的表頭、若干個部件、一段簽章,整包 4 KB 對齊。
表頭裡有幾個欄位是硬性的:
| 欄位 | 意義 |
|---|---|
product | 機種。這是最重要的一欄,不符一律不給、不下載、不燒 |
version | 韌體版本 |
hw_version | 硬體版本 |
min_fw_version | 最低可升版本(跨版升級的護欄) |
| flags | critical(不可略過)、no_downgrade(禁止降版)等 |
部件可以是 MTD 分區映像、檔案、子包或純資料。簽章用 ECDSA P-256,簽的是從第 0 byte 到簽章區之前的全部內容。
機種是硬閘門,六道都比對
從上傳到燒錄,平台與設備在六個點比對同一件事:這包韌體的 product 是不是這台設備的機種。
- 上傳時:表頭的
product必須等於你登記的機種,否則拒收。 - 建立發佈時:發佈綁定機種。
- 決策時:只有機種、硬體版本都對、且不違反降版規則的設備才會收到。
- 下載連結:連結綁定這一次任務、這台設備、這個機種與版本,換一台就用不了。
- 供應時:再比對一次才給檔案。
- 設備端:先看表頭的
product,不對就不下載;下載後驗整包雜湊、驗簽章、再驗每個部件的雜湊。
這六道是分開的,任何一道不過就停。設備端那一道不能省 —— 它是最後一道防線。
發佈流程
上傳韌體包 → 建立發佈 → 設定對象 → 啟用(灰度)
- 上傳:平台驗表頭與部件雜湊。沒簽章的話可以由平台代簽(開發階段方便);已經簽過的只認平台信任的金鑰。
- 發佈:同一個機種、硬體版本、通道,同時只有一個「啟用中」的發佈。
- 對象:可以指定白名單、排除名單,或設定灰度比例。
- 灰度:比例是用發佈 id 與 AID 算出來的穩定雜湊,同一台設備不會今天在圈內明天在圈外。
發佈可以暫停與下架。已經在下載中的不會被中斷,但新的設備不會再拿到。
設備端要做的事
- 收到
ota_start指令,裡面有任務 id、版本、機種、下載網址、雜湊與大小。 - 先比對機種,不符就直接回報失敗,不要下載。
- 下載,驗整包雜湊,驗表頭與簽章,驗每個部件。
- 寫入,設好 A/B 或回滾標記。
- 重開機,用新版本重新連線。
- 回報新的韌體版本,並送
ota.success事件。
過程中要送 ota.progress,失敗要送 ota.failed 並說明原因。
防磚的三條規則
- 看門狗要在寫入前就開著,寫入卡住要能自己重開。
- 記憶體不夠就不要開始。低記憶體時先暫停其他工作,寧可這輪不升級。
- 能回滾。新版本開機後沒有在時限內回報成功,就自動回舊版。
舊設備怎麼更新
v1/v2、v3 與其他品牌原廠設備的韌體包會原樣放進 SWFW 的一個部件裡。平台驗完外層之後剝掉外殼,用各家原本的協定把內層包發下去。對這些設備來說,更新流程和以前一樣,但走的是同一套發佈與灰度機制。