Переглянути джерело

Pre-clean DUE flash eeprom code

Scott Lahteine 5 роки тому
джерело
коміт
76bc7bf7b8
2 змінених файлів з 78 додано та 90 видалено
  1. 75
    90
      Marlin/src/HAL/DUE/eeprom_if_flash.cpp
  2. 3
    0
      Marlin/src/core/debug_out.h

+ 75
- 90
Marlin/src/HAL/DUE/eeprom_if_flash.cpp Переглянути файл

19
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
  *
20
  *
21
  */
21
  */
22
+#ifdef ARDUINO_ARCH_SAM
23
+
24
+#include "../../inc/MarlinConfig.h"
25
+
26
+#if ENABLED(FLASH_EEPROM_EMULATION)
27
+
28
+#include "../shared/Marduino.h"
29
+#include "../shared/eeprom_if.h"
30
+#include "../shared/eeprom_api.h"
22
 
31
 
23
 /* EEPROM emulation over flash with reduced wear
32
 /* EEPROM emulation over flash with reduced wear
24
  *
33
  *
50
  *
59
  *
51
  */
60
  */
52
 
61
 
53
-#ifdef ARDUINO_ARCH_SAM
54
-
55
-#include "../../inc/MarlinConfig.h"
56
-
57
-#if ENABLED(FLASH_EEPROM_EMULATION)
58
-
59
-#include "../shared/Marduino.h"
60
-#include "../shared/eeprom_if.h"
61
-#include "../shared/eeprom_api.h"
62
+//#define EE_EMU_DEBUG
62
 
63
 
63
 #define EEPROMSize     4096
64
 #define EEPROMSize     4096
64
 #define PagesPerGroup   128
65
 #define PagesPerGroup   128
135
                curPage = 0,         // Current FLASH page inside the group
136
                curPage = 0,         // Current FLASH page inside the group
136
                curGroup = 0xFF;     // Current FLASH group
137
                curGroup = 0xFF;     // Current FLASH group
137
 
138
 
138
-//#define EE_EMU_DEBUG
139
-#ifdef EE_EMU_DEBUG
140
-  static void ee_Dump(int page,const void* data) {
139
+#define DEBUG_OUT ENABLED(EE_EMU_DEBUG)
140
+#include "../../core/debug_out.h"
141
+
142
+static void ee_Dump(const int page, const void* data) {
143
+
144
+  #ifdef EE_EMU_DEBUG
141
 
145
 
142
     const uint8_t* c = (const uint8_t*) data;
146
     const uint8_t* c = (const uint8_t*) data;
143
     char buffer[80];
147
     char buffer[80];
144
 
148
 
145
     sprintf_P(buffer, PSTR("Page: %d (0x%04x)\n"), page, page);
149
     sprintf_P(buffer, PSTR("Page: %d (0x%04x)\n"), page, page);
146
-    SERIAL_ECHO(buffer);
150
+    DEBUG_ECHO(buffer);
147
 
151
 
148
     char* p = &buffer[0];
152
     char* p = &buffer[0];
149
     for (int i = 0; i< PageSize; ++i) {
153
     for (int i = 0; i< PageSize; ++i) {
153
       if ((i & 0xF) == 0xF) {
157
       if ((i & 0xF) == 0xF) {
154
         *p++ = '\n';
158
         *p++ = '\n';
155
         *p = 0;
159
         *p = 0;
156
-        SERIAL_ECHO(buffer);
160
+        DEBUG_ECHO(buffer);
157
         p = &buffer[0];
161
         p = &buffer[0];
158
       }
162
       }
159
     }
163
     }
160
-  }
161
-#endif
164
+
165
+  #else
166
+    UNUSED(page);
167
+    UNUSED(data);
168
+  #endif
169
+}
162
 
170
 
163
 /* Flash Writing Protection Key */
171
 /* Flash Writing Protection Key */
164
 #define FWP_KEY    0x5Au
172
 #define FWP_KEY    0x5Au
171
   #define EEFC_ERROR_FLAGS  (EEFC_FSR_FLOCKE | EEFC_FSR_FCMDE)
179
   #define EEFC_ERROR_FLAGS  (EEFC_FSR_FLOCKE | EEFC_FSR_FCMDE)
172
 #endif
180
 #endif
173
 
181
 
174
-
175
 /**
182
 /**
176
  * Writes the contents of the specified page (no previous erase)
183
  * Writes the contents of the specified page (no previous erase)
177
  * @param page    (page #)
184
  * @param page    (page #)
178
  * @param data    (pointer to the data buffer)
185
  * @param data    (pointer to the data buffer)
179
  */
186
  */
180
 __attribute__ ((long_call, section (".ramfunc")))
187
 __attribute__ ((long_call, section (".ramfunc")))
181
-static bool ee_PageWrite(uint16_t page,const void* data) {
188
+static bool ee_PageWrite(uint16_t page, const void* data) {
182
 
189
 
183
   uint16_t i;
190
   uint16_t i;
184
-  uint32_t addrflash = ((uint32_t)getFlashStorage(page));
191
+  uint32_t addrflash = uint32_t(getFlashStorage(page));
185
 
192
 
186
   // Read the flash contents
193
   // Read the flash contents
187
   uint32_t pageContents[PageSize>>2];
194
   uint32_t pageContents[PageSize>>2];
196
   for (i = 0; i <PageSize >> 2; i++)
203
   for (i = 0; i <PageSize >> 2; i++)
197
     pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i]));
204
     pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i]));
198
 
205
 
199
-  #ifdef EE_EMU_DEBUG
200
-    SERIAL_ECHO_START();
201
-    SERIAL_ECHOLNPAIR("EEPROM PageWrite   ", page);
202
-    SERIAL_ECHOLNPAIR(" in FLASH address ", (uint32_t)addrflash);
203
-    SERIAL_ECHOLNPAIR(" base address     ", (uint32_t)getFlashStorage(0));
204
-    SERIAL_FLUSH();
205
-  #endif
206
+  DEBUG_ECHO_START();
207
+  DEBUG_ECHOLNPAIR("EEPROM PageWrite   ", page);
208
+  DEBUG_ECHOLNPAIR(" in FLASH address ", (uint32_t)addrflash);
209
+  DEBUG_ECHOLNPAIR(" base address     ", (uint32_t)getFlashStorage(0));
210
+  DEBUG_FLUSH();
206
 
211
 
207
   // Get the page relative to the start of the EFC controller, and the EFC controller to use
212
   // Get the page relative to the start of the EFC controller, and the EFC controller to use
208
   Efc *efc;
213
   Efc *efc;
244
     // Reenable interrupts
249
     // Reenable interrupts
245
     __enable_irq();
250
     __enable_irq();
246
 
251
 
247
-    #ifdef EE_EMU_DEBUG
248
-      SERIAL_ECHO_START();
249
-      SERIAL_ECHOLNPAIR("EEPROM Unlock failure for page ", page);
250
-    #endif
252
+    DEBUG_ECHO_START();
253
+    DEBUG_ECHOLNPAIR("EEPROM Unlock failure for page ", page);
251
     return false;
254
     return false;
252
   }
255
   }
253
 
256
 
271
     // Reenable interrupts
274
     // Reenable interrupts
272
     __enable_irq();
275
     __enable_irq();
273
 
276
 
274
-    #ifdef EE_EMU_DEBUG
275
-      SERIAL_ECHO_START();
276
-      SERIAL_ECHOLNPAIR("EEPROM Write failure for page ", page);
277
-    #endif
277
+    DEBUG_ECHO_START();
278
+    DEBUG_ECHOLNPAIR("EEPROM Write failure for page ", page);
279
+
278
     return false;
280
     return false;
279
   }
281
   }
280
 
282
 
288
   if (memcmp(getFlashStorage(page),data,PageSize)) {
290
   if (memcmp(getFlashStorage(page),data,PageSize)) {
289
 
291
 
290
     #ifdef EE_EMU_DEBUG
292
     #ifdef EE_EMU_DEBUG
291
-      SERIAL_ECHO_START();
292
-      SERIAL_ECHOLNPAIR("EEPROM Verify Write failure for page ", page);
293
+      DEBUG_ECHO_START();
294
+      DEBUG_ECHOLNPAIR("EEPROM Verify Write failure for page ", page);
293
 
295
 
294
-      ee_Dump( page,(uint32_t *) addrflash);
295
-      ee_Dump(-page,data);
296
+      ee_Dump( page, (uint32_t *)addrflash);
297
+      ee_Dump(-page, data);
296
 
298
 
297
       // Calculate count of changed bits
299
       // Calculate count of changed bits
298
       uint32_t* p1 = (uint32_t*)addrflash;
300
       uint32_t* p1 = (uint32_t*)addrflash;
308
           }
310
           }
309
         }
311
         }
310
       }
312
       }
311
-      SERIAL_ECHOLNPAIR("--> Differing bits: ", count);
313
+      DEBUG_ECHOLNPAIR("--> Differing bits: ", count);
312
     #endif
314
     #endif
313
 
315
 
314
     return false;
316
     return false;
325
 static bool ee_PageErase(uint16_t page) {
327
 static bool ee_PageErase(uint16_t page) {
326
 
328
 
327
   uint16_t i;
329
   uint16_t i;
328
-  uint32_t addrflash = ((uint32_t)getFlashStorage(page));
330
+  uint32_t addrflash = uint32_t(getFlashStorage(page));
329
 
331
 
330
-  #ifdef EE_EMU_DEBUG
331
-    SERIAL_ECHO_START();
332
-    SERIAL_ECHOLNPAIR("EEPROM PageErase  ", page);
333
-    SERIAL_ECHOLNPAIR(" in FLASH address ", (uint32_t)addrflash);
334
-    SERIAL_ECHOLNPAIR(" base address     ", (uint32_t)getFlashStorage(0));
335
-    SERIAL_FLUSH();
336
-  #endif
332
+  DEBUG_ECHO_START();
333
+  DEBUG_ECHOLNPAIR("EEPROM PageErase  ", page);
334
+  DEBUG_ECHOLNPAIR(" in FLASH address ", (uint32_t)addrflash);
335
+  DEBUG_ECHOLNPAIR(" base address     ", (uint32_t)getFlashStorage(0));
336
+  DEBUG_FLUSH();
337
 
337
 
338
   // Get the page relative to the start of the EFC controller, and the EFC controller to use
338
   // Get the page relative to the start of the EFC controller, and the EFC controller to use
339
   Efc *efc;
339
   Efc *efc;
374
     // Reenable interrupts
374
     // Reenable interrupts
375
     __enable_irq();
375
     __enable_irq();
376
 
376
 
377
-    #ifdef EE_EMU_DEBUG
378
-      SERIAL_ECHO_START();
379
-      SERIAL_ECHOLNPAIR("EEPROM Unlock failure for page ",page);
380
-    #endif
377
+    DEBUG_ECHO_START();
378
+    DEBUG_ECHOLNPAIR("EEPROM Unlock failure for page ",page);
379
+
381
     return false;
380
     return false;
382
   }
381
   }
383
 
382
 
399
     // Reenable interrupts
398
     // Reenable interrupts
400
     __enable_irq();
399
     __enable_irq();
401
 
400
 
402
-    #ifdef EE_EMU_DEBUG
403
-      SERIAL_ECHO_START();
404
-      SERIAL_ECHOLNPAIR("EEPROM Erase failure for page ",page);
405
-    #endif
401
+    DEBUG_ECHO_START();
402
+    DEBUG_ECHOLNPAIR("EEPROM Erase failure for page ",page);
403
+
406
     return false;
404
     return false;
407
   }
405
   }
408
 
406
 
416
   uint32_t * aligned_src = (uint32_t *) addrflash;
414
   uint32_t * aligned_src = (uint32_t *) addrflash;
417
   for (i = 0; i < PageSize >> 2; i++) {
415
   for (i = 0; i < PageSize >> 2; i++) {
418
     if (*aligned_src++ != 0xFFFFFFFF) {
416
     if (*aligned_src++ != 0xFFFFFFFF) {
419
-
420
-      #ifdef EE_EMU_DEBUG
421
-        SERIAL_ECHO_START();
422
-        SERIAL_ECHOLNPAIR("EEPROM Verify Erase failure for page ",page);
423
-
424
-        ee_Dump( page,(uint32_t *) addrflash);
425
-      #endif
417
+      DEBUG_ECHO_START();
418
+      DEBUG_ECHOLNPAIR("EEPROM Verify Erase failure for page ",page);
419
+      ee_Dump(page, (uint32_t *)addrflash);
426
       return false;
420
       return false;
427
     }
421
     }
428
   }
422
   }
429
 
423
 
430
   return true;
424
   return true;
431
 }
425
 }
432
-static uint8_t ee_Read(uint32_t address, bool excludeRAMBuffer = false) {
426
+
427
+static uint8_t ee_Read(uint32_t address, bool excludeRAMBuffer=false) {
433
 
428
 
434
   uint32_t baddr;
429
   uint32_t baddr;
435
   uint32_t blen;
430
   uint32_t blen;
512
   return 0xFF;
507
   return 0xFF;
513
 }
508
 }
514
 
509
 
515
-static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer = false) {
510
+static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer=false) {
516
   uint32_t baddr,
511
   uint32_t baddr,
517
            blen,
512
            blen,
518
            nextAddr = 0xFFFF,
513
            nextAddr = 0xFFFF,
604
   return true;
599
   return true;
605
 }
600
 }
606
 
601
 
607
-static bool ee_Flush(uint32_t overrideAddress = 0xFFFFFFFF, uint8_t overrideData = 0xFF) {
602
+static bool ee_Flush(uint32_t overrideAddress = 0xFFFFFFFF, uint8_t overrideData=0xFF) {
608
 
603
 
609
   // Check if RAM buffer has something to be written
604
   // Check if RAM buffer has something to be written
610
   bool isEmpty = true;
605
   bool isEmpty = true;
930
   // If all groups seem to be used, default to first group
925
   // If all groups seem to be used, default to first group
931
   if (curGroup >= GroupCount) curGroup = 0;
926
   if (curGroup >= GroupCount) curGroup = 0;
932
 
927
 
933
-  #ifdef EE_EMU_DEBUG
934
-    SERIAL_ECHO_START();
935
-    SERIAL_ECHOLNPAIR("EEPROM Current Group: ",curGroup);
936
-    SERIAL_FLUSH();
937
-  #endif
928
+  DEBUG_ECHO_START();
929
+  DEBUG_ECHOLNPAIR("EEPROM Current Group: ",curGroup);
930
+  DEBUG_FLUSH();
938
 
931
 
939
   // Now, validate that all the other group pages are empty
932
   // Now, validate that all the other group pages are empty
940
   for (int grp = 0; grp < GroupCount; grp++) {
933
   for (int grp = 0; grp < GroupCount; grp++) {
942
 
935
 
943
     for (int page = 0; page < PagesPerGroup; page++) {
936
     for (int page = 0; page < PagesPerGroup; page++) {
944
       if (!ee_IsPageClean(grp * PagesPerGroup + page)) {
937
       if (!ee_IsPageClean(grp * PagesPerGroup + page)) {
945
-        #ifdef EE_EMU_DEBUG
946
-          SERIAL_ECHO_START();
947
-          SERIAL_ECHOLNPAIR("EEPROM Page ", page, " not clean on group ", grp);
948
-          SERIAL_FLUSH();
949
-        #endif
938
+        DEBUG_ECHO_START();
939
+        DEBUG_ECHOLNPAIR("EEPROM Page ", page, " not clean on group ", grp);
940
+        DEBUG_FLUSH();
950
         ee_PageErase(grp * PagesPerGroup + page);
941
         ee_PageErase(grp * PagesPerGroup + page);
951
       }
942
       }
952
     }
943
     }
956
   // and also validate that all the other ones are clean
947
   // and also validate that all the other ones are clean
957
   for (curPage = 0; curPage < PagesPerGroup; curPage++) {
948
   for (curPage = 0; curPage < PagesPerGroup; curPage++) {
958
     if (ee_IsPageClean(curGroup * PagesPerGroup + curPage)) {
949
     if (ee_IsPageClean(curGroup * PagesPerGroup + curPage)) {
959
-      #ifdef EE_EMU_DEBUG
960
-        ee_Dump(curGroup * PagesPerGroup + curPage, getFlashStorage(curGroup * PagesPerGroup + curPage));
961
-      #endif
950
+      ee_Dump(curGroup * PagesPerGroup + curPage, getFlashStorage(curGroup * PagesPerGroup + curPage));
962
       break;
951
       break;
963
     }
952
     }
964
   }
953
   }
965
 
954
 
966
-  #ifdef EE_EMU_DEBUG
967
-    SERIAL_ECHO_START();
968
-    SERIAL_ECHOLNPAIR("EEPROM Active page: ", curPage);
969
-    SERIAL_FLUSH();
970
-  #endif
955
+  DEBUG_ECHO_START();
956
+  DEBUG_ECHOLNPAIR("EEPROM Active page: ", curPage);
957
+  DEBUG_FLUSH();
971
 
958
 
972
   // Make sure the pages following the first clean one are also clean
959
   // Make sure the pages following the first clean one are also clean
973
   for (int page = curPage + 1; page < PagesPerGroup; page++) {
960
   for (int page = curPage + 1; page < PagesPerGroup; page++) {
974
     if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) {
961
     if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) {
975
-      #ifdef EE_EMU_DEBUG
976
-        SERIAL_ECHO_START();
977
-        SERIAL_ECHOLNPAIR("EEPROM Page ", page, " not clean on active group ", curGroup);
978
-        SERIAL_FLUSH();
979
-        ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page));
980
-      #endif
962
+      DEBUG_ECHO_START();
963
+      DEBUG_ECHOLNPAIR("EEPROM Page ", page, " not clean on active group ", curGroup);
964
+      DEBUG_FLUSH();
965
+      ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page));
981
       ee_PageErase(curGroup * PagesPerGroup + page);
966
       ee_PageErase(curGroup * PagesPerGroup + page);
982
     }
967
     }
983
   }
968
   }
1018
 }
1003
 }
1019
 
1004
 
1020
 #endif // FLASH_EEPROM_EMULATION
1005
 #endif // FLASH_EEPROM_EMULATION
1021
-#endif // ARDUINO_ARCH_AVR
1006
+#endif // ARDUINO_ARCH_SAM

+ 3
- 0
Marlin/src/core/debug_out.h Переглянути файл

46
 #undef DEBUG_ECHO_MSG
46
 #undef DEBUG_ECHO_MSG
47
 #undef DEBUG_ERROR_MSG
47
 #undef DEBUG_ERROR_MSG
48
 #undef DEBUG_EOL
48
 #undef DEBUG_EOL
49
+#undef DEBUG_FLUSH
49
 #undef DEBUG_POS
50
 #undef DEBUG_POS
50
 #undef DEBUG_XYZ
51
 #undef DEBUG_XYZ
51
 #undef DEBUG_DELAY
52
 #undef DEBUG_DELAY
71
   #define DEBUG_ECHO_MSG          SERIAL_ECHO_MSG
72
   #define DEBUG_ECHO_MSG          SERIAL_ECHO_MSG
72
   #define DEBUG_ERROR_MSG         SERIAL_ERROR_MSG
73
   #define DEBUG_ERROR_MSG         SERIAL_ERROR_MSG
73
   #define DEBUG_EOL               SERIAL_EOL
74
   #define DEBUG_EOL               SERIAL_EOL
75
+  #define DEBUG_FLUSH             SERIAL_FLUSH
74
   #define DEBUG_POS               SERIAL_POS
76
   #define DEBUG_POS               SERIAL_POS
75
   #define DEBUG_XYZ               SERIAL_XYZ
77
   #define DEBUG_XYZ               SERIAL_XYZ
76
   #define DEBUG_DELAY(ms)         serial_delay(ms)
78
   #define DEBUG_DELAY(ms)         serial_delay(ms)
95
   #define DEBUG_ECHO_MSG(...)       NOOP
97
   #define DEBUG_ECHO_MSG(...)       NOOP
96
   #define DEBUG_ERROR_MSG(...)      NOOP
98
   #define DEBUG_ERROR_MSG(...)      NOOP
97
   #define DEBUG_EOL()               NOOP
99
   #define DEBUG_EOL()               NOOP
100
+  #define DEBUG_FLUSH()             NOOP
98
   #define DEBUG_POS(...)            NOOP
101
   #define DEBUG_POS(...)            NOOP
99
   #define DEBUG_XYZ(...)            NOOP
102
   #define DEBUG_XYZ(...)            NOOP
100
   #define DEBUG_DELAY(...)          NOOP
103
   #define DEBUG_DELAY(...)          NOOP

Завантаження…
Відмінити
Зберегти