NVProperty generic key value store using the MCU flash area.

Dependents:   Turtle_RadioShuttle

Committer:
Helmut Tschemernjak
Date:
Fri Feb 01 13:21:55 2019 +0100
Revision:
5:2560e615ccd5
Parent:
4:eb6850e3bc21
Child:
6:633f80228fc8
Imported

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helmut Tschemernjak 4:eb6850e3bc21 1 /*
Helmut Tschemernjak 4:eb6850e3bc21 2 * This is an unpublished work copyright
Helmut Tschemernjak 4:eb6850e3bc21 3 * (c) 2019 Helmut Tschemernjak
Helmut Tschemernjak 4:eb6850e3bc21 4 * 30826 Garbsen (Hannover) Germany
Helmut Tschemernjak 4:eb6850e3bc21 5 *
Helmut Tschemernjak 4:eb6850e3bc21 6 *
Helmut Tschemernjak 4:eb6850e3bc21 7 * Use is granted to registered RadioShuttle licensees only.
Helmut Tschemernjak 4:eb6850e3bc21 8 * Licensees must own a valid serial number and product code.
Helmut Tschemernjak 4:eb6850e3bc21 9 * Details see: www.radioshuttle.de
Helmut Tschemernjak 4:eb6850e3bc21 10 */
Helmut Tschemernjak 4:eb6850e3bc21 11
Helmut Tschemernjak 4:eb6850e3bc21 12 #ifndef __NVPROPERTY_MBEDFLASH__
Helmut Tschemernjak 4:eb6850e3bc21 13 #define __NVPROPERTY_MBEDFLASH__
Helmut Tschemernjak 4:eb6850e3bc21 14
Helmut Tschemernjak 4:eb6850e3bc21 15 class NVProperty_MBEDFlash : public NVPropertyProviderInterface {
Helmut Tschemernjak 4:eb6850e3bc21 16 public:
Helmut Tschemernjak 4:eb6850e3bc21 17 NVProperty_MBEDFlash(int propSizekB, bool erase);
Helmut Tschemernjak 4:eb6850e3bc21 18 ~NVProperty_MBEDFlash();
Helmut Tschemernjak 4:eb6850e3bc21 19
Helmut Tschemernjak 4:eb6850e3bc21 20 virtual int GetProperty(int key);
Helmut Tschemernjak 4:eb6850e3bc21 21 virtual int64_t GetProperty64(int key);
Helmut Tschemernjak 4:eb6850e3bc21 22 virtual int GetPropertyBlob(int key, const void *blob, int *size);
Helmut Tschemernjak 4:eb6850e3bc21 23 virtual const char *GetPropertyStr(int key);
Helmut Tschemernjak 4:eb6850e3bc21 24 virtual int SetProperty(int key, int64_t value, int type);
Helmut Tschemernjak 4:eb6850e3bc21 25 virtual int SetPropertyStr(int key, const char *value, int type);
Helmut Tschemernjak 4:eb6850e3bc21 26 virtual int SetPropertyBlob(int key, const void *blob, int size, int type);
Helmut Tschemernjak 4:eb6850e3bc21 27 virtual int EraseProperty(int key);
Helmut Tschemernjak 4:eb6850e3bc21 28 virtual int ReorgProperties(void);
Helmut Tschemernjak 4:eb6850e3bc21 29 virtual int OpenPropertyStore(bool forWrite = false);
Helmut Tschemernjak 4:eb6850e3bc21 30 virtual int ClosePropertyStore(bool flush = false);
Helmut Tschemernjak 4:eb6850e3bc21 31
Helmut Tschemernjak 4:eb6850e3bc21 32 private:
Helmut Tschemernjak 4:eb6850e3bc21 33 void _FlashInititalize(bool force = false);
Helmut Tschemernjak 4:eb6850e3bc21 34 void _FlashEraseRow(int startRow, int count = 1);
Helmut Tschemernjak 4:eb6850e3bc21 35 void _FlashWrite(uint8_t *address, const void *data, size_t length);
Helmut Tschemernjak 4:eb6850e3bc21 36 bool _FlashIsCleared(uint8_t *address, int len);
Helmut Tschemernjak 4:eb6850e3bc21 37 void _FlashWritePage(int page, int offset, uint8_t *data, int length);
Helmut Tschemernjak 4:eb6850e3bc21 38
Helmut Tschemernjak 4:eb6850e3bc21 39 struct _flash_header {
Helmut Tschemernjak 4:eb6850e3bc21 40 uint32_t magic;
Helmut Tschemernjak 4:eb6850e3bc21 41 uint16_t version;
Helmut Tschemernjak 4:eb6850e3bc21 42 uint16_t sizeKB;
Helmut Tschemernjak 4:eb6850e3bc21 43 };
Helmut Tschemernjak 4:eb6850e3bc21 44
Helmut Tschemernjak 5:2560e615ccd5 45 static const int FLASH_ENTRY_HEADER = 4;
Helmut Tschemernjak 5:2560e615ccd5 46 static const int FLASH_ENTRY_HEADER_SHORT = 2;
Helmut Tschemernjak 5:2560e615ccd5 47 static const int MAX_DATA_ENTRY = 256;
Helmut Tschemernjak 5:2560e615ccd5 48
Helmut Tschemernjak 5:2560e615ccd5 49 // static const int FLASH_ENTRY_MIN_SIZE = 8;
Helmut Tschemernjak 5:2560e615ccd5 50 // static const int FLASH_PADDING_SIZE = 8; // writes sizes and alignment must be multiple of 64-bit,
Helmut Tschemernjak 4:eb6850e3bc21 51
Helmut Tschemernjak 4:eb6850e3bc21 52 struct _flashEntry {
Helmut Tschemernjak 4:eb6850e3bc21 53 uint8_t key; // Property key
Helmut Tschemernjak 4:eb6850e3bc21 54 struct {
Helmut Tschemernjak 4:eb6850e3bc21 55 uint8_t deleted : 1; // this key has been deleted
Helmut Tschemernjak 4:eb6850e3bc21 56 uint8_t t_bit : 1; // contains the bool value
Helmut Tschemernjak 4:eb6850e3bc21 57 uint8_t reserv1 : 1; //
Helmut Tschemernjak 4:eb6850e3bc21 58 uint8_t reserv2 : 1; //
Helmut Tschemernjak 4:eb6850e3bc21 59 uint8_t type : 4; // NVPType
Helmut Tschemernjak 4:eb6850e3bc21 60 } t;
Helmut Tschemernjak 4:eb6850e3bc21 61 union {
Helmut Tschemernjak 4:eb6850e3bc21 62 int16_t v_16bit;
Helmut Tschemernjak 4:eb6850e3bc21 63 int8_t v_8bit;
Helmut Tschemernjak 4:eb6850e3bc21 64 struct {
Helmut Tschemernjak 4:eb6850e3bc21 65 uint8_t d_len; // data length
Helmut Tschemernjak 4:eb6850e3bc21 66 uint8_t f_reserv1 : 8;
Helmut Tschemernjak 4:eb6850e3bc21 67 } option;
Helmut Tschemernjak 4:eb6850e3bc21 68 } u;
Helmut Tschemernjak 4:eb6850e3bc21 69 union {
Helmut Tschemernjak 4:eb6850e3bc21 70 int32_t v_32bit;
Helmut Tschemernjak 4:eb6850e3bc21 71 int32_t v_64bit[2]; // use use 2 x 32-bit to avoid 64-bit struct padding
Helmut Tschemernjak 4:eb6850e3bc21 72 char v_str[MAX_DATA_ENTRY];
Helmut Tschemernjak 4:eb6850e3bc21 73 uint8_t v_blob[MAX_DATA_ENTRY];
Helmut Tschemernjak 4:eb6850e3bc21 74 } data;
Helmut Tschemernjak 4:eb6850e3bc21 75 };
Helmut Tschemernjak 4:eb6850e3bc21 76
Helmut Tschemernjak 4:eb6850e3bc21 77 _flashEntry * _GetFlashEntry(int key, uint8_t *start = NULL);
Helmut Tschemernjak 4:eb6850e3bc21 78 int _GetFlashEntryLen(_flashEntry *k);
Helmut Tschemernjak 4:eb6850e3bc21 79 int _GetFlashPaddingSize(int len);
Helmut Tschemernjak 4:eb6850e3bc21 80 _flashEntry *_lastEntry;
Helmut Tschemernjak 4:eb6850e3bc21 81 void _DumpAllEntires(void);
Helmut Tschemernjak 4:eb6850e3bc21 82 int _FlashReorgEntries(int minRequiredSpace);
Helmut Tschemernjak 4:eb6850e3bc21 83 bool _debug;
Helmut Tschemernjak 4:eb6850e3bc21 84 int _propSizekB;
Helmut Tschemernjak 4:eb6850e3bc21 85 int _pageSize;
Helmut Tschemernjak 4:eb6850e3bc21 86 int _numPages;
Helmut Tschemernjak 4:eb6850e3bc21 87 int _rowSize;
Helmut Tschemernjak 4:eb6850e3bc21 88 FlashIAP *_flashIAP;
Helmut Tschemernjak 4:eb6850e3bc21 89 uint8_t *_startAddress;
Helmut Tschemernjak 4:eb6850e3bc21 90 uint8_t *_endAddress;
Helmut Tschemernjak 4:eb6850e3bc21 91
Helmut Tschemernjak 5:2560e615ccd5 92 static const int FLASH_PROP_MAGIC = 0x4e564d42; // "NVMB"
Helmut Tschemernjak 5:2560e615ccd5 93 static const int FLASH_PROP_VERSION = 1;
Helmut Tschemernjak 4:eb6850e3bc21 94 };
Helmut Tschemernjak 4:eb6850e3bc21 95
Helmut Tschemernjak 4:eb6850e3bc21 96 #endif // __NVPROPERTY_MBEDLASH__