diff options
| author | Thales Fragoso <[email protected]> | 2021-07-18 12:21:36 -0300 |
|---|---|---|
| committer | Thales Fragoso <[email protected]> | 2021-08-01 19:10:42 -0300 |
| commit | 6ddc83029a6024692dd632029f0aadef776b5ef3 (patch) | |
| tree | 548e4de54476b31ad7b4f9534c133611728e1096 | |
| parent | 362f7efe9954f16663bbb8db8543b33c0b00f49a (diff) | |
i2c-v2: Simplify write_dma
| -rw-r--r-- | embassy-stm32/src/i2c/v2.rs | 33 |
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 | } |
