aboutsummaryrefslogtreecommitdiff
path: root/tests/nrf/src
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2024-06-25 22:27:56 +0200
committerDario Nieuwenhuis <[email protected]>2024-06-25 22:29:07 +0200
commitcab17434d5411558e7fb9f260665ec8da88118a9 (patch)
tree4494cfc59064cfa896e3f9ce530d6fd4ccbcfcd9 /tests/nrf/src
parent3ae2f140f9c794577b5bc10c43c21b9824dc3b9a (diff)
tests/nrf: unify, add nrf52832, nrf52833, nrf5340, nrf9160
Diffstat (limited to 'tests/nrf/src')
-rw-r--r--tests/nrf/src/bin/buffered_uart.rs82
-rw-r--r--tests/nrf/src/bin/buffered_uart_full.rs72
-rw-r--r--tests/nrf/src/bin/buffered_uart_halves.rs83
-rw-r--r--tests/nrf/src/bin/buffered_uart_spam.rs92
-rw-r--r--tests/nrf/src/bin/ethernet_enc28j60_perf.rs91
-rw-r--r--tests/nrf/src/bin/gpio.rs29
-rw-r--r--tests/nrf/src/bin/gpiote.rs50
-rw-r--r--tests/nrf/src/bin/timer.rs26
-rw-r--r--tests/nrf/src/bin/wifi_esp_hosted_perf.rs112
-rw-r--r--tests/nrf/src/common.rs65
10 files changed, 702 insertions, 0 deletions
diff --git a/tests/nrf/src/bin/buffered_uart.rs b/tests/nrf/src/bin/buffered_uart.rs
new file mode 100644
index 000000000..89314bfc9
--- /dev/null
+++ b/tests/nrf/src/bin/buffered_uart.rs
@@ -0,0 +1,82 @@
1// required-features: nrf52840
2#![no_std]
3#![no_main]
4teleprobe_meta::target!(b"nrf52840-dk");
5
6use defmt::{assert_eq, *};
7use embassy_executor::Spawner;
8use embassy_futures::join::join;
9use embassy_nrf::buffered_uarte::{self, BufferedUarte};
10use embassy_nrf::{bind_interrupts, peripherals, uarte};
11use {defmt_rtt as _, panic_probe as _};
12
13bind_interrupts!(struct Irqs {
14 UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>;
15});
16
17#[embassy_executor::main]
18async fn main(_spawner: Spawner) {
19 let mut p = embassy_nrf::init(Default::default());
20 let mut config = uarte::Config::default();
21 config.parity = uarte::Parity::EXCLUDED;
22 config.baudrate = uarte::Baudrate::BAUD1M;
23
24 let mut tx_buffer = [0u8; 1024];
25 let mut rx_buffer = [0u8; 1024];
26
27 // test teardown + recreate of the buffereduarte works fine.
28 for _ in 0..2 {
29 let u = BufferedUarte::new(
30 &mut p.UARTE0,
31 &mut p.TIMER0,
32 &mut p.PPI_CH0,
33 &mut p.PPI_CH1,
34 &mut p.PPI_GROUP0,
35 Irqs,
36 &mut p.P1_03,
37 &mut p.P1_02,
38 config.clone(),
39 &mut rx_buffer,
40 &mut tx_buffer,
41 );
42
43 info!("uarte initialized!");
44
45 let (mut rx, mut tx) = u.split();
46
47 const COUNT: usize = 40_000;
48
49 let tx_fut = async {
50 let mut tx_buf = [0; 215];
51 let mut i = 0;
52 while i < COUNT {
53 let n = tx_buf.len().min(COUNT - i);
54 let tx_buf = &mut tx_buf[..n];
55 for (j, b) in tx_buf.iter_mut().enumerate() {
56 *b = (i + j) as u8;
57 }
58 let n = unwrap!(tx.write(tx_buf).await);
59 i += n;
60 }
61 };
62 let rx_fut = async {
63 let mut i = 0;
64 while i < COUNT {
65 let buf = unwrap!(rx.fill_buf().await);
66
67 for &b in buf {
68 assert_eq!(b, i as u8);
69 i = i + 1;
70 }
71
72 let n = buf.len();
73 rx.consume(n);
74 }
75 };
76
77 join(rx_fut, tx_fut).await;
78 }
79
80 info!("Test OK");
81 cortex_m::asm::bkpt();
82}
diff --git a/tests/nrf/src/bin/buffered_uart_full.rs b/tests/nrf/src/bin/buffered_uart_full.rs
new file mode 100644
index 000000000..a7d9a3717
--- /dev/null
+++ b/tests/nrf/src/bin/buffered_uart_full.rs
@@ -0,0 +1,72 @@
1// required-features: nrf52840
2#![no_std]
3#![no_main]
4teleprobe_meta::target!(b"nrf52840-dk");
5
6use defmt::{assert_eq, *};
7use embassy_executor::Spawner;
8use embassy_nrf::buffered_uarte::{self, BufferedUarte};
9use embassy_nrf::{bind_interrupts, peripherals, uarte};
10use embedded_io_async::{Read, Write};
11use {defmt_rtt as _, panic_probe as _};
12
13bind_interrupts!(struct Irqs {
14 UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>;
15});
16
17#[embassy_executor::main]
18async fn main(_spawner: Spawner) {
19 let p = embassy_nrf::init(Default::default());
20 let mut config = uarte::Config::default();
21 config.parity = uarte::Parity::EXCLUDED;
22 config.baudrate = uarte::Baudrate::BAUD1M;
23
24 let mut tx_buffer = [0u8; 1024];
25 let mut rx_buffer = [0u8; 1024];
26
27 let u = BufferedUarte::new(
28 p.UARTE0,
29 p.TIMER0,
30 p.PPI_CH0,
31 p.PPI_CH1,
32 p.PPI_GROUP0,
33 Irqs,
34 p.P1_03,
35 p.P1_02,
36 config.clone(),
37 &mut rx_buffer,
38 &mut tx_buffer,
39 );
40
41 info!("uarte initialized!");
42
43 let (mut rx, mut tx) = u.split();
44
45 let mut buf = [0; 1024];
46 for (j, b) in buf.iter_mut().enumerate() {
47 *b = j as u8;
48 }
49
50 // Write 1024b. This causes the rx buffer to get exactly full.
51 unwrap!(tx.write_all(&buf).await);
52 unwrap!(tx.flush().await);
53
54 // Read those 1024b.
55 unwrap!(rx.read_exact(&mut buf).await);
56 for (j, b) in buf.iter().enumerate() {
57 assert_eq!(*b, j as u8);
58 }
59
60 // The buffer should now be unclogged. Write 1024b again.
61 unwrap!(tx.write_all(&buf).await);
62 unwrap!(tx.flush().await);
63
64 // Read should work again.
65 unwrap!(rx.read_exact(&mut buf).await);
66 for (j, b) in buf.iter().enumerate() {
67 assert_eq!(*b, j as u8);
68 }
69
70 info!("Test OK");
71 cortex_m::asm::bkpt();
72}
diff --git a/tests/nrf/src/bin/buffered_uart_halves.rs b/tests/nrf/src/bin/buffered_uart_halves.rs
new file mode 100644
index 000000000..ae1021f04
--- /dev/null
+++ b/tests/nrf/src/bin/buffered_uart_halves.rs
@@ -0,0 +1,83 @@
1// required-features: nrf52840
2#![no_std]
3#![no_main]
4teleprobe_meta::target!(b"nrf52840-dk");
5
6use defmt::{assert_eq, *};
7use embassy_executor::Spawner;
8use embassy_futures::join::join;
9use embassy_nrf::buffered_uarte::{self, BufferedUarteRx, BufferedUarteTx};
10use embassy_nrf::{bind_interrupts, peripherals, uarte};
11use {defmt_rtt as _, panic_probe as _};
12
13bind_interrupts!(struct Irqs {
14 UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>;
15 UARTE1 => buffered_uarte::InterruptHandler<peripherals::UARTE1>;
16});
17
18#[embassy_executor::main]
19async fn main(_spawner: Spawner) {
20 let mut p = embassy_nrf::init(Default::default());
21 let mut config = uarte::Config::default();
22 config.parity = uarte::Parity::EXCLUDED;
23 config.baudrate = uarte::Baudrate::BAUD1M;
24
25 let mut tx_buffer = [0u8; 1024];
26 let mut rx_buffer = [0u8; 1024];
27
28 // test teardown + recreate of the buffereduarte works fine.
29 for _ in 0..2 {
30 const COUNT: usize = 40_000;
31
32 let mut tx = BufferedUarteTx::new(&mut p.UARTE1, Irqs, &mut p.P1_02, config.clone(), &mut tx_buffer);
33
34 let mut rx = BufferedUarteRx::new(
35 &mut p.UARTE0,
36 &mut p.TIMER0,
37 &mut p.PPI_CH0,
38 &mut p.PPI_CH1,
39 &mut p.PPI_GROUP0,
40 Irqs,
41 &mut p.P1_03,
42 config.clone(),
43 &mut rx_buffer,
44 );
45
46 let tx_fut = async {
47 info!("tx initialized!");
48
49 let mut tx_buf = [0; 215];
50 let mut i = 0;
51 while i < COUNT {
52 let n = tx_buf.len().min(COUNT - i);
53 let tx_buf = &mut tx_buf[..n];
54 for (j, b) in tx_buf.iter_mut().enumerate() {
55 *b = (i + j) as u8;
56 }
57 let n = unwrap!(tx.write(tx_buf).await);
58 i += n;
59 }
60 };
61 let rx_fut = async {
62 info!("rx initialized!");
63
64 let mut i = 0;
65 while i < COUNT {
66 let buf = unwrap!(rx.fill_buf().await);
67
68 for &b in buf {
69 assert_eq!(b, i as u8);
70 i = i + 1;
71 }
72
73 let n = buf.len();
74 rx.consume(n);
75 }
76 };
77
78 join(rx_fut, tx_fut).await;
79 }
80
81 info!("Test OK");
82 cortex_m::asm::bkpt();
83}
diff --git a/tests/nrf/src/bin/buffered_uart_spam.rs b/tests/nrf/src/bin/buffered_uart_spam.rs
new file mode 100644
index 000000000..906723229
--- /dev/null
+++ b/tests/nrf/src/bin/buffered_uart_spam.rs
@@ -0,0 +1,92 @@
1// required-features: nrf52840
2#![no_std]
3#![no_main]
4teleprobe_meta::target!(b"nrf52840-dk");
5
6use core::mem;
7use core::ptr::NonNull;
8
9use defmt::{assert_eq, *};
10use embassy_executor::Spawner;
11use embassy_nrf::buffered_uarte::{self, BufferedUarte};
12use embassy_nrf::gpio::{Level, Output, OutputDrive};
13use embassy_nrf::ppi::{Event, Ppi, Task};
14use embassy_nrf::uarte::Uarte;
15use embassy_nrf::{bind_interrupts, pac, peripherals, uarte};
16use embassy_time::Timer;
17use {defmt_rtt as _, panic_probe as _};
18
19bind_interrupts!(struct Irqs {
20 UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>;
21 UARTE1 => uarte::InterruptHandler<peripherals::UARTE1>;
22});
23
24#[embassy_executor::main]
25async fn main(_spawner: Spawner) {
26 let mut p = embassy_nrf::init(Default::default());
27 let mut config = uarte::Config::default();
28 config.parity = uarte::Parity::EXCLUDED;
29 config.baudrate = uarte::Baudrate::BAUD1M;
30
31 let mut tx_buffer = [0u8; 1024];
32 let mut rx_buffer = [0u8; 1024];
33
34 mem::forget(Output::new(&mut p.P1_02, Level::High, OutputDrive::Standard));
35
36 let mut u = BufferedUarte::new(
37 p.UARTE0,
38 p.TIMER0,
39 p.PPI_CH0,
40 p.PPI_CH1,
41 p.PPI_GROUP0,
42 Irqs,
43 p.P1_03,
44 p.P1_04,
45 config.clone(),
46 &mut rx_buffer,
47 &mut tx_buffer,
48 );
49
50 info!("uarte initialized!");
51
52 // uarte needs some quiet time to start rxing properly.
53 Timer::after_millis(10).await;
54
55 // Tx spam in a loop.
56 const NSPAM: usize = 17;
57 static mut TX_BUF: [u8; NSPAM] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
58 let _spam = Uarte::new(p.UARTE1, Irqs, p.P1_01, p.P1_02, config.clone());
59 let spam_peri: pac::UARTE1 = unsafe { mem::transmute(()) };
60 let event = unsafe { Event::new_unchecked(NonNull::new_unchecked(&spam_peri.events_endtx as *const _ as _)) };
61 let task = unsafe { Task::new_unchecked(NonNull::new_unchecked(&spam_peri.tasks_starttx as *const _ as _)) };
62 let mut spam_ppi = Ppi::new_one_to_one(p.PPI_CH2, event, task);
63 spam_ppi.enable();
64 let p = unsafe { TX_BUF.as_mut_ptr() };
65 spam_peri.txd.ptr.write(|w| unsafe { w.ptr().bits(p as u32) });
66 spam_peri.txd.maxcnt.write(|w| unsafe { w.maxcnt().bits(NSPAM as _) });
67 spam_peri.tasks_starttx.write(|w| unsafe { w.bits(1) });
68
69 let mut i = 0;
70 let mut total = 0;
71 while total < 256 * 1024 {
72 let buf = unwrap!(u.fill_buf().await);
73 //info!("rx {}", buf);
74
75 for &b in buf {
76 assert_eq!(b, unsafe { TX_BUF[i] });
77
78 i = i + 1;
79 if i == NSPAM {
80 i = 0;
81 }
82 }
83
84 // Read bytes have to be explicitly consumed, otherwise fill_buf() will return them again
85 let n = buf.len();
86 u.consume(n);
87 total += n;
88 }
89
90 info!("Test OK");
91 cortex_m::asm::bkpt();
92}
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..5f4220b1e
--- /dev/null
+++ b/tests/nrf/src/bin/ethernet_enc28j60_perf.rs
@@ -0,0 +1,91 @@
1// required-features: nrf52840
2#![no_std]
3#![no_main]
4teleprobe_meta::target!(b"ak-gwe-r7");
5teleprobe_meta::timeout!(120);
6
7use defmt::{info, unwrap};
8use embassy_executor::Spawner;
9use embassy_net::{Stack, StackResources};
10use embassy_net_enc28j60::Enc28j60;
11use embassy_nrf::gpio::{Level, Output, OutputDrive};
12use embassy_nrf::rng::Rng;
13use embassy_nrf::spim::{self, Spim};
14use embassy_nrf::{bind_interrupts, peripherals};
15use embassy_time::Delay;
16use embedded_hal_bus::spi::ExclusiveDevice;
17use static_cell::StaticCell;
18use {defmt_rtt as _, panic_probe as _};
19
20bind_interrupts!(struct Irqs {
21 SPIM3 => spim::InterruptHandler<peripherals::SPI3>;
22 RNG => embassy_nrf::rng::InterruptHandler<peripherals::RNG>;
23});
24
25type MyDriver = Enc28j60<ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static>, Delay>, Output<'static>>;
26
27#[embassy_executor::task]
28async fn net_task(stack: &'static Stack<MyDriver>) -> ! {
29 stack.run().await
30}
31
32#[embassy_executor::main]
33async fn main(spawner: Spawner) {
34 let p = embassy_nrf::init(Default::default());
35 info!("running!");
36
37 let eth_sck = p.P0_20;
38 let eth_mosi = p.P0_22;
39 let eth_miso = p.P0_24;
40 let eth_cs = p.P0_15;
41 let eth_rst = p.P0_13;
42 let _eth_irq = p.P0_12;
43
44 let mut config = spim::Config::default();
45 config.frequency = spim::Frequency::M16;
46 let spi = spim::Spim::new(p.SPI3, Irqs, eth_sck, eth_miso, eth_mosi, config);
47 let cs = Output::new(eth_cs, Level::High, OutputDrive::Standard);
48 let spi = ExclusiveDevice::new(spi, cs, Delay);
49
50 let rst = Output::new(eth_rst, Level::High, OutputDrive::Standard);
51 let mac_addr = [2, 3, 4, 5, 6, 7];
52 let device = Enc28j60::new(spi, Some(rst), mac_addr);
53
54 let config = embassy_net::Config::dhcpv4(Default::default());
55 // let config = embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 {
56 // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24),
57 // dns_servers: Vec::new(),
58 // gateway: Some(Ipv4Address::new(10, 42, 0, 1)),
59 // });
60
61 // Generate random seed
62 let mut rng = Rng::new(p.RNG, Irqs);
63 let mut seed = [0; 8];
64 rng.blocking_fill_bytes(&mut seed);
65 let seed = u64::from_le_bytes(seed);
66
67 // Init network stack
68 static STACK: StaticCell<Stack<MyDriver>> = StaticCell::new();
69 static RESOURCES: StaticCell<StackResources<2>> = StaticCell::new();
70 let stack = &*STACK.init(Stack::new(
71 device,
72 config,
73 RESOURCES.init(StackResources::<2>::new()),
74 seed,
75 ));
76
77 unwrap!(spawner.spawn(net_task(stack)));
78
79 perf_client::run(
80 stack,
81 perf_client::Expected {
82 down_kbps: 200,
83 up_kbps: 200,
84 updown_kbps: 150,
85 },
86 )
87 .await;
88
89 info!("Test OK");
90 cortex_m::asm::bkpt();
91}
diff --git a/tests/nrf/src/bin/gpio.rs b/tests/nrf/src/bin/gpio.rs
new file mode 100644
index 000000000..9e809a694
--- /dev/null
+++ b/tests/nrf/src/bin/gpio.rs
@@ -0,0 +1,29 @@
1#![no_std]
2#![no_main]
3
4#[path = "../common.rs"]
5mod common;
6
7use defmt::{assert, info};
8use embassy_executor::Spawner;
9use embassy_nrf::gpio::{Input, Level, Output, OutputDrive, Pull};
10use embassy_time::Timer;
11
12#[embassy_executor::main]
13async fn main(_spawner: Spawner) {
14 let p = embassy_nrf::init(Default::default());
15
16 let input = Input::new(peri!(p, PIN_A), Pull::Up);
17 let mut output = Output::new(peri!(p, PIN_B), Level::Low, OutputDrive::Standard);
18
19 output.set_low();
20 Timer::after_millis(10).await;
21 assert!(input.is_low());
22
23 output.set_high();
24 Timer::after_millis(10).await;
25 assert!(input.is_high());
26
27 info!("Test OK");
28 cortex_m::asm::bkpt();
29}
diff --git a/tests/nrf/src/bin/gpiote.rs b/tests/nrf/src/bin/gpiote.rs
new file mode 100644
index 000000000..0700016d1
--- /dev/null
+++ b/tests/nrf/src/bin/gpiote.rs
@@ -0,0 +1,50 @@
1#![no_std]
2#![no_main]
3
4#[path = "../common.rs"]
5mod common;
6
7use defmt::{assert, info};
8use embassy_executor::Spawner;
9use embassy_futures::join::join;
10use embassy_nrf::gpio::{Input, Level, Output, OutputDrive, Pull};
11use embassy_time::{Duration, Instant, Timer};
12
13#[embassy_executor::main]
14async fn main(_spawner: Spawner) {
15 let p = embassy_nrf::init(Default::default());
16
17 let mut input = Input::new(peri!(p, PIN_A), Pull::Up);
18 let mut output = Output::new(peri!(p, PIN_B), Level::Low, OutputDrive::Standard);
19
20 let fut1 = async {
21 Timer::after_millis(100).await;
22 output.set_high();
23 };
24 let fut2 = async {
25 let start = Instant::now();
26 input.wait_for_high().await;
27 let dur = Instant::now() - start;
28 info!("took {} ms", dur.as_millis());
29 assert!((Duration::from_millis(90)..Duration::from_millis(110)).contains(&dur));
30 };
31
32 join(fut1, fut2).await;
33
34 let fut1 = async {
35 Timer::after_millis(100).await;
36 output.set_low();
37 };
38 let fut2 = async {
39 let start = Instant::now();
40 input.wait_for_low().await;
41 let dur = Instant::now() - start;
42 info!("took {} ms", dur.as_millis());
43 assert!((Duration::from_millis(90)..Duration::from_millis(110)).contains(&dur));
44 };
45
46 join(fut1, fut2).await;
47
48 info!("Test OK");
49 cortex_m::asm::bkpt();
50}
diff --git a/tests/nrf/src/bin/timer.rs b/tests/nrf/src/bin/timer.rs
new file mode 100644
index 000000000..1ae9dd647
--- /dev/null
+++ b/tests/nrf/src/bin/timer.rs
@@ -0,0 +1,26 @@
1#![no_std]
2#![no_main]
3
4#[path = "../common.rs"]
5mod common;
6
7use defmt::{assert, info};
8use embassy_executor::Spawner;
9use embassy_time::{Instant, Timer};
10use {defmt_rtt as _, panic_probe as _};
11
12#[embassy_executor::main]
13async fn main(_spawner: Spawner) {
14 let _p = embassy_nrf::init(Default::default());
15 info!("Hello World!");
16
17 let start = Instant::now();
18 Timer::after_millis(100).await;
19 let end = Instant::now();
20 let ms = (end - start).as_millis();
21 info!("slept for {} ms", ms);
22 assert!(ms >= 99);
23
24 info!("Test OK");
25 cortex_m::asm::bkpt();
26}
diff --git a/tests/nrf/src/bin/wifi_esp_hosted_perf.rs b/tests/nrf/src/bin/wifi_esp_hosted_perf.rs
new file mode 100644
index 000000000..a6c93c8a6
--- /dev/null
+++ b/tests/nrf/src/bin/wifi_esp_hosted_perf.rs
@@ -0,0 +1,112 @@
1// required-features: nrf52840
2#![no_std]
3#![no_main]
4teleprobe_meta::target!(b"nrf52840-dk");
5teleprobe_meta::timeout!(120);
6
7use defmt::{info, unwrap};
8use embassy_executor::Spawner;
9use embassy_net::{Config, Stack, StackResources};
10use embassy_nrf::gpio::{Input, Level, Output, OutputDrive, Pull};
11use embassy_nrf::rng::Rng;
12use embassy_nrf::spim::{self, Spim};
13use embassy_nrf::{bind_interrupts, peripherals};
14use embassy_time::Delay;
15use embedded_hal_bus::spi::ExclusiveDevice;
16use static_cell::StaticCell;
17use {defmt_rtt as _, embassy_net_esp_hosted as hosted, panic_probe as _};
18
19bind_interrupts!(struct Irqs {
20 SPIM3 => spim::InterruptHandler<peripherals::SPI3>;
21 RNG => embassy_nrf::rng::InterruptHandler<peripherals::RNG>;
22});
23
24// Test-only wifi network, no internet access!
25const WIFI_NETWORK: &str = "EmbassyTest";
26const WIFI_PASSWORD: &str = "V8YxhKt5CdIAJFud";
27
28#[embassy_executor::task]
29async fn wifi_task(
30 runner: hosted::Runner<
31 'static,
32 ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static>, Delay>,
33 Input<'static>,
34 Output<'static>,
35 >,
36) -> ! {
37 runner.run().await
38}
39
40type MyDriver = hosted::NetDriver<'static>;
41
42#[embassy_executor::task]
43async fn net_task(stack: &'static Stack<MyDriver>) -> ! {
44 stack.run().await
45}
46
47#[embassy_executor::main]
48async fn main(spawner: Spawner) {
49 info!("Hello World!");
50
51 let p = embassy_nrf::init(Default::default());
52
53 let miso = p.P0_28;
54 let sck = p.P0_29;
55 let mosi = p.P0_30;
56 let cs = Output::new(p.P0_31, Level::High, OutputDrive::HighDrive);
57 let handshake = Input::new(p.P1_01, Pull::Up);
58 let ready = Input::new(p.P1_04, Pull::None);
59 let reset = Output::new(p.P1_05, Level::Low, OutputDrive::Standard);
60
61 let mut config = spim::Config::default();
62 config.frequency = spim::Frequency::M32;
63 config.mode = spim::MODE_2; // !!!
64 let spi = spim::Spim::new(p.SPI3, Irqs, sck, miso, mosi, config);
65 let spi = ExclusiveDevice::new(spi, cs, Delay);
66
67 static STATE: StaticCell<embassy_net_esp_hosted::State> = StaticCell::new();
68 let (device, mut control, runner) = embassy_net_esp_hosted::new(
69 STATE.init(embassy_net_esp_hosted::State::new()),
70 spi,
71 handshake,
72 ready,
73 reset,
74 )
75 .await;
76
77 unwrap!(spawner.spawn(wifi_task(runner)));
78
79 unwrap!(control.init().await);
80 unwrap!(control.connect(WIFI_NETWORK, WIFI_PASSWORD).await);
81
82 // Generate random seed
83 let mut rng = Rng::new(p.RNG, Irqs);
84 let mut seed = [0; 8];
85 rng.blocking_fill_bytes(&mut seed);
86 let seed = u64::from_le_bytes(seed);
87
88 // Init network stack
89 static STACK: StaticCell<Stack<MyDriver>> = StaticCell::new();
90 static RESOURCES: StaticCell<StackResources<2>> = StaticCell::new();
91 let stack = &*STACK.init(Stack::new(
92 device,
93 Config::dhcpv4(Default::default()),
94 RESOURCES.init(StackResources::<2>::new()),
95 seed,
96 ));
97
98 unwrap!(spawner.spawn(net_task(stack)));
99
100 perf_client::run(
101 stack,
102 perf_client::Expected {
103 down_kbps: 50,
104 up_kbps: 50,
105 updown_kbps: 50,
106 },
107 )
108 .await;
109
110 info!("Test OK");
111 cortex_m::asm::bkpt();
112}
diff --git a/tests/nrf/src/common.rs b/tests/nrf/src/common.rs
new file mode 100644
index 000000000..79336c5de
--- /dev/null
+++ b/tests/nrf/src/common.rs
@@ -0,0 +1,65 @@
1#![macro_use]
2
3use {defmt_rtt as _, panic_probe as _};
4
5#[cfg(feature = "nrf52832")]
6teleprobe_meta::target!(b"nrf52832-dk");
7#[cfg(feature = "nrf52840")]
8teleprobe_meta::target!(b"nrf52840-dk");
9#[cfg(feature = "nrf52833")]
10teleprobe_meta::target!(b"nrf52833-dk");
11#[cfg(feature = "nrf5340")]
12teleprobe_meta::target!(b"nrf5340-dk");
13#[cfg(feature = "nrf9160")]
14teleprobe_meta::target!(b"nrf9160-dk");
15#[cfg(feature = "nrf51422")]
16teleprobe_meta::target!(b"nrf51-dk");
17
18macro_rules! define_peris {
19 ($($name:ident = $peri:ident,)* $(@irq $irq_name:ident = $irq_code:tt,)*) => {
20 #[allow(unused_macros)]
21 macro_rules! peri {
22 $(
23 ($p:expr, $name) => {
24 $p.$peri
25 };
26 )*
27 }
28 #[allow(unused_macros)]
29 macro_rules! irqs {
30 $(
31 ($irq_name) => {{
32 embassy_nrf::bind_interrupts!(struct Irqs $irq_code);
33 Irqs
34 }};
35 )*
36 ( @ dummy ) => {};
37 }
38
39 #[allow(unused)]
40 #[allow(non_camel_case_types)]
41 pub mod peris {
42 $(
43 pub type $name = embassy_nrf::peripherals::$peri;
44 )*
45 }
46 };
47}
48
49#[cfg(feature = "nrf51422")]
50define_peris!(PIN_A = P0_13, PIN_B = P0_14,);
51
52#[cfg(feature = "nrf52832")]
53define_peris!(PIN_A = P0_11, PIN_B = P0_12,);
54
55#[cfg(feature = "nrf52833")]
56define_peris!(PIN_A = P1_01, PIN_B = P1_02,);
57
58#[cfg(feature = "nrf52840")]
59define_peris!(PIN_A = P1_02, PIN_B = P1_03,);
60
61#[cfg(feature = "nrf5340")]
62define_peris!(PIN_A = P1_00, PIN_B = P1_01,);
63
64#[cfg(feature = "nrf9160")]
65define_peris!(PIN_A = P0_00, PIN_B = P0_01,);