diff options
| -rw-r--r-- | embassy-nrf/src/usb.rs | 12 |
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 | ||
| 21 | use crate::interrupt::Interrupt; | 21 | use crate::interrupt::Interrupt; |
| 22 | use crate::pac; | 22 | use crate::pac; |
| 23 | use crate::util::slice_in_ram; | ||
| 23 | 24 | ||
| 24 | const NEW_AW: AtomicWaker = AtomicWaker::new(); | 25 | const NEW_AW: AtomicWaker = AtomicWaker::new(); |
| 25 | static BUS_WAKER: AtomicWaker = NEW_AW; | 26 | static 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 | ®s.epin0, | 423 | ®s.epin0, |
