aboutsummaryrefslogtreecommitdiff
path: root/examples/rp/src/bin
diff options
context:
space:
mode:
authorxoviat <[email protected]>2023-06-19 15:52:33 -0500
committerxoviat <[email protected]>2023-06-19 15:52:33 -0500
commitaaad9068156305e5f6f41ee4013e025083bd0668 (patch)
tree67a08c8a512e8791433891a3b6deec813fc4c578 /examples/rp/src/bin
parent35083b262b364387713f4273649b62180123182c (diff)
parent3c70f799a28f5f28d84fa8ee8b4b232f5e9aad82 (diff)
Merge branch 'main' of https://github.com/embassy-rs/embassy into can
Diffstat (limited to 'examples/rp/src/bin')
-rw-r--r--examples/rp/src/bin/button.rs5
-rw-r--r--examples/rp/src/bin/ethernet_w5500_multisocket.rs23
-rw-r--r--examples/rp/src/bin/ethernet_w5500_tcp_client.rs23
-rw-r--r--examples/rp/src/bin/ethernet_w5500_tcp_server.rs24
-rw-r--r--examples/rp/src/bin/ethernet_w5500_udp.rs24
-rw-r--r--examples/rp/src/bin/lora_p2p_send_multicore.rs2
-rw-r--r--examples/rp/src/bin/multicore.rs2
-rw-r--r--examples/rp/src/bin/multiprio.rs18
-rw-r--r--examples/rp/src/bin/uart_buffered_split.rs15
-rw-r--r--examples/rp/src/bin/usb_ethernet.rs34
-rw-r--r--examples/rp/src/bin/wifi_ap_tcp_server.rs18
-rw-r--r--examples/rp/src/bin/wifi_blinky.rs59
-rw-r--r--examples/rp/src/bin/wifi_scan.rs12
-rw-r--r--examples/rp/src/bin/wifi_tcp_server.rs20
14 files changed, 130 insertions, 149 deletions
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]
10async fn main(_spawner: Spawner) { 10async 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;
19use embedded_hal_async::spi::ExclusiveDevice; 19use embedded_hal_async::spi::ExclusiveDevice;
20use embedded_io::asynch::Write; 20use embedded_io::asynch::Write;
21use rand::RngCore; 21use rand::RngCore;
22use static_cell::StaticCell; 22use static_cell::make_static;
23use {defmt_rtt as _, panic_probe as _}; 23use {defmt_rtt as _, panic_probe as _};
24 24
25macro_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]
35async fn ethernet_task( 26async 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
132async fn wait_for_config(stack: &'static Stack<Device<'static>>) -> embassy_net::StaticConfig { 123async 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};
21use embedded_hal_async::spi::ExclusiveDevice; 21use embedded_hal_async::spi::ExclusiveDevice;
22use embedded_io::asynch::Write; 22use embedded_io::asynch::Write;
23use rand::RngCore; 23use rand::RngCore;
24use static_cell::StaticCell; 24use static_cell::make_static;
25use {defmt_rtt as _, panic_probe as _}; 25use {defmt_rtt as _, panic_probe as _};
26 26
27macro_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]
37async fn ethernet_task( 28async 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
120async fn wait_for_config(stack: &'static Stack<Device<'static>>) -> embassy_net::StaticConfig { 111async 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;
20use embedded_hal_async::spi::ExclusiveDevice; 20use embedded_hal_async::spi::ExclusiveDevice;
21use embedded_io::asynch::Write; 21use embedded_io::asynch::Write;
22use rand::RngCore; 22use rand::RngCore;
23use static_cell::StaticCell; 23use static_cell::make_static;
24use {defmt_rtt as _, panic_probe as _}; 24use {defmt_rtt as _, panic_probe as _};
25
26macro_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]
36async fn ethernet_task( 26async 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
129async fn wait_for_config(stack: &'static Stack<Device<'static>>) -> embassy_net::StaticConfig { 119async 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};
18use embassy_rp::spi::{Async, Config as SpiConfig, Spi}; 18use embassy_rp::spi::{Async, Config as SpiConfig, Spi};
19use embedded_hal_async::spi::ExclusiveDevice; 19use embedded_hal_async::spi::ExclusiveDevice;
20use rand::RngCore; 20use rand::RngCore;
21use static_cell::StaticCell; 21use static_cell::make_static;
22use {defmt_rtt as _, panic_probe as _}; 22use {defmt_rtt as _, panic_probe as _};
23
24macro_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]
34async fn ethernet_task( 24async 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
108async fn wait_for_config(stack: &'static Stack<Device<'static>>) -> embassy_net::StaticConfig { 98async 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
8use defmt::*; 8use defmt::*;
9use embassy_executor::Executor; 9use embassy_executor::Executor;
10use embassy_executor::_export::StaticCell;
11use embassy_lora::iv::GenericSx126xInterfaceVariant; 10use embassy_lora::iv::GenericSx126xInterfaceVariant;
12use embassy_rp::gpio::{AnyPin, Input, Level, Output, Pin, Pull}; 11use embassy_rp::gpio::{AnyPin, Input, Level, Output, Pin, Pull};
13use embassy_rp::multicore::{spawn_core1, Stack}; 12use embassy_rp::multicore::{spawn_core1, Stack};
@@ -19,6 +18,7 @@ use embassy_time::{Delay, Duration, Timer};
19use lora_phy::mod_params::*; 18use lora_phy::mod_params::*;
20use lora_phy::sx1261_2::SX1261_2; 19use lora_phy::sx1261_2::SX1261_2;
21use lora_phy::LoRa; 20use lora_phy::LoRa;
21use static_cell::StaticCell;
22use {defmt_rtt as _, panic_probe as _}; 22use {defmt_rtt as _, panic_probe as _};
23 23
24static mut CORE1_STACK: Stack<4096> = Stack::new(); 24static 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
5use defmt::*; 5use defmt::*;
6use embassy_executor::Executor; 6use embassy_executor::Executor;
7use embassy_executor::_export::StaticCell;
8use embassy_rp::gpio::{Level, Output}; 7use embassy_rp::gpio::{Level, Output};
9use embassy_rp::multicore::{spawn_core1, Stack}; 8use embassy_rp::multicore::{spawn_core1, Stack};
10use embassy_rp::peripherals::PIN_25; 9use embassy_rp::peripherals::PIN_25;
11use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; 10use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
12use embassy_sync::channel::Channel; 11use embassy_sync::channel::Channel;
13use embassy_time::{Duration, Timer}; 12use embassy_time::{Duration, Timer};
13use static_cell::StaticCell;
14use {defmt_rtt as _, panic_probe as _}; 14use {defmt_rtt as _, panic_probe as _};
15 15
16static mut CORE1_STACK: Stack<4096> = Stack::new(); 16static 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
60use core::mem;
61
62use cortex_m::peripheral::NVIC;
63use cortex_m_rt::entry; 60use cortex_m_rt::entry;
64use defmt::{info, unwrap}; 61use defmt::{info, unwrap};
65use embassy_rp::executor::{Executor, InterruptExecutor}; 62use embassy_executor::{Executor, InterruptExecutor};
66use embassy_rp::interrupt; 63use embassy_rp::interrupt;
67use embassy_rp::pac::Interrupt; 64use embassy_rp::interrupt::{InterruptExt, Priority};
68use embassy_time::{Duration, Instant, Timer, TICK_HZ}; 65use embassy_time::{Duration, Instant, Timer, TICK_HZ};
69use static_cell::StaticCell; 66use static_cell::StaticCell;
70use {defmt_rtt as _, panic_probe as _}; 67use {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
5use defmt::*; 5use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_executor::_export::StaticCell;
8use embassy_rp::bind_interrupts; 7use embassy_rp::bind_interrupts;
9use embassy_rp::peripherals::UART0; 8use embassy_rp::peripherals::UART0;
10use embassy_rp::uart::{BufferedInterruptHandler, BufferedUart, BufferedUartRx, Config}; 9use embassy_rp::uart::{BufferedInterruptHandler, BufferedUart, BufferedUartRx, Config};
11use embassy_time::{Duration, Timer}; 10use embassy_time::{Duration, Timer};
12use embedded_io::asynch::{Read, Write}; 11use embedded_io::asynch::{Read, Write};
12use static_cell::make_static;
13use {defmt_rtt as _, panic_probe as _}; 13use {defmt_rtt as _, panic_probe as _};
14 14
15bind_interrupts!(struct Irqs { 15bind_interrupts!(struct Irqs {
16 UART0_IRQ => BufferedInterruptHandler<UART0>; 16 UART0_IRQ => BufferedInterruptHandler<UART0>;
17}); 17});
18 18
19macro_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]
29async fn main(spawner: Spawner) { 20async 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
13use embassy_usb::class::cdc_ncm::{CdcNcmClass, State}; 13use embassy_usb::class::cdc_ncm::{CdcNcmClass, State};
14use embassy_usb::{Builder, Config, UsbDevice}; 14use embassy_usb::{Builder, Config, UsbDevice};
15use embedded_io::asynch::Write; 15use embedded_io::asynch::Write;
16use static_cell::StaticCell; 16use static_cell::make_static;
17use {defmt_rtt as _, panic_probe as _}; 17use {defmt_rtt as _, panic_probe as _};
18 18
19bind_interrupts!(struct Irqs { 19bind_interrupts!(struct Irqs {
@@ -22,15 +22,6 @@ bind_interrupts!(struct Irqs {
22 22
23type MyDriver = Driver<'static, peripherals::USB>; 23type MyDriver = Driver<'static, peripherals::USB>;
24 24
25macro_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
34const MTU: usize = 1514; 25const 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};
16use embassy_rp::pio::Pio; 16use embassy_rp::pio::Pio;
17use embassy_time::Duration; 17use embassy_time::Duration;
18use embedded_io::asynch::Write; 18use embedded_io::asynch::Write;
19use static_cell::StaticCell; 19use static_cell::make_static;
20use {defmt_rtt as _, panic_probe as _}; 20use {defmt_rtt as _, panic_probe as _};
21 21
22macro_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]
31async fn wifi_task( 23async 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
5use cyw43_pio::PioSpi;
6use defmt::*;
7use embassy_executor::Spawner;
8use embassy_rp::gpio::{Level, Output};
9use embassy_rp::peripherals::{DMA_CH0, PIN_23, PIN_25, PIO0};
10use embassy_rp::pio::Pio;
11use embassy_time::{Duration, Timer};
12use static_cell::make_static;
13use {defmt_rtt as _, panic_probe as _};
14
15#[embassy_executor::task]
16async 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]
23async 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;
13use embassy_rp::gpio::{Level, Output}; 13use embassy_rp::gpio::{Level, Output};
14use embassy_rp::peripherals::{DMA_CH0, PIN_23, PIN_25, PIO0}; 14use embassy_rp::peripherals::{DMA_CH0, PIN_23, PIN_25, PIO0};
15use embassy_rp::pio::Pio; 15use embassy_rp::pio::Pio;
16use static_cell::StaticCell; 16use static_cell::make_static;
17use {defmt_rtt as _, panic_probe as _}; 17use {defmt_rtt as _, panic_probe as _};
18 18
19macro_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]
28async fn wifi_task( 20async 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};
16use embassy_rp::pio::Pio; 16use embassy_rp::pio::Pio;
17use embassy_time::Duration; 17use embassy_time::Duration;
18use embedded_io::asynch::Write; 18use embedded_io::asynch::Write;
19use static_cell::StaticCell; 19use static_cell::make_static;
20use {defmt_rtt as _, panic_probe as _}; 20use {defmt_rtt as _, panic_probe as _};
21 21
22macro_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]
31async fn wifi_task( 23async 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