blob: 032f7b60e81d226c39263daf8311954952050fab [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{
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080035 uint32 offset;
36 uint8 temp[256];
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080037
38 if(len > sizeof(temp))
39 {
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080040 memset(buf,0,len);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080041 return 1;
42 }
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080043
44 offset = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080045 while(1)
46 {
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080047 memset(temp,0,sizeof temp);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080048 sp_flash_read(addr +offset,temp, len);
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080049 if(0 == isFF(temp,(uint16)len))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080050 {
51 if(0 == offset)
52 {
53 //ÎÞÊý¾Ý
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080054 memset(buf,0,len);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080055 return 1;
56 }
57 else
58 {
59 sp_flash_read(addr +offset -len,buf, len);
60 return 0;
61 }
62 }
63 offset += len;
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080064 /**Ò»Ò³¸ÕºÃдÍê»ò³¬¹ýµ±Ç°Ò³ ˵Ã÷Ò»Ò³¸ÕºÃÓÃÍê**/
65 if(DEF_FLASH_PageSize < (offset +len))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080066 {
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080067 memcpy(buf,temp,len);
68 return 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080069 }
70 }
71}
72/**
73**дһҳÊý¾Ý
74**@param len > 32 error
75**@return ·µ»Ø0±íʾ¼Ç¼Êý¾Ý³É¹¦
76**@return ·µ»Ø·Ç0±íʾдFLASHʧ°Ü
77**/
78uint16 sp_flash_page_write(uint32 addr,uint8 buf[],uint32 len)
79{
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080080 uint32 offset;
81 uint8 temp[256];
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080082
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080083 if(len > sizeof(temp))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080084 {
85 return 1;
86 }
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080087
88 offset = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080089 while(1)
90 {
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080091 memset(temp,0,sizeof temp);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080092 sp_flash_read(addr +offset,temp, len);
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080093 if(0 == isFF(temp,(uint16)len))
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080094 {
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080095 return sp_flash_write(addr +offset,buf, len);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080096 }
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +080097 offset += len;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080098 if(DEF_FLASH_PageSize < (offset +len)) // ³¬¹ýµ±Ò³±íʾÒÑдÂú,²Á³ýÖØÐ´
99 {
100 sp_flash_erase(addr);
101 return sp_flash_write(addr,buf, len);
102 }
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800103 }
104}
105
zongqiang.zhang0f7bcf32019-11-21 15:54:55 +0800106