NVProperty generic key value store using the MCU flash area.
Dependents: Turtle_RadioShuttle
NVProperty_MBEDFlash.h@6:633f80228fc8, 2019-02-01 (annotated)
- Committer:
- Helmut Tschemernjak
- Date:
- Fri Feb 01 13:37:08 2019 +0100
- Revision:
- 6:633f80228fc8
- Parent:
- 5:2560e615ccd5
- Child:
- 12:5539cdc8be4b
Updated
Who changed what in which revision?
User | Revision | Line number | New 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 | 4:eb6850e3bc21 | 48 | |
Helmut Tschemernjak | 4:eb6850e3bc21 | 49 | struct _flashEntry { |
Helmut Tschemernjak | 4:eb6850e3bc21 | 50 | uint8_t key; // Property key |
Helmut Tschemernjak | 4:eb6850e3bc21 | 51 | struct { |
Helmut Tschemernjak | 4:eb6850e3bc21 | 52 | uint8_t deleted : 1; // this key has been deleted |
Helmut Tschemernjak | 4:eb6850e3bc21 | 53 | uint8_t t_bit : 1; // contains the bool value |
Helmut Tschemernjak | 4:eb6850e3bc21 | 54 | uint8_t reserv1 : 1; // |
Helmut Tschemernjak | 4:eb6850e3bc21 | 55 | uint8_t reserv2 : 1; // |
Helmut Tschemernjak | 4:eb6850e3bc21 | 56 | uint8_t type : 4; // NVPType |
Helmut Tschemernjak | 4:eb6850e3bc21 | 57 | } t; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 58 | union { |
Helmut Tschemernjak | 4:eb6850e3bc21 | 59 | int16_t v_16bit; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 60 | int8_t v_8bit; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 61 | struct { |
Helmut Tschemernjak | 4:eb6850e3bc21 | 62 | uint8_t d_len; // data length |
Helmut Tschemernjak | 4:eb6850e3bc21 | 63 | uint8_t f_reserv1 : 8; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 64 | } option; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 65 | } u; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 66 | union { |
Helmut Tschemernjak | 4:eb6850e3bc21 | 67 | int32_t v_32bit; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 68 | int32_t v_64bit[2]; // use use 2 x 32-bit to avoid 64-bit struct padding |
Helmut Tschemernjak | 4:eb6850e3bc21 | 69 | char v_str[MAX_DATA_ENTRY]; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 70 | uint8_t v_blob[MAX_DATA_ENTRY]; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 71 | } data; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 72 | }; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 73 | |
Helmut Tschemernjak | 4:eb6850e3bc21 | 74 | _flashEntry * _GetFlashEntry(int key, uint8_t *start = NULL); |
Helmut Tschemernjak | 4:eb6850e3bc21 | 75 | int _GetFlashEntryLen(_flashEntry *k); |
Helmut Tschemernjak | 4:eb6850e3bc21 | 76 | int _GetFlashPaddingSize(int len); |
Helmut Tschemernjak | 4:eb6850e3bc21 | 77 | _flashEntry *_lastEntry; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 78 | void _DumpAllEntires(void); |
Helmut Tschemernjak | 4:eb6850e3bc21 | 79 | int _FlashReorgEntries(int minRequiredSpace); |
Helmut Tschemernjak | 4:eb6850e3bc21 | 80 | bool _debug; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 81 | int _propSizekB; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 82 | int _pageSize; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 83 | int _numPages; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 84 | int _rowSize; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 85 | FlashIAP *_flashIAP; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 86 | uint8_t *_startAddress; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 87 | uint8_t *_endAddress; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 88 | |
Helmut Tschemernjak | 5:2560e615ccd5 | 89 | static const int FLASH_PROP_MAGIC = 0x4e564d42; // "NVMB" |
Helmut Tschemernjak | 5:2560e615ccd5 | 90 | static const int FLASH_PROP_VERSION = 1; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 91 | }; |
Helmut Tschemernjak | 4:eb6850e3bc21 | 92 | |
Helmut Tschemernjak | 4:eb6850e3bc21 | 93 | #endif // __NVPROPERTY_MBEDLASH__ |