Refine EEPROM types / flags (#17772)
This commit is contained in:
		@@ -191,16 +191,6 @@ static inline int freeMemory() {
 | 
			
		||||
 | 
			
		||||
#pragma GCC diagnostic pop
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// EEPROM
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// Wire library should work for i2c EEPROMs
 | 
			
		||||
void eeprom_write_byte(uint8_t *pos, unsigned char value);
 | 
			
		||||
uint8_t eeprom_read_byte(uint8_t *pos);
 | 
			
		||||
void eeprom_read_block(void *__dst, const void *__src, size_t __n);
 | 
			
		||||
void eeprom_update_block(const void *__src, void *__dst, size_t __n);
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// ADC
 | 
			
		||||
//
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
 | 
			
		||||
#include "../../inc/MarlinConfig.h"
 | 
			
		||||
 | 
			
		||||
#if BOTH(EEPROM_SETTINGS, FLASH_EEPROM_EMULATION)
 | 
			
		||||
#if ENABLED(FLASH_EEPROM_EMULATION)
 | 
			
		||||
 | 
			
		||||
#include "../shared/eeprom_api.h"
 | 
			
		||||
 | 
			
		||||
@@ -235,13 +235,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
 | 
			
		||||
 | 
			
		||||
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
 | 
			
		||||
  do {
 | 
			
		||||
    const uint8_t c = (
 | 
			
		||||
      #if ENABLED(FLASH_EEPROM_LEVELING)
 | 
			
		||||
        ram_eeprom[pos]
 | 
			
		||||
      #else
 | 
			
		||||
        eeprom_buffered_read_byte(pos)
 | 
			
		||||
      #endif
 | 
			
		||||
    );
 | 
			
		||||
    const uint8_t c = TERN(FLASH_EEPROM_LEVELING, ram_eeprom[pos], eeprom_buffered_read_byte(pos));
 | 
			
		||||
    if (writing) *value = c;
 | 
			
		||||
    crc16(crc, &c, 1);
 | 
			
		||||
    pos++;
 | 
			
		||||
@@ -251,14 +245,8 @@ bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t PersistentStore::capacity() {
 | 
			
		||||
  return (
 | 
			
		||||
    #if ENABLED(FLASH_EEPROM_LEVELING)
 | 
			
		||||
      EEPROM_SIZE
 | 
			
		||||
    #else
 | 
			
		||||
      E2END + 1
 | 
			
		||||
    #endif
 | 
			
		||||
  );
 | 
			
		||||
  return TERN(FLASH_EEPROM_LEVELING, EEPROM_SIZE, E2END + 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // EEPROM_SETTINGS && FLASH_EEPROM_EMULATION
 | 
			
		||||
#endif // FLASH_EEPROM_EMULATION
 | 
			
		||||
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										64
									
								
								Marlin/src/HAL/STM32/eeprom_sram.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								Marlin/src/HAL/STM32/eeprom_sram.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Marlin 3D Printer Firmware
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
 | 
			
		||||
 * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
 | 
			
		||||
 * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
 | 
			
		||||
 * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
 | 
			
		||||
 | 
			
		||||
#include "../../inc/MarlinConfig.h"
 | 
			
		||||
 | 
			
		||||
#if ENABLED(SRAM_EEPROM_EMULATION)
 | 
			
		||||
 | 
			
		||||
#include "../shared/eeprom_if.h"
 | 
			
		||||
#include "../shared/eeprom_api.h"
 | 
			
		||||
 | 
			
		||||
size_t PersistentStore::capacity()    { return 4096; } // 4K of SRAM
 | 
			
		||||
bool PersistentStore::access_start()  { return true; }
 | 
			
		||||
bool PersistentStore::access_finish() { return true; }
 | 
			
		||||
 | 
			
		||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
 | 
			
		||||
  while (size--) {
 | 
			
		||||
    uint8_t v = *value;
 | 
			
		||||
 | 
			
		||||
    // Save to Backup SRAM
 | 
			
		||||
    *(__IO uint8_t *)(BKPSRAM_BASE + (uint8_t * const)pos) = v;
 | 
			
		||||
 | 
			
		||||
    crc16(crc, &v, 1);
 | 
			
		||||
    pos++;
 | 
			
		||||
    value++;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
 | 
			
		||||
  do {
 | 
			
		||||
    // Read from either external EEPROM, program flash or Backup SRAM
 | 
			
		||||
    const uint8_t c = ( *(__IO uint8_t *)(BKPSRAM_BASE + ((uint8_t*)pos)) );
 | 
			
		||||
    if (writing) *value = c;
 | 
			
		||||
    crc16(crc, &c, 1);
 | 
			
		||||
    pos++;
 | 
			
		||||
    value++;
 | 
			
		||||
  } while (--size);
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // SRAM_EEPROM_EMULATION
 | 
			
		||||
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
 | 
			
		||||
@@ -24,10 +24,13 @@
 | 
			
		||||
 | 
			
		||||
#include "../../inc/MarlinConfig.h"
 | 
			
		||||
 | 
			
		||||
#if EITHER(USE_WIRED_EEPROM, SRAM_EEPROM_EMULATION)
 | 
			
		||||
#if USE_WIRED_EEPROM
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "../shared/eeprom_if.h"
 | 
			
		||||
#include "../shared/eeprom_api.h"
 | 
			
		||||
 | 
			
		||||
size_t PersistentStore::capacity()    { return E2END + 1; }
 | 
			
		||||
bool PersistentStore::access_start()  { return true; }
 | 
			
		||||
bool PersistentStore::access_finish() { return true; }
 | 
			
		||||
 | 
			
		||||
@@ -35,21 +38,16 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
 | 
			
		||||
  while (size--) {
 | 
			
		||||
    uint8_t v = *value;
 | 
			
		||||
 | 
			
		||||
    // Save to either external EEPROM, program flash or Backup SRAM
 | 
			
		||||
    #if USE_WIRED_EEPROM
 | 
			
		||||
      // EEPROM has only ~100,000 write cycles,
 | 
			
		||||
      // so only write bytes that have changed!
 | 
			
		||||
      uint8_t * const p = (uint8_t * const)pos;
 | 
			
		||||
      if (v != eeprom_read_byte(p)) {
 | 
			
		||||
        eeprom_write_byte(p, v);
 | 
			
		||||
        if (eeprom_read_byte(p) != v) {
 | 
			
		||||
          SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
 | 
			
		||||
          return true;
 | 
			
		||||
        }
 | 
			
		||||
    // EEPROM has only ~100,000 write cycles,
 | 
			
		||||
    // so only write bytes that have changed!
 | 
			
		||||
    uint8_t * const p = (uint8_t * const)pos;
 | 
			
		||||
    if (v != eeprom_read_byte(p)) {
 | 
			
		||||
      eeprom_write_byte(p, v);
 | 
			
		||||
      if (eeprom_read_byte(p) != v) {
 | 
			
		||||
        SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
 | 
			
		||||
        return true;
 | 
			
		||||
      }
 | 
			
		||||
    #else
 | 
			
		||||
      *(__IO uint8_t *)(BKPSRAM_BASE + (uint8_t * const)pos) = v;
 | 
			
		||||
    #endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    crc16(crc, &v, 1);
 | 
			
		||||
    pos++;
 | 
			
		||||
@@ -62,14 +60,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
 | 
			
		||||
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
 | 
			
		||||
  do {
 | 
			
		||||
    // Read from either external EEPROM, program flash or Backup SRAM
 | 
			
		||||
    const uint8_t c = (
 | 
			
		||||
      #if USE_WIRED_EEPROM
 | 
			
		||||
        eeprom_read_byte((uint8_t*)pos)
 | 
			
		||||
      #else
 | 
			
		||||
        (*(__IO uint8_t *)(BKPSRAM_BASE + ((uint8_t*)pos)))
 | 
			
		||||
      #endif
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    const uint8_t c = eeprom_read_byte((uint8_t*)pos);
 | 
			
		||||
    if (writing) *value = c;
 | 
			
		||||
    crc16(crc, &c, 1);
 | 
			
		||||
    pos++;
 | 
			
		||||
@@ -78,9 +69,5 @@ bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t PersistentStore::capacity() {
 | 
			
		||||
  return TERN(USE_WIRED_EEPROM, E2END + 1, 4096); // 4K for emulated
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // USE_WIRED_EEPROM || SRAM_EEPROM_EMULATION
 | 
			
		||||
#endif // USE_WIRED_EEPROM
 | 
			
		||||
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
 | 
			
		||||
 
 | 
			
		||||
@@ -24,4 +24,6 @@
 | 
			
		||||
// If no real or emulated EEPROM selected, fall back to SD emulation
 | 
			
		||||
#if USE_FALLBACK_EEPROM
 | 
			
		||||
  #define SDCARD_EEPROM_EMULATION
 | 
			
		||||
#elif EITHER(I2C_EEPROM, SPI_EEPROM)
 | 
			
		||||
  #define USE_SHARED_EEPROM 1
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user