NVProperty generic key value store using the MCU flash area.

Dependents:   Turtle_RadioShuttle

NVProperty_L4OTP.h

Committer:
Helmut Tschemernjak
Date:
2019-04-22
Revision:
16:24a9d3ecee7b
Parent:
12:5539cdc8be4b

File content as of revision 16:24a9d3ecee7b:

/*
 * This is an unpublished work copyright
 * (c) 2019 Helmut Tschemernjak
 * 30826 Garbsen (Hannover) Germany
 *
 *
 * Use is granted to registered RadioShuttle licensees only.
 * Licensees must own a valid serial number and product code.
 * Details see: www.radioshuttle.de
 */

#ifndef __NVPROPERTY_L4OTP__
#define __NVPROPERTY_L4OTP__

class NVProperty_L4OTP : public NVPropertyProviderInterface {
public:
	NVProperty_L4OTP();
	~NVProperty_L4OTP();

    virtual int GetProperty(int key);
    virtual int64_t GetProperty64(int key);
    virtual int GetPropertyBlob(int key, const void *blob, int *size);
    virtual const char *GetPropertyStr(int key);
    virtual int SetProperty(int key, int64_t value, int type);
    virtual int SetPropertyStr(int key, const char *value, int type);
    virtual int SetPropertyBlob(int key, const void *blob, int size, int type);
    virtual int EraseProperty(int key);
    virtual int ReorgProperties(void);
    virtual int OpenPropertyStore(bool forWrite = false);
    virtual int ClosePropertyStore(bool flush = false);

private:
	void _FlashInititalize(void);
	void _OTPWrite(uint8_t *address, const void *data, size_t length);

	struct _flash_header {
		uint32_t magic;
		uint16_t version;
		uint16_t size;
	};

	static const int FLASH_ENTRY_MIN_SIZE		= 8;
	static const int MAX_DATA_ENTRY				= 256-FLASH_ENTRY_MIN_SIZE;
	static const int FLASH_PADDING_SIZE			= 8; // writes sizes and alignment must be multiple of 64-bit,
	
	struct _flashEntry {
		uint8_t key;	// Property key
		struct {
			uint8_t deleted	: 1; // this key has been deleted
			uint8_t t_bit  	: 1; // contains the bool value
			uint8_t reserv1	: 1; //
			uint8_t reserv2	: 1; //
			uint8_t type   	: 4; // NVPType
		} t;
		union {
			int16_t v_16bit;
			int8_t	v_8bit;
			struct {
				uint8_t d_len;				 // data length
				uint8_t f_reserv1  		: 8;
			} option;
		} u;
		union {
			int32_t v_32bit;
			int32_t v_64bit[2];	// use use 2 x 32-bit to avoid 64-bit struct padding
			char v_str[MAX_DATA_ENTRY];
			uint8_t v_blob[MAX_DATA_ENTRY];
		} data;
	};
	
	_flashEntry * _GetFlashEntry(int key, uint8_t *start = NULL);
	void _DumpAllEntires(void);
	int _GetFlashEntryLen(_flashEntry *k);
	int _GetFlashPaddingSize(int len);
	int _FlashReorgEntries(int minRequiredSpace);

	_flashEntry *_lastEntry;
	uint8_t *_startAddress;
	uint8_t *_endAddress;
	bool _debug;
	int _propSize;

	static const uint8_t _flashErasedValue = 0xff;
	static const int FLASH_PROP_MAGIC = 0x4c4f5450; // "LOTP"
	static const int FLASH_PROP_VERSION = 1;
};

#endif // __NVPROPERTY_L4OTP__