mirror of
https://github.com/thelsing/knx.git
synced 2024-12-18 19:08:18 +01:00
ARCH_SAMD
Now checking for __SAMD21__ and __SAMD51__ in knx_facade, samd_platform (samd21) and samd51_platform (samd51) Preparation for external flash functionality in platform.h
This commit is contained in:
parent
c0e5621a5f
commit
37e056a91c
@ -12,7 +12,8 @@
|
|||||||
enum NvMemoryType
|
enum NvMemoryType
|
||||||
{
|
{
|
||||||
Eeprom,
|
Eeprom,
|
||||||
Flash
|
Flash,
|
||||||
|
QspiFlash
|
||||||
};
|
};
|
||||||
|
|
||||||
class Platform
|
class Platform
|
||||||
|
@ -36,7 +36,19 @@
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAMD
|
#ifdef __SAMD51__
|
||||||
|
// predefined global instance for TP or IP
|
||||||
|
#if MASK_VERSION == 0x07B0
|
||||||
|
KnxFacade<Samd51Platform, Bau07B0> knx(buttonEvent);
|
||||||
|
#elif MASK_VERSION == 0x57B0
|
||||||
|
KnxFacade<Samd51Platform, Bau57B0> knx(buttonEvent);
|
||||||
|
#else
|
||||||
|
#error "Mask version not supported on SAMD51"
|
||||||
|
#endif
|
||||||
|
#elif (defined(__SAMD21E17A__) || \
|
||||||
|
defined(__SAMD21G18A__) || \
|
||||||
|
defined(__SAMD21E18A__) || \
|
||||||
|
defined(__SAMD21J18A__))
|
||||||
// predefined global instance for TP or RF or TP/RF coupler
|
// predefined global instance for TP or RF or TP/RF coupler
|
||||||
#if MASK_VERSION == 0x07B0
|
#if MASK_VERSION == 0x07B0
|
||||||
KnxFacade<SamdPlatform, Bau07B0> knx(buttonEvent);
|
KnxFacade<SamdPlatform, Bau07B0> knx(buttonEvent);
|
||||||
@ -45,7 +57,7 @@
|
|||||||
#elif MASK_VERSION == 0x2920
|
#elif MASK_VERSION == 0x2920
|
||||||
KnxFacade<SamdPlatform, Bau2920> knx(buttonEvent);
|
KnxFacade<SamdPlatform, Bau2920> knx(buttonEvent);
|
||||||
#else
|
#else
|
||||||
#error "Mask version not supported on ARDUINO_ARCH_SAMD"
|
#error "Mask version not supported on SAMD21"
|
||||||
#endif
|
#endif
|
||||||
#elif defined(ARDUINO_ARCH_RP2040)
|
#elif defined(ARDUINO_ARCH_RP2040)
|
||||||
// predefined global instance for TP or RF or TP/RF coupler
|
// predefined global instance for TP or RF or TP/RF coupler
|
||||||
|
@ -12,7 +12,15 @@
|
|||||||
#define USERDATA_SAVE_SIZE 0
|
#define USERDATA_SAVE_SIZE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAMD
|
#ifdef __SAMD51__
|
||||||
|
#include "samd51_platform.h"
|
||||||
|
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
||||||
|
void buttonUp();
|
||||||
|
#endif
|
||||||
|
#elif (defined(__SAMD21E17A__) || \
|
||||||
|
defined(__SAMD21G18A__) || \
|
||||||
|
defined(__SAMD21E18A__) || \
|
||||||
|
defined(__SAMD21J18A__))
|
||||||
#include "samd_platform.h"
|
#include "samd_platform.h"
|
||||||
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
||||||
void buttonUp();
|
void buttonUp();
|
||||||
@ -465,7 +473,19 @@ template <class P, class B> class KnxFacade : private SaveRestore
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
||||||
#ifdef ARDUINO_ARCH_SAMD
|
#ifdef __SAMD51__
|
||||||
|
// predefined global instance for TP or IP
|
||||||
|
#if MASK_VERSION == 0x07B0
|
||||||
|
extern KnxFacade<Samd51Platform, Bau07B0> knx;
|
||||||
|
#elif MASK_VERSION == 0x57B0
|
||||||
|
extern KnxFacade<Samd51Platform, Bau57B0> knx;
|
||||||
|
#else
|
||||||
|
#error "Mask version not supported on SAMD51"
|
||||||
|
#endif
|
||||||
|
#elif (defined(__SAMD21E17A__) || \
|
||||||
|
defined(__SAMD21G18A__) || \
|
||||||
|
defined(__SAMD21E18A__) || \
|
||||||
|
defined(__SAMD21J18A__))
|
||||||
// predefined global instance for TP or RF or TP/RF coupler
|
// predefined global instance for TP or RF or TP/RF coupler
|
||||||
#if MASK_VERSION == 0x07B0
|
#if MASK_VERSION == 0x07B0
|
||||||
extern KnxFacade<SamdPlatform, Bau07B0> knx;
|
extern KnxFacade<SamdPlatform, Bau07B0> knx;
|
||||||
@ -474,7 +494,7 @@ template <class P, class B> class KnxFacade : private SaveRestore
|
|||||||
#elif MASK_VERSION == 0x2920
|
#elif MASK_VERSION == 0x2920
|
||||||
extern KnxFacade<SamdPlatform, Bau2920> knx;
|
extern KnxFacade<SamdPlatform, Bau2920> knx;
|
||||||
#else
|
#else
|
||||||
#error "Mask version not supported on ARDUINO_ARCH_SAMD"
|
#error "Mask version not supported on SAMD21"
|
||||||
#endif
|
#endif
|
||||||
#elif defined(ARDUINO_ARCH_RP2040)
|
#elif defined(ARDUINO_ARCH_RP2040)
|
||||||
// predefined global instance for TP or RF or TP/RF coupler
|
// predefined global instance for TP or RF or TP/RF coupler
|
||||||
|
@ -3,6 +3,19 @@
|
|||||||
#include "samd51_platform.h"
|
#include "samd51_platform.h"
|
||||||
#include <knx/bits.h>
|
#include <knx/bits.h>
|
||||||
|
|
||||||
|
#define QSPI_STORAGE
|
||||||
|
|
||||||
|
#ifdef QSPI_STORAGE
|
||||||
|
#include <SPI.h> //QSPI
|
||||||
|
#include <SdFat.h> //QSPI
|
||||||
|
#include <Adafruit_SPIFlash.h> //QSPI
|
||||||
|
//#define FILE_NAME parameters.knx
|
||||||
|
Adafruit_FlashTransport_QSPI flashTransport;
|
||||||
|
Adafruit_SPIFlash flash(&flashTransport);
|
||||||
|
FatVolume fatfs;
|
||||||
|
File32 saveFile;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if KNX_FLASH_SIZE % 1024
|
#if KNX_FLASH_SIZE % 1024
|
||||||
#error "KNX_FLASH_SIZE must be multiple of 1024"
|
#error "KNX_FLASH_SIZE must be multiple of 1024"
|
||||||
#endif
|
#endif
|
||||||
@ -11,7 +24,7 @@
|
|||||||
#define KNX_SERIAL Serial1
|
#define KNX_SERIAL Serial1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SamdPlatform::SamdPlatform()
|
Samd51Platform::Samd51Platform()
|
||||||
#ifndef KNX_NO_DEFAULT_UART
|
#ifndef KNX_NO_DEFAULT_UART
|
||||||
: ArduinoPlatform(&KNX_SERIAL)
|
: ArduinoPlatform(&KNX_SERIAL)
|
||||||
#endif
|
#endif
|
||||||
@ -19,12 +32,12 @@ SamdPlatform::SamdPlatform()
|
|||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
SamdPlatform::SamdPlatform( HardwareSerial* s) : ArduinoPlatform(s)
|
Samd51Platform::Samd51Platform( HardwareSerial* s) : ArduinoPlatform(s)
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t SamdPlatform::uniqueSerialNumber()
|
uint32_t Samd51Platform::uniqueSerialNumber()
|
||||||
{
|
{
|
||||||
// SAMD51 from section 9.6 of the datasheet
|
// SAMD51 from section 9.6 of the datasheet
|
||||||
#define SERIAL_NUMBER_WORD_0 *(volatile uint32_t*)(0x008061FC)
|
#define SERIAL_NUMBER_WORD_0 *(volatile uint32_t*)(0x008061FC)
|
||||||
@ -35,7 +48,7 @@ uint32_t SamdPlatform::uniqueSerialNumber()
|
|||||||
return SERIAL_NUMBER_WORD_0 ^ SERIAL_NUMBER_WORD_1 ^ SERIAL_NUMBER_WORD_2 ^ SERIAL_NUMBER_WORD_3;
|
return SERIAL_NUMBER_WORD_0 ^ SERIAL_NUMBER_WORD_1 ^ SERIAL_NUMBER_WORD_2 ^ SERIAL_NUMBER_WORD_3;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SamdPlatform::restart()
|
void Samd51Platform::restart()
|
||||||
{
|
{
|
||||||
println("restart");
|
println("restart");
|
||||||
NVIC_SystemReset();
|
NVIC_SystemReset();
|
||||||
@ -47,8 +60,26 @@ extern uint32_t __data_end__;
|
|||||||
|
|
||||||
static const uint32_t pageSizes[] = {8, 16, 32, 64, 128, 256, 512, 1024};
|
static const uint32_t pageSizes[] = {8, 16, 32, 64, 128, 256, 512, 1024};
|
||||||
|
|
||||||
void SamdPlatform::init()
|
void Samd51Platform::init()
|
||||||
{
|
{
|
||||||
|
// _memoryType = QspiFlash;
|
||||||
|
// Initialize flash library and check its chip ID.
|
||||||
|
// if (!flash.begin()) {
|
||||||
|
// Serial.println("Error, failed to initialize flash chip!");
|
||||||
|
// fatalError();
|
||||||
|
// while(1) delay(1);
|
||||||
|
// }
|
||||||
|
// Serial.print("Flash chip JEDEC ID: 0x"); Serial.println(flash.getJEDECID(), HEX);
|
||||||
|
|
||||||
|
// if (!fatfs.begin(&flash)) {
|
||||||
|
// Serial.println("Error, failed to mount newly formatted filesystem!");
|
||||||
|
// Serial.println("Was the flash chip formatted with the fatfs_format example?");
|
||||||
|
// fatalError();
|
||||||
|
// while(1) delay(1);
|
||||||
|
// }
|
||||||
|
// Serial.println("Mounted filesystem!");
|
||||||
|
|
||||||
|
|
||||||
_memoryType = Flash;
|
_memoryType = Flash;
|
||||||
_pageSize = pageSizes[NVMCTRL->PARAM.bit.PSZ];
|
_pageSize = pageSizes[NVMCTRL->PARAM.bit.PSZ];
|
||||||
_pageCnt = NVMCTRL->PARAM.bit.NVMP;
|
_pageCnt = NVMCTRL->PARAM.bit.NVMP;
|
||||||
@ -90,22 +121,22 @@ static inline uint32_t read_unaligned_uint32(volatile void *data)
|
|||||||
return res.u32;
|
return res.u32;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t SamdPlatform::flashEraseBlockSize()
|
size_t Samd51Platform::flashEraseBlockSize()
|
||||||
{
|
{
|
||||||
return PAGES_PER_ROW;
|
return (_pageSize / 64); //PAGES_PER_ROW;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t SamdPlatform::flashPageSize()
|
size_t Samd51Platform::flashPageSize()
|
||||||
{
|
{
|
||||||
return _pageSize;
|
return _pageSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t* SamdPlatform::userFlashStart()
|
uint8_t* Samd51Platform::userFlashStart()
|
||||||
{
|
{
|
||||||
return (uint8_t*)_MemoryStart;
|
return (uint8_t*)_MemoryStart;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t SamdPlatform::userFlashSizeEraseBlocks()
|
size_t Samd51Platform::userFlashSizeEraseBlocks()
|
||||||
{
|
{
|
||||||
if (KNX_FLASH_SIZE <= 0)
|
if (KNX_FLASH_SIZE <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
@ -113,7 +144,7 @@ size_t SamdPlatform::userFlashSizeEraseBlocks()
|
|||||||
return ((KNX_FLASH_SIZE - 1) / (flashPageSize() * flashEraseBlockSize())) + 1;
|
return ((KNX_FLASH_SIZE - 1) / (flashPageSize() * flashEraseBlockSize())) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SamdPlatform::flashErase(uint16_t eraseBlockNum)
|
void Samd51Platform::flashErase(uint16_t eraseBlockNum)
|
||||||
{
|
{
|
||||||
noInterrupts();
|
noInterrupts();
|
||||||
|
|
||||||
@ -123,7 +154,7 @@ void SamdPlatform::flashErase(uint16_t eraseBlockNum)
|
|||||||
interrupts();
|
interrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SamdPlatform::flashWritePage(uint16_t pageNumber, uint8_t* data)
|
void Samd51Platform::flashWritePage(uint16_t pageNumber, uint8_t* data)
|
||||||
{
|
{
|
||||||
noInterrupts();
|
noInterrupts();
|
||||||
|
|
||||||
@ -133,7 +164,7 @@ void SamdPlatform::flashWritePage(uint16_t pageNumber, uint8_t* data)
|
|||||||
interrupts();
|
interrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SamdPlatform::writeBufferedEraseBlock()
|
void Samd51Platform::writeBufferedEraseBlock()
|
||||||
{
|
{
|
||||||
if (_bufferedEraseblockNumber > -1 && _bufferedEraseblockDirty)
|
if (_bufferedEraseblockNumber > -1 && _bufferedEraseblockDirty)
|
||||||
{
|
{
|
||||||
@ -150,12 +181,12 @@ void SamdPlatform::writeBufferedEraseBlock()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t SamdPlatform::getRowAddr(uint32_t flasAddr)
|
uint32_t Samd51Platform::getRowAddr(uint32_t flasAddr)
|
||||||
{
|
{
|
||||||
return flasAddr & ~(_rowSize - 1);
|
return flasAddr & ~(_rowSize - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SamdPlatform::write(const volatile void *flash_ptr, const void *data, uint32_t size)
|
void Samd51Platform::write(const volatile void *flash_ptr, const void *data, uint32_t size)
|
||||||
{
|
{
|
||||||
// Calculate data boundaries
|
// Calculate data boundaries
|
||||||
size = (size + 3) / 4;
|
size = (size + 3) / 4;
|
||||||
@ -199,7 +230,7 @@ void SamdPlatform::write(const volatile void *flash_ptr, const void *data, uint3
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SamdPlatform::erase(const volatile void *flash_ptr, uint32_t size)
|
void Samd51Platform::erase(const volatile void *flash_ptr, uint32_t size)
|
||||||
{
|
{
|
||||||
const uint8_t *ptr = (const uint8_t *)flash_ptr;
|
const uint8_t *ptr = (const uint8_t *)flash_ptr;
|
||||||
while (size > _rowSize)
|
while (size > _rowSize)
|
||||||
@ -211,7 +242,7 @@ void SamdPlatform::erase(const volatile void *flash_ptr, uint32_t size)
|
|||||||
eraseRow(ptr);
|
eraseRow(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SamdPlatform::eraseRow(const volatile void *flash_ptr)
|
void Samd51Platform::eraseRow(const volatile void *flash_ptr)
|
||||||
{
|
{
|
||||||
NVMCTRL->ADDR.reg = ((uint32_t)flash_ptr);
|
NVMCTRL->ADDR.reg = ((uint32_t)flash_ptr);
|
||||||
NVMCTRL->CTRLB.reg = NVMCTRL_CTRLB_CMDEX_KEY | NVMCTRL_CTRLB_CMD_EB;
|
NVMCTRL->CTRLB.reg = NVMCTRL_CTRLB_CMDEX_KEY | NVMCTRL_CTRLB_CMD_EB;
|
||||||
|
@ -2,11 +2,16 @@
|
|||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
#include "arduino_platform.h"
|
#include "arduino_platform.h"
|
||||||
|
|
||||||
class SamdPlatform : public ArduinoPlatform
|
// #include <SPI.h> //QSPI
|
||||||
|
// #include <SdFat.h> //QSPI
|
||||||
|
// #include <Adafruit_SPIFlash.h> //QSPI
|
||||||
|
// #define FILE_NAME parameters.sav
|
||||||
|
|
||||||
|
class Samd51Platform : public ArduinoPlatform
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SamdPlatform();
|
Samd51Platform();
|
||||||
SamdPlatform( HardwareSerial* s);
|
Samd51Platform( HardwareSerial* s);
|
||||||
|
|
||||||
// unique serial number
|
// unique serial number
|
||||||
uint32_t uniqueSerialNumber() override;
|
uint32_t uniqueSerialNumber() override;
|
||||||
@ -41,7 +46,6 @@ private:
|
|||||||
void write(const volatile void* flash_ptr, const void* data, uint32_t 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 erase(const volatile void* flash_ptr, uint32_t size);
|
||||||
void eraseRow(const volatile void* flash_ptr);
|
void eraseRow(const volatile void* flash_ptr);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
|
#if(defined(__SAMD21E17A__) || \
|
||||||
|
defined(__SAMD21G18A__) || \
|
||||||
|
defined(__SAMD21E18A__) || \
|
||||||
|
defined(__SAMD21J18A__))
|
||||||
|
|
||||||
#include "samd_platform.h"
|
#include "samd_platform.h"
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAMD
|
|
||||||
#include <knx/bits.h>
|
#include <knx/bits.h>
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
@ -2,7 +2,10 @@
|
|||||||
|
|
||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAMD
|
#if (defined(__SAMD21E17A__) || \
|
||||||
|
defined(__SAMD21G18A__) || \
|
||||||
|
defined(__SAMD21E18A__) || \
|
||||||
|
defined(__SAMD21J18A__))
|
||||||
|
|
||||||
#define PAGES_PER_ROW 4
|
#define PAGES_PER_ROW 4
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user