28 #ifdef ARDUINO_ARCH_RP2040
35 #include <hardware/flash.h>
36 #include <hardware/watchdog.h>
37 #include <pico/unique_id.h>
39 #ifdef USE_KNX_DMA_UART
40 #include <hardware/dma.h>
89 asm volatile(
"" :::
"memory");
91 asm volatile(
"" :::
"memory");
96 #define FLASHPTR ((uint8_t*)XIP_BASE + KNX_FLASH_OFFSET)
98 #ifndef USE_RP2040_EEPROM_EMULATION
99 #if KNX_FLASH_SIZE % 4096
100 #error "KNX_FLASH_SIZE must be multiple of 4096"
103 #if KNX_FLASH_OFFSET % 4096
104 #error "KNX_FLASH_OFFSET must be multiple of 4096"
110 #elif defined(KNX_IP_WIFI)
111 #elif defined(KNX_IP_GENERIC)
116 #if !defined(KNX_NO_DEFAULT_UART) && !defined(USE_KNX_DMA_UART)
120 #ifdef KNX_UART_RX_PIN
121 _rxPin = KNX_UART_RX_PIN;
123 #ifdef KNX_UART_TX_PIN
124 _txPin = KNX_UART_TX_PIN;
126 #ifndef USE_RP2040_EEPROM_EMULATION
134 #ifndef USE_RP2040_EEPROM_EMULATION
147 #ifdef USE_KNX_DMA_UART
171 SerialUART* serial =
dynamic_cast<SerialUART*
>(
_knxSerial);
172 return serial->overflow();
178 #ifdef USE_KNX_DMA_UART
183 gpio_set_function(
_rxPin, GPIO_FUNC_UART);
184 gpio_set_function(
_txPin, GPIO_FUNC_UART);
185 uart_init(KNX_DMA_UART, 19200);
186 uart_set_hw_flow(KNX_DMA_UART,
false,
false);
187 uart_set_format(KNX_DMA_UART, 8, 1, UART_PARITY_EVEN);
188 uart_set_fifo_enabled(KNX_DMA_UART,
false);
192 dma_channel_config dmaConfig = dma_channel_get_default_config(
uartDmaChannel);
193 channel_config_set_transfer_data_size(&dmaConfig, DMA_SIZE_8);
194 channel_config_set_read_increment(&dmaConfig,
false);
195 channel_config_set_write_increment(&dmaConfig,
true);
196 channel_config_set_high_priority(&dmaConfig,
true);
198 channel_config_set_dreq(&dmaConfig, KNX_DMA_UART_DREQ);
199 dma_channel_set_read_addr(
uartDmaChannel, &uart_get_hw(uart0)->dr,
false);
206 irq_set_enabled(KNX_DMA_IRQ,
true);
210 SerialUART* serial =
dynamic_cast<SerialUART*
>(
_knxSerial);
214 if (
_rxPin != UART_PIN_NOT_DEFINED)
217 if (
_txPin != UART_PIN_NOT_DEFINED)
220 serial->setPollingMode();
221 serial->setFIFOSize(64);
232 #ifdef USE_KNX_DMA_UART
244 uint32_t tc = dma_channel_hw_addr(
uartDmaChannel)->transfer_count;
281 while (!uart_is_writable(uart0))
284 uart_putc_raw(uart0, data);
293 irq_set_enabled(DMA_IRQ_0,
false);
304 pico_unique_board_id_t id;
307 rp2040.idleOtherCore();
309 flash_get_unique_id(
id.
id);
311 rp2040.resumeOtherCore();
315 uint32_t uid = ((uint32_t)(
id.
id[4]) << 24) | ((uint32_t)(
id.id[5]) << 16) | ((uint32_t)(
id.
id[6]) << 8) | (uint32_t)(
id.id[7]);
323 watchdog_reboot(0, 0, 0);
326 #ifdef USE_RP2040_EEPROM_EMULATION
328 #pragma warning "Using EEPROM Simulation"
330 #ifdef USE_RP2040_LARGE_EEPROM_EMULATION
336 println(
"KNX_FLASH_SIZE must be a multiple of 4096");
342 memcpy(
_rambuff, FLASHPTR, KNX_FLASH_SIZE);
352 rp2040.idleOtherCore();
355 if (memcmp(
_rambuff, FLASHPTR, KNX_FLASH_SIZE))
357 flash_range_erase(KNX_FLASH_OFFSET, KNX_FLASH_SIZE);
358 flash_range_program(KNX_FLASH_OFFSET,
_rambuff, KNX_FLASH_SIZE);
361 rp2040.resumeOtherCore();
371 println(
"KNX_FLASH_SIZE to big for EEPROM emulation (max. 4kB)");
375 uint8_t* eepromptr = EEPROM.getDataPtr();
377 if (eepromptr ==
nullptr)
380 eepromptr = EEPROM.getDataPtr();
407 return (uint8_t*)XIP_BASE + KNX_FLASH_OFFSET;
412 if (KNX_FLASH_SIZE <= 0)
421 rp2040.idleOtherCore();
425 rp2040.resumeOtherCore();
432 rp2040.idleOtherCore();
436 rp2040.resumeOtherCore();
445 rp2040.idleOtherCore();
450 rp2040.resumeOtherCore();
458 #if defined(KNX_NETIF)
484 #ifdef KNX_IP_GENERIC
508 _udp.write(buffer, len);
515 int len =
_udp.parsePacket();
522 println(
"Unexpected UDP data packet length - drop packet");
524 for (
size_t i = 0; i < len; i++)
530 _udp.read(buffer, len);
546 IPAddress ucastaddr(htonl(addr));
557 #ifdef KNX_IP_GENERIC
559 if (!_unicast_socket_setup)
560 _unicast_socket_setup = UDP_UNICAST.begin(3671);
564 if (UDP_UNICAST.beginPacket(ucastaddr, port) == 1)
566 UDP_UNICAST.write(buffer, len);
568 if (UDP_UNICAST.endPacket() == 0)
569 println(
"sendBytesUniCast endPacket fail");
572 println(
"sendBytesUniCast beginPacket fail");