VERY rough initial work on modular boards layout
This commit is contained in:
parent
c431caeafa
commit
750d486276
|
@ -22,3 +22,4 @@ reference/hardware/v0.4/gerbers/Archive.zip
|
||||||
.vscode/c_cpp_properties.json
|
.vscode/c_cpp_properties.json
|
||||||
.vscode/launch.json
|
.vscode/launch.json
|
||||||
.vscode/.browse.c_cpp.db*
|
.vscode/.browse.c_cpp.db*
|
||||||
|
speeduino/src/boards/samd21.h
|
||||||
|
|
|
@ -46,6 +46,16 @@ lib_deps = EEPROM
|
||||||
;build_flags = -fpermissive -std=gnu++11 -Os -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,-Map,output.map
|
;build_flags = -fpermissive -std=gnu++11 -Os -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,-Map,output.map
|
||||||
build_flags = -fpermissive -std=gnu++11 -Os
|
build_flags = -fpermissive -std=gnu++11 -Os
|
||||||
|
|
||||||
|
;SAMD21
|
||||||
|
[env:samd21]
|
||||||
|
platform = atmelsam
|
||||||
|
framework = arduino
|
||||||
|
board = zeroUSB
|
||||||
|
lib_deps = EEPROM
|
||||||
|
build_flags = -fpermissive -std=gnu++11
|
||||||
|
upload_protocol = sam-ba
|
||||||
|
|
||||||
|
|
||||||
;Support for the stm32f407 doesn't look ready in platformio yet
|
;Support for the stm32f407 doesn't look ready in platformio yet
|
||||||
;[env:genericSTM32F407VE]
|
;[env:genericSTM32F407VE]
|
||||||
;platform = https://github.com/maichaell/platform-ststm32
|
;platform = https://github.com/maichaell/platform-ststm32
|
||||||
|
|
|
@ -11,7 +11,6 @@ A full copy of the license may be found in the projects root directory
|
||||||
#include "maths.h"
|
#include "maths.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "decoders.h"
|
#include "decoders.h"
|
||||||
#include <EEPROM.h>
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Processes the data on the serial buffer.
|
Processes the data on the serial buffer.
|
||||||
|
@ -1406,7 +1405,8 @@ void receiveCalibration(byte tableID)
|
||||||
|
|
||||||
//From TS3.x onwards, the EEPROM must be written here as TS restarts immediately after the process completes which is before the EEPROM write completes
|
//From TS3.x onwards, the EEPROM must be written here as TS restarts immediately after the process completes which is before the EEPROM write completes
|
||||||
int y = EEPROM_START + (x / 2);
|
int y = EEPROM_START + (x / 2);
|
||||||
EEPROM.update(y, (byte)tempValue);
|
//EEPROM.update(y, (byte)tempValue);
|
||||||
|
storeCalibrationValue(y, (byte)tempValue);
|
||||||
|
|
||||||
every2nd = false;
|
every2nd = false;
|
||||||
#if defined(CORE_STM32)
|
#if defined(CORE_STM32)
|
||||||
|
|
|
@ -51,6 +51,9 @@
|
||||||
#define portOutputRegister(port) (volatile byte *)( &(port->regs->ODR) )
|
#define portOutputRegister(port) (volatile byte *)( &(port->regs->ODR) )
|
||||||
#define portInputRegister(port) (volatile byte *)( &(port->regs->IDR) )
|
#define portInputRegister(port) (volatile byte *)( &(port->regs->IDR) )
|
||||||
#endif
|
#endif
|
||||||
|
#elif defined(__SAMD21G18A__)
|
||||||
|
#define BOARD_H "src/boards/samd21.h"
|
||||||
|
#define CORE_SAMD21
|
||||||
#else
|
#else
|
||||||
#error Incorrect board selected. Please select the correct board (Usually Mega 2560) and upload again
|
#error Incorrect board selected. Please select the correct board (Usually Mega 2560) and upload again
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
#include "decoders.h"
|
#include "decoders.h"
|
||||||
#include "corrections.h"
|
#include "corrections.h"
|
||||||
#include "idle.h"
|
#include "idle.h"
|
||||||
#include <EEPROM.h>
|
|
||||||
|
|
||||||
void initialiseAll()
|
void initialiseAll()
|
||||||
{
|
{
|
||||||
|
@ -156,7 +155,8 @@ void initialiseAll()
|
||||||
if ( configPage6.useExtBaro != 0 )
|
if ( configPage6.useExtBaro != 0 )
|
||||||
{
|
{
|
||||||
readBaro();
|
readBaro();
|
||||||
EEPROM.update(EEPROM_LAST_BARO, currentStatus.baro);
|
//EEPROM.update(EEPROM_LAST_BARO, currentStatus.baro);
|
||||||
|
storeLastBaro(currentStatus.baro);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -168,13 +168,15 @@ void initialiseAll()
|
||||||
if ((currentStatus.MAP >= BARO_MIN) && (currentStatus.MAP <= BARO_MAX)) //Check if engine isn't running
|
if ((currentStatus.MAP >= BARO_MIN) && (currentStatus.MAP <= BARO_MAX)) //Check if engine isn't running
|
||||||
{
|
{
|
||||||
currentStatus.baro = currentStatus.MAP;
|
currentStatus.baro = currentStatus.MAP;
|
||||||
EEPROM.update(EEPROM_LAST_BARO, currentStatus.baro);
|
//EEPROM.update(EEPROM_LAST_BARO, currentStatus.baro);
|
||||||
|
storeLastBaro(currentStatus.baro);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Attempt to use the last known good baro reading from EEPROM
|
//Attempt to use the last known good baro reading from EEPROM
|
||||||
if ((EEPROM.read(EEPROM_LAST_BARO) >= BARO_MIN) && (EEPROM.read(EEPROM_LAST_BARO) <= BARO_MAX)) //Make sure it's not invalid (Possible on first run etc)
|
//if (EEPROM.read(EEPROM_LAST_BARO) >= BARO_MIN) && (EEPROM.read(EEPROM_LAST_BARO) <= BARO_MAX)) //Make sure it's not invalid (Possible on first run etc)
|
||||||
{ currentStatus.baro = EEPROM.read(EEPROM_LAST_BARO); } //last baro correction
|
if ((readLastBaro() >= BARO_MIN) && (readLastBaro() <= BARO_MAX)) //Make sure it's not invalid (Possible on first run etc)
|
||||||
|
{ currentStatus.baro = readLastBaro(); } //last baro correction
|
||||||
else { currentStatus.baro = 100; } //Final fall back position.
|
else { currentStatus.baro = 100; } //Final fall back position.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#include "storage.h"
|
#include "storage.h"
|
||||||
#include "crankMaths.h"
|
#include "crankMaths.h"
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
|
#include BOARD_H //Note that this is not a real file, it is defined in globals.h.
|
||||||
#if defined (CORE_TEENSY)
|
#if defined (CORE_TEENSY)
|
||||||
#include <FlexCAN.h>
|
#include <FlexCAN.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#define FastCRC_tables
|
#define FastCRC_tables
|
||||||
#include "inttypes.h"
|
#include "inttypes.h"
|
||||||
|
|
||||||
#if defined(__AVR__) || defined(STM32_MCU_SERIES) || defined(ARDUINO_ARCH_STM32) || defined(_VARIANT_ARDUINO_STM32_)
|
#if defined(__AVR__) || defined(STM32_MCU_SERIES) || defined(ARDUINO_ARCH_STM32) || defined(_VARIANT_ARDUINO_STM32_) || defined(__SAMD21G18A__)
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#else
|
#else
|
||||||
#include <pgmspace.h>
|
#include <pgmspace.h>
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
EEPROM like API that uses Arduino Zero's flash memory.
|
||||||
|
Written by A. Christian
|
||||||
|
|
||||||
|
Copyright (c) 2015-2016 Arduino LLC. All right reserved.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library 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 Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
#if defined(CORE_SAMD21)
|
||||||
|
#include "FlashAsEEPROM.h"
|
||||||
|
|
||||||
|
FlashStorage(eeprom_storage, EEPROM_EMULATION);
|
||||||
|
|
||||||
|
EEPROMClass::EEPROMClass(void) : _initialized(false), _dirty(false) {
|
||||||
|
// Empty
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t EEPROMClass::read(int address)
|
||||||
|
{
|
||||||
|
if (!_initialized) init();
|
||||||
|
return _eeprom.data[address];
|
||||||
|
}
|
||||||
|
|
||||||
|
void EEPROMClass::update(int address, uint8_t value)
|
||||||
|
{
|
||||||
|
if (!_initialized) init();
|
||||||
|
if (_eeprom.data[address] != value) {
|
||||||
|
_dirty = true;
|
||||||
|
_eeprom.data[address] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EEPROMClass::write(int address, uint8_t value)
|
||||||
|
{
|
||||||
|
update(address, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EEPROMClass::init()
|
||||||
|
{
|
||||||
|
_eeprom = eeprom_storage.read();
|
||||||
|
if (!_eeprom.valid) {
|
||||||
|
memset(_eeprom.data, 0xFF, EEPROM_EMULATION_SIZE);
|
||||||
|
}
|
||||||
|
_initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EEPROMClass::isValid()
|
||||||
|
{
|
||||||
|
if (!_initialized) init();
|
||||||
|
return _eeprom.valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EEPROMClass::commit()
|
||||||
|
{
|
||||||
|
if (!_initialized) init();
|
||||||
|
if (_dirty) {
|
||||||
|
_eeprom.valid = true;
|
||||||
|
eeprom_storage.write(_eeprom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EEPROMClass EEPROM;
|
||||||
|
#endif
|
|
@ -0,0 +1,87 @@
|
||||||
|
/*
|
||||||
|
EEPROM like API that uses Arduino Zero's flash memory.
|
||||||
|
Written by A. Christian
|
||||||
|
|
||||||
|
Copyright (c) 2015-2016 Arduino LLC. All right reserved.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library 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 Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FLASH_AS_EEPROM_h
|
||||||
|
#define FLASH_AS_EEPROM_h
|
||||||
|
|
||||||
|
#include "FlashStorage.h"
|
||||||
|
|
||||||
|
#ifndef EEPROM_EMULATION_SIZE
|
||||||
|
#define EEPROM_EMULATION_SIZE 1024
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
byte data[EEPROM_EMULATION_SIZE];
|
||||||
|
boolean valid;
|
||||||
|
} EEPROM_EMULATION;
|
||||||
|
|
||||||
|
|
||||||
|
class EEPROMClass {
|
||||||
|
|
||||||
|
public:
|
||||||
|
EEPROMClass(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read an eeprom cell
|
||||||
|
* @param index
|
||||||
|
* @return value
|
||||||
|
*/
|
||||||
|
uint8_t read(int);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write value to an eeprom cell
|
||||||
|
* @param index
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
void write(int, uint8_t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update a eeprom cell
|
||||||
|
* @param index
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
void update(int, uint8_t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether the eeprom data is valid
|
||||||
|
* @return true, if eeprom data is valid (has been written at least once), false if not
|
||||||
|
*/
|
||||||
|
bool isValid();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write previously made eeprom changes to the underlying flash storage
|
||||||
|
* Use this with care: Each and every commit will harm the flash and reduce it's lifetime (like with every flash memory)
|
||||||
|
*/
|
||||||
|
void commit();
|
||||||
|
|
||||||
|
uint16_t length() { return EEPROM_EMULATION_SIZE; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
void init();
|
||||||
|
|
||||||
|
bool _initialized;
|
||||||
|
EEPROM_EMULATION _eeprom;
|
||||||
|
bool _dirty;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern EEPROMClass EEPROM;
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,102 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) 2015 Arduino LLC. All right reserved.
|
||||||
|
Written by Cristian Maglie
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library 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 Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
#if defined(CORE_SAMD21)
|
||||||
|
#include "FlashStorage.h"
|
||||||
|
|
||||||
|
static const uint32_t pageSizes[] = { 8, 16, 32, 64, 128, 256, 512, 1024 };
|
||||||
|
|
||||||
|
FlashClass::FlashClass(const void *flash_addr, uint32_t size) :
|
||||||
|
PAGE_SIZE(pageSizes[NVMCTRL->PARAM.bit.PSZ]),
|
||||||
|
PAGES(NVMCTRL->PARAM.bit.NVMP),
|
||||||
|
MAX_FLASH(PAGE_SIZE * PAGES),
|
||||||
|
ROW_SIZE(PAGE_SIZE * 4),
|
||||||
|
flash_address((volatile void *)flash_addr),
|
||||||
|
flash_size(size)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t read_unaligned_uint32(const void *data)
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
uint32_t u32;
|
||||||
|
uint8_t u8[4];
|
||||||
|
} res;
|
||||||
|
const uint8_t *d = (const uint8_t *)data;
|
||||||
|
res.u8[0] = d[0];
|
||||||
|
res.u8[1] = d[1];
|
||||||
|
res.u8[2] = d[2];
|
||||||
|
res.u8[3] = d[3];
|
||||||
|
return res.u32;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FlashClass::write(const volatile void *flash_ptr, const void *data, uint32_t size)
|
||||||
|
{
|
||||||
|
// Calculate data boundaries
|
||||||
|
size = (size + 3) / 4;
|
||||||
|
volatile uint32_t *dst_addr = (volatile uint32_t *)flash_ptr;
|
||||||
|
const uint8_t *src_addr = (uint8_t *)data;
|
||||||
|
|
||||||
|
// Disable automatic page write
|
||||||
|
NVMCTRL->CTRLB.bit.MANW = 1;
|
||||||
|
|
||||||
|
// Do writes in pages
|
||||||
|
while (size) {
|
||||||
|
// Execute "PBC" Page Buffer Clear
|
||||||
|
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_PBC;
|
||||||
|
while (NVMCTRL->INTFLAG.bit.READY == 0) { }
|
||||||
|
|
||||||
|
// Fill page buffer
|
||||||
|
uint32_t i;
|
||||||
|
for (i=0; i<(PAGE_SIZE/4) && size; i++) {
|
||||||
|
*dst_addr = read_unaligned_uint32(src_addr);
|
||||||
|
src_addr += 4;
|
||||||
|
dst_addr++;
|
||||||
|
size--;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute "WP" Write Page
|
||||||
|
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_WP;
|
||||||
|
while (NVMCTRL->INTFLAG.bit.READY == 0) { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FlashClass::erase(const volatile void *flash_ptr, uint32_t size)
|
||||||
|
{
|
||||||
|
const uint8_t *ptr = (const uint8_t *)flash_ptr;
|
||||||
|
while (size > ROW_SIZE) {
|
||||||
|
erase(ptr);
|
||||||
|
ptr += ROW_SIZE;
|
||||||
|
size -= ROW_SIZE;
|
||||||
|
}
|
||||||
|
erase(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FlashClass::erase(const volatile void *flash_ptr)
|
||||||
|
{
|
||||||
|
NVMCTRL->ADDR.reg = ((uint32_t)flash_ptr) / 2;
|
||||||
|
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_ER;
|
||||||
|
while (!NVMCTRL->INTFLAG.bit.READY) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
void FlashClass::read(const volatile void *flash_ptr, void *data, uint32_t size)
|
||||||
|
{
|
||||||
|
memcpy(data, (const void *)flash_ptr, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) 2015 Arduino LLC. All right reserved.
|
||||||
|
Written by Cristian Maglie
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library 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 Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
// Concatenate after macro expansion
|
||||||
|
#define PPCAT_NX(A, B) A ## B
|
||||||
|
#define PPCAT(A, B) PPCAT_NX(A, B)
|
||||||
|
|
||||||
|
#define Flash(name, size) \
|
||||||
|
__attribute__((__aligned__(256))) \
|
||||||
|
static const uint8_t PPCAT(_data,name)[(size+255)/256*256] = { }; \
|
||||||
|
FlashClass name(PPCAT(_data,name), size);
|
||||||
|
|
||||||
|
#define FlashStorage(name, T) \
|
||||||
|
__attribute__((__aligned__(256))) \
|
||||||
|
static const uint8_t PPCAT(_data,name)[(sizeof(T)+255)/256*256] = { }; \
|
||||||
|
FlashStorageClass<T> name(PPCAT(_data,name));
|
||||||
|
|
||||||
|
class FlashClass {
|
||||||
|
public:
|
||||||
|
FlashClass(const void *flash_addr = NULL, uint32_t size = 0);
|
||||||
|
|
||||||
|
void write(const void *data) { write(flash_address, data, flash_size); }
|
||||||
|
void erase() { erase(flash_address, flash_size); }
|
||||||
|
void read(void *data) { read(flash_address, data, flash_size); }
|
||||||
|
|
||||||
|
void write(const volatile void *flash_ptr, const void *data, uint32_t size);
|
||||||
|
void erase(const volatile void *flash_ptr, uint32_t size);
|
||||||
|
void read(const volatile void *flash_ptr, void *data, uint32_t size);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void erase(const volatile void *flash_ptr);
|
||||||
|
|
||||||
|
const uint32_t PAGE_SIZE, PAGES, MAX_FLASH, ROW_SIZE;
|
||||||
|
const volatile void *flash_address;
|
||||||
|
const uint32_t flash_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
class FlashStorageClass {
|
||||||
|
public:
|
||||||
|
FlashStorageClass(const void *flash_addr) : flash(flash_addr, sizeof(T)) { };
|
||||||
|
|
||||||
|
// Write data into flash memory.
|
||||||
|
// Compiler is able to optimize parameter copy.
|
||||||
|
inline void write(T data) { flash.erase(); flash.write(&data); }
|
||||||
|
|
||||||
|
// Read data from flash into variable.
|
||||||
|
inline void read(T *data) { flash.read(data); }
|
||||||
|
|
||||||
|
// Overloaded version of read.
|
||||||
|
// Compiler is able to optimize copy-on-return.
|
||||||
|
inline T read() { T data; read(&data); return data; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
FlashClass flash;
|
||||||
|
};
|
||||||
|
|
|
@ -1,12 +1,21 @@
|
||||||
#ifndef STORAGE_H
|
#ifndef STORAGE_H
|
||||||
#define STORAGE_H
|
#define STORAGE_H
|
||||||
|
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
void writeAllConfig();
|
void writeAllConfig();
|
||||||
void writeConfig(byte);
|
void writeConfig(byte);
|
||||||
void loadConfig();
|
void loadConfig();
|
||||||
void loadCalibration();
|
void loadCalibration();
|
||||||
void writeCalibration();
|
void writeCalibration();
|
||||||
|
|
||||||
|
//These are utility functions that prevent other files from having to use EEPROM.h directly
|
||||||
|
byte readLastBaro();
|
||||||
|
void storeLastBaro(byte);
|
||||||
|
void storeCalibrationValue(byte, byte);
|
||||||
|
byte readEEPROMVersion();
|
||||||
|
void storeEEPROMVersion(byte);
|
||||||
|
|
||||||
#if defined(CORE_STM32) || defined(CORE_TEENSY)
|
#if defined(CORE_STM32) || defined(CORE_TEENSY)
|
||||||
#define EEPROM_MAX_WRITE_BLOCK 64 //The maximum number of write operations that will be performed in one go. If we try to write to the EEPROM too fast (Each write takes ~3ms) then the rest of the system can hang)
|
#define EEPROM_MAX_WRITE_BLOCK 64 //The maximum number of write operations that will be performed in one go. If we try to write to the EEPROM too fast (Each write takes ~3ms) then the rest of the system can hang)
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -8,7 +8,11 @@ A full copy of the license may be found in the projects root directory
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "table.h"
|
#include "table.h"
|
||||||
#include "comms.h"
|
#include "comms.h"
|
||||||
|
#if defined(CORE_SAMD21)
|
||||||
|
#include "src/FlashStorage/FlashAsEEPROM.h"
|
||||||
|
#else
|
||||||
#include <EEPROM.h>
|
#include <EEPROM.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
void writeAllConfig()
|
void writeAllConfig()
|
||||||
{
|
{
|
||||||
|
@ -643,3 +647,11 @@ void writeCalibration()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Utility functions.
|
||||||
|
// By having these in this file, it prevents other files from calling EEPROM functions directly. This is useful due to differences in the EEPROM libraries on different devces
|
||||||
|
byte readLastBaro() { return EEPROM.read(EEPROM_LAST_BARO); }
|
||||||
|
void storeLastBaro(byte newValue) { EEPROM.update(EEPROM_LAST_BARO, newValue); }
|
||||||
|
void storeCalibrationValue(byte location, byte value) { EEPROM.update(location, value); } //This is essentially just an abstraction for EEPROM.update()
|
||||||
|
byte readEEPROMVersion() { return EEPROM.read(EEPROM_DATA_VERSION); }
|
||||||
|
void storeEEPROMVersion(byte newVersion) { EEPROM.update(EEPROM_DATA_VERSION, newVersion); }
|
|
@ -4,9 +4,13 @@
|
||||||
* It also can be used for setting good values when there are viarables that move locations in the ini
|
* It also can be used for setting good values when there are viarables that move locations in the ini
|
||||||
* When a user skips multiple firmware versions at a time, this will roll through the updates 1 at a time
|
* When a user skips multiple firmware versions at a time, this will roll through the updates 1 at a time
|
||||||
*/
|
*/
|
||||||
#include <EEPROM.h>
|
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "storage.h"
|
#include "storage.h"
|
||||||
|
#if defined(CORE_SAMD21)
|
||||||
|
#include "src/FlashStorage/FlashAsEEPROM.h"
|
||||||
|
#else
|
||||||
|
#include <EEPROM.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
void doUpdates()
|
void doUpdates()
|
||||||
{
|
{
|
||||||
|
@ -23,7 +27,8 @@ void doUpdates()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
writeAllConfig();
|
writeAllConfig();
|
||||||
EEPROM.write(EEPROM_DATA_VERSION, 3);
|
//EEPROM.write(EEPROM_DATA_VERSION, 3);
|
||||||
|
storeEEPROMVersion(3);
|
||||||
}
|
}
|
||||||
//June 2017 required the forced addition of some CAN values to avoid weird errors
|
//June 2017 required the forced addition of some CAN values to avoid weird errors
|
||||||
if(EEPROM.read(EEPROM_DATA_VERSION) == 3)
|
if(EEPROM.read(EEPROM_DATA_VERSION) == 3)
|
||||||
|
@ -36,7 +41,8 @@ void doUpdates()
|
||||||
if(configPage4.sparkDur == 255) { configPage4.sparkDur = 10; }
|
if(configPage4.sparkDur == 255) { configPage4.sparkDur = 10; }
|
||||||
|
|
||||||
writeAllConfig();
|
writeAllConfig();
|
||||||
EEPROM.write(EEPROM_DATA_VERSION, 4);
|
//EEPROM.write(EEPROM_DATA_VERSION, 4);
|
||||||
|
storeEEPROMVersion(4);
|
||||||
}
|
}
|
||||||
//July 2017 adds a cranking enrichment curve in place of the single value. This converts that single value to the curve
|
//July 2017 adds a cranking enrichment curve in place of the single value. This converts that single value to the curve
|
||||||
if(EEPROM.read(EEPROM_DATA_VERSION) == 4)
|
if(EEPROM.read(EEPROM_DATA_VERSION) == 4)
|
||||||
|
@ -53,7 +59,8 @@ void doUpdates()
|
||||||
configPage10.crankingEnrichValues[3] = 100 + configPage2.crankingPct;
|
configPage10.crankingEnrichValues[3] = 100 + configPage2.crankingPct;
|
||||||
|
|
||||||
writeAllConfig();
|
writeAllConfig();
|
||||||
EEPROM.write(EEPROM_DATA_VERSION, 5);
|
//EEPROM.write(EEPROM_DATA_VERSION, 5);
|
||||||
|
storeEEPROMVersion(5);
|
||||||
}
|
}
|
||||||
//September 2017 had a major change to increase the minimum table size to 128. This required multiple pieces of data being moved around
|
//September 2017 had a major change to increase the minimum table size to 128. This required multiple pieces of data being moved around
|
||||||
if(EEPROM.read(EEPROM_DATA_VERSION) == 5)
|
if(EEPROM.read(EEPROM_DATA_VERSION) == 5)
|
||||||
|
|
Loading…
Reference in New Issue