From b8bb8275178f2da166fc66f4865608d4dbd8d3cb Mon Sep 17 00:00:00 2001 From: Dominic Fischer Date: Sat, 1 Feb 2025 12:23:05 +0000 Subject: [PATCH] return resources on error --- esp-hal/src/parl_io.rs | 33 ++++++++++++++++++------------ hil-test/tests/parl_io.rs | 10 +++++++-- hil-test/tests/parl_io_tx.rs | 10 +++++++-- hil-test/tests/parl_io_tx_async.rs | 10 +++++++-- 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/esp-hal/src/parl_io.rs b/esp-hal/src/parl_io.rs index e4813e454f..d9ca22fc68 100644 --- a/esp-hal/src/parl_io.rs +++ b/esp-hal/src/parl_io.rs @@ -58,8 +58,9 @@ //! //! loop { //! // Read data via DMA and print received values -//! let transfer = parl_io_rx.read(Some(dma_rx_buf.len()), dma_rx_buf)?; -//! (_, parl_io_rx, dma_rx_buf) = transfer.wait(); +//! let transfer = parl_io_rx.read(Some(dma_rx_buf.len()), +//! dma_rx_buf).map_err(|e| e.0)?; (_, parl_io_rx, dma_rx_buf) = +//! transfer.wait(); //! //! delay.delay_millis(500); //! } @@ -112,9 +113,9 @@ //! //! let delay = Delay::new(); //! loop { -//! let transfer = parl_io_tx.write(dma_tx_buf.len(), dma_tx_buf)?; -//! (_, parl_io_tx, dma_tx_buf) = transfer.wait(); -//! delay.delay_millis(500); +//! let transfer = parl_io_tx.write(dma_tx_buf.len(), +//! dma_tx_buf).map_err(|e| e.0)?; (_, parl_io_tx, dma_tx_buf) = +//! transfer.wait(); delay.delay_millis(500); //! } //! # } //! ``` @@ -1507,12 +1508,12 @@ where mut self, number_of_bytes: usize, mut buffer: BUF, - ) -> Result, Error> + ) -> Result, (Error, Self, BUF)> where BUF: DmaTxBuffer, { if number_of_bytes > MAX_DMA_SIZE { - return Err(Error::MaxDmaTransferSizeExceeded); + return Err((Error::MaxDmaTransferSizeExceeded, self, buffer)); } PCR::regs() @@ -1522,10 +1523,13 @@ where Instance::clear_tx_interrupts(); Instance::set_tx_bytes(number_of_bytes as u16); - unsafe { + let result = unsafe { self.tx_channel .prepare_transfer(DmaPeripheral::ParlIo, &mut buffer) - .and_then(|_| self.tx_channel.start_transfer())?; + .and_then(|_| self.tx_channel.start_transfer()) + }; + if let Err(err) = result { + return Err((Error::DmaError(err), self, buffer)); } while !Instance::is_tx_ready() {} @@ -1638,7 +1642,7 @@ where mut self, number_of_bytes: Option, mut buffer: BUF, - ) -> Result, Error> + ) -> Result, (Error, Self, BUF)> where BUF: DmaRxBuffer, { @@ -1652,7 +1656,7 @@ where Instance::clear_rx_interrupts(); if let Some(number_of_bytes) = number_of_bytes { if number_of_bytes > MAX_DMA_SIZE { - return Err(Error::MaxDmaTransferSizeExceeded); + return Err((Error::MaxDmaTransferSizeExceeded, self, buffer)); } Instance::set_rx_bytes(number_of_bytes as u16); Instance::set_eof_gen_sel(EofMode::ByteLen); @@ -1660,10 +1664,13 @@ where Instance::set_eof_gen_sel(EofMode::EnableSignal); } - unsafe { + let result = unsafe { self.rx_channel .prepare_transfer(DmaPeripheral::ParlIo, &mut buffer) - .and_then(|_| self.rx_channel.start_transfer())?; + .and_then(|_| self.rx_channel.start_transfer()) + }; + if let Err(err) = result { + return Err((Error::DmaError(err), self, buffer)); } Instance::set_rx_reg_update(); diff --git a/hil-test/tests/parl_io.rs b/hil-test/tests/parl_io.rs index 453b1075f4..c9c7825e70 100644 --- a/hil-test/tests/parl_io.rs +++ b/hil-test/tests/parl_io.rs @@ -105,8 +105,14 @@ mod tests { *b = i as u8; } - let rx_transfer = pio_rx.read(Some(dma_rx_buf.len()), dma_rx_buf).unwrap(); - let tx_transfer = pio_tx.write(dma_tx_buf.len(), dma_tx_buf).unwrap(); + let rx_transfer = pio_rx + .read(Some(dma_rx_buf.len()), dma_rx_buf) + .map_err(|e| e.0) + .unwrap(); + let tx_transfer = pio_tx + .write(dma_tx_buf.len(), dma_tx_buf) + .map_err(|e| e.0) + .unwrap(); (_, _, dma_tx_buf) = tx_transfer.wait(); (_, _, dma_rx_buf) = rx_transfer.wait(); diff --git a/hil-test/tests/parl_io_tx.rs b/hil-test/tests/parl_io_tx.rs index 4d4db42ccc..7a86b9eea1 100644 --- a/hil-test/tests/parl_io_tx.rs +++ b/hil-test/tests/parl_io_tx.rs @@ -115,7 +115,10 @@ mod tests { for _ in 0..100 { clock_unit.clear(); - let xfer = pio.write(dma_tx_buf.len(), dma_tx_buf).unwrap(); + let xfer = pio + .write(dma_tx_buf.len(), dma_tx_buf) + .map_err(|e| e.0) + .unwrap(); (_, pio, dma_tx_buf) = xfer.wait(); info!("clock count: {}", clock_unit.value()); assert_eq!(clock_unit.value(), BUFFER_SIZE as _); @@ -174,7 +177,10 @@ mod tests { for _ in 0..100 { clock_unit.clear(); - let xfer = pio.write(dma_tx_buf.len(), dma_tx_buf).unwrap(); + let xfer = pio + .write(dma_tx_buf.len(), dma_tx_buf) + .map_err(|e| e.0) + .unwrap(); (_, pio, dma_tx_buf) = xfer.wait(); info!("clock count: {}", clock_unit.value()); assert_eq!(clock_unit.value(), BUFFER_SIZE as _); diff --git a/hil-test/tests/parl_io_tx_async.rs b/hil-test/tests/parl_io_tx_async.rs index d60b2bd1e3..c8b09ec78f 100644 --- a/hil-test/tests/parl_io_tx_async.rs +++ b/hil-test/tests/parl_io_tx_async.rs @@ -116,7 +116,10 @@ mod tests { for _ in 0..100 { clock_unit.clear(); - let mut xfer = pio.write(dma_tx_buf.len(), dma_tx_buf).unwrap(); + let mut xfer = pio + .write(dma_tx_buf.len(), dma_tx_buf) + .map_err(|e| e.0) + .unwrap(); xfer.wait_for_done().await; (_, pio, dma_tx_buf) = xfer.wait(); info!("clock count: {}", clock_unit.value()); @@ -180,7 +183,10 @@ mod tests { for _ in 0..100 { clock_unit.clear(); - let mut xfer = pio.write(dma_tx_buf.len(), dma_tx_buf).unwrap(); + let mut xfer = pio + .write(dma_tx_buf.len(), dma_tx_buf) + .map_err(|e| e.0) + .unwrap(); xfer.wait_for_done().await; (_, pio, dma_tx_buf) = xfer.wait(); info!("clock count: {}", clock_unit.value());