pinebuds/services/tota/app_tota.h
2022-08-15 17:20:27 +08:00

244 lines
8.1 KiB
C

/***************************************************************************
*
* Copyright 2015-2019 BES.
* All rights reserved. All unpublished rights reserved.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of BES.
*
* Use of this work is governed by a license granted by BES.
* This work contains confidential and proprietary information of
* BES. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
#ifndef __APP_TOTA_H__
#define __APP_TOTA_H__
#include "app_tota_cmd_code.h"
#define APP_TOTA_PATH_TYPE_SPP (1 << 0)
#define APP_TOTA_PATH_TYPE (APP_TOTA_PATH_TYPE_SPP)
#define APP_TOTA_CONNECTED (1 << 0)
#define APP_TOTA_DISCONNECTED (~(1 << 0))
#define TOTA_SHARE_TX_RX_BUF 1
#ifdef __cplusplus
extern "C" {
#endif
#define TOTA_SERVICE_CMD_PARAM_LENGTH 128
#if 0//if support write flash block cmd,the buffer size must be 4k
#define TOTA_SERVICE_DATA_WRITE_LENGTH 4*1024
#define TOTA_SERVICE_DATA_READ_LENGTH 4*1024
#else
#define TOTA_SERVICE_DATA_WRITE_LENGTH 4*32
#define TOTA_SERVICE_DATA_READ_LENGTH 4*32
#endif
#define FLASH_SECTOR_SIZE_IN_BYTES 4*1024
#define TOTA_DATA_BUFFER_SIZE_FOR_BURNING FLASH_SECTOR_SIZE_IN_BYTES
#define TOTA_SERVICE_SYNC_WORD 0x54534542
#define TOTA_SERVICE_SYNC_DATA_1 0xbe
#define TOTA_SERVICE_SYNC_DATA_2 0xca
#define TOTA_SERVICE_XFER_OUT_DATA_SIZE 500
#define BT_LOCAL_NAME_LEN 64
#define DANGLE_TRANS_MAX_SIZE 248
#define DUMP_BYTES 32
enum{
TOTA_SERVICE_DATA_XFER_ADDR_WRITE,
TOTA_SERVICE_DATA_XFER_ADDR_READ,
TOTA_SERVICE_DATA_XFER_ADDR_NONE,
};
typedef enum{
TOTA_SERVICE_GENERAL_CMD_PARSER_NONE,
TOTA_SERVICE_GENERAL_CMD_STATE_PARSER_SYNC,
TOTA_SERVICE_GENERAL_CMD_STATE_PARSER_DATA,
TOTA_SERVICE_GENERAL_CMD_STATE_PARSER_EXTRAL,
}TOTA_SERVICE_GENERAL_CMD_PARSER_STATE;
typedef enum{
TOTA_SERVICE_INIT_SYNC = 0, /*valid payload: |2 bytes sync word | */
TOTA_SERVICE_CMD_WRITE_FLASH, /*valid payload: |4 bytes address|4 bytes write data length| */
TOTA_SERVICE_CMD_READ_FLASH, /*valid payload: |1 byte start_or_stop|4 bytes address|4 bytes read data length| */
TOTA_SERVICE_CMD_WRITE_AI_ENV_DATA, /*valid payload: |4 bytes write data length| */
TOTA_SERVICE_CMD_VERIFY_AI_ENV_DATA, /*valid payload: |4 bytes magic code |4 bytes CRC| */
TOTA_SERVICE_CMD_READ_AI_ENV_DATA, /*valid payload: |1 byte start_or_stop|4 bytes read data length | */
TOTA_SERVICE_CMD_READ_ACK, /*valid rsp payload: |1 bytes| */
TOTA_SERVICE_CMD_GET_BAT, /*valid rsp payload: |4 bytes| */
TOTA_SERVICE_CMD_GET_FW_VERSION, /*valid rsp payload: |4 bytes| */
TOTA_SERVICE_CMD_GET_BT_LOCAL_NAME, /*valid rsp payload: |x bytes| */
TOTA_SERVICE_CMD_GET_BT_ADDR, /*valid rsp payload: |6 bytes| */
TOTA_SERVICE_CMD_CLEAR_PAIRING_INFO,
TOTA_SERVICE_CMD_GENERAL_TEST,
TOTA_SERVICE_CMD_SHUTDOWM,
TOTA_SERVICE_CMD_MIC_TEST_ON,
TOTA_SERVICE_CMD_MIC_TEST_OFF,
TOTA_SERVICE_CMD_MIC_SWITCH,
TOTA_SERVICE_CMD_COUNT = 0xff, /*valid payload */
}TOTA_GENERAL_CMD_E;
typedef enum{
TOTA_SERVICE_SEND_STATUS_NO_ERROR = 0,
TOTA_SERVICE_SEND_STATUS_INVALID_CMD = 1,
TOTA_SERVICE_SEND_STATUS_PARAM_ERR = 2,
TOTA_SERVICE_SEND_STATUS_END = 3,
}TOTA_SERVICE_SEND_STATUS_E;
typedef struct{
uint16_t cmd;
uint16_t len;
}TOTA_SERVICE_CMD_RSP_HEADER_T;
typedef struct{
uint8_t is_to_start;
uint32_t start_addr;
uint32_t len;
}__attribute__ ((__packed__)) TOTA_SERVICE_CMD_READ_FLASH_BODY_STRUCT_T;
typedef struct{
uint32_t start_addr;
uint32_t len;
}TOTA_SERVICE_CMD_WRITE_FLASH_BODY_STRUCT_T;
typedef struct{
uint8_t is_to_start;
uint32_t start_addr;
uint32_t len;
uint8_t read_ai_env_ack;
}__attribute__ ((__packed__)) TOTA_SERVICE_CMD_READ_AI_ENV_DATA_BODY_STRUCT_T;
typedef struct{
uint32_t len;
}TOTA_SERVICE_CMD_WRITE_AI_ENV_DATA_BODY_STRUCT_T;
typedef struct{
TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header;
uint8_t ack_val;
}__attribute__ ((__packed__)) TOTA_SERVICE_CMD_SYNC_ACK;
typedef struct{
TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header;
uint8_t write_ai_env_ack;
} __attribute__ ((__packed__)) TOTA_SERVICE_CMD_WRITE_AI_ENV_DATA_ACK_STRUCT_T;
typedef struct{
TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header;
uint8_t verify_ai_env_ack;
} __attribute__ ((__packed__)) TOTA_SERVICE_CMD_VERIFY_AI_ENV_DATA_ACK_STRUCT_T;
typedef uint32_t BAT_VAL_BYTES;
typedef struct{
TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header;
BAT_VAL_BYTES bat_val;
}TOTA_SERVICE_CMD_GET_BAT_VAL_BODY_STRUCT_T;
typedef struct{
TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header;
uint8_t fw_version[4];
}TOTA_SERVICE_CMD_GET_FW_VERSION_BODY_STRUCT_T;
typedef struct{
TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header;
char bt_local_name[BT_LOCAL_NAME_LEN];
}__attribute__ ((__packed__))TOTA_SERVICE_CMD_GET_BT_LOCAL_NAME_BODY_STRUCT_T;
typedef struct{
TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header;
uint8_t bt_addr[6];
}__attribute__ ((__packed__))TOTA_SERVICE_CMD_GET_BT_ADDR_BODY_STRUCT_T;
typedef struct{
TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header;
uint8_t test_val[7];
}__attribute__ ((__packed__))TOTA_SERVICE_CMD_GET_TEST_VAL_BODY_STRUCT_T;
typedef struct{
uint32_t prefix;
uint16_t cmd;
uint8_t seq;
uint8_t len;
}msg_header_t;
typedef struct{
msg_header_t hdr;
unsigned char cmd_param[TOTA_SERVICE_CMD_PARAM_LENGTH];
}TOTA_GENERAL_CMD_STRUCT_T;
typedef struct{
uint8_t* tota_write_buff_ptr;
uint16_t tota_data_write_buf_block_lenth;
uint16_t tota_data_written_lenth_in_block;
uint32_t tota_data_need_write_flash_begin_addr;
uint32_t tota_data_tota_need_write_lenth;
uint32_t tota_data_tota_already_receive_length;
uint32_t tota_data_written_in_flash_pos ;
uint32_t tota_offset_in_flash_of_current_block;
uint32_t tota_offset_of_data_of_current_block;
}TOTA_SERVICE_DATA_WRITE_STRUCT_T;
typedef struct{
uint8_t* tota_read_buff_ptr;
uint16_t tota_data_read_buf_block_lenth;
uint16_t tota_data_have_read_lenth_in_block;
uint32_t tota_data_need_read_flash_begin_addr;
uint32_t tota_data_tota_need_read_lenth;
uint32_t tota_data_tota_already_sent_length;
uint32_t tota_data_have_read_in_flash_pos ;
uint32_t tota_offset_in_flash_of_current_block;
uint32_t tota_offset_of_data_of_current_block;
}TOTA_SERVICE_DATA_READ_STRUCT_T;
/**
* @brief The format of the segment verification request
*
*/
typedef struct
{
uint32_t magicCode; // should be OTA_START_MAGIC_CODE
uint32_t crc32OfSegment; // crc32 of the 1 segment
} __attribute__ ((__packed__)) TOTA_SEGMENT_VERIFY_T;
void app_tota_init(void);
void app_tota_connected(uint8_t connType);
void app_tota_disconnected(uint8_t disconnType);
void app_tota_general_connected(uint8_t connType);
bool app_is_in_tota_mode(void);
void app_tota_update_datapath(APP_TOTA_TRANSMISSION_PATH_E dataPath);
APP_TOTA_TRANSMISSION_PATH_E app_tota_get_datapath(void);
/* interface */
void tota_connected_handle();
void tota_disconnected_handle();
bool is_tota_connected();
void tota_set_encrypt_key_from_hash_key(uint8_t * set_key);
uint8_t * tota_encrypt_packet(uint8_t * in, uint32_t inLen, uint32_t * poutLen);
uint8_t * tota_decrypt_packet(uint8_t * in, uint32_t inLen, uint32_t * poutLen);
void tota_printf(const char * format, ...);
/*todo: for test*/
void test_aes_encode_decode();
#ifdef __cplusplus
}
#endif
#endif