knx
ETS configurable knx-stack
platform.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <stdint.h>
4 #include <stddef.h>
5 #include "save_restore.h"
6 
7 #ifndef KNX_FLASH_CALLBACK
8  #ifndef KNX_FLASH_SIZE
9  #define KNX_FLASH_SIZE 1024
10  #pragma warning "KNX_FLASH_SIZE not defined, using 1024"
11  #endif
12 #endif
13 
14 #ifdef KNX_FLASH_CALLBACK
15  #ifndef KNX_FLASH_SIZE
16  #define KNX_FLASH_SIZE 0
17  #endif
18  typedef uint32_t (*FlashCallbackSize)();
19  typedef uint8_t* (*FlashCallbackRead)();
20  typedef uint32_t (*FlashCallbackWrite)(uint32_t relativeAddress, uint8_t* buffer, size_t len);
21  typedef void (*FlashCallbackCommit)();
22 #endif
23 
25 {
28  Callback
29 };
30 
31 class Platform
32 {
33  public:
34  virtual ~Platform() {}
35  // ip config
36  virtual uint32_t currentIpAddress();
37  virtual uint32_t currentSubnetMask();
38  virtual uint32_t currentDefaultGateway();
39  virtual void macAddress(uint8_t* data);
40 
41  // unique serial number
42  virtual uint32_t uniqueSerialNumber();
43 
44  // basic stuff
45  virtual void restart() = 0;
46  virtual void fatalError() = 0;
47 
48  //multicast socket
49  virtual void setupMultiCast(uint32_t addr, uint16_t port);
50  virtual void closeMultiCast();
51  virtual bool sendBytesMultiCast(uint8_t* buffer, uint16_t len);
52  virtual int readBytesMultiCast(uint8_t* buffer, uint16_t maxLen);
53  virtual int readBytesMultiCast(uint8_t* buffer, uint16_t maxLen, uint32_t& src_addr, uint16_t& src_port);
54 
55  //unicast socket
56  virtual bool sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buffer, uint16_t len);
57 
58  //UART
59  virtual void setupUart();
60  virtual void closeUart();
61  virtual int uartAvailable();
62  virtual size_t writeUart(const uint8_t data);
63  virtual size_t writeUart(const uint8_t* buffer, size_t size);
64  virtual int readUart();
65  virtual size_t readBytesUart(uint8_t* buffer, size_t length);
66  virtual bool overflowUart();
67  virtual void flushUart();
68 
69  // SPI
70  virtual void setupSpi();
71  virtual void closeSpi();
72  virtual int readWriteSpi(uint8_t* data, size_t len);
73 
74  //Memory
75 
76  // --- Overwrite these methods in the device-plattform to use the EEPROM Emulation API for UserMemory ----
77  //
78  // --- changes to the UserMemory are written directly into the address space starting at getEepromBuffer
79  // --- commitToEeprom must save this to a non-volatile area if neccessary
80  virtual uint8_t* getEepromBuffer(uint32_t size);
81  virtual void commitToEeprom();
82  // -------------------------------------------------------------------------------------------------------
83 
84  virtual uint8_t* getNonVolatileMemoryStart();
85  virtual size_t getNonVolatileMemorySize();
86  virtual void commitNonVolatileMemory();
87  // address is relative to start of nonvolatile memory
88  virtual uint32_t writeNonVolatileMemory(uint32_t relativeAddress, uint8_t* buffer, size_t size);
89  virtual uint32_t readNonVolatileMemory(uint32_t relativeAddress, uint8_t* buffer, size_t size);
90  virtual uint32_t writeNonVolatileMemory(uint32_t relativeAddress, uint8_t value, size_t repeat);
91 
94 
95  // --- Overwrite these methods in the device-plattform to use flash memory handling by the knx stack ---
96  // --- also set _memoryType = Flash in the device-plattform's contructor
97  // --- optional: overwrite writeBufferedEraseBlock() in the device-plattform to reduce overhead when flashing multiple pages
98 
99  // size of one flash page in bytes
100  virtual size_t flashPageSize();
101 
102 #ifdef KNX_FLASH_CALLBACK
108 
113 #endif
114 
115  protected:
116  // size of one EraseBlock in pages
117  virtual size_t flashEraseBlockSize();
118  // start of user flash aligned to start of an erase block
119  virtual uint8_t* userFlashStart();
120  // size of the user flash in EraseBlocks
121  virtual size_t userFlashSizeEraseBlocks();
122  //relativ to userFlashStart
123  virtual void flashErase(uint16_t eraseBlockNum);
124  //write a single page to flash (pageNumber relative to userFashStart
125  virtual void flashWritePage(uint16_t pageNumber, uint8_t* data);
126 
127 
128  // -------------------------------------------------------------------------------------------------------
129 
131 
132  void loadEraseblockContaining(uint32_t relativeAddress);
133  int32_t getEraseBlockNumberOf(uint32_t relativeAddress);
134  // writes _eraseblockBuffer to flash
135  virtual void writeBufferedEraseBlock();
136  // copies a EraseBlock into the _eraseblockBuffer
137  void bufferEraseBlock(int32_t eraseBlockNumber);
138 
139  // in theory we would have to use this buffer for memory reads too,
140  // but because ets always restarts the device after programming it
141  // we can ignore this issue
142  uint8_t* _eraseblockBuffer = nullptr;
145 
146 #ifdef KNX_FLASH_CALLBACK
151 #endif
152 };
virtual uint8_t * getEepromBuffer(uint32_t size)
Definition: platform.cpp:144
int32_t getEraseBlockNumberOf(uint32_t relativeAddress)
Definition: platform.cpp:378
virtual void writeBufferedEraseBlock()
Definition: platform.cpp:384
virtual uint32_t currentIpAddress()
Definition: platform.cpp:68
virtual void flashErase(uint16_t eraseBlockNum)
Definition: platform.cpp:138
uint8_t * _eraseblockBuffer
Definition: platform.h:142
virtual bool sendBytesMultiCast(uint8_t *buffer, uint16_t len)
Definition: platform.cpp:97
NvMemoryType _memoryType
Definition: platform.h:130
void registerFlashCallbacks(FlashCallbackSize callbackFlashSize, FlashCallbackRead callbackFlashRead, FlashCallbackWrite callbackFlashWrite, FlashCallbackCommit callbackFlashCommit)
Definition: platform.cpp:420
virtual uint32_t currentSubnetMask()
Definition: platform.cpp:73
virtual void closeMultiCast()
Definition: platform.cpp:94
virtual void setupMultiCast(uint32_t addr, uint16_t port)
Definition: platform.cpp:91
virtual void fatalError()=0
virtual uint8_t * getNonVolatileMemoryStart()
Definition: platform.cpp:152
FlashCallbackCommit callbackFlashCommit()
Definition: platform.cpp:447
virtual void restart()=0
virtual int readWriteSpi(uint8_t *data, size_t len)
Definition: platform.cpp:24
virtual void flushUart()
Definition: platform.cpp:65
FlashCallbackSize callbackFlashSize()
Definition: platform.cpp:435
FlashCallbackSize _callbackFlashSize
Definition: platform.h:147
void loadEraseblockContaining(uint32_t relativeAddress)
Definition: platform.cpp:362
virtual uint32_t writeNonVolatileMemory(uint32_t relativeAddress, uint8_t *buffer, size_t size)
Definition: platform.cpp:205
void bufferEraseBlock(int32_t eraseBlockNumber)
Definition: platform.cpp:402
virtual void setupSpi()
Definition: platform.cpp:18
virtual uint32_t currentDefaultGateway()
Definition: platform.cpp:78
virtual void closeUart()
Definition: platform.cpp:54
virtual int readUart()
Definition: platform.cpp:34
virtual int uartAvailable()
Definition: platform.cpp:49
NvMemoryType NonVolatileMemoryType()
Definition: platform.cpp:8
virtual size_t flashEraseBlockSize()
Definition: platform.cpp:117
FlashCallbackRead callbackFlashRead()
Definition: platform.cpp:439
virtual size_t writeUart(const uint8_t data)
Definition: platform.cpp:44
virtual void commitToEeprom()
Definition: platform.cpp:149
virtual void flashWritePage(uint16_t pageNumber, uint8_t *data)
Definition: platform.cpp:141
FlashCallbackWrite _callbackFlashWrite
Definition: platform.h:149
FlashCallbackCommit _callbackFlashCommit
Definition: platform.h:150
int32_t _bufferedEraseblockNumber
Definition: platform.h:143
virtual size_t userFlashSizeEraseBlocks()
Definition: platform.cpp:133
virtual void setupUart()
Definition: platform.cpp:57
FlashCallbackWrite callbackFlashWrite()
Definition: platform.cpp:443
virtual ~Platform()
Definition: platform.h:34
virtual void macAddress(uint8_t *data)
Definition: platform.cpp:83
virtual size_t flashPageSize()
Definition: platform.cpp:122
virtual bool overflowUart()
Definition: platform.cpp:60
virtual bool sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t *buffer, uint16_t len)
Definition: platform.cpp:102
virtual size_t getNonVolatileMemorySize()
Definition: platform.cpp:166
virtual void commitNonVolatileMemory()
Definition: platform.cpp:180
bool _bufferedEraseblockDirty
Definition: platform.h:144
virtual uint32_t readNonVolatileMemory(uint32_t relativeAddress, uint8_t *buffer, size_t size)
Definition: platform.cpp:251
virtual void closeSpi()
Definition: platform.cpp:21
virtual size_t readBytesUart(uint8_t *buffer, size_t length)
Definition: platform.cpp:29
virtual uint8_t * userFlashStart()
Definition: platform.cpp:128
virtual uint32_t uniqueSerialNumber()
Definition: platform.cpp:86
FlashCallbackRead _callbackFlashRead
Definition: platform.h:148
virtual int readBytesMultiCast(uint8_t *buffer, uint16_t maxLen)
Definition: platform.cpp:107
void(* FlashCallbackCommit)()
Definition: platform.h:21
uint32_t(* FlashCallbackSize)()
Definition: platform.h:18
uint32_t(* FlashCallbackWrite)(uint32_t relativeAddress, uint8_t *buffer, size_t len)
Definition: platform.h:20
NvMemoryType
Definition: platform.h:25
@ Callback
Definition: platform.h:28
@ Eeprom
Definition: platform.h:26
@ Flash
Definition: platform.h:27
uint8_t *(* FlashCallbackRead)()
Definition: platform.h:19