diff --git a/Cargo.lock b/Cargo.lock index 0f0065e0f..058cf6e78 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3735,6 +3735,7 @@ dependencies = [ "riot-rs-debug", "riot-rs-embassy-common", "riot-rs-utils", + "static_cell", ] [[package]] diff --git a/laze-project.yml b/laze-project.yml index 469b325a1..2ae50a27e 100644 --- a/laze-project.yml +++ b/laze-project.yml @@ -626,6 +626,7 @@ modules: - name: hw/usb-device-port help: provided if a device has a USB device port wired up context: + - espressif-esp32-s3-wroom-1 - nrf5340dk - nrf52840dk - rpi-pico diff --git a/src/riot-rs-embassy/Cargo.toml b/src/riot-rs-embassy/Cargo.toml index 9abb92afb..2b4789cec 100644 --- a/src/riot-rs-embassy/Cargo.toml +++ b/src/riot-rs-embassy/Cargo.toml @@ -89,6 +89,7 @@ spi = [ ] usb = [ "dep:embassy-usb", + "riot-rs-esp/usb", "riot-rs-nrf/usb", "riot-rs-rp/usb", "riot-rs-stm32/usb", diff --git a/src/riot-rs-esp/Cargo.toml b/src/riot-rs-esp/Cargo.toml index 4ae5fd8aa..dddfc23a3 100644 --- a/src/riot-rs-esp/Cargo.toml +++ b/src/riot-rs-esp/Cargo.toml @@ -31,6 +31,7 @@ paste = { workspace = true } riot-rs-debug = { workspace = true } riot-rs-embassy-common = { workspace = true } riot-rs-utils = { workspace = true } +static_cell = { workspace = true } [target.'cfg(context = "cortex-m")'.dependencies] embassy-executor = { workspace = true, default-features = false, features = [ @@ -81,6 +82,9 @@ spi = ["dep:fugit", "riot-rs-embassy-common/spi"] ## Enables defmt support. defmt = ["dep:defmt", "esp-wifi?/defmt", "fugit?/defmt"] +# Enables USB support. +usb = [] + ## Enables Wi-Fi support. wifi = [] diff --git a/src/riot-rs-esp/src/lib.rs b/src/riot-rs-esp/src/lib.rs index bdafd6ae8..8efac4a5a 100644 --- a/src/riot-rs-esp/src/lib.rs +++ b/src/riot-rs-esp/src/lib.rs @@ -11,6 +11,9 @@ pub mod i2c; #[cfg(feature = "spi")] pub mod spi; +#[cfg(feature = "usb")] +pub mod usb; + #[cfg(feature = "wifi")] pub mod wifi; diff --git a/src/riot-rs-esp/src/usb/mod.rs b/src/riot-rs-esp/src/usb/mod.rs new file mode 100644 index 000000000..3214b4e3f --- /dev/null +++ b/src/riot-rs-esp/src/usb/mod.rs @@ -0,0 +1,22 @@ +use esp_hal::otg_fs::asynch::Driver; +use static_cell::ConstStaticCell; + +pub type UsbDriver = Driver<'static>; + +pub fn driver(peripherals: &mut crate::OptionalPeripherals) -> UsbDriver { + use esp_hal::otg_fs::{asynch::Config, Usb}; + + let usb = Usb::new( + peripherals.USB0.take().unwrap(), + peripherals.GPIO_20.take().unwrap(), + peripherals.GPIO_19.take().unwrap(), + ); + + // Buffer size copied from upstream. There's no hint about sizing. + static EP_OUT_BUFFER: ConstStaticCell<[u8; 1024]> = ConstStaticCell::new([0u8; 1024]); + let ep_out_buffer = EP_OUT_BUFFER.take(); + + let config = Config::default(); + + Driver::new(usb, ep_out_buffer, config) +}