aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-mcxa/src/dma.rs14
-rw-r--r--examples/mcxa/src/bin/dma_mem_to_mem.rs2
-rw-r--r--examples/mcxa/src/bin/raw_dma_ping_pong_transfer.rs2
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<C: Channel> DmaChannel<C> {
773 /// 773 ///
774 /// The source and destination buffers must remain valid for the 774 /// The source and destination buffers must remain valid for the
775 /// duration of the transfer. 775 /// duration of the transfer.
776 pub fn mem_to_mem<W: Word>(&self, src: &[W], dst: &mut [W], options: TransferOptions) -> Transfer<'_> { 776 pub fn mem_to_mem<W: Word>(&self, src: &[W], dst: &mut [W], options: TransferOptions) -> Result<Transfer<'_>, Error> {
777 assert!(!src.is_empty()); 777 let mut invalid = false;
778 assert!(dst.len() >= src.len()); 778 invalid |= src.is_empty();
779 assert!(src.len() <= 0x7fff); 779 invalid |= src.len() > dst.len();
780 invalid |= src.len() > 0x7fff;
781 if invalid {
782 return Err(Error::Configuration);
783 }
780 784
781 let size = W::size(); 785 let size = W::size();
782 let byte_count = (src.len() * size.bytes()) as u32; 786 let byte_count = (src.len() * size.bytes()) as u32;
@@ -837,7 +841,7 @@ impl<C: Channel> DmaChannel<C> {
837 .set_bit() // Start the channel 841 .set_bit() // Start the channel
838 }); 842 });
839 843
840 Transfer::new(self.as_any()) 844 Ok(Transfer::new(self.as_any()))
841 } 845 }
842 846
843 /// Fill a memory buffer with a pattern value (memset). 847 /// 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) {
70 70
71 // Perform type-safe memory-to-memory transfer using Embassy-style async API 71 // Perform type-safe memory-to-memory transfer using Embassy-style async API
72 // Using async `.await` - the executor can run other tasks while waiting! 72 // Using async `.await` - the executor can run other tasks while waiting!
73 let transfer = dma_ch0.mem_to_mem(src, dst, options); 73 let transfer = dma_ch0.mem_to_mem(src, dst, options).unwrap();
74 transfer.await; 74 transfer.await;
75 75
76 defmt::info!("DMA mem-to-mem transfer complete!"); 76 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) {
217 defmt::info!("Starting transfer with half_transfer_interrupt..."); 217 defmt::info!("Starting transfer with half_transfer_interrupt...");
218 218
219 // Create the transfer 219 // Create the transfer
220 let mut transfer = dma_ch1.mem_to_mem(src2, dst2, options); 220 let mut transfer = dma_ch1.mem_to_mem(src2, dst2, options).unwrap();
221 221
222 // Wait for half-transfer (first 4 elements) 222 // Wait for half-transfer (first 4 elements)
223 defmt::info!("Waiting for first half..."); 223 defmt::info!("Waiting for first half...");