Skip to content

Commit

Permalink
return resources on error
Browse files Browse the repository at this point in the history
  • Loading branch information
Dominic Fischer committed Feb 1, 2025
1 parent 53f388c commit b8bb827
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 19 deletions.
33 changes: 20 additions & 13 deletions esp-hal/src/parl_io.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
//! }
Expand Down Expand Up @@ -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);
//! }
//! # }
//! ```
Expand Down Expand Up @@ -1507,12 +1508,12 @@ where
mut self,
number_of_bytes: usize,
mut buffer: BUF,
) -> Result<ParlIoTxTransfer<'d, BUF, Dm>, Error>
) -> Result<ParlIoTxTransfer<'d, BUF, Dm>, (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()
Expand All @@ -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() {}
Expand Down Expand Up @@ -1638,7 +1642,7 @@ where
mut self,
number_of_bytes: Option<usize>,
mut buffer: BUF,
) -> Result<ParlIoRxTransfer<'d, BUF, Dm>, Error>
) -> Result<ParlIoRxTransfer<'d, BUF, Dm>, (Error, Self, BUF)>
where
BUF: DmaRxBuffer,
{
Expand All @@ -1652,18 +1656,21 @@ 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);
} else {
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();
Expand Down
10 changes: 8 additions & 2 deletions hil-test/tests/parl_io.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
10 changes: 8 additions & 2 deletions hil-test/tests/parl_io_tx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 _);
Expand Down Expand Up @@ -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 _);
Expand Down
10 changes: 8 additions & 2 deletions hil-test/tests/parl_io_tx_async.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down Expand Up @@ -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());
Expand Down

0 comments on commit b8bb827

Please sign in to comment.