From c1bff3dad0b86090aef336115d77ed8c02fc2255 Mon Sep 17 00:00:00 2001 From: Rolf Sommerhalder Date: Sat, 24 May 2025 10:16:58 +0200 Subject: [PATCH] Fix DMA to SPI transmits on RP2350 (#4903) * Fix DMA to SPI transfers on RP2350 DMA DREQ line numbers for "flow control" between SPI bus and DMA channels on RP2350 differ from RP2040. Tested with st7789 driver for Pico-1.14-LCD from Waveshare on Pico 2W. Without this fix func st7789.tx() blocks indefinitely while attempting to use DMA to SPI transfers. * Add definitions for DMA DREQ "handshake" lines Specific for RP2350, missing in generated src/device/rp/rp2350.go * Add definitions for DMA DREQ "handshake" lines Specific for RP2040, missing in generated src/device/rp/rp2040.go * Complete table * Complete table * Remove redundant DMA_ prefix * Correct name of Datasheet * Correct name of Datasheet * Refactor Move global definitions to device/rp/ * Refactor * Refactor * Refacture * Refacture * Fix comments * go fmt * rename new non-generated files --- src/device/rp/rp2040-extra.go | 51 ++++++++++++++++++++++++++ src/device/rp/rp2350-extra.go | 66 ++++++++++++++++++++++++++++++++++ src/machine/machine_rp2_spi.go | 4 +-- 3 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 src/device/rp/rp2040-extra.go create mode 100644 src/device/rp/rp2350-extra.go diff --git a/src/device/rp/rp2040-extra.go b/src/device/rp/rp2040-extra.go new file mode 100644 index 000000000..4ffbb5b10 --- /dev/null +++ b/src/device/rp/rp2040-extra.go @@ -0,0 +1,51 @@ +// Hand created file. DO NOT DELETE. +// Definitions that are missing in src/device/rp/rp2040.go generated from SVDs + +//go:build rp && rp2040 + +package rp + +// DMA: 2.5.3.1. System DREQ Table from RP2040 Datasheet +// https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf +const ( + DREQ_PIO0_TX0 = 0 + DREQ_PIO0_TX1 = 1 + DREQ_PIO0_TX2 = 2 + DREQ_PIO0_TX3 = 3 + DREQ_PIO0_RX0 = 4 + DREQ_PIO0_RX1 = 5 + DREQ_PIO0_RX2 = 6 + DREQ_PIO0_RX3 = 7 + DREQ_PIO1_TX0 = 8 + DREQ_PIO1_TX1 = 9 + DREQ_PIO1_TX2 = 10 + DREQ_PIO1_TX3 = 11 + DREQ_PIO1_RX0 = 12 + DREQ_PIO1_RX1 = 13 + DREQ_PIO1_RX2 = 14 + DREQ_PIO1_RX3 = 15 + DREQ_SPI0_TX = 16 + DREQ_SPI0_RX = 17 + DREQ_SPI1_TX = 18 + DREQ_SPI1_RX = 19 + DREQ_UART0_TX = 20 + DREQ_UART0_RX = 21 + DREQ_UART1_TX = 22 + DREQ_UART1_RX = 23 + DREQ_PWM_WRAP0 = 24 + DREQ_PWM_WRAP1 = 25 + DREQ_PWM_WRAP2 = 26 + DREQ_PWM_WRAP3 = 27 + DREQ_PWM_WRAP4 = 28 + DREQ_PWM_WRAP5 = 29 + DREQ_PWM_WRAP6 = 30 + DREQ_PWM_WRAP7 = 31 + DREQ_I2C0_TX = 32 + DREQ_I2C0_RX = 33 + DREQ_I2C1_TX = 34 + DREQ_I2C1_RX = 35 + DREQ_ADC = 36 + DREQ_XIP_STREAM = 37 + DREQ_XIP_SSITX = 38 + DREQ_XIP_SSIRX = 39 +) diff --git a/src/device/rp/rp2350-extra.go b/src/device/rp/rp2350-extra.go new file mode 100644 index 000000000..b39b01b23 --- /dev/null +++ b/src/device/rp/rp2350-extra.go @@ -0,0 +1,66 @@ +// Hand created file. DO NOT DELETE. +// Definitions that are missing in src/device/rp/rp2350.go generated from SVDs + +//go:build rp && rp2350 + +package rp + +// DMA: 12.6.4.1. System DREQ Table from RP2350 Datasheet +// https://datasheets.raspberrypi.com/rp2350/rp2350-datasheet.pdf +const ( + DREQ_PIO0_TX0 = 0 + DREQ_PIO0_TX1 = 1 + DREQ_PIO0_TX2 = 2 + DREQ_PIO0_TX3 = 3 + DREQ_PIO0_RX0 = 4 + DREQ_PIO0_RX1 = 5 + DREQ_PIO0_RX2 = 6 + DREQ_PIO0_RX3 = 7 + DREQ_PIO1_TX0 = 8 + DREQ_PIO1_TX1 = 9 + DREQ_PIO1_TX2 = 10 + DREQ_PIO1_TX3 = 11 + DREQ_PIO1_RX0 = 12 + DREQ_PIO1_RX1 = 13 + DREQ_PIO1_RX2 = 14 + DREQ_PIO1_RX3 = 15 + DREQ_PIO2_TX0 = 16 + DREQ_PIO2_TX1 = 17 + DREQ_PIO2_TX2 = 18 + DREQ_PIO2_TX3 = 19 + DREQ_PIO2_RX0 = 20 + DREQ_PIO2_RX1 = 21 + DREQ_PIO2_RX2 = 22 + DREQ_PIO2_RX3 = 23 + DREQ_SPI0_TX = 24 + DREQ_SPI0_RX = 25 + DREQ_SPI1_TX = 26 + DREQ_SPI1_RX = 27 + DREQ_UART0_TX = 28 + DREQ_UART0_RX = 29 + DREQ_UART1_TX = 30 + DREQ_UART1_RX = 31 + DREQ_PWM_WRAP0 = 32 + DREQ_PWM_WRAP1 = 33 + DREQ_PWM_WRAP2 = 34 + DREQ_PWM_WRAP3 = 35 + DREQ_PWM_WRAP4 = 36 + DREQ_PWM_WRAP5 = 37 + DREQ_PWM_WRAP6 = 38 + DREQ_PWM_WRAP7 = 39 + DREQ_PWM_WRAP8 = 40 + DREQ_PWM_WRAP9 = 41 + DREQ_PWM_WRAP10 = 42 + DREQ_PWM_WRAP11 = 43 + DREQ_I2C0_TX = 44 + DREQ_I2C0_RX = 45 + DREQ_I2C1_TX = 46 + DREQ_I2C1_RX = 47 + DREQ_ADC = 48 + DREQ_XIP_STREAM = 49 + DREQ_XIP_QMITX = 50 + DREQ_XIP_QMIRX = 51 + DREQ_HSTX = 52 + DREQ_CORESIGHT = 53 + DREQ_SHA256 = 54 +) diff --git a/src/machine/machine_rp2_spi.go b/src/machine/machine_rp2_spi.go index 88301c98b..d9cfc11d1 100644 --- a/src/machine/machine_rp2_spi.go +++ b/src/machine/machine_rp2_spi.go @@ -297,10 +297,10 @@ func (spi *SPI) tx(tx []byte) error { var dreq uint32 if spi.Bus == rp.SPI0 { ch = &dmaChannels[spi0DMAChannel] - dreq = 16 // DREQ_SPI0_TX + dreq = rp.DREQ_SPI0_TX } else { // SPI1 ch = &dmaChannels[spi1DMAChannel] - dreq = 18 // DREQ_SPI1_TX + dreq = rp.DREQ_SPI1_TX } // Configure the DMA peripheral as follows: