Storage.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. /*****************************************************************************
  2. Flash.c
  3. *****************************************************************************/
  4. #define THIS_FILE_ID 20
  5. /* Includes ------------------------------------------------------------------*/
  6. #include "includes.h"
  7. SUT_SYSTEM_INFO g_sutSystemInfo;
  8. SUT_BFR sutBFR;
  9. SUT_FMR sutFMR;
  10. SUT_FTR sutFTR;
  11. int StorageCalBFRCount(void);
  12. int StorageCalFTRCount(void);
  13. int StorageCalFMRCount(void);
  14. /******************************************************************
  15. 存储SystemInfo信息
  16. *******************************************************************/
  17. void StorageSaveSysInfo(void)
  18. {
  19. //保存1区
  20. SPI_Flash_Unprotect_Sector(STORAGE_SYSINF1_ADDR);
  21. SPI_Flash_Write((u8 *)&g_sutSystemInfo,STORAGE_SYSINF1_ADDR,sizeof(SUT_SYSTEM_INFO));
  22. SPI_Flash_Protect_Sector(STORAGE_SYSINF1_ADDR);
  23. //保存2区
  24. SPI_Flash_Unprotect_Sector(STORAGE_SYSINF2_ADDR);
  25. SPI_Flash_Write((u8 *)&g_sutSystemInfo,STORAGE_SYSINF2_ADDR,sizeof(SUT_SYSTEM_INFO));
  26. SPI_Flash_Protect_Sector(STORAGE_SYSINF2_ADDR);
  27. }
  28. /******************************************************************
  29. StorageInit
  30. 1、检查是否需要格式化,如需要,则格式化之
  31. 2、如果不需要格式化,则读系统信息到sutSystemInfo中
  32. 3、sutSystemInfo中的 BFRecordCt、FLRecordCt需要重新计算获取
  33. *******************************************************************/
  34. void StorageInit(void)
  35. {
  36. unsigned short BootCt;
  37. //先读1区,如果非法在读2区
  38. SPI_Flash_Read((u8 *)&g_sutSystemInfo,STORAGE_SYSINF1_ADDR,sizeof(SUT_SYSTEM_INFO));
  39. if(g_sutSystemInfo.Mark!=STORAGE_MARK){//1 区非法
  40. printf("STORAGE_SYSINF1_ADDR invalid!\r\n");
  41. SPI_Flash_Read((u8 *)&g_sutSystemInfo,STORAGE_SYSINF2_ADDR,sizeof(SUT_SYSTEM_INFO));
  42. if(g_sutSystemInfo.Mark!=STORAGE_MARK){//2区非法
  43. //两个区都非法,说明首次启动,需要格式化
  44. //如果是手动格式化,需要保存上一个BootCt,使新得BootCt是再旧得基础上递增
  45. if(g_sutSystemInfo.Mark==STORAGE_FORMAT_MARK){
  46. BootCt=g_sutSystemInfo.BootCt+1;
  47. if(BootCt==0)BootCt=1;
  48. }else BootCt=1;
  49. printf("STORAGE_SYSINF2_ADDR invalid!\r\n");
  50. printf("Format sFlash...\r\n");
  51. SPI_Flash_Global_Unprotect();
  52. SPI_Flash_Erase_Chip();
  53. printf("Format sFlash ok!\r\n");
  54. printf("Reset Stoage system!\r\n");
  55. memset(&g_sutSystemInfo,0,sizeof(SUT_SYSTEM_INFO));
  56. g_sutSystemInfo.Mark=STORAGE_MARK;
  57. g_sutSystemInfo.BootCt=BootCt;
  58. StorageSaveSysInfo();
  59. //再读1次校验,如果仍非法说明FLASH可能坏了!
  60. SPI_Flash_Read((u8 *)&g_sutSystemInfo,STORAGE_SYSINF1_ADDR,sizeof(SUT_SYSTEM_INFO));
  61. if(g_sutSystemInfo.Mark!=STORAGE_MARK){
  62. printf("sFlash is error! reboot now!\r\n");
  63. while(1);
  64. }
  65. return;
  66. }else{//2区合法,1区非法
  67. printf("Recover Stoage_Sys_Inf_1\r\n");
  68. g_sutSystemInfo.BootCt++;
  69. StorageSaveSysInfo();
  70. }
  71. }else{//1 区合法,也要读下2区
  72. SUT_SYSTEM_INFO sutSystemInfoBak;
  73. SPI_Flash_Read((u8 *)&sutSystemInfoBak,STORAGE_SYSINF2_ADDR,sizeof(SUT_SYSTEM_INFO));
  74. if(sutSystemInfoBak.Mark!=STORAGE_MARK){//2区非法,重置2区
  75. printf("STORAGE_SYSINF2_ADDR invalid!\r\n");
  76. printf("Recover Stoage_Sys_Inf_2\r\n");
  77. g_sutSystemInfo.BootCt++;
  78. StorageSaveSysInfo();
  79. }else{//1区 2区都合法 BootCt加1后保存
  80. g_sutSystemInfo.BootCt++;
  81. StorageSaveSysInfo();
  82. }
  83. }
  84. //
  85. printf("StorageReadSystemInfo OK!\r\n");
  86. printf("Status=%d\r\nBootCt=%d\r\n",g_sutSystemInfo.Status,g_sutSystemInfo.BootCt);
  87. //重新计算 BFRecordCt 和 FLRecordCt
  88. g_sutSystemInfo.BFRCt=StorageCalBFRCount();
  89. g_sutSystemInfo.FTRCt=StorageCalFTRCount();
  90. g_sutSystemInfo.FMRCt=StorageCalFMRCount();
  91. printf("BFRCt=%lu FTRCt=%lu FMRCt=%lu\r\n",g_sutSystemInfo.BFRCt,g_sutSystemInfo.FTRCt,g_sutSystemInfo.FMRCt);
  92. // BFRCt=StorageCallBFRCount1();
  93. // printf("BFRCt=%d\r\n",BFRCt);
  94. // FTRCt=StorageCallFTRCount1();
  95. // printf("FTRCt=%d\r\n",FTRCt);
  96. // FMRCt=StorageCallFMRCount1();
  97. // printf("FMRCt=%d\r\n",FMRCt);
  98. //
  99. // if(BFRCt!=g_sutSystemInfo.BFRCt){
  100. // printf("BFRCt err=%d\r\n",BFRCt-(int)g_sutSystemInfo.BFRCt);
  101. // }
  102. // if(FTRCt!=g_sutSystemInfo.FTRCt){
  103. // printf("FTRCt err=%d\r\n",FTRCt-(int)g_sutSystemInfo.FTRCt);
  104. // }
  105. // if(FMRCt!=g_sutSystemInfo.FMRCt){
  106. // printf("FMRCt err=%d\r\n",FMRCt-(int)g_sutSystemInfo.FMRCt);
  107. // }
  108. }
  109. /******************************************************************
  110. 读取一条BFR记录
  111. 入口:index --记录索引 从0开始
  112. 出口: pBFR --记录内容
  113. 返回值: 0--失败 记录无效 1--成功
  114. *******************************************************************/
  115. int StorageReadBFR(SUT_BFR *pBFR,u32 index)
  116. {
  117. u16 i,len;
  118. u32 addr;
  119. u8 *pBuf;
  120. len=sizeof(SUT_BFR);
  121. pBuf=(u8 *)pBFR;
  122. addr=STORAGE_BFR_ADDR+index*len;
  123. tsk_lock();
  124. SPI_Flash_Read(pBuf,addr,len);
  125. tsk_unlock();
  126. if(pBFR->Status>2)return 0;
  127. else return 1;
  128. }
  129. /******************************************************************
  130. 读取一条FTR记录
  131. 入口:index --记录索引 从0开始
  132. 出口: pFTR --记录内容
  133. 返回值: 0--失败 记录无效 1--成功
  134. *******************************************************************/
  135. int StorageReadFTR(SUT_FTR *pFTR,u32 index)
  136. {
  137. u16 i,len;
  138. u32 addr;
  139. u8 *pBuf;
  140. len=sizeof(SUT_FTR);
  141. pBuf=(u8 *)pFTR;
  142. addr=STORAGE_FTR_ADDR+index*len;
  143. tsk_lock();
  144. SPI_Flash_Read(pBuf,addr,len);
  145. tsk_unlock();
  146. if(pFTR->Status>2)return 0;
  147. else return 1;
  148. }
  149. /******************************************************************
  150. 读取一条FMR记录
  151. 入口:index --记录索引 从0开始
  152. 出口: pFMR --记录内容
  153. 返回值: 0--失败 记录无效 1--成功
  154. *******************************************************************/
  155. int StorageReadFMR(SUT_FMR *pFMR,u32 index)
  156. {
  157. u16 i,len;
  158. u32 addr;
  159. u8 *pBuf;
  160. len=sizeof(SUT_FMR);
  161. pBuf=(u8 *)pFMR;
  162. addr=STORAGE_FMR_ADDR+index*len;
  163. tsk_lock();
  164. SPI_Flash_Read(pBuf,addr,len);
  165. tsk_unlock();
  166. if(pFMR->Status>2)return 0;
  167. else return 1;
  168. }
  169. /******************************************************************
  170. 存储BFR记录
  171. *******************************************************************/
  172. void StorageSaveBFR(SUT_BFR *pRecord)
  173. {
  174. u16 len;
  175. u32 addr;
  176. u32 Dst_Addr;
  177. u8 *pBuf;
  178. if(g_sutSystemInfo.BFRCt>=STORAGE_BFR_COUNT_MAX){
  179. printf("BFRCt>STORAGE_BFR_COUNT_MAX\r\n");
  180. return;
  181. }
  182. len=sizeof(SUT_BFR);
  183. pBuf=(u8 *)pRecord;
  184. addr=STORAGE_BFR_ADDR+g_sutSystemInfo.BFRCt*len;
  185. Dst_Addr=addr/4096;
  186. tsk_lock();
  187. SPI_Flash_Unprotect_Sector(Dst_Addr);
  188. SPI_Flash_Write_NoCheck(pBuf,addr,len);
  189. SPI_Flash_Protect_Sector(Dst_Addr);
  190. g_sutSystemInfo.BFRCt++;
  191. tsk_unlock();
  192. }
  193. /******************************************************************
  194. 存储FTR记录
  195. 0--满 1-成功
  196. *******************************************************************/
  197. int StorageSaveFTR(SUT_FTR *pRecord)
  198. {
  199. u16 len;
  200. u32 addr;
  201. u32 Dst_Addr;
  202. u8 *pBuf;
  203. if(g_sutSystemInfo.FTRCt>=STORAGE_FTR_COUNT_MAX)return 0;
  204. len=sizeof(SUT_FTR);
  205. pBuf=(u8 *)pRecord;
  206. addr=STORAGE_FTR_ADDR+g_sutSystemInfo.FTRCt*len;
  207. Dst_Addr=addr/4096;
  208. tsk_lock();
  209. SPI_Flash_Unprotect_Sector(Dst_Addr);
  210. SPI_Flash_Write_NoCheck(pBuf,addr,len);
  211. SPI_Flash_Protect_Sector(Dst_Addr);
  212. g_sutSystemInfo.FTRCt++;
  213. tsk_unlock();
  214. return 1;
  215. }
  216. /******************************************************************
  217. 存储FMR记录
  218. 0--满 1-成功
  219. *******************************************************************/
  220. int StorageSaveFMR(SUT_FMR *pRecord)
  221. {
  222. u16 len;
  223. u32 addr;
  224. u32 Dst_Addr;
  225. u8 *pBuf;
  226. if(g_sutSystemInfo.FMRCt>=STORAGE_FMR_COUNT_MAX)return 0;
  227. len=sizeof(SUT_FMR);
  228. pBuf=(u8 *)pRecord;
  229. addr=STORAGE_FMR_ADDR+g_sutSystemInfo.FMRCt*len;
  230. Dst_Addr=addr/4096;
  231. tsk_lock();
  232. SPI_Flash_Unprotect_Sector(Dst_Addr);
  233. SPI_Flash_Write_NoCheck(pBuf,addr,len);
  234. SPI_Flash_Protect_Sector(Dst_Addr);
  235. g_sutSystemInfo.FMRCt++;
  236. tsk_unlock();
  237. return 1;
  238. }
  239. /*******************************************************************
  240. *StorageCalBFRCount
  241. *计算 BFR 已存储的记录个数
  242. *为了提高速度,采用二分法
  243. ********************************************************************/
  244. int StorageCalBFRCount(void)
  245. {
  246. int flag=0;
  247. u8 status;
  248. u32 addr;
  249. u32 m=STORAGE_BFR_COUNT_MAX;
  250. u32 n,n1,n2;
  251. n1=1;n2=m;
  252. n=(n2-n1)/2;
  253. while(n1<n){
  254. addr=(n-1)*sizeof(SUT_BFR)+STORAGE_BFR_ADDR;
  255. SPI_Flash_Read(&status,addr,1);
  256. if(status>2){//此记录为空
  257. //需要继续往前找
  258. n2=n;
  259. n=n1+(n-n1)/2;
  260. }else{//此记录非空
  261. //需要继续往后找
  262. flag=1;
  263. n1=n;
  264. n=n1+(n2-n)/2;
  265. }
  266. }
  267. if(n1==1){
  268. if(flag==1)return 1;
  269. else return 0;
  270. }
  271. return n1;
  272. }
  273. /*******************************************************************
  274. *StorageCalFTRCount
  275. *计算FTR已存储的记录个数
  276. *为了提高速度,采用二分法
  277. ********************************************************************/
  278. int StorageCalFTRCount(void)
  279. {
  280. int flag=0;
  281. u8 status;
  282. u32 addr;
  283. u32 m=STORAGE_FTR_COUNT_MAX;
  284. u32 n,n1,n2;
  285. n1=1;n2=m;
  286. n=(n2-n1)/2;
  287. while(n1<n){
  288. addr=(n-1)*sizeof(SUT_FTR)+STORAGE_FTR_ADDR;
  289. SPI_Flash_Read(&status,addr,1);
  290. if(status>2){//此记录为空
  291. //需要继续往前找
  292. n2=n;
  293. n=n1+(n-n1)/2;
  294. }else{//此记录非空
  295. //需要继续往后找
  296. flag=1;
  297. n1=n;
  298. n=n1+(n2-n)/2;
  299. }
  300. }
  301. if(n1==1){
  302. if(flag==1)return 1;
  303. else return 0;
  304. }
  305. return n1;
  306. }
  307. //从头到尾检索法,统计FMR记录数,速度比较慢
  308. int StorageCallFMRCount1(void)
  309. {
  310. int j=0;
  311. u8 status;
  312. u32 i=0;
  313. u32 addr;
  314. for(i=0;i<STORAGE_FMR_COUNT_MAX;i++){
  315. addr=i*sizeof(SUT_FMR)+STORAGE_FMR_ADDR;
  316. SPI_Flash_Read(&status,addr,1);
  317. if(status==1)j++;
  318. }
  319. return j;
  320. }
  321. //从头到尾检索法,统计FMR记录数,速度比较慢
  322. int StorageCallFTRCount1(void)
  323. {
  324. u8 status;
  325. u32 i=0;
  326. int j=0;
  327. u32 addr;
  328. for(i=0;i<STORAGE_FTR_COUNT_MAX;i++){
  329. addr=i*sizeof(SUT_FTR)+STORAGE_FTR_ADDR;
  330. SPI_Flash_Read(&status,addr,1);
  331. if(status==1)j++;
  332. }
  333. return j;
  334. }
  335. //从头到尾检索法,统计FMR记录数,速度比较慢
  336. int StorageCallBFRCount1(void)
  337. {
  338. int j=0;
  339. u8 status;
  340. u32 i=0;
  341. u32 addr;
  342. for(i=0;i<STORAGE_BFR_COUNT_MAX;i++){
  343. addr=i*sizeof(SUT_BFR)+STORAGE_BFR_ADDR;
  344. SPI_Flash_Read(&status,addr,1);
  345. if(status==0)j++;
  346. }
  347. return j;
  348. }
  349. /*******************************************************************
  350. *StorageCalFMRCount
  351. *计算FMR已存储的记录个数
  352. *为了提高速度,采用二分法
  353. ********************************************************************/
  354. int StorageCalFMRCount(void)
  355. {
  356. int flag=0;
  357. u8 status;
  358. u32 addr;
  359. u32 m=STORAGE_FMR_COUNT_MAX;
  360. u32 n,n1,n2;
  361. n1=1;n2=m;
  362. n=(n2-n1)/2;
  363. while(n1<n){
  364. addr=(n-1)*sizeof(SUT_FMR)+STORAGE_FMR_ADDR;
  365. SPI_Flash_Read(&status,addr,1);
  366. if(status>2){//此记录为空
  367. //需要继续往前找
  368. n2=n;
  369. n=n1+(n-n1)/2;
  370. }else{//此记录非空
  371. //需要继续往后找
  372. flag=1;
  373. n1=n;
  374. n=n1+(n2-n)/2;
  375. }
  376. }
  377. if(n1==1){
  378. if(flag==1)return 1;
  379. else return 0;
  380. }
  381. return n1;
  382. }
  383. /*****************************************************************************/