knx
ETS configurable knx-stack
rp2040_arduino_platform.h
Go to the documentation of this file.
1 #ifdef ARDUINO
2 #pragma once
3 
4 #include "arduino_platform.h"
5 
6 #include "Arduino.h"
7 
8 #ifdef ARDUINO_ARCH_RP2040
9 
10 #ifndef USE_RP2040_EEPROM_EMULATION
11  #ifndef KNX_FLASH_OFFSET
12  #define KNX_FLASH_OFFSET 0x180000 // 1.5MiB
13  #pragma warning "KNX_FLASH_OFFSET not defined, using 0x180000"
14  #endif
15 #endif
16 
17 #ifdef USE_RP2040_LARGE_EEPROM_EMULATION
18  #define USE_RP2040_EEPROM_EMULATION
19 #endif
20 
21 #ifndef KNX_SERIAL
22  #pragma warn "KNX_SERIAL not defined, using Serial1"
23  #define KNX_SERIAL Serial1
24 #endif
25 
26 #ifdef KNX_IP_LAN
27  #if ARDUINO_PICO_MAJOR * 10000 + ARDUINO_PICO_MINOR * 100 + ARDUINO_PICO_REVISION < 30700
28  #pragma error "arduino-pico >= 3.7.0 needed"
29  #endif
30  #define KNX_NETIF Eth
31 
32  #include "SPI.h"
33  #include <W5500lwIP.h>
34 
35 #else
36  #include <WiFi.h>
37  #define KNX_NETIF WiFi
38 #endif
39 
40 #if USE_KNX_DMA_UART == 1
41  #define KNX_DMA_UART uart1
42  #define KNX_DMA_UART_IRQ UART1_IRQ
43  #define KNX_DMA_UART_DREQ DREQ_UART1_RX
44 #else
45  #define KNX_DMA_UART uart0
46  #define KNX_DMA_UART_IRQ UART0_IRQ
47  #define KNX_DMA_UART_DREQ DREQ_UART0_RX
48 #endif
49 
50 #if USE_KNX_DMA_IRQ == 1
51  #define KNX_DMA_IRQ DMA_IRQ_1
52 #else
53  #define KNX_DMA_IRQ DMA_IRQ_0
54 #endif
55 
56 
58 {
59  public:
61  RP2040ArduinoPlatform( HardwareSerial* s);
62 
63  // uart
64  void knxUartPins(pin_size_t rxPin, pin_size_t txPin);
65  void setupUart() override;
66  bool overflowUart() override;
67 #ifdef USE_KNX_DMA_UART
68  int uartAvailable() override;
69  void closeUart() override;
70  void knxUart( HardwareSerial* serial) override {};
71  HardwareSerial* knxUart() override
72  {
73  return nullptr;
74  };
75  size_t writeUart(const uint8_t data) override;
76  size_t writeUart(const uint8_t* buffer, size_t size) override
77  {
78  return 0;
79  };
80  int readUart() override;
81  size_t readBytesUart(uint8_t* buffer, size_t length) override
82  {
83  return 0;
84  };
85  void flushUart() override {};
86 #endif
87 
88 
89  // unique serial number
90  uint32_t uniqueSerialNumber() override;
91 
92  void restart();
93 
94 #ifdef USE_RP2040_EEPROM_EMULATION
95  uint8_t* getEepromBuffer(uint32_t size);
96  void commitToEeprom();
97 
98 #ifdef USE_RP2040_LARGE_EEPROM_EMULATION
99  uint8_t _rambuff[KNX_FLASH_SIZE];
100  bool _rambuff_initialized = false;
101 #endif
102 #else
103 
104  // size of one EraseBlock in pages
105  virtual size_t flashEraseBlockSize();
106  // size of one flash page in bytes
107  virtual size_t flashPageSize();
108  // start of user flash aligned to start of an erase block
109  virtual uint8_t* userFlashStart();
110  // size of the user flash in EraseBlocks
111  virtual size_t userFlashSizeEraseBlocks();
112  //relativ to userFlashStart
113  virtual void flashErase(uint16_t eraseBlockNum);
114  //write a single page to flash (pageNumber relative to userFashStart
115  virtual void flashWritePage(uint16_t pageNumber, uint8_t* data);
116 
117  // writes _eraseblockBuffer to flash - overrides Plattform::writeBufferedEraseBlock() for performance optimization only
119 #endif
120 
121 
122 #if defined(KNX_NETIF)
123  uint32_t currentIpAddress() override;
124  uint32_t currentSubnetMask() override;
125  uint32_t currentDefaultGateway() override;
126  void macAddress(uint8_t* addr) override;
127 
128  // multicast
129  void setupMultiCast(uint32_t addr, uint16_t port) override;
130  void closeMultiCast() override;
131  bool sendBytesMultiCast(uint8_t* buffer, uint16_t len) override;
132  int readBytesMultiCast(uint8_t* buffer, uint16_t maxLen, uint32_t& src_addr, uint16_t& src_port) override;
133 
134  // unicast
135  bool sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buffer, uint16_t len) override;
136 
137 #define UDP_UNICAST _udp
138  protected:
139  WiFiUDP _udp;
140  protected:
141  IPAddress mcastaddr;
142  protected:
143  uint16_t _port;
144 #endif
145  protected:
146  pin_size_t _rxPin = UART_PIN_NOT_DEFINED;
147  protected:
148  pin_size_t _txPin = UART_PIN_NOT_DEFINED;
149 
150  protected:
151  IPAddress _remoteIP = 0;
152  protected:
153  uint16_t _remotePort = 0;
154 };
155 
156 #endif
157 #endif // ARDUINO
int readBytesMultiCast(uint8_t *buffer, uint16_t maxLen, uint32_t &src_addr, uint16_t &src_port) override
HardwareSerial * knxUart() override
virtual void flashErase(uint16_t eraseBlockNum)
bool sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t *buffer, uint16_t len) override
void macAddress(uint8_t *addr) override
size_t writeUart(const uint8_t data) override
RP2040ArduinoPlatform(HardwareSerial *s)
void knxUart(HardwareSerial *serial) override
void knxUartPins(pin_size_t rxPin, pin_size_t txPin)
void setupMultiCast(uint32_t addr, uint16_t port) override
size_t writeUart(const uint8_t *buffer, size_t size) override
uint32_t uniqueSerialNumber() override
size_t readBytesUart(uint8_t *buffer, size_t length) override
uint8_t * getEepromBuffer(uint32_t size)
virtual void flashWritePage(uint16_t pageNumber, uint8_t *data)
uint8_t _rambuff[KNX_FLASH_SIZE]
uint32_t currentIpAddress() override
virtual uint8_t * userFlashStart()
uint32_t currentSubnetMask() override
virtual size_t userFlashSizeEraseBlocks()
bool sendBytesMultiCast(uint8_t *buffer, uint16_t len) override
uint32_t currentDefaultGateway() override