diff options
| -rw-r--r-- | embassy-nrf/src/uarte.rs | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/embassy-nrf/src/uarte.rs b/embassy-nrf/src/uarte.rs index 119a17981..4aa1f02d2 100644 --- a/embassy-nrf/src/uarte.rs +++ b/embassy-nrf/src/uarte.rs | |||
| @@ -22,7 +22,7 @@ use embassy_hal_common::drop::OnDrop; | |||
| 22 | use embassy_hal_common::unborrow; | 22 | use embassy_hal_common::unborrow; |
| 23 | use futures::future::poll_fn; | 23 | use futures::future::poll_fn; |
| 24 | 24 | ||
| 25 | use crate::chip::EASY_DMA_SIZE; | 25 | use crate::chip::{EASY_DMA_SIZE, FORCE_COPY_BUFFER_SIZE}; |
| 26 | use crate::gpio::sealed::Pin as _; | 26 | use crate::gpio::sealed::Pin as _; |
| 27 | use crate::gpio::{self, AnyPin, Pin as GpioPin, PselBits}; | 27 | use crate::gpio::{self, AnyPin, Pin as GpioPin, PselBits}; |
| 28 | use crate::interrupt::Interrupt; | 28 | use crate::interrupt::Interrupt; |
| @@ -224,6 +224,10 @@ impl<'d, T: Instance> Uarte<'d, T> { | |||
| 224 | self.tx.write(buffer).await | 224 | self.tx.write(buffer).await |
| 225 | } | 225 | } |
| 226 | 226 | ||
| 227 | pub async fn write_from_ram(&mut self, buffer: &[u8]) -> Result<(), Error> { | ||
| 228 | self.tx.write_from_ram(buffer).await | ||
| 229 | } | ||
| 230 | |||
| 227 | pub fn blocking_read(&mut self, buffer: &mut [u8]) -> Result<(), Error> { | 231 | pub fn blocking_read(&mut self, buffer: &mut [u8]) -> Result<(), Error> { |
| 228 | self.rx.blocking_read(buffer) | 232 | self.rx.blocking_read(buffer) |
| 229 | } | 233 | } |
| @@ -231,10 +235,27 @@ impl<'d, T: Instance> Uarte<'d, T> { | |||
| 231 | pub fn blocking_write(&mut self, buffer: &[u8]) -> Result<(), Error> { | 235 | pub fn blocking_write(&mut self, buffer: &[u8]) -> Result<(), Error> { |
| 232 | self.tx.blocking_write(buffer) | 236 | self.tx.blocking_write(buffer) |
| 233 | } | 237 | } |
| 238 | |||
| 239 | pub fn blocking_write_from_ram(&mut self, buffer: &[u8]) -> Result<(), Error> { | ||
| 240 | self.tx.blocking_write_from_ram(buffer) | ||
| 241 | } | ||
| 234 | } | 242 | } |
| 235 | 243 | ||
| 236 | impl<'d, T: Instance> UarteTx<'d, T> { | 244 | impl<'d, T: Instance> UarteTx<'d, T> { |
| 237 | pub async fn write(&mut self, buffer: &[u8]) -> Result<(), Error> { | 245 | pub async fn write(&mut self, buffer: &[u8]) -> Result<(), Error> { |
| 246 | match self.write_from_ram(buffer).await { | ||
| 247 | Ok(_) => Ok(()), | ||
| 248 | Err(Error::DMABufferNotInDataMemory) => { | ||
| 249 | trace!("Copying UARTE tx buffer into RAM for DMA"); | ||
| 250 | let mut tx_buf = [0u8; FORCE_COPY_BUFFER_SIZE]; | ||
| 251 | tx_buf[..buffer.len()].copy_from_slice(buffer); | ||
| 252 | self.write_from_ram(&tx_buf[..buffer.len()]).await | ||
| 253 | } | ||
| 254 | Err(error) => Err(error), | ||
| 255 | } | ||
| 256 | } | ||
| 257 | |||
| 258 | pub async fn write_from_ram(&mut self, buffer: &[u8]) -> Result<(), Error> { | ||
| 238 | slice_in_ram_or(buffer, Error::DMABufferNotInDataMemory)?; | 259 | slice_in_ram_or(buffer, Error::DMABufferNotInDataMemory)?; |
| 239 | if buffer.len() == 0 { | 260 | if buffer.len() == 0 { |
| 240 | return Err(Error::BufferZeroLength); | 261 | return Err(Error::BufferZeroLength); |
| @@ -289,6 +310,19 @@ impl<'d, T: Instance> UarteTx<'d, T> { | |||
| 289 | } | 310 | } |
| 290 | 311 | ||
| 291 | pub fn blocking_write(&mut self, buffer: &[u8]) -> Result<(), Error> { | 312 | pub fn blocking_write(&mut self, buffer: &[u8]) -> Result<(), Error> { |
| 313 | match self.blocking_write_from_ram(buffer) { | ||
| 314 | Ok(_) => Ok(()), | ||
| 315 | Err(Error::DMABufferNotInDataMemory) => { | ||
| 316 | trace!("Copying UARTE tx buffer into RAM for DMA"); | ||
| 317 | let mut tx_buf = [0u8; FORCE_COPY_BUFFER_SIZE]; | ||
| 318 | tx_buf[..buffer.len()].copy_from_slice(buffer); | ||
| 319 | self.blocking_write_from_ram(&tx_buf[..buffer.len()]) | ||
| 320 | } | ||
| 321 | Err(error) => Err(error), | ||
| 322 | } | ||
| 323 | } | ||
| 324 | |||
| 325 | pub fn blocking_write_from_ram(&mut self, buffer: &[u8]) -> Result<(), Error> { | ||
| 292 | slice_in_ram_or(buffer, Error::DMABufferNotInDataMemory)?; | 326 | slice_in_ram_or(buffer, Error::DMABufferNotInDataMemory)?; |
| 293 | if buffer.len() == 0 { | 327 | if buffer.len() == 0 { |
| 294 | return Err(Error::BufferZeroLength); | 328 | return Err(Error::BufferZeroLength); |
