W801_SDK_dev_env/include/platform/wm_fwup.h
2022-11-01 18:22:10 +01:00

359 lines
9.6 KiB
C

/**
* @file wm_fwup.h
*
* @brief Firmware upgrade
*
* @author winnermicro
*
* Copyright (c) 2015 Winner Microelectronics Co., Ltd.
*/
#ifndef WM_FWUP_H
#define WM_FWUP_H
#include "wm_osal.h"
#include "list.h"
/** firmware update status */
#define TLS_FWUP_STATUS_OK (0)
#define TLS_FWUP_STATUS_EINVALID (1)
#define TLS_FWUP_STATUS_EMEM (2)
#define TLS_FWUP_STATUS_EPERM (3)
#define TLS_FWUP_STATUS_EBUSY (4)
#define TLS_FWUP_STATUS_ESESSIONID (5)
#define TLS_FWUP_STATUS_EIO (6)
#define TLS_FWUP_STATUS_ESIGNATURE (7)
#define TLS_FWUP_STATUS_ECRC (8)
#define TLS_FWUP_STATUS_EUNDEF (9)
/** firmware block size for one time */
#define TLS_FWUP_BLK_SIZE 512
/** firmware update request status */
#define TLS_FWUP_REQ_STATUS_IDLE (0)
#define TLS_FWUP_REQ_STATUS_BUSY (1)
#define TLS_FWUP_REQ_STATUS_SUCCESS (2)
#define TLS_FWUP_REQ_STATUS_FIO (3)
#define TLS_FWUP_REQ_STATUS_FSIGNATURE (4)
#define TLS_FWUP_REQ_STATUS_FMEM (5)
#define TLS_FWUP_REQ_STATUS_FCRC (6)
#define TLS_FWUP_REQ_STATUS_FCOMPLETE (7)
/** firmware update state */
#define TLS_FWUP_STATE_UNDEF (0xffff)
#define TLS_FWUP_STATE_BUSY (1 << 0)
#define TLS_FWUP_STATE_COMPLETE (1 << 1)
#define TLS_FWUP_STATE_ERROR_IO (1 << 2)
#define TLS_FWUP_STATE_ERROR_SIGNATURE (1 << 3)
#define TLS_FWUP_STATE_ERROR_MEM (1 << 4)
#define TLS_FWUP_STATE_ERROR_CRC (1 << 5)
#define TLS_FWUP_STATE_ERROR (TLS_FWUP_STATE_ERROR_IO | TLS_FWUP_STATE_ERROR_SIGNATURE | TLS_FWUP_STATE_ERROR_MEM | TLS_FWUP_STATE_ERROR_CRC)
/** update type 0:firmware, 1: data */
#define TLS_FWUP_DEST_SPECIFIC_FIRMWARE (0)
#define TLS_FWUP_DEST_SPECIFIC_DATA (1)
enum IMAGE_TYPE_ENUM{
IMG_TYPE_SECBOOT = 0x0,
IMG_TYPE_FLASHBIN0 = 0x1,
IMG_TYPE_CPFT = 0xE
};
enum
{
NOT_ZIP_FILE = 0,
ZIP_FILE = 1
};
typedef union {
struct {
uint32_t img_type: 4; /*!< bit: 0.. 3 IMAGE_TYPE_ENUM */
uint32_t code_encrypt:1; /*!< bit: 4 whether the code in flash encrypted */
uint32_t prikey_sel:3; /*!< bit: 5.. 7 private key selection */
uint32_t signature:1; /*!< bit: 8 whether signature flag, only indicates if img contains 128bytes signature in the end*/
uint32_t _reserved1: 7; /*!< bit: 9.. 15 Reserved */
uint32_t zip_type: 1; /*!< bit: 16 zip_type bit */
uint32_t psram_io: 1; /*!< bit: 17 psram_io bit */
uint32_t erase_block_en: 1; /*!< bit: 18 flash erase block enable bit */
uint32_t erase_always: 1; /*!< bit: 19 flash erase always bit */
uint32_t _reserved2: 12; /*!< bit: 20..31 Reserved */
} b; /*!< Structure Access by bit */
uint32_t w; /*!< Type Access by whole register */
} Img_Attr_Type;
typedef struct IMAGE_HEADER_PARAM{
unsigned int magic_no;
Img_Attr_Type img_attr;
unsigned int img_addr;
unsigned int img_len;
unsigned int img_header_addr;
unsigned int upgrade_img_addr;
unsigned int org_checksum;
unsigned int upd_no;
unsigned char ver[16];
unsigned int _reserved0;
unsigned int _reserved1;
struct IMAGE_HEADER_PARAM *next;
unsigned int hd_checksum;
}IMAGE_HEADER_PARAM_ST;
/** Structure for firmware image header */
struct tls_fwup_image_hdr {
u32 magic;
u8 crc8;
u8 dest_specific;
u16 dest_offset; // unit: 4KB, valid when dest_specific is TRUE
u32 file_len;
char time[4];
};
/** Structure for one packet data */
struct tls_fwup_block {
u16 number; //0~Sum-1
u16 sum;
u8 data[TLS_FWUP_BLK_SIZE];
u32 crc32;
u8 pad[8];
};
/** Enumeration for image soure when firmware update */
enum tls_fwup_image_src {
TLS_FWUP_IMAGE_SRC_LUART = 0, /**< LOW SPEED UART */
TLS_FWUP_IMAGE_SRC_HUART, /**< HIGH SPEED UART */
TLS_FWUP_IMAGE_SRC_HSPI, /**< HIGH SPEED SPI */
TLS_FWUP_IMAGE_SRC_WEB /**< WEB SERVER */
};
/** Structure for firmware update request */
struct tls_fwup_request {
struct dl_list list;
u8 *data;
u32 data_len;
int status;
void (*complete)(struct tls_fwup_request *request, void *arg);
void *arg;
};
/** Structure for firmware update */
struct tls_fwup {
struct dl_list wait_list;
tls_os_sem_t *list_lock;
bool busy;
enum tls_fwup_image_src current_image_src;
u16 current_state;
u32 current_session_id;
u32 received_len;
u32 total_len;
u32 updated_len;
u32 program_base;
u32 program_offset;
s32 received_number;
};
/**
* @defgroup System_APIs System APIs
* @brief System APIs
*/
/**
* @addtogroup System_APIs
* @{
*/
/**
* @defgroup FWUP_APIs FWUP APIs
* @brief firmware upgrade APIs
*/
/**
* @addtogroup FWUP_APIs
* @{
*/
/**
* @brief This function is used to initialize firmware update task
*
* @param[in] None
*
* @retval TLS_FWUP_STATUS_OK initial success
* @retval TLS_FWUP_STATUS_EBUSY already initialed
* @retval TLS_FWUP_STATUS_EMEM memory error
* @note None
*/
int tls_fwup_init(void);
/**
* @brief This function is used to enter firmware update progress.
*
* @param[in] image_src image file's source,
from TLS_FWUP_IMAGE_SRC_LUART,
TLS_FWUP_IMAGE_SRC_WEB,TLS_FWUP_IMAGE_SRC_HUART,
TLS_FWUP_IMAGE_SRC_HSPI
*
* @retval non-zero successfully, return session id
* @retval 0 failed
*
* @note None
*/
u32 tls_fwup_enter(enum tls_fwup_image_src image_src);
/**
* @brief This function is used to exit firmware update progress.
*
* @param[in] session_id session identity of firmware update progress
*
* @retval TLS_FWUP_STATUS_OK exit success
* @retval TLS_FWUP_STATUS_EPERM globle param is not initialed
* @retval TLS_FWUP_STATUS_ESESSIONID error session id
* @retval TLS_FWUP_STATUS_EBUSY update state is busy
*
* @note None
*/
int tls_fwup_exit(u32 session_id);
/**
* @brief This function is used to start update progress
*
* @param[in] session_id current sessin id
* @param[in] *data the data want to update
* @param[in] data_len data length
*
* @retval TLS_FWUP_STATUS_OK updade success
* @retval TLS_FWUP_STATUS_EPERM globle param is not initialed
* @retval TLS_FWUP_STATUS_ESESSIONID error session id
* @retval TLS_FWUP_STATUS_EINVALID invalid param
* @retval TLS_FWUP_STATUS_EMEM memory error
* @retval TLS_FWUP_STATUS_EIO write flash error
* @retval TLS_FWUP_STATUS_ECRC crc error
* @retval TLS_FWUP_STATUS_ESIGNATURE signature error
* @retval TLS_FWUP_STATUS_EUNDEF other error
*
* @note None
*/
int tls_fwup_request_sync(u32 session_id, u8 *data, u32 data_len);
/**
* @brief This function is used to get current update status
*
* @param[in] session_id current sessin id
*
* @retval current state TLS_FWUP_STATUS_OK to TLS_FWUP_STATUS_EUNDEF
*
* @note None
*/
u16 tls_fwup_current_state(u32 session_id);
/**
* @brief This function is used to reset the update information
*
* @param[in] session_id current sessin id
*
* @retval TLS_FWUP_STATUS_OK reset success
* @retval TLS_FWUP_STATUS_EPERM globle param is not initialed
* @retval TLS_FWUP_STATUS_ESESSIONID error session id
* @retval TLS_FWUP_STATUS_EBUSY update state is busy
*
* @note None
*/
int tls_fwup_reset(u32 session_id);
/**
* @brief This function is used to clear error update state
*
* @param[in] session_id current sessin id
*
* @retval TLS_FWUP_STATUS_OK reset success
*
* @note None
*/
int tls_fwup_clear_error(u32 session_id);
/**
* @brief This function is used to set update state to
TLS_FWUP_STATE_ERROR_CRC
*
* @param[in] session_id current sessin id
*
* @retval TLS_FWUP_STATUS_OK set success
* @retval TLS_FWUP_STATUS_EPERM globle param is not initialed
* @retval TLS_FWUP_STATUS_ESESSIONID error session id
*
* @note None
*/
int tls_fwup_set_crc_error(u32 session_id);
/**
* @brief This function is used to get progress's status
*
* @param[in] None
*
* @retval TRUE busy
* @retval FALSE idle
*
* @note None
*/
int tls_fwup_get_status(void);
/**
* @brief This function is used to set update packet number
*
* @param[in] number
*
* @retval TLS_FWUP_STATUS_OK success
* @retval TLS_FWUP_STATE_UNDEF failed
*
* @note None
*/
int tls_fwup_set_update_numer(int number);
/**
* @brief This function is used to get received update packet number
*
* @param[in] None
*
* @retval return current packet number
*
* @note None
*/
int tls_fwup_get_current_update_numer(void);
/**
* @brief This function is used to get current session id
*
* @param[in] None
*
* @retval non-zoro session id
* @retval 0 error
*
* @note None
*/
int tls_fwup_get_current_session_id(void);
/**
* @brief This function is used to check image header
*
* @param[in] None
*
* @retval TRUE: success
* @retval FALSE: failure
*
* @note None
*/
int tls_fwup_img_header_check(IMAGE_HEADER_PARAM_ST *img_param);
/**
* @}
*/
/**
* @}
*/
#endif /* WM_FWUP_H */