From 409fa59e2e704ceee7a329a57c8299ffadc6363f Mon Sep 17 00:00:00 2001 From: Marco Scholl Date: Sat, 16 Mar 2024 07:53:47 +0100 Subject: [PATCH] wip --- src/rp2040_arduino_platform.cpp | 37 ++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/rp2040_arduino_platform.cpp b/src/rp2040_arduino_platform.cpp index 22fe9326..97d0be01 100644 --- a/src/rp2040_arduino_platform.cpp +++ b/src/rp2040_arduino_platform.cpp @@ -48,7 +48,6 @@ volatile uint8_t __attribute__((aligned(uartDmaBufferSize))) uartDmaBuffer[uartD volatile uint32_t uartDmaReadCount = 0; volatile uint16_t uartDmaRestartCount = 0; - // Liefert die Zahl der gelesenen Bytes seit dem DMA Transferstart inline uint32_t uartDmaWriteCount() { @@ -56,7 +55,7 @@ inline uint32_t uartDmaWriteCount() } // Liefert die aktuelle Schreibposition im DMA Buffer -inline uint16_t uartDmaWritePosition() +inline uint16_t uartDmaWriteBufferPosition() { return uartDmaWriteCount() % uartDmaBufferSize; } @@ -77,7 +76,7 @@ inline uint8_t* uartDmaReadAddr() void __time_critical_func(uartDmaRestart)() { // println("Restart"); - uartDmaRestartCount = uartDmaWritePosition() - uartDmaReadBufferPosition(); + uartDmaRestartCount = uartDmaWriteBufferPosition() - uartDmaReadBufferPosition(); // wenn uartDmaRestartCount == 0 ist, wurde alles verarbeitet und der read count kann mit dem neustart wieder auf 0 gesetzt werden. if (uartDmaRestartCount == 0) @@ -148,11 +147,27 @@ void RP2040ArduinoPlatform::knxUartPins(pin_size_t rxPin, pin_size_t txPin) bool RP2040ArduinoPlatform::overflowUart() { #ifdef KNX_USE_DMA_UART0 - // during dma restart overflow not detectable - if (uartDmaRestartCount > 0 || uartDmaWriteCount() == 0) - return false; - - return (uartDmaWriteCount() - uartDmaReadCount) > uartDmaBufferSize; + // during dma restart + bool ret; + const uint32_t writeCount = uartDmaWriteCount(); + if (uartDmaRestartCount > 0) + ret = writeCount >= (uartDmaBufferSize - uartDmaRestartCount - 1); + else + ret = (writeCount - uartDmaReadCount) > uartDmaBufferSize; + + // if (ret) + // { + // println(uartDmaWriteBufferPosition()); + // println(uartDmaReadBufferPosition()); + // println(uartDmaWriteCount()); + // println(uartDmaReadCount); + // println(uartDmaRestartCount); + // printHex("BUF: ", (const uint8_t *)uartDmaBuffer, uartDmaBufferSize); + // println("OVERFLOW"); + // while (true) + // ; + // } + return ret; #else SerialUART* serial = dynamic_cast(_knxSerial); return serial->overflow(); @@ -210,6 +225,9 @@ void RP2040ArduinoPlatform::setupUart() #ifdef KNX_USE_DMA_UART0 int RP2040ArduinoPlatform::uartAvailable() { + if (uartDmaChannel == -1) + return 0; + if (uartDmaRestartCount > 0) { return uartDmaRestartCount; @@ -256,6 +274,9 @@ int RP2040ArduinoPlatform::readUart() size_t RP2040ArduinoPlatform::writeUart(const uint8_t data) { + if (uartDmaChannel == -1) + return 0; + // print("> "); // println(data, HEX); while (!uart_is_writable(uart0))