/***************************************************************************** * @file OTAUpgrade.h * @brief 4G OTA固件升级模块 - 通过HTTP下载加密固件、解密并校验 * @author AI Assistant * @date 2025-12-20 * * @details 功能说明: * 1. 通过4G模块HTTP下载加密固件到Flash加密区 * 2. 支持断点续传(使用HTTPClient Range功能) * 3. 下载完成后调用AES-256-CBC解密算法解密固件 * 4. 解密后进行校验和验证确保固件完整性 * * Flash分区: * - 加密固件区: 0x08100000 - 0x0813FFFF (256KB, Bank2 Sector0-1) * - 解密固件区: 0x08140000 - 0x0817FFFF (256KB, Bank2 Sector2-3) *****************************************************************************/ #ifndef __OTA_UPGRADE_H__ #define __OTA_UPGRADE_H__ #include "HIDO_TypeDef.h" #ifdef __cplusplus extern "C" { #endif /***************************************************************************** * Flash分区地址定义 *****************************************************************************/ // 加密固件存储区(Bank2 Sector0-1) #define OTA_ENCRYPTED_FLASH_ADDR 0x08100000U #define OTA_ENCRYPTED_FLASH_SIZE (256 * 1024) // 256KB // 解密固件存储区(Bank2 Sector2-3) #define OTA_DECRYPTED_FLASH_ADDR 0x08140000U #define OTA_DECRYPTED_FLASH_SIZE (256 * 1024) // 256KB /***************************************************************************** * OTA升级状态定义 *****************************************************************************/ typedef enum { OTA_STATE_IDLE = 0, // 空闲状态 OTA_STATE_DOWNLOADING, // 正在下载加密固件 OTA_STATE_DOWNLOAD_COMPLETE, // 下载完成 OTA_STATE_DOWNLOAD_FAILED, // 下载失败 OTA_STATE_DECRYPTING, // 正在解密 OTA_STATE_DECRYPT_COMPLETE, // 解密完成 OTA_STATE_DECRYPT_FAILED, // 解密失败 OTA_STATE_VERIFYING, // 正在校验 OTA_STATE_VERIFY_SUCCESS, // 校验成功 OTA_STATE_VERIFY_FAILED, // 校验失败 } E_OTAState; /***************************************************************************** * OTA升级错误码 *****************************************************************************/ typedef enum { OTA_ERR_NONE = 0, // 无错误 OTA_ERR_BUSY, // OTA正忙 OTA_ERR_INVALID_PARAM, // 无效参数 OTA_ERR_NO_NETWORK, // 网络未就绪 OTA_ERR_HTTP_FAILED, // HTTP请求失败 OTA_ERR_FLASH_ERASE_FAILED, // Flash擦除失败 OTA_ERR_FLASH_WRITE_FAILED, // Flash写入失败 OTA_ERR_FILE_TOO_LARGE, // 文件超过256KB OTA_ERR_DECRYPT_FAILED, // 解密失败 OTA_ERR_CHECKSUM_MISMATCH, // 校验和不匹配 } E_OTAError; /***************************************************************************** * OTA升级信息结构体 *****************************************************************************/ typedef struct { E_OTAState eState; // 当前状态 E_OTAError eLastError; // 最后错误码 HIDO_UINT32 u32TotalSize; // 固件总大小(字节) HIDO_UINT32 u32DownloadedSize; // 已下载大小(字节) HIDO_UINT32 u32DecryptedSize; // 已解密大小(字节) HIDO_UINT8 u8Progress; // 进度百分比 (0-100) HIDO_CHAR acETag[64]; // HTTP ETag,用于断点续传验证 } ST_OTAInfo; /***************************************************************************** * 对外接口函数 *****************************************************************************/ /** * @brief 初始化OTA升级模块 * @return HIDO_OK: 成功, HIDO_ERR: 失败 */ HIDO_INT32 OTA_Init(HIDO_VOID); /** * @brief 启动OTA固件下载 * @param _pcUrl: 固件下载URL(例如: "http://123.57.87.125:7001/hfs/STM32H743.Bin") * @return HIDO_OK: 启动成功, 其他: 错误码 * @note 下载将自动写入加密固件区,支持断点续传 */ HIDO_INT32 OTA_StartDownload(const HIDO_CHAR *_pcUrl); /** * @brief 启动固件解密 * @return HIDO_OK: 启动成功, 其他: 错误码 * @note 从加密区读取数据,使用AES-256-CBC解密后写入解密区 */ HIDO_INT32 OTA_StartDecrypt(HIDO_VOID); /** * @brief 启动固件校验 * @return HIDO_OK: 校验成功, 其他: 错误码 * @note 读取固件末尾4字节校验和,计算并对比验证 */ HIDO_INT32 OTA_VerifyFirmware(HIDO_VOID); /** * @brief 获取OTA升级信息 * @param _pstInfo: 返回的信息结构体指针 * @return HIDO_OK: 成功, HIDO_ERR: 失败 */ HIDO_INT32 OTA_GetInfo(ST_OTAInfo *_pstInfo); /** * @brief 获取当前OTA状态 * @return 当前状态枚举值 */ E_OTAState OTA_GetState(HIDO_VOID); /** * @brief 获取下载进度百分比 * @return 进度 0-100 */ HIDO_UINT8 OTA_GetProgress(HIDO_VOID); /** * @brief 取消当前OTA操作 * @return HIDO_OK: 成功, HIDO_ERR: 失败 */ HIDO_INT32 OTA_Cancel(HIDO_VOID); /** * @brief 重置OTA模块到空闲状态 * @note 清除所有状态和进度信息 */ HIDO_VOID OTA_Reset(HIDO_VOID); /** * @brief OTA模块周期性任务 * @note 需要在主循环中周期调用,处理解密和校验等耗时任务 */ HIDO_VOID OTA_Poll(HIDO_VOID); #ifdef __cplusplus } #endif #endif /* __OTA_UPGRADE_H__ */