• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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