From 61f12324ff987cc1b8bbd8fe3e7096bd7285485d Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Wed, 15 Dec 2021 10:11:00 -0700 Subject: [PATCH] enable USB peripheral for relevant chips --- embassy-nrf/src/chips/nrf52820.rs | 3 ++ embassy-nrf/src/chips/nrf52833.rs | 5 +++ embassy-nrf/src/chips/nrf52840.rs | 5 +++ embassy-nrf/src/chips/nrf5340_app.rs | 5 +++ embassy-nrf/src/lib.rs | 8 +++-- embassy-nrf/src/usb.rs | 54 ++++++++++++++++++++++------ examples/nrf/src/bin/usb_uart.rs | 4 +-- 7 files changed, 70 insertions(+), 14 deletions(-) diff --git a/embassy-nrf/src/chips/nrf52820.rs b/embassy-nrf/src/chips/nrf52820.rs index 128e1503..8aa07bb7 100644 --- a/embassy-nrf/src/chips/nrf52820.rs +++ b/embassy-nrf/src/chips/nrf52820.rs @@ -7,6 +7,9 @@ pub const FORCE_COPY_BUFFER_SIZE: usize = 512; pub const FLASH_SIZE: usize = 256 * 1024; embassy_hal_common::peripherals! { + // USB + USBD, + // RTC RTC0, RTC1, diff --git a/embassy-nrf/src/chips/nrf52833.rs b/embassy-nrf/src/chips/nrf52833.rs index 7c7198df..498a3c30 100644 --- a/embassy-nrf/src/chips/nrf52833.rs +++ b/embassy-nrf/src/chips/nrf52833.rs @@ -7,6 +7,9 @@ pub const FORCE_COPY_BUFFER_SIZE: usize = 512; pub const FLASH_SIZE: usize = 512 * 1024; embassy_hal_common::peripherals! { + // USB + USBD, + // RTC RTC0, RTC1, @@ -154,6 +157,8 @@ embassy_hal_common::peripherals! { TEMP, } +impl_usb!(USBD, USBD, USBD); + impl_uarte!(UARTE0, UARTE0, UARTE0_UART0); impl_uarte!(UARTE1, UARTE1, UARTE1); diff --git a/embassy-nrf/src/chips/nrf52840.rs b/embassy-nrf/src/chips/nrf52840.rs index f5b90cd5..41176814 100644 --- a/embassy-nrf/src/chips/nrf52840.rs +++ b/embassy-nrf/src/chips/nrf52840.rs @@ -7,6 +7,9 @@ pub const FORCE_COPY_BUFFER_SIZE: usize = 512; pub const FLASH_SIZE: usize = 1024 * 1024; embassy_hal_common::peripherals! { + // USB + USBD, + // RTC RTC0, RTC1, @@ -157,6 +160,8 @@ embassy_hal_common::peripherals! { TEMP, } +impl_usb!(USBD, USBD, USBD); + impl_uarte!(UARTE0, UARTE0, UARTE0_UART0); impl_uarte!(UARTE1, UARTE1, UARTE1); diff --git a/embassy-nrf/src/chips/nrf5340_app.rs b/embassy-nrf/src/chips/nrf5340_app.rs index ca761893..4fcb742e 100644 --- a/embassy-nrf/src/chips/nrf5340_app.rs +++ b/embassy-nrf/src/chips/nrf5340_app.rs @@ -211,6 +211,9 @@ pub const EASY_DMA_SIZE: usize = (1 << 16) - 1; pub const FORCE_COPY_BUFFER_SIZE: usize = 1024; embassy_hal_common::peripherals! { + // USB + USBD, + // RTC RTC0, RTC1, @@ -342,6 +345,8 @@ embassy_hal_common::peripherals! { P1_15, } +impl_usb!(USBD, USBD, USBD); + impl_uarte!(UARTETWISPI0, UARTE0, SERIAL0); impl_uarte!(UARTETWISPI1, UARTE1, SERIAL1); impl_uarte!(UARTETWISPI2, UARTE2, SERIAL2); diff --git a/embassy-nrf/src/lib.rs b/embassy-nrf/src/lib.rs index 7434905e..3cd1768c 100644 --- a/embassy-nrf/src/lib.rs +++ b/embassy-nrf/src/lib.rs @@ -48,8 +48,12 @@ pub mod temp; pub mod timer; pub mod twim; pub mod uarte; -//todo add nrf52833 nrf52840 -#[cfg(feature = "nrf52840")] +#[cfg(any( + feature = "_nrf5340-app", + feature = "nrf52820", + feature = "nrf52833", + feature = "nrf52840" +))] pub mod usb; #[cfg(not(feature = "_nrf5340"))] pub mod wdt; diff --git a/embassy-nrf/src/usb.rs b/embassy-nrf/src/usb.rs index 39e53429..d0944b7f 100644 --- a/embassy-nrf/src/usb.rs +++ b/embassy-nrf/src/usb.rs @@ -1,20 +1,27 @@ #![macro_use] -pub use embassy_hal_common::usb::*; +use crate::interrupt::Interrupt; +use crate::pac; + +use core::marker::PhantomData; +use embassy::util::Unborrow; use nrf_usbd::{UsbPeripheral, Usbd}; use usb_device::bus::UsbBusAllocator; -pub struct UsbBus; -unsafe impl UsbPeripheral for UsbBus { - // todo hardcoding - const REGISTERS: *const () = crate::pac::USBD::ptr() as *const (); +pub use embassy_hal_common::usb::*; + +pub struct UsbBus<'d, T: Instance> { + phantom: PhantomData<&'d mut T>, } -impl UsbBus { - // todo should it consume a USBD peripheral? - pub fn new() -> UsbBusAllocator> { +unsafe impl<'d, T: Instance> UsbPeripheral for UsbBus<'d, T> { + const REGISTERS: *const () = T::regs as *const (); +} + +impl<'d, T: Instance> UsbBus<'d, T> { + pub fn new(_usb: impl Unborrow + 'd) -> UsbBusAllocator>> { unsafe { - (*crate::pac::USBD::ptr()).intenset.write(|w| { + (*pac::USBD::ptr()).intenset.write(|w| { w.sof().set_bit(); w.usbevent().set_bit(); w.ep0datadone().set_bit(); @@ -23,8 +30,35 @@ impl UsbBus { }) }; - Usbd::new(UsbBus) + Usbd::new(UsbBus { + phantom: PhantomData, + }) } } unsafe impl embassy_hal_common::usb::USBInterrupt for crate::interrupt::USBD {} + +pub(crate) mod sealed { + use super::*; + + pub trait Instance { + fn regs() -> &'static pac::usbd::RegisterBlock; + } +} + +pub trait Instance: Unborrow + sealed::Instance + 'static + Send { + type Interrupt: Interrupt; +} + +macro_rules! impl_usb { + ($type:ident, $pac_type:ident, $irq:ident) => { + impl crate::usb::sealed::Instance for peripherals::$type { + fn regs() -> &'static pac::usbd::RegisterBlock { + unsafe { &*pac::$pac_type::ptr() } + } + } + impl crate::usb::Instance for peripherals::$type { + type Interrupt = crate::interrupt::$irq; + } + }; +} diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs index 1df37d4b..fc7ee03b 100644 --- a/examples/nrf/src/bin/usb_uart.rs +++ b/examples/nrf/src/bin/usb_uart.rs @@ -21,11 +21,11 @@ use embassy_nrf::{interrupt, Peripherals}; use usb_device::device::{UsbDeviceBuilder, UsbVidPid}; #[embassy::main] -async fn main(_spawner: Spawner, _p: Peripherals) { +async fn main(_spawner: Spawner, p: Peripherals) { let mut tx_buffer = [0u8; 1024]; let mut rx_buffer = [0u8; 640]; - let usb_bus = UsbBus::new(); + let usb_bus = UsbBus::new(p.USBD); let serial = UsbSerial::new(&usb_bus, &mut rx_buffer, &mut tx_buffer);