Subversion Repositories DashDisplay

Rev

Rev 56 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
30 mjames 1
/*
2
 * nvram.c
3
 *
4
 *  Created on: 4 Jun 2017
5
 *      Author: Mike
6
 */
7
 
8
/* Includes ------------------------------------------------------------------*/
9
#include "stm32l1xx_hal.h"
10
 
11
#include "nvram.h"
12
 
64 mjames 13
nvram_info_t NVRAM_Base[NVRAM_WORDS] __attribute__((section(".NVRAM_Data"))); // set by linker 
14
 
15
static void
16
WriteNVRAM(nvram_info_t *Address, nvram_info_t data)
30 mjames 17
{
64 mjames 18
  HAL_FLASHEx_DATAEEPROM_Unlock();
19
  HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_WORD, (uint32_t)Address, data.u32);
20
  HAL_FLASHEx_DATAEEPROM_Lock();
56 mjames 21
}
30 mjames 22
 
64 mjames 23
static void
24
EraseNVRAM(nvram_info_t *Address)
56 mjames 25
{
64 mjames 26
  HAL_FLASHEx_DATAEEPROM_Unlock();
27
  HAL_FLASHEx_DATAEEPROM_Erase(FLASH_TYPEERASEDATA_WORD, (uint32_t)Address);
28
  HAL_FLASHEx_DATAEEPROM_Lock();
30 mjames 29
}
64 mjames 30
 
31
void write_nvram_data(nvram_info_t data)
32
{
33
 
34
  /* search blank */
35
  for (int ptr = 0; ptr < NVRAM_WORDS; ptr++)
36
  {
37
 
38
    // erase the entry just found
39
    if (NVRAM_Base[ptr].data.tag == data.data.tag)
40
    {
41
      nvram_info_t dat;
42
      dat.u32 = ~0;
43
      // erase previous data, leave as 0xFF
44
      WriteNVRAM(&NVRAM_Base[ptr], dat);
45
      // search forward for next erased or empty element, use it 
46
      for (int offset = 1; offset < NVRAM_WORDS+1; offset++)
47
      {
48
        int index = (ptr + offset) % NVRAM_WORDS;
49
        if (NVRAM_Base[index].u32 == ~0 || NVRAM_Base[index].u32 == 0)
50
        {
51
          if (NVRAM_Base[index].u32 != 0)
52
            EraseNVRAM(&NVRAM_Base[ptr]);
53
          WriteNVRAM(&NVRAM_Base[ptr], data);
54
          return;
55
        }
56
      }
57
    }
58
  }
59
}
60
 
61
nvram_info_t *find_nvram_data(uint8_t searchTag)
62
{
63
  for (int ptr = 0; ptr < NVRAM_WORDS; ptr++)
64
  {
65
    if (NVRAM_Base[ptr].data.tag == searchTag)
66
      return &NVRAM_Base[ptr];
67
  }
68
  return NULL;
69
}