NVProperty generic key value store using the MCU flash area.

Dependents:   Turtle_RadioShuttle

Committer:
Helmut Tschemernjak
Date:
Mon Apr 22 12:29:12 2019 +0200
Revision:
16:24a9d3ecee7b
Parent:
12:5539cdc8be4b
Added NTP to the editor

Who changed what in which revision?

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