NVProperty generic key value store using the MCU flash area.

Dependents:   Turtle_RadioShuttle

Committer:
Helmut Tschemernjak
Date:
Thu Jan 24 15:27:56 2019 +0100
Revision:
2:7ab0f5202860
Parent:
1:3a8297ad8cd9
Child:
3:968b84113ef3
added algorithm

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 #ifdef TARGET_STM32L4
Helmut Tschemernjak 1:3a8297ad8cd9 13
Helmut Tschemernjak 1:3a8297ad8cd9 14 #include <mbed.h>
Helmut Tschemernjak 1:3a8297ad8cd9 15 #include "main.h"
Helmut Tschemernjak 2:7ab0f5202860 16 #include <algorithm>
Helmut Tschemernjak 1:3a8297ad8cd9 17 #include <NVPropertyProviderInterface.h>
Helmut Tschemernjak 1:3a8297ad8cd9 18 #include <NVProperty_L4OTP.h>
Helmut Tschemernjak 1:3a8297ad8cd9 19 #include <NVProperty.h>
Helmut Tschemernjak 1:3a8297ad8cd9 20
Helmut Tschemernjak 1:3a8297ad8cd9 21
Helmut Tschemernjak 1:3a8297ad8cd9 22 #if 0 // sample test code for a man app.
Helmut Tschemernjak 1:3a8297ad8cd9 23 {
Helmut Tschemernjak 1:3a8297ad8cd9 24 NVProperty p;
Helmut Tschemernjak 1:3a8297ad8cd9 25
Helmut Tschemernjak 1:3a8297ad8cd9 26 p.OpenPropertyStore(true);
Helmut Tschemernjak 1:3a8297ad8cd9 27 dprintf("OTP--1: %d", p.GetProperty(p.CPUID, -1));
Helmut Tschemernjak 1:3a8297ad8cd9 28 p.SetProperty(p.CPUID, p.T_32BIT, 123, p.S_OTP);
Helmut Tschemernjak 1:3a8297ad8cd9 29 dprintf("OTP123: %d", p.GetProperty(p.CPUID, 0));
Helmut Tschemernjak 1:3a8297ad8cd9 30 p.SetProperty(p.CPUID, p.T_32BIT, 0x12345678, p.S_OTP);
Helmut Tschemernjak 1:3a8297ad8cd9 31 dprintf("OTP0x12345678: %x", p.GetProperty(p.CPUID, 0));
Helmut Tschemernjak 1:3a8297ad8cd9 32 p.EraseProperty(p.CPUID, p.S_OTP);
Helmut Tschemernjak 1:3a8297ad8cd9 33 dprintf("OTP:-2 %d", p.GetProperty(p.CPUID, -2));
Helmut Tschemernjak 1:3a8297ad8cd9 34 dprintf("OTP: Host %s", p.GetProperty(p.HOSTNAME, "MyHost"));
Helmut Tschemernjak 1:3a8297ad8cd9 35 p.SetProperty(p.HOSTNAME, p.T_STR, "Wunstorf", p.S_OTP);
Helmut Tschemernjak 1:3a8297ad8cd9 36 dprintf("OTP: Host %s", p.GetProperty(p.HOSTNAME, "MyHost"));
Helmut Tschemernjak 1:3a8297ad8cd9 37 p.SetProperty(p.CPUID, p.T_32BIT, 9876, p.S_OTP);
Helmut Tschemernjak 1:3a8297ad8cd9 38 dprintf("OTP9876: %d", p.GetProperty(p.CPUID, 0));
Helmut Tschemernjak 1:3a8297ad8cd9 39 dprintf("OTP: Host %s", p.GetProperty(p.HOSTNAME, "MyHost"));
Helmut Tschemernjak 1:3a8297ad8cd9 40
Helmut Tschemernjak 1:3a8297ad8cd9 41 }
Helmut Tschemernjak 1:3a8297ad8cd9 42 #endif
Helmut Tschemernjak 1:3a8297ad8cd9 43
Helmut Tschemernjak 1:3a8297ad8cd9 44 // #define OTP_TEST_IN_RAM // test OTP in RAM
Helmut Tschemernjak 1:3a8297ad8cd9 45
Helmut Tschemernjak 1:3a8297ad8cd9 46
Helmut Tschemernjak 1:3a8297ad8cd9 47 NVProperty_L4OTP::NVProperty_L4OTP()
Helmut Tschemernjak 1:3a8297ad8cd9 48 {
Helmut Tschemernjak 1:3a8297ad8cd9 49 _debug = false;
Helmut Tschemernjak 1:3a8297ad8cd9 50 _propSize = 1 * 1024; // no define in HAL laye
Helmut Tschemernjak 1:3a8297ad8cd9 51 _startAddress = (uint8_t *) 0x1FFF7000; // no define in HAL layer
Helmut Tschemernjak 1:3a8297ad8cd9 52
Helmut Tschemernjak 1:3a8297ad8cd9 53 #ifdef OTP_TEST_IN_RAM
Helmut Tschemernjak 1:3a8297ad8cd9 54 static uint8_t *savedStart;
Helmut Tschemernjak 1:3a8297ad8cd9 55 if (!savedStart) {
Helmut Tschemernjak 1:3a8297ad8cd9 56 _startAddress = (uint8_t *) malloc(512);
Helmut Tschemernjak 1:3a8297ad8cd9 57 memset(_startAddress, 0xff, 512);
Helmut Tschemernjak 1:3a8297ad8cd9 58 savedStart = _startAddress;
Helmut Tschemernjak 1:3a8297ad8cd9 59 } else {
Helmut Tschemernjak 1:3a8297ad8cd9 60 _startAddress = savedStart;
Helmut Tschemernjak 1:3a8297ad8cd9 61 }
Helmut Tschemernjak 1:3a8297ad8cd9 62 #endif
Helmut Tschemernjak 1:3a8297ad8cd9 63
Helmut Tschemernjak 1:3a8297ad8cd9 64 _endAddress = _startAddress + (_propSize);
Helmut Tschemernjak 1:3a8297ad8cd9 65 _lastEntry = NULL;
Helmut Tschemernjak 1:3a8297ad8cd9 66
Helmut Tschemernjak 1:3a8297ad8cd9 67 _FlashInititalize();
Helmut Tschemernjak 1:3a8297ad8cd9 68 }
Helmut Tschemernjak 1:3a8297ad8cd9 69
Helmut Tschemernjak 1:3a8297ad8cd9 70
Helmut Tschemernjak 1:3a8297ad8cd9 71 NVProperty_L4OTP::~NVProperty_L4OTP()
Helmut Tschemernjak 1:3a8297ad8cd9 72 {
Helmut Tschemernjak 1:3a8297ad8cd9 73 #ifdef OTP_TEST_IN_RAM
Helmut Tschemernjak 1:3a8297ad8cd9 74 _debug = true;
Helmut Tschemernjak 1:3a8297ad8cd9 75 _DumpAllEntires();
Helmut Tschemernjak 1:3a8297ad8cd9 76 wait_ms(100);
Helmut Tschemernjak 1:3a8297ad8cd9 77 dump("_startAddress", _startAddress, 100);
Helmut Tschemernjak 1:3a8297ad8cd9 78 #endif
Helmut Tschemernjak 1:3a8297ad8cd9 79 }
Helmut Tschemernjak 1:3a8297ad8cd9 80
Helmut Tschemernjak 1:3a8297ad8cd9 81
Helmut Tschemernjak 1:3a8297ad8cd9 82 void
Helmut Tschemernjak 1:3a8297ad8cd9 83 NVProperty_L4OTP::_FlashInititalize(void)
Helmut Tschemernjak 1:3a8297ad8cd9 84 {
Helmut Tschemernjak 1:3a8297ad8cd9 85 _flash_header *fh = (_flash_header *)_startAddress;
Helmut Tschemernjak 1:3a8297ad8cd9 86 if (fh->magic == FLASH_PROP_MAGIC && fh->version == FLASH_PROP_VERSION && fh->size == _propSize) {
Helmut Tschemernjak 1:3a8297ad8cd9 87 return;
Helmut Tschemernjak 1:3a8297ad8cd9 88 }
Helmut Tschemernjak 1:3a8297ad8cd9 89
Helmut Tschemernjak 1:3a8297ad8cd9 90 uint8_t *p = _startAddress;
Helmut Tschemernjak 1:3a8297ad8cd9 91 for (int i = 0; i < (int)sizeof(_flash_header); i++) {
Helmut Tschemernjak 1:3a8297ad8cd9 92 if (*p++ != 0xff)
Helmut Tschemernjak 1:3a8297ad8cd9 93 return; // invalid data
Helmut Tschemernjak 1:3a8297ad8cd9 94 }
Helmut Tschemernjak 1:3a8297ad8cd9 95
Helmut Tschemernjak 1:3a8297ad8cd9 96 _flash_header f;
Helmut Tschemernjak 1:3a8297ad8cd9 97 memset(&f, 0, sizeof(f));
Helmut Tschemernjak 1:3a8297ad8cd9 98 f.magic = FLASH_PROP_MAGIC;
Helmut Tschemernjak 1:3a8297ad8cd9 99 f.version = FLASH_PROP_VERSION;
Helmut Tschemernjak 1:3a8297ad8cd9 100 f.size = _propSize;
Helmut Tschemernjak 1:3a8297ad8cd9 101
Helmut Tschemernjak 1:3a8297ad8cd9 102 _OTPWrite(_startAddress, &f, sizeof(f));
Helmut Tschemernjak 1:3a8297ad8cd9 103 }
Helmut Tschemernjak 1:3a8297ad8cd9 104
Helmut Tschemernjak 1:3a8297ad8cd9 105
Helmut Tschemernjak 1:3a8297ad8cd9 106 int
Helmut Tschemernjak 1:3a8297ad8cd9 107 NVProperty_L4OTP::GetProperty(int key)
Helmut Tschemernjak 1:3a8297ad8cd9 108 {
Helmut Tschemernjak 1:3a8297ad8cd9 109 return GetProperty64(key);
Helmut Tschemernjak 1:3a8297ad8cd9 110 }
Helmut Tschemernjak 1:3a8297ad8cd9 111
Helmut Tschemernjak 1:3a8297ad8cd9 112
Helmut Tschemernjak 1:3a8297ad8cd9 113 int64_t
Helmut Tschemernjak 1:3a8297ad8cd9 114 NVProperty_L4OTP::GetProperty64(int key)
Helmut Tschemernjak 1:3a8297ad8cd9 115 {
Helmut Tschemernjak 1:3a8297ad8cd9 116 _flashEntry *p = _GetFlashEntry(key);
Helmut Tschemernjak 1:3a8297ad8cd9 117 if (!p)
Helmut Tschemernjak 1:3a8297ad8cd9 118 return NVProperty::NVP_ENOENT;
Helmut Tschemernjak 1:3a8297ad8cd9 119
Helmut Tschemernjak 1:3a8297ad8cd9 120 int64_t value = 0;
Helmut Tschemernjak 1:3a8297ad8cd9 121
Helmut Tschemernjak 1:3a8297ad8cd9 122 switch(p->t.type) {
Helmut Tschemernjak 1:3a8297ad8cd9 123 case NVProperty::T_BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 124 if (p->t.t_bit)
Helmut Tschemernjak 1:3a8297ad8cd9 125 value = 1;
Helmut Tschemernjak 1:3a8297ad8cd9 126 else
Helmut Tschemernjak 1:3a8297ad8cd9 127 value = 0;
Helmut Tschemernjak 1:3a8297ad8cd9 128 break;
Helmut Tschemernjak 1:3a8297ad8cd9 129 case NVProperty::T_8BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 130 value = p->u.v_8bit;
Helmut Tschemernjak 1:3a8297ad8cd9 131 break;
Helmut Tschemernjak 1:3a8297ad8cd9 132 case NVProperty::T_16BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 133 {
Helmut Tschemernjak 1:3a8297ad8cd9 134 int16_t v;
Helmut Tschemernjak 1:3a8297ad8cd9 135 memcpy(&v, &p->u.v_16bit, sizeof(p->u.v_16bit));
Helmut Tschemernjak 1:3a8297ad8cd9 136 value = v;
Helmut Tschemernjak 1:3a8297ad8cd9 137 }
Helmut Tschemernjak 1:3a8297ad8cd9 138 break;
Helmut Tschemernjak 1:3a8297ad8cd9 139 case NVProperty::T_32BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 140 {
Helmut Tschemernjak 1:3a8297ad8cd9 141 int32_t v;
Helmut Tschemernjak 1:3a8297ad8cd9 142 memcpy(&v, &p->data.v_32bit, sizeof(p->data.v_32bit));
Helmut Tschemernjak 1:3a8297ad8cd9 143 value = v;
Helmut Tschemernjak 1:3a8297ad8cd9 144 }
Helmut Tschemernjak 1:3a8297ad8cd9 145 break;
Helmut Tschemernjak 1:3a8297ad8cd9 146 case NVProperty::T_64BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 147 memcpy(&value, p->data.v_64bit, sizeof(p->data.v_64bit));
Helmut Tschemernjak 1:3a8297ad8cd9 148 break;
Helmut Tschemernjak 1:3a8297ad8cd9 149 case NVProperty::T_STR:
Helmut Tschemernjak 1:3a8297ad8cd9 150 case NVProperty::T_BLOB:
Helmut Tschemernjak 1:3a8297ad8cd9 151 value = p->u.option.d_len;
Helmut Tschemernjak 1:3a8297ad8cd9 152 break;
Helmut Tschemernjak 1:3a8297ad8cd9 153 }
Helmut Tschemernjak 1:3a8297ad8cd9 154 return value;
Helmut Tschemernjak 1:3a8297ad8cd9 155 }
Helmut Tschemernjak 1:3a8297ad8cd9 156
Helmut Tschemernjak 1:3a8297ad8cd9 157 const char *
Helmut Tschemernjak 1:3a8297ad8cd9 158 NVProperty_L4OTP::GetPropertyStr(int key)
Helmut Tschemernjak 1:3a8297ad8cd9 159 {
Helmut Tschemernjak 1:3a8297ad8cd9 160 _flashEntry *p = _GetFlashEntry(key);
Helmut Tschemernjak 1:3a8297ad8cd9 161 if (!p || p->t.type != NVProperty::T_STR)
Helmut Tschemernjak 1:3a8297ad8cd9 162 return NULL;
Helmut Tschemernjak 1:3a8297ad8cd9 163 return strdup(p->data.v_str);
Helmut Tschemernjak 1:3a8297ad8cd9 164 }
Helmut Tschemernjak 1:3a8297ad8cd9 165
Helmut Tschemernjak 1:3a8297ad8cd9 166 int
Helmut Tschemernjak 1:3a8297ad8cd9 167 NVProperty_L4OTP::GetPropertyBlob(int key, const void *blob, int *size)
Helmut Tschemernjak 1:3a8297ad8cd9 168 {
Helmut Tschemernjak 1:3a8297ad8cd9 169 _flashEntry *p = _GetFlashEntry(key);
Helmut Tschemernjak 1:3a8297ad8cd9 170 if (!p || p->t.type != NVProperty::T_BLOB)
Helmut Tschemernjak 1:3a8297ad8cd9 171 return NVProperty::NVP_ENOENT;
Helmut Tschemernjak 1:3a8297ad8cd9 172
Helmut Tschemernjak 1:3a8297ad8cd9 173 int cplen = std::min(*size, (int)p->u.option.d_len);
Helmut Tschemernjak 1:3a8297ad8cd9 174 if (blob)
Helmut Tschemernjak 1:3a8297ad8cd9 175 memcpy((void *)blob, p->data.v_blob, cplen);
Helmut Tschemernjak 1:3a8297ad8cd9 176 *size = cplen;
Helmut Tschemernjak 1:3a8297ad8cd9 177
Helmut Tschemernjak 1:3a8297ad8cd9 178 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 179 }
Helmut Tschemernjak 1:3a8297ad8cd9 180
Helmut Tschemernjak 1:3a8297ad8cd9 181
Helmut Tschemernjak 1:3a8297ad8cd9 182 int
Helmut Tschemernjak 1:3a8297ad8cd9 183 NVProperty_L4OTP::SetProperty(int key, int64_t value, int type)
Helmut Tschemernjak 1:3a8297ad8cd9 184 {
Helmut Tschemernjak 1:3a8297ad8cd9 185 UNUSED(type);
Helmut Tschemernjak 1:3a8297ad8cd9 186 uint8_t valbuf[FLASH_ENTRY_MIN_SIZE + sizeof(int64_t)];
Helmut Tschemernjak 1:3a8297ad8cd9 187 _flashEntry *p = (_flashEntry *) valbuf;
Helmut Tschemernjak 1:3a8297ad8cd9 188 int storeType;
Helmut Tschemernjak 1:3a8297ad8cd9 189
Helmut Tschemernjak 1:3a8297ad8cd9 190 if (GetProperty64(key) == value) // no need to save it again.
Helmut Tschemernjak 1:3a8297ad8cd9 191 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 192
Helmut Tschemernjak 1:3a8297ad8cd9 193 memset(valbuf, 0, sizeof(valbuf));
Helmut Tschemernjak 1:3a8297ad8cd9 194
Helmut Tschemernjak 1:3a8297ad8cd9 195 if (value == 0 || value == 1)
Helmut Tschemernjak 1:3a8297ad8cd9 196 storeType = NVProperty::T_BIT;
Helmut Tschemernjak 1:3a8297ad8cd9 197 else if (value >= -128 && value < 128)
Helmut Tschemernjak 1:3a8297ad8cd9 198 storeType = NVProperty::T_8BIT;
Helmut Tschemernjak 1:3a8297ad8cd9 199 else if (value >= -32768 && value < 32768)
Helmut Tschemernjak 1:3a8297ad8cd9 200 storeType = NVProperty::T_16BIT;
Helmut Tschemernjak 1:3a8297ad8cd9 201 else if (value > -2147483647LL && value < 2147483648LL)
Helmut Tschemernjak 1:3a8297ad8cd9 202 storeType = NVProperty::T_32BIT;
Helmut Tschemernjak 1:3a8297ad8cd9 203 else
Helmut Tschemernjak 1:3a8297ad8cd9 204 storeType = NVProperty::T_64BIT;
Helmut Tschemernjak 1:3a8297ad8cd9 205
Helmut Tschemernjak 1:3a8297ad8cd9 206 p->key = key;
Helmut Tschemernjak 1:3a8297ad8cd9 207 p->t.type = storeType;
Helmut Tschemernjak 1:3a8297ad8cd9 208
Helmut Tschemernjak 1:3a8297ad8cd9 209
Helmut Tschemernjak 1:3a8297ad8cd9 210 switch(storeType) {
Helmut Tschemernjak 1:3a8297ad8cd9 211 case NVProperty::T_BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 212 p->t.t_bit = value;
Helmut Tschemernjak 1:3a8297ad8cd9 213 break;
Helmut Tschemernjak 1:3a8297ad8cd9 214 case NVProperty::T_8BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 215 p->u.v_8bit = value;
Helmut Tschemernjak 1:3a8297ad8cd9 216 break;
Helmut Tschemernjak 1:3a8297ad8cd9 217 case NVProperty::T_16BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 218 p->u.v_16bit = value;
Helmut Tschemernjak 1:3a8297ad8cd9 219 break;
Helmut Tschemernjak 1:3a8297ad8cd9 220 case NVProperty::T_32BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 221 p->u.option.d_len = sizeof(p->data.v_32bit);
Helmut Tschemernjak 1:3a8297ad8cd9 222 {
Helmut Tschemernjak 1:3a8297ad8cd9 223 int32_t v = value;
Helmut Tschemernjak 1:3a8297ad8cd9 224 memcpy(&p->data.v_32bit, &v, sizeof(p->data.v_32bit));
Helmut Tschemernjak 1:3a8297ad8cd9 225 }
Helmut Tschemernjak 1:3a8297ad8cd9 226 break;
Helmut Tschemernjak 1:3a8297ad8cd9 227 case NVProperty::T_64BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 228 p->u.option.d_len = sizeof(p->data.v_64bit);
Helmut Tschemernjak 1:3a8297ad8cd9 229 memcpy(p->data.v_64bit, &value, sizeof(p->data.v_64bit));
Helmut Tschemernjak 1:3a8297ad8cd9 230 break;
Helmut Tschemernjak 1:3a8297ad8cd9 231 }
Helmut Tschemernjak 1:3a8297ad8cd9 232 int len;
Helmut Tschemernjak 1:3a8297ad8cd9 233 if (storeType == NVProperty::T_BIT || storeType == NVProperty::T_8BIT || storeType == NVProperty::T_16BIT || storeType == NVProperty::T_32BIT) {
Helmut Tschemernjak 1:3a8297ad8cd9 234 len = FLASH_ENTRY_MIN_SIZE;
Helmut Tschemernjak 1:3a8297ad8cd9 235 } else { // 64/STR/BLOB
Helmut Tschemernjak 1:3a8297ad8cd9 236 len = (FLASH_ENTRY_MIN_SIZE - 4) + p->u.option.d_len;
Helmut Tschemernjak 1:3a8297ad8cd9 237 len += _GetFlashPaddingSize(len);
Helmut Tschemernjak 1:3a8297ad8cd9 238 }
Helmut Tschemernjak 1:3a8297ad8cd9 239 if ((uint8_t *)_lastEntry + len >= _endAddress) {
Helmut Tschemernjak 1:3a8297ad8cd9 240 if (!_FlashReorgEntries(len))
Helmut Tschemernjak 1:3a8297ad8cd9 241 return NVProperty::NVP_ERR_NOSPACE;
Helmut Tschemernjak 1:3a8297ad8cd9 242 }
Helmut Tschemernjak 1:3a8297ad8cd9 243
Helmut Tschemernjak 1:3a8297ad8cd9 244 _OTPWrite((uint8_t *)_lastEntry, p, len);
Helmut Tschemernjak 1:3a8297ad8cd9 245 _lastEntry = (_flashEntry *)((uint8_t *)_lastEntry + len);
Helmut Tschemernjak 1:3a8297ad8cd9 246
Helmut Tschemernjak 1:3a8297ad8cd9 247 // _DumpAllEntires();
Helmut Tschemernjak 1:3a8297ad8cd9 248 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 249 }
Helmut Tschemernjak 1:3a8297ad8cd9 250
Helmut Tschemernjak 1:3a8297ad8cd9 251
Helmut Tschemernjak 1:3a8297ad8cd9 252 int
Helmut Tschemernjak 1:3a8297ad8cd9 253 NVProperty_L4OTP::SetPropertyStr(int key, const char *value, int type)
Helmut Tschemernjak 1:3a8297ad8cd9 254 {
Helmut Tschemernjak 1:3a8297ad8cd9 255 if (type != NVProperty::T_STR)
Helmut Tschemernjak 1:3a8297ad8cd9 256 return NVProperty::NVP_INVALD_PARM;
Helmut Tschemernjak 1:3a8297ad8cd9 257
Helmut Tschemernjak 1:3a8297ad8cd9 258 _flashEntry *p = _GetFlashEntry(key);
Helmut Tschemernjak 1:3a8297ad8cd9 259 if (p && p->t.type == NVProperty::T_STR && strcmp(p->data.v_str, value) == 0) {
Helmut Tschemernjak 1:3a8297ad8cd9 260 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 261 }
Helmut Tschemernjak 1:3a8297ad8cd9 262
Helmut Tschemernjak 1:3a8297ad8cd9 263 int err = NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 264
Helmut Tschemernjak 1:3a8297ad8cd9 265 p = new _flashEntry();
Helmut Tschemernjak 1:3a8297ad8cd9 266 if (!p)
Helmut Tschemernjak 1:3a8297ad8cd9 267 return NVProperty::NVP_ERR_NOSPACE;
Helmut Tschemernjak 1:3a8297ad8cd9 268
Helmut Tschemernjak 1:3a8297ad8cd9 269 p->key = key;
Helmut Tschemernjak 1:3a8297ad8cd9 270 p->t.type = NVProperty::T_STR;
Helmut Tschemernjak 1:3a8297ad8cd9 271 int cplen = std::min(strlen(value), sizeof(p->data.v_str)-1);
Helmut Tschemernjak 1:3a8297ad8cd9 272 memcpy(p->data.v_str, value, cplen);
Helmut Tschemernjak 1:3a8297ad8cd9 273 p->u.option.d_len = cplen + 1; // zero term
Helmut Tschemernjak 1:3a8297ad8cd9 274
Helmut Tschemernjak 1:3a8297ad8cd9 275 int len = (FLASH_ENTRY_MIN_SIZE - 4) + p->u.option.d_len;
Helmut Tschemernjak 1:3a8297ad8cd9 276 len += _GetFlashPaddingSize(len);
Helmut Tschemernjak 1:3a8297ad8cd9 277
Helmut Tschemernjak 1:3a8297ad8cd9 278 if ((uint8_t *)_lastEntry + len >= _endAddress) {
Helmut Tschemernjak 1:3a8297ad8cd9 279 if (!_FlashReorgEntries(len)) {
Helmut Tschemernjak 1:3a8297ad8cd9 280 err = NVProperty::NVP_ERR_NOSPACE;
Helmut Tschemernjak 1:3a8297ad8cd9 281 goto done;
Helmut Tschemernjak 1:3a8297ad8cd9 282 }
Helmut Tschemernjak 1:3a8297ad8cd9 283 }
Helmut Tschemernjak 1:3a8297ad8cd9 284
Helmut Tschemernjak 1:3a8297ad8cd9 285 _OTPWrite((uint8_t *)_lastEntry, p, len);
Helmut Tschemernjak 1:3a8297ad8cd9 286 _lastEntry = (_flashEntry *)((uint8_t *)_lastEntry + len);
Helmut Tschemernjak 1:3a8297ad8cd9 287
Helmut Tschemernjak 1:3a8297ad8cd9 288 done:
Helmut Tschemernjak 1:3a8297ad8cd9 289 delete[] p;
Helmut Tschemernjak 1:3a8297ad8cd9 290 // _DumpAllEntires();
Helmut Tschemernjak 1:3a8297ad8cd9 291 return err;
Helmut Tschemernjak 1:3a8297ad8cd9 292 }
Helmut Tschemernjak 1:3a8297ad8cd9 293
Helmut Tschemernjak 1:3a8297ad8cd9 294 int
Helmut Tschemernjak 1:3a8297ad8cd9 295 NVProperty_L4OTP::SetPropertyBlob(int key, const void *blob, int size, int type)
Helmut Tschemernjak 1:3a8297ad8cd9 296 {
Helmut Tschemernjak 1:3a8297ad8cd9 297 if (type != NVProperty::T_BLOB)
Helmut Tschemernjak 1:3a8297ad8cd9 298 return NVProperty::NVP_INVALD_PARM;
Helmut Tschemernjak 1:3a8297ad8cd9 299
Helmut Tschemernjak 1:3a8297ad8cd9 300 _flashEntry *p = _GetFlashEntry(key);
Helmut Tschemernjak 1:3a8297ad8cd9 301 if (p && p->t.type == NVProperty::T_BLOB && size == p->u.option.d_len) { // check for duplicate
Helmut Tschemernjak 1:3a8297ad8cd9 302 if (memcmp(blob, p->data.v_blob, size) == 0)
Helmut Tschemernjak 1:3a8297ad8cd9 303 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 304 }
Helmut Tschemernjak 1:3a8297ad8cd9 305 int err = NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 306
Helmut Tschemernjak 1:3a8297ad8cd9 307 p = new _flashEntry();
Helmut Tschemernjak 1:3a8297ad8cd9 308 if (!p)
Helmut Tschemernjak 1:3a8297ad8cd9 309 return NVProperty::NVP_ERR_NOSPACE;
Helmut Tschemernjak 1:3a8297ad8cd9 310
Helmut Tschemernjak 1:3a8297ad8cd9 311 p->key = key;
Helmut Tschemernjak 1:3a8297ad8cd9 312 p->t.type = NVProperty::T_BLOB;
Helmut Tschemernjak 1:3a8297ad8cd9 313 int cplen = std::min(size, (int)sizeof(p->data.v_blob));
Helmut Tschemernjak 1:3a8297ad8cd9 314 p->u.option.d_len = cplen;
Helmut Tschemernjak 1:3a8297ad8cd9 315 memcpy(p->data.v_blob, blob, cplen);
Helmut Tschemernjak 1:3a8297ad8cd9 316
Helmut Tschemernjak 1:3a8297ad8cd9 317 int len = (FLASH_ENTRY_MIN_SIZE - 4) + p->u.option.d_len;
Helmut Tschemernjak 1:3a8297ad8cd9 318 len += _GetFlashPaddingSize(len);
Helmut Tschemernjak 1:3a8297ad8cd9 319
Helmut Tschemernjak 1:3a8297ad8cd9 320 if ((uint8_t *)_lastEntry + len >= _endAddress) {
Helmut Tschemernjak 1:3a8297ad8cd9 321 if (!_FlashReorgEntries(len)) {
Helmut Tschemernjak 1:3a8297ad8cd9 322 err = NVProperty::NVP_ERR_NOSPACE;
Helmut Tschemernjak 1:3a8297ad8cd9 323 goto done;
Helmut Tschemernjak 1:3a8297ad8cd9 324 }
Helmut Tschemernjak 1:3a8297ad8cd9 325 }
Helmut Tschemernjak 1:3a8297ad8cd9 326
Helmut Tschemernjak 1:3a8297ad8cd9 327 _OTPWrite((uint8_t *)_lastEntry, p, len);
Helmut Tschemernjak 1:3a8297ad8cd9 328 _lastEntry = (_flashEntry *)((uint8_t *)_lastEntry + len);
Helmut Tschemernjak 1:3a8297ad8cd9 329
Helmut Tschemernjak 1:3a8297ad8cd9 330 done:
Helmut Tschemernjak 1:3a8297ad8cd9 331 delete[] p;
Helmut Tschemernjak 1:3a8297ad8cd9 332 // _DumpAllEntires();
Helmut Tschemernjak 1:3a8297ad8cd9 333 return err;
Helmut Tschemernjak 1:3a8297ad8cd9 334 }
Helmut Tschemernjak 1:3a8297ad8cd9 335
Helmut Tschemernjak 1:3a8297ad8cd9 336 int
Helmut Tschemernjak 1:3a8297ad8cd9 337 NVProperty_L4OTP::EraseProperty(int key)
Helmut Tschemernjak 1:3a8297ad8cd9 338 {
Helmut Tschemernjak 1:3a8297ad8cd9 339 uint8_t valbuf[FLASH_ENTRY_MIN_SIZE];
Helmut Tschemernjak 1:3a8297ad8cd9 340 _flashEntry *p = (_flashEntry *) valbuf;
Helmut Tschemernjak 1:3a8297ad8cd9 341
Helmut Tschemernjak 1:3a8297ad8cd9 342 _flashEntry *op = _GetFlashEntry(key);
Helmut Tschemernjak 1:3a8297ad8cd9 343 if (!op)
Helmut Tschemernjak 1:3a8297ad8cd9 344 return NVProperty::NVP_ENOENT;
Helmut Tschemernjak 1:3a8297ad8cd9 345 if (op->t.deleted)
Helmut Tschemernjak 1:3a8297ad8cd9 346 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 347
Helmut Tschemernjak 1:3a8297ad8cd9 348 memset(valbuf, 0, sizeof(valbuf));
Helmut Tschemernjak 1:3a8297ad8cd9 349 p->key = key;
Helmut Tschemernjak 1:3a8297ad8cd9 350 p->t.type = op->t.type;
Helmut Tschemernjak 1:3a8297ad8cd9 351 p->t.deleted = true;
Helmut Tschemernjak 1:3a8297ad8cd9 352
Helmut Tschemernjak 1:3a8297ad8cd9 353 if ((uint8_t *)_lastEntry + FLASH_ENTRY_MIN_SIZE > _endAddress) {
Helmut Tschemernjak 1:3a8297ad8cd9 354 if (!_FlashReorgEntries(FLASH_ENTRY_MIN_SIZE))
Helmut Tschemernjak 1:3a8297ad8cd9 355 return NVProperty::NVP_ERR_NOSPACE;
Helmut Tschemernjak 1:3a8297ad8cd9 356 }
Helmut Tschemernjak 1:3a8297ad8cd9 357
Helmut Tschemernjak 1:3a8297ad8cd9 358 _OTPWrite((uint8_t *)_lastEntry, p, FLASH_ENTRY_MIN_SIZE);
Helmut Tschemernjak 1:3a8297ad8cd9 359 _lastEntry = (_flashEntry *)((uint8_t *)_lastEntry + FLASH_ENTRY_MIN_SIZE);
Helmut Tschemernjak 1:3a8297ad8cd9 360
Helmut Tschemernjak 1:3a8297ad8cd9 361 // _DumpAllEntires();
Helmut Tschemernjak 1:3a8297ad8cd9 362 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 363 }
Helmut Tschemernjak 1:3a8297ad8cd9 364
Helmut Tschemernjak 1:3a8297ad8cd9 365 int
Helmut Tschemernjak 1:3a8297ad8cd9 366 NVProperty_L4OTP::ReorgProperties(void)
Helmut Tschemernjak 1:3a8297ad8cd9 367 {
Helmut Tschemernjak 1:3a8297ad8cd9 368 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 369 }
Helmut Tschemernjak 1:3a8297ad8cd9 370
Helmut Tschemernjak 1:3a8297ad8cd9 371
Helmut Tschemernjak 1:3a8297ad8cd9 372 int
Helmut Tschemernjak 1:3a8297ad8cd9 373 NVProperty_L4OTP::OpenPropertyStore(bool forWrite)
Helmut Tschemernjak 1:3a8297ad8cd9 374 {
Helmut Tschemernjak 1:3a8297ad8cd9 375 UNUSED(forWrite);
Helmut Tschemernjak 1:3a8297ad8cd9 376 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 377 }
Helmut Tschemernjak 1:3a8297ad8cd9 378
Helmut Tschemernjak 1:3a8297ad8cd9 379 int
Helmut Tschemernjak 1:3a8297ad8cd9 380 NVProperty_L4OTP::ClosePropertyStore(bool flush)
Helmut Tschemernjak 1:3a8297ad8cd9 381 {
Helmut Tschemernjak 1:3a8297ad8cd9 382 return NVProperty::NVP_OK;
Helmut Tschemernjak 1:3a8297ad8cd9 383 }
Helmut Tschemernjak 1:3a8297ad8cd9 384
Helmut Tschemernjak 1:3a8297ad8cd9 385 #if 1
Helmut Tschemernjak 1:3a8297ad8cd9 386 void
Helmut Tschemernjak 1:3a8297ad8cd9 387 NVProperty_L4OTP::_DumpAllEntires(void)
Helmut Tschemernjak 1:3a8297ad8cd9 388 {
Helmut Tschemernjak 1:3a8297ad8cd9 389 if (!_debug)
Helmut Tschemernjak 1:3a8297ad8cd9 390 return;
Helmut Tschemernjak 1:3a8297ad8cd9 391
Helmut Tschemernjak 1:3a8297ad8cd9 392 dprintf("------------- DumpAllEntires -------- ");
Helmut Tschemernjak 1:3a8297ad8cd9 393
Helmut Tschemernjak 1:3a8297ad8cd9 394 int index = 0;
Helmut Tschemernjak 1:3a8297ad8cd9 395 _flashEntry *p = (_flashEntry *)(_startAddress + sizeof(_flash_header));
Helmut Tschemernjak 1:3a8297ad8cd9 396 while((uint8_t *)p < _endAddress && p->key != NVProperty::PROPERTIES_EOF) {
Helmut Tschemernjak 1:3a8297ad8cd9 397
Helmut Tschemernjak 1:3a8297ad8cd9 398 int64_t value = 0;
Helmut Tschemernjak 1:3a8297ad8cd9 399 switch(p->t.type) {
Helmut Tschemernjak 1:3a8297ad8cd9 400 case NVProperty::T_BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 401 if (p->t.t_bit)
Helmut Tschemernjak 1:3a8297ad8cd9 402 value = 1;
Helmut Tschemernjak 1:3a8297ad8cd9 403 else
Helmut Tschemernjak 1:3a8297ad8cd9 404 value = 0;
Helmut Tschemernjak 1:3a8297ad8cd9 405 break;
Helmut Tschemernjak 1:3a8297ad8cd9 406 case NVProperty::T_8BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 407 value = p->u.v_8bit;
Helmut Tschemernjak 1:3a8297ad8cd9 408 break;
Helmut Tschemernjak 1:3a8297ad8cd9 409 case NVProperty::T_16BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 410 {
Helmut Tschemernjak 1:3a8297ad8cd9 411 int16_t v;
Helmut Tschemernjak 1:3a8297ad8cd9 412 memcpy(&v, &p->u.v_16bit, sizeof(p->u.v_16bit));
Helmut Tschemernjak 1:3a8297ad8cd9 413 value = v;
Helmut Tschemernjak 1:3a8297ad8cd9 414 }
Helmut Tschemernjak 1:3a8297ad8cd9 415 break;
Helmut Tschemernjak 1:3a8297ad8cd9 416 case NVProperty::T_32BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 417 {
Helmut Tschemernjak 1:3a8297ad8cd9 418 int32_t v;
Helmut Tschemernjak 1:3a8297ad8cd9 419 memcpy(&v, &p->data.v_32bit, sizeof(p->data.v_32bit));
Helmut Tschemernjak 1:3a8297ad8cd9 420 value = v;
Helmut Tschemernjak 1:3a8297ad8cd9 421 }
Helmut Tschemernjak 1:3a8297ad8cd9 422 break;
Helmut Tschemernjak 1:3a8297ad8cd9 423 case NVProperty::T_64BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 424 memcpy(&value, p->data.v_64bit, sizeof(p->data.v_64bit));
Helmut Tschemernjak 1:3a8297ad8cd9 425 break;
Helmut Tschemernjak 1:3a8297ad8cd9 426 case NVProperty::T_STR:
Helmut Tschemernjak 1:3a8297ad8cd9 427 case NVProperty::T_BLOB:
Helmut Tschemernjak 1:3a8297ad8cd9 428 value = p->u.option.d_len;
Helmut Tschemernjak 1:3a8297ad8cd9 429 break;
Helmut Tschemernjak 1:3a8297ad8cd9 430 }
Helmut Tschemernjak 1:3a8297ad8cd9 431 index++;
Helmut Tschemernjak 1:3a8297ad8cd9 432 if (p->t.deleted) {
Helmut Tschemernjak 1:3a8297ad8cd9 433 dprintf("Dump[%.2d] Key: %d Type: %d deleted(%d)", index, p->key, p->t.type, p->t.deleted);
Helmut Tschemernjak 1:3a8297ad8cd9 434
Helmut Tschemernjak 1:3a8297ad8cd9 435 } else if (p->t.type == NVProperty::T_STR) {
Helmut Tschemernjak 1:3a8297ad8cd9 436 dprintf("Dump[%.2d] Key: %d Type: %d value: %s", index, p->key, p->t.type, p->data.v_str);
Helmut Tschemernjak 1:3a8297ad8cd9 437 } else if (p->t.type == NVProperty::T_BLOB) {
Helmut Tschemernjak 1:3a8297ad8cd9 438 dprintf("Dump[%.2d] Key: %d Type: %d len: %d", index, p->key, p->t.type, p->u.option.d_len);
Helmut Tschemernjak 1:3a8297ad8cd9 439 dump("Blob", p->data.v_str, p->u.option.d_len);
Helmut Tschemernjak 1:3a8297ad8cd9 440 } else {
Helmut Tschemernjak 1:3a8297ad8cd9 441 if (p->t.type == NVProperty::T_64BIT) {
Helmut Tschemernjak 1:3a8297ad8cd9 442 dprintf("Dump[%.2d] Key: %d Type: %d value: %lld (0x%llx)", index, p->key, p->t.type, value, value);
Helmut Tschemernjak 1:3a8297ad8cd9 443 } else {
Helmut Tschemernjak 1:3a8297ad8cd9 444 dprintf("Dump[%.2d] Key: %d Type: %d value: %ld (0x%x)", index, p->key, p->t.type, (int32_t)value, (unsigned int)value);
Helmut Tschemernjak 1:3a8297ad8cd9 445 }
Helmut Tschemernjak 1:3a8297ad8cd9 446 }
Helmut Tschemernjak 1:3a8297ad8cd9 447
Helmut Tschemernjak 1:3a8297ad8cd9 448 p = (_flashEntry *)((uint8_t *)p + _GetFlashEntryLen(p));
Helmut Tschemernjak 1:3a8297ad8cd9 449 }
Helmut Tschemernjak 1:3a8297ad8cd9 450 int freebytes = _endAddress -(uint8_t *)_lastEntry;
Helmut Tschemernjak 1:3a8297ad8cd9 451 if (_lastEntry)
Helmut Tschemernjak 1:3a8297ad8cd9 452 dprintf("------ %d bytes free -------", freebytes);
Helmut Tschemernjak 1:3a8297ad8cd9 453 }
Helmut Tschemernjak 1:3a8297ad8cd9 454 #endif
Helmut Tschemernjak 1:3a8297ad8cd9 455
Helmut Tschemernjak 1:3a8297ad8cd9 456 NVProperty_L4OTP::_flashEntry *
Helmut Tschemernjak 1:3a8297ad8cd9 457 NVProperty_L4OTP::_GetFlashEntry(int key, uint8_t *start)
Helmut Tschemernjak 1:3a8297ad8cd9 458 {
Helmut Tschemernjak 1:3a8297ad8cd9 459 _flashEntry *p;
Helmut Tschemernjak 1:3a8297ad8cd9 460
Helmut Tschemernjak 1:3a8297ad8cd9 461 if (start)
Helmut Tschemernjak 1:3a8297ad8cd9 462 p = (_flashEntry *)start;
Helmut Tschemernjak 1:3a8297ad8cd9 463 else
Helmut Tschemernjak 1:3a8297ad8cd9 464 p = (_flashEntry *)(_startAddress + sizeof(_flash_header));
Helmut Tschemernjak 1:3a8297ad8cd9 465 _flashEntry *lastP = NULL;
Helmut Tschemernjak 1:3a8297ad8cd9 466 while(true) {
Helmut Tschemernjak 1:3a8297ad8cd9 467 if ((uint8_t*)p >= _endAddress || p->key == NVProperty::PROPERTIES_EOF) {
Helmut Tschemernjak 1:3a8297ad8cd9 468 if ((uint8_t*)p <= _endAddress)
Helmut Tschemernjak 1:3a8297ad8cd9 469 _lastEntry = p;
Helmut Tschemernjak 1:3a8297ad8cd9 470 if (!lastP || lastP->t.deleted)
Helmut Tschemernjak 1:3a8297ad8cd9 471 return NULL;
Helmut Tschemernjak 1:3a8297ad8cd9 472 break;
Helmut Tschemernjak 1:3a8297ad8cd9 473 }
Helmut Tschemernjak 1:3a8297ad8cd9 474 if (p->key == key)
Helmut Tschemernjak 1:3a8297ad8cd9 475 lastP = p;
Helmut Tschemernjak 1:3a8297ad8cd9 476
Helmut Tschemernjak 1:3a8297ad8cd9 477 p = (_flashEntry *)((uint8_t *)p + _GetFlashEntryLen(p));
Helmut Tschemernjak 1:3a8297ad8cd9 478 }
Helmut Tschemernjak 1:3a8297ad8cd9 479 return lastP;
Helmut Tschemernjak 1:3a8297ad8cd9 480 }
Helmut Tschemernjak 1:3a8297ad8cd9 481
Helmut Tschemernjak 1:3a8297ad8cd9 482
Helmut Tschemernjak 1:3a8297ad8cd9 483 int
Helmut Tschemernjak 1:3a8297ad8cd9 484 NVProperty_L4OTP::_GetFlashEntryLen(_flashEntry *p)
Helmut Tschemernjak 1:3a8297ad8cd9 485 {
Helmut Tschemernjak 1:3a8297ad8cd9 486 int len = 0;
Helmut Tschemernjak 1:3a8297ad8cd9 487
Helmut Tschemernjak 1:3a8297ad8cd9 488 switch(p->t.type) {
Helmut Tschemernjak 1:3a8297ad8cd9 489 case NVProperty::T_64BIT:
Helmut Tschemernjak 1:3a8297ad8cd9 490 case NVProperty::T_STR:
Helmut Tschemernjak 1:3a8297ad8cd9 491 case NVProperty::T_BLOB:
Helmut Tschemernjak 1:3a8297ad8cd9 492 len = (FLASH_ENTRY_MIN_SIZE - 4) + p->u.option.d_len;
Helmut Tschemernjak 1:3a8297ad8cd9 493 len += _GetFlashPaddingSize(len);
Helmut Tschemernjak 1:3a8297ad8cd9 494 break;
Helmut Tschemernjak 1:3a8297ad8cd9 495 default:
Helmut Tschemernjak 1:3a8297ad8cd9 496 len = FLASH_ENTRY_MIN_SIZE;
Helmut Tschemernjak 1:3a8297ad8cd9 497 }
Helmut Tschemernjak 1:3a8297ad8cd9 498 return len;
Helmut Tschemernjak 1:3a8297ad8cd9 499 }
Helmut Tschemernjak 1:3a8297ad8cd9 500
Helmut Tschemernjak 1:3a8297ad8cd9 501 int
Helmut Tschemernjak 1:3a8297ad8cd9 502 NVProperty_L4OTP::_GetFlashPaddingSize(int len)
Helmut Tschemernjak 1:3a8297ad8cd9 503 {
Helmut Tschemernjak 1:3a8297ad8cd9 504 int remain = len % FLASH_PADDING_SIZE;
Helmut Tschemernjak 1:3a8297ad8cd9 505
Helmut Tschemernjak 1:3a8297ad8cd9 506 if (remain == 0)
Helmut Tschemernjak 1:3a8297ad8cd9 507 return 0;
Helmut Tschemernjak 1:3a8297ad8cd9 508
Helmut Tschemernjak 1:3a8297ad8cd9 509 return (len + FLASH_PADDING_SIZE - remain) - len;
Helmut Tschemernjak 1:3a8297ad8cd9 510 }
Helmut Tschemernjak 1:3a8297ad8cd9 511
Helmut Tschemernjak 1:3a8297ad8cd9 512
Helmut Tschemernjak 1:3a8297ad8cd9 513 int
Helmut Tschemernjak 1:3a8297ad8cd9 514 NVProperty_L4OTP::_FlashReorgEntries(int minRequiredSpace)
Helmut Tschemernjak 1:3a8297ad8cd9 515 {
Helmut Tschemernjak 1:3a8297ad8cd9 516 return 0; // no reorg on OTP
Helmut Tschemernjak 1:3a8297ad8cd9 517 }
Helmut Tschemernjak 1:3a8297ad8cd9 518
Helmut Tschemernjak 1:3a8297ad8cd9 519
Helmut Tschemernjak 1:3a8297ad8cd9 520 void
Helmut Tschemernjak 1:3a8297ad8cd9 521 NVProperty_L4OTP::_OTPWrite(uint8_t *address, const void *d, size_t length)
Helmut Tschemernjak 1:3a8297ad8cd9 522 {
Helmut Tschemernjak 1:3a8297ad8cd9 523 #ifdef OTP_TEST_IN_RAM
Helmut Tschemernjak 1:3a8297ad8cd9 524 memcpy(address, d, length);
Helmut Tschemernjak 1:3a8297ad8cd9 525 #else
Helmut Tschemernjak 1:3a8297ad8cd9 526 OTPWrite(address, d, length);
Helmut Tschemernjak 1:3a8297ad8cd9 527 #endif
Helmut Tschemernjak 1:3a8297ad8cd9 528 }
Helmut Tschemernjak 1:3a8297ad8cd9 529
Helmut Tschemernjak 1:3a8297ad8cd9 530 #endif // TARGET_STM32L4