#ifndef __FIRMWARE_MANAGE_H__ #define __FIRMWARE_MANAGE_H__ #include "bsp_common.h" #include "utils.h" /* upk: upgrade Package */ #define UPK_LEAST_HANDLE_BYTE 4096 #define UPK_VERSION_SIZE 16 #define UPK_USER_STRING_SIZE 16 #define UPK_PART_NAME_SIZE 16 #define UPK_HEAD_SIZE sizeof(struct upk_head_t) #define UPK_IDENTIFIER 0x006B7075 // 'upk' /* 固件写入的方向 */ typedef enum { FM_DIR_HOST_TO_APP = 0x00, /* 从主机方向将固件写入 APP 分区 */ FM_DIR_HOST_TO_DOWNLOAD, /* 从主机方向将固件写入 download/factory 分区 */ FM_DIR_DOWNLOAD_TO_APP, /* 从 download/factory 分区方向将固件写入 APP 分区 */ } FM_FIRMWARE_WRITE_DIR; #pragma pack(1) /* upk 固件表头的内容详见《upk固件包表头信息.xlsx》 */ struct upk_head_t { char name[4]; /* upk 文件标识 */ uint8_t config[4]; /* 配置选项 */ char fw_old_ver[UPK_VERSION_SIZE]; /* 固件旧版本 */ char fw_new_ver[UPK_VERSION_SIZE]; /* 固件新版本 */ char user_string[UPK_USER_STRING_SIZE]; /* 用户自定义的字符水印 */ char part_name[UPK_PART_NAME_SIZE]; /* 固件包存放的分区名 */ uint32_t raw_size; /* 源固件的大小,不包含本表头 */ uint32_t pkg_size; /* 打包后固件的大小,不包含本表头 */ uint32_t timestamp; /* 打包时的 unix 时间戳,可转换为年月日时分秒信息 */ uint32_t raw_crc; /* 源固件的 CRC32 值 */ uint32_t pkg_crc; /* 打包后固件的 CRC32 值 */ uint32_t head_crc; /* 本表头的 CRC32 值 */ }; #pragma pack() void FM_Init (void); uint8_t FM_IsEncrypt (void); eErrCode FM_IsEmpty (const char *part_name); char * FM_GetNewFirmwareVersion (void); uint32_t FM_GetRawCRC32 (void); eErrCode FM_StorageFirmwareHead (const char *part_name, uint8_t *data); eErrCode FM_VerifyFirmware (const char *part_name, uint32_t crc32, uint8_t is_auto_fill); eErrCode FM_EraseFirmware (const char *part_name); eErrCode FM_WriteFirmwareDone (const char *part_name); eErrCode FM_WriteFirmwareSubPackage (const char *part_name, uint8_t *data, uint16_t pkg_size); eErrCode FM_CheckFirmwareIntegrity (uint32_t addr); #if (CONFIG_CHIP_PARTS > USE_SINGLE_PARTITION) uint8_t FM_IsNeedAutoUpdate (void); char * FM_GetPartName (void); char * FM_GetOldFirmwareVersion (void); uint32_t FM_GetPackageCRC32 (void); eErrCode FM_ReadFirmwareHead (const char *part_name); eErrCode FM_UpdateToAPP (const char *from_part_name); #if (CONFIG_AUTO_UPDATE_MODE == MODE_UPDATE_DOWNLOAD_HEAD || \ CONFIG_AUTO_UPDATE_MODE == MODE_APPEND_TO_APP) eErrCode FM_UpdateFirmwareVersion (const char *part_name); #endif #endif #endif