Subversion Repositories DashDisplay

Rev

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

  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.  
  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)
  17. {
  18.   HAL_FLASHEx_DATAEEPROM_Unlock();
  19.   HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_WORD, (uint32_t)Address, data.u32);
  20.   HAL_FLASHEx_DATAEEPROM_Lock();
  21. }
  22.  
  23. static void
  24. EraseNVRAM(nvram_info_t *Address)
  25. {
  26.   HAL_FLASHEx_DATAEEPROM_Unlock();
  27.   HAL_FLASHEx_DATAEEPROM_Erase(FLASH_TYPEERASEDATA_WORD, (uint32_t)Address);
  28.   HAL_FLASHEx_DATAEEPROM_Lock();
  29. }
  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. }
  70.