diff --git a/Cargo.lock b/Cargo.lock index 9960b5dd5..a0134424a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,27 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "as-slice" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45403b49e3954a4b8428a0ac21a4b7afadccf92bfd96273f1a58cd4812496ae0" +dependencies = [ + "generic-array 0.12.4", + "generic-array 0.13.3", + "generic-array 0.14.7", + "stable_deref_trait", +] + +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "ascii-canvas" version = "3.0.0" @@ -44,6 +65,18 @@ dependencies = [ "critical-section", ] +[[package]] +name = "atomic-pool" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c5fc22e05ec2884db458bf307dc7b278c9428888d2b6e6fad9c0ae7804f5f6" +dependencies = [ + "as-slice 0.1.5", + "as-slice 0.2.1", + "atomic-polyfill 1.0.3", + "stable_deref_trait", +] + [[package]] name = "atty" version = "0.2.14" @@ -151,7 +184,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -356,12 +389,13 @@ checksum = "7cc888e15f6be910b58fda4f056f673f58fb9348ea45da014283a14e6d2b58ec" [[package]] name = "coap-message-demos" version = "0.3.0" -source = "git+https://gitlab.com/chrysn/coap-message-demos/#eb1b6ce4c72269b68e6be8ca758d3379d1e59258" +source = "git+https://gitlab.com/chrysn/coap-message-demos/#9a42ab5353bb27a69bdab446b0cf183a74b11ead" dependencies = [ "coap-handler", "coap-handler-implementations 0.4.2", "coap-message", "coap-numbers", + "coap-request", "heapless 0.7.16", "serde", ] @@ -372,6 +406,15 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e766be4563107bc11c281c017ab922c3f3079345c9aa0fe747b4f9abc13411ac" +[[package]] +name = "coap-request" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32bc3e68c615d724b3b397ac2408b4dea533da85ada6b0fb4149034e5d5aae9d" +dependencies = [ + "coap-message", +] + [[package]] name = "codespan-reporting" version = "0.11.1" @@ -483,7 +526,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array", + "generic-array 0.14.7", "typenum", ] @@ -611,7 +654,7 @@ dependencies = [ [[package]] name = "embassy-embedded-hal" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy#7e5deae58943e886d3879b29f752e4ebdee71195" +source = "git+https://github.com/embassy-rs/embassy#006260feddf4d362a99260a38d86dffddab39d2e" dependencies = [ "embassy-futures", "embassy-sync 0.4.0", @@ -626,10 +669,9 @@ dependencies = [ [[package]] name = "embassy-executor" -version = "0.3.2" -source = "git+https://github.com/embassy-rs/embassy#7e5deae58943e886d3879b29f752e4ebdee71195" +version = "0.3.3" +source = "git+https://github.com/embassy-rs/embassy#006260feddf4d362a99260a38d86dffddab39d2e" dependencies = [ - "atomic-polyfill 1.0.3", "cortex-m", "critical-section", "embassy-macros", @@ -639,7 +681,7 @@ dependencies = [ [[package]] name = "embassy-futures" version = "0.1.1" -source = "git+https://github.com/embassy-rs/embassy#7e5deae58943e886d3879b29f752e4ebdee71195" +source = "git+https://github.com/embassy-rs/embassy#006260feddf4d362a99260a38d86dffddab39d2e" [[package]] name = "embassy-gpio" @@ -655,7 +697,7 @@ dependencies = [ [[package]] name = "embassy-hal-internal" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy#7e5deae58943e886d3879b29f752e4ebdee71195" +source = "git+https://github.com/embassy-rs/embassy#006260feddf4d362a99260a38d86dffddab39d2e" dependencies = [ "cortex-m", "critical-section", @@ -665,7 +707,7 @@ dependencies = [ [[package]] name = "embassy-macros" version = "0.2.1" -source = "git+https://github.com/embassy-rs/embassy#7e5deae58943e886d3879b29f752e4ebdee71195" +source = "git+https://github.com/embassy-rs/embassy#006260feddf4d362a99260a38d86dffddab39d2e" dependencies = [ "darling", "proc-macro2", @@ -673,10 +715,54 @@ dependencies = [ "syn 2.0.39", ] +[[package]] +name = "embassy-net" +version = "0.1.0" +dependencies = [ + "embassy-executor", + "embassy-sync 0.3.0", + "embassy-time", + "riot-rs", + "riot-rs-boards", +] + +[[package]] +name = "embassy-net" +version = "0.2.1" +source = "git+https://github.com/embassy-rs/embassy#006260feddf4d362a99260a38d86dffddab39d2e" +dependencies = [ + "as-slice 0.2.1", + "atomic-pool", + "embassy-net-driver", + "embassy-sync 0.4.0", + "embassy-time", + "futures", + "generic-array 0.14.7", + "heapless 0.8.0", + "managed", + "smoltcp", + "stable_deref_trait", +] + +[[package]] +name = "embassy-net-driver" +version = "0.2.0" +source = "git+https://github.com/embassy-rs/embassy#006260feddf4d362a99260a38d86dffddab39d2e" + +[[package]] +name = "embassy-net-driver-channel" +version = "0.2.0" +source = "git+https://github.com/embassy-rs/embassy#006260feddf4d362a99260a38d86dffddab39d2e" +dependencies = [ + "embassy-futures", + "embassy-net-driver", + "embassy-sync 0.4.0", +] + [[package]] name = "embassy-nrf" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy#7e5deae58943e886d3879b29f752e4ebdee71195" +source = "git+https://github.com/embassy-rs/embassy#006260feddf4d362a99260a38d86dffddab39d2e" dependencies = [ "cfg-if", "cortex-m", @@ -686,9 +772,14 @@ dependencies = [ "embassy-hal-internal", "embassy-sync 0.4.0", "embassy-time", + "embassy-usb-driver", "embedded-hal 0.2.7", + "embedded-hal 1.0.0-rc.1", + "embedded-hal-async", "embedded-io 0.6.1", + "embedded-io-async", "embedded-storage", + "embedded-storage-async", "fixed", "nrf52805-pac", "nrf52810-pac", @@ -706,7 +797,7 @@ dependencies = [ [[package]] name = "embassy-rp" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy#7e5deae58943e886d3879b29f752e4ebdee71195" +source = "git+https://github.com/embassy-rs/embassy#006260feddf4d362a99260a38d86dffddab39d2e" dependencies = [ "atomic-polyfill 1.0.3", "cfg-if", @@ -751,7 +842,7 @@ dependencies = [ [[package]] name = "embassy-sync" version = "0.4.0" -source = "git+https://github.com/embassy-rs/embassy#7e5deae58943e886d3879b29f752e4ebdee71195" +source = "git+https://github.com/embassy-rs/embassy#006260feddf4d362a99260a38d86dffddab39d2e" dependencies = [ "cfg-if", "critical-section", @@ -762,7 +853,7 @@ dependencies = [ [[package]] name = "embassy-time" version = "0.1.5" -source = "git+https://github.com/embassy-rs/embassy#7e5deae58943e886d3879b29f752e4ebdee71195" +source = "git+https://github.com/embassy-rs/embassy#006260feddf4d362a99260a38d86dffddab39d2e" dependencies = [ "cfg-if", "critical-section", @@ -773,10 +864,22 @@ dependencies = [ "heapless 0.8.0", ] +[[package]] +name = "embassy-usb" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy#006260feddf4d362a99260a38d86dffddab39d2e" +dependencies = [ + "embassy-futures", + "embassy-net-driver-channel", + "embassy-sync 0.4.0", + "embassy-usb-driver", + "heapless 0.8.0", +] + [[package]] name = "embassy-usb-driver" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy#7e5deae58943e886d3879b29f752e4ebdee71195" +source = "git+https://github.com/embassy-rs/embassy#006260feddf4d362a99260a38d86dffddab39d2e" [[package]] name = "embedded-dma" @@ -874,9 +977,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c18ee0ed65a5f1f81cac6b1d213b69c35fa47d4252ad41f1486dbd8226fe36e" +checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" dependencies = [ "libc", "windows-sys", @@ -1000,6 +1103,24 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" +[[package]] +name = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f797e67af32588215eaaab8327027ee8e71b9dd0b2b26996aedf20c030fce309" +dependencies = [ + "typenum", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1319,6 +1440,12 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "managed" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d" + [[package]] name = "memchr" version = "2.6.4" @@ -1739,6 +1866,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "portable-atomic" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bccab0e7fd7cc19f820a1c8c91720af652d0c88dc9664dd72aef2614f04af3b" +dependencies = [ + "critical-section", +] + [[package]] name = "precomputed-hash" version = "0.1.1" @@ -1975,13 +2111,17 @@ version = "0.1.0" dependencies = [ "critical-section", "embassy-executor", + "embassy-net 0.2.1", "embassy-nrf", "embassy-rp", "embassy-sync 0.3.0", "embassy-time", + "embassy-usb", + "heapless 0.8.0", "linkme", "riot-rs-core", "riot-rs-rt", + "static_cell", ] [[package]] @@ -2000,6 +2140,7 @@ dependencies = [ "cortex-m-rt", "cortex-m-semihosting", "linkme", + "portable-atomic", "riot-rs-boards", "riot-rs-threads", "rtt-target", @@ -2171,9 +2312,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.22" +version = "0.38.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80109a168d9bc0c7f483083244543a6eb0dba02295d33ca268145e6190d6df0c" +checksum = "9ad981d6c340a49cdc40a1028d9c6084ec7e9fa33fcb839cab656a267071e234" dependencies = [ "bitflags 2.4.1", "errno", @@ -2295,6 +2436,18 @@ version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +[[package]] +name = "smoltcp" +version = "0.10.0" +source = "git+https://github.com/smoltcp-rs/smoltcp.git?rev=b57e2f9e70e82a13f31d5ea17e55232c11cc2b2d#b57e2f9e70e82a13f31d5ea17e55232c11cc2b2d" +dependencies = [ + "bitflags 1.3.2", + "byteorder", + "cfg-if", + "heapless 0.8.0", + "managed", +] + [[package]] name = "spin" version = "0.9.8" @@ -2310,6 +2463,15 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_cell" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa6ba4cf83bf80d3eb25f098ea5e790a0a1fcb5e357442259b231e412c2d3ca0" +dependencies = [ + "portable-atomic", +] + [[package]] name = "stm32f4" version = "0.14.0" diff --git a/Cargo.toml b/Cargo.toml index cf99463bd..aee568937 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,10 +31,12 @@ cortex-m-semihosting = { version = "0.5" } critical-section = { version = "1.1.2" } embassy-executor = { version = "0.3.2", default-features = false } +embassy-net = { version = "0.2.1", default-features = false } embassy-nrf = { version = "0.1.0", default-features = false } embassy-rp = { version = "0.1.0", default-features = false } embassy-sync = { version = "0.3.0", default-features = false } embassy-time = { version = "0.1.5", default-features = false } +embassy-usb = { version = "0.1.0", default-features = false } linkme = { version = "0.3.17", features = ["used_linker"] } @@ -46,6 +48,7 @@ riot-wrappers = { version = "^0.8", default-features = false, features = [ "with_riot_rs", ] } +static_cell = { version = "2.0.0", features = [ "nightly" ] } ld-memory = { version = "0.2.9" } [profile.dev] @@ -78,7 +81,9 @@ nrf52840-pac = { git = "https://github.com/kaspar030/nrf-pacs", branch = "riot-r nrf52832-pac = { git = "https://github.com/kaspar030/nrf-pacs", branch = "riot-rs" } embassy-macros = { git = "https://github.com/embassy-rs/embassy"} embassy-executor = { git = "https://github.com/embassy-rs/embassy"} +embassy-net = { git = "https://github.com/embassy-rs/embassy"} embassy-nrf = { git = "https://github.com/embassy-rs/embassy"} embassy-rp = { git = "https://github.com/embassy-rs/embassy"} embassy-time = { git = "https://github.com/embassy-rs/embassy"} embassy-sync = { git = "https://github.com/embassy-rs/embassy"} +embassy-usb = { git = "https://github.com/embassy-rs/embassy"} diff --git a/examples/embassy-net/Cargo.toml b/examples/embassy-net/Cargo.toml new file mode 100644 index 000000000..5906ebf4b --- /dev/null +++ b/examples/embassy-net/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "embassy-net" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +publish = false + +[dependencies] +riot-rs = { path = "../../src/riot-rs", features = [ "time", "usb_ethernet"] } +riot-rs-boards = { path = "../../src/riot-rs-boards" } +embassy-executor = { workspace = true, default-features = false } +embassy-time = { workspace = true, default-features = false } +embassy-sync = { workspace = true, default-features = false } diff --git a/examples/embassy-net/README.md b/examples/embassy-net/README.md new file mode 100644 index 000000000..3b52a8c9a --- /dev/null +++ b/examples/embassy-net/README.md @@ -0,0 +1,15 @@ +# embassy-net + +## About + +This application is testing basic +[embassy](https://github.com/embassy-rs/embassy) _networking_ usage with RIOT-rs. + +## How to run + +In this folder, run + + laze build -b nrf52840dk run + +With the device USB cable connected, a USB ethernet device should pop up. +RIOT-rs will reply to ping requests on 10.0.42.61. diff --git a/examples/embassy-net/laze.yml b/examples/embassy-net/laze.yml new file mode 100644 index 000000000..88f90e2bd --- /dev/null +++ b/examples/embassy-net/laze.yml @@ -0,0 +1,4 @@ +apps: + - name: embassy-net + selects: + - ?release diff --git a/examples/embassy-net/src/main.rs b/examples/embassy-net/src/main.rs new file mode 100644 index 000000000..67a6d990e --- /dev/null +++ b/examples/embassy-net/src/main.rs @@ -0,0 +1,48 @@ +#![no_main] +#![no_std] +#![feature(type_alias_impl_trait)] + +use riot_rs as _; + +use riot_rs::rt::debug::println; + +use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, signal::Signal}; +use riot_rs::embassy::{blocker, EXECUTOR}; + +static SIGNAL: Signal = Signal::new(); + +#[embassy_executor::task] +async fn async_task() { + use embassy_time::{Duration, Timer, TICK_HZ}; + let mut counter = 0u32; + loop { + if counter % 2 == 0 { + println!("async_task() signalling"); + SIGNAL.signal(counter); + } else { + println!("async_task()"); + } + Timer::after(Duration::from_ticks(TICK_HZ / 10)).await; + counter += 1; + } +} + +#[no_mangle] +fn riot_main() { + println!( + "Hello from riot_main()! Running on a {} board.", + riot_rs::buildinfo::BOARD + ); + + let spawner = EXECUTOR.spawner(); + spawner.spawn(async_task()).unwrap(); + + loop { + let val = blocker::block_on(SIGNAL.wait()); + println!( + "now={}ms threadtest() val={}", + Instant::now().as_millis(), + val + ); + } +} diff --git a/examples/laze.yml b/examples/laze.yml index 24e094a22..a730814cd 100644 --- a/examples/laze.yml +++ b/examples/laze.yml @@ -8,6 +8,7 @@ subdirs: - bottles - core-sizes - embassy + - embassy-net # - embassy-gpio - hello-world - minimal diff --git a/src/riot-rs-embassy/Cargo.toml b/src/riot-rs-embassy/Cargo.toml index 1137ca491..ed9022393 100644 --- a/src/riot-rs-embassy/Cargo.toml +++ b/src/riot-rs-embassy/Cargo.toml @@ -6,10 +6,11 @@ edition = "2021" [dependencies] # always linkme.workspace = true +static_cell.workspace = true +critical-section.workspace = true embassy-sync = { workspace = true } riot-rs-core = { path = "../riot-rs-core" } riot-rs-rt = { path = "../riot-rs-rt" } -critical-section.workspace = true # time embassy-time = { workspace = true, optional = true, features = [ @@ -17,6 +18,10 @@ embassy-time = { workspace = true, optional = true, features = [ "unstable-traits", ] } +embassy-usb = { workspace = true, optional = true } +embassy-net = { workspace = true, optional = true, features = [ "dhcpv4", "medium-ethernet" ] } +heapless = "0.8.0" + [target.'cfg(context = "cortex-m")'.dependencies] embassy-executor = { workspace = true, features = [ "arch-cortex-m", @@ -26,6 +31,7 @@ embassy-executor = { workspace = true, features = [ [target.'cfg(context = "nrf52")'.dependencies] embassy-nrf = { workspace = true, features = [ + "nightly", "time-driver-rtc1", "time", "unstable-pac", @@ -53,3 +59,6 @@ embassy-rp = { workspace = true, features = [ [features] time = ["dep:embassy-time", "embassy-executor/integrated-timers"] +usb = [ "dep:embassy-usb" ] +net = [ "dep:embassy-net" ] +usb_ethernet = [ "usb", "net" ] diff --git a/src/riot-rs-embassy/src/lib.rs b/src/riot-rs-embassy/src/lib.rs index 29d2414af..0ee6a0dd6 100644 --- a/src/riot-rs-embassy/src/lib.rs +++ b/src/riot-rs-embassy/src/lib.rs @@ -2,59 +2,263 @@ #![feature(type_alias_impl_trait)] #![feature(used_with_arg)] -use embassy_executor::InterruptExecutor; +use embassy_executor::{InterruptExecutor, Spawner}; +use static_cell::make_static; -pub static EXECUTOR: InterruptExecutor = InterruptExecutor::new(); +#[cfg(feature = "usb")] +use embassy_usb::{Builder, UsbDevice}; pub mod blocker; +pub static EXECUTOR: InterruptExecutor = InterruptExecutor::new(); + #[cfg(context = "nrf52")] -use embassy_nrf as embassy_arch; -#[cfg(context = "nrf52")] -use embassy_nrf::interrupt::SWI0_EGU0 as SWI; +mod nrf52 { + pub use embassy_nrf::interrupt; + pub use embassy_nrf::interrupt::SWI0_EGU0 as SWI; + pub use embassy_nrf::{init, Peripherals}; + + #[cfg(feature = "usb")] + use embassy_nrf::{bind_interrupts, peripherals, rng, usb as nrf_usb}; + + #[cfg(feature = "usb")] + bind_interrupts!(struct Irqs { + USBD => nrf_usb::InterruptHandler; + POWER_CLOCK => nrf_usb::vbus_detect::InterruptHandler; + RNG => rng::InterruptHandler; + }); + + #[interrupt] + unsafe fn SWI0_EGU0() { + crate::EXECUTOR.on_interrupt() + } + + #[cfg(feature = "usb")] + pub mod usb { + use embassy_nrf::peripherals; + use embassy_nrf::usb::{vbus_detect::HardwareVbusDetect, Driver}; + pub type UsbDriver = Driver<'static, peripherals::USBD, HardwareVbusDetect>; + pub fn driver(usbd: peripherals::USBD) -> UsbDriver { + use super::Irqs; + Driver::new(usbd, Irqs, HardwareVbusDetect::new(Irqs)) + } + } +} #[cfg(context = "rp2040")] -use embassy_rp as embassy_arch; -#[cfg(context = "rp2040")] -use embassy_rp::interrupt::SWI_IRQ_1 as SWI; +mod rp2040 { + pub use embassy_rp::interrupt; + pub use embassy_rp::interrupt::SWI_IRQ_1 as SWI; + pub use embassy_rp::{init, Peripherals}; -use embassy_arch::interrupt; + #[cfg(feature = "usb")] + use embassy_rp::{ + bind_interrupts, peripherals, + peripherals::USB, + usb::{Driver, InterruptHandler}, + }; -#[cfg(context = "nrf52")] -#[interrupt] -unsafe fn SWI0_EGU0() { - EXECUTOR.on_interrupt() + // rp2040 usb start + #[cfg(feature = "usb")] + bind_interrupts!(struct Irqs { + USBCTRL_IRQ => InterruptHandler; + }); + + #[interrupt] + unsafe fn SWI_IRQ_1() { + crate::EXECUTOR.on_interrupt() + } + + #[cfg(feature = "usb")] + pub mod usb { + use embassy_rp::peripherals; + use embassy_rp::usb::Driver; + pub type UsbDriver = Driver<'static, peripherals::USB>; + pub fn driver(usb: peripherals::USB) -> UsbDriver { + Driver::new(usb, super::Irqs) + } + } } +#[cfg(context = "nrf52")] +use nrf52 as arch; + #[cfg(context = "rp2040")] -#[interrupt] -unsafe fn SWI_IRQ_1() { - EXECUTOR.on_interrupt() +use rp2040 as arch; + +use arch::SWI; + +// +// usb common start +#[cfg(feature = "usb")] +use arch::usb::UsbDriver; + +#[cfg(feature = "usb")] +#[embassy_executor::task] +async fn usb_task(mut device: UsbDevice<'static, UsbDriver>) -> ! { + device.run().await +} +// usb common end +// + +#[cfg(feature = "net")] +// +// usb net begin +#[cfg(feature = "net")] +const MTU: usize = 1514; + +#[cfg(feature = "net")] +use embassy_net::{Stack, StackResources}; + +#[cfg(feature = "usb_ethernet")] +use embassy_usb::class::cdc_ncm::embassy_net::{Device, Runner}; + +#[cfg(feature = "usb_ethernet")] +#[embassy_executor::task] +async fn usb_ncm_task(class: Runner<'static, UsbDriver, MTU>) -> ! { + class.run().await +} + +#[cfg(feature = "usb_ethernet")] +#[embassy_executor::task] +async fn net_task(stack: &'static Stack>) -> ! { + stack.run().await } +// usb net end +// -// #[cfg(context = "rp2040")] -// #[embassy_executor::task] -// async fn embassy_init(p: Peripherals) { -// use embassy_rp::uart::{Config, UartTx}; -// use embassy_time::{Duration, Timer}; -// let mut uart_tx = UartTx::new(p.UART0, p.PIN_0, p.DMA_CH0, Config::default()); +#[cfg(feature = "usb")] +const fn usb_default_config() -> embassy_usb::Config<'static> { + // Create embassy-usb Config + let mut config = embassy_usb::Config::new(0xc0de, 0xcafe); + config.manufacturer = Some("Embassy"); + config.product = Some("USB-Ethernet example"); + config.serial_number = Some("12345678"); + config.max_power = 100; + config.max_packet_size_0 = 64; -// loop { -// let data = b"hello\n"; -// uart_tx.write(&data[..]).await.unwrap(); -// Timer::after(Duration::from_secs(1)).await; -// } -// } + // Required for Windows support. + config.composite_with_iads = true; + config.device_class = 0xEF; + config.device_sub_class = 0x02; + config.device_protocol = 0x01; + config +} pub(crate) fn init() { riot_rs_rt::debug::println!("riot-rs-embassy::init()"); - let _p = embassy_arch::init(Default::default()); - + let p = arch::init(Default::default()); EXECUTOR.start(SWI); - // #[cfg(context = "rp2040")] - // { - // EXECUTOR.spawner().spawn(embassy_init(_p)).unwrap(); - // } + + EXECUTOR.spawner().spawn(init_task(p)).unwrap(); + riot_rs_rt::debug::println!("riot-rs-embassy::init() done"); +} + +#[embassy_executor::task] +async fn init_task(peripherals: arch::Peripherals) { + riot_rs_rt::debug::println!("riot-rs-embassy::init_task()"); + #[cfg(all(context = "nrf52", feature = "usb"))] + { + // nrf52840 + let clock: embassy_nrf::pac::CLOCK = unsafe { core::mem::transmute(()) }; + + riot_rs_rt::debug::println!("nrf: enabling ext hfosc..."); + clock.tasks_hfclkstart.write(|w| unsafe { w.bits(1) }); + while clock.events_hfclkstarted.read().bits() != 1 {} + } + + #[cfg(feature = "usb")] + let mut usb_builder = { + let usb_config = usb_default_config(); + + #[cfg(context = "nrf52")] + let usb_driver = nrf52::usb::driver(peripherals.USBD); + + #[cfg(context = "rp2040")] + let usb_driver = rp2040::usb::driver(peripherals.USB); + + // Create embassy-usb DeviceBuilder using the driver and config. + let builder = Builder::new( + usb_driver, + usb_config, + &mut make_static!([0; 256])[..], + &mut make_static!([0; 256])[..], + &mut make_static!([0; 256])[..], + &mut make_static!([0; 128])[..], + &mut make_static!([0; 128])[..], + ); + + builder + }; + + // Our MAC addr. + #[cfg(feature = "usb_ethernet")] + let our_mac_addr = [0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC]; + + #[cfg(feature = "usb_ethernet")] + let usb_cdc_ecm = { + // Host's MAC addr. This is the MAC the host "thinks" its USB-to-ethernet adapter has. + let host_mac_addr = [0x88, 0x88, 0x88, 0x88, 0x88, 0x88]; + + use embassy_usb::class::cdc_ncm::{CdcNcmClass, State}; + + // Create classes on the builder. + CdcNcmClass::new( + &mut usb_builder, + make_static!(State::new()), + host_mac_addr, + 64, + ) + }; + + let spawner = Spawner::for_current_executor().await; + + #[cfg(feature = "usb")] + let usb = { usb_builder.build() }; + #[cfg(feature = "usb")] + spawner.spawn(usb_task(usb)).unwrap(); + + #[cfg(feature = "usb_ethernet")] + let device = { + use embassy_usb::class::cdc_ncm::embassy_net::State as NetState; + let (runner, device) = usb_cdc_ecm + .into_embassy_net_device::(make_static!(NetState::new()), our_mac_addr); + + spawner.spawn(usb_ncm_task(runner)).unwrap(); + + device + }; + + #[cfg(feature = "usb_ethernet")] + { + // network stack + //let config = embassy_net::Config::dhcpv4(Default::default()); + use embassy_net::{Ipv4Address, Ipv4Cidr}; + let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { + address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), + dns_servers: heapless::Vec::new(), + gateway: Some(Ipv4Address::new(10, 42, 0, 1)), + }); + + // Generate random seed + // let mut rng = Rng::new(p.RNG, Irqs); + // let mut seed = [0; 8]; + // rng.blocking_fill_bytes(&mut seed); + // let seed = u64::from_le_bytes(seed); + let seed = 1234u64; + + // Init network stack + let stack = &*make_static!(Stack::new( + device, + config, + make_static!(StackResources::<2>::new()), + seed + )); + + spawner.spawn(net_task(stack)).unwrap(); + } + + riot_rs_rt::debug::println!("riot-rs-embassy::init_task() done"); } use linkme::distributed_slice; diff --git a/src/riot-rs-rt/Cargo.toml b/src/riot-rs-rt/Cargo.toml index a8e0010ab..84488702c 100644 --- a/src/riot-rs-rt/Cargo.toml +++ b/src/riot-rs-rt/Cargo.toml @@ -8,16 +8,17 @@ edition = "2021" cfg-if = "1.0.0" [target.'cfg(context = "cortex-m")'.dependencies] -cortex-m = { workspace = true, features = ["critical-section-single-core" ] } +cortex-m = { workspace = true, features = ["critical-section-single-core"] } cortex-m-rt = { workspace = true } cortex-m-semihosting = { workspace = true, optional = true } +portable-atomic = { version = "1.5.1", features = ["critical-section"] } riot-rs-threads = { path = "../riot-rs-threads", optional = true } rtt-target = { version = "0.4.0", optional = true } linkme.workspace = true [features] -default = [ "threading" ] -threading = [ "dep:riot-rs-threads" ] +default = ["threading"] +threading = ["dep:riot-rs-threads"] debug-console = [] silent-panic = [] diff --git a/src/riot-rs-rt/src/lib.rs b/src/riot-rs-rt/src/lib.rs index 1cb6d5e30..c65d7bdbc 100644 --- a/src/riot-rs-rt/src/lib.rs +++ b/src/riot-rs-rt/src/lib.rs @@ -42,7 +42,7 @@ pub use arch::benchmark; #[link_section = ".isr_stack"] #[used(linker)] -static ISR_STACK: [u8; 1024] = [0u8; 1024]; +static ISR_STACK: [u8; 8 * 1024] = [0u8; 8 * 1024]; #[panic_handler] fn panic(_info: &PanicInfo) -> ! { diff --git a/src/riot-rs/Cargo.toml b/src/riot-rs/Cargo.toml index 78b9f0876..c96421ad1 100644 --- a/src/riot-rs/Cargo.toml +++ b/src/riot-rs/Cargo.toml @@ -18,3 +18,6 @@ debug-console = [ "riot-rs-rt/debug-console" ] silent-panic = [ "riot-rs-rt/silent-panic" ] thread_info = [ "riot-rs-core/thread_info" ] time = [ "riot-rs-embassy/time" ] +usb = [ "riot-rs-embassy/usb" ] +net = [ "riot-rs-embassy/net" ] +usb_ethernet = [ "riot-rs-embassy/usb_ethernet" ]