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