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