Subversion Repositories DashDisplay

Rev

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