NVProperty generic key value store using the MCU flash area.

Dependents:   Turtle_RadioShuttle

Committer:
Helmut Tschemernjak
Date:
Thu Jan 24 15:38:20 2019 +0100
Revision:
3:968b84113ef3
Parent:
2:7ab0f5202860
Child:
5:2560e615ccd5
Updated

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