From a3510ab1644cba92e4ea28bb993687a5ff076b03 Mon Sep 17 00:00:00 2001 From: Jimmy Date: Sat, 14 Feb 2026 23:38:20 +1300 Subject: [PATCH] Fix for RP2350 --- src/dma.py | 88 ++++++++++++++++++++++++++---------------------------- 1 file changed, 42 insertions(+), 46 deletions(-) diff --git a/src/dma.py b/src/dma.py index 04abead..0e7b158 100644 --- a/src/dma.py +++ b/src/dma.py @@ -1,12 +1,13 @@ +# DMA driver for Raspberry Pi Pico 2 (RP2350) only. from machine import Pin from rp2 import PIO, StateMachine, asm_pio -from time import sleep import array import uctypes from uctypes import BF_POS, BF_LEN, UINT32, BFUINT32, struct PIO0_BASE = 0x50200000 PIO1_BASE = 0x50300000 +PIO2_BASE = 0x50400000 DMA_BASE = 0x50000000 DMA_CHAN_WIDTH = 0x40 DMA_CHAN_COUNT = 12 @@ -15,35 +16,34 @@ DMA_SIZE_BYTE = 0x0 DMA_SIZE_HALFWORD = 0x1 DMA_SIZE_WORD = 0x2 -# DMA: RP2040 datasheet 2.5.7 +# RP2350 DMA CTRL_TRIG bit positions DMA_CTRL_TRIG_FIELDS = { "AHB_ERROR": 31<= 0 and sm_num < 4): - self.dma_chan.WRITE_ADDR_REG = PIO0_BASE + 0x10 + sm_num *4 - self.dma_chan.CTRL_TRIG.TREQ_SEL = sm_num - elif (sm_num < 8): - self.dma_chan.WRITE_ADDR_REG = PIO1_BASE + 0x10 + (sm_num-4) *4 - self.dma_chan.CTRL_TRIG.TREQ_SEL = sm_num + 4 - - if (block_size == 8): + + pio_base, treq_sel = _pio_base_and_treq(sm_num) + sm_offset = (sm_num % 4) * 4 + self.dma_chan.WRITE_ADDR_REG = pio_base + PIO_TX_FIFO_OFFSET + sm_offset + self.dma_chan.CTRL_TRIG.TREQ_SEL = treq_sel + + if block_size == 8: self.dma_chan.CTRL_TRIG.DATA_SIZE = DMA_SIZE_BYTE - if (block_size == 16): + elif block_size == 16: self.dma_chan.CTRL_TRIG.DATA_SIZE = DMA_SIZE_HALFWORD - if (block_size == 32): + elif block_size == 32: self.dma_chan.CTRL_TRIG.DATA_SIZE = DMA_SIZE_WORD - + self.dma_chan.TRANS_COUNT_REG = transfer_count - - #Do I just always want these? + self.dma_chan.CTRL_TRIG.INCR_WRITE = 0 self.dma_chan.CTRL_TRIG.INCR_READ = 1 - + self.dma_chan.CTRL_TRIG.CHAIN_TO = dma_channel + def start_transfer(self, buffer): self.dma_chan.READ_ADDR_REG = uctypes.addressof(buffer) self.dma_chan.CTRL_TRIG.EN = 1 def transfer_count(self): return self.dma_chan.TRANS_COUNT_REG - + def busy(self): - if self.dma_chan.CTRL_TRIG.DATA_SIZE == 1: - return True - else: - return False - - - - - - - - - - + return bool(self.dma_chan.CTRL_TRIG_REG & (1 << 26))