aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-nrf/src/uarte.rs36
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;
22use embassy_hal_common::unborrow; 22use embassy_hal_common::unborrow;
23use futures::future::poll_fn; 23use futures::future::poll_fn;
24 24
25use crate::chip::EASY_DMA_SIZE; 25use crate::chip::{EASY_DMA_SIZE, FORCE_COPY_BUFFER_SIZE};
26use crate::gpio::sealed::Pin as _; 26use crate::gpio::sealed::Pin as _;
27use crate::gpio::{self, AnyPin, Pin as GpioPin, PselBits}; 27use crate::gpio::{self, AnyPin, Pin as GpioPin, PselBits};
28use crate::interrupt::Interrupt; 28use 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
236impl<'d, T: Instance> UarteTx<'d, T> { 244impl<'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);