Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
traxanos committed Mar 16, 2024
1 parent 9643fdb commit 409fa59
Showing 1 changed file with 29 additions and 8 deletions.
37 changes: 29 additions & 8 deletions src/rp2040_arduino_platform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,14 @@ 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()
{
return uartDmaTransferCount - dma_channel_hw_addr(uartDmaChannel)->transfer_count;
}

// Liefert die aktuelle Schreibposition im DMA Buffer
inline uint16_t uartDmaWritePosition()
inline uint16_t uartDmaWriteBufferPosition()
{
return uartDmaWriteCount() % uartDmaBufferSize;
}
Expand All @@ -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)
Expand Down Expand Up @@ -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<SerialUART*>(_knxSerial);
return serial->overflow();
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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))
Expand Down

0 comments on commit 409fa59

Please sign in to comment.