aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThales Fragoso <[email protected]>2021-07-18 12:21:36 -0300
committerThales Fragoso <[email protected]>2021-08-01 19:10:42 -0300
commit6ddc83029a6024692dd632029f0aadef776b5ef3 (patch)
tree548e4de54476b31ad7b4f9534c133611728e1096
parent362f7efe9954f16663bbb8db8543b33c0b00f49a (diff)
i2c-v2: Simplify write_dma
-rw-r--r--embassy-stm32/src/i2c/v2.rs33
1 files changed, 9 insertions, 24 deletions
diff --git a/embassy-stm32/src/i2c/v2.rs b/embassy-stm32/src/i2c/v2.rs
index 9a1513cf1..805265d22 100644
--- a/embassy-stm32/src/i2c/v2.rs
+++ b/embassy-stm32/src/i2c/v2.rs
@@ -391,8 +391,6 @@ impl<'d, T: Instance, TXDMA, RXDMA> I2c<'d, T, TXDMA, RXDMA> {
391 bytes: &[u8], 391 bytes: &[u8],
392 first_slice: bool, 392 first_slice: bool,
393 last_slice: bool, 393 last_slice: bool,
394 next_slice_len: usize,
395 next_is_last: bool,
396 ) -> Result<(), Error> 394 ) -> Result<(), Error>
397 where 395 where
398 TXDMA: crate::i2c::TxDma<T>, 396 TXDMA: crate::i2c::TxDma<T>,
@@ -443,6 +441,11 @@ impl<'d, T: Instance, TXDMA, RXDMA> I2c<'d, T, TXDMA, RXDMA> {
443 (total_chunks != 1) || !last_slice, 441 (total_chunks != 1) || !last_slice,
444 ); 442 );
445 } 443 }
444 } else {
445 // NOTE(unsafe) self.tx_dma does not fiddle with the i2c registers
446 unsafe {
447 Self::master_continue(total_len.min(255), (total_chunks != 1) || !last_slice);
448 }
446 } 449 }
447 450
448 poll_fn(|cx| { 451 poll_fn(|cx| {
@@ -450,17 +453,6 @@ impl<'d, T: Instance, TXDMA, RXDMA> I2c<'d, T, TXDMA, RXDMA> {
450 let chunks_transferred = STATE.chunks_transferred[state_number].load(Ordering::Relaxed); 453 let chunks_transferred = STATE.chunks_transferred[state_number].load(Ordering::Relaxed);
451 454
452 if chunks_transferred == total_chunks { 455 if chunks_transferred == total_chunks {
453 if !last_slice {
454 // NOTE(unsafe) self.tx_dma does not fiddle with the i2c registers
455 unsafe {
456 Self::master_continue(
457 next_slice_len.min(255),
458 (next_slice_len > 255) || !next_is_last,
459 );
460 T::regs().cr1().modify(|w| w.set_tcie(true));
461 }
462 }
463
464 return Poll::Ready(()); 456 return Poll::Ready(());
465 } else if chunks_transferred != 0 { 457 } else if chunks_transferred != 0 {
466 remaining_len = remaining_len.saturating_sub(255); 458 remaining_len = remaining_len.saturating_sub(255);
@@ -490,8 +482,7 @@ impl<'d, T: Instance, TXDMA, RXDMA> I2c<'d, T, TXDMA, RXDMA> {
490 where 482 where
491 TXDMA: crate::i2c::TxDma<T>, 483 TXDMA: crate::i2c::TxDma<T>,
492 { 484 {
493 self.write_dma_internal(address, bytes, true, true, 0, true) 485 self.write_dma_internal(address, bytes, true, true).await
494 .await
495 } 486 }
496 487
497 pub async fn write_dma_vectored(&mut self, address: u8, bytes: &[&[u8]]) -> Result<(), Error> 488 pub async fn write_dma_vectored(&mut self, address: u8, bytes: &[&[u8]]) -> Result<(), Error>
@@ -501,21 +492,15 @@ impl<'d, T: Instance, TXDMA, RXDMA> I2c<'d, T, TXDMA, RXDMA> {
501 if bytes.is_empty() { 492 if bytes.is_empty() {
502 return Err(Error::ZeroLengthTransfer); 493 return Err(Error::ZeroLengthTransfer);
503 } 494 }
504 let mut iter = bytes.iter().peekable(); 495 let mut iter = bytes.iter();
505 496
506 let mut first = true; 497 let mut first = true;
507 let mut current = iter.next(); 498 let mut current = iter.next();
508 while let Some(c) = current { 499 while let Some(c) = current {
509 let next = iter.next(); 500 let next = iter.next();
510 let (next_len, is_last) = if let Some(next) = next { 501 let is_last = next.is_none();
511 (next.len(), false)
512 } else {
513 (0, true)
514 };
515 let next_is_last = iter.peek().is_none();
516 502
517 self.write_dma_internal(address, c, first, is_last, next_len, next_is_last) 503 self.write_dma_internal(address, c, first, is_last).await?;
518 .await?;
519 first = false; 504 first = false;
520 current = next; 505 current = next;
521 } 506 }