1
1
#include <generated/csr.h>
2
2
3
- #include <spiflash.h>
3
+ #if (defined CSR_SPIFLASH_BASE && defined SPIFLASH_PAGE_SIZE )
4
4
5
- #ifdef CSR_SPIFLASH_BASE
5
+ #include <spiflash.h>
6
6
7
- #define PAGE_PROGRAM_CMD (0x02)
8
- #define WRDI_CMD (0x04)
9
- #define RDSR_CMD (0x05)
10
- #define WREN_CMD (0x06)
11
- #define SE_CMD (0x20)
7
+ #define PAGE_PROGRAM_CMD (0x02)
8
+ #define WRDI_CMD (0x04)
9
+ #define RDSR_CMD (0x05)
10
+ #define WREN_CMD (0x06)
11
+ #define SE_CMD (0x20)
12
12
13
- #define BITBANG_CLK (1 << 1)
13
+ #define BITBANG_CLK (1 << 1)
14
14
#define BITBANG_CS_N (1 << 2)
15
15
#define BITBANG_DQ_INPUT (1 << 3)
16
16
17
- #define SR_WIP (1)
18
-
19
- #define PAGE_SIZE (256)
20
- #define PAGE_MASK (PAGE_SIZE - 1)
21
- #define SECTOR_SIZE (4096)
22
- #define SECTOR_MASK (SECTOR_SIZE - 1)
17
+ #define SR_WIP (1)
23
18
24
19
static void flash_write_byte (unsigned char b );
25
20
static void flash_write_addr (unsigned int addr );
@@ -76,7 +71,7 @@ static void wait_for_device_ready(void)
76
71
77
72
void erase_flash_sector (unsigned int addr )
78
73
{
79
- unsigned int sector_addr = addr & ~(SECTOR_MASK );
74
+ unsigned int sector_addr = addr & ~(SPIFLASH_SECTOR_SIZE - 1 );
80
75
81
76
spiflash_bitbang_en_write (1 );
82
77
@@ -98,8 +93,8 @@ void write_to_flash_page(unsigned int addr, unsigned char *c, unsigned int len)
98
93
{
99
94
unsigned int i ;
100
95
101
- if (len > PAGE_SIZE )
102
- len = PAGE_SIZE ;
96
+ if (len > SPIFLASH_PAGE_SIZE )
97
+ len = SPIFLASH_PAGE_SIZE ;
103
98
104
99
spiflash_bitbang_en_write (1 );
105
100
@@ -120,4 +115,27 @@ void write_to_flash_page(unsigned int addr, unsigned char *c, unsigned int len)
120
115
spiflash_bitbang_en_write (0 );
121
116
}
122
117
123
- #endif
118
+ #define SPIFLASH_PAGE_MASK (SPIFLASH_PAGE_SIZE - 1)
119
+
120
+ void write_to_flash (unsigned int addr , unsigned char * c , unsigned int len )
121
+ {
122
+ unsigned int written = 0 ;
123
+
124
+ if (addr & SPIFLASH_PAGE_MASK ) {
125
+ written = min (SPIFLASH_PAGE_SIZE - (addr & SPIFLASH_PAGE_MASK ), len );
126
+ write_to_flash_page (addr , c , written );
127
+ c += written ;
128
+ addr += written ;
129
+ len -= written ;
130
+ }
131
+
132
+ while (len > 0 ) {
133
+ written = min (len , SPIFLASH_PAGE_SIZE );
134
+ write_to_flash_page (addr , c , written );
135
+ c += written ;
136
+ addr += written ;
137
+ len -= written ;
138
+ }
139
+ }
140
+
141
+ #endif /* CSR_SPIFLASH_BASE && SPIFLASH_PAGE_SIZE */
0 commit comments