blob: 0788aeddb359c71a327629407f5d87e998530b47 [file] [log] [blame]
zongqiang.zhang0c6a0882019-08-07 14:48:21 +08001#include "sp_constant.h"
2#include "sp_util.h"
3
4#include "sp_flash.h"
5
6uint16 sp_flash_read(uint32 addr,uint8 buf[],uint32 len)
7{
8 return HW_Flash_Read(addr,len,buf);
9}
10uint16 sp_flash_write(uint32 addr,uint8 buf[],uint32 len)
11{
12 if(addr < DEF_IAP_BASE_ADDR)
13 {
14 return RC_FLASH_NO_RIGHT;
15 }
16 return HW_Flash_NotEraseWrite(addr,len,buf);
17}
18uint16 sp_flash_erase(uint32 addr)
19{
20 if(addr < DEF_IAP_BASE_ADDR)
21 {
22 return RC_FLASH_NO_RIGHT;
23 }
24 return HW_Flash_PageErase(addr / FLASH_PAGE_SIZE);
25}
26
27/**
28**¶ÁȡһҳÊý¾Ý,È«FF±íʾÎÞÊý¾Ý
29**@param len > 128 error
30**@return ·µ»Ø0±íʾ²éÕÒÊý¾Ý³É¹¦
31**@return ·µ»Ø·Ç0±íʾÎÞÓÐЧÊý¾Ý
32**/
33uint16 sp_flash_page_read(uint32 addr,uint8 buf[],uint32 len)
34{
35 uint32 i;
36 uint32 offset = 0;
37 uint8 temp[128];
38
39 if(len > sizeof(temp))
40 {
41 return 1;
42 }
43
44 while(1)
45 {
46 i = 0;
47 sp_flash_read(addr +offset,temp, len);
48 while(i < len)
49 {
50 if(0xFF == temp[i])
51 {
52 ++i;
53 }
54 else
55 {
56 break;
57 }
58 }
59 if(len == i)
60 {
61 if(0 == offset)
62 {
63 //ÎÞÊý¾Ý
64 return 1;
65 }
66 else
67 {
68 sp_flash_read(addr +offset -len,buf, len);
69 return 0;
70 }
71 }
72 offset += len;
73 if(DEF_FLASH_PageSize < (offset +len)) // ³¬¹ýµ±Ò³Î´ÕÒµ½·µ»Ø1
74 {
75 return 1;
76 }
77 }
78}
79/**
80**дһҳÊý¾Ý
81**@param len > 32 error
82**@return ·µ»Ø0±íʾ¼Ç¼Êý¾Ý³É¹¦
83**@return ·µ»Ø·Ç0±íʾдFLASHʧ°Ü
84**/
85uint16 sp_flash_page_write(uint32 addr,uint8 buf[],uint32 len)
86{
87 uint32 i;
88 uint32 offset = 0;
89 uint8 temp[64];
90
91 if(len > 64)
92 {
93 return 1;
94 }
95 while(1)
96 {
97 i = 0;
98 sp_flash_read(addr +offset,temp, len);
99 while(i < len)
100 {
101 if(0xFF == temp[i])
102 {
103 ++i;
104 }
105 else
106 {
107 break;
108 }
109 }
110 if(DEF_FLASH_PageSize < (offset +len)) // ³¬¹ýµ±Ò³±íʾÒÑдÂú,²Á³ýÖØÐ´
111 {
112 sp_flash_erase(addr);
113 return sp_flash_write(addr,buf, len);
114 }
115 if(len == i)
116 {
117 //ÎÞÊý¾Ý
118 return sp_flash_write(addr +offset,buf, len);
119 }
120 offset += len;
121 }
122}
123