Skip to content

Commit 6d97b89

Browse files
chrissnowadbridge
authored andcommitted
Fix flash_mapping_alignment_test so that invalid addresses are reported correctly. Tidy up
1 parent 272b9cc commit 6d97b89

File tree

1 file changed

+81
-77
lines changed

1 file changed

+81
-77
lines changed

targets/TARGET_NXP/TARGET_LPC176X/device/flash_api.c

Lines changed: 81 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,20 @@
1717
#include "mbed_critical.h"
1818

1919
#if DEVICE_FLASH
20+
#include "flash_api.h"
2021
#include "mbed_assert.h"
2122
#include "cmsis.h"
2223
#include <stdlib.h>
2324
#include <string.h>
2425

25-
#define MEMMAP (*((volatile unsigned long *) 0x400FC040))
26+
#define MEMMAP (*((volatile unsigned long *) 0x400FC040))
2627

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))
3334

3435
#define STACK_SIZE 64 // Stack Size
3536

@@ -42,10 +43,10 @@ typedef struct flash_s flash_t;
4243
unsigned long CCLK; // CCLK in kHz
4344

4445

45-
struct sIAP { // IAP Structure
46-
unsigned long cmd; // Command
46+
struct sIAP { // IAP Structure
47+
unsigned long cmd; // Command
4748
unsigned long par[4]; // Parameters
48-
unsigned long stat; // Status
49+
unsigned long stat; // Status
4950
unsigned long res[2]; // Result
5051
} IAP;
5152

@@ -59,19 +60,19 @@ unsigned long GetSecNum (unsigned long address) {
5960
unsigned long n;
6061

6162

62-
n = address >> 12; // 4kB Sector
63+
n = address >> 12; // 4kB Sector
6364
if (n >= 0x10) {
64-
n = 0x0E + (n >> 3); // 32kB Sector
65+
n = 0x0E + (n >> 3); // 32kB Sector
6566
}
6667

6768

68-
return (n); // Sector Number
69+
return (n); // Sector Number
6970
}
7071
int32_t flash_init(flash_t *obj)
7172
{
72-
CCLK = SystemCoreClock / 1000; // CCLK value is in kHz, clk in Hz
73+
CCLK = SystemCoreClock / 1000; // CCLK value is in kHz, clk in Hz
7374

74-
MEMMAP = 0x01; // User Flash Mode
75+
MEMMAP = 0x01; // User Flash Mode
7576

7677
return (0);
7778
}
@@ -83,24 +84,24 @@ int32_t flash_free(flash_t *obj)
8384

8485
int32_t flash_erase_sector(flash_t *obj, uint32_t address)
8586
{
86-
unsigned long n;
87+
unsigned long n;
8788

88-
n = GetSecNum(address); // Get Sector Number
89+
n = GetSecNum(address); // Get Sector Number
8990

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
9495
if (IAP.stat) return (1); // Command Failed
9596

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
101102
if (IAP.stat) return (1); // Command Failed
102103

103-
return (0); // Finished without Errors
104+
return (0); // Finished without Errors
104105

105106
}
106107

@@ -110,86 +111,89 @@ typedef void (*IAP_Entry) (unsigned long *cmd, unsigned long *stat);
110111

111112

112113
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)
114115
{
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
139140
}
140141
#endif
141142

142-
n = GetSecNum(address); // Get Sector Number
143+
n = GetSecNum(address); // Get Sector Number
143144

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
148149
if (IAP.stat) return (1); // Command Failed
149150

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
153154

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
157158
if(data !=datain)//We allocated our own memory
158159
{
159-
free(data);
160+
free(data);
160161
}
161162
if (IAP.stat) return (1); // Command Failed
162163

163-
return (0); // Finished without Errors
164+
return (0); // Finished without Errors
164165
}
165166

166167
uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
167168
{
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+
}
177181
}
178182

179183

180184
uint32_t flash_get_page_size(const flash_t *obj)
181185
{
182-
return 1024;
186+
return 1024;
183187
}
184188

185189
uint32_t flash_get_start_address(const flash_t *obj)
186190
{
187-
return LPC_FLASH_BASE;
191+
return LPC_FLASH_BASE;
188192
}
189193

190194
uint32_t flash_get_size(const flash_t *obj)
191195
{
192-
return 0x80000;
196+
return 0x80000;
193197
}
194198

195199
#endif

0 commit comments

Comments
 (0)