aboutsummaryrefslogtreecommitdiff
path: root/examples/stm32wb/src/bin
diff options
context:
space:
mode:
authorxoviat <[email protected]>2025-11-17 08:23:34 -0600
committerxoviat <[email protected]>2025-11-17 08:23:34 -0600
commit80ceb42eb1c842fcb214a5fbfbb1c39265c6b29b (patch)
tree8a77d8998a5f8681c93eed4297d9bee6fb83ec3c /examples/stm32wb/src/bin
parent9cd6c92151e4ee68bca95bfc17658e50ad2c1aca (diff)
wpan_ get net example actually working
Diffstat (limited to 'examples/stm32wb/src/bin')
-rw-r--r--examples/stm32wb/src/bin/mac_ffd_net.rs90
1 files changed, 75 insertions, 15 deletions
diff --git a/examples/stm32wb/src/bin/mac_ffd_net.rs b/examples/stm32wb/src/bin/mac_ffd_net.rs
index 9b705dda9..5d946b35b 100644
--- a/examples/stm32wb/src/bin/mac_ffd_net.rs
+++ b/examples/stm32wb/src/bin/mac_ffd_net.rs
@@ -1,30 +1,44 @@
1#![no_std] 1#![no_std]
2#![no_main] 2#![no_main]
3 3
4use core::net::Ipv6Addr;
5
4use defmt::*; 6use defmt::*;
5use embassy_executor::Spawner; 7use embassy_executor::Spawner;
8use embassy_net::udp::{PacketMetadata, UdpSocket};
9use embassy_net::{Ipv6Cidr, StackResources, StaticConfigV6};
6use embassy_stm32::bind_interrupts; 10use embassy_stm32::bind_interrupts;
7use embassy_stm32::ipcc::{Config, ReceiveInterruptHandler, TransmitInterruptHandler}; 11use embassy_stm32::ipcc::{Config, ReceiveInterruptHandler, TransmitInterruptHandler};
12use embassy_stm32::peripherals::RNG;
8use embassy_stm32::rcc::WPAN_DEFAULT; 13use embassy_stm32::rcc::WPAN_DEFAULT;
14use embassy_stm32::rng::InterruptHandler as RngInterruptHandler;
9use embassy_stm32_wpan::TlMbox; 15use embassy_stm32_wpan::TlMbox;
10use embassy_stm32_wpan::mac::{Driver, DriverState, Runner}; 16use embassy_stm32_wpan::mac::{Driver, DriverState, Runner};
11use embassy_stm32_wpan::sub::mm; 17use embassy_stm32_wpan::sub::mm;
18use embassy_time::{Duration, Timer};
19use heapless::Vec;
12use static_cell::StaticCell; 20use static_cell::StaticCell;
13use {defmt_rtt as _, panic_probe as _}; 21use {defmt_rtt as _, panic_probe as _};
14 22
15bind_interrupts!(struct Irqs{ 23bind_interrupts!(struct Irqs{
16 IPCC_C1_RX => ReceiveInterruptHandler; 24 IPCC_C1_RX => ReceiveInterruptHandler;
17 IPCC_C1_TX => TransmitInterruptHandler; 25 IPCC_C1_TX => TransmitInterruptHandler;
26 RNG => RngInterruptHandler<RNG>;
18}); 27});
19 28
20#[embassy_executor::task] 29#[embassy_executor::task]
21async fn run_mm_queue(memory_manager: mm::MemoryManager) { 30async fn run_mm_queue(memory_manager: mm::MemoryManager) -> ! {
22 memory_manager.run_queue().await; 31 memory_manager.run_queue().await
32}
33
34#[embassy_executor::task]
35async fn run_mac(runner: &'static Runner<'static>) -> ! {
36 runner.run().await
23} 37}
24 38
25#[embassy_executor::task] 39#[embassy_executor::task]
26async fn run_mac(runner: &'static Runner<'static>) { 40async fn run_net(mut runner: embassy_net::Runner<'static, Driver<'static>>) -> ! {
27 runner.run().await; 41 runner.run().await
28} 42}
29 43
30#[embassy_executor::main] 44#[embassy_executor::main]
@@ -72,21 +86,67 @@ async fn main(spawner: Spawner) {
72 86
73 static DRIVER_STATE: StaticCell<DriverState> = StaticCell::new(); 87 static DRIVER_STATE: StaticCell<DriverState> = StaticCell::new();
74 static RUNNER: StaticCell<Runner> = StaticCell::new(); 88 static RUNNER: StaticCell<Runner> = StaticCell::new();
89 static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new();
75 90
76 let driver_state = DRIVER_STATE.init(DriverState::new(mbox.mac_subsystem)); 91 let driver_state = DRIVER_STATE.init(DriverState::new(mbox.mac_subsystem));
77 let (driver, runner, mut control) = Driver::new(driver_state);
78 92
79 spawner.spawn(run_mac(RUNNER.init(runner)).unwrap()); 93 let (driver, mac_runner, mut control) = Driver::new(
94 driver_state,
95 0x1122u16.to_be_bytes().try_into().unwrap(),
96 0xACDE480000000001u64.to_be_bytes().try_into().unwrap(),
97 );
80 98
81 control 99 // TODO: rng does not work for some reason
82 .init_link( 100 // Generate random seed.
83 0x1122u16.to_be_bytes().try_into().unwrap(), 101 // let mut rng = Rng::new(p.RNG, Irqs);
84 0xACDE480000000001u64.to_be_bytes().try_into().unwrap(), 102 let seed = [0; 8];
85 [0x1A, 0xAA], 103 // let _ = rng.async_fill_bytes(&mut seed).await;
86 ) 104 let seed = u64::from_le_bytes(seed);
87 .await;
88 105
89 cortex_m::asm::bkpt(); 106 info!("seed generated");
107
108 // Init network stack
109 let ipv6_addr = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);
110
111 let config = embassy_net::Config::ipv6_static(StaticConfigV6 {
112 address: Ipv6Cidr::new(ipv6_addr, 104),
113 gateway: None,
114 dns_servers: Vec::new(),
115 });
116
117 let (stack, eth_runner) = embassy_net::new(driver, config, RESOURCES.init(StackResources::new()), seed);
118
119 // wpan runner
120 spawner.spawn(run_mac(RUNNER.init(mac_runner)).unwrap());
121
122 // Launch network task
123 spawner.spawn(unwrap!(run_net(eth_runner)));
124
125 info!("Network task initialized");
90 126
91 let _ = driver; 127 control.init_link([0x1A, 0xAA]).await;
128
129 // Ensure DHCP configuration is up before trying connect
130 stack.wait_config_up().await;
131
132 info!("Network up");
133
134 // Then we can use it!
135 let mut rx_meta = [PacketMetadata::EMPTY];
136 let mut rx_buffer = [0; 4096];
137 let mut tx_meta = [PacketMetadata::EMPTY];
138 let mut tx_buffer = [0; 4096];
139
140 let mut socket = UdpSocket::new(stack, &mut rx_meta, &mut rx_buffer, &mut tx_meta, &mut tx_buffer);
141
142 let remote_endpoint = (Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2fb), 8000);
143
144 let send_buf = [0u8; 20];
145
146 socket.bind((ipv6_addr, 8000)).unwrap();
147 socket.send_to(&send_buf, remote_endpoint).await.unwrap();
148
149 Timer::after(Duration::from_secs(2)).await;
150
151 cortex_m::asm::bkpt();
92} 152}