From 3e7de3a5d81e32e77aeb5232e5a7f512ce39db0e Mon Sep 17 00:00:00 2001 From: James Munns Date: Tue, 9 Dec 2025 17:53:45 +0100 Subject: Change transfer to return a result --- embassy-mcxa/src/dma.rs | 14 +++++++++----- examples/mcxa/src/bin/dma_mem_to_mem.rs | 2 +- examples/mcxa/src/bin/raw_dma_ping_pong_transfer.rs | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/embassy-mcxa/src/dma.rs b/embassy-mcxa/src/dma.rs index ff9ebeb05..ffe816469 100644 --- a/embassy-mcxa/src/dma.rs +++ b/embassy-mcxa/src/dma.rs @@ -773,10 +773,14 @@ impl DmaChannel { /// /// The source and destination buffers must remain valid for the /// duration of the transfer. - pub fn mem_to_mem(&self, src: &[W], dst: &mut [W], options: TransferOptions) -> Transfer<'_> { - assert!(!src.is_empty()); - assert!(dst.len() >= src.len()); - assert!(src.len() <= 0x7fff); + pub fn mem_to_mem(&self, src: &[W], dst: &mut [W], options: TransferOptions) -> Result, Error> { + let mut invalid = false; + invalid |= src.is_empty(); + invalid |= src.len() > dst.len(); + invalid |= src.len() > 0x7fff; + if invalid { + return Err(Error::Configuration); + } let size = W::size(); let byte_count = (src.len() * size.bytes()) as u32; @@ -837,7 +841,7 @@ impl DmaChannel { .set_bit() // Start the channel }); - Transfer::new(self.as_any()) + Ok(Transfer::new(self.as_any())) } /// Fill a memory buffer with a pattern value (memset). diff --git a/examples/mcxa/src/bin/dma_mem_to_mem.rs b/examples/mcxa/src/bin/dma_mem_to_mem.rs index b20068b79..a9ee9ffdf 100644 --- a/examples/mcxa/src/bin/dma_mem_to_mem.rs +++ b/examples/mcxa/src/bin/dma_mem_to_mem.rs @@ -70,7 +70,7 @@ async fn main(_spawner: Spawner) { // Perform type-safe memory-to-memory transfer using Embassy-style async API // Using async `.await` - the executor can run other tasks while waiting! - let transfer = dma_ch0.mem_to_mem(src, dst, options); + let transfer = dma_ch0.mem_to_mem(src, dst, options).unwrap(); transfer.await; defmt::info!("DMA mem-to-mem transfer complete!"); diff --git a/examples/mcxa/src/bin/raw_dma_ping_pong_transfer.rs b/examples/mcxa/src/bin/raw_dma_ping_pong_transfer.rs index 51a7bc275..1e16e60ba 100644 --- a/examples/mcxa/src/bin/raw_dma_ping_pong_transfer.rs +++ b/examples/mcxa/src/bin/raw_dma_ping_pong_transfer.rs @@ -217,7 +217,7 @@ async fn main(_spawner: Spawner) { defmt::info!("Starting transfer with half_transfer_interrupt..."); // Create the transfer - let mut transfer = dma_ch1.mem_to_mem(src2, dst2, options); + let mut transfer = dma_ch1.mem_to_mem(src2, dst2, options).unwrap(); // Wait for half-transfer (first 4 elements) defmt::info!("Waiting for first half..."); -- cgit