Rev 79 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 79 | Rev 80 | ||
|---|---|---|---|
| Line 13... | Line 13... | ||
| 13 | // NVRAM hardware erases to all 0x |
13 | // NVRAM hardware erases to all 0x |
| 14 | nvram_info_t const HARDWARE_ERASED = {.u32 = 0UL}; |
14 | nvram_info_t const HARDWARE_ERASED = {.u32 = 0UL}; |
| 15 | // Marked as erased change to all 1 |
15 | // Marked as erased change to all 1 |
| 16 | nvram_info_t const MARKED_ERASED = {.u32 = ~0UL}; |
16 | nvram_info_t const MARKED_ERASED = {.u32 = ~0UL}; |
| 17 | // marked as unusable change pattern to something in between |
17 | // marked as unusable change pattern to something in between |
| 18 | nvram_info_t const MARKED_UNUSABLE = {.u32 = 0x55555555UL}; |
18 | nvram_info_t const MARKED_UNUSABLE = {.u32 = 0x555555FFUL}; |
| 19 | 19 | ||
| 20 | nvram_info_t NVRAM_Base[NVRAM_WORDS] __attribute__((section(".NVRAM_Data"))); // set by linker |
20 | nvram_info_t NVRAM_Base[NVRAM_WORDS] __attribute__((section(".NVRAM_Data"))); // set by linker |
| 21 | 21 | ||
| 22 | static void |
22 | static void |
| 23 | WriteNVRAM(nvram_info_t *Address, nvram_info_t data) |
23 | WriteNVRAM(int offset, nvram_info_t data) |
| 24 | { |
24 | { |
| 25 | HAL_FLASHEx_DATAEEPROM_Unlock(); |
25 | HAL_FLASHEx_DATAEEPROM_Unlock(); |
| 26 | HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_WORD, (uint32_t)Address, data.u32); |
26 | HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_WORD, (uint32_t)(&NVRAM_Base[offset]), data.u32); |
| 27 | HAL_FLASHEx_DATAEEPROM_Lock(); |
27 | HAL_FLASHEx_DATAEEPROM_Lock(); |
| 28 | } |
28 | } |
| 29 | 29 | ||
| 30 | static void |
30 | static void |
| 31 | EraseNVRAM(nvram_info_t *Address) |
31 | EraseNVRAM(int offset) |
| 32 | { |
32 | { |
| 33 | HAL_FLASHEx_DATAEEPROM_Unlock(); |
33 | HAL_FLASHEx_DATAEEPROM_Unlock(); |
| 34 | HAL_FLASHEx_DATAEEPROM_Erase(FLASH_TYPEERASEDATA_WORD, (uint32_t)Address); |
34 | HAL_FLASHEx_DATAEEPROM_Erase(FLASH_TYPEERASEDATA_WORD, (uint32_t)(&NVRAM_Base[offset])); |
| 35 | HAL_FLASHEx_DATAEEPROM_Lock(); |
35 | HAL_FLASHEx_DATAEEPROM_Lock(); |
| 36 | } |
36 | } |
| 37 | 37 | ||
| 38 | void write_nvram_data(nvram_info_t data) |
38 | void write_nvram_data(nvram_info_t data) |
| 39 | { |
39 | { |
| - | 40 | #if defined SEMIHOSTING |
|
| - | 41 | printf("write\n"); |
|
| - | 42 | #endif |
|
| - | 43 | ||
| 40 | int base = 0; |
44 | int base = 0; |
| 41 | 45 | ||
| 42 | /* search blank */ |
46 | /* search blank */ |
| 43 | for (int ptr = 0; ptr < NVRAM_WORDS; ptr++) |
47 | for (int ptr = 0; ptr < NVRAM_WORDS; ptr++) |
| 44 | { |
48 | { |
| 45 | // erase the entry just found |
49 | // erase the entry just found |
| 46 | if (NVRAM_Base[ptr].data.tag == data.data.tag) |
50 | if (NVRAM_Base[ptr].data.tag == data.data.tag) |
| 47 | { |
51 | { |
| 48 | // erase previous data, delete any entries that have a matching tag |
52 | // erase previous data, delete any entries that have a matching tag |
| 49 | WriteNVRAM(&NVRAM_Base[ptr], MARKED_ERASED); |
53 | #if defined SEMIHOSTING |
| 50 | // record the next location to the marked erased location |
54 | printf("marked erased %d\n", ptr); |
| 51 | // so that future writes occur further along in the Flash |
- | |
| - | 55 | #endif |
|
| 52 | if (base == 0) |
56 | WriteNVRAM(ptr, MARKED_ERASED); |
| - | 57 | ||
| 53 | base = ptr; |
58 | base = ptr; |
| 54 | } |
59 | } |
| 55 | } |
60 | } |
| 56 | 61 | ||
| 57 | // search forward for next erased or empty element, use it |
62 | // search forward for next erased or empty element, use it |
| 58 | for (int offset = 1; offset < NVRAM_WORDS + 1; offset++) |
63 | for (int offset = 1; offset < NVRAM_WORDS + 1; offset++) |
| 59 | { |
64 | { |
| 60 | int index = (base + offset) % NVRAM_WORDS; |
65 | int index = (base + offset) % NVRAM_WORDS; |
| 61 | if (NVRAM_Base[index].u32 == MARKED_ERASED.u32 || NVRAM_Base[index].u32 == HARDWARE_ERASED.u32) |
66 | if (NVRAM_Base[index].u32 == MARKED_ERASED.u32 || NVRAM_Base[index].u32 == HARDWARE_ERASED.u32) |
| 62 | { |
67 | { |
| 63 | if (NVRAM_Base[index].u32 != HARDWARE_ERASED.u32) |
68 | if (NVRAM_Base[index].u32 != HARDWARE_ERASED.u32) |
| - | 69 | { |
|
| - | 70 | #if defined SEMIHOSTING |
|
| - | 71 | printf("erase %d\n", index); |
|
| - | 72 | #endif |
|
| - | 73 | ||
| 64 | EraseNVRAM(&NVRAM_Base[index]); |
74 | EraseNVRAM(index); |
| - | 75 | } |
|
| - | 76 | #if defined SEMIHOSTING |
|
| - | 77 | printf("write %d=%d\n", index, data.data.pos); |
|
| - | 78 | #endif |
|
| 65 | WriteNVRAM(&NVRAM_Base[index], data); |
79 | WriteNVRAM(index, data); |
| 66 | // now check to see if it actually went |
80 | // now check to see if it actually went |
| 67 | if (NVRAM_Base[index].u32 != data.u32) |
81 | if (NVRAM_Base[index].u32 != data.u32) |
| 68 | { |
82 | { |
| - | 83 | #if defined SEMIHOSTING |
|
| - | 84 | printf("unusable %d\n", index); |
|
| - | 85 | #endif |
|
| 69 | WriteNVRAM(&NVRAM_Base[index], MARKED_UNUSABLE); // mark as neither unused or used |
86 | WriteNVRAM(index, MARKED_UNUSABLE); // mark as neither unused or used |
| 70 | continue; |
87 | continue; |
| 71 | } |
88 | } |
| 72 | return; |
89 | return; |
| 73 | } |
90 | } |
| 74 | } |
91 | } |
| 75 | } |
92 | } |
| 76 | 93 | ||
| 77 | nvram_info_t *find_nvram_data(uint8_t searchTag) |
94 | nvram_info_t *find_nvram_data(uint8_t searchTag) |
| 78 | { |
95 | { |
| - | 96 | #if defined SEMIHOSTING |
|
| - | 97 | printf("find\n"); |
|
| - | 98 | #endif |
|
| 79 | for (int ptr = 0; ptr < NVRAM_WORDS; ptr++) |
99 | for (int ptr = 0; ptr < NVRAM_WORDS; ptr++) |
| 80 | { |
100 | { |
| 81 | if (NVRAM_Base[ptr].data.tag == searchTag) |
101 | if (NVRAM_Base[ptr].data.tag == searchTag) |
| - | 102 | { |
|
| - | 103 | #if defined SEMIHOSTING |
|
| - | 104 | printf("found %d=%d\n", ptr, NVRAM_Base[ptr].data.pos); |
|
| - | 105 | #endif |
|
| 82 | return &NVRAM_Base[ptr]; |
106 | return &NVRAM_Base[ptr]; |
| - | 107 | } |
|
| 83 | } |
108 | } |
| 84 | return NULL; |
109 | return NULL; |
| 85 | } |
110 | } |
| 86 | 111 | ||
| 87 | void erase_nvram() |
112 | void erase_nvram() |
| 88 | { |
113 | { |
| - | 114 | #if defined SEMIHOSTING |
|
| 89 | /* search blank */ |
115 | printf("erase all\n"); |
| - | 116 | #endif |
|
| 90 | for (int ptr = 0; ptr < NVRAM_WORDS; ptr++) |
117 | for (int ptr = 0; ptr < NVRAM_WORDS; ptr++) |
| 91 | { |
- | |
| 92 | EraseNVRAM(&NVRAM_Base[ptr]); |
118 | EraseNVRAM(ptr); |
| 93 | } |
- | |
| 94 | } |
119 | } |
| 95 | 120 | ||