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 |