diff options
| -rw-r--r-- | embassy-mcxa/src/dma.rs | 14 | ||||
| -rw-r--r-- | examples/mcxa/src/bin/dma_mem_to_mem.rs | 2 | ||||
| -rw-r--r-- | 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<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..."); |
