fs.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  1. /**
  2. * @file
  3. * @author chipsea
  4. * @brief
  5. * @version 0.1
  6. * @date 2020-11-30
  7. * @copyright Copyright (c) 2020, CHIPSEA Co., Ltd.
  8. * @note
  9. */
  10. /*******************************************************************************
  11. * @file fs.c
  12. * @brief Contains all functions support for spi driver
  13. * @version 0.0
  14. * @date 18. Oct. 2017
  15. * @author
  16. *
  17. *
  18. *******************************************************************************/
  19. #include "sdk_config.h"
  20. #include "rom_sym_def.h"
  21. #include "osal.h"
  22. #include "fs.h"
  23. #include "flash.h"
  24. #include "error.h"
  25. #include "log.h"
  26. //#define FS_DBBUG
  27. #ifdef FS_DBBUG
  28. #define FS_LOG LOG
  29. #else
  30. #define FS_LOG(...)
  31. #endif
  32. static uint8_t fs_sector_num;
  33. static uint32_t fs_offset_address;
  34. #define FS_ITEM_LEN_16BYTE 0
  35. #define FS_ITEM_LEN_32BYTE 1
  36. #define FS_ITEM_LEN_64BYTE 2
  37. #ifndef FS_SETTING
  38. #define FS_SETTING FS_ITEM_LEN_16BYTE
  39. #endif
  40. #if (FS_SETTING == FS_ITEM_LEN_16BYTE)
  41. #define FS_ITEM_LEN 16
  42. #elif (FS_SETTING == FS_ITEM_LEN_32BYTE)
  43. #define FS_ITEM_LEN 32
  44. #elif (FS_SETTING == FS_ITEM_LEN_64BYTE)
  45. #define FS_ITEM_LEN 64
  46. #else
  47. #error please check your config parameter
  48. #endif
  49. /*
  50. fs struct:
  51. sector0
  52. sector_head
  53. file_head(4byte)+file_data
  54. ...
  55. file_head(4byte)+file_data
  56. */
  57. //please do not modify the following parameters
  58. #define FS_ITEM_HEAD_LEN 4
  59. #define FS_ITEM_DATA_LEN (FS_ITEM_LEN - FS_ITEM_HEAD_LEN)
  60. #define FS_SECTOR_ITEM_NUM (4096/FS_ITEM_LEN - 1)
  61. #define FS_SECTOR_NUM_BUFFER_SIZE (312/4)
  62. #define FS_ABSOLUTE_ADDR(offset) (fs.cfg.sector_addr + offset)
  63. typedef enum{
  64. ITEM_DEL = 0x00,//zone is deleted
  65. ITEM_UNUSED = 0x03,//zone is free
  66. ITEM_USED = 0x02,//zone is used
  67. ITEM_RESERVED = 0x01//to be extend
  68. }item_pro;
  69. typedef enum{
  70. ITEM_SF = 0x03,//single frame file
  71. ITEM_MF_F = 0x01,//multiple frame file,first frame
  72. ITEM_MF_C = 0x02,//multiple frame file,continue frame
  73. ITEM_MF_E = 0x00//multiple frame file,end frame
  74. }item_frame;
  75. typedef enum{
  76. FLASH_UNCHECK = 0,//before analysis fs
  77. FLASH_NEW = 1,//new fs,its are 0xFF
  78. FLASH_ORIGINAL_ORDER = 2,//fs has data,its order is the original
  79. FLASH_NEW_ORDER = 3,//fs has data,its order is not the original
  80. FLASH_CONTEXT_ERROR = 4,//fs has data,but data is broken
  81. }FS_FLASH_TYPE;
  82. /*
  83. file head struct:
  84. len(12bit)+frame(2bit)+pro(2bit)+id(16bit)
  85. */
  86. typedef union
  87. {
  88. struct
  89. {
  90. uint32_t id:16;//file id
  91. uint32_t pro:2;//file property
  92. uint32_t frame:2;//file frame
  93. uint32_t len:12;//file length
  94. } b;
  95. uint32_t reg;
  96. } fs_item_t;
  97. /*
  98. sector head struct:
  99. sector_addr(one word)+(ff+index+item_len+sector_num)(one word)+(0xffffffff)(one word)~(0xffffffff)(one word)
  100. */
  101. typedef struct{
  102. uint32_t sector_addr;//fs start address
  103. uint8_t sector_num;//fs sector number
  104. uint8_t item_len;//item length
  105. uint8_t index;//sector index
  106. uint8_t reserved[FS_ITEM_LEN-7];
  107. }fs_cfg_t;
  108. typedef struct{
  109. fs_cfg_t cfg;
  110. uint8_t current_sector;//free sector index
  111. uint8_t exchange_sector;//exchange sector,only use it when garbage collect
  112. uint16_t offset;//free position in free sector index
  113. }fs_t;
  114. static fs_t fs;
  115. static bool fs_init_flag = false;
  116. typedef enum{
  117. SEARCH_FREE_ITEM = 0,
  118. SEARCH_APPOINTED_ITEM = 1,
  119. SEARCH_DELETED_ITEMS = 2,
  120. }search_type;
  121. extern uint32_t __psr(void);//check if in int process
  122. static void fs_erase_ucds_all_sector(void)
  123. {
  124. int i;
  125. for(i=0;i<fs_sector_num;i++)
  126. HalFlashErase(fs_offset_address + (i*4096));
  127. }
  128. static void fs_erase_ucds_one_sector(uint32_t addr_erase)
  129. {
  130. HalFlashErase(fs_offset_address + addr_erase);
  131. }
  132. static int fs_spif_write(uint32_t addr,uint8_t* value,uint16_t len)
  133. {
  134. if(__psr()&0x3f){
  135. return ERR_FS_IN_INT;
  136. }
  137. if((addr < fs_offset_address) || (addr >= (fs_offset_address+fs_sector_num*4096)) || ((addr&0x03)>0))
  138. {
  139. return ERR_FS_PARAMETER;
  140. }
  141. FS_LOG("fs wr:%x,%x\n",addr, len);
  142. return(HalFlashWrite(addr,value,(uint32_t)len));
  143. }
  144. static uint32_t fs_spif_read(uint32_t addr,uint8_t* buf,uint32_t len)
  145. {
  146. if ((addr < fs_offset_address) || (addr >= (fs_offset_address + fs_sector_num*4096)) || (buf == NULL) || (len == 0))
  147. {
  148. return ERR_FS_PARAMETER;
  149. }
  150. FS_LOG("fs rd:%x,%x\n",addr, len);
  151. HalFlashRead(addr,buf,len);
  152. return( ERR_NONE );
  153. }
  154. static void check_addr(uint32_t* addr)
  155. {
  156. if((*addr % 4096) == 0)
  157. {
  158. *addr += sizeof(fs_cfg_t);
  159. if(*addr >= 4096 *fs_sector_num)
  160. *addr -= 4096 *fs_sector_num;
  161. }
  162. }
  163. static int fs_search_items(search_type type,uint32_t* para1,uint32_t* para2)
  164. {
  165. uint8_t m,n;
  166. uint16_t j,g_offset = 1;
  167. uint32_t sector_addr,ab_addr;
  168. fs_item_t i1;
  169. bool from_last_sector = false;
  170. for(m = 1;m < fs_sector_num;m++)
  171. {
  172. n = (m + fs.exchange_sector) % fs.cfg.sector_num;
  173. if(g_offset >= FS_SECTOR_ITEM_NUM){
  174. g_offset -= FS_SECTOR_ITEM_NUM;
  175. if(g_offset >= FS_SECTOR_ITEM_NUM){
  176. continue;
  177. }
  178. }
  179. if(SEARCH_FREE_ITEM == type)
  180. fs.current_sector = (m + fs.exchange_sector) % fs.cfg.sector_num;
  181. sector_addr = n * 4096;
  182. for(j = 1;j <= FS_SECTOR_ITEM_NUM;j++)
  183. {
  184. if(from_last_sector == true){
  185. from_last_sector = false;
  186. j += g_offset;
  187. }
  188. else{
  189. if(g_offset > 1){
  190. if((j - 2 + g_offset) < FS_SECTOR_ITEM_NUM){
  191. j = j - 1 + g_offset;
  192. }
  193. else{
  194. g_offset -= (FS_SECTOR_ITEM_NUM + 2 - j);
  195. from_last_sector = true;
  196. break;
  197. }
  198. }
  199. }
  200. ab_addr = sector_addr + (j * FS_ITEM_LEN);
  201. fs_spif_read(FS_ABSOLUTE_ADDR(ab_addr),(uint8_t*)&i1,FS_ITEM_HEAD_LEN);
  202. switch(type)
  203. {
  204. case SEARCH_FREE_ITEM:
  205. {
  206. switch(i1.b.pro)
  207. {
  208. case ITEM_DEL:
  209. case ITEM_USED:
  210. {
  211. if(i1.b.frame == ITEM_MF_F)
  212. g_offset = (i1.b.len/FS_ITEM_DATA_LEN) + ((i1.b.len%FS_ITEM_DATA_LEN)?1:0);
  213. else
  214. g_offset = 1;
  215. }
  216. break;
  217. case ITEM_UNUSED:
  218. *para1 = ab_addr%4096;
  219. return ERR_NONE;
  220. default:
  221. break;
  222. }
  223. }
  224. break;
  225. case SEARCH_APPOINTED_ITEM:
  226. {
  227. switch(i1.b.pro)
  228. {
  229. case ITEM_DEL:
  230. case ITEM_USED:
  231. if((ITEM_USED == i1.b.pro) && (i1.b.id == (uint16)(*para1)))
  232. {
  233. *para2 = ab_addr;
  234. return ERR_NONE;
  235. }
  236. else
  237. {
  238. if(i1.b.frame == ITEM_MF_F)
  239. g_offset = (i1.b.len/FS_ITEM_DATA_LEN) + ((i1.b.len%FS_ITEM_DATA_LEN)?1:0);
  240. else
  241. g_offset = 1;
  242. }
  243. break;
  244. case ITEM_UNUSED:
  245. return ERR_FS_NOT_FIND_ID;
  246. default:
  247. break;
  248. }
  249. }
  250. break;
  251. case SEARCH_DELETED_ITEMS:
  252. {
  253. switch(i1.b.pro)
  254. {
  255. case ITEM_DEL:
  256. {
  257. if(i1.b.frame == ITEM_MF_F){
  258. g_offset = (i1.b.len/FS_ITEM_DATA_LEN) + ((i1.b.len%FS_ITEM_DATA_LEN)?1:0);
  259. *para1 += g_offset*FS_ITEM_DATA_LEN;
  260. }
  261. else{
  262. g_offset = 1;
  263. *para1 += FS_ITEM_DATA_LEN;
  264. }
  265. *para2 += 1;
  266. }
  267. break;
  268. case ITEM_USED:
  269. {
  270. if(i1.b.frame == ITEM_MF_F){
  271. g_offset = (i1.b.len/FS_ITEM_DATA_LEN) + ((i1.b.len%FS_ITEM_DATA_LEN)?1:0);
  272. }
  273. else{
  274. g_offset = 1;
  275. }
  276. }
  277. break;
  278. case ITEM_UNUSED:
  279. return ERR_NONE;
  280. default:
  281. break;
  282. }
  283. }
  284. break;
  285. default:
  286. return ERR_INVALID_PARAM;
  287. }
  288. }
  289. }
  290. switch(type)
  291. {
  292. case SEARCH_FREE_ITEM:
  293. return ERR_FS_FULL;
  294. case SEARCH_APPOINTED_ITEM:
  295. return ERR_FS_NOT_FIND_ID;
  296. default:
  297. return ERR_NONE;
  298. }
  299. }
  300. static int fs_get_free_item(void)
  301. {
  302. int ret;
  303. uint32_t posiztion = 0;
  304. if(fs_init_flag == false)
  305. return ERR_FS_UNINITIALIZED;
  306. ret = fs_search_items(SEARCH_FREE_ITEM,&posiztion,0);
  307. if(ERR_NONE == ret){
  308. fs.offset = posiztion;
  309. }else if(ERR_FS_FULL == ret){
  310. fs.offset = 4096;
  311. }
  312. return ret;
  313. }
  314. static int fs_init(void)
  315. {
  316. uint8_t i = 0,sector_order[FS_SECTOR_NUM_BUFFER_SIZE],ret = ERR_FS_UNINITIALIZED;
  317. FS_FLASH_TYPE flash = FLASH_UNCHECK;
  318. fs_cfg_t flash_rd_cfg;
  319. fs.cfg.sector_addr = fs_offset_address;
  320. fs.cfg.sector_num = fs_sector_num;;
  321. fs.cfg.index = 0xff;
  322. fs.cfg.item_len = FS_ITEM_LEN;
  323. osal_memset((fs.cfg.reserved),0xff,(FS_ITEM_LEN-7)*sizeof(uint8_t));
  324. osal_memset((sector_order),0x00,FS_SECTOR_NUM_BUFFER_SIZE);
  325. FS_LOG("fs_init:\n");
  326. for(i = 0;i < fs.cfg.sector_num;i++)
  327. {
  328. fs_spif_read(FS_ABSOLUTE_ADDR(4096*i),(uint8_t*)(&flash_rd_cfg),sizeof(fs_cfg_t));
  329. FS_LOG("flash_rd_cfg.sector_addr:%x\n",flash_rd_cfg.sector_addr);
  330. FS_LOG("flash_rd_cfg.sector_num:%x\n",flash_rd_cfg.sector_num);
  331. FS_LOG("flash_rd_cfg.item_len:%x\n",flash_rd_cfg.item_len);
  332. FS_LOG("flash_rd_cfg.index:%x\n",flash_rd_cfg.index);
  333. if((flash_rd_cfg.sector_addr == fs.cfg.sector_addr) &&
  334. (flash_rd_cfg.sector_num == fs.cfg.sector_num) &&
  335. (flash_rd_cfg.item_len == fs.cfg.item_len))
  336. {
  337. if(flash_rd_cfg.index < (fs_sector_num - 1))
  338. {
  339. if(i == flash_rd_cfg.index){
  340. flash = FLASH_ORIGINAL_ORDER;
  341. FS_LOG("FLASH_ORIGINAL_ORDER\n");
  342. }
  343. else{
  344. flash = FLASH_NEW_ORDER;
  345. FS_LOG("FLASH_NEW_ORDER\n");
  346. }
  347. sector_order[i] = flash_rd_cfg.index;
  348. fs.cfg.index = flash_rd_cfg.index;
  349. }
  350. else
  351. {
  352. flash = FLASH_CONTEXT_ERROR;
  353. FS_LOG("FLASH_CONTEXT_ERROR1\n");
  354. break;
  355. }
  356. }
  357. else if((flash_rd_cfg.sector_addr == 0xffffffff) &&
  358. (flash_rd_cfg.sector_num == 0xff) &&
  359. (flash_rd_cfg.item_len == 0xff))
  360. {
  361. sector_order[i] = 0xff;
  362. }
  363. else
  364. {
  365. flash = FLASH_CONTEXT_ERROR;
  366. FS_LOG("FLASH_CONTEXT_ERROR2\n");
  367. break;
  368. }
  369. }
  370. if(flash == FLASH_CONTEXT_ERROR){
  371. return ERR_FS_CONTEXT;
  372. }
  373. if(fs.cfg.index == 0xff)
  374. flash = FLASH_NEW;
  375. if(flash == FLASH_NEW)
  376. {
  377. for(i = 0;i < (fs.cfg.sector_num - 1);i++)
  378. {
  379. fs.cfg.index = i;
  380. if(ERR_NONE != fs_spif_write((FS_ABSOLUTE_ADDR(4096*i)),(uint8_t*)(&(fs.cfg)),sizeof(fs_cfg_t))){
  381. FS_LOG("ERR_FS_WRITE_FAILED\n");
  382. return ERR_FS_WRITE_FAILED;
  383. }
  384. }
  385. fs.current_sector = 0;
  386. fs.exchange_sector = fs.cfg.sector_num - 1;
  387. fs.offset = sizeof(fs_cfg_t);
  388. fs_init_flag = TRUE;
  389. }
  390. else
  391. {
  392. for(i = 0;i < fs.cfg.sector_num;i++){
  393. if(sector_order[i] == 0)
  394. break;
  395. }
  396. if(i < fs.cfg.sector_num)
  397. {
  398. fs.exchange_sector = (i + fs.cfg.sector_num - 1) % fs.cfg.sector_num;
  399. fs_init_flag = TRUE;
  400. ret = fs_get_free_item();
  401. if((ret != ERR_FS_FULL) && (ret != ERR_NONE)){
  402. FS_LOG("ERR_FS_RESERVED_ERROR\n");
  403. return ERR_FS_RESERVED_ERROR;
  404. }
  405. }
  406. }
  407. FS_LOG("ERR_NONE\n");
  408. return ERR_NONE;
  409. }
  410. uint32_t hal_fs_get_free_size(void)
  411. {
  412. uint32_t size = 0;
  413. if(fs_init_flag == false){
  414. //LOG("fs_init_flag = false,free\n");
  415. return 0;
  416. }
  417. if(fs.offset < 4096)
  418. {
  419. size = ((fs.exchange_sector + fs.cfg.sector_num - fs.current_sector - 1)%fs.cfg.sector_num)*(4096-sizeof(fs_cfg_t));
  420. size += (4096 - fs.offset);
  421. size = size*FS_ITEM_DATA_LEN/FS_ITEM_LEN;
  422. }
  423. return size;
  424. }
  425. int hal_fs_get_garbage_size(uint32_t* garbage_file_num)
  426. {
  427. uint32_t garbage_size = 0,garbage_count = 0;
  428. int ret;
  429. if(fs_init_flag == false)
  430. return ERR_FS_UNINITIALIZED;
  431. ret = fs_search_items(SEARCH_DELETED_ITEMS,&garbage_size,&garbage_count);
  432. if(ERR_NONE == ret){
  433. if(NULL != garbage_file_num)
  434. *garbage_file_num = garbage_count;
  435. return garbage_size;
  436. }
  437. return ERR_FATAL;
  438. }
  439. int hal_fs_item_find_id(uint16_t id,uint32_t* id_addr)
  440. {
  441. int ret;
  442. uint32_t file_id = 0;
  443. if(fs_init_flag == false)
  444. return ERR_FS_UNINITIALIZED;
  445. file_id = id & 0xffff;
  446. ret = fs_search_items(SEARCH_APPOINTED_ITEM,&file_id,id_addr);
  447. return ret;
  448. }
  449. int hal_fs_item_write(uint16_t id,uint8_t* buf,uint16_t len)
  450. {
  451. uint8_t frame_len,wr_buf[FS_ITEM_LEN];
  452. uint16_t i,item_len;
  453. uint32_t addr;
  454. fs_item_t i1;
  455. if(__psr()&0x3f){
  456. return ERR_FS_IN_INT;
  457. }
  458. if(fs_init_flag == false){
  459. //LOG("fs_init_flag = false,write\n");
  460. return ERR_FS_UNINITIALIZED;
  461. }
  462. if((buf == NULL) || (len == 0)||(len > 4095))
  463. return ERR_FS_PARAMETER;
  464. if(len > hal_fs_get_free_size())
  465. return ERR_FS_NOT_ENOUGH_SIZE;
  466. //if(hal_fs_item_find_id(id,&addr) == ERR_NONE)
  467. // return ERR_FS_EXIST_SAME_ID;
  468. if(hal_fs_item_find_id(id,&addr) == ERR_NONE){
  469. if(ERR_NONE != hal_fs_item_del(id))
  470. return ERR_FATAL;
  471. }
  472. item_len = len;
  473. i1.b.len = len;
  474. i1.b.id = id;
  475. i1.b.pro = ITEM_USED;
  476. if(len <= FS_ITEM_DATA_LEN)
  477. i1.b.frame = ITEM_SF;
  478. i = 0;
  479. while(len > 0)
  480. {
  481. if(len > FS_ITEM_DATA_LEN)
  482. {
  483. if(item_len == len)
  484. i1.b.frame = ITEM_MF_F;
  485. else
  486. i1.b.frame = ITEM_MF_C;
  487. frame_len = FS_ITEM_DATA_LEN;
  488. len -= FS_ITEM_DATA_LEN;
  489. }
  490. else
  491. {
  492. if((i1.b.frame == ITEM_MF_C) || (i1.b.frame == ITEM_MF_F))
  493. i1.b.frame = ITEM_MF_E;
  494. frame_len = len;
  495. len = 0;
  496. }
  497. addr = FS_ABSOLUTE_ADDR((fs.current_sector * 4096) + fs.offset);
  498. osal_memcpy(wr_buf,(uint8_t*)(&i1.reg),FS_ITEM_HEAD_LEN);
  499. osal_memcpy((wr_buf + FS_ITEM_HEAD_LEN),(buf + i),frame_len);
  500. if(ERR_NONE != fs_spif_write(addr,wr_buf,(frame_len+FS_ITEM_HEAD_LEN)))
  501. return ERR_FS_WRITE_FAILED;
  502. i += frame_len;
  503. fs.offset += FS_ITEM_LEN;
  504. if(fs.offset == 4096)
  505. {
  506. if(((fs.current_sector + 1) % fs.cfg.sector_num) != fs.exchange_sector)
  507. {
  508. fs.offset = sizeof(fs_cfg_t);
  509. fs.current_sector = (fs.current_sector + 1) % fs.cfg.sector_num;
  510. }
  511. }
  512. }
  513. return ERR_NONE;
  514. }
  515. int hal_fs_item_read(uint16_t id,uint8_t* buf,uint16_t buf_len,uint16_t* len)
  516. {
  517. uint8_t rd_len;
  518. uint16_t i = 0,temp_len;
  519. uint32_t addr;
  520. fs_item_t i1;
  521. if(__psr()&0x3f){
  522. return ERR_FS_IN_INT;
  523. }
  524. if(fs_init_flag == false)
  525. return ERR_FS_UNINITIALIZED;
  526. if((buf == NULL) || (buf_len == 0))
  527. return ERR_FS_PARAMETER;
  528. if(hal_fs_item_find_id(id,&addr) == ERR_NONE)
  529. {
  530. fs_spif_read(FS_ABSOLUTE_ADDR(addr),(uint8_t*)&i1,FS_ITEM_HEAD_LEN);
  531. if(len != NULL){
  532. *len = i1.b.len;
  533. }
  534. temp_len = i1.b.len;
  535. if(buf_len >= i1.b.len)
  536. {
  537. while(temp_len > 0)
  538. {
  539. rd_len = (temp_len >= FS_ITEM_DATA_LEN) ? FS_ITEM_DATA_LEN : temp_len;
  540. fs_spif_read(FS_ABSOLUTE_ADDR(addr + FS_ITEM_HEAD_LEN),(buf + i),rd_len);
  541. temp_len -= rd_len;
  542. addr += FS_ITEM_LEN;
  543. i += rd_len;
  544. check_addr(&addr);
  545. }
  546. return ERR_NONE;
  547. }
  548. return ERR_FS_BUFFER_TOO_SMALL;
  549. }
  550. return ERR_FS_NOT_FIND_ID;
  551. }
  552. int hal_fs_item_del(uint16_t id)
  553. {
  554. uint16_t i = 0,count = 1;
  555. uint32_t addr = 0;
  556. fs_item_t i1;
  557. if(__psr()&0x3f){
  558. return ERR_FS_IN_INT;
  559. }
  560. if(fs_init_flag == FALSE)
  561. return ERR_FS_UNINITIALIZED;
  562. if(hal_fs_item_find_id(id,&addr) == ERR_NONE)
  563. {
  564. fs_spif_read(FS_ABSOLUTE_ADDR(addr),(uint8_t*)&i1,FS_ITEM_HEAD_LEN);
  565. count = i1.b.len/FS_ITEM_DATA_LEN + ((i1.b.len % FS_ITEM_DATA_LEN)?1:0);
  566. for(i = 0;i < count;i++)
  567. {
  568. fs_spif_read(FS_ABSOLUTE_ADDR(addr),(uint8_t*)&i1,FS_ITEM_HEAD_LEN);
  569. i1.b.pro = ITEM_DEL;
  570. if(ERR_NONE != fs_spif_write(FS_ABSOLUTE_ADDR(addr),(uint8_t*)(&i1.reg),FS_ITEM_HEAD_LEN))
  571. return ERR_FS_WRITE_FAILED;
  572. addr += FS_ITEM_LEN;
  573. check_addr(&addr);
  574. }
  575. return ERR_NONE;
  576. }
  577. else
  578. {
  579. return ERR_FS_NOT_FIND_ID;
  580. }
  581. }
  582. int hal_fs_garbage_collect(void)
  583. {
  584. uint8_t i,j,buf[FS_ITEM_DATA_LEN];
  585. uint8_t from_sector_index = 0,to_sector_index = 0;
  586. uint32_t addr_rd=0,addr_wr=0,addr_erase;
  587. fs_item_t i1;
  588. if(__psr()&0x3f){
  589. return ERR_FS_IN_INT;
  590. }
  591. if(fs_init_flag == FALSE)
  592. return ERR_FS_UNINITIALIZED;
  593. to_sector_index = fs.exchange_sector;
  594. from_sector_index = (fs.exchange_sector + 1) % fs.cfg.sector_num;
  595. addr_wr = 4096*to_sector_index;
  596. for(i = 0;i < (fs.cfg.sector_num - 1);i++)
  597. {
  598. addr_rd = 4096*((from_sector_index + i) % fs.cfg.sector_num);
  599. addr_erase = addr_rd;
  600. fs.cfg.index = i;
  601. if(ERR_NONE != fs_spif_write(FS_ABSOLUTE_ADDR((4096*((to_sector_index + i) % fs.cfg.sector_num))),(uint8_t*)(&(fs.cfg)),sizeof(fs_cfg_t)))
  602. return ERR_FS_WRITE_FAILED;
  603. if(i == 0)
  604. addr_wr += sizeof(fs_cfg_t);
  605. addr_rd += sizeof(fs_cfg_t);
  606. for(j = 0;j < FS_SECTOR_ITEM_NUM;j++)
  607. {
  608. fs_spif_read(FS_ABSOLUTE_ADDR(addr_rd),(uint8_t*)&i1,FS_ITEM_HEAD_LEN);
  609. if(i1.b.pro == ITEM_USED)
  610. {
  611. fs_spif_read(FS_ABSOLUTE_ADDR(addr_rd + FS_ITEM_HEAD_LEN),buf,FS_ITEM_DATA_LEN);
  612. if(ERR_NONE != fs_spif_write(FS_ABSOLUTE_ADDR(addr_wr),(uint8_t*)(&i1.reg),FS_ITEM_HEAD_LEN))
  613. return ERR_FS_WRITE_FAILED;
  614. if(ERR_NONE != fs_spif_write(FS_ABSOLUTE_ADDR(addr_wr + FS_ITEM_HEAD_LEN),buf,FS_ITEM_DATA_LEN))
  615. return ERR_FS_WRITE_FAILED;
  616. addr_wr += FS_ITEM_LEN;
  617. check_addr(&addr_wr);
  618. }
  619. else if(i1.b.pro == ITEM_UNUSED)
  620. {
  621. break;
  622. }
  623. addr_rd += FS_ITEM_LEN;
  624. }
  625. fs_erase_ucds_one_sector(addr_erase);
  626. }
  627. return fs_init();
  628. }
  629. int hal_fs_format(uint32_t fs_start_address,uint8_t sector_num)
  630. {
  631. if(__psr()&0x3f){
  632. return ERR_FS_IN_INT;
  633. }
  634. fs_init_flag = FALSE;
  635. if((fs_start_address % 0x1000) || (sector_num < 3)){
  636. return ERR_INVALID_PARAM;
  637. }
  638. fs_sector_num = sector_num;
  639. fs_offset_address = fs_start_address;
  640. fs_erase_ucds_all_sector();
  641. return hal_fs_init(fs_start_address,sector_num);
  642. }
  643. int hal_fs_init(uint32_t fs_start_address,uint8_t sector_num)
  644. {
  645. if(fs_init_flag == TRUE){
  646. return ERR_FS_UNINITIALIZED;
  647. }
  648. if((fs_start_address % 0x1000) || (sector_num < 2)){
  649. return ERR_INVALID_PARAM;
  650. }
  651. fs_sector_num = sector_num;
  652. fs_offset_address = fs_start_address;
  653. return fs_init();
  654. }
  655. bool hal_fs_initialized(void)
  656. {
  657. return fs_init_flag;
  658. }