NVProperty generic key value store using the MCU flash area.

Dependents:   Turtle_RadioShuttle

Committer:
Helmut Tschemernjak
Date:
Thu Jan 24 14:28:11 2019 +0100
Revision:
1:3a8297ad8cd9
Child:
2:7ab0f5202860
Added new files

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