CYW20735固件升級流程和方法

本節介紹固件升級HAL模塊和固件升級OTA模塊公開的函數。開發人員可以使用本文檔中描述的OTA示例協議,並調用ota_firmware_upgrade…函數或開發完全不同的方法來交付固件鏡像到嵌入式應用程序,並直接調用wiced_firmware_upgrade_…函數。

一、固件升級庫初始化

該函數通常由OTA固件升級模塊(參見下面第六條)或應用程序在初始化期間調用,以配置串行flash節的位置和長度。
原型:

wiced_bool_t wiced_firmware_upgrade_init(wiced_fw_upgrade_nv_loc_len_t *p_sflash_nv_loc_len, uint32_t sflash_size);


參數: 
p_sflash_nv_loc_len:
連續flash中不同部分的位置和長度。位置和長度應該與構建過程中在平臺BTP文件中配置的值匹配。在固件升級過程中不可能更改這些值。這些值被傳遞到wiced_fw_upgrade_nv_loc_len_t結構中的固件升級模塊,如下所示。

typedef struct
{
 uint32_t ss_loc; // static section location 
 uint32_t ds1_loc; // ds1 location 
 uint32_t ds1_len; // ds1 length 
 uint32_t ds2_loc; // ds2 location 
 uint32_t ds2_len; // ds2 length 
 uint32_t vs1_loc; // vendor specific location 1 
 uint32_t vs1_len; // vendor specific location 1 length 
 uint32_t vs2_loc; // vendor specific location 2 
 uint32_t vs2_len; // vendor specific location 2 length 
} wiced_fw_upgrade_nv_loc_len_t;
p_sflash_size:顯示在標籤板上的串行flash大小。

返回值:如果成功驗證了位置和長度,則WICED_TRUE。如果初始化函數返回WICED_FALSE,以後啓動另一個固件升級的嘗試將失敗。在這種狀態下,編寫新版本的唯一方法是直接或通過HCI UART編寫串行flash。

二、固件升級初始化NV位置

OTA固件升級模塊或應用程序應該在固件下載過程開始時調用這個函數來設置內存連接。如果下載已啓動,但未成功完成,則應再次調用此函數。
原型:

wiced_bool_t wiced_firmware_upgrade_init_nv_locations(void);

 返回值:成功返回WICED_TRUE,失敗返回WICED_FALSE。

三、固件升級存儲數據到NV

OTA固件升級模塊或應用程序可以調用此函數將數據塊存儲到物理非易失性存儲介質。不活動的分區將被寫入。應用程序不需要知道所使用的內存類型或正在升級的分區。通常,OTA過程在從下載程序接收到下一個數據包時將調用此函數。
原型:

uint32_t wiced_firmware_upgrade_store_to_nv(uint32_t offset, uint8_t *data, uint32_t len);

參數:
offset:存儲數據的內存偏移量。
data:指向要存儲的數據塊的指針。
len:要存儲的內存塊的大小。
返回值:如果成功,則返回存儲到存儲器的字節數,否則返回爲0。

四、固件升級從NV獲取數據

OTA固件升級模塊或應用程序可以調用此函數來從物理非易失性存儲介質中檢索數據塊。不活動的分區將被讀取。應用程序不需要知道所使用的內存類型或正在升級的分區。通常,OTA過程將在驗證期間調用此函數,以驗證是否存儲了完整且正確的鏡像。
原型:

uint32_t wiced_firmware_upgrade_retrieve_from_nv(uint32_t offset, uint8_t *data, uint32_t len);

 參數:
offset:將從中檢索數據的內存偏移量。
data:指向庫將存儲檢索到的數據的位置的指針。
len:要檢索的內存塊的大小。
返回值:如果成功,則從存儲器中檢索到的字節數,否則爲0。

五、固件升級完成

下載完成並驗證之後,可以調用此函數來切換活動分區與接收新映像的分區。此函數使先前的活動分區無效,並啓動重新啓動。
原型:

void wiced_firmware_upgrade_finish(void);

六、OTA固件升級初始化

想要利用OTA固件升級模塊功能的應用程序在啓動時應調用此功能。它可以選擇註冊一個回調,在升級過程結束時,芯片重新啓動之前發出。要使用ECDSA固件驗證方法的應用程序應該爲有效的公鑰傳遞一個指針。如果應用程序使用簡單的CRC32驗證,則指向公鑰的點應該設置爲NULL。
原型:

wiced_bool_t wiced_ota_fw_upgrade_init(void *p_public_key,wiced_firmware_upgrade_pre_reboot_callback_t* p_callback);

參數:
p_public_key:如果應用程序需要ECDSA驗證,它應該將指針傳遞給存儲在映像中的公鑰。否則應用程序應該傳遞空指針。
p_callback:在升級過程結束時,在重新啓動芯片之前發出的回調,如果在重新啓動芯片之前不需要通知應用程序,則爲NULL。回調被定義爲:

typedef void wiced_firmware_upgrade_pre_reboot_callback_t(void);

七、OTA固件升級連接狀態

使用OTA固件升級模塊的應用程序在對等設備建立BLE連接或連接發生故障時調用該功能。
原型:

void wiced_ota_fw_upgrade_connection_status_event(wiced_bt_gatt_connection_status_t *p_status);

參數:
p_status:指向應用程序從堆棧接收到的已連接的BT GATT連接狀態結構的指針。

八、OTA固件升級讀處理程序

使用OTA固件升級模塊的應用程序應該調用此函數,將GATT讀請求傳遞給庫,以獲取屬於OTA升級服務的屬性。該函數返回應該傳遞迴堆棧的數據和錯誤代碼。
原型:

wiced_bt_gatt_status_t wiced_ota_fw_upgrade_read_handler(uint16_t conn_id, wiced_bt_gatt_read_t *p_read_data);

參數:
conn_id:GATT connection ID.
p_read_data :
指向應用程序從堆棧接收到的GATT讀結構的指針。
返回值:GATT讀操作的現狀

九、OTA固件升級寫處理程序

使用OTA固件升級模塊的應用程序應該調用此函數,將GATT針對屬於OTA升級服務的屬性的寫請求傳遞給庫。如果應用程序使用ECDSA驗證方法,則不應調用此函數。
原型:

wiced_bt_gatt_status_t wiced_ota_fw_upgrade_write_handler(uint16_t conn_id, wiced_bt_gatt_write_t *p_write_data);

參數:
conn_id GATT connection ID.
p_write_data:
指向應用程序從堆棧接收到的GATT寫結構的指針。
返回值:GATT寫操作的狀態。

十、OTA固件升級指示確認

使用OTA固件升級模塊的應用程序應該調用此函數來傳遞GATT指示,以向庫確認屬於OTA升級服務的屬性請求。
原型:

wiced_bt_gatt_status_t wiced_ota_fw_upgrade_indication_cfm_handler(uint16_t conn_id, uint16_t handle);

參數:
conn_id:GATT connection ID.
handle:
表示已接收到確認消息的屬性句柄。
返回值:GATT顯示狀態確認操作。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

發佈了91 篇原創文章 · 獲贊 174 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章