diff options
| author | Karun Koppula <[email protected]> | 2024-03-07 15:20:29 -0500 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-03-07 15:20:29 -0500 |
| commit | 54751b7a5093b7960e42cee1bc9a850f9c4b7a8f (patch) | |
| tree | df08df503f2b441c5b62306d50532403fe4c19c9 /tests | |
| parent | 3b1d87050e2a30b598e92979b6f202b67664a29c (diff) | |
| parent | b2d236ee390081ec6aeef1a27da06098f9febbf9 (diff) | |
Merge branch 'main' into karun/main_octospi_implementation
Diffstat (limited to 'tests')
36 files changed, 961 insertions, 201 deletions
diff --git a/tests/nrf/src/bin/buffered_uart.rs b/tests/nrf/src/bin/buffered_uart.rs deleted file mode 100644 index 354d787b4..000000000 --- a/tests/nrf/src/bin/buffered_uart.rs +++ /dev/null | |||
| @@ -1,78 +0,0 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | teleprobe_meta::target!(b"nrf52840-dk"); | ||
| 4 | |||
| 5 | use defmt::{assert_eq, *}; | ||
| 6 | use embassy_executor::Spawner; | ||
| 7 | use embassy_futures::join::join; | ||
| 8 | use embassy_nrf::buffered_uarte::{self, BufferedUarte}; | ||
| 9 | use embassy_nrf::{bind_interrupts, peripherals, uarte}; | ||
| 10 | use {defmt_rtt as _, panic_probe as _}; | ||
| 11 | |||
| 12 | bind_interrupts!(struct Irqs { | ||
| 13 | UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>; | ||
| 14 | }); | ||
| 15 | |||
| 16 | #[embassy_executor::main] | ||
| 17 | async fn main(_spawner: Spawner) { | ||
| 18 | let p = embassy_nrf::init(Default::default()); | ||
| 19 | let mut config = uarte::Config::default(); | ||
| 20 | config.parity = uarte::Parity::EXCLUDED; | ||
| 21 | config.baudrate = uarte::Baudrate::BAUD1M; | ||
| 22 | |||
| 23 | let mut tx_buffer = [0u8; 1024]; | ||
| 24 | let mut rx_buffer = [0u8; 1024]; | ||
| 25 | |||
| 26 | let mut u = BufferedUarte::new( | ||
| 27 | p.UARTE0, | ||
| 28 | p.TIMER0, | ||
| 29 | p.PPI_CH0, | ||
| 30 | p.PPI_CH1, | ||
| 31 | p.PPI_GROUP0, | ||
| 32 | Irqs, | ||
| 33 | p.P1_03, | ||
| 34 | p.P1_02, | ||
| 35 | config.clone(), | ||
| 36 | &mut rx_buffer, | ||
| 37 | &mut tx_buffer, | ||
| 38 | ); | ||
| 39 | |||
| 40 | info!("uarte initialized!"); | ||
| 41 | |||
| 42 | let (mut rx, mut tx) = u.split(); | ||
| 43 | |||
| 44 | const COUNT: usize = 40_000; | ||
| 45 | |||
| 46 | let tx_fut = async { | ||
| 47 | let mut tx_buf = [0; 215]; | ||
| 48 | let mut i = 0; | ||
| 49 | while i < COUNT { | ||
| 50 | let n = tx_buf.len().min(COUNT - i); | ||
| 51 | let tx_buf = &mut tx_buf[..n]; | ||
| 52 | for (j, b) in tx_buf.iter_mut().enumerate() { | ||
| 53 | *b = (i + j) as u8; | ||
| 54 | } | ||
| 55 | let n = unwrap!(tx.write(tx_buf).await); | ||
| 56 | i += n; | ||
| 57 | } | ||
| 58 | }; | ||
| 59 | let rx_fut = async { | ||
| 60 | let mut i = 0; | ||
| 61 | while i < COUNT { | ||
| 62 | let buf = unwrap!(rx.fill_buf().await); | ||
| 63 | |||
| 64 | for &b in buf { | ||
| 65 | assert_eq!(b, i as u8); | ||
| 66 | i = i + 1; | ||
| 67 | } | ||
| 68 | |||
| 69 | let n = buf.len(); | ||
| 70 | rx.consume(n); | ||
| 71 | } | ||
| 72 | }; | ||
| 73 | |||
| 74 | join(rx_fut, tx_fut).await; | ||
| 75 | |||
| 76 | info!("Test OK"); | ||
| 77 | cortex_m::asm::bkpt(); | ||
| 78 | } | ||
diff --git a/tests/nrf51422/.cargo/config.toml b/tests/nrf51422/.cargo/config.toml new file mode 100644 index 000000000..634805633 --- /dev/null +++ b/tests/nrf51422/.cargo/config.toml | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | [target.'cfg(all(target_arch = "arm", target_os = "none"))'] | ||
| 2 | #runner = "teleprobe local run --chip nRF51422_xxAA --elf" | ||
| 3 | runner = "teleprobe client run" | ||
| 4 | |||
| 5 | [build] | ||
| 6 | target = "thumbv6m-none-eabi" | ||
| 7 | |||
| 8 | [env] | ||
| 9 | DEFMT_LOG = "trace,embassy_hal_internal=debug" | ||
diff --git a/tests/nrf51422/Cargo.toml b/tests/nrf51422/Cargo.toml new file mode 100644 index 000000000..07236987b --- /dev/null +++ b/tests/nrf51422/Cargo.toml | |||
| @@ -0,0 +1,23 @@ | |||
| 1 | [package] | ||
| 2 | edition = "2021" | ||
| 3 | name = "embassy-nrf51-tests" | ||
| 4 | version = "0.1.0" | ||
| 5 | license = "MIT OR Apache-2.0" | ||
| 6 | |||
| 7 | [dependencies] | ||
| 8 | teleprobe-meta = "1" | ||
| 9 | |||
| 10 | embassy-futures = { version = "0.1.0", path = "../../embassy-futures" } | ||
| 11 | embassy-sync = { version = "0.5.0", path = "../../embassy-sync", features = ["defmt", ] } | ||
| 12 | embassy-executor = { version = "0.5.0", path = "../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "defmt", "task-arena-size-128", "integrated-timers"] } | ||
| 13 | embassy-time = { version = "0.3.0", path = "../../embassy-time", features = ["defmt", "defmt-timestamp-uptime"] } | ||
| 14 | embassy-nrf = { version = "0.1.0", path = "../../embassy-nrf", features = ["defmt", "nrf51", "time-driver-rtc1", "unstable-pac", "time", "gpiote"] } | ||
| 15 | embedded-io-async = { version = "0.6.1", features = ["defmt-03"] } | ||
| 16 | embedded-hal-async = { version = "1.0" } | ||
| 17 | |||
| 18 | defmt = "0.3" | ||
| 19 | defmt-rtt = "0.4" | ||
| 20 | |||
| 21 | cortex-m = { version = "0.7.6", features = ["critical-section-single-core"] } | ||
| 22 | cortex-m-rt = "0.7.0" | ||
| 23 | panic-probe = { version = "0.3", features = ["print-defmt"] } | ||
diff --git a/tests/nrf51422/build.rs b/tests/nrf51422/build.rs new file mode 100644 index 000000000..13ebbe4ee --- /dev/null +++ b/tests/nrf51422/build.rs | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | use std::error::Error; | ||
| 2 | use std::path::PathBuf; | ||
| 3 | use std::{env, fs}; | ||
| 4 | |||
| 5 | fn main() -> Result<(), Box<dyn Error>> { | ||
| 6 | let out = PathBuf::from(env::var("OUT_DIR").unwrap()); | ||
| 7 | fs::write(out.join("memory.x"), include_bytes!("memory.x")).unwrap(); | ||
| 8 | println!("cargo:rustc-link-search={}", out.display()); | ||
| 9 | println!("cargo:rerun-if-changed=memory.x"); | ||
| 10 | |||
| 11 | println!("cargo:rustc-link-arg-bins=--nmagic"); | ||
| 12 | println!("cargo:rustc-link-arg-bins=-Tlink.x"); | ||
| 13 | println!("cargo:rustc-link-arg-bins=-Tdefmt.x"); | ||
| 14 | println!("cargo:rustc-link-arg-bins=-Tteleprobe.x"); | ||
| 15 | |||
| 16 | Ok(()) | ||
| 17 | } | ||
diff --git a/tests/nrf51422/memory.x b/tests/nrf51422/memory.x new file mode 100644 index 000000000..a5881e66f --- /dev/null +++ b/tests/nrf51422/memory.x | |||
| @@ -0,0 +1,5 @@ | |||
| 1 | MEMORY | ||
| 2 | { | ||
| 3 | FLASH : ORIGIN = 0x00000000, LENGTH = 128K | ||
| 4 | RAM : ORIGIN = 0x20000000, LENGTH = 16K | ||
| 5 | } | ||
diff --git a/tests/nrf51422/src/bin/gpio.rs b/tests/nrf51422/src/bin/gpio.rs new file mode 100644 index 000000000..6d5a87d0a --- /dev/null +++ b/tests/nrf51422/src/bin/gpio.rs | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | teleprobe_meta::target!(b"nrf51-dk"); | ||
| 4 | |||
| 5 | use defmt::{assert, info}; | ||
| 6 | use embassy_executor::Spawner; | ||
| 7 | use embassy_nrf::gpio::{Input, Level, Output, OutputDrive, Pull}; | ||
| 8 | use embassy_time::Timer; | ||
| 9 | use {defmt_rtt as _, panic_probe as _}; | ||
| 10 | |||
| 11 | #[embassy_executor::main] | ||
| 12 | async fn main(_spawner: Spawner) { | ||
| 13 | let p = embassy_nrf::init(Default::default()); | ||
| 14 | |||
| 15 | let input = Input::new(p.P0_13, Pull::Up); | ||
| 16 | let mut output = Output::new(p.P0_14, Level::Low, OutputDrive::Standard); | ||
| 17 | |||
| 18 | output.set_low(); | ||
| 19 | Timer::after_millis(10).await; | ||
| 20 | assert!(input.is_low()); | ||
| 21 | |||
| 22 | output.set_high(); | ||
| 23 | Timer::after_millis(10).await; | ||
| 24 | assert!(input.is_high()); | ||
| 25 | |||
| 26 | info!("Test OK"); | ||
| 27 | cortex_m::asm::bkpt(); | ||
| 28 | } | ||
diff --git a/tests/nrf51422/src/bin/gpiote.rs b/tests/nrf51422/src/bin/gpiote.rs new file mode 100644 index 000000000..330fe993e --- /dev/null +++ b/tests/nrf51422/src/bin/gpiote.rs | |||
| @@ -0,0 +1,47 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | teleprobe_meta::target!(b"nrf51-dk"); | ||
| 4 | |||
| 5 | use defmt::{assert, info}; | ||
| 6 | use embassy_executor::Spawner; | ||
| 7 | use embassy_futures::join::join; | ||
| 8 | use embassy_nrf::gpio::{Input, Level, Output, OutputDrive, Pull}; | ||
| 9 | use embassy_time::{Duration, Instant, Timer}; | ||
| 10 | use {defmt_rtt as _, panic_probe as _}; | ||
| 11 | |||
| 12 | #[embassy_executor::main] | ||
| 13 | async fn main(_spawner: Spawner) { | ||
| 14 | let p = embassy_nrf::init(Default::default()); | ||
| 15 | |||
| 16 | let mut input = Input::new(p.P0_13, Pull::Up); | ||
| 17 | let mut output = Output::new(p.P0_14, Level::Low, OutputDrive::Standard); | ||
| 18 | |||
| 19 | let fut1 = async { | ||
| 20 | Timer::after_millis(100).await; | ||
| 21 | output.set_high(); | ||
| 22 | }; | ||
| 23 | let fut2 = async { | ||
| 24 | let start = Instant::now(); | ||
| 25 | input.wait_for_high().await; | ||
| 26 | let dur = Instant::now() - start; | ||
| 27 | assert!((Duration::from_millis(90)..Duration::from_millis(110)).contains(&dur)); | ||
| 28 | }; | ||
| 29 | |||
| 30 | join(fut1, fut2).await; | ||
| 31 | |||
| 32 | let fut1 = async { | ||
| 33 | Timer::after_millis(100).await; | ||
| 34 | output.set_low(); | ||
| 35 | }; | ||
| 36 | let fut2 = async { | ||
| 37 | let start = Instant::now(); | ||
| 38 | input.wait_for_low().await; | ||
| 39 | let dur = Instant::now() - start; | ||
| 40 | assert!((Duration::from_millis(90)..Duration::from_millis(110)).contains(&dur)); | ||
| 41 | }; | ||
| 42 | |||
| 43 | join(fut1, fut2).await; | ||
| 44 | |||
| 45 | info!("Test OK"); | ||
| 46 | cortex_m::asm::bkpt(); | ||
| 47 | } | ||
diff --git a/tests/nrf51422/src/bin/timer.rs b/tests/nrf51422/src/bin/timer.rs new file mode 100644 index 000000000..cf9ea41a8 --- /dev/null +++ b/tests/nrf51422/src/bin/timer.rs | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | teleprobe_meta::target!(b"nrf51-dk"); | ||
| 4 | |||
| 5 | use defmt::{assert, info}; | ||
| 6 | use embassy_executor::Spawner; | ||
| 7 | use embassy_time::{Instant, Timer}; | ||
| 8 | use {defmt_rtt as _, panic_probe as _}; | ||
| 9 | |||
| 10 | #[embassy_executor::main] | ||
| 11 | async fn main(_spawner: Spawner) { | ||
| 12 | let _p = embassy_nrf::init(Default::default()); | ||
| 13 | info!("Hello World!"); | ||
| 14 | |||
| 15 | let start = Instant::now(); | ||
| 16 | Timer::after_millis(100).await; | ||
| 17 | let end = Instant::now(); | ||
| 18 | let ms = (end - start).as_millis(); | ||
| 19 | info!("slept for {} ms", ms); | ||
| 20 | assert!(ms >= 99); | ||
| 21 | |||
| 22 | info!("Test OK"); | ||
| 23 | cortex_m::asm::bkpt(); | ||
| 24 | } | ||
diff --git a/tests/nrf/.cargo/config.toml b/tests/nrf52840/.cargo/config.toml index 9d6b0313a..9d6b0313a 100644 --- a/tests/nrf/.cargo/config.toml +++ b/tests/nrf52840/.cargo/config.toml | |||
diff --git a/tests/nrf/Cargo.toml b/tests/nrf52840/Cargo.toml index 84ca99f1f..84ca99f1f 100644 --- a/tests/nrf/Cargo.toml +++ b/tests/nrf52840/Cargo.toml | |||
diff --git a/tests/nrf/build.rs b/tests/nrf52840/build.rs index 71c82a70f..71c82a70f 100644 --- a/tests/nrf/build.rs +++ b/tests/nrf52840/build.rs | |||
diff --git a/tests/nrf/memory.x b/tests/nrf52840/memory.x index 58900a7bd..58900a7bd 100644 --- a/tests/nrf/memory.x +++ b/tests/nrf52840/memory.x | |||
diff --git a/tests/nrf52840/src/bin/buffered_uart.rs b/tests/nrf52840/src/bin/buffered_uart.rs new file mode 100644 index 000000000..a01d66d85 --- /dev/null +++ b/tests/nrf52840/src/bin/buffered_uart.rs | |||
| @@ -0,0 +1,81 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | teleprobe_meta::target!(b"nrf52840-dk"); | ||
| 4 | |||
| 5 | use defmt::{assert_eq, *}; | ||
| 6 | use embassy_executor::Spawner; | ||
| 7 | use embassy_futures::join::join; | ||
| 8 | use embassy_nrf::buffered_uarte::{self, BufferedUarte}; | ||
| 9 | use embassy_nrf::{bind_interrupts, peripherals, uarte}; | ||
| 10 | use {defmt_rtt as _, panic_probe as _}; | ||
| 11 | |||
| 12 | bind_interrupts!(struct Irqs { | ||
| 13 | UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>; | ||
| 14 | }); | ||
| 15 | |||
| 16 | #[embassy_executor::main] | ||
| 17 | async fn main(_spawner: Spawner) { | ||
| 18 | let mut p = embassy_nrf::init(Default::default()); | ||
| 19 | let mut config = uarte::Config::default(); | ||
| 20 | config.parity = uarte::Parity::EXCLUDED; | ||
| 21 | config.baudrate = uarte::Baudrate::BAUD1M; | ||
| 22 | |||
| 23 | let mut tx_buffer = [0u8; 1024]; | ||
| 24 | let mut rx_buffer = [0u8; 1024]; | ||
| 25 | |||
| 26 | // test teardown + recreate of the buffereduarte works fine. | ||
| 27 | for _ in 0..2 { | ||
| 28 | let u = BufferedUarte::new( | ||
| 29 | &mut p.UARTE0, | ||
| 30 | &mut p.TIMER0, | ||
| 31 | &mut p.PPI_CH0, | ||
| 32 | &mut p.PPI_CH1, | ||
| 33 | &mut p.PPI_GROUP0, | ||
| 34 | Irqs, | ||
| 35 | &mut p.P1_03, | ||
| 36 | &mut p.P1_02, | ||
| 37 | config.clone(), | ||
| 38 | &mut rx_buffer, | ||
| 39 | &mut tx_buffer, | ||
| 40 | ); | ||
| 41 | |||
| 42 | info!("uarte initialized!"); | ||
| 43 | |||
| 44 | let (mut rx, mut tx) = u.split(); | ||
| 45 | |||
| 46 | const COUNT: usize = 40_000; | ||
| 47 | |||
| 48 | let tx_fut = async { | ||
| 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 | let mut i = 0; | ||
| 63 | while i < COUNT { | ||
| 64 | let buf = unwrap!(rx.fill_buf().await); | ||
| 65 | |||
| 66 | for &b in buf { | ||
| 67 | assert_eq!(b, i as u8); | ||
| 68 | i = i + 1; | ||
| 69 | } | ||
| 70 | |||
| 71 | let n = buf.len(); | ||
| 72 | rx.consume(n); | ||
| 73 | } | ||
| 74 | }; | ||
| 75 | |||
| 76 | join(rx_fut, tx_fut).await; | ||
| 77 | } | ||
| 78 | |||
| 79 | info!("Test OK"); | ||
| 80 | cortex_m::asm::bkpt(); | ||
| 81 | } | ||
diff --git a/tests/nrf/src/bin/buffered_uart_full.rs b/tests/nrf52840/src/bin/buffered_uart_full.rs index e59c75ba9..62edaed25 100644 --- a/tests/nrf/src/bin/buffered_uart_full.rs +++ b/tests/nrf52840/src/bin/buffered_uart_full.rs | |||
| @@ -23,7 +23,7 @@ async fn main(_spawner: Spawner) { | |||
| 23 | let mut tx_buffer = [0u8; 1024]; | 23 | let mut tx_buffer = [0u8; 1024]; |
| 24 | let mut rx_buffer = [0u8; 1024]; | 24 | let mut rx_buffer = [0u8; 1024]; |
| 25 | 25 | ||
| 26 | let mut u = BufferedUarte::new( | 26 | let u = BufferedUarte::new( |
| 27 | p.UARTE0, | 27 | p.UARTE0, |
| 28 | p.TIMER0, | 28 | p.TIMER0, |
| 29 | p.PPI_CH0, | 29 | p.PPI_CH0, |
diff --git a/tests/nrf52840/src/bin/buffered_uart_halves.rs b/tests/nrf52840/src/bin/buffered_uart_halves.rs new file mode 100644 index 000000000..54a9fef5b --- /dev/null +++ b/tests/nrf52840/src/bin/buffered_uart_halves.rs | |||
| @@ -0,0 +1,82 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | teleprobe_meta::target!(b"nrf52840-dk"); | ||
| 4 | |||
| 5 | use defmt::{assert_eq, *}; | ||
| 6 | use embassy_executor::Spawner; | ||
| 7 | use embassy_futures::join::join; | ||
| 8 | use embassy_nrf::buffered_uarte::{self, BufferedUarteRx, BufferedUarteTx}; | ||
| 9 | use embassy_nrf::{bind_interrupts, peripherals, uarte}; | ||
| 10 | use {defmt_rtt as _, panic_probe as _}; | ||
| 11 | |||
| 12 | bind_interrupts!(struct Irqs { | ||
| 13 | UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>; | ||
| 14 | UARTE1 => buffered_uarte::InterruptHandler<peripherals::UARTE1>; | ||
| 15 | }); | ||
| 16 | |||
| 17 | #[embassy_executor::main] | ||
| 18 | async 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 | const COUNT: usize = 40_000; | ||
| 30 | |||
| 31 | let mut tx = BufferedUarteTx::new(&mut p.UARTE1, Irqs, &mut p.P1_02, config.clone(), &mut tx_buffer); | ||
| 32 | |||
| 33 | let mut rx = BufferedUarteRx::new( | ||
| 34 | &mut p.UARTE0, | ||
| 35 | &mut p.TIMER0, | ||
| 36 | &mut p.PPI_CH0, | ||
| 37 | &mut p.PPI_CH1, | ||
| 38 | &mut p.PPI_GROUP0, | ||
| 39 | Irqs, | ||
| 40 | &mut p.P1_03, | ||
| 41 | config.clone(), | ||
| 42 | &mut rx_buffer, | ||
| 43 | ); | ||
| 44 | |||
| 45 | let tx_fut = async { | ||
| 46 | info!("tx initialized!"); | ||
| 47 | |||
| 48 | let mut tx_buf = [0; 215]; | ||
| 49 | let mut i = 0; | ||
| 50 | while i < COUNT { | ||
| 51 | let n = tx_buf.len().min(COUNT - i); | ||
| 52 | let tx_buf = &mut tx_buf[..n]; | ||
| 53 | for (j, b) in tx_buf.iter_mut().enumerate() { | ||
| 54 | *b = (i + j) as u8; | ||
| 55 | } | ||
| 56 | let n = unwrap!(tx.write(tx_buf).await); | ||
| 57 | i += n; | ||
| 58 | } | ||
| 59 | }; | ||
| 60 | let rx_fut = async { | ||
| 61 | info!("rx initialized!"); | ||
| 62 | |||
| 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_spam.rs b/tests/nrf52840/src/bin/buffered_uart_spam.rs index 400c0df99..400c0df99 100644 --- a/tests/nrf/src/bin/buffered_uart_spam.rs +++ b/tests/nrf52840/src/bin/buffered_uart_spam.rs | |||
diff --git a/tests/nrf/src/bin/ethernet_enc28j60_perf.rs b/tests/nrf52840/src/bin/ethernet_enc28j60_perf.rs index 7dc1941d7..33c2f4235 100644 --- a/tests/nrf/src/bin/ethernet_enc28j60_perf.rs +++ b/tests/nrf52840/src/bin/ethernet_enc28j60_perf.rs | |||
| @@ -21,10 +21,7 @@ bind_interrupts!(struct Irqs { | |||
| 21 | RNG => embassy_nrf::rng::InterruptHandler<peripherals::RNG>; | 21 | RNG => embassy_nrf::rng::InterruptHandler<peripherals::RNG>; |
| 22 | }); | 22 | }); |
| 23 | 23 | ||
| 24 | type MyDriver = Enc28j60< | 24 | type MyDriver = Enc28j60<ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static>, Delay>, Output<'static>>; |
| 25 | ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static, peripherals::P0_15>, Delay>, | ||
| 26 | Output<'static, peripherals::P0_13>, | ||
| 27 | >; | ||
| 28 | 25 | ||
| 29 | #[embassy_executor::task] | 26 | #[embassy_executor::task] |
| 30 | async fn net_task(stack: &'static Stack<MyDriver>) -> ! { | 27 | async fn net_task(stack: &'static Stack<MyDriver>) -> ! { |
diff --git a/tests/nrf/src/bin/timer.rs b/tests/nrf52840/src/bin/timer.rs index 2a147e7ba..117947a94 100644 --- a/tests/nrf/src/bin/timer.rs +++ b/tests/nrf52840/src/bin/timer.rs | |||
| @@ -18,7 +18,6 @@ async fn main(_spawner: Spawner) { | |||
| 18 | let ms = (end - start).as_millis(); | 18 | let ms = (end - start).as_millis(); |
| 19 | info!("slept for {} ms", ms); | 19 | info!("slept for {} ms", ms); |
| 20 | assert!(ms >= 99); | 20 | assert!(ms >= 99); |
| 21 | assert!(ms < 110); | ||
| 22 | 21 | ||
| 23 | info!("Test OK"); | 22 | info!("Test OK"); |
| 24 | cortex_m::asm::bkpt(); | 23 | cortex_m::asm::bkpt(); |
diff --git a/tests/nrf/src/bin/wifi_esp_hosted_perf.rs b/tests/nrf52840/src/bin/wifi_esp_hosted_perf.rs index c96064f84..b83edddc4 100644 --- a/tests/nrf/src/bin/wifi_esp_hosted_perf.rs +++ b/tests/nrf52840/src/bin/wifi_esp_hosted_perf.rs | |||
| @@ -6,7 +6,7 @@ teleprobe_meta::timeout!(120); | |||
| 6 | use defmt::{info, unwrap}; | 6 | use defmt::{info, unwrap}; |
| 7 | use embassy_executor::Spawner; | 7 | use embassy_executor::Spawner; |
| 8 | use embassy_net::{Config, Stack, StackResources}; | 8 | use embassy_net::{Config, Stack, StackResources}; |
| 9 | use embassy_nrf::gpio::{AnyPin, Input, Level, Output, OutputDrive, Pin, Pull}; | 9 | use embassy_nrf::gpio::{Input, Level, Output, OutputDrive, Pull}; |
| 10 | use embassy_nrf::rng::Rng; | 10 | use embassy_nrf::rng::Rng; |
| 11 | use embassy_nrf::spim::{self, Spim}; | 11 | use embassy_nrf::spim::{self, Spim}; |
| 12 | use embassy_nrf::{bind_interrupts, peripherals}; | 12 | use embassy_nrf::{bind_interrupts, peripherals}; |
| @@ -28,9 +28,9 @@ const WIFI_PASSWORD: &str = "V8YxhKt5CdIAJFud"; | |||
| 28 | async fn wifi_task( | 28 | async fn wifi_task( |
| 29 | runner: hosted::Runner< | 29 | runner: hosted::Runner< |
| 30 | 'static, | 30 | 'static, |
| 31 | ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static, peripherals::P0_31>, Delay>, | 31 | ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static>, Delay>, |
| 32 | Input<'static, AnyPin>, | 32 | Input<'static>, |
| 33 | Output<'static, peripherals::P1_05>, | 33 | Output<'static>, |
| 34 | >, | 34 | >, |
| 35 | ) -> ! { | 35 | ) -> ! { |
| 36 | runner.run().await | 36 | runner.run().await |
| @@ -53,8 +53,8 @@ async fn main(spawner: Spawner) { | |||
| 53 | let sck = p.P0_29; | 53 | let sck = p.P0_29; |
| 54 | let mosi = p.P0_30; | 54 | let mosi = p.P0_30; |
| 55 | let cs = Output::new(p.P0_31, Level::High, OutputDrive::HighDrive); | 55 | let cs = Output::new(p.P0_31, Level::High, OutputDrive::HighDrive); |
| 56 | let handshake = Input::new(p.P1_01.degrade(), Pull::Up); | 56 | let handshake = Input::new(p.P1_01, Pull::Up); |
| 57 | let ready = Input::new(p.P1_04.degrade(), Pull::None); | 57 | let ready = Input::new(p.P1_04, Pull::None); |
| 58 | let reset = Output::new(p.P1_05, Level::Low, OutputDrive::Standard); | 58 | let reset = Output::new(p.P1_05, Level::Low, OutputDrive::Standard); |
| 59 | 59 | ||
| 60 | let mut config = spim::Config::default(); | 60 | let mut config = spim::Config::default(); |
diff --git a/tests/rp/.cargo/config.toml b/tests/rp/.cargo/config.toml index 40b5d7000..de7bb0e56 100644 --- a/tests/rp/.cargo/config.toml +++ b/tests/rp/.cargo/config.toml | |||
| @@ -10,7 +10,7 @@ runner = "teleprobe client run" | |||
| 10 | 10 | ||
| 11 | rustflags = [ | 11 | rustflags = [ |
| 12 | # Code-size optimizations. | 12 | # Code-size optimizations. |
| 13 | "-Z", "trap-unreachable=no", | 13 | #"-Z", "trap-unreachable=no", |
| 14 | "-C", "inline-threshold=5", | 14 | "-C", "inline-threshold=5", |
| 15 | "-C", "no-vectorize-loops", | 15 | "-C", "no-vectorize-loops", |
| 16 | ] | 16 | ] |
diff --git a/tests/rp/Cargo.toml b/tests/rp/Cargo.toml index 46e1e9a5f..e67f2117d 100644 --- a/tests/rp/Cargo.toml +++ b/tests/rp/Cargo.toml | |||
| @@ -14,6 +14,7 @@ embassy-rp = { version = "0.1.0", path = "../../embassy-rp", features = [ "defmt | |||
| 14 | embassy-futures = { version = "0.1.0", path = "../../embassy-futures" } | 14 | embassy-futures = { version = "0.1.0", path = "../../embassy-futures" } |
| 15 | embassy-net = { version = "0.4.0", path = "../../embassy-net", features = ["defmt", "tcp", "udp", "dhcpv4", "medium-ethernet"] } | 15 | embassy-net = { version = "0.4.0", path = "../../embassy-net", features = ["defmt", "tcp", "udp", "dhcpv4", "medium-ethernet"] } |
| 16 | embassy-net-wiznet = { version = "0.1.0", path = "../../embassy-net-wiznet", features = ["defmt"] } | 16 | embassy-net-wiznet = { version = "0.1.0", path = "../../embassy-net-wiznet", features = ["defmt"] } |
| 17 | embassy-embedded-hal = { version = "0.1.0", path = "../../embassy-embedded-hal/"} | ||
| 17 | cyw43 = { path = "../../cyw43", features = ["defmt", "firmware-logs"] } | 18 | cyw43 = { path = "../../cyw43", features = ["defmt", "firmware-logs"] } |
| 18 | cyw43-pio = { path = "../../cyw43-pio", features = ["defmt", "overclock"] } | 19 | cyw43-pio = { path = "../../cyw43-pio", features = ["defmt", "overclock"] } |
| 19 | perf-client = { path = "../perf-client" } | 20 | perf-client = { path = "../perf-client" } |
diff --git a/tests/rp/src/bin/cyw43-perf.rs b/tests/rp/src/bin/cyw43-perf.rs index a1b2946e6..b46ae670a 100644 --- a/tests/rp/src/bin/cyw43-perf.rs +++ b/tests/rp/src/bin/cyw43-perf.rs | |||
| @@ -7,7 +7,7 @@ use defmt::{panic, *}; | |||
| 7 | use embassy_executor::Spawner; | 7 | use embassy_executor::Spawner; |
| 8 | use embassy_net::{Config, Stack, StackResources}; | 8 | use embassy_net::{Config, Stack, StackResources}; |
| 9 | use embassy_rp::gpio::{Level, Output}; | 9 | use embassy_rp::gpio::{Level, Output}; |
| 10 | use embassy_rp::peripherals::{DMA_CH0, PIN_23, PIN_25, PIO0}; | 10 | use embassy_rp::peripherals::{DMA_CH0, PIO0}; |
| 11 | use embassy_rp::pio::{InterruptHandler, Pio}; | 11 | use embassy_rp::pio::{InterruptHandler, Pio}; |
| 12 | use embassy_rp::{bind_interrupts, rom_data}; | 12 | use embassy_rp::{bind_interrupts, rom_data}; |
| 13 | use static_cell::StaticCell; | 13 | use static_cell::StaticCell; |
| @@ -24,9 +24,7 @@ const WIFI_NETWORK: &str = "EmbassyTest"; | |||
| 24 | const WIFI_PASSWORD: &str = "V8YxhKt5CdIAJFud"; | 24 | const WIFI_PASSWORD: &str = "V8YxhKt5CdIAJFud"; |
| 25 | 25 | ||
| 26 | #[embassy_executor::task] | 26 | #[embassy_executor::task] |
| 27 | async fn wifi_task( | 27 | async fn wifi_task(runner: cyw43::Runner<'static, Output<'static>, PioSpi<'static, PIO0, 0, DMA_CH0>>) -> ! { |
| 28 | runner: cyw43::Runner<'static, Output<'static, PIN_23>, PioSpi<'static, PIN_25, PIO0, 0, DMA_CH0>>, | ||
| 29 | ) -> ! { | ||
| 30 | runner.run().await | 28 | runner.run().await |
| 31 | } | 29 | } |
| 32 | 30 | ||
diff --git a/tests/rp/src/bin/ethernet_w5100s_perf.rs b/tests/rp/src/bin/ethernet_w5100s_perf.rs index 8c9089d0e..5d5547773 100644 --- a/tests/rp/src/bin/ethernet_w5100s_perf.rs +++ b/tests/rp/src/bin/ethernet_w5100s_perf.rs | |||
| @@ -10,7 +10,7 @@ use embassy_net_wiznet::chip::W5100S; | |||
| 10 | use embassy_net_wiznet::*; | 10 | use embassy_net_wiznet::*; |
| 11 | use embassy_rp::clocks::RoscRng; | 11 | use embassy_rp::clocks::RoscRng; |
| 12 | use embassy_rp::gpio::{Input, Level, Output, Pull}; | 12 | use embassy_rp::gpio::{Input, Level, Output, Pull}; |
| 13 | use embassy_rp::peripherals::{PIN_17, PIN_20, PIN_21, SPI0}; | 13 | use embassy_rp::peripherals::SPI0; |
| 14 | use embassy_rp::spi::{Async, Config as SpiConfig, Spi}; | 14 | use embassy_rp::spi::{Async, Config as SpiConfig, Spi}; |
| 15 | use embassy_time::Delay; | 15 | use embassy_time::Delay; |
| 16 | use embedded_hal_bus::spi::ExclusiveDevice; | 16 | use embedded_hal_bus::spi::ExclusiveDevice; |
| @@ -23,9 +23,9 @@ async fn ethernet_task( | |||
| 23 | runner: Runner< | 23 | runner: Runner< |
| 24 | 'static, | 24 | 'static, |
| 25 | W5100S, | 25 | W5100S, |
| 26 | ExclusiveDevice<Spi<'static, SPI0, Async>, Output<'static, PIN_17>, Delay>, | 26 | ExclusiveDevice<Spi<'static, SPI0, Async>, Output<'static>, Delay>, |
| 27 | Input<'static, PIN_21>, | 27 | Input<'static>, |
| 28 | Output<'static, PIN_20>, | 28 | Output<'static>, |
| 29 | >, | 29 | >, |
| 30 | ) -> ! { | 30 | ) -> ! { |
| 31 | runner.run().await | 31 | runner.run().await |
diff --git a/tests/rp/src/bin/i2c.rs b/tests/rp/src/bin/i2c.rs index 77d628cf6..153b37999 100644 --- a/tests/rp/src/bin/i2c.rs +++ b/tests/rp/src/bin/i2c.rs | |||
| @@ -3,7 +3,10 @@ | |||
| 3 | teleprobe_meta::target!(b"rpi-pico"); | 3 | teleprobe_meta::target!(b"rpi-pico"); |
| 4 | 4 | ||
| 5 | use defmt::{assert_eq, info, panic, unwrap}; | 5 | use defmt::{assert_eq, info, panic, unwrap}; |
| 6 | use embassy_executor::Executor; | 6 | use embassy_embedded_hal::SetConfig; |
| 7 | use embassy_executor::{Executor, Spawner}; | ||
| 8 | use embassy_rp::clocks::{PllConfig, XoscConfig}; | ||
| 9 | use embassy_rp::config::Config as rpConfig; | ||
| 7 | use embassy_rp::multicore::{spawn_core1, Stack}; | 10 | use embassy_rp::multicore::{spawn_core1, Stack}; |
| 8 | use embassy_rp::peripherals::{I2C0, I2C1}; | 11 | use embassy_rp::peripherals::{I2C0, I2C1}; |
| 9 | use embassy_rp::{bind_interrupts, i2c, i2c_slave}; | 12 | use embassy_rp::{bind_interrupts, i2c, i2c_slave}; |
| @@ -13,7 +16,6 @@ use static_cell::StaticCell; | |||
| 13 | use {defmt_rtt as _, panic_probe as _, panic_probe as _, panic_probe as _}; | 16 | use {defmt_rtt as _, panic_probe as _, panic_probe as _, panic_probe as _}; |
| 14 | 17 | ||
| 15 | static mut CORE1_STACK: Stack<1024> = Stack::new(); | 18 | static mut CORE1_STACK: Stack<1024> = Stack::new(); |
| 16 | static EXECUTOR0: StaticCell<Executor> = StaticCell::new(); | ||
| 17 | static EXECUTOR1: StaticCell<Executor> = StaticCell::new(); | 19 | static EXECUTOR1: StaticCell<Executor> = StaticCell::new(); |
| 18 | 20 | ||
| 19 | use crate::i2c::AbortReason; | 21 | use crate::i2c::AbortReason; |
| @@ -44,10 +46,7 @@ async fn device_task(mut dev: i2c_slave::I2cSlave<'static, I2C1>) -> ! { | |||
| 44 | Ok(x) => match x { | 46 | Ok(x) => match x { |
| 45 | i2c_slave::ReadStatus::Done => break, | 47 | i2c_slave::ReadStatus::Done => break, |
| 46 | i2c_slave::ReadStatus::NeedMoreBytes => count += 1, | 48 | i2c_slave::ReadStatus::NeedMoreBytes => count += 1, |
| 47 | i2c_slave::ReadStatus::LeftoverBytes(x) => { | 49 | i2c_slave::ReadStatus::LeftoverBytes(x) => panic!("tried to write {} extra bytes", x), |
| 48 | info!("tried to write {} extra bytes", x); | ||
| 49 | break; | ||
| 50 | } | ||
| 51 | }, | 50 | }, |
| 52 | Err(e) => match e { | 51 | Err(e) => match e { |
| 53 | embassy_rp::i2c_slave::Error::Abort(AbortReason::Other(n)) => panic!("Other {:b}", n), | 52 | embassy_rp::i2c_slave::Error::Abort(AbortReason::Other(n)) => panic!("Other {:b}", n), |
| @@ -80,7 +79,7 @@ async fn device_task(mut dev: i2c_slave::I2cSlave<'static, I2C1>) -> ! { | |||
| 80 | _ => panic!("Invalid write length {}", len), | 79 | _ => panic!("Invalid write length {}", len), |
| 81 | }, | 80 | }, |
| 82 | Ok(i2c_slave::Command::WriteRead(len)) => { | 81 | Ok(i2c_slave::Command::WriteRead(len)) => { |
| 83 | info!("device recieved write read: {:x}", buf[..len]); | 82 | info!("device received write read: {:x}", buf[..len]); |
| 84 | match buf[0] { | 83 | match buf[0] { |
| 85 | 0xC2 => { | 84 | 0xC2 => { |
| 86 | let resp_buff = [0xD1, 0xD2, 0xD3, 0xD4]; | 85 | let resp_buff = [0xD1, 0xD2, 0xD3, 0xD4]; |
| @@ -92,6 +91,8 @@ async fn device_task(mut dev: i2c_slave::I2cSlave<'static, I2C1>) -> ! { | |||
| 92 | resp_buff[i] = i as u8; | 91 | resp_buff[i] = i as u8; |
| 93 | } | 92 | } |
| 94 | dev.respond_to_read(&resp_buff).await.unwrap(); | 93 | dev.respond_to_read(&resp_buff).await.unwrap(); |
| 94 | // reset count for next round of tests | ||
| 95 | count = 0xD0; | ||
| 95 | } | 96 | } |
| 96 | x => panic!("Invalid Write Read {:x}", x), | 97 | x => panic!("Invalid Write Read {:x}", x), |
| 97 | } | 98 | } |
| @@ -104,8 +105,7 @@ async fn device_task(mut dev: i2c_slave::I2cSlave<'static, I2C1>) -> ! { | |||
| 104 | } | 105 | } |
| 105 | } | 106 | } |
| 106 | 107 | ||
| 107 | #[embassy_executor::task] | 108 | async fn controller_task(con: &mut i2c::I2c<'static, I2C0, i2c::Async>) { |
| 108 | async fn controller_task(mut con: i2c::I2c<'static, I2C0, i2c::Async>) { | ||
| 109 | info!("Device start"); | 109 | info!("Device start"); |
| 110 | 110 | ||
| 111 | { | 111 | { |
| @@ -179,33 +179,55 @@ async fn controller_task(mut con: i2c::I2c<'static, I2C0, i2c::Async>) { | |||
| 179 | info!("large write_read - OK") | 179 | info!("large write_read - OK") |
| 180 | } | 180 | } |
| 181 | 181 | ||
| 182 | info!("Test OK"); | 182 | #[embassy_executor::main] |
| 183 | cortex_m::asm::bkpt(); | 183 | async fn main(_core0_spawner: Spawner) { |
| 184 | } | 184 | let mut config = rpConfig::default(); |
| 185 | 185 | // Configure clk_sys to 48MHz to support 1kHz scl. | |
| 186 | #[cortex_m_rt::entry] | 186 | // In theory it can go lower, but we won't bother to test below 1kHz. |
| 187 | fn main() -> ! { | 187 | config.clocks.xosc = Some(XoscConfig { |
| 188 | let p = embassy_rp::init(Default::default()); | 188 | hz: 12_000_000, |
| 189 | info!("Hello World!"); | 189 | delay_multiplier: 128, |
| 190 | 190 | sys_pll: Some(PllConfig { | |
| 191 | let d_sda = p.PIN_19; | 191 | refdiv: 1, |
| 192 | let d_scl = p.PIN_18; | 192 | fbdiv: 120, |
| 193 | let mut config = i2c_slave::Config::default(); | 193 | post_div1: 6, |
| 194 | config.addr = DEV_ADDR as u16; | 194 | post_div2: 5, |
| 195 | let device = i2c_slave::I2cSlave::new(p.I2C1, d_sda, d_scl, Irqs, config); | 195 | }), |
| 196 | 196 | usb_pll: Some(PllConfig { | |
| 197 | spawn_core1(p.CORE1, unsafe { &mut CORE1_STACK }, move || { | 197 | refdiv: 1, |
| 198 | let executor1 = EXECUTOR1.init(Executor::new()); | 198 | fbdiv: 120, |
| 199 | executor1.run(|spawner| unwrap!(spawner.spawn(device_task(device)))); | 199 | post_div1: 6, |
| 200 | }); | 200 | post_div2: 5, |
| 201 | 201 | }), | |
| 202 | let executor0 = EXECUTOR0.init(Executor::new()); | 202 | }); |
| 203 | 203 | ||
| 204 | let c_sda = p.PIN_21; | 204 | let p = embassy_rp::init(config); |
| 205 | let c_scl = p.PIN_20; | 205 | info!("Hello World!"); |
| 206 | let mut config = i2c::Config::default(); | 206 | |
| 207 | config.frequency = 5_000; | 207 | let d_sda = p.PIN_19; |
| 208 | let controller = i2c::I2c::new_async(p.I2C0, c_sda, c_scl, Irqs, config); | 208 | let d_scl = p.PIN_18; |
| 209 | let mut config = i2c_slave::Config::default(); | ||
| 210 | config.addr = DEV_ADDR as u16; | ||
| 211 | let device = i2c_slave::I2cSlave::new(p.I2C1, d_sda, d_scl, Irqs, config); | ||
| 212 | |||
| 213 | spawn_core1(p.CORE1, unsafe { &mut CORE1_STACK }, move || { | ||
| 214 | let executor1 = EXECUTOR1.init(Executor::new()); | ||
| 215 | executor1.run(|spawner| unwrap!(spawner.spawn(device_task(device)))); | ||
| 216 | }); | ||
| 217 | |||
| 218 | let c_sda = p.PIN_21; | ||
| 219 | let c_scl = p.PIN_20; | ||
| 220 | let mut controller = i2c::I2c::new_async(p.I2C0, c_sda, c_scl, Irqs, Default::default()); | ||
| 221 | |||
| 222 | for freq in [1000, 100_000, 400_000, 1_000_000] { | ||
| 223 | info!("testing at {}hz", freq); | ||
| 224 | let mut config = i2c::Config::default(); | ||
| 225 | config.frequency = freq; | ||
| 226 | controller.set_config(&config).unwrap(); | ||
| 227 | controller_task(&mut controller).await; | ||
| 228 | } | ||
| 209 | 229 | ||
| 210 | executor0.run(|spawner| unwrap!(spawner.spawn(controller_task(controller)))); | 230 | info!("Test OK"); |
| 231 | cortex_m::asm::bkpt(); | ||
| 232 | } | ||
| 211 | } | 233 | } |
diff --git a/tests/rp/src/bin/uart.rs b/tests/rp/src/bin/uart.rs index f4d641175..6e6e5517b 100644 --- a/tests/rp/src/bin/uart.rs +++ b/tests/rp/src/bin/uart.rs | |||
| @@ -21,7 +21,7 @@ fn read1<const N: usize>(uart: &mut UartRx<'_, impl Instance, Blocking>) -> Resu | |||
| 21 | Ok(buf) | 21 | Ok(buf) |
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | async fn send(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, parity: Option<bool>) { | 24 | async fn send(pin: &mut Output<'_>, v: u8, parity: Option<bool>) { |
| 25 | pin.set_low(); | 25 | pin.set_low(); |
| 26 | Timer::after_millis(1).await; | 26 | Timer::after_millis(1).await; |
| 27 | for i in 0..8 { | 27 | for i in 0..8 { |
| @@ -116,7 +116,7 @@ async fn main(_spawner: Spawner) { | |||
| 116 | config.parity = Parity::ParityEven; | 116 | config.parity = Parity::ParityEven; |
| 117 | let mut uart = UartRx::new_blocking(&mut uart, &mut rx, config); | 117 | let mut uart = UartRx::new_blocking(&mut uart, &mut rx, config); |
| 118 | 118 | ||
| 119 | async fn chr(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, parity: u8) { | 119 | async fn chr(pin: &mut Output<'_>, v: u8, parity: u8) { |
| 120 | send(pin, v, Some(parity != 0)).await; | 120 | send(pin, v, Some(parity != 0)).await; |
| 121 | } | 121 | } |
| 122 | 122 | ||
| @@ -142,7 +142,7 @@ async fn main(_spawner: Spawner) { | |||
| 142 | config.baudrate = 1000; | 142 | config.baudrate = 1000; |
| 143 | let mut uart = UartRx::new_blocking(&mut uart, &mut rx, config); | 143 | let mut uart = UartRx::new_blocking(&mut uart, &mut rx, config); |
| 144 | 144 | ||
| 145 | async fn chr(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, good: bool) { | 145 | async fn chr(pin: &mut Output<'_>, v: u8, good: bool) { |
| 146 | if good { | 146 | if good { |
| 147 | send(pin, v, None).await; | 147 | send(pin, v, None).await; |
| 148 | } else { | 148 | } else { |
diff --git a/tests/rp/src/bin/uart_buffered.rs b/tests/rp/src/bin/uart_buffered.rs index 14647e44a..d68c23cbd 100644 --- a/tests/rp/src/bin/uart_buffered.rs +++ b/tests/rp/src/bin/uart_buffered.rs | |||
| @@ -36,7 +36,7 @@ async fn read1<const N: usize>(uart: &mut BufferedUartRx<'_, impl Instance>) -> | |||
| 36 | } | 36 | } |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | async fn send(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, parity: Option<bool>) { | 39 | async fn send(pin: &mut Output<'_>, v: u8, parity: Option<bool>) { |
| 40 | pin.set_low(); | 40 | pin.set_low(); |
| 41 | Timer::after_millis(1).await; | 41 | Timer::after_millis(1).await; |
| 42 | for i in 0..8 { | 42 | for i in 0..8 { |
| @@ -161,7 +161,7 @@ async fn main(_spawner: Spawner) { | |||
| 161 | let rx_buf = &mut [0u8; 16]; | 161 | let rx_buf = &mut [0u8; 16]; |
| 162 | let mut uart = BufferedUartRx::new(&mut uart, Irqs, &mut rx, rx_buf, config); | 162 | let mut uart = BufferedUartRx::new(&mut uart, Irqs, &mut rx, rx_buf, config); |
| 163 | 163 | ||
| 164 | async fn chr(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, parity: u32) { | 164 | async fn chr(pin: &mut Output<'_>, v: u8, parity: u32) { |
| 165 | send(pin, v, Some(parity != 0)).await; | 165 | send(pin, v, Some(parity != 0)).await; |
| 166 | } | 166 | } |
| 167 | 167 | ||
| @@ -208,7 +208,7 @@ async fn main(_spawner: Spawner) { | |||
| 208 | let rx_buf = &mut [0u8; 16]; | 208 | let rx_buf = &mut [0u8; 16]; |
| 209 | let mut uart = BufferedUartRx::new(&mut uart, Irqs, &mut rx, rx_buf, config); | 209 | let mut uart = BufferedUartRx::new(&mut uart, Irqs, &mut rx, rx_buf, config); |
| 210 | 210 | ||
| 211 | async fn chr(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, good: bool) { | 211 | async fn chr(pin: &mut Output<'_>, v: u8, good: bool) { |
| 212 | if good { | 212 | if good { |
| 213 | send(pin, v, None).await; | 213 | send(pin, v, None).await; |
| 214 | } else { | 214 | } else { |
diff --git a/tests/rp/src/bin/uart_dma.rs b/tests/rp/src/bin/uart_dma.rs index 130d8599e..edc87175a 100644 --- a/tests/rp/src/bin/uart_dma.rs +++ b/tests/rp/src/bin/uart_dma.rs | |||
| @@ -27,7 +27,7 @@ async fn read1<const N: usize>(uart: &mut UartRx<'_, impl Instance, Async>) -> R | |||
| 27 | Ok(buf) | 27 | Ok(buf) |
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | async fn send(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, parity: Option<bool>) { | 30 | async fn send(pin: &mut Output<'_>, v: u8, parity: Option<bool>) { |
| 31 | pin.set_low(); | 31 | pin.set_low(); |
| 32 | Timer::after_millis(1).await; | 32 | Timer::after_millis(1).await; |
| 33 | for i in 0..8 { | 33 | for i in 0..8 { |
| @@ -160,7 +160,7 @@ async fn main(_spawner: Spawner) { | |||
| 160 | config.parity = Parity::ParityEven; | 160 | config.parity = Parity::ParityEven; |
| 161 | let mut uart = UartRx::new(&mut uart, &mut rx, Irqs, &mut p.DMA_CH0, config); | 161 | let mut uart = UartRx::new(&mut uart, &mut rx, Irqs, &mut p.DMA_CH0, config); |
| 162 | 162 | ||
| 163 | async fn chr(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, parity: u32) { | 163 | async fn chr(pin: &mut Output<'_>, v: u8, parity: u32) { |
| 164 | send(pin, v, Some(parity != 0)).await; | 164 | send(pin, v, Some(parity != 0)).await; |
| 165 | } | 165 | } |
| 166 | 166 | ||
| @@ -205,7 +205,7 @@ async fn main(_spawner: Spawner) { | |||
| 205 | config.baudrate = 1000; | 205 | config.baudrate = 1000; |
| 206 | let mut uart = UartRx::new(&mut uart, &mut rx, Irqs, &mut p.DMA_CH0, config); | 206 | let mut uart = UartRx::new(&mut uart, &mut rx, Irqs, &mut p.DMA_CH0, config); |
| 207 | 207 | ||
| 208 | async fn chr(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, good: bool) { | 208 | async fn chr(pin: &mut Output<'_>, v: u8, good: bool) { |
| 209 | if good { | 209 | if good { |
| 210 | send(pin, v, None).await; | 210 | send(pin, v, None).await; |
| 211 | } else { | 211 | } else { |
diff --git a/tests/stm32/.cargo/config.toml b/tests/stm32/.cargo/config.toml index 2e3f055d4..528bd3451 100644 --- a/tests/stm32/.cargo/config.toml +++ b/tests/stm32/.cargo/config.toml | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | [unstable] | 1 | [unstable] |
| 2 | build-std = ["core"] | 2 | #build-std = ["core"] |
| 3 | build-std-features = ["panic_immediate_abort"] | 3 | #build-std-features = ["panic_immediate_abort"] |
| 4 | 4 | ||
| 5 | [target.'cfg(all(target_arch = "arm", target_os = "none"))'] | 5 | [target.'cfg(all(target_arch = "arm", target_os = "none"))'] |
| 6 | runner = "teleprobe client run" | 6 | runner = "teleprobe client run" |
| @@ -8,16 +8,16 @@ runner = "teleprobe client run" | |||
| 8 | 8 | ||
| 9 | rustflags = [ | 9 | rustflags = [ |
| 10 | # Code-size optimizations. | 10 | # Code-size optimizations. |
| 11 | "-Z", "trap-unreachable=no", | 11 | #"-Z", "trap-unreachable=no", |
| 12 | "-C", "inline-threshold=5", | 12 | "-C", "inline-threshold=5", |
| 13 | "-C", "no-vectorize-loops", | 13 | "-C", "no-vectorize-loops", |
| 14 | ] | 14 | ] |
| 15 | 15 | ||
| 16 | [build] | 16 | [build] |
| 17 | target = "thumbv6m-none-eabi" | 17 | #target = "thumbv6m-none-eabi" |
| 18 | #target = "thumbv7m-none-eabi" | 18 | #target = "thumbv7m-none-eabi" |
| 19 | #target = "thumbv7em-none-eabi" | 19 | target = "thumbv7em-none-eabi" |
| 20 | #target = "thumbv8m.main-none-eabihf" | 20 | #target = "thumbv8m.main-none-eabihf" |
| 21 | 21 | ||
| 22 | [env] | 22 | [env] |
| 23 | DEFMT_LOG = "trace,embassy_hal_internal=debug,embassy_net_esp_hosted=debug,smoltcp=info" \ No newline at end of file | 23 | DEFMT_LOG = "trace,embassy_hal_internal=debug,embassy_net_esp_hosted=debug,smoltcp=info" |
diff --git a/tests/stm32/Cargo.toml b/tests/stm32/Cargo.toml index bf85f05d2..bfe003a11 100644 --- a/tests/stm32/Cargo.toml +++ b/tests/stm32/Cargo.toml | |||
| @@ -14,29 +14,34 @@ stm32f429zi = ["embassy-stm32/stm32f429zi", "chrono", "eth", "stop", "can", "not | |||
| 14 | stm32f446re = ["embassy-stm32/stm32f446re", "chrono", "stop", "can", "not-gpdma", "dac", "sdmmc"] | 14 | stm32f446re = ["embassy-stm32/stm32f446re", "chrono", "stop", "can", "not-gpdma", "dac", "sdmmc"] |
| 15 | stm32f767zi = ["embassy-stm32/stm32f767zi", "chrono", "not-gpdma", "eth", "rng"] | 15 | stm32f767zi = ["embassy-stm32/stm32f767zi", "chrono", "not-gpdma", "eth", "rng"] |
| 16 | stm32g071rb = ["embassy-stm32/stm32g071rb", "cm0", "not-gpdma", "dac"] | 16 | stm32g071rb = ["embassy-stm32/stm32g071rb", "cm0", "not-gpdma", "dac"] |
| 17 | stm32g491re = ["embassy-stm32/stm32g491re", "chrono", "stop", "not-gpdma", "rng"] | 17 | stm32g491re = ["embassy-stm32/stm32g491re", "chrono", "stop", "not-gpdma", "rng", "fdcan"] |
| 18 | stm32h563zi = ["embassy-stm32/stm32h563zi", "chrono", "eth", "rng"] | 18 | stm32h563zi = ["embassy-stm32/stm32h563zi", "chrono", "eth", "rng", "hash"] |
| 19 | stm32h753zi = ["embassy-stm32/stm32h753zi", "chrono", "not-gpdma", "eth", "rng"] | 19 | stm32h753zi = ["embassy-stm32/stm32h753zi", "chrono", "not-gpdma", "eth", "rng", "fdcan", "hash", "cryp"] |
| 20 | stm32h755zi = ["embassy-stm32/stm32h755zi-cm7", "chrono", "not-gpdma", "eth", "dac", "rng"] | 20 | stm32h755zi = ["embassy-stm32/stm32h755zi-cm7", "chrono", "not-gpdma", "eth", "dac", "rng", "fdcan", "hash", "cryp"] |
| 21 | stm32h7a3zi = ["embassy-stm32/stm32h7a3zi", "not-gpdma", "rng"] | 21 | stm32h7a3zi = ["embassy-stm32/stm32h7a3zi", "not-gpdma", "rng", "fdcan"] |
| 22 | stm32l073rz = ["embassy-stm32/stm32l073rz", "cm0", "not-gpdma", "rng"] | 22 | stm32l073rz = ["embassy-stm32/stm32l073rz", "cm0", "not-gpdma", "rng"] |
| 23 | stm32l152re = ["embassy-stm32/stm32l152re", "chrono", "not-gpdma"] | 23 | stm32l152re = ["embassy-stm32/stm32l152re", "chrono", "not-gpdma"] |
| 24 | stm32l496zg = ["embassy-stm32/stm32l496zg", "not-gpdma", "rng"] | 24 | stm32l496zg = ["embassy-stm32/stm32l496zg", "not-gpdma", "rng"] |
| 25 | stm32l4a6zg = ["embassy-stm32/stm32l4a6zg", "chrono", "not-gpdma", "rng"] | 25 | stm32l4a6zg = ["embassy-stm32/stm32l4a6zg", "chrono", "not-gpdma", "rng", "hash"] |
| 26 | stm32l4r5zi = ["embassy-stm32/stm32l4r5zi", "chrono", "not-gpdma", "rng"] | 26 | stm32l4r5zi = ["embassy-stm32/stm32l4r5zi", "chrono", "not-gpdma", "rng"] |
| 27 | stm32l552ze = ["embassy-stm32/stm32l552ze", "not-gpdma", "rng"] | 27 | stm32l552ze = ["embassy-stm32/stm32l552ze", "not-gpdma", "rng", "hash"] |
| 28 | stm32u585ai = ["embassy-stm32/stm32u585ai", "chrono", "rng"] | 28 | stm32u585ai = ["embassy-stm32/stm32u585ai", "chrono", "rng", "hash"] |
| 29 | stm32u5a5zj = ["embassy-stm32/stm32u5a5zj", "chrono", "rng"] | 29 | stm32u5a5zj = ["embassy-stm32/stm32u5a5zj", "chrono", "rng", "hash"] |
| 30 | stm32wb55rg = ["embassy-stm32/stm32wb55rg", "chrono", "not-gpdma", "ble", "mac" , "rng"] | 30 | stm32wb55rg = ["embassy-stm32/stm32wb55rg", "chrono", "not-gpdma", "ble", "mac" , "rng"] |
| 31 | stm32wba52cg = ["embassy-stm32/stm32wba52cg", "chrono", "rng"] | 31 | stm32wba52cg = ["embassy-stm32/stm32wba52cg", "chrono", "rng", "hash"] |
| 32 | stm32wl55jc = ["embassy-stm32/stm32wl55jc-cm4", "not-gpdma", "rng", "chrono"] | 32 | stm32wl55jc = ["embassy-stm32/stm32wl55jc-cm4", "not-gpdma", "rng", "chrono"] |
| 33 | stm32f091rc = ["embassy-stm32/stm32f091rc", "cm0", "not-gpdma", "chrono"] | ||
| 34 | stm32h503rb = ["embassy-stm32/stm32h503rb", "rng"] | ||
| 33 | 35 | ||
| 36 | cryp = [] | ||
| 37 | hash = [] | ||
| 34 | eth = ["embassy-executor/task-arena-size-16384"] | 38 | eth = ["embassy-executor/task-arena-size-16384"] |
| 35 | rng = [] | 39 | rng = [] |
| 36 | sdmmc = [] | 40 | sdmmc = [] |
| 37 | stop = ["embassy-stm32/low-power", "embassy-stm32/low-power-debug-with-sleep"] | 41 | stop = ["embassy-stm32/low-power", "embassy-stm32/low-power-debug-with-sleep"] |
| 38 | chrono = ["embassy-stm32/chrono", "dep:chrono"] | 42 | chrono = ["embassy-stm32/chrono", "dep:chrono"] |
| 39 | can = [] | 43 | can = [] |
| 44 | fdcan = [] | ||
| 40 | ble = ["dep:embassy-stm32-wpan", "embassy-stm32-wpan/ble"] | 45 | ble = ["dep:embassy-stm32-wpan", "embassy-stm32-wpan/ble"] |
| 41 | mac = ["dep:embassy-stm32-wpan", "embassy-stm32-wpan/mac"] | 46 | mac = ["dep:embassy-stm32-wpan", "embassy-stm32-wpan/mac"] |
| 42 | embassy-stm32-wpan = [] | 47 | embassy-stm32-wpan = [] |
| @@ -65,6 +70,7 @@ cortex-m-rt = "0.7.0" | |||
| 65 | embedded-hal = "0.2.6" | 70 | embedded-hal = "0.2.6" |
| 66 | embedded-hal-1 = { package = "embedded-hal", version = "1.0" } | 71 | embedded-hal-1 = { package = "embedded-hal", version = "1.0" } |
| 67 | embedded-hal-async = { version = "1.0" } | 72 | embedded-hal-async = { version = "1.0" } |
| 73 | embedded-can = { version = "0.4" } | ||
| 68 | micromath = "2.0.0" | 74 | micromath = "2.0.0" |
| 69 | panic-probe = { version = "0.3.0", features = ["print-defmt"] } | 75 | panic-probe = { version = "0.3.0", features = ["print-defmt"] } |
| 70 | rand_core = { version = "0.6", default-features = false } | 76 | rand_core = { version = "0.6", default-features = false } |
| @@ -73,6 +79,9 @@ static_cell = "2" | |||
| 73 | portable-atomic = { version = "1.5", features = [] } | 79 | portable-atomic = { version = "1.5", features = [] } |
| 74 | 80 | ||
| 75 | chrono = { version = "^0.4", default-features = false, optional = true} | 81 | chrono = { version = "^0.4", default-features = false, optional = true} |
| 82 | sha2 = { version = "0.10.8", default-features = false } | ||
| 83 | hmac = "0.12.1" | ||
| 84 | aes-gcm = {version = "0.10.3", default-features = false, features = ["aes", "heapless"] } | ||
| 76 | 85 | ||
| 77 | # BEGIN TESTS | 86 | # BEGIN TESTS |
| 78 | # Generated by gen_test.py. DO NOT EDIT. | 87 | # Generated by gen_test.py. DO NOT EDIT. |
| @@ -82,6 +91,11 @@ path = "src/bin/can.rs" | |||
| 82 | required-features = [ "can",] | 91 | required-features = [ "can",] |
| 83 | 92 | ||
| 84 | [[bin]] | 93 | [[bin]] |
| 94 | name = "cryp" | ||
| 95 | path = "src/bin/cryp.rs" | ||
| 96 | required-features = [ "cryp",] | ||
| 97 | |||
| 98 | [[bin]] | ||
| 85 | name = "dac" | 99 | name = "dac" |
| 86 | path = "src/bin/dac.rs" | 100 | path = "src/bin/dac.rs" |
| 87 | required-features = [ "dac",] | 101 | required-features = [ "dac",] |
| @@ -97,11 +111,21 @@ path = "src/bin/eth.rs" | |||
| 97 | required-features = [ "eth",] | 111 | required-features = [ "eth",] |
| 98 | 112 | ||
| 99 | [[bin]] | 113 | [[bin]] |
| 114 | name = "fdcan" | ||
| 115 | path = "src/bin/fdcan.rs" | ||
| 116 | required-features = [ "fdcan",] | ||
| 117 | |||
| 118 | [[bin]] | ||
| 100 | name = "gpio" | 119 | name = "gpio" |
| 101 | path = "src/bin/gpio.rs" | 120 | path = "src/bin/gpio.rs" |
| 102 | required-features = [] | 121 | required-features = [] |
| 103 | 122 | ||
| 104 | [[bin]] | 123 | [[bin]] |
| 124 | name = "hash" | ||
| 125 | path = "src/bin/hash.rs" | ||
| 126 | required-features = [ "hash",] | ||
| 127 | |||
| 128 | [[bin]] | ||
| 105 | name = "rng" | 129 | name = "rng" |
| 106 | path = "src/bin/rng.rs" | 130 | path = "src/bin/rng.rs" |
| 107 | required-features = [ "rng",] | 131 | required-features = [ "rng",] |
diff --git a/tests/stm32/build.rs b/tests/stm32/build.rs index f32a7b2f8..176adff62 100644 --- a/tests/stm32/build.rs +++ b/tests/stm32/build.rs | |||
| @@ -16,6 +16,9 @@ fn main() -> Result<(), Box<dyn Error>> { | |||
| 16 | feature = "stm32l073rz", | 16 | feature = "stm32l073rz", |
| 17 | // wrong ram size in stm32-data | 17 | // wrong ram size in stm32-data |
| 18 | feature = "stm32wl55jc", | 18 | feature = "stm32wl55jc", |
| 19 | feature = "stm32u5a5zj", | ||
| 20 | // no VTOR, so interrupts can't work when running from RAM | ||
| 21 | feature = "stm32f091rc", | ||
| 19 | )) { | 22 | )) { |
| 20 | println!("cargo:rustc-link-arg-bins=-Tlink.x"); | 23 | println!("cargo:rustc-link-arg-bins=-Tlink.x"); |
| 21 | println!("cargo:rerun-if-changed=link.x"); | 24 | println!("cargo:rerun-if-changed=link.x"); |
diff --git a/tests/stm32/src/bin/cryp.rs b/tests/stm32/src/bin/cryp.rs new file mode 100644 index 000000000..f105abf26 --- /dev/null +++ b/tests/stm32/src/bin/cryp.rs | |||
| @@ -0,0 +1,69 @@ | |||
| 1 | // required-features: cryp | ||
| 2 | #![no_std] | ||
| 3 | #![no_main] | ||
| 4 | |||
| 5 | #[path = "../common.rs"] | ||
| 6 | mod common; | ||
| 7 | |||
| 8 | use aes_gcm::aead::heapless::Vec; | ||
| 9 | use aes_gcm::aead::{AeadInPlace, KeyInit}; | ||
| 10 | use aes_gcm::Aes128Gcm; | ||
| 11 | use common::*; | ||
| 12 | use embassy_executor::Spawner; | ||
| 13 | use embassy_stm32::cryp::*; | ||
| 14 | use {defmt_rtt as _, panic_probe as _}; | ||
| 15 | |||
| 16 | #[embassy_executor::main] | ||
| 17 | async fn main(_spawner: Spawner) { | ||
| 18 | let p: embassy_stm32::Peripherals = embassy_stm32::init(config()); | ||
| 19 | |||
| 20 | const PAYLOAD1: &[u8] = b"payload data 1 ;zdfhzdfhS;GKJASBDG;ASKDJBAL,zdfhzdfhzdfhzdfhvljhb,jhbjhb,sdhsdghsdhsfhsghzdfhzdfhzdfhzdfdhsdthsthsdhsgaadfhhgkdgfuoyguoft6783567"; | ||
| 21 | const PAYLOAD2: &[u8] = b"payload data 2 ;SKEzdfhzdfhzbhgvljhb,jhbjhb,sdhsdghsdhsfhsghshsfhshstsdthadfhsdfjhsfgjsfgjxfgjzdhgDFghSDGHjtfjtjszftjzsdtjhstdsdhsdhsdhsdhsdthsthsdhsgfh"; | ||
| 22 | const AAD1: &[u8] = b"additional data 1 stdargadrhaethaethjatjatjaetjartjstrjsfkk;'jopofyuisrteytweTASTUIKFUKIXTRDTEREharhaeryhaterjartjarthaethjrtjarthaetrhartjatejatrjsrtjartjyt1"; | ||
| 23 | const AAD2: &[u8] = b"additional data 2 stdhthsthsthsrthsrthsrtjdykjdukdyuldadfhsdghsdghsdghsadghjk'hioethjrtjarthaetrhartjatecfgjhzdfhgzdfhzdfghzdfhzdfhzfhjatrjsrtjartjytjfytjfyg"; | ||
| 24 | |||
| 25 | let hw_cryp = Cryp::new(p.CRYP); | ||
| 26 | let key: [u8; 16] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; | ||
| 27 | let mut ciphertext: [u8; PAYLOAD1.len() + PAYLOAD2.len()] = [0; PAYLOAD1.len() + PAYLOAD2.len()]; | ||
| 28 | let mut plaintext: [u8; PAYLOAD1.len() + PAYLOAD2.len()] = [0; PAYLOAD1.len() + PAYLOAD2.len()]; | ||
| 29 | let iv: [u8; 12] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; | ||
| 30 | |||
| 31 | // Encrypt in hardware using AES-GCM 128-bit | ||
| 32 | let aes_gcm = AesGcm::new(&key, &iv); | ||
| 33 | let mut gcm_encrypt = hw_cryp.start(&aes_gcm, Direction::Encrypt); | ||
| 34 | hw_cryp.aad_blocking(&mut gcm_encrypt, AAD1, false); | ||
| 35 | hw_cryp.aad_blocking(&mut gcm_encrypt, AAD2, true); | ||
| 36 | hw_cryp.payload_blocking(&mut gcm_encrypt, PAYLOAD1, &mut ciphertext[..PAYLOAD1.len()], false); | ||
| 37 | hw_cryp.payload_blocking(&mut gcm_encrypt, PAYLOAD2, &mut ciphertext[PAYLOAD1.len()..], true); | ||
| 38 | let encrypt_tag = hw_cryp.finish_blocking(gcm_encrypt); | ||
| 39 | |||
| 40 | // Decrypt in hardware using AES-GCM 128-bit | ||
| 41 | let mut gcm_decrypt = hw_cryp.start(&aes_gcm, Direction::Decrypt); | ||
| 42 | hw_cryp.aad_blocking(&mut gcm_decrypt, AAD1, false); | ||
| 43 | hw_cryp.aad_blocking(&mut gcm_decrypt, AAD2, true); | ||
| 44 | hw_cryp.payload_blocking(&mut gcm_decrypt, &ciphertext, &mut plaintext, true); | ||
| 45 | let decrypt_tag = hw_cryp.finish_blocking(gcm_decrypt); | ||
| 46 | |||
| 47 | info!("AES-GCM Ciphertext: {:?}", ciphertext); | ||
| 48 | info!("AES-GCM Plaintext: {:?}", plaintext); | ||
| 49 | defmt::assert!(PAYLOAD1 == &plaintext[..PAYLOAD1.len()]); | ||
| 50 | defmt::assert!(PAYLOAD2 == &plaintext[PAYLOAD1.len()..]); | ||
| 51 | defmt::assert!(encrypt_tag == decrypt_tag); | ||
| 52 | |||
| 53 | // Encrypt in software using AES-GCM 128-bit | ||
| 54 | let mut payload_vec: Vec<u8, { PAYLOAD1.len() + PAYLOAD2.len() + 16 }> = Vec::from_slice(&PAYLOAD1).unwrap(); | ||
| 55 | payload_vec.extend_from_slice(&PAYLOAD2).unwrap(); | ||
| 56 | let cipher = Aes128Gcm::new(&key.into()); | ||
| 57 | let mut aad: Vec<u8, { AAD1.len() + AAD2.len() }> = Vec::from_slice(&AAD1).unwrap(); | ||
| 58 | aad.extend_from_slice(&AAD2).unwrap(); | ||
| 59 | let _ = cipher.encrypt_in_place(&iv.into(), &aad, &mut payload_vec); | ||
| 60 | |||
| 61 | defmt::assert!(ciphertext == payload_vec[0..ciphertext.len()]); | ||
| 62 | defmt::assert!(encrypt_tag == payload_vec[ciphertext.len()..ciphertext.len() + encrypt_tag.len()]); | ||
| 63 | |||
| 64 | // Decrypt in software using AES-GCM 128-bit | ||
| 65 | let _ = cipher.decrypt_in_place(&iv.into(), &aad, &mut payload_vec); | ||
| 66 | |||
| 67 | info!("Test OK"); | ||
| 68 | cortex_m::asm::bkpt(); | ||
| 69 | } | ||
diff --git a/tests/stm32/src/bin/fdcan.rs b/tests/stm32/src/bin/fdcan.rs new file mode 100644 index 000000000..dd78d7fb3 --- /dev/null +++ b/tests/stm32/src/bin/fdcan.rs | |||
| @@ -0,0 +1,190 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | |||
| 4 | // required-features: fdcan | ||
| 5 | |||
| 6 | #[path = "../common.rs"] | ||
| 7 | mod common; | ||
| 8 | use common::*; | ||
| 9 | use defmt::assert; | ||
| 10 | use embassy_executor::Spawner; | ||
| 11 | use embassy_stm32::peripherals::*; | ||
| 12 | use embassy_stm32::{bind_interrupts, can, Config}; | ||
| 13 | use embassy_time::{Duration, Instant}; | ||
| 14 | use {defmt_rtt as _, panic_probe as _}; | ||
| 15 | |||
| 16 | bind_interrupts!(struct Irqs { | ||
| 17 | FDCAN1_IT0 => can::IT0InterruptHandler<FDCAN1>; | ||
| 18 | FDCAN1_IT1 => can::IT1InterruptHandler<FDCAN1>; | ||
| 19 | }); | ||
| 20 | |||
| 21 | struct TestOptions { | ||
| 22 | config: Config, | ||
| 23 | max_latency: Duration, | ||
| 24 | second_fifo_working: bool, | ||
| 25 | } | ||
| 26 | |||
| 27 | #[cfg(any(feature = "stm32h755zi", feature = "stm32h753zi", feature = "stm32h563zi"))] | ||
| 28 | fn options() -> TestOptions { | ||
| 29 | use embassy_stm32::rcc; | ||
| 30 | info!("H75 config"); | ||
| 31 | let mut c = config(); | ||
| 32 | c.rcc.hse = Some(rcc::Hse { | ||
| 33 | freq: embassy_stm32::time::Hertz(25_000_000), | ||
| 34 | mode: rcc::HseMode::Oscillator, | ||
| 35 | }); | ||
| 36 | c.rcc.mux.fdcansel = rcc::mux::Fdcansel::HSE; | ||
| 37 | TestOptions { | ||
| 38 | config: c, | ||
| 39 | max_latency: Duration::from_micros(1200), | ||
| 40 | second_fifo_working: false, | ||
| 41 | } | ||
| 42 | } | ||
| 43 | |||
| 44 | #[cfg(any(feature = "stm32h7a3zi"))] | ||
| 45 | fn options() -> TestOptions { | ||
| 46 | use embassy_stm32::rcc; | ||
| 47 | info!("H7a config"); | ||
| 48 | let mut c = config(); | ||
| 49 | c.rcc.hse = Some(rcc::Hse { | ||
| 50 | freq: embassy_stm32::time::Hertz(25_000_000), | ||
| 51 | mode: rcc::HseMode::Oscillator, | ||
| 52 | }); | ||
| 53 | c.rcc.mux.fdcansel = rcc::mux::Fdcansel::HSE; | ||
| 54 | TestOptions { | ||
| 55 | config: c, | ||
| 56 | max_latency: Duration::from_micros(1200), | ||
| 57 | second_fifo_working: false, | ||
| 58 | } | ||
| 59 | } | ||
| 60 | |||
| 61 | #[cfg(any(feature = "stm32g491re", feature = "stm32g431cb"))] | ||
| 62 | fn options() -> TestOptions { | ||
| 63 | info!("G4 config"); | ||
| 64 | TestOptions { | ||
| 65 | config: config(), | ||
| 66 | max_latency: Duration::from_micros(500), | ||
| 67 | second_fifo_working: true, | ||
| 68 | } | ||
| 69 | } | ||
| 70 | |||
| 71 | #[embassy_executor::main] | ||
| 72 | async fn main(_spawner: Spawner) { | ||
| 73 | //let peripherals = embassy_stm32::init(config()); | ||
| 74 | |||
| 75 | let options = options(); | ||
| 76 | let peripherals = embassy_stm32::init(options.config); | ||
| 77 | |||
| 78 | let mut can = can::FdcanConfigurator::new(peripherals.FDCAN1, peripherals.PB8, peripherals.PB9, Irqs); | ||
| 79 | |||
| 80 | // 250k bps | ||
| 81 | can.set_bitrate(250_000); | ||
| 82 | |||
| 83 | can.set_extended_filter( | ||
| 84 | can::filter::ExtendedFilterSlot::_0, | ||
| 85 | can::filter::ExtendedFilter::accept_all_into_fifo1(), | ||
| 86 | ); | ||
| 87 | |||
| 88 | let mut can = can.into_internal_loopback_mode(); | ||
| 89 | |||
| 90 | info!("CAN Configured"); | ||
| 91 | |||
| 92 | let mut i: u8 = 0; | ||
| 93 | loop { | ||
| 94 | let tx_frame = can::frame::ClassicFrame::new_standard(0x123, &[i; 1]).unwrap(); | ||
| 95 | |||
| 96 | info!("Transmitting frame..."); | ||
| 97 | let tx_ts = Instant::now(); | ||
| 98 | can.write(&tx_frame).await; | ||
| 99 | |||
| 100 | let (frame, timestamp) = can.read().await.unwrap(); | ||
| 101 | info!("Frame received!"); | ||
| 102 | |||
| 103 | // Check data. | ||
| 104 | assert!(i == frame.data()[0], "{} == {}", i, frame.data()[0]); | ||
| 105 | |||
| 106 | info!("loopback time {}", timestamp); | ||
| 107 | info!("loopback frame {=u8}", frame.data()[0]); | ||
| 108 | let latency = timestamp.saturating_duration_since(tx_ts); | ||
| 109 | info!("loopback latency {} us", latency.as_micros()); | ||
| 110 | |||
| 111 | // Theoretical minimum latency is 55us, actual is usually ~80us | ||
| 112 | const MIN_LATENCY: Duration = Duration::from_micros(50); | ||
| 113 | // Was failing at 150 but we are not getting a real time stamp. I'm not | ||
| 114 | // sure if there are other delays | ||
| 115 | assert!( | ||
| 116 | MIN_LATENCY <= latency && latency <= options.max_latency, | ||
| 117 | "{} <= {} <= {}", | ||
| 118 | MIN_LATENCY, | ||
| 119 | latency, | ||
| 120 | options.max_latency | ||
| 121 | ); | ||
| 122 | |||
| 123 | i += 1; | ||
| 124 | if i > 10 { | ||
| 125 | break; | ||
| 126 | } | ||
| 127 | } | ||
| 128 | |||
| 129 | let max_buffered = if options.second_fifo_working { 6 } else { 3 }; | ||
| 130 | |||
| 131 | // Below here, check that we can receive from both FIFO0 and FIFO0 | ||
| 132 | // Above we configured FIFO1 for extended ID packets. There are only 3 slots | ||
| 133 | // in each FIFO so make sure we write enough to fill them both up before reading. | ||
| 134 | for i in 0..3 { | ||
| 135 | // Try filling up the RX FIFO0 buffers with standard packets | ||
| 136 | let tx_frame = can::frame::ClassicFrame::new_standard(0x123, &[i; 1]).unwrap(); | ||
| 137 | info!("Transmitting frame {}", i); | ||
| 138 | can.write(&tx_frame).await; | ||
| 139 | } | ||
| 140 | for i in 3..max_buffered { | ||
| 141 | // Try filling up the RX FIFO0 buffers with extended packets | ||
| 142 | let tx_frame = can::frame::ClassicFrame::new_extended(0x1232344, &[i; 1]).unwrap(); | ||
| 143 | info!("Transmitting frame {}", i); | ||
| 144 | can.write(&tx_frame).await; | ||
| 145 | } | ||
| 146 | |||
| 147 | // Try and receive all 6 packets | ||
| 148 | for i in 0..max_buffered { | ||
| 149 | let (frame, _ts) = can.read().await.unwrap(); | ||
| 150 | match frame.id() { | ||
| 151 | embedded_can::Id::Extended(id) => { | ||
| 152 | info!("Extended received! {:x} {} {}", id.as_raw(), frame.data()[0], i); | ||
| 153 | } | ||
| 154 | embedded_can::Id::Standard(id) => { | ||
| 155 | info!("Standard received! {:x} {} {}", id.as_raw(), frame.data()[0], i); | ||
| 156 | } | ||
| 157 | } | ||
| 158 | } | ||
| 159 | |||
| 160 | // Test again with a split | ||
| 161 | let (mut tx, mut rx) = can.split(); | ||
| 162 | for i in 0..3 { | ||
| 163 | // Try filling up the RX FIFO0 buffers with standard packets | ||
| 164 | let tx_frame = can::frame::ClassicFrame::new_standard(0x123, &[i; 1]).unwrap(); | ||
| 165 | info!("Transmitting frame {}", i); | ||
| 166 | tx.write(&tx_frame).await; | ||
| 167 | } | ||
| 168 | for i in 3..max_buffered { | ||
| 169 | // Try filling up the RX FIFO0 buffers with extended packets | ||
| 170 | let tx_frame = can::frame::ClassicFrame::new_extended(0x1232344, &[i; 1]).unwrap(); | ||
| 171 | info!("Transmitting frame {}", i); | ||
| 172 | tx.write(&tx_frame).await; | ||
| 173 | } | ||
| 174 | |||
| 175 | // Try and receive all 6 packets | ||
| 176 | for i in 0..max_buffered { | ||
| 177 | let (frame, _ts) = rx.read().await.unwrap(); | ||
| 178 | match frame.id() { | ||
| 179 | embedded_can::Id::Extended(id) => { | ||
| 180 | info!("Extended received! {:x} {} {}", id.as_raw(), frame.data()[0], i); | ||
| 181 | } | ||
| 182 | embedded_can::Id::Standard(id) => { | ||
| 183 | info!("Standard received! {:x} {} {}", id.as_raw(), frame.data()[0], i); | ||
| 184 | } | ||
| 185 | } | ||
| 186 | } | ||
| 187 | |||
| 188 | info!("Test OK"); | ||
| 189 | cortex_m::asm::bkpt(); | ||
| 190 | } | ||
diff --git a/tests/stm32/src/bin/hash.rs b/tests/stm32/src/bin/hash.rs new file mode 100644 index 000000000..8cc5d593f --- /dev/null +++ b/tests/stm32/src/bin/hash.rs | |||
| @@ -0,0 +1,101 @@ | |||
| 1 | // required-features: hash | ||
| 2 | #![no_std] | ||
| 3 | #![no_main] | ||
| 4 | |||
| 5 | #[path = "../common.rs"] | ||
| 6 | mod common; | ||
| 7 | use common::*; | ||
| 8 | use embassy_executor::Spawner; | ||
| 9 | use embassy_stm32::dma::NoDma; | ||
| 10 | use embassy_stm32::hash::*; | ||
| 11 | use embassy_stm32::{bind_interrupts, hash, peripherals}; | ||
| 12 | use hmac::{Hmac, Mac}; | ||
| 13 | use sha2::{Digest, Sha224, Sha256}; | ||
| 14 | use {defmt_rtt as _, panic_probe as _}; | ||
| 15 | |||
| 16 | type HmacSha256 = Hmac<Sha256>; | ||
| 17 | |||
| 18 | #[cfg(any(feature = "stm32l4a6zg", feature = "stm32h755zi", feature = "stm32h753zi"))] | ||
| 19 | bind_interrupts!(struct Irqs { | ||
| 20 | HASH_RNG => hash::InterruptHandler<peripherals::HASH>; | ||
| 21 | }); | ||
| 22 | |||
| 23 | #[cfg(any( | ||
| 24 | feature = "stm32wba52cg", | ||
| 25 | feature = "stm32l552ze", | ||
| 26 | feature = "stm32h563zi", | ||
| 27 | feature = "stm32h503rb", | ||
| 28 | feature = "stm32u5a5zj", | ||
| 29 | feature = "stm32u585ai" | ||
| 30 | ))] | ||
| 31 | bind_interrupts!(struct Irqs { | ||
| 32 | HASH => hash::InterruptHandler<peripherals::HASH>; | ||
| 33 | }); | ||
| 34 | |||
| 35 | #[embassy_executor::main] | ||
| 36 | async fn main(_spawner: Spawner) { | ||
| 37 | let p: embassy_stm32::Peripherals = embassy_stm32::init(config()); | ||
| 38 | let mut hw_hasher = Hash::new(p.HASH, NoDma, Irqs); | ||
| 39 | |||
| 40 | let test_1: &[u8] = b"as;dfhaslfhas;oifvnasd;nifvnhasd;nifvhndlkfghsd;nvfnahssdfgsdafgsasdfasdfasdfasdfasdfghjklmnbvcalskdjghalskdjgfbaslkdjfgbalskdjgbalskdjbdfhsdfhsfghsfghfgh"; | ||
| 41 | let test_2: &[u8] = b"fdhalksdjfhlasdjkfhalskdjfhgal;skdjfgalskdhfjgalskdjfglafgadfgdfgdafgaadsfgfgdfgadrgsyfthxfgjfhklhjkfgukhulkvhlvhukgfhfsrghzdhxyfufynufyuszeradrtydyytserr"; | ||
| 42 | let test_3: &[u8] = b"a.ewtkluGWEBR.KAJRBTA,RMNRBG,FDMGB.kger.tkasjrbt.akrjtba.krjtba.ktmyna,nmbvtyliasd;gdrtba,sfvs.kgjzshd.gkbsr.tksejb.SDkfBSE.gkfgb>ESkfbSE>gkJSBESE>kbSE>fk"; | ||
| 43 | |||
| 44 | // Start an SHA-256 digest. | ||
| 45 | let mut sha256context = hw_hasher.start(Algorithm::SHA256, DataType::Width8, None); | ||
| 46 | hw_hasher.update_blocking(&mut sha256context, test_1); | ||
| 47 | |||
| 48 | // Interrupt the SHA-256 digest to compute an SHA-224 digest. | ||
| 49 | let mut sha224context = hw_hasher.start(Algorithm::SHA224, DataType::Width8, None); | ||
| 50 | hw_hasher.update_blocking(&mut sha224context, test_3); | ||
| 51 | let mut sha224_digest_buffer: [u8; 28] = [0; 28]; | ||
| 52 | let _ = hw_hasher.finish_blocking(sha224context, &mut sha224_digest_buffer); | ||
| 53 | |||
| 54 | // Finish the SHA-256 digest. | ||
| 55 | hw_hasher.update_blocking(&mut sha256context, test_2); | ||
| 56 | let mut sha256_digest_buffer: [u8; 32] = [0; 32]; | ||
| 57 | let _ = hw_hasher.finish_blocking(sha256context, &mut sha256_digest_buffer); | ||
| 58 | |||
| 59 | // Compute the SHA-256 digest in software. | ||
| 60 | let mut sw_sha256_hasher = Sha256::new(); | ||
| 61 | sw_sha256_hasher.update(test_1); | ||
| 62 | sw_sha256_hasher.update(test_2); | ||
| 63 | let sw_sha256_digest = sw_sha256_hasher.finalize(); | ||
| 64 | |||
| 65 | //Compute the SHA-224 digest in software. | ||
| 66 | let mut sw_sha224_hasher = Sha224::new(); | ||
| 67 | sw_sha224_hasher.update(test_3); | ||
| 68 | let sw_sha224_digest = sw_sha224_hasher.finalize(); | ||
| 69 | |||
| 70 | // Compare the SHA-256 digests. | ||
| 71 | info!("Hardware SHA-256 Digest: {:?}", sha256_digest_buffer); | ||
| 72 | info!("Software SHA-256 Digest: {:?}", sw_sha256_digest[..]); | ||
| 73 | defmt::assert!(sha256_digest_buffer == sw_sha256_digest[..]); | ||
| 74 | |||
| 75 | // Compare the SHA-224 digests. | ||
| 76 | info!("Hardware SHA-256 Digest: {:?}", sha224_digest_buffer); | ||
| 77 | info!("Software SHA-256 Digest: {:?}", sw_sha224_digest[..]); | ||
| 78 | defmt::assert!(sha224_digest_buffer == sw_sha224_digest[..]); | ||
| 79 | |||
| 80 | let hmac_key: [u8; 64] = [0x55; 64]; | ||
| 81 | |||
| 82 | // Compute HMAC in hardware. | ||
| 83 | let mut sha256hmac_context = hw_hasher.start(Algorithm::SHA256, DataType::Width8, Some(&hmac_key)); | ||
| 84 | hw_hasher.update_blocking(&mut sha256hmac_context, test_1); | ||
| 85 | hw_hasher.update_blocking(&mut sha256hmac_context, test_2); | ||
| 86 | let mut hw_hmac: [u8; 32] = [0; 32]; | ||
| 87 | hw_hasher.finish_blocking(sha256hmac_context, &mut hw_hmac); | ||
| 88 | |||
| 89 | // Compute HMAC in software. | ||
| 90 | let mut sw_mac = HmacSha256::new_from_slice(&hmac_key).unwrap(); | ||
| 91 | sw_mac.update(test_1); | ||
| 92 | sw_mac.update(test_2); | ||
| 93 | let sw_hmac = sw_mac.finalize().into_bytes(); | ||
| 94 | |||
| 95 | info!("Hardware HMAC: {:?}", hw_hmac); | ||
| 96 | info!("Software HMAC: {:?}", sw_hmac[..]); | ||
| 97 | defmt::assert!(hw_hmac == sw_hmac[..]); | ||
| 98 | |||
| 99 | info!("Test OK"); | ||
| 100 | cortex_m::asm::bkpt(); | ||
| 101 | } | ||
diff --git a/tests/stm32/src/bin/usart_rx_ringbuffered.rs b/tests/stm32/src/bin/usart_rx_ringbuffered.rs index f5d618db4..0c110421d 100644 --- a/tests/stm32/src/bin/usart_rx_ringbuffered.rs +++ b/tests/stm32/src/bin/usart_rx_ringbuffered.rs | |||
| @@ -74,7 +74,7 @@ async fn transmit_task(mut tx: UartTx<'static, peris::UART, peris::UART_TX_DMA>) | |||
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | #[embassy_executor::task] | 76 | #[embassy_executor::task] |
| 77 | async fn receive_task(mut rx: RingBufferedUartRx<'static, peris::UART, peris::UART_RX_DMA>) { | 77 | async fn receive_task(mut rx: RingBufferedUartRx<'static, peris::UART>) { |
| 78 | info!("Ready to receive..."); | 78 | info!("Ready to receive..."); |
| 79 | 79 | ||
| 80 | let mut rng = ChaCha8Rng::seed_from_u64(1337); | 80 | let mut rng = ChaCha8Rng::seed_from_u64(1337); |
diff --git a/tests/stm32/src/common.rs b/tests/stm32/src/common.rs index 313380b35..3297ea7e2 100644 --- a/tests/stm32/src/common.rs +++ b/tests/stm32/src/common.rs | |||
| @@ -2,6 +2,8 @@ | |||
| 2 | 2 | ||
| 3 | pub use defmt::*; | 3 | pub use defmt::*; |
| 4 | #[allow(unused)] | 4 | #[allow(unused)] |
| 5 | use embassy_stm32::rcc::*; | ||
| 6 | #[allow(unused)] | ||
| 5 | use embassy_stm32::time::Hertz; | 7 | use embassy_stm32::time::Hertz; |
| 6 | use embassy_stm32::Config; | 8 | use embassy_stm32::Config; |
| 7 | use {defmt_rtt as _, panic_probe as _}; | 9 | use {defmt_rtt as _, panic_probe as _}; |
| @@ -54,6 +56,10 @@ teleprobe_meta::target!(b"nucleo-stm32l496zg"); | |||
| 54 | teleprobe_meta::target!(b"nucleo-stm32wl55jc"); | 56 | teleprobe_meta::target!(b"nucleo-stm32wl55jc"); |
| 55 | #[cfg(feature = "stm32wba52cg")] | 57 | #[cfg(feature = "stm32wba52cg")] |
| 56 | teleprobe_meta::target!(b"nucleo-stm32wba52cg"); | 58 | teleprobe_meta::target!(b"nucleo-stm32wba52cg"); |
| 59 | #[cfg(feature = "stm32f091rc")] | ||
| 60 | teleprobe_meta::target!(b"nucleo-stm32f091rc"); | ||
| 61 | #[cfg(feature = "stm32h503rb")] | ||
| 62 | teleprobe_meta::target!(b"nucleo-stm32h503rb"); | ||
| 57 | 63 | ||
| 58 | macro_rules! define_peris { | 64 | macro_rules! define_peris { |
| 59 | ($($name:ident = $peri:ident,)* $(@irq $irq_name:ident = $irq_code:tt,)*) => { | 65 | ($($name:ident = $peri:ident,)* $(@irq $irq_name:ident = $irq_code:tt,)*) => { |
| @@ -85,6 +91,12 @@ macro_rules! define_peris { | |||
| 85 | }; | 91 | }; |
| 86 | } | 92 | } |
| 87 | 93 | ||
| 94 | #[cfg(feature = "stm32f091rc")] | ||
| 95 | define_peris!( | ||
| 96 | UART = USART1, UART_TX = PA9, UART_RX = PA10, UART_TX_DMA = DMA1_CH4, UART_RX_DMA = DMA1_CH5, | ||
| 97 | SPI = SPI1, SPI_SCK = PA5, SPI_MOSI = PA7, SPI_MISO = PA6, SPI_TX_DMA = DMA1_CH3, SPI_RX_DMA = DMA1_CH2, | ||
| 98 | @irq UART = {USART1 => embassy_stm32::usart::InterruptHandler<embassy_stm32::peripherals::USART1>;}, | ||
| 99 | ); | ||
| 88 | #[cfg(feature = "stm32f103c8")] | 100 | #[cfg(feature = "stm32f103c8")] |
| 89 | define_peris!( | 101 | define_peris!( |
| 90 | UART = USART1, UART_TX = PA9, UART_RX = PA10, UART_TX_DMA = DMA1_CH4, UART_RX_DMA = DMA1_CH5, | 102 | UART = USART1, UART_TX = PA9, UART_RX = PA10, UART_TX_DMA = DMA1_CH4, UART_RX_DMA = DMA1_CH5, |
| @@ -157,6 +169,12 @@ define_peris!( | |||
| 157 | SPI = SPI4, SPI_SCK = PE12, SPI_MOSI = PE14, SPI_MISO = PE13, SPI_TX_DMA = GPDMA1_CH0, SPI_RX_DMA = GPDMA1_CH1, | 169 | SPI = SPI4, SPI_SCK = PE12, SPI_MOSI = PE14, SPI_MISO = PE13, SPI_TX_DMA = GPDMA1_CH0, SPI_RX_DMA = GPDMA1_CH1, |
| 158 | @irq UART = {LPUART1 => embassy_stm32::usart::InterruptHandler<embassy_stm32::peripherals::LPUART1>;}, | 170 | @irq UART = {LPUART1 => embassy_stm32::usart::InterruptHandler<embassy_stm32::peripherals::LPUART1>;}, |
| 159 | ); | 171 | ); |
| 172 | #[cfg(feature = "stm32h503rb")] | ||
| 173 | define_peris!( | ||
| 174 | UART = USART1, UART_TX = PB14, UART_RX = PB15, UART_TX_DMA = GPDMA1_CH0, UART_RX_DMA = GPDMA1_CH1, | ||
| 175 | SPI = SPI1, SPI_SCK = PA5, SPI_MOSI = PA7, SPI_MISO = PA6, SPI_TX_DMA = GPDMA1_CH0, SPI_RX_DMA = GPDMA1_CH1, | ||
| 176 | @irq UART = {USART1 => embassy_stm32::usart::InterruptHandler<embassy_stm32::peripherals::USART1>;}, | ||
| 177 | ); | ||
| 160 | #[cfg(feature = "stm32c031c6")] | 178 | #[cfg(feature = "stm32c031c6")] |
| 161 | define_peris!( | 179 | define_peris!( |
| 162 | UART = USART1, UART_TX = PB6, UART_RX = PB7, UART_TX_DMA = DMA1_CH1, UART_RX_DMA = DMA1_CH2, | 180 | UART = USART1, UART_TX = PB6, UART_RX = PB7, UART_TX_DMA = DMA1_CH1, UART_RX_DMA = DMA1_CH2, |
| @@ -242,14 +260,68 @@ pub fn config() -> Config { | |||
| 242 | #[allow(unused_mut)] | 260 | #[allow(unused_mut)] |
| 243 | let mut config = Config::default(); | 261 | let mut config = Config::default(); |
| 244 | 262 | ||
| 263 | #[cfg(feature = "stm32c031c6")] | ||
| 264 | { | ||
| 265 | config.rcc.hsi = Some(Hsi { | ||
| 266 | sys_div: HsiSysDiv::DIV1, // 48Mhz | ||
| 267 | ker_div: HsiKerDiv::DIV3, // 16Mhz | ||
| 268 | }); | ||
| 269 | config.rcc.sys = Sysclk::HSISYS; | ||
| 270 | config.rcc.ahb_pre = AHBPrescaler::DIV1; | ||
| 271 | config.rcc.apb1_pre = APBPrescaler::DIV1; | ||
| 272 | } | ||
| 273 | |||
| 274 | #[cfg(feature = "stm32g071rb")] | ||
| 275 | { | ||
| 276 | config.rcc.hsi = true; | ||
| 277 | config.rcc.pll = Some(Pll { | ||
| 278 | source: PllSource::HSI, | ||
| 279 | prediv: PllPreDiv::DIV1, | ||
| 280 | mul: PllMul::MUL16, | ||
| 281 | divp: None, | ||
| 282 | divq: None, | ||
| 283 | divr: Some(PllRDiv::DIV4), // 16 / 1 * 16 / 4 = 64 Mhz | ||
| 284 | }); | ||
| 285 | config.rcc.sys = Sysclk::PLL1_R; | ||
| 286 | } | ||
| 245 | #[cfg(feature = "stm32wb55rg")] | 287 | #[cfg(feature = "stm32wb55rg")] |
| 246 | { | 288 | { |
| 247 | config.rcc = embassy_stm32::rcc::WPAN_DEFAULT; | 289 | config.rcc = embassy_stm32::rcc::WPAN_DEFAULT; |
| 248 | } | 290 | } |
| 249 | 291 | ||
| 292 | #[cfg(feature = "stm32f091rc")] | ||
| 293 | { | ||
| 294 | config.rcc.hse = Some(Hse { | ||
| 295 | freq: Hertz(8_000_000), | ||
| 296 | mode: HseMode::Bypass, | ||
| 297 | }); | ||
| 298 | config.rcc.pll = Some(Pll { | ||
| 299 | src: PllSource::HSE, | ||
| 300 | prediv: PllPreDiv::DIV1, | ||
| 301 | mul: PllMul::MUL6, | ||
| 302 | }); | ||
| 303 | config.rcc.sys = Sysclk::PLL1_P; | ||
| 304 | config.rcc.ahb_pre = AHBPrescaler::DIV1; | ||
| 305 | config.rcc.apb1_pre = APBPrescaler::DIV1; | ||
| 306 | } | ||
| 307 | #[cfg(feature = "stm32f103c8")] | ||
| 308 | { | ||
| 309 | config.rcc.hse = Some(Hse { | ||
| 310 | freq: Hertz(8_000_000), | ||
| 311 | mode: HseMode::Oscillator, | ||
| 312 | }); | ||
| 313 | config.rcc.pll = Some(Pll { | ||
| 314 | src: PllSource::HSE, | ||
| 315 | prediv: PllPreDiv::DIV1, | ||
| 316 | mul: PllMul::MUL9, | ||
| 317 | }); | ||
| 318 | config.rcc.sys = Sysclk::PLL1_P; | ||
| 319 | config.rcc.ahb_pre = AHBPrescaler::DIV1; | ||
| 320 | config.rcc.apb1_pre = APBPrescaler::DIV2; | ||
| 321 | config.rcc.apb2_pre = APBPrescaler::DIV1; | ||
| 322 | } | ||
| 250 | #[cfg(feature = "stm32f207zg")] | 323 | #[cfg(feature = "stm32f207zg")] |
| 251 | { | 324 | { |
| 252 | use embassy_stm32::rcc::*; | ||
| 253 | // By default, HSE on the board comes from a 8 MHz clock signal (not a crystal) | 325 | // By default, HSE on the board comes from a 8 MHz clock signal (not a crystal) |
| 254 | config.rcc.hse = Some(Hse { | 326 | config.rcc.hse = Some(Hse { |
| 255 | freq: Hertz(8_000_000), | 327 | freq: Hertz(8_000_000), |
| @@ -276,9 +348,25 @@ pub fn config() -> Config { | |||
| 276 | config.rcc.apb2_pre = APBPrescaler::DIV2; | 348 | config.rcc.apb2_pre = APBPrescaler::DIV2; |
| 277 | } | 349 | } |
| 278 | 350 | ||
| 351 | #[cfg(feature = "stm32f303ze")] | ||
| 352 | { | ||
| 353 | config.rcc.hse = Some(Hse { | ||
| 354 | freq: Hertz(8_000_000), | ||
| 355 | mode: HseMode::Bypass, | ||
| 356 | }); | ||
| 357 | config.rcc.pll = Some(Pll { | ||
| 358 | src: PllSource::HSE, | ||
| 359 | prediv: PllPreDiv::DIV1, | ||
| 360 | mul: PllMul::MUL9, | ||
| 361 | }); | ||
| 362 | config.rcc.sys = Sysclk::PLL1_P; | ||
| 363 | config.rcc.ahb_pre = AHBPrescaler::DIV1; | ||
| 364 | config.rcc.apb1_pre = APBPrescaler::DIV2; | ||
| 365 | config.rcc.apb2_pre = APBPrescaler::DIV1; | ||
| 366 | } | ||
| 367 | |||
| 279 | #[cfg(feature = "stm32f429zi")] | 368 | #[cfg(feature = "stm32f429zi")] |
| 280 | { | 369 | { |
| 281 | use embassy_stm32::rcc::*; | ||
| 282 | config.rcc.hse = Some(Hse { | 370 | config.rcc.hse = Some(Hse { |
| 283 | freq: Hertz(8_000_000), | 371 | freq: Hertz(8_000_000), |
| 284 | mode: HseMode::Bypass, | 372 | mode: HseMode::Bypass, |
| @@ -299,7 +387,6 @@ pub fn config() -> Config { | |||
| 299 | 387 | ||
| 300 | #[cfg(feature = "stm32f446re")] | 388 | #[cfg(feature = "stm32f446re")] |
| 301 | { | 389 | { |
| 302 | use embassy_stm32::rcc::*; | ||
| 303 | config.rcc.hse = Some(Hse { | 390 | config.rcc.hse = Some(Hse { |
| 304 | freq: Hertz(8_000_000), | 391 | freq: Hertz(8_000_000), |
| 305 | mode: HseMode::Oscillator, | 392 | mode: HseMode::Oscillator, |
| @@ -320,7 +407,6 @@ pub fn config() -> Config { | |||
| 320 | 407 | ||
| 321 | #[cfg(feature = "stm32f767zi")] | 408 | #[cfg(feature = "stm32f767zi")] |
| 322 | { | 409 | { |
| 323 | use embassy_stm32::rcc::*; | ||
| 324 | config.rcc.hse = Some(Hse { | 410 | config.rcc.hse = Some(Hse { |
| 325 | freq: Hertz(8_000_000), | 411 | freq: Hertz(8_000_000), |
| 326 | mode: HseMode::Bypass, | 412 | mode: HseMode::Bypass, |
| @@ -341,7 +427,6 @@ pub fn config() -> Config { | |||
| 341 | 427 | ||
| 342 | #[cfg(feature = "stm32h563zi")] | 428 | #[cfg(feature = "stm32h563zi")] |
| 343 | { | 429 | { |
| 344 | use embassy_stm32::rcc::*; | ||
| 345 | config.rcc.hsi = None; | 430 | config.rcc.hsi = None; |
| 346 | config.rcc.hsi48 = Some(Default::default()); // needed for RNG | 431 | config.rcc.hsi48 = Some(Default::default()); // needed for RNG |
| 347 | config.rcc.hse = Some(Hse { | 432 | config.rcc.hse = Some(Hse { |
| @@ -364,9 +449,50 @@ pub fn config() -> Config { | |||
| 364 | config.rcc.voltage_scale = VoltageScale::Scale0; | 449 | config.rcc.voltage_scale = VoltageScale::Scale0; |
| 365 | } | 450 | } |
| 366 | 451 | ||
| 452 | #[cfg(feature = "stm32h503rb")] | ||
| 453 | { | ||
| 454 | config.rcc.hsi = None; | ||
| 455 | config.rcc.hsi48 = Some(Default::default()); // needed for RNG | ||
| 456 | config.rcc.hse = Some(Hse { | ||
| 457 | freq: Hertz(24_000_000), | ||
| 458 | mode: HseMode::Oscillator, | ||
| 459 | }); | ||
| 460 | config.rcc.pll1 = Some(Pll { | ||
| 461 | source: PllSource::HSE, | ||
| 462 | prediv: PllPreDiv::DIV6, | ||
| 463 | mul: PllMul::MUL125, | ||
| 464 | divp: Some(PllDiv::DIV2), | ||
| 465 | divq: Some(PllDiv::DIV2), | ||
| 466 | divr: None, | ||
| 467 | }); | ||
| 468 | config.rcc.ahb_pre = AHBPrescaler::DIV1; | ||
| 469 | config.rcc.apb1_pre = APBPrescaler::DIV1; | ||
| 470 | config.rcc.apb2_pre = APBPrescaler::DIV1; | ||
| 471 | config.rcc.apb3_pre = APBPrescaler::DIV1; | ||
| 472 | config.rcc.sys = Sysclk::PLL1_P; | ||
| 473 | config.rcc.voltage_scale = VoltageScale::Scale0; | ||
| 474 | } | ||
| 475 | |||
| 476 | #[cfg(feature = "stm32g491re")] | ||
| 477 | { | ||
| 478 | config.rcc.hse = Some(Hse { | ||
| 479 | freq: Hertz(24_000_000), | ||
| 480 | mode: HseMode::Oscillator, | ||
| 481 | }); | ||
| 482 | config.rcc.pll = Some(Pll { | ||
| 483 | source: PllSource::HSE, | ||
| 484 | prediv: PllPreDiv::DIV6, | ||
| 485 | mul: PllMul::MUL85, | ||
| 486 | divp: None, | ||
| 487 | divq: Some(PllQDiv::DIV8), // 42.5 Mhz for fdcan. | ||
| 488 | divr: Some(PllRDiv::DIV2), // Main system clock at 170 MHz | ||
| 489 | }); | ||
| 490 | config.rcc.mux.fdcansel = mux::Fdcansel::PLL1_Q; | ||
| 491 | config.rcc.sys = Sysclk::PLL1_R; | ||
| 492 | } | ||
| 493 | |||
| 367 | #[cfg(any(feature = "stm32h755zi", feature = "stm32h753zi"))] | 494 | #[cfg(any(feature = "stm32h755zi", feature = "stm32h753zi"))] |
| 368 | { | 495 | { |
| 369 | use embassy_stm32::rcc::*; | ||
| 370 | config.rcc.hsi = Some(HSIPrescaler::DIV1); | 496 | config.rcc.hsi = Some(HSIPrescaler::DIV1); |
| 371 | config.rcc.csi = true; | 497 | config.rcc.csi = true; |
| 372 | config.rcc.hsi48 = Some(Default::default()); // needed for RNG | 498 | config.rcc.hsi48 = Some(Default::default()); // needed for RNG |
| @@ -393,12 +519,15 @@ pub fn config() -> Config { | |||
| 393 | config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz | 519 | config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz |
| 394 | config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz | 520 | config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz |
| 395 | config.rcc.voltage_scale = VoltageScale::Scale1; | 521 | config.rcc.voltage_scale = VoltageScale::Scale1; |
| 396 | config.rcc.adc_clock_source = AdcClockSource::PLL2_P; | 522 | config.rcc.mux.adcsel = mux::Adcsel::PLL2_P; |
| 523 | #[cfg(any(feature = "stm32h755zi"))] | ||
| 524 | { | ||
| 525 | config.rcc.supply_config = SupplyConfig::DirectSMPS; | ||
| 526 | } | ||
| 397 | } | 527 | } |
| 398 | 528 | ||
| 399 | #[cfg(any(feature = "stm32h7a3zi"))] | 529 | #[cfg(any(feature = "stm32h7a3zi"))] |
| 400 | { | 530 | { |
| 401 | use embassy_stm32::rcc::*; | ||
| 402 | config.rcc.hsi = Some(HSIPrescaler::DIV1); | 531 | config.rcc.hsi = Some(HSIPrescaler::DIV1); |
| 403 | config.rcc.csi = true; | 532 | config.rcc.csi = true; |
| 404 | config.rcc.hsi48 = Some(Default::default()); // needed for RNG | 533 | config.rcc.hsi48 = Some(Default::default()); // needed for RNG |
| @@ -425,13 +554,12 @@ pub fn config() -> Config { | |||
| 425 | config.rcc.apb3_pre = APBPrescaler::DIV2; // 140 Mhz | 554 | config.rcc.apb3_pre = APBPrescaler::DIV2; // 140 Mhz |
| 426 | config.rcc.apb4_pre = APBPrescaler::DIV2; // 140 Mhz | 555 | config.rcc.apb4_pre = APBPrescaler::DIV2; // 140 Mhz |
| 427 | config.rcc.voltage_scale = VoltageScale::Scale0; | 556 | config.rcc.voltage_scale = VoltageScale::Scale0; |
| 428 | config.rcc.adc_clock_source = AdcClockSource::PLL2_P; | 557 | config.rcc.mux.adcsel = mux::Adcsel::PLL2_P; |
| 429 | } | 558 | } |
| 430 | 559 | ||
| 431 | #[cfg(any(feature = "stm32l496zg", feature = "stm32l4a6zg", feature = "stm32l4r5zi"))] | 560 | #[cfg(any(feature = "stm32l496zg", feature = "stm32l4a6zg", feature = "stm32l4r5zi"))] |
| 432 | { | 561 | { |
| 433 | use embassy_stm32::rcc::*; | 562 | config.rcc.sys = Sysclk::PLL1_R; |
| 434 | config.rcc.mux = ClockSrc::PLL1_R; | ||
| 435 | config.rcc.hsi = true; | 563 | config.rcc.hsi = true; |
| 436 | config.rcc.pll = Some(Pll { | 564 | config.rcc.pll = Some(Pll { |
| 437 | source: PllSource::HSI, | 565 | source: PllSource::HSI, |
| @@ -445,13 +573,12 @@ pub fn config() -> Config { | |||
| 445 | 573 | ||
| 446 | #[cfg(feature = "stm32wl55jc")] | 574 | #[cfg(feature = "stm32wl55jc")] |
| 447 | { | 575 | { |
| 448 | use embassy_stm32::rcc::*; | ||
| 449 | config.rcc.hse = Some(Hse { | 576 | config.rcc.hse = Some(Hse { |
| 450 | freq: Hertz(32_000_000), | 577 | freq: Hertz(32_000_000), |
| 451 | mode: HseMode::Bypass, | 578 | mode: HseMode::Bypass, |
| 452 | prescaler: HsePrescaler::DIV1, | 579 | prescaler: HsePrescaler::DIV1, |
| 453 | }); | 580 | }); |
| 454 | config.rcc.mux = ClockSrc::PLL1_R; | 581 | config.rcc.sys = Sysclk::PLL1_R; |
| 455 | config.rcc.pll = Some(Pll { | 582 | config.rcc.pll = Some(Pll { |
| 456 | source: PllSource::HSE, | 583 | source: PllSource::HSE, |
| 457 | prediv: PllPreDiv::DIV2, | 584 | prediv: PllPreDiv::DIV2, |
| @@ -464,9 +591,8 @@ pub fn config() -> Config { | |||
| 464 | 591 | ||
| 465 | #[cfg(any(feature = "stm32l552ze"))] | 592 | #[cfg(any(feature = "stm32l552ze"))] |
| 466 | { | 593 | { |
| 467 | use embassy_stm32::rcc::*; | ||
| 468 | config.rcc.hsi = true; | 594 | config.rcc.hsi = true; |
| 469 | config.rcc.mux = ClockSrc::PLL1_R; | 595 | config.rcc.sys = Sysclk::PLL1_R; |
| 470 | config.rcc.pll = Some(Pll { | 596 | config.rcc.pll = Some(Pll { |
| 471 | // 110Mhz clock (16 / 4 * 55 / 2) | 597 | // 110Mhz clock (16 / 4 * 55 / 2) |
| 472 | source: PllSource::HSI, | 598 | source: PllSource::HSI, |
| @@ -480,42 +606,46 @@ pub fn config() -> Config { | |||
| 480 | 606 | ||
| 481 | #[cfg(any(feature = "stm32u585ai", feature = "stm32u5a5zj"))] | 607 | #[cfg(any(feature = "stm32u585ai", feature = "stm32u5a5zj"))] |
| 482 | { | 608 | { |
| 483 | use embassy_stm32::rcc::*; | 609 | config.rcc.hsi = true; |
| 484 | config.rcc.mux = ClockSrc::MSI(Msirange::RANGE_48MHZ); | 610 | config.rcc.pll1 = Some(Pll { |
| 611 | source: PllSource::HSI, // 16 MHz | ||
| 612 | prediv: PllPreDiv::DIV1, | ||
| 613 | mul: PllMul::MUL10, | ||
| 614 | divp: None, | ||
| 615 | divq: None, | ||
| 616 | divr: Some(PllDiv::DIV1), // 160 MHz | ||
| 617 | }); | ||
| 618 | config.rcc.sys = Sysclk::PLL1_R; | ||
| 619 | config.rcc.voltage_range = VoltageScale::RANGE1; | ||
| 620 | config.rcc.hsi48 = Some(Hsi48Config { sync_from_usb: true }); // needed for USB | ||
| 485 | } | 621 | } |
| 486 | 622 | ||
| 487 | #[cfg(feature = "stm32wba52cg")] | 623 | #[cfg(feature = "stm32wba52cg")] |
| 488 | { | 624 | { |
| 489 | use embassy_stm32::rcc::*; | 625 | config.rcc.sys = Sysclk::HSI; |
| 490 | config.rcc.mux = ClockSrc::HSI; | 626 | config.rcc.mux.rngsel = mux::Rngsel::HSI; |
| 491 | |||
| 492 | embassy_stm32::pac::RCC.ccipr2().write(|w| { | ||
| 493 | w.set_rngsel(embassy_stm32::pac::rcc::vals::Rngsel::HSI); | ||
| 494 | }); | ||
| 495 | } | 627 | } |
| 496 | 628 | ||
| 497 | #[cfg(feature = "stm32l073rz")] | 629 | #[cfg(feature = "stm32l073rz")] |
| 498 | { | 630 | { |
| 499 | use embassy_stm32::rcc::*; | ||
| 500 | config.rcc.hsi = true; | 631 | config.rcc.hsi = true; |
| 501 | config.rcc.pll = Some(Pll { | 632 | config.rcc.pll = Some(Pll { |
| 502 | source: PllSource::HSI, | 633 | source: PllSource::HSI, |
| 503 | mul: PllMul::MUL4, | 634 | mul: PllMul::MUL4, |
| 504 | div: PllDiv::DIV2, // 32Mhz clock (16 * 4 / 2) | 635 | div: PllDiv::DIV2, // 32Mhz clock (16 * 4 / 2) |
| 505 | }); | 636 | }); |
| 506 | config.rcc.mux = ClockSrc::PLL1_R; | 637 | config.rcc.sys = Sysclk::PLL1_R; |
| 507 | } | 638 | } |
| 508 | 639 | ||
| 509 | #[cfg(any(feature = "stm32l152re"))] | 640 | #[cfg(any(feature = "stm32l152re"))] |
| 510 | { | 641 | { |
| 511 | use embassy_stm32::rcc::*; | ||
| 512 | config.rcc.hsi = true; | 642 | config.rcc.hsi = true; |
| 513 | config.rcc.pll = Some(Pll { | 643 | config.rcc.pll = Some(Pll { |
| 514 | source: PllSource::HSI, | 644 | source: PllSource::HSI, |
| 515 | mul: PllMul::MUL4, | 645 | mul: PllMul::MUL4, |
| 516 | div: PllDiv::DIV2, // 32Mhz clock (16 * 4 / 2) | 646 | div: PllDiv::DIV2, // 32Mhz clock (16 * 4 / 2) |
| 517 | }); | 647 | }); |
| 518 | config.rcc.mux = ClockSrc::PLL1_R; | 648 | config.rcc.sys = Sysclk::PLL1_R; |
| 519 | } | 649 | } |
| 520 | 650 | ||
| 521 | config | 651 | config |
diff --git a/tests/stm32/teleprobe.sh b/tests/stm32/teleprobe.sh deleted file mode 100755 index 6eec6ca93..000000000 --- a/tests/stm32/teleprobe.sh +++ /dev/null | |||
| @@ -1,12 +0,0 @@ | |||
| 1 | echo Running target=$1 elf=$2 | ||
| 2 | STATUSCODE=$( | ||
| 3 | curl \ | ||
| 4 | -sS \ | ||
| 5 | --output /dev/stderr \ | ||
| 6 | --write-out "%{http_code}" \ | ||
| 7 | -H "Authorization: Bearer $TELEPROBE_TOKEN" \ | ||
| 8 | https://teleprobe.embassy.dev/targets/$1/run --data-binary @$2 | ||
| 9 | ) | ||
| 10 | echo | ||
| 11 | echo HTTP Status code: $STATUSCODE | ||
| 12 | test "$STATUSCODE" -eq 200 | ||
