Realtek/inc/platform/dfu_flash.h

200 lines
5.8 KiB
C
Raw Normal View History

2025-11-25 10:21:47 +08:00
#ifndef DFU_FLASH_H
#define DFU_FLASH_H
#include <stdint.h>
#include <stdbool.h>
#include "patch_header_check.h"
#include "dfu_api.h"
/** @defgroup DFU_API DFU API Sets
* @brief API sets for device firmware update implementation
* @{
*/
/*******************************OTA ERROR CODE********************/
#define DFU_UPDATE_SUCCESS 0x0
#define DFU_UPDATE_ERROR_LEN_NOT_ALIGN 0x1
#define DFU_UPDATE_ERROR_EMPTY_BUFFER 0x2
#define DFU_UPDATE_ERROR_BASE_ADDR_INVALID 0x3
#define DFU_UPDATE_ERROR_IMAGE_SIZE_TOO_LARGE 0x4
#define DFU_UPDATE_ERROR_PACKET_SIZE_TOO_LARGE 0x5
#define DFU_UPDATE_ERROR_FLASH_ERASE_LEN_NOT_ALIGN 0x6
#define DFU_UPDATE_ERROR_FLASH_ERASE_FAIL 0x7
#define DFU_UPDATE_ERROR_FLASH_WRITE_FAIL 0x8
#define DFU_UPDATE_ERROR_FLASH_READBACK_FAIL 0x9
#define DFU_UPDATE_ERROR_FLASH_READBACK_MISMATCH 0xa
#define DFU_CHECKSUM_SUCCESS 0x0
#define DFU_CHECKSUM_ERROR_BASE_ADDR_INVALID 0x1
#define DFU_CHECKSUM_ERROR_IMAGE_TYPE_INVALID 0x2
#define DFU_CHECKSUM_ERROR_CHECK_FAIL 0x3
/*============================================================================*
* Types
*============================================================================*/
/** @defgroup DFU_API_Exported_Types DFU API Sets Exported Types
* @brief
* @{
*/
typedef enum
{
DFU_START = 0,
DFU_DOING,
DFU_END,
} T_DFU_STATUS;
typedef union
{
T_IMG_CTRL_HEADER_FORMAT *p_header; //for DFU_START
uint32_t dfu_length; //for DFU_DOING
bool image_check_result; //for DFU_END
} T_DFU_DATA;
typedef void (*P_FUNC_DFU_STATUS_CB)(T_DFU_STATUS status, T_DFU_DATA data);
/**
* @}
*/
/*============================================================================*
* Variables
*============================================================================*/
/** @defgroup DFU_API_Exported_Functions DFU API Sets Exported Variables
* @brief
* @{
*/
/**
* @}
*/
/*============================================================================*
* Functions
*============================================================================*/
/** @defgroup DFU_API_Exported_Functions DFU API Sets Exported Functions
* @{
*/
/**
* @brief check whether in OTA mode.
*/
bool dfu_check_ota_mode_flag(void);
/**
* @brief set aon reg value means whether in OTA mode or not.
*/
void dfu_set_ota_mode_flag(bool enable);
/**
* @brief switch to the OTA mode, if support normal ota app need call it.
*/
void dfu_switch_to_ota_mode(void);
/**
* @brief OTA procedure do wdg system reset.
* @param is_active_fw true means dfu success! otherwise fail.
*/
void dfu_fw_reboot(bool is_active_fw);
/**
* @brief OTA image default ecb mode aes decrypt, last less then 16bytes no encrypted.
*/
void dfu_hw_aes_decrypt_image(uint8_t *input, uint8_t *output, uint32_t length);
/**
* @brief report specified target ic type.
* @param image_id image_id to identify FW.
* @param p_ic_type To store ic type.
* @return 0 if report ic type info successfully, error line number otherwise
*/
uint32_t dfu_report_target_ic_type(uint16_t image_id, uint8_t *p_ic_type);
/**
* @brief report specified FW info and current OTA offset.
* @param image_id image_id to identify FW.
* @param p_origin_fw_version To store current FW version.
* @param p_offset To store current file offset.
* @return 0 if report FW info successfully, error line number otherwise
*/
uint32_t dfu_report_target_fw_info(uint16_t image_id, uint32_t *p_origin_fw_version,
uint32_t *p_offset);
/**
* @brief calculate checksum of lenth of buffer in flash.
* @param image_id image_id to identify FW.
* @param offset offset of the image.
* @param length length of data.
* @param crc_val ret crc value point.
* @return 0 if buffer checksum calcs successfully, error line number otherwise
*/
uint32_t dfu_check_buf_crc(uint8_t *buf, uint32_t length, uint16_t crc_val);
/**
* @brief unlock flash is need when erase or write flash.
*/
bool unlock_flash_bp_all(void);
/**
* @brief lock flash after erase or write flash.
*/
void lock_flash_bp(void);
/**
* @brief erase a sector of the flash, will retry three times at most
* @param image_id image_id to identify FW.
* @param offset offset of the image.
* @return 0 if erase successfully, error line number otherwise,
*/
uint32_t dfu_flash_erase_sector_with_retry(uint16_t image_id, uint32_t offset);
/**
* @brief write specified image data with specified length to flash
* @param image_id image_id to identify FW.
* @param offset offset of the image.
* @param length length of data.
* @param p_void pointer to data.
* @return 0 if write FW image successfully, error line number otherwise
*/
uint32_t dfu_update(uint16_t image_id, uint32_t offset, uint32_t length,
uint32_t *p_void, bool is_new_image);
/**
* @brief calculate checksum of the image and compare with given checksum value.
* @param image_id image_id to identify image.
* @return true if the image integrity check passes, false otherwise
*/
bool dfu_check_checksum(uint16_t image_id, uint32_t offset);
void dfu_set_image_ready(T_IMG_CTRL_HEADER_FORMAT *p_header);
/**
* @brief copy appdata from active bank to updating bank.
* @param image_id image_id to identify image.
* @param dlAddress address the img copy to.
* @param dlSize copy size.
* @return true if the image copied success, false otherwise
*/
bool dfu_copy_img(uint16_t image_id, uint32_t dlAddress, uint32_t dlSize);
/**
* @}
*/
/**
* @}
*/
#endif //DFU_FLASH_H