source: trunk/firmware/CubeMX/Src/feeprom.c

Last change on this file was 1, checked in by f.jahn, 3 years ago
File size: 16.9 KB
RevLine 
[1]1// Fake EEPROM
2
3#include <string.h>
4
5#include "feeprom.h"
6#include "main.h"
7#include "SEGGER_RTT.h"
8
9typedef struct
10{
11 // Schnittstellenparameter
12 uint32_t baudrate;
13 uint16_t parity_mode;
14 uint16_t stopBits;
15 uint16_t slave_address;
16
17 //--- GERTE PARAMETER GERTE SPEZIFISCH ---
18 uint16_t temperature_shutdown;
19 int16_t ab_middle_point_offset;
20 uint16_t i_plus_offset;
21 uint16_t i_minus_offset;
22 uint16_t copper_v_drop;
23 uint16_t copper_v_drop_adc;
24 uint16_t shortcut_current_in_mV;
25 uint16_t inrush_max_current_in_mV;
26 uint16_t inrush_max_current_in_adc;
27 uint16_t inrush_curr_period;
28 uint16_t inrush_curr_integral_steps;
29 uint16_t lockKey;
30
31} feeprom_data_t;
32
33typedef struct
34{
35 // Eeprom Status Infos
36 uint8_t firstStartId;
37 uint8_t res[3]; // 4 bit alignment
38 uint32_t writeCounter;
39 uint16_t structureSize;
40 uint16_t revisionInfo;
41} feeprom_state_t;
42
43typedef struct
44{
45 // Gerteinformation
46 uint32_t SN;
47 uint8_t deviceInfoWritten;
48 uint8_t resv[3]; // 4 bit alignment
49} device_info_t;
50
51typedef struct __attribute__((packed))
52{
53 uint16_t startup_cnt;
54 uint16_t overtemp_error_cnt;
55 uint16_t overcurrent_error_cnt;
56 uint16_t overload_error_cnt;
57 uint16_t lowbat_error_cnt;
58 uint16_t lvp_cnt;
59 uint16_t ovp_cnt;
60 uint16_t switch_cnt;
61 uint16_t mosfets_voltagedrop_error_cnt;
62}log_data_t;
63
64// fasse zu einer Struktur zusammen um nachher einfach darauf zugreifen zu knnen
65typedef struct __attribute__((packed))
66{
67 feeprom_data_t changedData; // packed
68 feeprom_state_t feepromState;
69 device_info_t deviceInfo;
70} feeprom_stored_data_t;
71
72static const feeprom_data_t defaultFeepromData =
73{
74 //--- GERTE PARAMETER ALLGEMEIN ---
75 MB_BAUDRATE_DEFAULT,
76 MB_PARITY_MODE_DEFAULT,
77 MB_STOPBITS_DEFAULT,
78 MB_SLAVE_ADRESS_DEFAULT,
79
80 //--- GERTE PARAMETER GERTE SPEZIFISCH ---
81 MAX_TEMP,
82 0,
83 0,
84 0,
85 COPPER_V_DROP_AT_CONTROL_CURRENT_mV,
86 ADC_VALUE_AT_CONTROL_CURRENT,
87 SHORTCUT_CURRENT_mV,
88 INRUSH_CURRENT_mV,
89 ADC_VALUE_AT_INRUSH_CURRENT,
90 CURRENT_INTEGRATION_PERIOD,
91 CURRENT_INTEGRATION_STEPS,
92 0,
93};
94
95// Flash related defines
96#define USER_FLASH_BASE_ADDRESS FLASH_BASE
97#define USER_FLASH_SIZE (128*1024) // 128Kb
98#define USER_FLASH_PAGE_SIZE FLASH_PAGE_SIZE
99
100#define USER_FEEPROM_BASE_ADDRESS (USER_FLASH_END - (USER_FLASH_PAGE_SIZE * NUMBER_OF_PAGES))
101#define USER_FLASH_END (USER_FLASH_BASE_ADDRESS + USER_FLASH_SIZE)
102#define FEEPROM_ADDRESS_FIRST_START_ID (USER_FEEPROM_BASE_ADDRESS + SIZEOF_CHANGED_FEEPROM_DATA)
103#define NUMBER_OF_PAGES 2
104#define FIRST_START_ID 0x65 // GS = Green Switch
105#define USER_STAT_BASE_ADDRESS (USER_FLASH_END - (USER_FLASH_PAGE_SIZE * 1)) // Stat-data position
106
107// Data to store related defines
108#define SIZEOF_CHANGED_FEEPROM_DATA (sizeof(feeprom_data_t))
109#define SIZEOF_DEVICE_INFO (sizeof(device_info_t))
110#define SIZEOF_FEEPROM_STATE (sizeof(feeprom_state_t))
111#define SIZEOF_FEEPROM_STORED_DATA (sizeof(feeprom_stored_data_t))
112#define SIZEOF_FEEPROM_LOG_DATA (sizeof(log_data_t))
113
114#define SIZE_OF_DATA_TO_STORE (SIZEOF_CHANGED_FEEPROM_DATA + SIZEOF_DEVICE_INFO + SIZEOF_FEEPROM_STATE)
115
116// muss modulo 8 noch hinzufgen wg 8 byte alignment
117#define SIZEOF_RAW_FEEPROM_DATA ((SIZE_OF_DATA_TO_STORE/8) + ((SIZE_OF_DATA_TO_STORE%8)?1:0))
118#define SIZEOF_RAW_FEEPROM_LOG_DATA ((SIZEOF_FEEPROM_LOG_DATA/8) + ((SIZEOF_FEEPROM_LOG_DATA%8)?1:0))
119static uint64_t feepromData[SIZEOF_RAW_FEEPROM_DATA];
120static uint64_t feepromLogData[SIZEOF_RAW_FEEPROM_LOG_DATA];
121
122extern uint16_t savedLockKey;
123
124//-----------------------------------------------------------------------------
125
126size_t FEEPROM_ConfigFreeBytes(void)
127{
128 return (1 * USER_FLASH_PAGE_SIZE - SIZE_OF_DATA_TO_STORE);
129}
130
131//-----------------------------------------------------------------------------
132
133size_t FEEPROM_StatFreeBytes(void)
134{
135 return (1 * USER_FLASH_PAGE_SIZE - SIZEOF_FEEPROM_LOG_DATA);
136}
137
138//-----------------------------------------------------------------------------
139
140int getFEEPROMData(size_t address, uint8_t *data, uint32_t len)
141{
142 // Exiting with error, if requested data location is beyond of FLASH size
143 if ((address + len) > USER_FLASH_END) return 1;
144
145 // Reading from FLASH memory <len> bytes, starting from <address>
146 for (int i = 0; i < len; i++) data[i] = *((uint8_t*)(address + i));
147
148 return 0; // No error
149}
150
151//-----------------------------------------------------------------------------
152
153int WriteConfigToFLASH(void)
154{
155 if (HAL_FLASH_Unlock() == HAL_OK)
156 {
157 __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
158
159 /* Fill EraseInit structure*/
160 FLASH_EraseInitTypeDef EraseInit;
161
162 EraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
163 EraseInit.Page = FLASH_PAGE_NB - 2; // This page contains device critical parameters
164 EraseInit.NbPages = 1;
165
166 uint32_t PageError;
167
168 /* Erase Sektoren daten drfen nicht im instuction cache liegen */
169 if (HAL_FLASHEx_Erase(&EraseInit, &PageError) == HAL_OK)
170 {
171 /* Programmiere uint64_t */
172 size_t Address = USER_FEEPROM_BASE_ADDRESS;
173 uint32_t x = 0;
174
175 while (Address < (USER_FEEPROM_BASE_ADDRESS + SIZE_OF_DATA_TO_STORE))
176 {
177 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, feepromData[x]) == HAL_OK)
178 {
179 Address = Address + 8;
180 x++;
181 }
182 else
183 {
184 __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
185 HAL_FLASH_Lock();
186 return 3;
187 }
188 }
189 }
190 else
191 {
192 __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
193 HAL_FLASH_Lock();
194 return 2;
195 }
196
197 __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
198 }
199 else return 1;
200
201 if (HAL_FLASH_Lock() != HAL_OK) return 4;
202
203 return 0;
204}
205
206//-----------------------------------------------------------------------------
207
208int FEEPROM_readConfig(sys_data_t *data)
209{
210 feeprom_stored_data_t *dataToStore;
211
212 if (getFEEPROMData(USER_FEEPROM_BASE_ADDRESS, (uint8_t*)feepromData, SIZEOF_FEEPROM_STORED_DATA)) return 1; // Error
213
214 dataToStore = (feeprom_stored_data_t*)feepromData;
215
216 //memcpy(data, dataToStore, SIZEOF_CHANGED_FEEPROM_DATA);
217
218 data->s.baudrate = dataToStore->changedData.baudrate;
219 data->s.parity_mode = dataToStore->changedData.parity_mode;
220 data->s.stopBits = dataToStore->changedData.stopBits;
221 data->s.slave_address = dataToStore->changedData.slave_address;
222
223 data->s.temperature_shutdown = dataToStore->changedData.temperature_shutdown;
224 data->s.ab_middle_point_offset = dataToStore->changedData.ab_middle_point_offset;
225 data->s.copper_v_drop = dataToStore->changedData.copper_v_drop;
226 data->s.copper_v_drop_adc = dataToStore->changedData.copper_v_drop_adc;
227 data->s.shortcut_current_in_mV = dataToStore->changedData.shortcut_current_in_mV;
228 data->s.inrush_max_current_in_mV = dataToStore->changedData.inrush_max_current_in_mV;
229 data->s.inrush_max_current_in_adc = dataToStore->changedData.inrush_max_current_in_adc;
230 data->s.inrush_curr_period = dataToStore->changedData.inrush_curr_period;
231 data->s.inrush_curr_integral_steps = dataToStore->changedData.inrush_curr_integral_steps;
232 data->s.i_plus_offset = dataToStore->changedData.i_plus_offset;
233 data->s.i_minus_offset = dataToStore->changedData.i_minus_offset;
234
235 savedLockKey = dataToStore->changedData.lockKey;
236 if (savedLockKey != 0) data->s.writeLocked = 1 ;
237
238 data->s.device_sn = dataToStore->deviceInfo.SN;
239
240 // prfe Eeprom Status Infos
241 if(dataToStore->feepromState.structureSize != SIZEOF_FEEPROM_STORED_DATA) return 2;
242 if(dataToStore->feepromState.revisionInfo != 0) return 3;
243 if(dataToStore->feepromState.firstStartId != FIRST_START_ID) return 4;
244
245 return 0; // No error
246}
247
248//-----------------------------------------------------------------------------
249
250int FEEPROM_storeConfig(sys_data_t *data, uint8_t withSN)
251{
252 feeprom_stored_data_t *dataToStore;
253
254 /****************LESE_WERTE_AUS_SYSDATA*********************/
255 dataToStore = (feeprom_stored_data_t *)feepromData;
256
257 // Copying values to be stored
258 //memcpy(&dataToStore->changedData.s.baudrate, &data->s.baudrate, SIZEOF_CHANGED_FEEPROM_DATA - 10);
259
260 dataToStore->changedData.baudrate = data->s.baudrate;
261 dataToStore->changedData.parity_mode = data->s.parity_mode;
262 dataToStore->changedData.stopBits = data->s.stopBits;
263 dataToStore->changedData.slave_address = data->s.slave_address;
264
265 dataToStore->changedData.temperature_shutdown = data->s.temperature_shutdown;
266 dataToStore->changedData.ab_middle_point_offset = data->s.ab_middle_point_offset;
267 dataToStore->changedData.copper_v_drop = data->s.copper_v_drop;
268 dataToStore->changedData.copper_v_drop_adc = data->s.copper_v_drop_adc;
269 dataToStore->changedData.shortcut_current_in_mV = data->s.shortcut_current_in_mV;
270 dataToStore->changedData.inrush_max_current_in_mV = data->s.inrush_max_current_in_mV;
271 dataToStore->changedData.inrush_max_current_in_adc = data->s.inrush_max_current_in_adc;
272 dataToStore->changedData.inrush_curr_period = data->s.inrush_curr_period;
273 dataToStore->changedData.inrush_curr_integral_steps = data->s.inrush_curr_integral_steps;
274 dataToStore->changedData.lockKey = data->s.newLockKey;
275 dataToStore->changedData.i_plus_offset = data->s.i_plus_offset;
276 dataToStore->changedData.i_minus_offset = data->s.i_minus_offset;
277
278 // Eeprom Status Infos
279 dataToStore->feepromState.writeCounter++;
280 dataToStore->feepromState.structureSize = SIZEOF_FEEPROM_STORED_DATA;
281 dataToStore->feepromState.revisionInfo = 0;
282 dataToStore->feepromState.firstStartId = FIRST_START_ID;
283
284 if (withSN) dataToStore->deviceInfo.SN = data->s.device_sn;
285
286 if (WriteConfigToFLASH()) return 1; // Error
287
288 return 0;
289}
290
291//-----------------------------------------------------------------------------
292
293int FEEPROM_fullRestore(void/*sys_data_t *data*/)
294{
295 feeprom_stored_data_t *dataToStore;
296
297 /****************LESE_DEFAULT_WERTE************************/
298
299 dataToStore = (feeprom_stored_data_t *)feepromData;
300
301 // Copying default values
302 memcpy(&dataToStore->changedData, &defaultFeepromData, SIZEOF_CHANGED_FEEPROM_DATA);
303
304 //uint32_t sn = 0;
305 //if (getFEEPROMData(USER_FEEPROM_BASE_ADRESS + SIZEOF_CHANGED_FEEPROM_DATA + SIZEOF_FEEPROM_STATE, (uint8_t*)&sn, sizeof(sn))) return 1; // Error
306 //if (sn == 0xFFFFFFFF) dataToStore->deviceInfo.SN = dataToStore->changedData.s.device_sn;
307 //else dataToStore->deviceInfo.SN = sn;
308
309 // Saving SN in special area, non-reachable for end-user
310 //dataToStore->deviceInfo.SN = dataToStore->changedData.s.device_sn;
311
312 dataToStore->feepromState.writeCounter++;
313 dataToStore->feepromState.structureSize = SIZEOF_FEEPROM_STORED_DATA;
314 dataToStore->feepromState.revisionInfo = 0;
315 dataToStore->feepromState.firstStartId = FIRST_START_ID;
316
317 if (WriteConfigToFLASH()) return 2; // Error
318
319 return 0; // No error
320}
321
322//-----------------------------------------------------------------------------
323
324int FEEPROM_factoryRestore(sys_data_t *data)
325{
326 return 0;
327}
328
329//-----------------------------------------------------------------------------
330
331int FEEPROM_isFirstStart(void)
332{
333 uint8_t firstStartCatcher;
334
335 /*SEGGER_RTT_printf(0, "USER_FLASH_BASE_ADRESS:\t\t0x%08X\n", USER_FLASH_BASE_ADRESS);
336 SEGGER_RTT_printf(0, "USER_FLASH_SIZE:\t\t%d\n", USER_FLASH_SIZE);
337 SEGGER_RTT_printf(0, "USER_FLASH_PAGE_SIZE:\t\t%d\n", USER_FLASH_PAGE_SIZE);
338 SEGGER_RTT_printf(0, "USER_FEEPROM_BASE_ADRESS:\t0x%08X\n", USER_FEEPROM_BASE_ADRESS);
339 SEGGER_RTT_printf(0, "USER_FLASH_END:\t\t\t0x%08X\n", USER_FLASH_END);
340 SEGGER_RTT_printf(0, "FEEPROM_ADRESS_FIRST_START_ID:\t0x%08X\n", FEEPROM_ADRESS_FIRST_START_ID);
341
342 SEGGER_RTT_printf(0, "SIZEOF_CHANGED_FEEPROM_DATA:\t%d\n", SIZEOF_CHANGED_FEEPROM_DATA);
343 SEGGER_RTT_printf(0, "SIZEOF_DEVICE_INFO:\t\t%d\n", SIZEOF_DEVICE_INFO);
344 SEGGER_RTT_printf(0, "SIZEOF_FEEPROM_STATE:\t\t%d\n", SIZEOF_FEEPROM_STATE);
345 SEGGER_RTT_printf(0, "Sizeof(feeprom_stored_data_t):\t%d\n", sizeof(feeprom_stored_data_t));*/
346
347 // Trying to read first start indicator from FLASH memory
348 if(getFEEPROMData(FEEPROM_ADDRESS_FIRST_START_ID, &firstStartCatcher, 1)) return 1;
349
350 // If found indicator is not correct, then exiting with error
351 if(firstStartCatcher != FIRST_START_ID) return 1;
352
353 return 0;
354}
355
356//-----------------------------------------------------------------------------
357
358int WriteLogToFLASH(void)
359{
360 if (HAL_FLASH_Unlock() == HAL_OK)
361 {
362 __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
363
364 /* Fill EraseInit structure*/
365 FLASH_EraseInitTypeDef EraseInit;
366
367 EraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
368 EraseInit.Page = FLASH_PAGE_NB - 1; // This page contains device statistical data
369 EraseInit.NbPages = 1;
370
371 uint32_t PageError;
372
373 /* Erase Sektoren daten drfen nicht im instuction cache liegen */
374 if (HAL_FLASHEx_Erase(&EraseInit, &PageError) == HAL_OK)
375 {
376 /* Programmiere uint64_t */
377 size_t Address = USER_STAT_BASE_ADDRESS;
378 uint32_t x = 0;
379
380 while (Address < (USER_STAT_BASE_ADDRESS + SIZEOF_FEEPROM_LOG_DATA))
381 {
382 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, feepromLogData[x]) == HAL_OK)
383 {
384 Address = Address + 8;
385 x++;
386 }
387 else
388 {
389 __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
390 HAL_FLASH_Lock();
391 return 3;
392 }
393 }
394 }
395 else
396 {
397 __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
398 HAL_FLASH_Lock();
399 return 2;
400 }
401
402 __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
403 }
404 else return 1;
405
406 if (HAL_FLASH_Lock() != HAL_OK) return 4;
407
408 return 0;
409}
410
411//-----------------------------------------------------------------------------
412
413int FEEPROM_ResetLogData(void)
414{
415 log_data_t* logData;
416
417 logData = (log_data_t*)feepromLogData;
418
419 logData->startup_cnt = 0;
420 logData->overtemp_error_cnt = 0;
421 logData->overcurrent_error_cnt = 0;
422 logData->overload_error_cnt = 0;
423 logData->lowbat_error_cnt = 0;
424 logData->lvp_cnt = 0;
425 logData->ovp_cnt = 0;
426 logData->switch_cnt = 0;
427 logData->mosfets_voltagedrop_error_cnt = 0;
428
429 if (WriteLogToFLASH()) return 2; // Error
430
431 return 0; // No error
432}
433
434//-----------------------------------------------------------------------------
435
436int FEEPROM_ReadLogData(sys_data_t *data)
437{
438 log_data_t * logData;
439
440 /****************WERTE_AUS_FLASH_LESEN********************/
441
442 if(getFEEPROMData(USER_STAT_BASE_ADDRESS, (uint8_t*)feepromLogData, sizeof(feepromLogData))) return 1;
443
444 logData = (log_data_t*)feepromLogData;
445
446 data->s.startup_cnt = logData->startup_cnt;
447 data->s.overtemp_error_cnt = logData->overtemp_error_cnt;
448 data->s.overcurrent_error_cnt = logData->overcurrent_error_cnt;
449 data->s.overload_error_cnt = logData->overload_error_cnt;
450 data->s.lowbat_error_cnt = logData->lowbat_error_cnt;
451 data->s.lvp_cnt = logData->lvp_cnt;
452 data->s.ovp_cnt = logData->ovp_cnt;
453 data->s.switch_cnt = logData->switch_cnt;
454 data->s.mosfets_voltagedrop_error_cnt = logData->mosfets_voltagedrop_error_cnt;
455
456 return 0;
457}
458
459//-----------------------------------------------------------------------------
460
461int FEEPROM_StoreLogData(sys_data_t *data)
462{
463 log_data_t * logData;
464
465 logData = (log_data_t*)feepromLogData;
466
467 logData->startup_cnt = data->s.startup_cnt;
468 logData->overtemp_error_cnt = data->s.overtemp_error_cnt;
469 logData->overcurrent_error_cnt = data->s.overcurrent_error_cnt;
470 logData->overload_error_cnt = data->s.overload_error_cnt;
471 logData->lowbat_error_cnt = data->s.lowbat_error_cnt;
472 logData->lvp_cnt = data->s.lvp_cnt;
473 logData->ovp_cnt = data->s.ovp_cnt;
474 logData->switch_cnt = data->s.switch_cnt;
475 logData->mosfets_voltagedrop_error_cnt = data->s.mosfets_voltagedrop_error_cnt;
476
477 if (WriteLogToFLASH()) return 2; // Error
478
479 return 0; // No error
480}
Note: See TracBrowser for help on using the repository browser.