NVProperty generic key value store using the MCU flash area.
Dependents: Turtle_RadioShuttle
NVProperty_L4OTP.h@12:5539cdc8be4b, 2019-02-10 (annotated)
- Committer:
- Helmut Tschemernjak
- Date:
- Sun Feb 10 18:39:29 2019 +0100
- Revision:
- 12:5539cdc8be4b
- Parent:
- 1:3a8297ad8cd9
Updated
Who changed what in which revision?
User | Revision | Line number | New 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__ |