aboutsummaryrefslogtreecommitdiff
path: root/tests/nrf
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-08-18 14:20:44 +0000
committerGitHub <[email protected]>2023-08-18 14:20:44 +0000
commitf48d13a16a5bc9b1027ea39bfd86d548b460edd5 (patch)
tree309b2b32ade4d10a0ad2b43fe0fb761a47b83f11 /tests/nrf
parent4c11fffc90cd4b29d37e851bbdeabdaeaddc806a (diff)
parent7f97efd9222725d2f0a4582a64d8d8e5e0fa6b0f (diff)
Merge pull request #1796 from embassy-rs/enc28j60-fixes
enc28j60: add HIL test, workaround RX buffer corruption.
Diffstat (limited to 'tests/nrf')
-rw-r--r--tests/nrf/Cargo.toml1
-rw-r--r--tests/nrf/src/bin/buffered_uart.rs3
-rw-r--r--tests/nrf/src/bin/buffered_uart_spam.rs3
-rw-r--r--tests/nrf/src/bin/ethernet_enc28j60_perf.rs250
-rw-r--r--tests/nrf/src/bin/timer.rs3
-rw-r--r--tests/nrf/src/bin/wifi_esp_hosted_perf.rs7
-rw-r--r--tests/nrf/src/common.rs1
7 files changed, 256 insertions, 12 deletions
diff --git a/tests/nrf/Cargo.toml b/tests/nrf/Cargo.toml
index e2dab81af..034ed85ea 100644
--- a/tests/nrf/Cargo.toml
+++ b/tests/nrf/Cargo.toml
@@ -15,6 +15,7 @@ embassy-nrf = { version = "0.1.0", path = "../../embassy-nrf", features = ["defm
15embedded-io-async = { version = "0.5.0" } 15embedded-io-async = { version = "0.5.0" }
16embassy-net = { version = "0.1.0", path = "../../embassy-net", features = ["defmt", "tcp", "dhcpv4", "medium-ethernet", "nightly"] } 16embassy-net = { version = "0.1.0", path = "../../embassy-net", features = ["defmt", "tcp", "dhcpv4", "medium-ethernet", "nightly"] }
17embassy-net-esp-hosted = { version = "0.1.0", path = "../../embassy-net-esp-hosted", features = ["defmt"] } 17embassy-net-esp-hosted = { version = "0.1.0", path = "../../embassy-net-esp-hosted", features = ["defmt"] }
18embassy-net-enc28j60 = { version = "0.1.0", path = "../../embassy-net-enc28j60", features = ["defmt"] }
18embedded-hal-async = { version = "1.0.0-rc.1" } 19embedded-hal-async = { version = "1.0.0-rc.1" }
19embedded-hal-bus = { version = "0.1.0-rc.1", features = ["async"] } 20embedded-hal-bus = { version = "0.1.0-rc.1", features = ["async"] }
20static_cell = { version = "1.1", features = [ "nightly" ] } 21static_cell = { version = "1.1", features = [ "nightly" ] }
diff --git a/tests/nrf/src/bin/buffered_uart.rs b/tests/nrf/src/bin/buffered_uart.rs
index 72a4cb4ef..932e59264 100644
--- a/tests/nrf/src/bin/buffered_uart.rs
+++ b/tests/nrf/src/bin/buffered_uart.rs
@@ -1,8 +1,7 @@
1#![no_std] 1#![no_std]
2#![no_main] 2#![no_main]
3#![feature(type_alias_impl_trait)] 3#![feature(type_alias_impl_trait)]
4#[path = "../common.rs"] 4teleprobe_meta::target!(b"nrf52840-dk");
5mod common;
6 5
7use defmt::{assert_eq, *}; 6use defmt::{assert_eq, *};
8use embassy_executor::Spawner; 7use embassy_executor::Spawner;
diff --git a/tests/nrf/src/bin/buffered_uart_spam.rs b/tests/nrf/src/bin/buffered_uart_spam.rs
index 50960206f..8abeae6d4 100644
--- a/tests/nrf/src/bin/buffered_uart_spam.rs
+++ b/tests/nrf/src/bin/buffered_uart_spam.rs
@@ -1,8 +1,7 @@
1#![no_std] 1#![no_std]
2#![no_main] 2#![no_main]
3#![feature(type_alias_impl_trait)] 3#![feature(type_alias_impl_trait)]
4#[path = "../common.rs"] 4teleprobe_meta::target!(b"nrf52840-dk");
5mod common;
6 5
7use core::mem; 6use core::mem;
8use core::ptr::NonNull; 7use core::ptr::NonNull;
diff --git a/tests/nrf/src/bin/ethernet_enc28j60_perf.rs b/tests/nrf/src/bin/ethernet_enc28j60_perf.rs
new file mode 100644
index 000000000..0446d39ac
--- /dev/null
+++ b/tests/nrf/src/bin/ethernet_enc28j60_perf.rs
@@ -0,0 +1,250 @@
1#![no_std]
2#![no_main]
3#![feature(type_alias_impl_trait)]
4teleprobe_meta::target!(b"ak-gwe-r7");
5teleprobe_meta::timeout!(120);
6
7use defmt::{error, info, unwrap};
8use embassy_executor::Spawner;
9use embassy_futures::join::join;
10use embassy_net::tcp::TcpSocket;
11use embassy_net::{Ipv4Address, Stack, StackResources};
12use embassy_net_enc28j60::Enc28j60;
13use embassy_nrf::gpio::{Level, Output, OutputDrive};
14use embassy_nrf::rng::Rng;
15use embassy_nrf::spim::{self, Spim};
16use embassy_nrf::{bind_interrupts, peripherals};
17use embassy_time::{with_timeout, Delay, Duration, Timer};
18use embedded_hal_bus::spi::ExclusiveDevice;
19use static_cell::make_static;
20use {defmt_rtt as _, panic_probe as _};
21
22bind_interrupts!(struct Irqs {
23 SPIM3 => spim::InterruptHandler<peripherals::SPI3>;
24 RNG => embassy_nrf::rng::InterruptHandler<peripherals::RNG>;
25});
26
27type MyDriver = Enc28j60<
28 ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static, peripherals::P0_15>, Delay>,
29 Output<'static, peripherals::P0_13>,
30>;
31
32#[embassy_executor::task]
33async fn net_task(stack: &'static Stack<MyDriver>) -> ! {
34 stack.run().await
35}
36
37#[embassy_executor::main]
38async fn main(spawner: Spawner) {
39 let p = embassy_nrf::init(Default::default());
40 info!("running!");
41
42 let eth_sck = p.P0_20;
43 let eth_mosi = p.P0_22;
44 let eth_miso = p.P0_24;
45 let eth_cs = p.P0_15;
46 let eth_rst = p.P0_13;
47 let _eth_irq = p.P0_12;
48
49 let mut config = spim::Config::default();
50 config.frequency = spim::Frequency::M16;
51 let spi = spim::Spim::new(p.SPI3, Irqs, eth_sck, eth_miso, eth_mosi, config);
52 let cs = Output::new(eth_cs, Level::High, OutputDrive::Standard);
53 let spi = ExclusiveDevice::new(spi, cs, Delay);
54
55 let rst = Output::new(eth_rst, Level::High, OutputDrive::Standard);
56 let mac_addr = [2, 3, 4, 5, 6, 7];
57 let device = Enc28j60::new(spi, Some(rst), mac_addr);
58
59 let config = embassy_net::Config::dhcpv4(Default::default());
60 // let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 {
61 // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24),
62 // dns_servers: Vec::new(),
63 // gateway: Some(Ipv4Address::new(10, 42, 0, 1)),
64 // });
65
66 // Generate random seed
67 let mut rng = Rng::new(p.RNG, Irqs);
68 let mut seed = [0; 8];
69 rng.blocking_fill_bytes(&mut seed);
70 let seed = u64::from_le_bytes(seed);
71
72 // Init network stack
73 let stack = &*make_static!(Stack::new(
74 device,
75 config,
76 make_static!(StackResources::<2>::new()),
77 seed
78 ));
79
80 unwrap!(spawner.spawn(net_task(stack)));
81
82 info!("Waiting for DHCP up...");
83 while stack.config_v4().is_none() {
84 Timer::after(Duration::from_millis(100)).await;
85 }
86 info!("IP addressing up!");
87
88 let down = test_download(stack).await;
89 let up = test_upload(stack).await;
90 let updown = test_upload_download(stack).await;
91
92 assert!(down > TEST_EXPECTED_DOWNLOAD_KBPS);
93 assert!(up > TEST_EXPECTED_UPLOAD_KBPS);
94 assert!(updown > TEST_EXPECTED_UPLOAD_DOWNLOAD_KBPS);
95
96 info!("Test OK");
97 cortex_m::asm::bkpt();
98}
99
100const TEST_DURATION: usize = 10;
101const TEST_EXPECTED_DOWNLOAD_KBPS: usize = 200;
102const TEST_EXPECTED_UPLOAD_KBPS: usize = 200;
103const TEST_EXPECTED_UPLOAD_DOWNLOAD_KBPS: usize = 150;
104const RX_BUFFER_SIZE: usize = 4096;
105const TX_BUFFER_SIZE: usize = 4096;
106const SERVER_ADDRESS: Ipv4Address = Ipv4Address::new(192, 168, 2, 2);
107const DOWNLOAD_PORT: u16 = 4321;
108const UPLOAD_PORT: u16 = 4322;
109const UPLOAD_DOWNLOAD_PORT: u16 = 4323;
110
111async fn test_download(stack: &'static Stack<MyDriver>) -> usize {
112 info!("Testing download...");
113
114 let mut rx_buffer = [0; RX_BUFFER_SIZE];
115 let mut tx_buffer = [0; TX_BUFFER_SIZE];
116 let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer);
117 socket.set_timeout(Some(Duration::from_secs(10)));
118
119 info!("connecting to {:?}:{}...", SERVER_ADDRESS, DOWNLOAD_PORT);
120 if let Err(e) = socket.connect((SERVER_ADDRESS, DOWNLOAD_PORT)).await {
121 error!("connect error: {:?}", e);
122 return 0;
123 }
124 info!("connected, testing...");
125
126 let mut rx_buf = [0; 4096];
127 let mut total: usize = 0;
128 with_timeout(Duration::from_secs(TEST_DURATION as _), async {
129 loop {
130 match socket.read(&mut rx_buf).await {
131 Ok(0) => {
132 error!("read EOF");
133 return 0;
134 }
135 Ok(n) => total += n,
136 Err(e) => {
137 error!("read error: {:?}", e);
138 return 0;
139 }
140 }
141 }
142 })
143 .await
144 .ok();
145
146 let kbps = (total + 512) / 1024 / TEST_DURATION;
147 info!("download: {} kB/s", kbps);
148 kbps
149}
150
151async fn test_upload(stack: &'static Stack<MyDriver>) -> usize {
152 info!("Testing upload...");
153
154 let mut rx_buffer = [0; RX_BUFFER_SIZE];
155 let mut tx_buffer = [0; TX_BUFFER_SIZE];
156 let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer);
157 socket.set_timeout(Some(Duration::from_secs(10)));
158
159 info!("connecting to {:?}:{}...", SERVER_ADDRESS, UPLOAD_PORT);
160 if let Err(e) = socket.connect((SERVER_ADDRESS, UPLOAD_PORT)).await {
161 error!("connect error: {:?}", e);
162 return 0;
163 }
164 info!("connected, testing...");
165
166 let buf = [0; 4096];
167 let mut total: usize = 0;
168 with_timeout(Duration::from_secs(TEST_DURATION as _), async {
169 loop {
170 match socket.write(&buf).await {
171 Ok(0) => {
172 error!("write zero?!??!?!");
173 return 0;
174 }
175 Ok(n) => total += n,
176 Err(e) => {
177 error!("write error: {:?}", e);
178 return 0;
179 }
180 }
181 }
182 })
183 .await
184 .ok();
185
186 let kbps = (total + 512) / 1024 / TEST_DURATION;
187 info!("upload: {} kB/s", kbps);
188 kbps
189}
190
191async fn test_upload_download(stack: &'static Stack<MyDriver>) -> usize {
192 info!("Testing upload+download...");
193
194 let mut rx_buffer = [0; RX_BUFFER_SIZE];
195 let mut tx_buffer = [0; TX_BUFFER_SIZE];
196 let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer);
197 socket.set_timeout(Some(Duration::from_secs(10)));
198
199 info!("connecting to {:?}:{}...", SERVER_ADDRESS, UPLOAD_DOWNLOAD_PORT);
200 if let Err(e) = socket.connect((SERVER_ADDRESS, UPLOAD_DOWNLOAD_PORT)).await {
201 error!("connect error: {:?}", e);
202 return 0;
203 }
204 info!("connected, testing...");
205
206 let (mut reader, mut writer) = socket.split();
207
208 let tx_buf = [0; 4096];
209 let mut rx_buf = [0; 4096];
210 let mut total: usize = 0;
211 let tx_fut = async {
212 loop {
213 match writer.write(&tx_buf).await {
214 Ok(0) => {
215 error!("write zero?!??!?!");
216 return 0;
217 }
218 Ok(_) => {}
219 Err(e) => {
220 error!("write error: {:?}", e);
221 return 0;
222 }
223 }
224 }
225 };
226
227 let rx_fut = async {
228 loop {
229 match reader.read(&mut rx_buf).await {
230 Ok(0) => {
231 error!("read EOF");
232 return 0;
233 }
234 Ok(n) => total += n,
235 Err(e) => {
236 error!("read error: {:?}", e);
237 return 0;
238 }
239 }
240 }
241 };
242
243 with_timeout(Duration::from_secs(TEST_DURATION as _), join(tx_fut, rx_fut))
244 .await
245 .ok();
246
247 let kbps = (total + 512) / 1024 / TEST_DURATION;
248 info!("upload+download: {} kB/s", kbps);
249 kbps
250}
diff --git a/tests/nrf/src/bin/timer.rs b/tests/nrf/src/bin/timer.rs
index 607c5bbf1..c00f35fd1 100644
--- a/tests/nrf/src/bin/timer.rs
+++ b/tests/nrf/src/bin/timer.rs
@@ -1,8 +1,7 @@
1#![no_std] 1#![no_std]
2#![no_main] 2#![no_main]
3#![feature(type_alias_impl_trait)] 3#![feature(type_alias_impl_trait)]
4#[path = "../common.rs"] 4teleprobe_meta::target!(b"nrf52840-dk");
5mod common;
6 5
7use defmt::{assert, info}; 6use defmt::{assert, info};
8use embassy_executor::Spawner; 7use embassy_executor::Spawner;
diff --git a/tests/nrf/src/bin/wifi_esp_hosted_perf.rs b/tests/nrf/src/bin/wifi_esp_hosted_perf.rs
index 16055fae8..ee46af2a3 100644
--- a/tests/nrf/src/bin/wifi_esp_hosted_perf.rs
+++ b/tests/nrf/src/bin/wifi_esp_hosted_perf.rs
@@ -1,9 +1,8 @@
1#![no_std] 1#![no_std]
2#![no_main] 2#![no_main]
3#![feature(type_alias_impl_trait)] 3#![feature(type_alias_impl_trait)]
4 4teleprobe_meta::target!(b"nrf52840-dk");
5#[path = "../common.rs"] 5teleprobe_meta::timeout!(120);
6mod common;
7 6
8use defmt::{error, info, unwrap}; 7use defmt::{error, info, unwrap};
9use embassy_executor::Spawner; 8use embassy_executor::Spawner;
@@ -19,8 +18,6 @@ use embedded_hal_bus::spi::ExclusiveDevice;
19use static_cell::make_static; 18use static_cell::make_static;
20use {defmt_rtt as _, embassy_net_esp_hosted as hosted, panic_probe as _}; 19use {defmt_rtt as _, embassy_net_esp_hosted as hosted, panic_probe as _};
21 20
22teleprobe_meta::timeout!(120);
23
24bind_interrupts!(struct Irqs { 21bind_interrupts!(struct Irqs {
25 SPIM3 => spim::InterruptHandler<peripherals::SPI3>; 22 SPIM3 => spim::InterruptHandler<peripherals::SPI3>;
26 RNG => embassy_nrf::rng::InterruptHandler<peripherals::RNG>; 23 RNG => embassy_nrf::rng::InterruptHandler<peripherals::RNG>;
diff --git a/tests/nrf/src/common.rs b/tests/nrf/src/common.rs
deleted file mode 100644
index 1a05ac1c5..000000000
--- a/tests/nrf/src/common.rs
+++ /dev/null
@@ -1 +0,0 @@
1teleprobe_meta::target!(b"nrf52840-dk");