diff options
| author | xoviat <[email protected]> | 2023-06-19 15:52:33 -0500 |
|---|---|---|
| committer | xoviat <[email protected]> | 2023-06-19 15:52:33 -0500 |
| commit | aaad9068156305e5f6f41ee4013e025083bd0668 (patch) | |
| tree | 67a08c8a512e8791433891a3b6deec813fc4c578 /examples/rp | |
| parent | 35083b262b364387713f4273649b62180123182c (diff) | |
| parent | 3c70f799a28f5f28d84fa8ee8b4b232f5e9aad82 (diff) | |
Merge branch 'main' of https://github.com/embassy-rs/embassy into can
Diffstat (limited to 'examples/rp')
| -rw-r--r-- | examples/rp/Cargo.toml | 4 | ||||
| -rw-r--r-- | examples/rp/src/bin/button.rs | 5 | ||||
| -rw-r--r-- | examples/rp/src/bin/ethernet_w5500_multisocket.rs | 23 | ||||
| -rw-r--r-- | examples/rp/src/bin/ethernet_w5500_tcp_client.rs | 23 | ||||
| -rw-r--r-- | examples/rp/src/bin/ethernet_w5500_tcp_server.rs | 24 | ||||
| -rw-r--r-- | examples/rp/src/bin/ethernet_w5500_udp.rs | 24 | ||||
| -rw-r--r-- | examples/rp/src/bin/lora_p2p_send_multicore.rs | 2 | ||||
| -rw-r--r-- | examples/rp/src/bin/multicore.rs | 2 | ||||
| -rw-r--r-- | examples/rp/src/bin/multiprio.rs | 18 | ||||
| -rw-r--r-- | examples/rp/src/bin/uart_buffered_split.rs | 15 | ||||
| -rw-r--r-- | examples/rp/src/bin/usb_ethernet.rs | 34 | ||||
| -rw-r--r-- | examples/rp/src/bin/wifi_ap_tcp_server.rs | 18 | ||||
| -rw-r--r-- | examples/rp/src/bin/wifi_blinky.rs | 59 | ||||
| -rw-r--r-- | examples/rp/src/bin/wifi_scan.rs | 12 | ||||
| -rw-r--r-- | examples/rp/src/bin/wifi_tcp_server.rs | 20 |
15 files changed, 132 insertions, 151 deletions
diff --git a/examples/rp/Cargo.toml b/examples/rp/Cargo.toml index 58b701915..48f3a26bb 100644 --- a/examples/rp/Cargo.toml +++ b/examples/rp/Cargo.toml | |||
| @@ -8,7 +8,7 @@ license = "MIT OR Apache-2.0" | |||
| 8 | [dependencies] | 8 | [dependencies] |
| 9 | embassy-embedded-hal = { version = "0.1.0", path = "../../embassy-embedded-hal", features = ["defmt"] } | 9 | embassy-embedded-hal = { version = "0.1.0", path = "../../embassy-embedded-hal", features = ["defmt"] } |
| 10 | embassy-sync = { version = "0.2.0", path = "../../embassy-sync", features = ["defmt"] } | 10 | embassy-sync = { version = "0.2.0", path = "../../embassy-sync", features = ["defmt"] } |
| 11 | embassy-executor = { version = "0.2.0", path = "../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "executor-interrupt", "defmt", "integrated-timers"] } | 11 | embassy-executor = { version = "0.2.0", path = "../../embassy-executor", features = ["nightly", "arch-cortex-m", "executor-thread", "executor-interrupt", "defmt", "integrated-timers"] } |
| 12 | embassy-time = { version = "0.1.0", path = "../../embassy-time", features = ["nightly", "unstable-traits", "defmt", "defmt-timestamp-uptime"] } | 12 | embassy-time = { version = "0.1.0", path = "../../embassy-time", features = ["nightly", "unstable-traits", "defmt", "defmt-timestamp-uptime"] } |
| 13 | embassy-rp = { version = "0.1.0", path = "../../embassy-rp", features = ["defmt", "unstable-traits", "nightly", "unstable-pac", "time-driver", "critical-section-impl"] } | 13 | embassy-rp = { version = "0.1.0", path = "../../embassy-rp", features = ["defmt", "unstable-traits", "nightly", "unstable-pac", "time-driver", "critical-section-impl"] } |
| 14 | embassy-usb = { version = "0.1.0", path = "../../embassy-usb", features = ["defmt"] } | 14 | embassy-usb = { version = "0.1.0", path = "../../embassy-usb", features = ["defmt"] } |
| @@ -45,7 +45,7 @@ embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.10" } | |||
| 45 | embedded-hal-async = "0.2.0-alpha.1" | 45 | embedded-hal-async = "0.2.0-alpha.1" |
| 46 | embedded-io = { version = "0.4.0", features = ["async", "defmt"] } | 46 | embedded-io = { version = "0.4.0", features = ["async", "defmt"] } |
| 47 | embedded-storage = { version = "0.3" } | 47 | embedded-storage = { version = "0.3" } |
| 48 | static_cell = "1.0.0" | 48 | static_cell = { version = "1.1", features = ["nightly"]} |
| 49 | log = "0.4" | 49 | log = "0.4" |
| 50 | pio-proc = "0.2" | 50 | pio-proc = "0.2" |
| 51 | pio = "0.2.1" | 51 | pio = "0.2.1" |
diff --git a/examples/rp/src/bin/button.rs b/examples/rp/src/bin/button.rs index c5422c616..0d246c093 100644 --- a/examples/rp/src/bin/button.rs +++ b/examples/rp/src/bin/button.rs | |||
| @@ -9,9 +9,12 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 9 | #[embassy_executor::main] | 9 | #[embassy_executor::main] |
| 10 | async fn main(_spawner: Spawner) { | 10 | async fn main(_spawner: Spawner) { |
| 11 | let p = embassy_rp::init(Default::default()); | 11 | let p = embassy_rp::init(Default::default()); |
| 12 | let button = Input::new(p.PIN_28, Pull::Up); | ||
| 13 | let mut led = Output::new(p.PIN_25, Level::Low); | 12 | let mut led = Output::new(p.PIN_25, Level::Low); |
| 14 | 13 | ||
| 14 | // Use PIN_28, Pin34 on J0 for RP Pico, as a input. | ||
| 15 | // You need to add your own button. | ||
| 16 | let button = Input::new(p.PIN_28, Pull::Up); | ||
| 17 | |||
| 15 | loop { | 18 | loop { |
| 16 | if button.is_high() { | 19 | if button.is_high() { |
| 17 | led.set_high(); | 20 | led.set_high(); |
diff --git a/examples/rp/src/bin/ethernet_w5500_multisocket.rs b/examples/rp/src/bin/ethernet_w5500_multisocket.rs index c8e6d46a6..82568254a 100644 --- a/examples/rp/src/bin/ethernet_w5500_multisocket.rs +++ b/examples/rp/src/bin/ethernet_w5500_multisocket.rs | |||
| @@ -19,18 +19,9 @@ use embassy_time::Duration; | |||
| 19 | use embedded_hal_async::spi::ExclusiveDevice; | 19 | use embedded_hal_async::spi::ExclusiveDevice; |
| 20 | use embedded_io::asynch::Write; | 20 | use embedded_io::asynch::Write; |
| 21 | use rand::RngCore; | 21 | use rand::RngCore; |
| 22 | use static_cell::StaticCell; | 22 | use static_cell::make_static; |
| 23 | use {defmt_rtt as _, panic_probe as _}; | 23 | use {defmt_rtt as _, panic_probe as _}; |
| 24 | 24 | ||
| 25 | macro_rules! singleton { | ||
| 26 | ($val:expr) => {{ | ||
| 27 | type T = impl Sized; | ||
| 28 | static STATIC_CELL: StaticCell<T> = StaticCell::new(); | ||
| 29 | let (x,) = STATIC_CELL.init(($val,)); | ||
| 30 | x | ||
| 31 | }}; | ||
| 32 | } | ||
| 33 | |||
| 34 | #[embassy_executor::task] | 25 | #[embassy_executor::task] |
| 35 | async fn ethernet_task( | 26 | async fn ethernet_task( |
| 36 | runner: Runner< | 27 | runner: Runner< |
| @@ -62,7 +53,7 @@ async fn main(spawner: Spawner) { | |||
| 62 | let w5500_reset = Output::new(p.PIN_20, Level::High); | 53 | let w5500_reset = Output::new(p.PIN_20, Level::High); |
| 63 | 54 | ||
| 64 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; | 55 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; |
| 65 | let state = singleton!(State::<8, 8>::new()); | 56 | let state = make_static!(State::<8, 8>::new()); |
| 66 | let (device, runner) = | 57 | let (device, runner) = |
| 67 | embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await; | 58 | embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await; |
| 68 | unwrap!(spawner.spawn(ethernet_task(runner))); | 59 | unwrap!(spawner.spawn(ethernet_task(runner))); |
| @@ -71,10 +62,10 @@ async fn main(spawner: Spawner) { | |||
| 71 | let seed = rng.next_u64(); | 62 | let seed = rng.next_u64(); |
| 72 | 63 | ||
| 73 | // Init network stack | 64 | // Init network stack |
| 74 | let stack = &*singleton!(Stack::new( | 65 | let stack = &*make_static!(Stack::new( |
| 75 | device, | 66 | device, |
| 76 | embassy_net::Config::Dhcp(Default::default()), | 67 | embassy_net::Config::dhcpv4(Default::default()), |
| 77 | singleton!(StackResources::<3>::new()), | 68 | make_static!(StackResources::<3>::new()), |
| 78 | seed | 69 | seed |
| 79 | )); | 70 | )); |
| 80 | 71 | ||
| @@ -129,9 +120,9 @@ async fn listen_task(stack: &'static Stack<Device<'static>>, id: u8, port: u16) | |||
| 129 | } | 120 | } |
| 130 | } | 121 | } |
| 131 | 122 | ||
| 132 | async fn wait_for_config(stack: &'static Stack<Device<'static>>) -> embassy_net::StaticConfig { | 123 | async fn wait_for_config(stack: &'static Stack<Device<'static>>) -> embassy_net::StaticConfigV4 { |
| 133 | loop { | 124 | loop { |
| 134 | if let Some(config) = stack.config() { | 125 | if let Some(config) = stack.config_v4() { |
| 135 | return config.clone(); | 126 | return config.clone(); |
| 136 | } | 127 | } |
| 137 | yield_now().await; | 128 | yield_now().await; |
diff --git a/examples/rp/src/bin/ethernet_w5500_tcp_client.rs b/examples/rp/src/bin/ethernet_w5500_tcp_client.rs index 9a7c3ad19..d562defad 100644 --- a/examples/rp/src/bin/ethernet_w5500_tcp_client.rs +++ b/examples/rp/src/bin/ethernet_w5500_tcp_client.rs | |||
| @@ -21,18 +21,9 @@ use embassy_time::{Duration, Timer}; | |||
| 21 | use embedded_hal_async::spi::ExclusiveDevice; | 21 | use embedded_hal_async::spi::ExclusiveDevice; |
| 22 | use embedded_io::asynch::Write; | 22 | use embedded_io::asynch::Write; |
| 23 | use rand::RngCore; | 23 | use rand::RngCore; |
| 24 | use static_cell::StaticCell; | 24 | use static_cell::make_static; |
| 25 | use {defmt_rtt as _, panic_probe as _}; | 25 | use {defmt_rtt as _, panic_probe as _}; |
| 26 | 26 | ||
| 27 | macro_rules! singleton { | ||
| 28 | ($val:expr) => {{ | ||
| 29 | type T = impl Sized; | ||
| 30 | static STATIC_CELL: StaticCell<T> = StaticCell::new(); | ||
| 31 | let (x,) = STATIC_CELL.init(($val,)); | ||
| 32 | x | ||
| 33 | }}; | ||
| 34 | } | ||
| 35 | |||
| 36 | #[embassy_executor::task] | 27 | #[embassy_executor::task] |
| 37 | async fn ethernet_task( | 28 | async fn ethernet_task( |
| 38 | runner: Runner< | 29 | runner: Runner< |
| @@ -65,7 +56,7 @@ async fn main(spawner: Spawner) { | |||
| 65 | let w5500_reset = Output::new(p.PIN_20, Level::High); | 56 | let w5500_reset = Output::new(p.PIN_20, Level::High); |
| 66 | 57 | ||
| 67 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; | 58 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; |
| 68 | let state = singleton!(State::<8, 8>::new()); | 59 | let state = make_static!(State::<8, 8>::new()); |
| 69 | let (device, runner) = | 60 | let (device, runner) = |
| 70 | embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await; | 61 | embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await; |
| 71 | unwrap!(spawner.spawn(ethernet_task(runner))); | 62 | unwrap!(spawner.spawn(ethernet_task(runner))); |
| @@ -74,10 +65,10 @@ async fn main(spawner: Spawner) { | |||
| 74 | let seed = rng.next_u64(); | 65 | let seed = rng.next_u64(); |
| 75 | 66 | ||
| 76 | // Init network stack | 67 | // Init network stack |
| 77 | let stack = &*singleton!(Stack::new( | 68 | let stack = &*make_static!(Stack::new( |
| 78 | device, | 69 | device, |
| 79 | embassy_net::Config::Dhcp(Default::default()), | 70 | embassy_net::Config::dhcpv4(Default::default()), |
| 80 | singleton!(StackResources::<2>::new()), | 71 | make_static!(StackResources::<2>::new()), |
| 81 | seed | 72 | seed |
| 82 | )); | 73 | )); |
| 83 | 74 | ||
| @@ -117,9 +108,9 @@ async fn main(spawner: Spawner) { | |||
| 117 | } | 108 | } |
| 118 | } | 109 | } |
| 119 | 110 | ||
| 120 | async fn wait_for_config(stack: &'static Stack<Device<'static>>) -> embassy_net::StaticConfig { | 111 | async fn wait_for_config(stack: &'static Stack<Device<'static>>) -> embassy_net::StaticConfigV4 { |
| 121 | loop { | 112 | loop { |
| 122 | if let Some(config) = stack.config() { | 113 | if let Some(config) = stack.config_v4() { |
| 123 | return config.clone(); | 114 | return config.clone(); |
| 124 | } | 115 | } |
| 125 | yield_now().await; | 116 | yield_now().await; |
diff --git a/examples/rp/src/bin/ethernet_w5500_tcp_server.rs b/examples/rp/src/bin/ethernet_w5500_tcp_server.rs index f02543246..7f521cdb4 100644 --- a/examples/rp/src/bin/ethernet_w5500_tcp_server.rs +++ b/examples/rp/src/bin/ethernet_w5500_tcp_server.rs | |||
| @@ -20,18 +20,8 @@ use embassy_time::Duration; | |||
| 20 | use embedded_hal_async::spi::ExclusiveDevice; | 20 | use embedded_hal_async::spi::ExclusiveDevice; |
| 21 | use embedded_io::asynch::Write; | 21 | use embedded_io::asynch::Write; |
| 22 | use rand::RngCore; | 22 | use rand::RngCore; |
| 23 | use static_cell::StaticCell; | 23 | use static_cell::make_static; |
| 24 | use {defmt_rtt as _, panic_probe as _}; | 24 | use {defmt_rtt as _, panic_probe as _}; |
| 25 | |||
| 26 | macro_rules! singleton { | ||
| 27 | ($val:expr) => {{ | ||
| 28 | type T = impl Sized; | ||
| 29 | static STATIC_CELL: StaticCell<T> = StaticCell::new(); | ||
| 30 | let (x,) = STATIC_CELL.init(($val,)); | ||
| 31 | x | ||
| 32 | }}; | ||
| 33 | } | ||
| 34 | |||
| 35 | #[embassy_executor::task] | 25 | #[embassy_executor::task] |
| 36 | async fn ethernet_task( | 26 | async fn ethernet_task( |
| 37 | runner: Runner< | 27 | runner: Runner< |
| @@ -64,7 +54,7 @@ async fn main(spawner: Spawner) { | |||
| 64 | let w5500_reset = Output::new(p.PIN_20, Level::High); | 54 | let w5500_reset = Output::new(p.PIN_20, Level::High); |
| 65 | 55 | ||
| 66 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; | 56 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; |
| 67 | let state = singleton!(State::<8, 8>::new()); | 57 | let state = make_static!(State::<8, 8>::new()); |
| 68 | let (device, runner) = | 58 | let (device, runner) = |
| 69 | embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await; | 59 | embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await; |
| 70 | unwrap!(spawner.spawn(ethernet_task(runner))); | 60 | unwrap!(spawner.spawn(ethernet_task(runner))); |
| @@ -73,10 +63,10 @@ async fn main(spawner: Spawner) { | |||
| 73 | let seed = rng.next_u64(); | 63 | let seed = rng.next_u64(); |
| 74 | 64 | ||
| 75 | // Init network stack | 65 | // Init network stack |
| 76 | let stack = &*singleton!(Stack::new( | 66 | let stack = &*make_static!(Stack::new( |
| 77 | device, | 67 | device, |
| 78 | embassy_net::Config::Dhcp(Default::default()), | 68 | embassy_net::Config::dhcpv4(Default::default()), |
| 79 | singleton!(StackResources::<2>::new()), | 69 | make_static!(StackResources::<2>::new()), |
| 80 | seed | 70 | seed |
| 81 | )); | 71 | )); |
| 82 | 72 | ||
| @@ -126,9 +116,9 @@ async fn main(spawner: Spawner) { | |||
| 126 | } | 116 | } |
| 127 | } | 117 | } |
| 128 | 118 | ||
| 129 | async fn wait_for_config(stack: &'static Stack<Device<'static>>) -> embassy_net::StaticConfig { | 119 | async fn wait_for_config(stack: &'static Stack<Device<'static>>) -> embassy_net::StaticConfigV4 { |
| 130 | loop { | 120 | loop { |
| 131 | if let Some(config) = stack.config() { | 121 | if let Some(config) = stack.config_v4() { |
| 132 | return config.clone(); | 122 | return config.clone(); |
| 133 | } | 123 | } |
| 134 | yield_now().await; | 124 | yield_now().await; |
diff --git a/examples/rp/src/bin/ethernet_w5500_udp.rs b/examples/rp/src/bin/ethernet_w5500_udp.rs index 2c54f711e..ada86ae55 100644 --- a/examples/rp/src/bin/ethernet_w5500_udp.rs +++ b/examples/rp/src/bin/ethernet_w5500_udp.rs | |||
| @@ -18,18 +18,8 @@ use embassy_rp::peripherals::{PIN_17, PIN_20, PIN_21, SPI0}; | |||
| 18 | use embassy_rp::spi::{Async, Config as SpiConfig, Spi}; | 18 | use embassy_rp::spi::{Async, Config as SpiConfig, Spi}; |
| 19 | use embedded_hal_async::spi::ExclusiveDevice; | 19 | use embedded_hal_async::spi::ExclusiveDevice; |
| 20 | use rand::RngCore; | 20 | use rand::RngCore; |
| 21 | use static_cell::StaticCell; | 21 | use static_cell::make_static; |
| 22 | use {defmt_rtt as _, panic_probe as _}; | 22 | use {defmt_rtt as _, panic_probe as _}; |
| 23 | |||
| 24 | macro_rules! singleton { | ||
| 25 | ($val:expr) => {{ | ||
| 26 | type T = impl Sized; | ||
| 27 | static STATIC_CELL: StaticCell<T> = StaticCell::new(); | ||
| 28 | let (x,) = STATIC_CELL.init(($val,)); | ||
| 29 | x | ||
| 30 | }}; | ||
| 31 | } | ||
| 32 | |||
| 33 | #[embassy_executor::task] | 23 | #[embassy_executor::task] |
| 34 | async fn ethernet_task( | 24 | async fn ethernet_task( |
| 35 | runner: Runner< | 25 | runner: Runner< |
| @@ -61,7 +51,7 @@ async fn main(spawner: Spawner) { | |||
| 61 | let w5500_reset = Output::new(p.PIN_20, Level::High); | 51 | let w5500_reset = Output::new(p.PIN_20, Level::High); |
| 62 | 52 | ||
| 63 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; | 53 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; |
| 64 | let state = singleton!(State::<8, 8>::new()); | 54 | let state = make_static!(State::<8, 8>::new()); |
| 65 | let (device, runner) = | 55 | let (device, runner) = |
| 66 | embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await; | 56 | embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await; |
| 67 | unwrap!(spawner.spawn(ethernet_task(runner))); | 57 | unwrap!(spawner.spawn(ethernet_task(runner))); |
| @@ -70,10 +60,10 @@ async fn main(spawner: Spawner) { | |||
| 70 | let seed = rng.next_u64(); | 60 | let seed = rng.next_u64(); |
| 71 | 61 | ||
| 72 | // Init network stack | 62 | // Init network stack |
| 73 | let stack = &*singleton!(Stack::new( | 63 | let stack = &*make_static!(Stack::new( |
| 74 | device, | 64 | device, |
| 75 | embassy_net::Config::Dhcp(Default::default()), | 65 | embassy_net::Config::dhcpv4(Default::default()), |
| 76 | singleton!(StackResources::<2>::new()), | 66 | make_static!(StackResources::<2>::new()), |
| 77 | seed | 67 | seed |
| 78 | )); | 68 | )); |
| 79 | 69 | ||
| @@ -105,9 +95,9 @@ async fn main(spawner: Spawner) { | |||
| 105 | } | 95 | } |
| 106 | } | 96 | } |
| 107 | 97 | ||
| 108 | async fn wait_for_config(stack: &'static Stack<Device<'static>>) -> embassy_net::StaticConfig { | 98 | async fn wait_for_config(stack: &'static Stack<Device<'static>>) -> embassy_net::StaticConfigV4 { |
| 109 | loop { | 99 | loop { |
| 110 | if let Some(config) = stack.config() { | 100 | if let Some(config) = stack.config_v4() { |
| 111 | return config.clone(); | 101 | return config.clone(); |
| 112 | } | 102 | } |
| 113 | yield_now().await; | 103 | yield_now().await; |
diff --git a/examples/rp/src/bin/lora_p2p_send_multicore.rs b/examples/rp/src/bin/lora_p2p_send_multicore.rs index 5585606d8..eef2f7a53 100644 --- a/examples/rp/src/bin/lora_p2p_send_multicore.rs +++ b/examples/rp/src/bin/lora_p2p_send_multicore.rs | |||
| @@ -7,7 +7,6 @@ | |||
| 7 | 7 | ||
| 8 | use defmt::*; | 8 | use defmt::*; |
| 9 | use embassy_executor::Executor; | 9 | use embassy_executor::Executor; |
| 10 | use embassy_executor::_export::StaticCell; | ||
| 11 | use embassy_lora::iv::GenericSx126xInterfaceVariant; | 10 | use embassy_lora::iv::GenericSx126xInterfaceVariant; |
| 12 | use embassy_rp::gpio::{AnyPin, Input, Level, Output, Pin, Pull}; | 11 | use embassy_rp::gpio::{AnyPin, Input, Level, Output, Pin, Pull}; |
| 13 | use embassy_rp::multicore::{spawn_core1, Stack}; | 12 | use embassy_rp::multicore::{spawn_core1, Stack}; |
| @@ -19,6 +18,7 @@ use embassy_time::{Delay, Duration, Timer}; | |||
| 19 | use lora_phy::mod_params::*; | 18 | use lora_phy::mod_params::*; |
| 20 | use lora_phy::sx1261_2::SX1261_2; | 19 | use lora_phy::sx1261_2::SX1261_2; |
| 21 | use lora_phy::LoRa; | 20 | use lora_phy::LoRa; |
| 21 | use static_cell::StaticCell; | ||
| 22 | use {defmt_rtt as _, panic_probe as _}; | 22 | use {defmt_rtt as _, panic_probe as _}; |
| 23 | 23 | ||
| 24 | static mut CORE1_STACK: Stack<4096> = Stack::new(); | 24 | static mut CORE1_STACK: Stack<4096> = Stack::new(); |
diff --git a/examples/rp/src/bin/multicore.rs b/examples/rp/src/bin/multicore.rs index 376b2b61e..57278dd6c 100644 --- a/examples/rp/src/bin/multicore.rs +++ b/examples/rp/src/bin/multicore.rs | |||
| @@ -4,13 +4,13 @@ | |||
| 4 | 4 | ||
| 5 | use defmt::*; | 5 | use defmt::*; |
| 6 | use embassy_executor::Executor; | 6 | use embassy_executor::Executor; |
| 7 | use embassy_executor::_export::StaticCell; | ||
| 8 | use embassy_rp::gpio::{Level, Output}; | 7 | use embassy_rp::gpio::{Level, Output}; |
| 9 | use embassy_rp::multicore::{spawn_core1, Stack}; | 8 | use embassy_rp::multicore::{spawn_core1, Stack}; |
| 10 | use embassy_rp::peripherals::PIN_25; | 9 | use embassy_rp::peripherals::PIN_25; |
| 11 | use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; | 10 | use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; |
| 12 | use embassy_sync::channel::Channel; | 11 | use embassy_sync::channel::Channel; |
| 13 | use embassy_time::{Duration, Timer}; | 12 | use embassy_time::{Duration, Timer}; |
| 13 | use static_cell::StaticCell; | ||
| 14 | use {defmt_rtt as _, panic_probe as _}; | 14 | use {defmt_rtt as _, panic_probe as _}; |
| 15 | 15 | ||
| 16 | static mut CORE1_STACK: Stack<4096> = Stack::new(); | 16 | static mut CORE1_STACK: Stack<4096> = Stack::new(); |
diff --git a/examples/rp/src/bin/multiprio.rs b/examples/rp/src/bin/multiprio.rs index 2f79ba49e..9ace4cd68 100644 --- a/examples/rp/src/bin/multiprio.rs +++ b/examples/rp/src/bin/multiprio.rs | |||
| @@ -57,14 +57,11 @@ | |||
| 57 | #![no_main] | 57 | #![no_main] |
| 58 | #![feature(type_alias_impl_trait)] | 58 | #![feature(type_alias_impl_trait)] |
| 59 | 59 | ||
| 60 | use core::mem; | ||
| 61 | |||
| 62 | use cortex_m::peripheral::NVIC; | ||
| 63 | use cortex_m_rt::entry; | 60 | use cortex_m_rt::entry; |
| 64 | use defmt::{info, unwrap}; | 61 | use defmt::{info, unwrap}; |
| 65 | use embassy_rp::executor::{Executor, InterruptExecutor}; | 62 | use embassy_executor::{Executor, InterruptExecutor}; |
| 66 | use embassy_rp::interrupt; | 63 | use embassy_rp::interrupt; |
| 67 | use embassy_rp::pac::Interrupt; | 64 | use embassy_rp::interrupt::{InterruptExt, Priority}; |
| 68 | use embassy_time::{Duration, Instant, Timer, TICK_HZ}; | 65 | use embassy_time::{Duration, Instant, Timer, TICK_HZ}; |
| 69 | use static_cell::StaticCell; | 66 | use static_cell::StaticCell; |
| 70 | use {defmt_rtt as _, panic_probe as _}; | 67 | use {defmt_rtt as _, panic_probe as _}; |
| @@ -130,18 +127,15 @@ fn main() -> ! { | |||
| 130 | info!("Hello World!"); | 127 | info!("Hello World!"); |
| 131 | 128 | ||
| 132 | let _p = embassy_rp::init(Default::default()); | 129 | let _p = embassy_rp::init(Default::default()); |
| 133 | let mut nvic: NVIC = unsafe { mem::transmute(()) }; | ||
| 134 | 130 | ||
| 135 | // High-priority executor: SWI_IRQ_1, priority level 2 | 131 | // High-priority executor: SWI_IRQ_1, priority level 2 |
| 136 | unsafe { nvic.set_priority(Interrupt::SWI_IRQ_1, 2 << 6) }; | 132 | interrupt::SWI_IRQ_1.set_priority(Priority::P2); |
| 137 | info!("bla: {}", NVIC::get_priority(Interrupt::SWI_IRQ_1)); | 133 | let spawner = EXECUTOR_HIGH.start(interrupt::SWI_IRQ_1); |
| 138 | let spawner = EXECUTOR_HIGH.start(Interrupt::SWI_IRQ_1); | ||
| 139 | unwrap!(spawner.spawn(run_high())); | 134 | unwrap!(spawner.spawn(run_high())); |
| 140 | 135 | ||
| 141 | // Medium-priority executor: SWI_IRQ_0, priority level 3 | 136 | // Medium-priority executor: SWI_IRQ_0, priority level 3 |
| 142 | unsafe { nvic.set_priority(Interrupt::SWI_IRQ_0, 3 << 6) }; | 137 | interrupt::SWI_IRQ_0.set_priority(Priority::P3); |
| 143 | info!("bla: {}", NVIC::get_priority(Interrupt::SWI_IRQ_0)); | 138 | let spawner = EXECUTOR_MED.start(interrupt::SWI_IRQ_0); |
| 144 | let spawner = EXECUTOR_MED.start(Interrupt::SWI_IRQ_0); | ||
| 145 | unwrap!(spawner.spawn(run_med())); | 139 | unwrap!(spawner.spawn(run_med())); |
| 146 | 140 | ||
| 147 | // Low priority executor: runs in thread mode, using WFE/SEV | 141 | // Low priority executor: runs in thread mode, using WFE/SEV |
diff --git a/examples/rp/src/bin/uart_buffered_split.rs b/examples/rp/src/bin/uart_buffered_split.rs index d6f01b4de..9df99bd58 100644 --- a/examples/rp/src/bin/uart_buffered_split.rs +++ b/examples/rp/src/bin/uart_buffered_split.rs | |||
| @@ -4,34 +4,25 @@ | |||
| 4 | 4 | ||
| 5 | use defmt::*; | 5 | use defmt::*; |
| 6 | use embassy_executor::Spawner; | 6 | use embassy_executor::Spawner; |
| 7 | use embassy_executor::_export::StaticCell; | ||
| 8 | use embassy_rp::bind_interrupts; | 7 | use embassy_rp::bind_interrupts; |
| 9 | use embassy_rp::peripherals::UART0; | 8 | use embassy_rp::peripherals::UART0; |
| 10 | use embassy_rp::uart::{BufferedInterruptHandler, BufferedUart, BufferedUartRx, Config}; | 9 | use embassy_rp::uart::{BufferedInterruptHandler, BufferedUart, BufferedUartRx, Config}; |
| 11 | use embassy_time::{Duration, Timer}; | 10 | use embassy_time::{Duration, Timer}; |
| 12 | use embedded_io::asynch::{Read, Write}; | 11 | use embedded_io::asynch::{Read, Write}; |
| 12 | use static_cell::make_static; | ||
| 13 | use {defmt_rtt as _, panic_probe as _}; | 13 | use {defmt_rtt as _, panic_probe as _}; |
| 14 | 14 | ||
| 15 | bind_interrupts!(struct Irqs { | 15 | bind_interrupts!(struct Irqs { |
| 16 | UART0_IRQ => BufferedInterruptHandler<UART0>; | 16 | UART0_IRQ => BufferedInterruptHandler<UART0>; |
| 17 | }); | 17 | }); |
| 18 | 18 | ||
| 19 | macro_rules! singleton { | ||
| 20 | ($val:expr) => {{ | ||
| 21 | type T = impl Sized; | ||
| 22 | static STATIC_CELL: StaticCell<T> = StaticCell::new(); | ||
| 23 | let (x,) = STATIC_CELL.init(($val,)); | ||
| 24 | x | ||
| 25 | }}; | ||
| 26 | } | ||
| 27 | |||
| 28 | #[embassy_executor::main] | 19 | #[embassy_executor::main] |
| 29 | async fn main(spawner: Spawner) { | 20 | async fn main(spawner: Spawner) { |
| 30 | let p = embassy_rp::init(Default::default()); | 21 | let p = embassy_rp::init(Default::default()); |
| 31 | let (tx_pin, rx_pin, uart) = (p.PIN_0, p.PIN_1, p.UART0); | 22 | let (tx_pin, rx_pin, uart) = (p.PIN_0, p.PIN_1, p.UART0); |
| 32 | 23 | ||
| 33 | let tx_buf = &mut singleton!([0u8; 16])[..]; | 24 | let tx_buf = &mut make_static!([0u8; 16])[..]; |
| 34 | let rx_buf = &mut singleton!([0u8; 16])[..]; | 25 | let rx_buf = &mut make_static!([0u8; 16])[..]; |
| 35 | let uart = BufferedUart::new(uart, Irqs, tx_pin, rx_pin, tx_buf, rx_buf, Config::default()); | 26 | let uart = BufferedUart::new(uart, Irqs, tx_pin, rx_pin, tx_buf, rx_buf, Config::default()); |
| 36 | let (rx, mut tx) = uart.split(); | 27 | let (rx, mut tx) = uart.split(); |
| 37 | 28 | ||
diff --git a/examples/rp/src/bin/usb_ethernet.rs b/examples/rp/src/bin/usb_ethernet.rs index 38ff1620d..91d1ec8e7 100644 --- a/examples/rp/src/bin/usb_ethernet.rs +++ b/examples/rp/src/bin/usb_ethernet.rs | |||
| @@ -13,7 +13,7 @@ use embassy_usb::class::cdc_ncm::embassy_net::{Device, Runner, State as NetState | |||
| 13 | use embassy_usb::class::cdc_ncm::{CdcNcmClass, State}; | 13 | use embassy_usb::class::cdc_ncm::{CdcNcmClass, State}; |
| 14 | use embassy_usb::{Builder, Config, UsbDevice}; | 14 | use embassy_usb::{Builder, Config, UsbDevice}; |
| 15 | use embedded_io::asynch::Write; | 15 | use embedded_io::asynch::Write; |
| 16 | use static_cell::StaticCell; | 16 | use static_cell::make_static; |
| 17 | use {defmt_rtt as _, panic_probe as _}; | 17 | use {defmt_rtt as _, panic_probe as _}; |
| 18 | 18 | ||
| 19 | bind_interrupts!(struct Irqs { | 19 | bind_interrupts!(struct Irqs { |
| @@ -22,15 +22,6 @@ bind_interrupts!(struct Irqs { | |||
| 22 | 22 | ||
| 23 | type MyDriver = Driver<'static, peripherals::USB>; | 23 | type MyDriver = Driver<'static, peripherals::USB>; |
| 24 | 24 | ||
| 25 | macro_rules! singleton { | ||
| 26 | ($val:expr) => {{ | ||
| 27 | type T = impl Sized; | ||
| 28 | static STATIC_CELL: StaticCell<T> = StaticCell::new(); | ||
| 29 | let (x,) = STATIC_CELL.init(($val,)); | ||
| 30 | x | ||
| 31 | }}; | ||
| 32 | } | ||
| 33 | |||
| 34 | const MTU: usize = 1514; | 25 | const MTU: usize = 1514; |
| 35 | 26 | ||
| 36 | #[embassy_executor::task] | 27 | #[embassy_executor::task] |
| @@ -73,10 +64,10 @@ async fn main(spawner: Spawner) { | |||
| 73 | let mut builder = Builder::new( | 64 | let mut builder = Builder::new( |
| 74 | driver, | 65 | driver, |
| 75 | config, | 66 | config, |
| 76 | &mut singleton!([0; 256])[..], | 67 | &mut make_static!([0; 256])[..], |
| 77 | &mut singleton!([0; 256])[..], | 68 | &mut make_static!([0; 256])[..], |
| 78 | &mut singleton!([0; 256])[..], | 69 | &mut make_static!([0; 256])[..], |
| 79 | &mut singleton!([0; 128])[..], | 70 | &mut make_static!([0; 128])[..], |
| 80 | ); | 71 | ); |
| 81 | 72 | ||
| 82 | // Our MAC addr. | 73 | // Our MAC addr. |
| @@ -85,18 +76,18 @@ async fn main(spawner: Spawner) { | |||
| 85 | let host_mac_addr = [0x88, 0x88, 0x88, 0x88, 0x88, 0x88]; | 76 | let host_mac_addr = [0x88, 0x88, 0x88, 0x88, 0x88, 0x88]; |
| 86 | 77 | ||
| 87 | // Create classes on the builder. | 78 | // Create classes on the builder. |
| 88 | let class = CdcNcmClass::new(&mut builder, singleton!(State::new()), host_mac_addr, 64); | 79 | let class = CdcNcmClass::new(&mut builder, make_static!(State::new()), host_mac_addr, 64); |
| 89 | 80 | ||
| 90 | // Build the builder. | 81 | // Build the builder. |
| 91 | let usb = builder.build(); | 82 | let usb = builder.build(); |
| 92 | 83 | ||
| 93 | unwrap!(spawner.spawn(usb_task(usb))); | 84 | unwrap!(spawner.spawn(usb_task(usb))); |
| 94 | 85 | ||
| 95 | let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(singleton!(NetState::new()), our_mac_addr); | 86 | let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(make_static!(NetState::new()), our_mac_addr); |
| 96 | unwrap!(spawner.spawn(usb_ncm_task(runner))); | 87 | unwrap!(spawner.spawn(usb_ncm_task(runner))); |
| 97 | 88 | ||
| 98 | let config = embassy_net::Config::Dhcp(Default::default()); | 89 | let config = embassy_net::Config::dhcpv4(Default::default()); |
| 99 | //let config = embassy_net::Config::Static(embassy_net::StaticConfig { | 90 | //let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { |
| 100 | // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), | 91 | // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), |
| 101 | // dns_servers: Vec::new(), | 92 | // dns_servers: Vec::new(), |
| 102 | // gateway: Some(Ipv4Address::new(10, 42, 0, 1)), | 93 | // gateway: Some(Ipv4Address::new(10, 42, 0, 1)), |
| @@ -106,7 +97,12 @@ async fn main(spawner: Spawner) { | |||
| 106 | let seed = 1234; // guaranteed random, chosen by a fair dice roll | 97 | let seed = 1234; // guaranteed random, chosen by a fair dice roll |
| 107 | 98 | ||
| 108 | // Init network stack | 99 | // Init network stack |
| 109 | let stack = &*singleton!(Stack::new(device, config, singleton!(StackResources::<2>::new()), seed)); | 100 | let stack = &*make_static!(Stack::new( |
| 101 | device, | ||
| 102 | config, | ||
| 103 | make_static!(StackResources::<2>::new()), | ||
| 104 | seed | ||
| 105 | )); | ||
| 110 | 106 | ||
| 111 | unwrap!(spawner.spawn(net_task(stack))); | 107 | unwrap!(spawner.spawn(net_task(stack))); |
| 112 | 108 | ||
diff --git a/examples/rp/src/bin/wifi_ap_tcp_server.rs b/examples/rp/src/bin/wifi_ap_tcp_server.rs index 15264524e..e8197390c 100644 --- a/examples/rp/src/bin/wifi_ap_tcp_server.rs +++ b/examples/rp/src/bin/wifi_ap_tcp_server.rs | |||
| @@ -16,17 +16,9 @@ use embassy_rp::peripherals::{DMA_CH0, PIN_23, PIN_25, PIO0}; | |||
| 16 | use embassy_rp::pio::Pio; | 16 | use embassy_rp::pio::Pio; |
| 17 | use embassy_time::Duration; | 17 | use embassy_time::Duration; |
| 18 | use embedded_io::asynch::Write; | 18 | use embedded_io::asynch::Write; |
| 19 | use static_cell::StaticCell; | 19 | use static_cell::make_static; |
| 20 | use {defmt_rtt as _, panic_probe as _}; | 20 | use {defmt_rtt as _, panic_probe as _}; |
| 21 | 21 | ||
| 22 | macro_rules! singleton { | ||
| 23 | ($val:expr) => {{ | ||
| 24 | type T = impl Sized; | ||
| 25 | static STATIC_CELL: StaticCell<T> = StaticCell::new(); | ||
| 26 | STATIC_CELL.init_with(move || $val) | ||
| 27 | }}; | ||
| 28 | } | ||
| 29 | |||
| 30 | #[embassy_executor::task] | 22 | #[embassy_executor::task] |
| 31 | async fn wifi_task( | 23 | async fn wifi_task( |
| 32 | runner: cyw43::Runner<'static, Output<'static, PIN_23>, PioSpi<'static, PIN_25, PIO0, 0, DMA_CH0>>, | 24 | runner: cyw43::Runner<'static, Output<'static, PIN_23>, PioSpi<'static, PIN_25, PIO0, 0, DMA_CH0>>, |
| @@ -60,7 +52,7 @@ async fn main(spawner: Spawner) { | |||
| 60 | let mut pio = Pio::new(p.PIO0); | 52 | let mut pio = Pio::new(p.PIO0); |
| 61 | let spi = PioSpi::new(&mut pio.common, pio.sm0, pio.irq0, cs, p.PIN_24, p.PIN_29, p.DMA_CH0); | 53 | let spi = PioSpi::new(&mut pio.common, pio.sm0, pio.irq0, cs, p.PIN_24, p.PIN_29, p.DMA_CH0); |
| 62 | 54 | ||
| 63 | let state = singleton!(cyw43::State::new()); | 55 | let state = make_static!(cyw43::State::new()); |
| 64 | let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; | 56 | let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; |
| 65 | unwrap!(spawner.spawn(wifi_task(runner))); | 57 | unwrap!(spawner.spawn(wifi_task(runner))); |
| 66 | 58 | ||
| @@ -70,7 +62,7 @@ async fn main(spawner: Spawner) { | |||
| 70 | .await; | 62 | .await; |
| 71 | 63 | ||
| 72 | // Use a link-local address for communication without DHCP server | 64 | // Use a link-local address for communication without DHCP server |
| 73 | let config = Config::Static(embassy_net::StaticConfig { | 65 | let config = Config::ipv4_static(embassy_net::StaticConfigV4 { |
| 74 | address: embassy_net::Ipv4Cidr::new(embassy_net::Ipv4Address::new(169, 254, 1, 1), 16), | 66 | address: embassy_net::Ipv4Cidr::new(embassy_net::Ipv4Address::new(169, 254, 1, 1), 16), |
| 75 | dns_servers: heapless::Vec::new(), | 67 | dns_servers: heapless::Vec::new(), |
| 76 | gateway: None, | 68 | gateway: None, |
| @@ -80,10 +72,10 @@ async fn main(spawner: Spawner) { | |||
| 80 | let seed = 0x0123_4567_89ab_cdef; // chosen by fair dice roll. guarenteed to be random. | 72 | let seed = 0x0123_4567_89ab_cdef; // chosen by fair dice roll. guarenteed to be random. |
| 81 | 73 | ||
| 82 | // Init network stack | 74 | // Init network stack |
| 83 | let stack = &*singleton!(Stack::new( | 75 | let stack = &*make_static!(Stack::new( |
| 84 | net_device, | 76 | net_device, |
| 85 | config, | 77 | config, |
| 86 | singleton!(StackResources::<2>::new()), | 78 | make_static!(StackResources::<2>::new()), |
| 87 | seed | 79 | seed |
| 88 | )); | 80 | )); |
| 89 | 81 | ||
diff --git a/examples/rp/src/bin/wifi_blinky.rs b/examples/rp/src/bin/wifi_blinky.rs new file mode 100644 index 000000000..be965807b --- /dev/null +++ b/examples/rp/src/bin/wifi_blinky.rs | |||
| @@ -0,0 +1,59 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | #![feature(type_alias_impl_trait)] | ||
| 4 | |||
| 5 | use cyw43_pio::PioSpi; | ||
| 6 | use defmt::*; | ||
| 7 | use embassy_executor::Spawner; | ||
| 8 | use embassy_rp::gpio::{Level, Output}; | ||
| 9 | use embassy_rp::peripherals::{DMA_CH0, PIN_23, PIN_25, PIO0}; | ||
| 10 | use embassy_rp::pio::Pio; | ||
| 11 | use embassy_time::{Duration, Timer}; | ||
| 12 | use static_cell::make_static; | ||
| 13 | use {defmt_rtt as _, panic_probe as _}; | ||
| 14 | |||
| 15 | #[embassy_executor::task] | ||
| 16 | async fn wifi_task( | ||
| 17 | runner: cyw43::Runner<'static, Output<'static, PIN_23>, PioSpi<'static, PIN_25, PIO0, 0, DMA_CH0>>, | ||
| 18 | ) -> ! { | ||
| 19 | runner.run().await | ||
| 20 | } | ||
| 21 | |||
| 22 | #[embassy_executor::main] | ||
| 23 | async fn main(spawner: Spawner) { | ||
| 24 | let p = embassy_rp::init(Default::default()); | ||
| 25 | let fw = include_bytes!("../../../../cyw43-firmware/43439A0.bin"); | ||
| 26 | let clm = include_bytes!("../../../../cyw43-firmware/43439A0_clm.bin"); | ||
| 27 | |||
| 28 | // To make flashing faster for development, you may want to flash the firmwares independently | ||
| 29 | // at hardcoded addresses, instead of baking them into the program with `include_bytes!`: | ||
| 30 | // probe-rs-cli download 43439A0.bin --format bin --chip RP2040 --base-address 0x10100000 | ||
| 31 | // probe-rs-cli download 43439A0_clm.bin --format bin --chip RP2040 --base-address 0x10140000 | ||
| 32 | //let fw = unsafe { core::slice::from_raw_parts(0x10100000 as *const u8, 224190) }; | ||
| 33 | //let clm = unsafe { core::slice::from_raw_parts(0x10140000 as *const u8, 4752) }; | ||
| 34 | |||
| 35 | let pwr = Output::new(p.PIN_23, Level::Low); | ||
| 36 | let cs = Output::new(p.PIN_25, Level::High); | ||
| 37 | let mut pio = Pio::new(p.PIO0); | ||
| 38 | let spi = PioSpi::new(&mut pio.common, pio.sm0, pio.irq0, cs, p.PIN_24, p.PIN_29, p.DMA_CH0); | ||
| 39 | |||
| 40 | let state = make_static!(cyw43::State::new()); | ||
| 41 | let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; | ||
| 42 | unwrap!(spawner.spawn(wifi_task(runner))); | ||
| 43 | |||
| 44 | control.init(clm).await; | ||
| 45 | control | ||
| 46 | .set_power_management(cyw43::PowerManagementMode::PowerSave) | ||
| 47 | .await; | ||
| 48 | |||
| 49 | let delay = Duration::from_secs(1); | ||
| 50 | loop { | ||
| 51 | info!("led on!"); | ||
| 52 | control.gpio_set(0, true).await; | ||
| 53 | Timer::after(delay).await; | ||
| 54 | |||
| 55 | info!("led off!"); | ||
| 56 | control.gpio_set(0, false).await; | ||
| 57 | Timer::after(delay).await; | ||
| 58 | } | ||
| 59 | } | ||
diff --git a/examples/rp/src/bin/wifi_scan.rs b/examples/rp/src/bin/wifi_scan.rs index aa5e5a399..79534f229 100644 --- a/examples/rp/src/bin/wifi_scan.rs +++ b/examples/rp/src/bin/wifi_scan.rs | |||
| @@ -13,17 +13,9 @@ use embassy_net::Stack; | |||
| 13 | use embassy_rp::gpio::{Level, Output}; | 13 | use embassy_rp::gpio::{Level, Output}; |
| 14 | use embassy_rp::peripherals::{DMA_CH0, PIN_23, PIN_25, PIO0}; | 14 | use embassy_rp::peripherals::{DMA_CH0, PIN_23, PIN_25, PIO0}; |
| 15 | use embassy_rp::pio::Pio; | 15 | use embassy_rp::pio::Pio; |
| 16 | use static_cell::StaticCell; | 16 | use static_cell::make_static; |
| 17 | use {defmt_rtt as _, panic_probe as _}; | 17 | use {defmt_rtt as _, panic_probe as _}; |
| 18 | 18 | ||
| 19 | macro_rules! singleton { | ||
| 20 | ($val:expr) => {{ | ||
| 21 | type T = impl Sized; | ||
| 22 | static STATIC_CELL: StaticCell<T> = StaticCell::new(); | ||
| 23 | STATIC_CELL.init_with(move || $val) | ||
| 24 | }}; | ||
| 25 | } | ||
| 26 | |||
| 27 | #[embassy_executor::task] | 19 | #[embassy_executor::task] |
| 28 | async fn wifi_task( | 20 | async fn wifi_task( |
| 29 | runner: cyw43::Runner<'static, Output<'static, PIN_23>, PioSpi<'static, PIN_25, PIO0, 0, DMA_CH0>>, | 21 | runner: cyw43::Runner<'static, Output<'static, PIN_23>, PioSpi<'static, PIN_25, PIO0, 0, DMA_CH0>>, |
| @@ -57,7 +49,7 @@ async fn main(spawner: Spawner) { | |||
| 57 | let mut pio = Pio::new(p.PIO0); | 49 | let mut pio = Pio::new(p.PIO0); |
| 58 | let spi = PioSpi::new(&mut pio.common, pio.sm0, pio.irq0, cs, p.PIN_24, p.PIN_29, p.DMA_CH0); | 50 | let spi = PioSpi::new(&mut pio.common, pio.sm0, pio.irq0, cs, p.PIN_24, p.PIN_29, p.DMA_CH0); |
| 59 | 51 | ||
| 60 | let state = singleton!(cyw43::State::new()); | 52 | let state = make_static!(cyw43::State::new()); |
| 61 | let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; | 53 | let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; |
| 62 | unwrap!(spawner.spawn(wifi_task(runner))); | 54 | unwrap!(spawner.spawn(wifi_task(runner))); |
| 63 | 55 | ||
diff --git a/examples/rp/src/bin/wifi_tcp_server.rs b/examples/rp/src/bin/wifi_tcp_server.rs index eafa25f68..026e056fa 100644 --- a/examples/rp/src/bin/wifi_tcp_server.rs +++ b/examples/rp/src/bin/wifi_tcp_server.rs | |||
| @@ -16,17 +16,9 @@ use embassy_rp::peripherals::{DMA_CH0, PIN_23, PIN_25, PIO0}; | |||
| 16 | use embassy_rp::pio::Pio; | 16 | use embassy_rp::pio::Pio; |
| 17 | use embassy_time::Duration; | 17 | use embassy_time::Duration; |
| 18 | use embedded_io::asynch::Write; | 18 | use embedded_io::asynch::Write; |
| 19 | use static_cell::StaticCell; | 19 | use static_cell::make_static; |
| 20 | use {defmt_rtt as _, panic_probe as _}; | 20 | use {defmt_rtt as _, panic_probe as _}; |
| 21 | 21 | ||
| 22 | macro_rules! singleton { | ||
| 23 | ($val:expr) => {{ | ||
| 24 | type T = impl Sized; | ||
| 25 | static STATIC_CELL: StaticCell<T> = StaticCell::new(); | ||
| 26 | STATIC_CELL.init_with(move || $val) | ||
| 27 | }}; | ||
| 28 | } | ||
| 29 | |||
| 30 | #[embassy_executor::task] | 22 | #[embassy_executor::task] |
| 31 | async fn wifi_task( | 23 | async fn wifi_task( |
| 32 | runner: cyw43::Runner<'static, Output<'static, PIN_23>, PioSpi<'static, PIN_25, PIO0, 0, DMA_CH0>>, | 24 | runner: cyw43::Runner<'static, Output<'static, PIN_23>, PioSpi<'static, PIN_25, PIO0, 0, DMA_CH0>>, |
| @@ -60,7 +52,7 @@ async fn main(spawner: Spawner) { | |||
| 60 | let mut pio = Pio::new(p.PIO0); | 52 | let mut pio = Pio::new(p.PIO0); |
| 61 | let spi = PioSpi::new(&mut pio.common, pio.sm0, pio.irq0, cs, p.PIN_24, p.PIN_29, p.DMA_CH0); | 53 | let spi = PioSpi::new(&mut pio.common, pio.sm0, pio.irq0, cs, p.PIN_24, p.PIN_29, p.DMA_CH0); |
| 62 | 54 | ||
| 63 | let state = singleton!(cyw43::State::new()); | 55 | let state = make_static!(cyw43::State::new()); |
| 64 | let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; | 56 | let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; |
| 65 | unwrap!(spawner.spawn(wifi_task(runner))); | 57 | unwrap!(spawner.spawn(wifi_task(runner))); |
| 66 | 58 | ||
| @@ -69,8 +61,8 @@ async fn main(spawner: Spawner) { | |||
| 69 | .set_power_management(cyw43::PowerManagementMode::PowerSave) | 61 | .set_power_management(cyw43::PowerManagementMode::PowerSave) |
| 70 | .await; | 62 | .await; |
| 71 | 63 | ||
| 72 | let config = Config::Dhcp(Default::default()); | 64 | let config = Config::dhcpv4(Default::default()); |
| 73 | //let config = embassy_net::Config::Static(embassy_net::Config { | 65 | //let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { |
| 74 | // address: Ipv4Cidr::new(Ipv4Address::new(192, 168, 69, 2), 24), | 66 | // address: Ipv4Cidr::new(Ipv4Address::new(192, 168, 69, 2), 24), |
| 75 | // dns_servers: Vec::new(), | 67 | // dns_servers: Vec::new(), |
| 76 | // gateway: Some(Ipv4Address::new(192, 168, 69, 1)), | 68 | // gateway: Some(Ipv4Address::new(192, 168, 69, 1)), |
| @@ -80,10 +72,10 @@ async fn main(spawner: Spawner) { | |||
| 80 | let seed = 0x0123_4567_89ab_cdef; // chosen by fair dice roll. guarenteed to be random. | 72 | let seed = 0x0123_4567_89ab_cdef; // chosen by fair dice roll. guarenteed to be random. |
| 81 | 73 | ||
| 82 | // Init network stack | 74 | // Init network stack |
| 83 | let stack = &*singleton!(Stack::new( | 75 | let stack = &*make_static!(Stack::new( |
| 84 | net_device, | 76 | net_device, |
| 85 | config, | 77 | config, |
| 86 | singleton!(StackResources::<2>::new()), | 78 | make_static!(StackResources::<2>::new()), |
| 87 | seed | 79 | seed |
| 88 | )); | 80 | )); |
| 89 | 81 | ||
