aboutsummaryrefslogtreecommitdiff
path: root/examples/stm32f7/src/bin
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2022-05-23 03:50:43 +0200
committerDario Nieuwenhuis <[email protected]>2022-05-25 19:56:22 +0200
commita5aea995a802fea8fc1b3e4b5fe47bd6d1fca2a4 (patch)
tree0fcb4c01914347eff5b3be44b284aa9432e28678 /examples/stm32f7/src/bin
parent36a1f203648dcb402727ea3eb5d30cf1f6993795 (diff)
WIP embassy-net v2
Diffstat (limited to 'examples/stm32f7/src/bin')
-rw-r--r--examples/stm32f7/src/bin/eth.rs173
1 files changed, 83 insertions, 90 deletions
diff --git a/examples/stm32f7/src/bin/eth.rs b/examples/stm32f7/src/bin/eth.rs
index dca9338b2..af012f826 100644
--- a/examples/stm32f7/src/bin/eth.rs
+++ b/examples/stm32f7/src/bin/eth.rs
@@ -2,130 +2,123 @@
2#![no_main] 2#![no_main]
3#![feature(type_alias_impl_trait)] 3#![feature(type_alias_impl_trait)]
4 4
5use cortex_m_rt::entry;
6use defmt::*; 5use defmt::*;
7use embassy::executor::{Executor, Spawner}; 6use embassy::executor::Spawner;
8use embassy::time::{Duration, Timer}; 7use embassy::time::{Duration, Timer};
9use embassy::util::Forever; 8use embassy::util::Forever;
10use embassy_net::tcp::TcpSocket; 9use embassy_net::tcp::TcpSocket;
11use embassy_net::{Config as NetConfig, Ipv4Address, Ipv4Cidr, StackResources, StaticConfigurator}; 10use embassy_net::{Ipv4Address, Stack, StackResources};
12use embassy_stm32::eth::generic_smi::GenericSMI; 11use embassy_stm32::eth::generic_smi::GenericSMI;
13use embassy_stm32::eth::{Ethernet, State}; 12use embassy_stm32::eth::{Ethernet, State};
14use embassy_stm32::interrupt;
15use embassy_stm32::peripherals::ETH; 13use embassy_stm32::peripherals::ETH;
16use embassy_stm32::peripherals::RNG;
17use embassy_stm32::rng::Rng; 14use embassy_stm32::rng::Rng;
18use embassy_stm32::time::U32Ext; 15use embassy_stm32::time::U32Ext;
19use embassy_stm32::Config; 16use embassy_stm32::Config;
17use embassy_stm32::{interrupt, Peripherals};
20use embedded_io::asynch::Write; 18use embedded_io::asynch::Write;
21use heapless::Vec;
22 19
23use defmt_rtt as _; // global logger 20use defmt_rtt as _; // global logger
24use panic_probe as _; 21use panic_probe as _;
25 22use rand_core::RngCore;
26#[embassy::task] 23
27async fn main_task( 24macro_rules! forever {
28 device: &'static mut Ethernet<'static, ETH, GenericSMI, 4, 4>, 25 ($val:expr) => {{
29 config: &'static mut StaticConfigurator, 26 type T = impl Sized;
30 spawner: Spawner, 27 static FOREVER: Forever<T> = Forever::new();
31) { 28 FOREVER.put_with(move || $val)
32 let net_resources = NET_RESOURCES.put(StackResources::new()); 29 }};
33
34 // Init network stack
35 embassy_net::init(device, config, net_resources);
36
37 // Launch network task
38 unwrap!(spawner.spawn(net_task()));
39
40 info!("Network task initialized");
41
42 // Then we can use it!
43 let mut rx_buffer = [0; 1024];
44 let mut tx_buffer = [0; 1024];
45 let mut socket = TcpSocket::new(&mut rx_buffer, &mut tx_buffer);
46
47 socket.set_timeout(Some(embassy_net::SmolDuration::from_secs(10)));
48
49 let remote_endpoint = (Ipv4Address::new(192, 168, 0, 10), 8000);
50 let r = socket.connect(remote_endpoint).await;
51 if let Err(e) = r {
52 info!("connect error: {:?}", e);
53 return;
54 }
55 info!("connected!");
56 loop {
57 let r = socket.write_all(b"Hello\n").await;
58 if let Err(e) = r {
59 info!("write error: {:?}", e);
60 return;
61 }
62 Timer::after(Duration::from_secs(1)).await;
63 }
64}
65
66#[embassy::task]
67async fn net_task() {
68 embassy_net::run().await
69} 30}
70 31
71#[no_mangle] 32type Device = Ethernet<'static, ETH, GenericSMI, 4, 4>;
72fn _embassy_rand(buf: &mut [u8]) {
73 use rand_core::RngCore;
74 33
75 critical_section::with(|_| unsafe { 34#[embassy::task]
76 unwrap!(RNG_INST.as_mut()).fill_bytes(buf); 35async fn net_task(stack: &'static Stack<Device>) -> ! {
77 }); 36 stack.run().await
78} 37}
79 38
80static mut RNG_INST: Option<Rng<RNG>> = None;
81
82static EXECUTOR: Forever<Executor> = Forever::new();
83static STATE: Forever<State<'static, ETH, 4, 4>> = Forever::new();
84static ETH: Forever<Ethernet<'static, ETH, GenericSMI, 4, 4>> = Forever::new();
85static CONFIG: Forever<StaticConfigurator> = Forever::new();
86static NET_RESOURCES: Forever<StackResources<1, 2, 8>> = Forever::new();
87
88fn config() -> Config { 39fn config() -> Config {
89 let mut config = Config::default(); 40 let mut config = Config::default();
90 config.rcc.sys_ck = Some(200.mhz().into()); 41 config.rcc.sys_ck = Some(200.mhz().into());
91 config 42 config
92} 43}
93 44
94#[entry] 45#[embassy::main(config = "config()")]
95fn main() -> ! { 46async fn main(spawner: Spawner, p: Peripherals) -> ! {
96 info!("Hello World!"); 47 info!("Hello World!");
97 48
98 info!("Setup RCC..."); 49 // Generate random seed.
99 50 let mut rng = Rng::new(p.RNG);
100 let p = embassy_stm32::init(config()); 51 let mut seed = [0; 8];
101 52 rng.fill_bytes(&mut seed);
102 let rng = Rng::new(p.RNG); 53 let seed = u64::from_le_bytes(seed);
103 unsafe {
104 RNG_INST.replace(rng);
105 }
106 54
107 let eth_int = interrupt::take!(ETH); 55 let eth_int = interrupt::take!(ETH);
108 let mac_addr = [0x00, 0x00, 0xDE, 0xAD, 0xBE, 0xEF]; 56 let mac_addr = [0x00, 0x00, 0xDE, 0xAD, 0xBE, 0xEF];
109 let state = STATE.put(State::new());
110 57
111 let eth = unsafe { 58 let device = unsafe {
112 ETH.put(Ethernet::new( 59 Ethernet::new(
113 state, p.ETH, eth_int, p.PA1, p.PA2, p.PC1, p.PA7, p.PC4, p.PC5, p.PG13, p.PB13, 60 forever!(State::new()),
114 p.PG11, GenericSMI, mac_addr, 0, 61 p.ETH,
115 )) 62 eth_int,
63 p.PA1,
64 p.PA2,
65 p.PC1,
66 p.PA7,
67 p.PC4,
68 p.PC5,
69 p.PG13,
70 p.PB13,
71 p.PG11,
72 GenericSMI,
73 mac_addr,
74 0,
75 )
116 }; 76 };
117 77
118 let config = StaticConfigurator::new(NetConfig { 78 let config = embassy_net::ConfigStrategy::Dhcp;
119 address: Ipv4Cidr::new(Ipv4Address::new(192, 168, 0, 61), 24), 79 //let config = embassy_net::ConfigStrategy::Static(embassy_net::Config {
120 dns_servers: Vec::new(), 80 // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24),
121 gateway: Some(Ipv4Address::new(192, 168, 0, 1)), 81 // dns_servers: Vec::new(),
122 }); 82 // gateway: Some(Ipv4Address::new(10, 42, 0, 1)),
83 //});
123 84
124 let config = CONFIG.put(config); 85 // Init network stack
86 let stack = &*forever!(Stack::new(
87 device,
88 config,
89 forever!(StackResources::<1, 2, 8>::new()),
90 seed
91 ));
125 92
126 let executor = EXECUTOR.put(Executor::new()); 93 // Launch network task
94 unwrap!(spawner.spawn(net_task(&stack)));
127 95
128 executor.run(move |spawner| { 96 info!("Network task initialized");
129 unwrap!(spawner.spawn(main_task(eth, config, spawner))); 97
130 }) 98 // Then we can use it!
99 let mut rx_buffer = [0; 1024];
100 let mut tx_buffer = [0; 1024];
101
102 loop {
103 let mut socket = TcpSocket::new(&stack, &mut rx_buffer, &mut tx_buffer);
104
105 socket.set_timeout(Some(embassy_net::SmolDuration::from_secs(10)));
106
107 let remote_endpoint = (Ipv4Address::new(10, 42, 0, 1), 8000);
108 info!("connecting...");
109 let r = socket.connect(remote_endpoint).await;
110 if let Err(e) = r {
111 info!("connect error: {:?}", e);
112 continue;
113 }
114 info!("connected!");
115 loop {
116 let r = socket.write_all(b"Hello\n").await;
117 if let Err(e) = r {
118 info!("write error: {:?}", e);
119 return;
120 }
121 Timer::after(Duration::from_secs(1)).await;
122 }
123 }
131} 124}