230 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			230 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/****************************************************************************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
							 | 
						||
| 
								 | 
							
								be copied by any method or incorporated into another program without
							 | 
						||
| 
								 | 
							
								the express written consent of Aerospace C.Power. This Information or any portion
							 | 
						||
| 
								 | 
							
								thereof remains the property of Aerospace C.Power. The Information contained herein
							 | 
						||
| 
								 | 
							
								is believed to be accurate and Aerospace C.Power assumes no responsibility or
							 | 
						||
| 
								 | 
							
								liability for its use in any way and conveys no license or title under
							 | 
						||
| 
								 | 
							
								any patent or copyright and makes no representation or warranty that this
							 | 
						||
| 
								 | 
							
								Information is free from patent or copyright infringement.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								****************************************************************************/
							 | 
						||
| 
								 | 
							
								#ifndef APP_UPG_H
							 | 
						||
| 
								 | 
							
								#define APP_UPG_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "iot_utils_api.h"
							 | 
						||
| 
								 | 
							
								#include "app_types.h"
							 | 
						||
| 
								 | 
							
								//#include "iot_upgrade_api.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								/* max data lenth in one upgrade frame */
							 | 
						||
| 
								 | 
							
								#define PROTO_UPGRADE_BLOCK_SIZE    (400)
							 | 
						||
| 
								 | 
							
								/* max STA count for upgrade */
							 | 
						||
| 
								 | 
							
								#define PROTO_UPGRADE_MAX_STA       (200)
							 | 
						||
| 
								 | 
							
								/* max query sta upgrade progress count */
							 | 
						||
| 
								 | 
							
								#define PROTO_UPGD_RESP_MAX_CNT     (20)
							 | 
						||
| 
								 | 
							
								/* for resp upgrade data response */
							 | 
						||
| 
								 | 
							
								#define UPGRADE_DATA_HEAD_LEN       (9)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* 启动文件传输 */
							 | 
						||
| 
								 | 
							
								#define UPGRADE_START_TRANS_FILE     1
							 | 
						||
| 
								 | 
							
								/* 文件传输内容 */
							 | 
						||
| 
								 | 
							
								#define UPGRADE_TRANS_FILE_DATA      2
							 | 
						||
| 
								 | 
							
								/* 查询升级状态 */
							 | 
						||
| 
								 | 
							
								#define UPGRADE_STATE_QUERY          3
							 | 
						||
| 
								 | 
							
								/* 配置升级列表 */
							 | 
						||
| 
								 | 
							
								#define UPGRADE_SET_MAC_LIST         4
							 | 
						||
| 
								 | 
							
								/* 查询升级节点进度 */
							 | 
						||
| 
								 | 
							
								#define UPGRADE_STA_PROGRESS_QUERY   5
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define PROTO_RET_CODE_SUCCESS       0x00
							 | 
						||
| 
								 | 
							
								#define PROTO_RET_CODE_FAILED        0x01
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Abnormal status code */
							 | 
						||
| 
								 | 
							
								#define PROTO_REASON_NORMAL          0x00 /* The status is normal. */
							 | 
						||
| 
								 | 
							
								#define PROTO_REASON_TIMEOUT         0x01 /* communication timeout */
							 | 
						||
| 
								 | 
							
								#define PROTO_REASON_FORMAT          0x02 /* format error */
							 | 
						||
| 
								 | 
							
								#define PROTO_REASON_BUSY            0x03 /* node busy */
							 | 
						||
| 
								 | 
							
								#define PROTO_REASON_OTHER           0xFF /* Other errors */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* file attribution */
							 | 
						||
| 
								 | 
							
								typedef enum {
							 | 
						||
| 
								 | 
							
								    /* Clear the download. */
							 | 
						||
| 
								 | 
							
								    UPGRADE_FILE_ATTR_CLEAR         = 0x00,
							 | 
						||
| 
								 | 
							
								    /* local upgrade file */
							 | 
						||
| 
								 | 
							
								    UPGRADE_FILE_ATTR_LOCAL         = 0x01,
							 | 
						||
| 
								 | 
							
								    /* network-wide upgrade file */
							 | 
						||
| 
								 | 
							
								    UPGRADE_FILE_ATTR_REMOTE        = 0x02,
							 | 
						||
| 
								 | 
							
								    /* upgrade the assigned STA */
							 | 
						||
| 
								 | 
							
								    UPGRADE_FILE_ATTR_LIST          = 0x03,
							 | 
						||
| 
								 | 
							
								    /* invalid attribution */
							 | 
						||
| 
								 | 
							
								    UPGRADE_FILE_ATTR_INVALID
							 | 
						||
| 
								 | 
							
								} proto_upgrd_file_attr_e;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* progress of upgrade */
							 | 
						||
| 
								 | 
							
								typedef enum {
							 | 
						||
| 
								 | 
							
								    /* all done */
							 | 
						||
| 
								 | 
							
								    UPGRADE_TRANS_FILE_DONE         = 0x00,
							 | 
						||
| 
								 | 
							
								     /* on the go */
							 | 
						||
| 
								 | 
							
								    UPGRADE_TRANS_FILE_INPROGRESS   = 0x01,
							 | 
						||
| 
								 | 
							
								     /* partly failed */
							 | 
						||
| 
								 | 
							
								    UPGRADE_TRANS_FILE_UNCOMPLETE   = 0x02,
							 | 
						||
| 
								 | 
							
								    /* unknown state */
							 | 
						||
| 
								 | 
							
								    UPGRADE_TRANS_FILE_INVALID      = 0x03,
							 | 
						||
| 
								 | 
							
								} proto_upgrd_file_state_e;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** sta remote network upgrade info */
							 | 
						||
| 
								 | 
							
								typedef struct _sta_upgrd_info {
							 | 
						||
| 
								 | 
							
								    uint8_t       mac[IOT_MAC_ADDR_LEN];
							 | 
						||
| 
								 | 
							
								    uint8_t       status;
							 | 
						||
| 
								 | 
							
								    uint8_t       progress;
							 | 
						||
| 
								 | 
							
								} sta_upgrd_info_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* upgrade context */
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								    /* File attribute  */
							 | 
						||
| 
								 | 
							
								    uint8_t       file_attr;
							 | 
						||
| 
								 | 
							
								    /* current upgrade stage */
							 | 
						||
| 
								 | 
							
								    uint8_t       stage;
							 | 
						||
| 
								 | 
							
								    /* current upgrade state */
							 | 
						||
| 
								 | 
							
								    uint8_t       upgrd_state;
							 | 
						||
| 
								 | 
							
								    /* report count at one time */
							 | 
						||
| 
								 | 
							
								    uint8_t       rpt_num;
							 | 
						||
| 
								 | 
							
								    /* Total segments of the file */
							 | 
						||
| 
								 | 
							
								    uint16_t      seg_total;
							 | 
						||
| 
								 | 
							
								    /* current segment index */
							 | 
						||
| 
								 | 
							
								    uint16_t      cur_seg_indx;
							 | 
						||
| 
								 | 
							
								    /* typical segment size */
							 | 
						||
| 
								 | 
							
								    uint16_t      seg_size;
							 | 
						||
| 
								 | 
							
								    /* File length. */
							 | 
						||
| 
								 | 
							
								    uint32_t      file_len;
							 | 
						||
| 
								 | 
							
								    /* File CRC check */
							 | 
						||
| 
								 | 
							
								    uint32_t      file_crc;
							 | 
						||
| 
								 | 
							
								    /* upgrade id */
							 | 
						||
| 
								 | 
							
								    uint32_t      upgrade_id;
							 | 
						||
| 
								 | 
							
								    /* upgrade monitor timer */
							 | 
						||
| 
								 | 
							
								    timer_id_t  mon_timer;
							 | 
						||
| 
								 | 
							
								    /* total sta count in upgrade */
							 | 
						||
| 
								 | 
							
								    uint16_t      total_sta_cnt;
							 | 
						||
| 
								 | 
							
								    /* total failed sta count */
							 | 
						||
| 
								 | 
							
								    uint16_t      fail_sta_cnt;
							 | 
						||
| 
								 | 
							
								    /* upgrade list current indx */
							 | 
						||
| 
								 | 
							
								    uint16_t      upgrd_list_indx;
							 | 
						||
| 
								 | 
							
								    /* file data */
							 | 
						||
| 
								 | 
							
								    uint8_t       *file_data;
							 | 
						||
| 
								 | 
							
								    /* Timeout interval for file transfer, in minutes. */
							 | 
						||
| 
								 | 
							
								    uint32_t      trans_timeout;
							 | 
						||
| 
								 | 
							
								    /* cco upgrade status in remote mode */
							 | 
						||
| 
								 | 
							
								    uint8_t       cco_upd_state;
							 | 
						||
| 
								 | 
							
								    /* temporary sta upgrade data */
							 | 
						||
| 
								 | 
							
								    uint8_t *     temp_data;
							 | 
						||
| 
								 | 
							
								    /* calculate crc32 value of all data received */
							 | 
						||
| 
								 | 
							
								    uint32_t      calc_crc32;
							 | 
						||
| 
								 | 
							
								    /* upgrade info for every STA */
							 | 
						||
| 
								 | 
							
								    sta_upgrd_info_t sta_info[PROTO_UPGRADE_MAX_STA];
							 | 
						||
| 
								 | 
							
								} proto_upgrd_contxt_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _data_trans_head_t {
							 | 
						||
| 
								 | 
							
								    uint16_t cmd;
							 | 
						||
| 
								 | 
							
								    uint16_t length;
							 | 
						||
| 
								 | 
							
								    uint8_t data[0];
							 | 
						||
| 
								 | 
							
								} data_trans_head_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* pack for the structures in the whole file */
							 | 
						||
| 
								 | 
							
								#pragma pack(push)  // save the pack status
							 | 
						||
| 
								 | 
							
								#pragma pack(1)
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								    /* file attribution, see PROTO_FILE_ATTR_xxx */
							 | 
						||
| 
								 | 
							
								    uint8_t file_attr;
							 | 
						||
| 
								 | 
							
								    /* Total segments of the file */
							 | 
						||
| 
								 | 
							
								    uint16_t seg_total;
							 | 
						||
| 
								 | 
							
								    /* File length. */
							 | 
						||
| 
								 | 
							
								    uint32_t file_len;
							 | 
						||
| 
								 | 
							
								    /* File content CRC32 checksum */
							 | 
						||
| 
								 | 
							
								    uint32_t file_crc;
							 | 
						||
| 
								 | 
							
								    /* Timeout interval for file transfer, in minutes. */
							 | 
						||
| 
								 | 
							
								    uint32_t trans_timeout;
							 | 
						||
| 
								 | 
							
								} proto_start_trans_file_req;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Data transfer request structure */
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								    /* resrve */
							 | 
						||
| 
								 | 
							
								    uint8_t rsv;
							 | 
						||
| 
								 | 
							
								    /* File transfer segment number. */
							 | 
						||
| 
								 | 
							
								    uint16_t seg_num;
							 | 
						||
| 
								 | 
							
								    /* File transfer segment size. */
							 | 
						||
| 
								 | 
							
								    uint16_t seg_size;
							 | 
						||
| 
								 | 
							
								    /* File transfer segment CRC16-XMODEM(0x1021) checksum. */
							 | 
						||
| 
								 | 
							
								    uint16_t seg_crc;
							 | 
						||
| 
								 | 
							
								    /* File transfer segment data. */
							 | 
						||
| 
								 | 
							
								    uint8_t seg_data[0];
							 | 
						||
| 
								 | 
							
								} proto_trans_file_data_req;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* setting upgrade list */
							 | 
						||
| 
								 | 
							
								typedef struct _set_upgrd_list_t {
							 | 
						||
| 
								 | 
							
								    /* Number of nodes */
							 | 
						||
| 
								 | 
							
								    uint8_t count;
							 | 
						||
| 
								 | 
							
								    /* sta mac which will be upgraded */
							 | 
						||
| 
								 | 
							
								    uint8_t mac[0];
							 | 
						||
| 
								 | 
							
								} set_upgrd_list_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Structure of the response for setting upgrade list */
							 | 
						||
| 
								 | 
							
								typedef struct _upgrd_resp_t {
							 | 
						||
| 
								 | 
							
								    /* Error code. 0: success; 1: failure */
							 | 
						||
| 
								 | 
							
								    uint8_t state;
							 | 
						||
| 
								 | 
							
								       /* fail reason */
							 | 
						||
| 
								 | 
							
								    uint8_t reason;
							 | 
						||
| 
								 | 
							
								    /* reserved for the future */
							 | 
						||
| 
								 | 
							
								    uint8_t rsv;
							 | 
						||
| 
								 | 
							
								} upgrd_resp_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct query_progress_req {
							 | 
						||
| 
								 | 
							
								      /* read start index */
							 | 
						||
| 
								 | 
							
								    uint16_t start_index;
							 | 
						||
| 
								 | 
							
								       /* read num */
							 | 
						||
| 
								 | 
							
								    uint8_t count;
							 | 
						||
| 
								 | 
							
								} query_progress_req;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct query_progress_ind {
							 | 
						||
| 
								 | 
							
								    /* total count */
							 | 
						||
| 
								 | 
							
								    uint16_t upgrade_total_count;
							 | 
						||
| 
								 | 
							
								    /* start index */
							 | 
						||
| 
								 | 
							
								    uint16_t start_index;
							 | 
						||
| 
								 | 
							
								    /* real repet count */
							 | 
						||
| 
								 | 
							
								    uint8_t resp_count;
							 | 
						||
| 
								 | 
							
								    /* data struct*/
							 | 
						||
| 
								 | 
							
								    sta_upgrd_info_t info[0];
							 | 
						||
| 
								 | 
							
								} query_progress_ind;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* response for the processing progress */
							 | 
						||
| 
								 | 
							
								typedef struct upgrade_state_resp_t {
							 | 
						||
| 
								 | 
							
								    /* progress of upgrade */
							 | 
						||
| 
								 | 
							
								    uint8_t state;
							 | 
						||
| 
								 | 
							
								    /* counte fo failed STA */
							 | 
						||
| 
								 | 
							
								    uint16_t fail_sta;
							 | 
						||
| 
								 | 
							
								    /* reserve */
							 | 
						||
| 
								 | 
							
								    uint8_t rsv;
							 | 
						||
| 
								 | 
							
								} upgrade_state_resp_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma pack(pop)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t app_proto_start_trans_file(const proto_start_trans_file_req *frame, uint8_t *out_buffer, uint16_t *length);
							 | 
						||
| 
								 | 
							
								uint32_t app_proto_trans_file_data(proto_trans_file_data_req *frame, uint8_t *out_buffer, uint16_t *length);
							 | 
						||
| 
								 | 
							
								uint32_t app_proto_trans_file_query(uint8_t *out_buffer, uint16_t *length);
							 | 
						||
| 
								 | 
							
								uint32_t app_proto_set_upgrd_list(set_upgrd_list_t *frame, uint8_t *out_buffer,
							 | 
						||
| 
								 | 
							
								    uint16_t *length,uint8_t renew);
							 | 
						||
| 
								 | 
							
								uint32_t app_proto_trans_file_query_progress(query_progress_req *frame, uint8_t *out_buffer, uint16_t *length);
							 | 
						||
| 
								 | 
							
								uint16_t app_proto_upgrd_contxt_init(void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* end APP_UPG_H */
							 | 
						||
| 
								 | 
							
								
							 |