本文由嵌入式企鵝圈原創團隊成員黃鑫原創。
相比NRF52832和CC254X,藍牙單芯片DA14580在OTA和二次引導上要複雜一些,不僅體現在memory map、引導過程等流程上,而且在固件格式、生成和工具鏈的操作上也稍顯繁瑣。之前分享的“固件空中升級(OTA)與固件二次引導的原理和設計”說明了DA14580 OTA的原理和過程,本節我們來看看升級過程中涉及的固件相關的知識。
一、DA14580固件分佈
這裏主要說明的是,sdk編譯鏈接產生的固件都是hex格式的,能夠直接通過JLINK下載到RAM執行,但是通過官方的smartsnippets工具下載到flash時是需要增加固件頭部信息,否則會引導失敗。
以下是針對flash存儲的固件分佈,可以看出包括:bootloader、image1、image2和OTA固件分佈信息product header。而bootloader、image1、image2也分別包括一個頭部和相應的固件程序。
二、固件頭部格式
DA14580內置ROM啓動,其只會引導並運行位於存儲起始區域(0地址)的bootloader程序。
Bootloader頭部以0x7050開頭,頭部內容包括Bootloader的長度;
代表應用的image的頭部以0x7051開頭,頭部內容包括image的長度和固件版本;
代表OTA固件分佈信息product header以0x7052開頭,頭部內容包括image1的文件偏移和image2的文件偏移以及產品版本信息。
也就是說,如果最終產品沒有OTA功能,那就只需要一個應用的固件,燒寫到bootloader所在的地方即可,當然頭部也是必不可少的。
三、工具鏈
官方的smartsnippets工具在燒寫固件時只會自動添加0x7050開頭的頭部,也可以在該工具上構建product header進行燒寫。但對於代表應用的image是需要專門的工具鏈生成的。
1. Smartsnippets燒寫bootloader
選擇HEX格式的bootloader,燒寫offset偏移是0,擦除erase接着燒寫burn,選擇“YES”,燒寫成功後可以看出flash的固件增加了一個0x7050開始的頭部。
2. Smartsnippets燒寫product header
3. 官方提供的mkimage工具生成應用image
先生成bin:hex2bin -e bin app.hex
製作image:mkimage single app.binble_580_sw_version.h app.img
Smartsnippets燒寫image,選擇對應的偏移,燒寫時選擇“NO”。因爲固件已經有頭部信息,不能再增加引導的頭部信息。
關注微信公衆號:嵌入式企鵝圈,獲得上百篇物聯網原創技術分享!