11 #include PLATFORM_HEADER
14 #ifdef NVM_RAM_EMULATION
16 static uint16_t calibrationData[32+2]={
18 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
19 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
20 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
21 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
26 halCommonMemCopy(data, ((uint8_t *) calibrationData) + offset, length);
31 halCommonMemCopy(((uint8_t *) calibrationData) + offset, data, length);
56 static uint8_t determineState(
void)
62 if((leftMgmt==0xFFFF0000) && (rightMgmt==0xFFFFFFFF)) {
71 }
else if((leftMgmt==0xFFFF0000) && (rightMgmt==0xFF00FFFF)) {
73 }
else if((leftMgmt==0xFFFF0000) && (rightMgmt==0xFF000000)) {
75 }
else if((leftMgmt==0xFFFF0000) && (rightMgmt==0xFFFFFFFF)) {
77 }
else if((leftMgmt==0xFFFF0000) && (rightMgmt==0xFFFFFF00)) {
79 }
else if((leftMgmt==0xFF000000) && (rightMgmt==0xFFFFFF00)) {
81 }
else if((leftMgmt==0xFF000000) && (rightMgmt==0xFFFF0000)) {
83 }
else if((leftMgmt==0xFFFFFFFF) && (rightMgmt==0xFFFF0000)) {
85 }
else if((leftMgmt==0xFFFFFF00) && (rightMgmt==0xFFFF0000)) {
87 }
else if((leftMgmt==0xFFFFFF00) && (rightMgmt==0xFF000000)) {
103 uint16_t *ram = (uint16_t*)data;
110 assert((offset&0x1)==0);
112 assert((length&0x1)==0);
117 switch(determineState()) {
125 for(i=0;i<(length/2);i++) {
134 for(i=0;i<(length/2);i++) {
147 for(i=0;i<(length/2);i++) {
167 assert((offset&0x1)==0);
170 switch(determineState()) {
190 uint16_t dummy = 0xFFFF;
200 static uint8_t erasePage(uint32_t page)
213 address = (page+((i-1)*MFB_PAGE_SIZE_B));
214 flash = (uint8_t *)address;
218 for(k=0;k<MFB_PAGE_SIZE_B;k++,flash++) {
221 if(status != ST_SUCCESS) {
235 #define ERASE_PAGE(page) \
237 status = erasePage(page); \
238 if(status != ST_SUCCESS) { \
247 #define WRITE_DATA(destPage, srcPage, offset, length) \
250 status = halInternalFlashWrite(destPage+NVM_MGMT_SIZE_B, \
251 (uint16_t *)(srcPage+NVM_MGMT_SIZE_B), \
252 (offset-NVM_MGMT_SIZE_B)/2); \
253 if(status != ST_SUCCESS) { return status; } \
255 status = halInternalFlashWrite(destPage+offset, \
258 if(status != ST_SUCCESS) { return status; } \
260 status = halInternalFlashWrite(destPage+offset+length, \
261 (uint16_t *)(srcPage+offset+length), \
264 NVM_MGMT_SIZE_B)/2); \
265 if(status != ST_SUCCESS) { return status; } \
270 #define WRITE_MGMT_16BITS(address, data) \
272 uint16_t value = data; \
273 status = halInternalFlashWrite((address), &value, 1); \
274 if(status != ST_SUCCESS) { \
283 uint8_t state, exitState;
287 uint16_t *ram = (uint16_t*)data;
294 assert((offset&0x1)==0);
296 assert((length&0x1)==0);
301 state = determineState();
345 ERASE_PAGE(destPage);
346 WRITE_DATA(destPage, srcPage, offset, length);
362 ERASE_PAGE(destPage);
366 WRITE_DATA(destPage, srcPage, offset, length);
382 ERASE_PAGE(destPage);
386 WRITE_DATA(destPage, srcPage, offset, length);
402 #endif // NVM_RAM_EMULATION
Header for flash for APIs.
uint16_t * halCommonGetAddressFromNvm(uint32_t offset)
Return the address of the token in NVM.
#define NVM_DATA_SIZE_B
Define the total size of a NVM page, in bytes.
uint8_t halCommonWriteToNvm(const void *data, uint32_t offset, uint16_t length)
Write the NVM data from the provided location RAM into flash.
#define VAR_AT_SEGMENT(__variableDeclaration, __segmentName)
Provide a portable way to specify the segment where a variable lives.
#define NO_STRIPPING
A friendlier name for the compiler's intrinsic for not stripping.
uint8_t halCommonReadFromNvm(void *data, uint32_t offset, uint16_t length)
Copy the NVM data from flash into the provided RAM location.
#define NVM_FLASH_PAGE_COUNT
Define the number of physical flash pages that comprise a NVM page.
#define TRUE
An alias for one, used for clarity.
#define NVM_RIGHT_PAGE
Define the absolute address of the RIGHT page.
Cortex-M3 Non-Volatile Memory data storage system.
#define NVM_LEFT_PAGE
Define the absolute address of the LEFT page.
StStatus halInternalFlashErase(uint8_t eraseType, uint32_t address)
Erases a section of flash back to all 0xFFFF.