aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-nrf/src/usb.rs12
1 files changed, 9 insertions, 3 deletions
diff --git a/embassy-nrf/src/usb.rs b/embassy-nrf/src/usb.rs
index 2621e65f4..d1c94dbb7 100644
--- a/embassy-nrf/src/usb.rs
+++ b/embassy-nrf/src/usb.rs
@@ -20,6 +20,7 @@ pub use embassy_usb;
20 20
21use crate::interrupt::Interrupt; 21use crate::interrupt::Interrupt;
22use crate::pac; 22use crate::pac;
23use crate::util::slice_in_ram;
23 24
24const NEW_AW: AtomicWaker = AtomicWaker::new(); 25const NEW_AW: AtomicWaker = AtomicWaker::new();
25static BUS_WAKER: AtomicWaker = NEW_AW; 26static BUS_WAKER: AtomicWaker = NEW_AW;
@@ -408,10 +409,15 @@ unsafe fn write_dma<T: Instance>(i: usize, buf: &[u8]) -> Result<(), WriteError>
408 return Err(WriteError::BufferOverflow); 409 return Err(WriteError::BufferOverflow);
409 } 410 }
410 411
411 // EasyDMA can't read FLASH, so we copy through RAM
412 let mut ram_buf: MaybeUninit<[u8; 64]> = MaybeUninit::uninit(); 412 let mut ram_buf: MaybeUninit<[u8; 64]> = MaybeUninit::uninit();
413 let ptr = ram_buf.as_mut_ptr() as *mut u8; 413 let ptr = if !slice_in_ram(buf) {
414 core::ptr::copy_nonoverlapping(buf.as_ptr(), ptr, buf.len()); 414 // EasyDMA can't read FLASH, so we copy through RAM
415 let ptr = ram_buf.as_mut_ptr() as *mut u8;
416 core::ptr::copy_nonoverlapping(buf.as_ptr(), ptr, buf.len());
417 ptr
418 } else {
419 buf.as_ptr()
420 };
415 421
416 let epin = [ 422 let epin = [
417 &regs.epin0, 423 &regs.epin0,