359 lines
9.6 KiB
C
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 */
|
|
|