1 /*
2 * Copyright (c) 2021 Chipsea Technologies (Shenzhen) Corp., 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 /**
16 ****************************************************************************************
17 *
18 * @file flash_api.c
19 *
20 * @brief FLASH API functions
21 *
22 ****************************************************************************************
23 */
24
25 /*
26 * INCLUDE FILES
27 ****************************************************************************************
28 */
29 #include "flash_api.h"
30 #include "ll.h"
31 #include "dbg_assert.h"
32 #include "dbg.h"
33 #include <string.h>
34 #include "compiler.h"
35 #include "system.h"
36
37 //#define FLASH_BT_TRACE_ON
38
39 #define ROM_APITBL_BASE ((unsigned int *)0x00000180UL)
40
41 #define ROM_FlashChipSizeGet ((unsigned int (*)(void)) \
42 ROM_APITBL_BASE[2])
43 #define ROM_FlashChipErase ((void (*)(void)) \
44 ROM_APITBL_BASE[3])
45 #define ROM_FlashErase ((int (*)(unsigned int a4k, unsigned int len)) \
46 ROM_APITBL_BASE[4])
47 #define ROM_FlashWrite ((int (*)(unsigned int adr, unsigned int len, unsigned int buf)) \
48 ROM_APITBL_BASE[5])
49 #define ROM_FlashRead ((int (*)(unsigned int adr, unsigned int len, unsigned int buf)) \
50 ROM_APITBL_BASE[6])
51 #define ROM_FlashCacheInvalidAll ((void (*)(void)) \
52 ROM_APITBL_BASE[7])
53 #define ROM_FlashCacheInvalidRange ((void (*)(unsigned int adr, unsigned int len)) \
54 ROM_APITBL_BASE[8])
55 #define ROM_FlashCRC32_U02 ((unsigned int (*)(unsigned char *adr, unsigned int len)) \
56 ((unsigned int *)0x0000807BUL))
57 #define ROM_FlashCRC32_U03 ((unsigned int (*)(unsigned char *adr, unsigned int len)) \
58 ((unsigned int *)0x000081DFUL))
59 #define ROM_FlashCRC32_U04 ((unsigned int (*)(unsigned char *adr, unsigned int len)) \
60 ROM_APITBL_BASE[31])
61 #define ROM_FlashCRC32x(v,...) MCAT(ROM_FlashCRC32_U0, v)(__VA_ARGS__)
62 #if defined(CFG_BOOT_ROM_VER) && (CFG_BOOT_ROM_VER == 4)
63 #define ROM_FlashCRC32(...) ROM_FlashCRC32x(4, __VA_ARGS__)
64 #else
65 #define ROM_FlashCRC32(...) ROM_FlashCRC32x(CFG_ROM_VER, __VA_ARGS__)
66 #endif
67
68 /* ROM APIs */
flash_chip_size_get(void)69 unsigned int flash_chip_size_get(void)
70 {
71 unsigned int ret;
72 critical_section_start();
73 ret = ROM_FlashChipSizeGet();
74 critical_section_end();
75 return ret;
76 }
77
flash_chip_erase(void)78 void flash_chip_erase(void)
79 {
80 critical_section_start();
81 ROM_FlashChipErase();
82 critical_section_end();
83 }
84
flash_erase(void * a4k,unsigned int len)85 int flash_erase(void *a4k, unsigned int len)
86 {
87 int ret;
88 critical_section_start();
89 ret = ROM_FlashErase((unsigned int)a4k, len);
90 critical_section_end();
91 return ret;
92 }
93
flash_write(void * adr,unsigned int len,void * buf)94 int flash_write(void *adr, unsigned int len, void *buf)
95 {
96 int ret;
97 critical_section_start();
98 ret = ROM_FlashWrite((unsigned int)adr, len, (unsigned int)buf);
99 critical_section_end();
100 return ret;
101 }
102
flash_read(void * adr,unsigned int len,void * buf)103 int flash_read(void *adr, unsigned int len, void *buf)
104 {
105 return ROM_FlashRead((unsigned int)adr, len, (unsigned int)buf);
106 }
107
flash_cache_invalid_all(void)108 void flash_cache_invalid_all(void)
109 {
110 ROM_FlashCacheInvalidAll();
111 }
112
flash_cache_invalid_range(void * adr,unsigned int len)113 void flash_cache_invalid_range(void *adr, unsigned int len)
114 {
115 ROM_FlashCacheInvalidRange((unsigned int)adr, len);
116 }
117
flash_crc32(void * adr,unsigned int len)118 unsigned int flash_crc32(void *adr, unsigned int len)
119 {
120 #if (CFG_ROM_VER == 255)
121 uint8_t chip_id = ChipIdGet(0);
122 if (chip_id == 0x03) {
123 return ROM_FlashCRC32x(2, (unsigned char *)adr, len);
124 } else if ((chip_id == 0x07) && (ChipIdGet(3) == 0x1F)) {
125 return ROM_FlashCRC32x(3, (unsigned char *)adr, len);
126 } else {
127 return ROM_FlashCRC32x(4, (unsigned char *)adr, len);
128 }
129 #else
130 return ROM_FlashCRC32((unsigned char *)adr, len);
131 #endif
132 }
133
134 /**
135 * +=========================+ <--------------- end of application
136 * | | ^
137 * | UNUSED | |
138 * | | v
139 * +-------------------------+ <--------------- user_data_flash_addr
140 * | | ^
141 * | user_data | | user_data_flash_length
142 * | | v
143 * +=========================+ <--------------- sys_info_flash_addr(btdm_info_base)
144 * | | | ^
145 * | | bt_ble_info | | 4KB
146 * | | | v
147 * | |--------------+ <--------------- wifi_info_base
148 * | | | ^
149 * | | wifi_info | | 4KB
150 * | | | v
151 * | sys_info |--------------+ <--------------- calib_info_base
152 * | | | ^
153 * | | calib_info | | 4KB : factory calib(RO)
154 * | | | v
155 * | |--------------+ <--------------- boot_info_base
156 * | | | ^
157 * | | boot_info | | 4KB : chip reserved(RO)
158 * | | | v
159 * +=========================+ <--------------- EOF
160 */
161
162 /* pre-defined sys info */
163 #define FLASH_BASE_ADDR 0x08000000
164 #define FLASH_SECTOR_SIZE 0x00001000
165 #define FLASH_RESERVED_SECTOR_CNT (4)
166
167 #define FLASH_BTDM_INFO_OFFSET (0 * FLASH_SECTOR_SIZE)
168 #define FLASH_WIFI_INFO_OFFSET (1 * FLASH_SECTOR_SIZE)
169 #define FLASH_CALIB_INFO_OFFSET (2 * FLASH_SECTOR_SIZE)
170
171 #define FLASH_BTDM_INFO_MAGIC_NUM 0x4D445442 /* "BTDM" */
172 #define FLASH_WIFI_INFO_MAGIC_NUM 0x49464957 /* "WIFI" */
173 #define FLASH_CALIB_INFO_MAGIC_NUM 0x494C4143 /* "CALI" */
174
175 /* calib info */
176 #define CALIB_INFO_XTAL_CAP_FLAG_BIT (0x01UL << 0)
177 #define CALIB_INFO_WIFI2G4_TXPWR_FLAG_BIT (0x01UL << 1)
178 #define CALIB_INFO_WIFI5G_TXPWR_FLAG_BIT (0x01UL << 2)
179
180 /* wifi sta info */
181 #define WIFI_INFO_STA_CONFIG_FLAG_BIT (0x01UL << 0)
182 #define WIFI_INFO_STA_MACADDR_FLAG_BIT (0x01UL << 1)
183 #define WIFI_INFO_STA_SSIDPW_FLAG_BIT (0x01UL << 2)
184
185 /* wifi ap info */
186 #define WIFI_INFO_AP_CONFIG_FLAG_BIT (0x01UL << 8)
187 #define WIFI_INFO_AP_MACADDR_FLAG_BIT (0x01UL << 9)
188 #define WIFI_INFO_AP_SSIDPW_FLAG_BIT (0x01UL << 10)
189 #define WIFI_INFO_AP_CHANNEL_FLAG_BIT (0x01UL << 11)
190
191 /* wifi lwip info */
192 #define WIFI_INFO_LWIP_CONFIG_FLAG_BIT (0x01UL << 16)
193 #define WIFI_INFO_LWIP_DHCPS_FLAG_BIT (0x01UL << 17)
194 #define WIFI_INFO_LWIP_DNS_FLAG_BIT (0x01UL << 18)
195 #define WIFI_INFO_LWIP_SNTP_FLAG_BIT (0x01UL << 19)
196
197 #define WIFI_INFO_FLAG_MASK (WIFI_INFO_STA_CONFIG_FLAG_BIT | WIFI_INFO_STA_MACADDR_FLAG_BIT | WIFI_INFO_STA_SSIDPW_FLAG_BIT \
198 | WIFI_INFO_AP_CONFIG_FLAG_BIT | WIFI_INFO_AP_MACADDR_FLAG_BIT | WIFI_INFO_AP_SSIDPW_FLAG_BIT | WIFI_INFO_AP_CHANNEL_FLAG_BIT \
199 | WIFI_INFO_LWIP_CONFIG_FLAG_BIT | WIFI_INFO_LWIP_DHCPS_FLAG_BIT | WIFI_INFO_LWIP_DNS_FLAG_BIT | WIFI_INFO_LWIP_SNTP_FLAG_BIT)
200
201 /* btdm bt info */
202 #define BTDM_INFO_BT_FACTORY_FLAG_BIT (0x01UL << 0)
203 #if PLF_BT_STACK == 1
204 #define BTDM_INFO_BT_DEV_INFO_FLAG_BIT (0x01UL << 1)
205 #else
206 #define BTDM_INFO_BT_DEV_INFO_FLAG_BIT (0)
207 #endif
208
209 /* btdm ble info */
210 #ifdef CFG_BLE_STACK
211 #define BTDM_INFO_LE_LTK_FLAG_BIT (0x01UL << 2)
212 #define BTDM_INFO_LE_LOC_IRK_FLAG_BIT (0x01UL << 3)
213 #define BTDM_INFO_LE_PERIPH_BONDED_FLAG_BIT (0x01UL << 4)
214 #define BTDM_INFO_LE_MOUSE_NTF_CFG_FLAG_BIT (0x01UL << 5)
215 #define BTDM_INFO_LE_RAND_ADDR_FLAG_BIT (0x01UL << 7)
216
217 #define BTDM_INFO_LE_FLAG_MASK (BTDM_INFO_LE_LTK_FLAG_BIT | BTDM_INFO_LE_LOC_IRK_FLAG_BIT | BTDM_INFO_LE_PERIPH_BONDED_FLAG_BIT \
218 | BTDM_INFO_LE_MOUSE_NTF_CFG_FLAG_BIT | BTDM_INFO_LE_RAND_ADDR_FLAG_BIT)
219 #else
220 #define BTDM_INFO_LE_FLAG_MASK (0)
221 #endif //CFG_BLE_STACK
222
223 #ifndef min
224 #define min(a,b) (((a) < (b)) ? (a) : (b))
225 #endif
226
227 unsigned int flash_size = 0;
228 int sys_info_inited = 0;
229 unsigned int sys_info_flash_addr = 0;
230
231 /* btdm pre-read into ram for now */
232 int btdm_info_inited = 0;
233 btdm_info_t btdm_info_ram = {0,};
234
235 /* user data */
236 unsigned int user_data_flash_addr = 0;
237 unsigned int user_data_flash_length = 0;
238
239 #if PLF_BT_STACK == 1
240 static void flash_btdm_bt_dev_init(bt_flash_info_t* bt_info);
241 #endif
242
flash_sys_info_init(void)243 void flash_sys_info_init(void)
244 {
245 // read sys info from flash
246 if (!flash_size) {
247 flash_size = flash_chip_size_get();
248 }
249 if (!sys_info_flash_addr) {
250 sys_info_flash_addr = FLASH_BASE_ADDR + flash_size - FLASH_RESERVED_SECTOR_CNT * FLASH_SECTOR_SIZE;
251 }
252 sys_info_inited = 1;
253 }
254
255 // calib info is read only
flash_calib_info_read(unsigned int flag,void * buf,unsigned int len)256 int flash_calib_info_read(unsigned int flag, void *buf, unsigned int len)
257 {
258 unsigned int info_flag_bits;
259 calib_info_t calib_info;
260 int index = 0;
261 if (!sys_info_inited) {
262 flash_sys_info_init();
263 }
264 flash_read((void *)(sys_info_flash_addr + FLASH_CALIB_INFO_OFFSET), sizeof(calib_info_t), (void *)&calib_info);
265 if (calib_info.magic_num == FLASH_CALIB_INFO_MAGIC_NUM) {
266 info_flag_bits = flag & calib_info.info_flag;
267 if(info_flag_bits == 0) {
268 return INFO_FLAG_INVALID;
269 }
270 if (info_flag_bits & CALIB_INFO_XTAL_CAP_FLAG_BIT) {
271 memcpy((char *)buf + index, &calib_info.xtal, sizeof(calib_info.xtal));
272 index += sizeof(calib_info.xtal);
273 }
274 if (info_flag_bits & CALIB_INFO_WIFI2G4_TXPWR_FLAG_BIT) {
275 memcpy((char *)buf + index, &calib_info.wifi2g4_txpwr, sizeof(calib_info.wifi2g4_txpwr));
276 index += sizeof(calib_info.wifi2g4_txpwr);
277 }
278 if (info_flag_bits & CALIB_INFO_WIFI5G_TXPWR_FLAG_BIT) {
279 memcpy((char *)buf + index, &calib_info.wifi5g_txpwr, sizeof(calib_info.wifi5g_txpwr));
280 index += sizeof(calib_info.wifi5g_txpwr);
281 }
282 if (index > len) {
283 return INFO_LEN_ERR;
284 }
285 } else {
286 return MAGIC_NUM_ERR;
287 }
288 return INFO_READ_DONE;
289 }
290
flash_calib_xtal_cap_read(xtal_cap_info_t * xtal_cap)291 int flash_calib_xtal_cap_read(xtal_cap_info_t *xtal_cap)
292 {
293 return flash_calib_info_read(CALIB_INFO_XTAL_CAP_FLAG_BIT, (void *)xtal_cap, sizeof(xtal_cap_info_t));
294 }
295
flash_calib_wifi2g4_txpwr_read(wifi_txpwr_info_t * txpwr)296 int flash_calib_wifi2g4_txpwr_read(wifi_txpwr_info_t *txpwr)
297 {
298 return flash_calib_info_read(CALIB_INFO_WIFI2G4_TXPWR_FLAG_BIT, (void *)txpwr, sizeof(wifi_txpwr_info_t));
299 }
300
flash_calib_wifi5g_txpwr_read(wifi_txpwr_info_t * txpwr)301 int flash_calib_wifi5g_txpwr_read(wifi_txpwr_info_t *txpwr)
302 {
303 return flash_calib_info_read(CALIB_INFO_WIFI5G_TXPWR_FLAG_BIT, (void *)txpwr, sizeof(wifi_txpwr_info_t));
304 }
305
flash_wifi_info_read(unsigned int flag,void * buf,unsigned int len)306 int flash_wifi_info_read(unsigned int flag, void *buf, unsigned int len)
307 {
308 unsigned int info_flag_bits;
309 wifi_info_t wifi_info;
310 int index = 0;
311 if (!sys_info_inited) {
312 flash_sys_info_init();
313 }
314 flash_read((void *)(sys_info_flash_addr + FLASH_WIFI_INFO_OFFSET), sizeof(wifi_info_t), (void *)&wifi_info);
315 if (wifi_info.magic_num == FLASH_WIFI_INFO_MAGIC_NUM) {
316 info_flag_bits = flag & wifi_info.info_flag;
317 if(info_flag_bits == 0) {
318 return INFO_FLAG_INVALID;
319 }
320 if (info_flag_bits & WIFI_INFO_STA_CONFIG_FLAG_BIT) {
321 //memcpy((char *)buf + index, &wifi_info.sta_info.config, sizeof(wifi_info.sta_info.config));
322 *(unsigned int *)((char *)buf + index) = wifi_info.sta_info.config;
323 index += sizeof(wifi_info.sta_info.config);
324 }
325 if (info_flag_bits & WIFI_INFO_STA_MACADDR_FLAG_BIT) {
326 memcpy((char *)buf + index, &wifi_info.sta_info.mac_addr, sizeof(wifi_info.sta_info.mac_addr));
327 index += sizeof(wifi_info.sta_info.mac_addr);
328 }
329 if (info_flag_bits & WIFI_INFO_STA_SSIDPW_FLAG_BIT) {
330 memcpy((char *)buf + index, &wifi_info.sta_info.ssidpw, sizeof(wifi_info.sta_info.ssidpw));
331 index += sizeof(wifi_info.sta_info.ssidpw);
332 }
333 if (info_flag_bits & WIFI_INFO_AP_CONFIG_FLAG_BIT) {
334 //memcpy((char *)buf + index, &wifi_info.ap_info.config, sizeof(wifi_info.ap_info.config));
335 *(unsigned int *)((char *)buf + index) = wifi_info.ap_info.config;
336 index += sizeof(wifi_info.ap_info.config);
337 }
338 if (info_flag_bits & WIFI_INFO_AP_MACADDR_FLAG_BIT) {
339 memcpy((char *)buf + index, &wifi_info.ap_info.mac_addr, sizeof(wifi_info.ap_info.mac_addr));
340 index += sizeof(wifi_info.ap_info.mac_addr);
341 }
342 if (info_flag_bits & WIFI_INFO_AP_SSIDPW_FLAG_BIT) {
343 memcpy((char *)buf + index, &wifi_info.ap_info.ssidpw, sizeof(wifi_info.ap_info.ssidpw));
344 index += sizeof(wifi_info.ap_info.ssidpw);
345 }
346 if (info_flag_bits & WIFI_INFO_AP_CHANNEL_FLAG_BIT) {
347 memcpy((char *)buf + index, &wifi_info.ap_info.channel, sizeof(wifi_info.ap_info.channel));
348 index += sizeof(wifi_info.ap_info.channel);
349 }
350 if (info_flag_bits & WIFI_INFO_LWIP_CONFIG_FLAG_BIT) {
351 //memcpy((char *)buf + index, &wifi_info.lwip_info.config, sizeof(wifi_info.lwip_info.config));
352 *(unsigned int *)((char *)buf + index) = wifi_info.lwip_info.config;
353 index += sizeof(wifi_info.lwip_info.config);
354 }
355 if (info_flag_bits & WIFI_INFO_LWIP_DHCPS_FLAG_BIT) {
356 memcpy((char *)buf + index, &wifi_info.lwip_info.dhcps, sizeof(wifi_info.lwip_info.dhcps));
357 index += sizeof(wifi_info.lwip_info.dhcps);
358 }
359 if (info_flag_bits & WIFI_INFO_LWIP_DNS_FLAG_BIT) {
360 //memcpy((char *)buf + index, &wifi_info.lwip_info.dns_server, sizeof(wifi_info.lwip_info.dns_server));
361 *(unsigned int *)((char *)buf + index) = wifi_info.lwip_info.dns_server;
362 index += sizeof(wifi_info.lwip_info.dns_server);
363 }
364 if (info_flag_bits & WIFI_INFO_LWIP_SNTP_FLAG_BIT) {
365 memcpy((char *)buf + index, &wifi_info.lwip_info.sntp, sizeof(wifi_info.lwip_info.sntp));
366 index += sizeof(wifi_info.lwip_info.sntp);
367 }
368 if (index > len) {
369 return INFO_LEN_ERR;
370 }
371 } else {
372 return MAGIC_NUM_ERR;
373 }
374 return INFO_READ_DONE;
375 }
376
flash_wifi_info_write(unsigned int flag,const void * buf,unsigned int len)377 void flash_wifi_info_write(unsigned int flag, const void *buf, unsigned int len)
378 {
379 wifi_info_t wifi_info;
380 int index = 0;
381 if (!sys_info_inited) {
382 flash_sys_info_init();
383 }
384 flash_read((void *)(sys_info_flash_addr + FLASH_WIFI_INFO_OFFSET), sizeof(wifi_info_t), (void *)&wifi_info);
385 if (wifi_info.magic_num != FLASH_WIFI_INFO_MAGIC_NUM) {
386 memset(&wifi_info, 0xFF, sizeof(wifi_info_t));
387 wifi_info.magic_num = FLASH_WIFI_INFO_MAGIC_NUM;
388 wifi_info.info_flag = 0;
389 wifi_info.sta_info.config = 0;
390 wifi_info.ap_info.config = 0;
391 wifi_info.lwip_info.config = 0;
392 }
393 wifi_info.info_flag |= flag;
394 if (flag & WIFI_INFO_STA_CONFIG_FLAG_BIT) {
395 //memcpy(&wifi_info.sta_info.config, (char *)buf + index, sizeof(wifi_info.sta_info.config));
396 wifi_info.sta_info.config = *(unsigned int *)((char *)buf + index);
397 index += sizeof(wifi_info.sta_info.config);
398 }
399 if (flag & WIFI_INFO_STA_MACADDR_FLAG_BIT) {
400 memcpy(&wifi_info.sta_info.mac_addr, (char *)buf + index, sizeof(wifi_info.sta_info.mac_addr));
401 index += sizeof(wifi_info.sta_info.mac_addr);
402 }
403 if (flag & WIFI_INFO_STA_SSIDPW_FLAG_BIT) {
404 memcpy(&wifi_info.sta_info.ssidpw, (char *)buf + index, sizeof(wifi_info.sta_info.ssidpw));
405 index += sizeof(wifi_info.sta_info.ssidpw);
406 }
407 if (flag & WIFI_INFO_AP_CONFIG_FLAG_BIT) {
408 //memcpy(&wifi_info.ap_info.config, (char *)buf + index, sizeof(wifi_info.ap_info.config));
409 wifi_info.ap_info.config = *(unsigned int *)((char *)buf + index);
410 index += sizeof(wifi_info.ap_info.config);
411 }
412 if (flag & WIFI_INFO_AP_MACADDR_FLAG_BIT) {
413 memcpy(&wifi_info.ap_info.mac_addr, (char *)buf + index, sizeof(wifi_info.ap_info.mac_addr));
414 index += sizeof(wifi_info.ap_info.mac_addr);
415 }
416 if (flag & WIFI_INFO_AP_SSIDPW_FLAG_BIT) {
417 memcpy(&wifi_info.ap_info.ssidpw, (char *)buf + index, sizeof(wifi_info.ap_info.ssidpw));
418 index += sizeof(wifi_info.ap_info.ssidpw);
419 }
420 if (flag & WIFI_INFO_AP_CHANNEL_FLAG_BIT) {
421 memcpy(&wifi_info.ap_info.channel, (char *)buf + index, sizeof(wifi_info.ap_info.channel));
422 index += sizeof(wifi_info.ap_info.channel);
423 }
424 if (flag & WIFI_INFO_LWIP_CONFIG_FLAG_BIT) {
425 //memcpy(&wifi_info.lwip_info.config, (char *)buf + index, sizeof(wifi_info.lwip_info.config));
426 wifi_info.lwip_info.config = *(unsigned int *)((char *)buf + index);
427 index += sizeof(wifi_info.lwip_info.config);
428 }
429 if (flag & WIFI_INFO_LWIP_DHCPS_FLAG_BIT) {
430 memcpy(&wifi_info.lwip_info.dhcps, (char *)buf + index, sizeof(wifi_info.lwip_info.dhcps));
431 index += sizeof(wifi_info.lwip_info.dhcps);
432 }
433 if (flag & WIFI_INFO_LWIP_DNS_FLAG_BIT) {
434 //memcpy(&wifi_info.lwip_info.dns_server, (char *)buf + index, sizeof(wifi_info.lwip_info.dns_server));
435 wifi_info.lwip_info.dns_server = *(unsigned int *)((char *)buf + index);
436 index += sizeof(wifi_info.lwip_info.dns_server);
437 }
438 if (flag & WIFI_INFO_LWIP_SNTP_FLAG_BIT) {
439 memcpy(&wifi_info.lwip_info.sntp, (char *)buf + index, sizeof(wifi_info.lwip_info.sntp));
440 index += sizeof(wifi_info.lwip_info.sntp);
441 }
442 if (index > len) {
443 dbg("flash_wifi_info_write: len err\r\n");
444 }
445 flash_erase((void *)(sys_info_flash_addr + FLASH_WIFI_INFO_OFFSET), sizeof(wifi_info_t));
446 flash_write((void *)(sys_info_flash_addr + FLASH_WIFI_INFO_OFFSET), sizeof(wifi_info_t), &wifi_info);
447 flash_cache_invalid_range((void *)(sys_info_flash_addr + FLASH_WIFI_INFO_OFFSET), sizeof(wifi_info_t));
448 }
449
flash_wifi_info_remove(unsigned int flag)450 void flash_wifi_info_remove(unsigned int flag)
451 {
452 unsigned int info_flag_bits;
453 wifi_info_t wifi_info;
454 int need_update = 0;
455 if (!sys_info_inited) {
456 flash_sys_info_init();
457 }
458 flash_read((void *)(sys_info_flash_addr + FLASH_WIFI_INFO_OFFSET), sizeof(wifi_info_t), (void *)&wifi_info);
459 if (wifi_info.magic_num != FLASH_WIFI_INFO_MAGIC_NUM) {
460 memset(&wifi_info, 0xFF, sizeof(wifi_info_t));
461 wifi_info.magic_num = FLASH_WIFI_INFO_MAGIC_NUM;
462 wifi_info.info_flag = 0;
463 wifi_info.sta_info.config = 0;
464 wifi_info.ap_info.config = 0;
465 wifi_info.lwip_info.config = 0;
466 need_update = 1;
467 } else {
468 info_flag_bits = flag & wifi_info.info_flag;
469 if (info_flag_bits) {
470 need_update = 1;
471 wifi_info.info_flag &= ~info_flag_bits;
472 if (info_flag_bits & WIFI_INFO_STA_CONFIG_FLAG_BIT) {
473 wifi_info.sta_info.config = 0;
474 }
475 if (info_flag_bits & WIFI_INFO_STA_MACADDR_FLAG_BIT) {
476 memset(&wifi_info.sta_info.mac_addr, 0xFF, sizeof(wifi_info.sta_info.mac_addr));
477 }
478 if (info_flag_bits & WIFI_INFO_STA_SSIDPW_FLAG_BIT) {
479 memset(&wifi_info.sta_info.ssidpw, 0xFF, sizeof(wifi_info.sta_info.ssidpw));
480 }
481 if (info_flag_bits & WIFI_INFO_AP_CONFIG_FLAG_BIT) {
482 wifi_info.ap_info.config = 0;
483 }
484 if (info_flag_bits & WIFI_INFO_AP_MACADDR_FLAG_BIT) {
485 memset(&wifi_info.ap_info.mac_addr, 0xFF, sizeof(wifi_info.ap_info.mac_addr));
486 }
487 if (info_flag_bits & WIFI_INFO_AP_SSIDPW_FLAG_BIT) {
488 memset(&wifi_info.ap_info.ssidpw, 0xFF, sizeof(wifi_info.ap_info.ssidpw));
489 }
490 if (info_flag_bits & WIFI_INFO_AP_CHANNEL_FLAG_BIT) {
491 memset(&wifi_info.ap_info.channel, 0xFF, sizeof(wifi_info.ap_info.channel));
492 }
493 if (info_flag_bits & WIFI_INFO_LWIP_CONFIG_FLAG_BIT) {
494 wifi_info.lwip_info.config = 0;
495 }
496 if (info_flag_bits & WIFI_INFO_LWIP_DHCPS_FLAG_BIT) {
497 memset(&wifi_info.lwip_info.dhcps, 0xFF, sizeof(wifi_info.lwip_info.dhcps));
498 }
499 if (info_flag_bits & WIFI_INFO_LWIP_DNS_FLAG_BIT) {
500 memset(&wifi_info.lwip_info.dns_server, 0xFF, sizeof(wifi_info.lwip_info.dns_server));
501 }
502 if (info_flag_bits & WIFI_INFO_LWIP_SNTP_FLAG_BIT) {
503 memset(&wifi_info.lwip_info.sntp, 0xFF, sizeof(wifi_info.lwip_info.sntp));
504 }
505 }
506 }
507 if (need_update) {
508 flash_erase((void *)(sys_info_flash_addr + FLASH_WIFI_INFO_OFFSET), sizeof(wifi_info_t));
509 flash_write((void *)(sys_info_flash_addr + FLASH_WIFI_INFO_OFFSET), sizeof(wifi_info_t), &wifi_info);
510 flash_cache_invalid_range((void *)(sys_info_flash_addr + FLASH_WIFI_INFO_OFFSET), sizeof(wifi_info_t));
511 }
512 }
513
flash_wifi_sta_config_read(unsigned int * config)514 int flash_wifi_sta_config_read(unsigned int *config)
515 {
516 return flash_wifi_info_read(WIFI_INFO_STA_CONFIG_FLAG_BIT, (void *)config, sizeof(unsigned int));
517 }
518
flash_wifi_sta_config_write(unsigned int * config)519 void flash_wifi_sta_config_write(unsigned int *config)
520 {
521 flash_wifi_info_write(WIFI_INFO_STA_CONFIG_FLAG_BIT, (void *)config, sizeof(unsigned int));
522 }
523
flash_wifi_sta_macaddr_read(unsigned char * addr)524 int flash_wifi_sta_macaddr_read(unsigned char *addr)
525 {
526 return flash_wifi_info_read(WIFI_INFO_STA_MACADDR_FLAG_BIT, (void *)addr, 6);
527 }
528
flash_wifi_sta_macaddr_write(unsigned char * addr)529 void flash_wifi_sta_macaddr_write(unsigned char *addr)
530 {
531 flash_wifi_info_write(WIFI_INFO_STA_MACADDR_FLAG_BIT, (void *)addr, 6);
532 }
533
flash_wifi_sta_ssidpw_read(char * ssid,char * pass)534 int flash_wifi_sta_ssidpw_read(char *ssid, char *pass)
535 {
536 wifi_ssidpw_t ssid_pw;
537 int ret = flash_wifi_info_read(WIFI_INFO_STA_SSIDPW_FLAG_BIT, (void *)&ssid_pw, sizeof(wifi_ssidpw_t));
538 if (!ret) {
539 memcpy(ssid, ssid_pw.ssid, min((strlen(ssid_pw.ssid) + 1), sizeof(ssid_pw.ssid)));
540 if (ssid_pw.passwd[0] != '\0') {
541 memcpy(pass, ssid_pw.passwd, min((strlen(ssid_pw.passwd) + 1), sizeof(ssid_pw.passwd)));
542 } else {
543 pass[0] = '\0';
544 }
545 }
546 return ret;
547 }
548
flash_wifi_sta_ssidpw_write(char * ssid,char * pass)549 void flash_wifi_sta_ssidpw_write(char *ssid, char *pass)
550 {
551 wifi_ssidpw_t ssid_pw = {{'\0',},{'\0',}};
552 memcpy(ssid_pw.ssid, ssid, min((strlen(ssid) + 1), sizeof(ssid_pw.ssid)));
553 if (pass[0] != '\0') {
554 memcpy(ssid_pw.passwd, pass, min((strlen(pass) + 1), sizeof(ssid_pw.passwd)));
555 }
556 flash_wifi_info_write(WIFI_INFO_STA_SSIDPW_FLAG_BIT, (void *)&ssid_pw, sizeof(wifi_ssidpw_t));
557 }
558
flash_wifi_ap_config_read(unsigned int * config)559 int flash_wifi_ap_config_read(unsigned int *config)
560 {
561 return flash_wifi_info_read(WIFI_INFO_AP_CONFIG_FLAG_BIT, (void *)config, sizeof(unsigned int));
562 }
563
flash_wifi_ap_config_write(unsigned int * config)564 void flash_wifi_ap_config_write(unsigned int *config)
565 {
566 flash_wifi_info_write(WIFI_INFO_AP_CONFIG_FLAG_BIT, (void *)config, sizeof(unsigned int));
567 }
568
flash_wifi_ap_macaddr_read(unsigned char * addr)569 int flash_wifi_ap_macaddr_read(unsigned char *addr)
570 {
571 return flash_wifi_info_read(WIFI_INFO_AP_MACADDR_FLAG_BIT, (void *)addr, 6);
572 }
573
flash_wifi_ap_macaddr_write(unsigned char * addr)574 void flash_wifi_ap_macaddr_write(unsigned char *addr)
575 {
576 flash_wifi_info_write(WIFI_INFO_AP_MACADDR_FLAG_BIT, (void *)addr, 6);
577 }
578
flash_wifi_ap_ssidpw_read(char * ssid,char * pass)579 int flash_wifi_ap_ssidpw_read(char *ssid, char *pass)
580 {
581 wifi_ssidpw_t ssid_pw;
582 int ret = flash_wifi_info_read(WIFI_INFO_AP_SSIDPW_FLAG_BIT, (void *)&ssid_pw, sizeof(wifi_ssidpw_t));
583 if (!ret) {
584 memcpy(ssid, ssid_pw.ssid, min((strlen(ssid_pw.ssid) + 1), sizeof(ssid_pw.ssid)));
585 if (ssid_pw.passwd[0] != '\0') {
586 memcpy(pass, ssid_pw.passwd, min((strlen(ssid_pw.passwd) + 1), sizeof(ssid_pw.passwd)));
587 } else {
588 pass[0] = '\0';
589 }
590 }
591 return ret;
592 }
593
flash_wifi_ap_ssidpw_write(char * ssid,char * pass)594 void flash_wifi_ap_ssidpw_write(char *ssid, char *pass)
595 {
596 wifi_ssidpw_t ssid_pw = {{'\0',},{'\0',}};
597 memcpy(ssid_pw.ssid, ssid, min((strlen(ssid) + 1), sizeof(ssid_pw.ssid)));
598 if (pass[0] != '\0') {
599 memcpy(ssid_pw.passwd, pass, min((strlen(pass) + 1), sizeof(ssid_pw.passwd)));
600 }
601 flash_wifi_info_write(WIFI_INFO_AP_SSIDPW_FLAG_BIT, (void *)&ssid_pw, sizeof(wifi_ssidpw_t));
602 }
603
flash_wifi_ap_channel_read(unsigned int * channel)604 int flash_wifi_ap_channel_read(unsigned int *channel)
605 {
606 return flash_wifi_info_read(WIFI_INFO_AP_CHANNEL_FLAG_BIT, (void *)channel, sizeof(unsigned int));
607 }
608
flash_wifi_ap_channel_write(unsigned int channel)609 void flash_wifi_ap_channel_write(unsigned int channel)
610 {
611 flash_wifi_info_write(WIFI_INFO_AP_CHANNEL_FLAG_BIT, (void *)&channel, sizeof(unsigned int));
612 }
613
flash_wifi_lwip_config_read(unsigned int * config)614 int flash_wifi_lwip_config_read(unsigned int *config)
615 {
616 return flash_wifi_info_read(WIFI_INFO_LWIP_CONFIG_FLAG_BIT, (void *)config, sizeof(unsigned int));
617 }
618
flash_wifi_lwip_config_write(unsigned int * config)619 void flash_wifi_lwip_config_write(unsigned int *config)
620 {
621 flash_wifi_info_write(WIFI_INFO_LWIP_CONFIG_FLAG_BIT, (void *)config, sizeof(unsigned int));
622 }
623
flash_wifi_lwip_dhcps_read(unsigned int * lease_time,unsigned int * dhcp_start,unsigned int * dhcp_end)624 int flash_wifi_lwip_dhcps_read(unsigned int *lease_time, unsigned int *dhcp_start, unsigned int *dhcp_end)
625 {
626 wifi_lwip_dhcps_t dhcps;
627 int ret = flash_wifi_info_read(WIFI_INFO_LWIP_DHCPS_FLAG_BIT, (void *)&dhcps, sizeof(wifi_lwip_dhcps_t));
628 if (!ret) {
629 *lease_time = dhcps.lease_time;
630 *dhcp_start = dhcps.dhcp_start;
631 *dhcp_end = dhcps.dhcp_end;
632 }
633 return ret;
634 }
635
flash_wifi_lwip_dhcps_write(unsigned int lease_time,unsigned int dhcp_start,unsigned int dhcp_end)636 void flash_wifi_lwip_dhcps_write(unsigned int lease_time, unsigned int dhcp_start, unsigned int dhcp_end)
637 {
638 wifi_lwip_dhcps_t dhcps;
639 dhcps.lease_time = lease_time;
640 dhcps.dhcp_start = dhcp_start;
641 dhcps.dhcp_end = dhcp_end;
642 flash_wifi_info_write(WIFI_INFO_LWIP_DHCPS_FLAG_BIT, (void *)&dhcps, sizeof(wifi_lwip_dhcps_t));
643 }
644
flash_wifi_lwip_dnsserv_read(unsigned int * dns_server)645 int flash_wifi_lwip_dnsserv_read(unsigned int *dns_server)
646 {
647 return flash_wifi_info_read(WIFI_INFO_LWIP_DNS_FLAG_BIT, (void *)dns_server, sizeof(unsigned int));
648 }
649
flash_wifi_lwip_dnsserv_write(unsigned int dns_server)650 void flash_wifi_lwip_dnsserv_write(unsigned int dns_server)
651 {
652 flash_wifi_info_write(WIFI_INFO_LWIP_DNS_FLAG_BIT, (void *)&dns_server, sizeof(unsigned int));
653 }
654
flash_wifi_lwip_sntp_read(signed int * time_zone)655 int flash_wifi_lwip_sntp_read(signed int *time_zone)
656 {
657 wifi_lwip_sntp_t sntp;
658 int ret = flash_wifi_info_read(WIFI_INFO_LWIP_SNTP_FLAG_BIT, (void *)&sntp, sizeof(wifi_lwip_sntp_t));
659 if (!ret) {
660 *time_zone = sntp.time_zone;
661 }
662 return ret;
663 }
664
flash_wifi_lwip_sntp_write(signed int time_zone)665 void flash_wifi_lwip_sntp_write(signed int time_zone)
666 {
667 wifi_lwip_sntp_t sntp;
668 sntp.time_zone = time_zone;
669 flash_wifi_info_write(WIFI_INFO_LWIP_SNTP_FLAG_BIT, (void *)&sntp, sizeof(wifi_lwip_sntp_t));
670 }
671
flash_wifi_info_remove_all(void)672 void flash_wifi_info_remove_all(void)
673 {
674 flash_wifi_info_remove(WIFI_INFO_FLAG_MASK);
675 }
676
flash_wifi_info_remove_ssidpw(void)677 void flash_wifi_info_remove_ssidpw(void)
678 {
679 flash_wifi_info_remove(WIFI_INFO_STA_SSIDPW_FLAG_BIT);
680 }
681
flash_strlen(unsigned char * str,unsigned char max_len)682 unsigned int flash_strlen(unsigned char *str, unsigned char max_len)
683 {
684 unsigned char len =0;
685 while(*str != 0xFF){
686 if(*str == 0x0)
687 break;
688 str++;
689 len++;
690 if(len == max_len)
691 break;
692 }
693 return len;
694 }
695
flash_btdm_info_init(void)696 void flash_btdm_info_init(void)
697 {
698 flash_read((void *)(sys_info_flash_addr + FLASH_BTDM_INFO_OFFSET), sizeof(btdm_info_t), &btdm_info_ram);
699 if (btdm_info_ram.magic_num != FLASH_BTDM_INFO_MAGIC_NUM) {
700 memset(&btdm_info_ram, 0xFF, sizeof(btdm_info_t));
701 btdm_info_ram.magic_num = FLASH_BTDM_INFO_MAGIC_NUM;
702 btdm_info_ram.info_flag = 0;
703 }
704 #if PLF_BT_STACK == 1
705 flash_btdm_bt_dev_init(&btdm_info_ram.bt_info);
706 #endif
707 btdm_info_inited = 1;
708 }
709
flash_btdm_info_read(unsigned int flag,void * buf,unsigned int len)710 int flash_btdm_info_read(unsigned int flag, void *buf, unsigned int len)
711 {
712 unsigned int info_flag_mux;
713 int index = 0;
714 if (!sys_info_inited) {
715 flash_sys_info_init();
716 }
717 if (!btdm_info_inited) {
718 flash_btdm_info_init();
719 }
720 if (btdm_info_ram.magic_num == FLASH_BTDM_INFO_MAGIC_NUM) {
721 info_flag_mux = flag & btdm_info_ram.info_flag;
722 if(info_flag_mux == 0) {
723 return INFO_FLAG_INVALID;
724 }
725 if (info_flag_mux & BTDM_INFO_BT_FACTORY_FLAG_BIT) {
726 memcpy(buf, &btdm_info_ram.bt_factory, sizeof(bt_factory_info_t));
727 index += sizeof(bt_factory_info_t);
728 }
729 #if PLF_BT_STACK
730 if (info_flag_mux & BTDM_INFO_BT_DEV_INFO_FLAG_BIT) {
731 memcpy(buf, &btdm_info_ram.bt_info, sizeof(bt_flash_info_t));
732 index += sizeof(bt_flash_info_t);
733 }
734 #endif
735 #ifdef CFG_BLE_STACK
736 if (info_flag_mux & BTDM_INFO_LE_LTK_FLAG_BIT) {
737 memcpy(buf, &btdm_info_ram.le_ltk, sizeof(gapc_ltk_t));
738 index += sizeof(gapc_ltk_t);
739 }
740 if (info_flag_mux & BTDM_INFO_LE_LOC_IRK_FLAG_BIT) {
741 memcpy(buf, &btdm_info_ram.loc_irk, LOC_KEY_LEN);
742 index += LOC_KEY_LEN;
743 }
744 if (info_flag_mux & BTDM_INFO_LE_PERIPH_BONDED_FLAG_BIT) {
745 memcpy(buf, &btdm_info_ram.bond_status, sizeof(uint8_t));
746 index += sizeof(uint8_t);
747 }
748 if (info_flag_mux & BTDM_INFO_LE_MOUSE_NTF_CFG_FLAG_BIT) {
749 memcpy(buf, &btdm_info_ram.ntf_cfg, sizeof(uint16_t));
750 index += sizeof(uint16_t);
751 }
752 if (info_flag_mux & BTDM_INFO_LE_RAND_ADDR_FLAG_BIT) {
753 memcpy(buf, &btdm_info_ram.ble_rand_add, sizeof(struct bd_addr));
754 index += sizeof(struct bd_addr);
755 }
756 #endif //CFG_BLE_STACK
757 if (index > len) {
758 return INFO_LEN_ERR;
759 }
760 }
761 else {
762 return MAGIC_NUM_ERR;
763 }
764 return INFO_READ_DONE;
765 }
766
flash_btdm_info_write(unsigned int flag,const void * buf,unsigned int len)767 void flash_btdm_info_write(unsigned int flag, const void *buf, unsigned int len)
768 {
769 int index = 0;
770 if (!sys_info_inited) {
771 flash_sys_info_init();
772 }
773 if (!btdm_info_inited) {
774 flash_btdm_info_init();
775 }
776 if (btdm_info_ram.magic_num != FLASH_BTDM_INFO_MAGIC_NUM) {
777 memset(&btdm_info_ram, 0xFF, sizeof(btdm_info_t));
778 btdm_info_ram.magic_num = FLASH_BTDM_INFO_MAGIC_NUM;
779 btdm_info_ram.info_flag = 0;
780 }
781 btdm_info_ram.info_flag |= flag;
782 if (flag & BTDM_INFO_BT_FACTORY_FLAG_BIT) {
783 memcpy(&btdm_info_ram.bt_factory, buf, sizeof(bt_factory_info_t));
784 index += sizeof(bt_factory_info_t);
785 }
786 #if PLF_BT_STACK
787 if (flag & BTDM_INFO_BT_DEV_INFO_FLAG_BIT) {
788 memcpy(&btdm_info_ram.bt_info, buf, sizeof(bt_flash_info_t));
789 index += sizeof(bt_flash_info_t);
790 }
791 #endif
792 #ifdef CFG_BLE_STACK
793 if (flag & BTDM_INFO_LE_LTK_FLAG_BIT) {
794 memcpy(&btdm_info_ram.le_ltk, buf, sizeof(gapc_ltk_t));
795 index += sizeof(gapc_ltk_t);
796 }
797 if (flag & BTDM_INFO_LE_LOC_IRK_FLAG_BIT) {
798 memcpy(&btdm_info_ram.loc_irk, buf, LOC_KEY_LEN);
799 index += sizeof(LOC_KEY_LEN);
800 }
801 if (flag & BTDM_INFO_LE_PERIPH_BONDED_FLAG_BIT) {
802 memcpy(&btdm_info_ram.bond_status, buf, sizeof(uint8_t));
803 index += sizeof(uint8_t);
804 }
805 if (flag & BTDM_INFO_LE_MOUSE_NTF_CFG_FLAG_BIT) {
806 memcpy(&btdm_info_ram.ntf_cfg, buf, sizeof(uint16_t));
807 index += sizeof(uint16_t);
808 }
809 if (flag & BTDM_INFO_LE_RAND_ADDR_FLAG_BIT) {
810 memcpy(&btdm_info_ram.ble_rand_add, buf, sizeof(struct bd_addr));
811 index += sizeof(struct bd_addr);
812 }
813 #endif // CFG_BLE_STACK
814 if (index > len) {
815 dbg("flash_btdm_info_write: len err\r\n");
816 }
817 flash_erase((void *)(sys_info_flash_addr + FLASH_BTDM_INFO_OFFSET), sizeof(btdm_info_t));
818 flash_write((void *)(sys_info_flash_addr + FLASH_BTDM_INFO_OFFSET), sizeof(btdm_info_t), &btdm_info_ram);
819 flash_cache_invalid_range((void *)(sys_info_flash_addr + FLASH_BTDM_INFO_OFFSET), sizeof(btdm_info_t));
820 }
821
flash_btdm_info_remove(unsigned int flag)822 void flash_btdm_info_remove(unsigned int flag)
823 {
824 if (!sys_info_inited) {
825 flash_sys_info_init();
826 }
827 if (!btdm_info_inited) {
828 flash_btdm_info_init();
829 }
830 if (btdm_info_ram.info_flag & flag) {
831 btdm_info_ram.info_flag &= ~flag;
832 if (flag & BTDM_INFO_BT_FACTORY_FLAG_BIT) {
833 memset(&btdm_info_ram.bt_factory, 0xFF, sizeof(bt_factory_info_t));
834 }
835 #if PLF_BT_STACK
836 if (flag & BTDM_INFO_BT_DEV_INFO_FLAG_BIT) {
837 memset(&btdm_info_ram.bt_info, 0xFF, sizeof(bt_flash_info_t));
838 }
839 #endif
840 #ifdef CFG_BLE_STACK
841 uint8_t dflt_addr[BD_ADDR_LEN] = {0xaa,0xc0,0x00,0x45,0x56,0x67};
842
843 if (flag & BTDM_INFO_LE_LTK_FLAG_BIT) {
844 memset(&btdm_info_ram.le_ltk, 0xFF, sizeof(gapc_ltk_t));
845 }
846 if (flag & BTDM_INFO_LE_LOC_IRK_FLAG_BIT) {
847 memset(&btdm_info_ram.loc_irk, 0xFF, LOC_KEY_LEN);
848 }
849 if (flag & BTDM_INFO_LE_PERIPH_BONDED_FLAG_BIT) {
850 memset(&btdm_info_ram.bond_status, 0xFF, sizeof(uint8_t));
851 }
852 if (flag & BTDM_INFO_LE_MOUSE_NTF_CFG_FLAG_BIT) {
853 memset(&btdm_info_ram.ntf_cfg, 0xFF, sizeof(uint16_t));
854 }
855 if (flag & BTDM_INFO_LE_RAND_ADDR_FLAG_BIT) {
856 memcpy(&btdm_info_ram.ble_rand_add[0], &dflt_addr[0], BD_ADDR_LEN);
857 }
858 #endif // CFG_BLE_STACK
859 flash_erase((void *)(sys_info_flash_addr + FLASH_BTDM_INFO_OFFSET), sizeof(btdm_info_t));
860 flash_write((void *)(sys_info_flash_addr + FLASH_BTDM_INFO_OFFSET), sizeof(btdm_info_t), &btdm_info_ram);
861 flash_cache_invalid_range((void *)(sys_info_flash_addr + FLASH_BTDM_INFO_OFFSET), sizeof(btdm_info_t));
862 }
863 }
864
flash_btdm_bt_factory_read(void * buf,unsigned int len)865 int flash_btdm_bt_factory_read(void *buf, unsigned int len)
866 {
867 return flash_btdm_info_read(BTDM_INFO_BT_FACTORY_FLAG_BIT, buf, len);
868 }
869
flash_btdm_bt_factory_write(const void * buf,unsigned int len)870 void flash_btdm_bt_factory_write(const void *buf, unsigned int len)
871 {
872 flash_btdm_info_write(BTDM_INFO_BT_FACTORY_FLAG_BIT, buf, len);
873 }
874
875 #if PLF_BT_STACK == 1
bt_initializeList(list_node_t * list)876 void bt_initializeList(list_node_t* list)
877 {
878 list->prev = list->next = list;
879 #ifdef FLASH_BT_TRACE_ON
880 TRACE("list = 0x%x ,list->prev = 0x%x ,list->next = 0x%x ,list->data = 0x%x\n",list,list->prev,list->next,list->data);
881 #endif
882 }
883
bt_insertTailList(list_node_t * tail,list_node_t * entry)884 void bt_insertTailList(list_node_t* tail, list_node_t* entry)
885 {
886 entry->prev = tail;
887 entry->next = tail->next;
888 tail->next->prev = entry;
889 tail->next = entry;
890 }
891
bt_insertHeadList(list_node_t * head,list_node_t * entry)892 void bt_insertHeadList(list_node_t* head, list_node_t* entry)
893 {
894 entry->prev = head->prev;
895 entry->next = head;
896 head->prev->next = entry;
897 head->prev = entry;
898 }
899
bt_removeNode(list_node_t * node)900 void bt_removeNode(list_node_t* node)
901 {
902 list_node_t* temp_node;
903
904 temp_node = node->next;
905 node->prev->next = temp_node;
906 temp_node->prev = node->prev;
907
908 node->next = node->prev = NULL;
909 }
910
bt_removeHeadNode(list_node_t * head)911 list_node_t* bt_removeHeadNode(list_node_t* head)
912 {
913 list_node_t* second;
914
915 second = head->next;
916 head->prev->next = second;
917 second->prev = head->prev;
918
919 head->next = head->prev = NULL;
920 return(second);
921 }
922
bt_removeHeadList(list_node_t * head)923 list_node_t* bt_removeHeadList(list_node_t* head)
924 {
925 list_node_t* first;
926
927 first = head->prev;
928 first->prev->next = head;
929 head->prev = first->prev;
930 return(first);
931 }
932
bt_listIsEmpty(list_node_t * head)933 bool bt_listIsEmpty(list_node_t *head)
934 {
935 return ((head->prev) == head);
936 }
937
flash_btdm_bt_dev_init(bt_flash_info_t * bt_info)938 static void flash_btdm_bt_dev_init(bt_flash_info_t* bt_info)
939 {
940 dbg("bt_info->init_need = 0x%x\n",bt_info->init_need);
941 if(bt_info->init_need != 0xee){
942 bt_info->flush_need = 1;
943 #if APP_SUPPORT_TWS == 1
944 bt_info->flash_tws_role = 2;
945 bt_info->ble_dev_info.addr_type = 0xff;
946 memset(bt_info->ble_dev_info.bleaddr.addr,0,6);
947 #endif
948 bt_info->bt_list.head = NULL;
949 bt_info->bt_list.length = 0;
950 for(uint8_t i = 0; i < MAX_BD_MUN; i++){
951 memset(&bt_info->bt_dev_info[i],0,sizeof(bt_dev_info_t));
952 bt_info->bt_dev_info[i].node.prev = NULL;
953 bt_info->bt_dev_info[i].node.next = NULL;
954 bt_info->bt_dev_info[i].node.data = (void *)&bt_info->bt_dev_info[i];
955 #ifdef FLASH_BT_TRACE_ON
956 dbg("0 bt_dev_info[].node.data = 0x%x\n",bt_info->bt_dev_info[i].node.data);
957 #endif
958 }
959 bt_info->init_need = 0xee;
960 }else{
961 for(uint8_t i = 0; i < MAX_BD_MUN; i++){
962 bt_info->bt_dev_info[i].node.data = (void *)&bt_info->bt_dev_info[i];
963 #ifdef FLASH_BT_TRACE_ON
964 dbg("1 bt_dev_info[].node.data = 0x%x ,node = 0x%x\n",bt_info->bt_dev_info[i].node.data,&bt_info->bt_dev_info[i].node);
965 #endif
966 }
967 }
968 #ifdef FLASH_BT_TRACE_ON
969 dbg("bt_info->init_need 2 = 0x%x,head = 0x%x,head->data = 0x%x,length = %d\n",bt_info->init_need,bt_info->bt_list.head,bt_info->bt_list.head->data,bt_info->bt_list.length);
970 #endif
971 }
972
flash_btdm_bt_info_read(unsigned int flag)973 bt_flash_info_t *flash_btdm_bt_info_read(unsigned int flag)
974 {
975 bt_flash_info_t * return_info = NULL;
976 if (!sys_info_inited) {
977 flash_sys_info_init();
978 }
979 if (!btdm_info_inited) {
980 flash_btdm_info_init();
981 }
982 if (btdm_info_ram.magic_num == FLASH_BTDM_INFO_MAGIC_NUM) {
983 if (flag & BTDM_INFO_BT_DEV_INFO_FLAG_BIT) {
984 #ifdef FLASH_BT_TRACE_ON
985 dbg("bt_info->init_need = 0x%x,len = %d ,head = 0x%x ,head->data = 0x%x\n",btdm_info_ram.bt_info.init_need,btdm_info_ram.bt_info.bt_list.length,btdm_info_ram.bt_info.bt_list.head,btdm_info_ram.bt_info.bt_list.head->data);
986 dbg("node = 0x%x ,node->data = 0x%x\n",&btdm_info_ram.bt_info.bt_dev_info[0].node,btdm_info_ram.bt_info.bt_dev_info[0].node.data);
987 #endif
988 return_info = &btdm_info_ram.bt_info;
989 }
990 }
991 return return_info;
992 }
993
flash_btdm_bt_info_write(unsigned int flag)994 void flash_btdm_bt_info_write(unsigned int flag)
995 {
996 if (!sys_info_inited) {
997 flash_sys_info_init();
998 }
999 if (!btdm_info_inited) {
1000 flash_btdm_info_init();
1001 }
1002 if (btdm_info_ram.magic_num != FLASH_BTDM_INFO_MAGIC_NUM) {
1003 memset(&btdm_info_ram, 0xFF, sizeof(btdm_info_t));
1004 btdm_info_ram.magic_num = FLASH_BTDM_INFO_MAGIC_NUM;
1005 btdm_info_ram.info_flag = 0;
1006 }
1007 btdm_info_ram.info_flag |= flag;
1008 if (flag & BTDM_INFO_BT_DEV_INFO_FLAG_BIT) {
1009 if(btdm_info_ram.bt_info.flush_need == 0) {
1010 return;
1011 } else {
1012 flash_btdm_bt_dev_init(&btdm_info_ram.bt_info);
1013 btdm_info_ram.bt_info.flush_need = 0;
1014 }
1015 }
1016 #ifdef FLASH_BT_TRACE_ON
1017 dbg("flash_write\n");
1018 #endif
1019 flash_erase((void *)(sys_info_flash_addr + FLASH_BTDM_INFO_OFFSET), sizeof(btdm_info_t));
1020 flash_write((void *)(sys_info_flash_addr + FLASH_BTDM_INFO_OFFSET), sizeof(btdm_info_t), &btdm_info_ram);
1021 flash_cache_invalid_range((void *)(sys_info_flash_addr + FLASH_BTDM_INFO_OFFSET), sizeof(btdm_info_t));
1022 }
1023
flash_btdm_bt_dev_read(void)1024 bt_flash_info_t * flash_btdm_bt_dev_read(void)
1025 {
1026 return flash_btdm_bt_info_read(BTDM_INFO_BT_DEV_INFO_FLAG_BIT);
1027 }
1028
flash_btdm_bt_dev_write(void)1029 void flash_btdm_bt_dev_write(void)
1030 {
1031 flash_btdm_bt_info_write(BTDM_INFO_BT_DEV_INFO_FLAG_BIT);
1032 }
1033
1034 #endif
1035 #ifdef CFG_BLE_STACK
flash_btdm_le_ltk_read(gapc_ltk_t * le_ltk)1036 int flash_btdm_le_ltk_read(gapc_ltk_t *le_ltk)
1037 {
1038 return flash_btdm_info_read(BTDM_INFO_LE_LTK_FLAG_BIT, le_ltk, sizeof(gapc_ltk_t));
1039 }
1040
flash_btdm_le_ltk_write(gapc_ltk_t * le_ltk)1041 void flash_btdm_le_ltk_write(gapc_ltk_t *le_ltk)
1042 {
1043 flash_btdm_info_write(BTDM_INFO_LE_LTK_FLAG_BIT, le_ltk, sizeof(gapc_ltk_t));
1044 }
1045
flash_btdm_le_ltk_remove(void)1046 void flash_btdm_le_ltk_remove(void)
1047 {
1048 flash_btdm_info_remove(BTDM_INFO_LE_LTK_FLAG_BIT);
1049 }
1050
flash_btdm_le_loc_irk_read(uint8_t * loc_irk)1051 int flash_btdm_le_loc_irk_read(uint8_t *loc_irk)
1052 {
1053 return flash_btdm_info_read(BTDM_INFO_LE_LOC_IRK_FLAG_BIT, loc_irk, sizeof(LOC_KEY_LEN));
1054 }
1055
flash_btdm_le_loc_irk_write(uint8_t * loc_irk)1056 void flash_btdm_le_loc_irk_write(uint8_t *loc_irk)
1057 {
1058 flash_btdm_info_write(BTDM_INFO_LE_LOC_IRK_FLAG_BIT, loc_irk, sizeof(LOC_KEY_LEN));
1059 }
1060
flash_btdm_le_loc_irk_remove(void)1061 void flash_btdm_le_loc_irk_remove(void)
1062 {
1063 flash_btdm_info_remove(BTDM_INFO_LE_LOC_IRK_FLAG_BIT);
1064 }
1065
flash_btdm_le_periph_bonded_read(uint8_t * bond_status)1066 int flash_btdm_le_periph_bonded_read(uint8_t *bond_status)
1067 {
1068 return flash_btdm_info_read(BTDM_INFO_LE_PERIPH_BONDED_FLAG_BIT, bond_status, sizeof(uint8_t));
1069 }
1070
flash_btdm_le_periph_bonded_write(uint8_t * bond_status)1071 void flash_btdm_le_periph_bonded_write(uint8_t *bond_status)
1072 {
1073 flash_btdm_info_write(BTDM_INFO_LE_PERIPH_BONDED_FLAG_BIT, bond_status, sizeof(uint8_t));
1074 }
1075
flash_btdm_le_periph_bonded_remove(void)1076 void flash_btdm_le_periph_bonded_remove(void)
1077 {
1078 flash_btdm_info_remove(BTDM_INFO_LE_PERIPH_BONDED_FLAG_BIT);
1079 }
1080
flash_btdm_le_mouse_ntf_cfg_read(uint8_t * ntf_cfg)1081 int flash_btdm_le_mouse_ntf_cfg_read(uint8_t *ntf_cfg)
1082 {
1083 return flash_btdm_info_read(BTDM_INFO_LE_MOUSE_NTF_CFG_FLAG_BIT, ntf_cfg, sizeof(uint16_t));
1084 }
1085
flash_btdm_le_mouse_ntf_cfg_write(uint8_t * ntf_cfg)1086 void flash_btdm_le_mouse_ntf_cfg_write(uint8_t *ntf_cfg)
1087 {
1088 flash_btdm_info_write(BTDM_INFO_LE_MOUSE_NTF_CFG_FLAG_BIT, ntf_cfg, sizeof(uint16_t));
1089 }
1090
flash_btdm_le_mouse_ntf_cfg_remove(void)1091 void flash_btdm_le_mouse_ntf_cfg_remove(void)
1092 {
1093 flash_btdm_info_remove(BTDM_INFO_LE_MOUSE_NTF_CFG_FLAG_BIT);
1094 }
1095
flash_btdm_le_info_remove_all(void)1096 void flash_btdm_le_info_remove_all(void)
1097 {
1098 flash_btdm_info_remove(BTDM_INFO_LE_FLAG_MASK);
1099 }
1100
flash_btdm_le_rand_addr_read(uint8_t * le_addr)1101 int flash_btdm_le_rand_addr_read(uint8_t *le_addr)
1102 {
1103 return flash_btdm_info_read(BTDM_INFO_LE_RAND_ADDR_FLAG_BIT, le_addr, sizeof(struct bd_addr));
1104 }
1105
flash_btdm_le_rand_addr_write(uint8_t * le_addr)1106 void flash_btdm_le_rand_addr_write(uint8_t *le_addr)
1107 {
1108 flash_btdm_info_write(BTDM_INFO_LE_RAND_ADDR_FLAG_BIT, le_addr, sizeof(struct bd_addr));
1109 }
1110
flash_btdm_le_rand_addr_remove(void)1111 void flash_btdm_le_rand_addr_remove(void)
1112 {
1113 flash_btdm_info_remove(BTDM_INFO_LE_RAND_ADDR_FLAG_BIT);
1114 }
1115 #endif //CFG_BLE_STACK
1116
flash_user_data_addr_length_set(unsigned int addr,unsigned int len)1117 int flash_user_data_addr_length_set(unsigned int addr, unsigned int len)
1118 {
1119 if (!flash_size) {
1120 flash_size = flash_chip_size_get();
1121 }
1122 if (addr & (FLASH_SECTOR_SIZE - 1)) {
1123 return -1;
1124 }
1125 if (addr < FLASH_BASE_ADDR) {
1126 return -2;
1127 }
1128 if ((addr + len) > (FLASH_BASE_ADDR + flash_size - FLASH_RESERVED_SECTOR_CNT * FLASH_SECTOR_SIZE)) {
1129 return -3;
1130 }
1131 user_data_flash_addr = addr;
1132 user_data_flash_length = len;
1133 return 0;
1134 }
1135
flash_user_data_read(void * buf,unsigned int len)1136 int flash_user_data_read(void *buf, unsigned int len)
1137 {
1138 int ret = 0;
1139 if (user_data_flash_addr && user_data_flash_length) {
1140 unsigned int length = min(len, user_data_flash_length);
1141 flash_read((void *)user_data_flash_addr, length, buf);
1142 } else {
1143 ret = -1;
1144 }
1145 return ret;
1146 }
1147
flash_user_data_write(void * buf,unsigned int len)1148 int flash_user_data_write(void *buf, unsigned int len)
1149 {
1150 int ret = 0;
1151 if (user_data_flash_addr && user_data_flash_length) {
1152 unsigned int length = min(len, user_data_flash_length);
1153 flash_erase((void *)user_data_flash_addr, length);
1154 flash_write((void *)user_data_flash_addr, length, buf);
1155 flash_cache_invalid_range((void *)user_data_flash_addr, length);
1156 } else {
1157 ret = -1;
1158 }
1159 return ret;
1160 }
1161