17
17
#include "mbed_critical.h"
18
18
19
19
#if DEVICE_FLASH
20
+ #include "flash_api.h"
20
21
#include "mbed_assert.h"
21
22
#include "cmsis.h"
22
23
#include <stdlib.h>
23
24
#include <string.h>
24
25
25
- #define MEMMAP (*((volatile unsigned long *) 0x400FC040))
26
+ #define MEMMAP (*((volatile unsigned long *) 0x400FC040))
26
27
27
- #define PLL0CON (*((volatile unsigned long *) 0x400FC080))
28
- #define PLL0CFG (*((volatile unsigned long *) 0x400FC084))
29
- #define PLL0STAT (*((volatile unsigned long *) 0x400FC088))
30
- #define PLL0FEED (*((volatile unsigned long *) 0x400FC08C))
31
- #define CCLKSEL (*((volatile unsigned long *) 0x400FC104))
32
- #define CLKSRCSEL (*((volatile unsigned long *) 0x400FC10C))
28
+ #define PLL0CON (*((volatile unsigned long *) 0x400FC080))
29
+ #define PLL0CFG (*((volatile unsigned long *) 0x400FC084))
30
+ #define PLL0STAT (*((volatile unsigned long *) 0x400FC088))
31
+ #define PLL0FEED (*((volatile unsigned long *) 0x400FC08C))
32
+ #define CCLKSEL (*((volatile unsigned long *) 0x400FC104))
33
+ #define CLKSRCSEL (*((volatile unsigned long *) 0x400FC10C))
33
34
34
35
#define STACK_SIZE 64 // Stack Size
35
36
@@ -42,10 +43,10 @@ typedef struct flash_s flash_t;
42
43
unsigned long CCLK ; // CCLK in kHz
43
44
44
45
45
- struct sIAP { // IAP Structure
46
- unsigned long cmd ; // Command
46
+ struct sIAP { // IAP Structure
47
+ unsigned long cmd ; // Command
47
48
unsigned long par [4 ]; // Parameters
48
- unsigned long stat ; // Status
49
+ unsigned long stat ; // Status
49
50
unsigned long res [2 ]; // Result
50
51
} IAP ;
51
52
@@ -59,19 +60,19 @@ unsigned long GetSecNum (unsigned long address) {
59
60
unsigned long n ;
60
61
61
62
62
- n = address >> 12 ; // 4kB Sector
63
+ n = address >> 12 ; // 4kB Sector
63
64
if (n >= 0x10 ) {
64
- n = 0x0E + (n >> 3 ); // 32kB Sector
65
+ n = 0x0E + (n >> 3 ); // 32kB Sector
65
66
}
66
67
67
68
68
- return (n ); // Sector Number
69
+ return (n ); // Sector Number
69
70
}
70
71
int32_t flash_init (flash_t * obj )
71
72
{
72
- CCLK = SystemCoreClock / 1000 ; // CCLK value is in kHz, clk in Hz
73
+ CCLK = SystemCoreClock / 1000 ; // CCLK value is in kHz, clk in Hz
73
74
74
- MEMMAP = 0x01 ; // User Flash Mode
75
+ MEMMAP = 0x01 ; // User Flash Mode
75
76
76
77
return (0 );
77
78
}
@@ -83,24 +84,24 @@ int32_t flash_free(flash_t *obj)
83
84
84
85
int32_t flash_erase_sector (flash_t * obj , uint32_t address )
85
86
{
86
- unsigned long n ;
87
+ unsigned long n ;
87
88
88
- n = GetSecNum (address ); // Get Sector Number
89
+ n = GetSecNum (address ); // Get Sector Number
89
90
90
- IAP .cmd = 50 ; // Prepare Sector for Erase
91
- IAP .par [0 ] = n ; // Start Sector
92
- IAP .par [1 ] = n ; // End Sector
93
- IAP_Call (& IAP .cmd , & IAP .stat ); // Call IAP Command
91
+ IAP .cmd = 50 ; // Prepare Sector for Erase
92
+ IAP .par [0 ] = n ; // Start Sector
93
+ IAP .par [1 ] = n ; // End Sector
94
+ IAP_Call (& IAP .cmd , & IAP .stat ); // Call IAP Command
94
95
if (IAP .stat ) return (1 ); // Command Failed
95
96
96
- IAP .cmd = 52 ; // Erase Sector
97
- IAP .par [0 ] = n ; // Start Sector
98
- IAP .par [1 ] = n ; // End Sector
99
- IAP .par [2 ] = CCLK ; // CCLK in kHz
100
- IAP_Call (& IAP .cmd , & IAP .stat ); // Call IAP Command
97
+ IAP .cmd = 52 ; // Erase Sector
98
+ IAP .par [0 ] = n ; // Start Sector
99
+ IAP .par [1 ] = n ; // End Sector
100
+ IAP .par [2 ] = CCLK ; // CCLK in kHz
101
+ IAP_Call (& IAP .cmd , & IAP .stat ); // Call IAP Command
101
102
if (IAP .stat ) return (1 ); // Command Failed
102
103
103
- return (0 ); // Finished without Errors
104
+ return (0 ); // Finished without Errors
104
105
105
106
}
106
107
@@ -110,86 +111,89 @@ typedef void (*IAP_Entry) (unsigned long *cmd, unsigned long *stat);
110
111
111
112
112
113
int32_t flash_program_page (flash_t * obj , uint32_t address ,
113
- const uint8_t * datain , uint32_t size )
114
+ const uint8_t * datain , uint32_t size )
114
115
{
115
- uint8_t * data ;
116
- unsigned long n ;
117
-
118
- if ((unsigned long )datain %4 == 0 )//word boundary
119
- {
120
- data = datain ;
121
- }
122
- else
123
- {
124
- data = malloc (size );
125
- memcpy (data ,datain ,size );
126
- }
127
-
128
-
129
- #if SET_VALID_CODE != 0 // Set valid User Code Signature
130
- if (address == 0 ) { // Check for Vector Table
131
- n = * ((unsigned long * )(data + 0x00 )) +
132
- * ((unsigned long * )(data + 0x04 )) +
133
- * ((unsigned long * )(data + 0x08 )) +
134
- * ((unsigned long * )(data + 0x0C )) +
135
- * ((unsigned long * )(data + 0x10 )) +
136
- * ((unsigned long * )(data + 0x14 )) +
137
- * ((unsigned long * )(data + 0x18 ));
138
- * ((unsigned long * )(data + 0x1C )) = 0 - n ; // Signature at Reserved Vector
116
+ uint8_t * data ;
117
+ unsigned long n ;
118
+
119
+ if ((unsigned long )datain %4 == 0 )//word boundary
120
+ {
121
+ data = datain ;
122
+ }
123
+ else
124
+ {
125
+ data = malloc (size );
126
+ memcpy (data ,datain ,size );
127
+ }
128
+
129
+
130
+ #if SET_VALID_CODE != 0 // Set valid User Code Signature
131
+ if (address == 0 ) { // Check for Vector Table
132
+ n = * ((unsigned long * )(data + 0x00 )) +
133
+ * ((unsigned long * )(data + 0x04 )) +
134
+ * ((unsigned long * )(data + 0x08 )) +
135
+ * ((unsigned long * )(data + 0x0C )) +
136
+ * ((unsigned long * )(data + 0x10 )) +
137
+ * ((unsigned long * )(data + 0x14 )) +
138
+ * ((unsigned long * )(data + 0x18 ));
139
+ * ((unsigned long * )(data + 0x1C )) = 0 - n ; // Signature at Reserved Vector
139
140
}
140
141
#endif
141
142
142
- n = GetSecNum (address ); // Get Sector Number
143
+ n = GetSecNum (address ); // Get Sector Number
143
144
144
- IAP .cmd = 50 ; // Prepare Sector for Write
145
- IAP .par [0 ] = n ; // Start Sector
146
- IAP .par [1 ] = n ; // End Sector
147
- IAP_Call (& IAP .cmd , & IAP .stat ); // Call IAP Command
145
+ IAP .cmd = 50 ; // Prepare Sector for Write
146
+ IAP .par [0 ] = n ; // Start Sector
147
+ IAP .par [1 ] = n ; // End Sector
148
+ IAP_Call (& IAP .cmd , & IAP .stat ); // Call IAP Command
148
149
if (IAP .stat ) return (1 ); // Command Failed
149
150
150
- IAP .cmd = 51 ; // Copy RAM to Flash
151
- IAP .par [0 ] = address ; // Destination Flash Address
152
- IAP .par [1 ] = (unsigned long )data ; // Source RAM Address
151
+ IAP .cmd = 51 ; // Copy RAM to Flash
152
+ IAP .par [0 ] = address ; // Destination Flash Address
153
+ IAP .par [1 ] = (unsigned long )data ; // Source RAM Address
153
154
154
- IAP .par [2 ] = 1024 ; // Fixed Page Size
155
- IAP .par [3 ] = CCLK ; // CCLK in kHz
156
- IAP_Call (& IAP .cmd , & IAP .stat ); // Call IAP Command
155
+ IAP .par [2 ] = 1024 ; // Fixed Page Size
156
+ IAP .par [3 ] = CCLK ; // CCLK in kHz
157
+ IAP_Call (& IAP .cmd , & IAP .stat ); // Call IAP Command
157
158
if (data != datain )//We allocated our own memory
158
159
{
159
- free (data );
160
+ free (data );
160
161
}
161
162
if (IAP .stat ) return (1 ); // Command Failed
162
163
163
- return (0 ); // Finished without Errors
164
+ return (0 ); // Finished without Errors
164
165
}
165
166
166
167
uint32_t flash_get_sector_size (const flash_t * obj , uint32_t address )
167
168
{
168
-
169
- if (GetSecNum (address )>=0x10 )
170
- {
171
- return 0x8000 ;
172
- }
173
- else
174
- {
175
- return 0x1000 ;
176
- }
169
+ if (address < flash_get_start_address (obj ) || address >= flash_get_start_address (obj ) + flash_get_size (obj ))
170
+ {
171
+ return MBED_FLASH_INVALID_SIZE ;
172
+ }
173
+ if (GetSecNum (address )>=0x10 )
174
+ {
175
+ return 0x8000 ;
176
+ }
177
+ else
178
+ {
179
+ return 0x1000 ;
180
+ }
177
181
}
178
182
179
183
180
184
uint32_t flash_get_page_size (const flash_t * obj )
181
185
{
182
- return 1024 ;
186
+ return 1024 ;
183
187
}
184
188
185
189
uint32_t flash_get_start_address (const flash_t * obj )
186
190
{
187
- return LPC_FLASH_BASE ;
191
+ return LPC_FLASH_BASE ;
188
192
}
189
193
190
194
uint32_t flash_get_size (const flash_t * obj )
191
195
{
192
- return 0x80000 ;
196
+ return 0x80000 ;
193
197
}
194
198
195
199
#endif
0 commit comments