1 /* 2 * Copyright (c) 2021 Bestechnic (Shanghai) Co., Ltd. All rights reserved. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifndef __APP_TOTA_H__ 16 #define __APP_TOTA_H__ 17 18 #include "app_tota_cmd_code.h" 19 20 #define APP_TOTA_PATH_TYPE_SPP (1 << 0) 21 22 #define APP_TOTA_PATH_TYPE (APP_TOTA_PATH_TYPE_SPP) 23 24 #define APP_TOTA_CONNECTED (1 << 0) 25 #define APP_TOTA_DISCONNECTED (~(1 << 0)) 26 27 #ifdef __cplusplus 28 extern "C" { 29 #endif 30 #define TOTA_SERVICE_CMD_PARAM_LENGTH 128 31 #if 0//if support write flash block cmd,the buffer size must be 4k 32 #define TOTA_SERVICE_DATA_WRITE_LENGTH 4*1024 33 #define TOTA_SERVICE_DATA_READ_LENGTH 4*1024 34 #else 35 #define TOTA_SERVICE_DATA_WRITE_LENGTH 4*32 36 #define TOTA_SERVICE_DATA_READ_LENGTH 4*32 37 #endif 38 #define TOTA_DATA_BUFFER_SIZE_FOR_BURNING FLASH_SECTOR_SIZE_IN_BYTES 39 #define TOTA_SERVICE_SYNC_WORD 0x54534542 40 #define TOTA_SERVICE_SYNC_DATA_1 0xbe 41 #define TOTA_SERVICE_SYNC_DATA_2 0xca 42 #define TOTA_SERVICE_XFER_OUT_DATA_SIZE 500 43 #define BT_LOCAL_NAME_LEN 64 44 #define DANGLE_TRANS_MAX_SIZE 248 45 #define DUMP_BYTES 32 46 47 enum{ 48 TOTA_SERVICE_DATA_XFER_ADDR_WRITE, 49 TOTA_SERVICE_DATA_XFER_ADDR_READ, 50 TOTA_SERVICE_DATA_XFER_ADDR_NONE, 51 }; 52 53 54 typedef enum{ 55 TOTA_SERVICE_GENERAL_CMD_PARSER_NONE, 56 TOTA_SERVICE_GENERAL_CMD_STATE_PARSER_SYNC, 57 TOTA_SERVICE_GENERAL_CMD_STATE_PARSER_DATA, 58 TOTA_SERVICE_GENERAL_CMD_STATE_PARSER_EXTRAL, 59 }TOTA_SERVICE_GENERAL_CMD_PARSER_STATE; 60 61 62 typedef enum{ 63 TOTA_SERVICE_INIT_SYNC = 0, /*valid payload: |2 bytes sync word | */ 64 TOTA_SERVICE_CMD_WRITE_FLASH, /*valid payload: |4 bytes address|4 bytes write data length| */ 65 TOTA_SERVICE_CMD_READ_FLASH, /*valid payload: |1 byte start_or_stop|4 bytes address|4 bytes read data length| */ 66 TOTA_SERVICE_CMD_WRITE_AI_ENV_DATA, /*valid payload: |4 bytes write data length| */ 67 TOTA_SERVICE_CMD_VERIFY_AI_ENV_DATA, /*valid payload: |4 bytes magic code |4 bytes CRC| */ 68 TOTA_SERVICE_CMD_READ_AI_ENV_DATA, /*valid payload: |1 byte start_or_stop|4 bytes read data length | */ 69 TOTA_SERVICE_CMD_READ_ACK, /*valid rsp payload: |1 bytes| */ 70 TOTA_SERVICE_CMD_GET_BAT, /*valid rsp payload: |4 bytes| */ 71 TOTA_SERVICE_CMD_GET_FW_VERSION, /*valid rsp payload: |4 bytes| */ 72 TOTA_SERVICE_CMD_GET_BT_LOCAL_NAME, /*valid rsp payload: |x bytes| */ 73 TOTA_SERVICE_CMD_GET_BT_ADDR, /*valid rsp payload: |6 bytes| */ 74 TOTA_SERVICE_CMD_CLEAR_PAIRING_INFO, 75 TOTA_SERVICE_CMD_GENERAL_TEST, 76 TOTA_SERVICE_CMD_SHUTDOWM, 77 TOTA_SERVICE_CMD_MIC_TEST_ON, 78 TOTA_SERVICE_CMD_MIC_TEST_OFF, 79 TOTA_SERVICE_CMD_COUNT = 0xff, /*valid payload */ 80 }TOTA_GENERAL_CMD_E; 81 82 typedef enum{ 83 TOTA_SERVICE_SEND_STATUS_NO_ERROR = 0, 84 TOTA_SERVICE_SEND_STATUS_INVALID_CMD = 1, 85 TOTA_SERVICE_SEND_STATUS_PARAM_ERR = 2, 86 TOTA_SERVICE_SEND_STATUS_END = 3, 87 }TOTA_SERVICE_SEND_STATUS_E; 88 89 90 typedef struct{ 91 uint16_t cmd; 92 uint16_t len; 93 }TOTA_SERVICE_CMD_RSP_HEADER_T; 94 95 typedef struct{ 96 uint8_t is_to_start; 97 uint32_t start_addr; 98 uint32_t len; 99 }__attribute__ ((__packed__)) TOTA_SERVICE_CMD_READ_FLASH_BODY_STRUCT_T; 100 101 typedef struct{ 102 uint32_t start_addr; 103 uint32_t len; 104 }TOTA_SERVICE_CMD_WRITE_FLASH_BODY_STRUCT_T; 105 106 typedef struct{ 107 uint8_t is_to_start; 108 uint32_t start_addr; 109 uint32_t len; 110 uint8_t read_ai_env_ack; 111 }__attribute__ ((__packed__)) TOTA_SERVICE_CMD_READ_AI_ENV_DATA_BODY_STRUCT_T; 112 113 typedef struct{ 114 uint32_t len; 115 }TOTA_SERVICE_CMD_WRITE_AI_ENV_DATA_BODY_STRUCT_T; 116 117 typedef struct{ 118 TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header; 119 uint8_t ack_val; 120 }__attribute__ ((__packed__)) TOTA_SERVICE_CMD_SYNC_ACK; 121 122 typedef struct{ 123 TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header; 124 uint8_t write_ai_env_ack; 125 } __attribute__ ((__packed__)) TOTA_SERVICE_CMD_WRITE_AI_ENV_DATA_ACK_STRUCT_T; 126 127 typedef struct{ 128 TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header; 129 uint8_t verify_ai_env_ack; 130 } __attribute__ ((__packed__)) TOTA_SERVICE_CMD_VERIFY_AI_ENV_DATA_ACK_STRUCT_T; 131 132 typedef uint32_t BAT_VAL_BYTES; 133 typedef struct{ 134 TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header; 135 BAT_VAL_BYTES bat_val; 136 }TOTA_SERVICE_CMD_GET_BAT_VAL_BODY_STRUCT_T; 137 138 typedef struct{ 139 TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header; 140 uint8_t fw_version[4]; 141 }TOTA_SERVICE_CMD_GET_FW_VERSION_BODY_STRUCT_T; 142 143 typedef struct{ 144 TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header; 145 char bt_local_name[BT_LOCAL_NAME_LEN]; 146 }__attribute__ ((__packed__))TOTA_SERVICE_CMD_GET_BT_LOCAL_NAME_BODY_STRUCT_T; 147 148 typedef struct{ 149 TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header; 150 uint8_t bt_addr[6]; 151 }__attribute__ ((__packed__))TOTA_SERVICE_CMD_GET_BT_ADDR_BODY_STRUCT_T; 152 153 typedef struct{ 154 TOTA_SERVICE_CMD_RSP_HEADER_T cmd_rsp_header; 155 uint8_t test_val[7]; 156 }__attribute__ ((__packed__))TOTA_SERVICE_CMD_GET_TEST_VAL_BODY_STRUCT_T; 157 158 typedef struct{ 159 uint32_t prefix; 160 uint16_t cmd; 161 uint8_t seq; 162 uint8_t len; 163 }msg_header_t; 164 165 typedef struct{ 166 msg_header_t hdr; 167 unsigned char cmd_param[TOTA_SERVICE_CMD_PARAM_LENGTH]; 168 }TOTA_GENERAL_CMD_STRUCT_T; 169 170 typedef struct{ 171 uint8_t* tota_write_buff_ptr; 172 uint16_t tota_data_write_buf_block_lenth; 173 uint16_t tota_data_written_lenth_in_block; 174 175 uint32_t tota_data_need_write_flash_begin_addr; 176 uint32_t tota_data_tota_need_write_lenth; 177 uint32_t tota_data_tota_already_receive_length; 178 uint32_t tota_data_written_in_flash_pos ; 179 uint32_t tota_offset_in_flash_of_current_block; 180 uint32_t tota_offset_of_data_of_current_block; 181 }TOTA_SERVICE_DATA_WRITE_STRUCT_T; 182 183 typedef struct{ 184 uint8_t* tota_read_buff_ptr; 185 uint16_t tota_data_read_buf_block_lenth; 186 uint16_t tota_data_have_read_lenth_in_block; 187 188 uint32_t tota_data_need_read_flash_begin_addr; 189 uint32_t tota_data_tota_need_read_lenth; 190 uint32_t tota_data_tota_already_sent_length; 191 uint32_t tota_data_have_read_in_flash_pos ; 192 uint32_t tota_offset_in_flash_of_current_block; 193 uint32_t tota_offset_of_data_of_current_block; 194 }TOTA_SERVICE_DATA_READ_STRUCT_T; 195 196 197 /** 198 * @brief The format of the segment verification request 199 * 200 */ 201 typedef struct 202 { 203 uint32_t magicCode; // should be OTA_START_MAGIC_CODE 204 uint32_t crc32OfSegment; // crc32 of the 1 segment 205 } __attribute__ ((__packed__)) TOTA_SEGMENT_VERIFY_T; 206 207 void app_tota_init(void); 208 void app_tota_connected(uint8_t connType); 209 void app_tota_disconnected(uint8_t disconnType); 210 bool app_is_in_tota_mode(void); 211 void app_tota_update_datapath(APP_TOTA_TRANSMISSION_PATH_E dataPath); 212 APP_TOTA_TRANSMISSION_PATH_E app_tota_get_datapath(void); 213 214 #ifdef __cplusplus 215 } 216 #endif 217 218 #endif 219 220