diff options
| author | pennae <[email protected]> | 2023-07-07 04:30:46 +0200 |
|---|---|---|
| committer | pennae <[email protected]> | 2023-07-07 16:27:10 +0200 |
| commit | 4b63829110b8ef314d22d78c160f54e6ae98634c (patch) | |
| tree | cf45eb607ae5aaee38c1d221bb2bd83ac6d5e7ef /tests | |
| parent | e196387e695da96b44609079a84ede77ef9ba7af (diff) | |
rp/pio: use bind_interrupts for irqs
closes #1338
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/rp/Cargo.toml | 2 | ||||
| -rw-r--r-- | tests/rp/src/bin/cyw43-perf.rs | 10 | ||||
| -rw-r--r-- | tests/rp/src/bin/pio_irq.rs | 55 |
3 files changed, 64 insertions, 3 deletions
diff --git a/tests/rp/Cargo.toml b/tests/rp/Cargo.toml index 368d4acf9..f2c902787 100644 --- a/tests/rp/Cargo.toml +++ b/tests/rp/Cargo.toml | |||
| @@ -29,6 +29,8 @@ futures = { version = "0.3.17", default-features = false, features = ["async-awa | |||
| 29 | embedded-io = { version = "0.4.0", features = ["async"] } | 29 | embedded-io = { version = "0.4.0", features = ["async"] } |
| 30 | embedded-storage = { version = "0.3" } | 30 | embedded-storage = { version = "0.3" } |
| 31 | static_cell = { version = "1.1", features = ["nightly"]} | 31 | static_cell = { version = "1.1", features = ["nightly"]} |
| 32 | pio = "0.2" | ||
| 33 | pio-proc = "0.2" | ||
| 32 | 34 | ||
| 33 | [profile.dev] | 35 | [profile.dev] |
| 34 | debug = 2 | 36 | debug = 2 |
diff --git a/tests/rp/src/bin/cyw43-perf.rs b/tests/rp/src/bin/cyw43-perf.rs index 1ecaab266..bc127e2e5 100644 --- a/tests/rp/src/bin/cyw43-perf.rs +++ b/tests/rp/src/bin/cyw43-perf.rs | |||
| @@ -12,12 +12,16 @@ use embassy_net::tcp::TcpSocket; | |||
| 12 | use embassy_net::{Config, Ipv4Address, Stack, StackResources}; | 12 | use embassy_net::{Config, Ipv4Address, Stack, StackResources}; |
| 13 | use embassy_rp::gpio::{Level, Output}; | 13 | use embassy_rp::gpio::{Level, Output}; |
| 14 | use embassy_rp::peripherals::{DMA_CH0, PIN_23, PIN_25, PIO0}; | 14 | use embassy_rp::peripherals::{DMA_CH0, PIN_23, PIN_25, PIO0}; |
| 15 | use embassy_rp::pio::Pio; | 15 | use embassy_rp::pio::{InterruptHandler, Pio}; |
| 16 | use embassy_rp::rom_data; | 16 | use embassy_rp::{bind_interrupts, rom_data}; |
| 17 | use embassy_time::{with_timeout, Duration, Timer}; | 17 | use embassy_time::{with_timeout, Duration, Timer}; |
| 18 | use static_cell::make_static; | 18 | use static_cell::make_static; |
| 19 | use {defmt_rtt as _, panic_probe as _}; | 19 | use {defmt_rtt as _, panic_probe as _}; |
| 20 | 20 | ||
| 21 | bind_interrupts!(struct Irqs { | ||
| 22 | PIO0_IRQ_0 => InterruptHandler<PIO0>; | ||
| 23 | }); | ||
| 24 | |||
| 21 | teleprobe_meta::timeout!(120); | 25 | teleprobe_meta::timeout!(120); |
| 22 | 26 | ||
| 23 | #[embassy_executor::task] | 27 | #[embassy_executor::task] |
| @@ -51,7 +55,7 @@ async fn main(spawner: Spawner) { | |||
| 51 | 55 | ||
| 52 | let pwr = Output::new(p.PIN_23, Level::Low); | 56 | let pwr = Output::new(p.PIN_23, Level::Low); |
| 53 | let cs = Output::new(p.PIN_25, Level::High); | 57 | let cs = Output::new(p.PIN_25, Level::High); |
| 54 | let mut pio = Pio::new(p.PIO0); | 58 | let mut pio = Pio::new(p.PIO0, Irqs); |
| 55 | let spi = PioSpi::new(&mut pio.common, pio.sm0, pio.irq0, cs, p.PIN_24, p.PIN_29, p.DMA_CH0); | 59 | let spi = PioSpi::new(&mut pio.common, pio.sm0, pio.irq0, cs, p.PIN_24, p.PIN_29, p.DMA_CH0); |
| 56 | 60 | ||
| 57 | let state = make_static!(cyw43::State::new()); | 61 | let state = make_static!(cyw43::State::new()); |
diff --git a/tests/rp/src/bin/pio_irq.rs b/tests/rp/src/bin/pio_irq.rs new file mode 100644 index 000000000..45004424a --- /dev/null +++ b/tests/rp/src/bin/pio_irq.rs | |||
| @@ -0,0 +1,55 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | #![feature(type_alias_impl_trait)] | ||
| 4 | #[path = "../common.rs"] | ||
| 5 | mod common; | ||
| 6 | |||
| 7 | use defmt::info; | ||
| 8 | use embassy_executor::Spawner; | ||
| 9 | use embassy_rp::bind_interrupts; | ||
| 10 | use embassy_rp::peripherals::PIO0; | ||
| 11 | use embassy_rp::pio::{Config, InterruptHandler, Pio}; | ||
| 12 | use embassy_rp::relocate::RelocatedProgram; | ||
| 13 | use {defmt_rtt as _, panic_probe as _}; | ||
| 14 | |||
| 15 | bind_interrupts!(struct Irqs { | ||
| 16 | PIO0_IRQ_0 => InterruptHandler<PIO0>; | ||
| 17 | }); | ||
| 18 | |||
| 19 | #[embassy_executor::main] | ||
| 20 | async fn main(_spawner: Spawner) { | ||
| 21 | let p = embassy_rp::init(Default::default()); | ||
| 22 | let pio = p.PIO0; | ||
| 23 | let Pio { | ||
| 24 | mut common, | ||
| 25 | sm0: mut sm, | ||
| 26 | irq_flags, | ||
| 27 | .. | ||
| 28 | } = Pio::new(pio, Irqs); | ||
| 29 | |||
| 30 | let prg = pio_proc::pio_asm!( | ||
| 31 | "irq set 0", | ||
| 32 | "irq wait 0", | ||
| 33 | "irq set 1", | ||
| 34 | // pause execution here | ||
| 35 | "irq wait 1", | ||
| 36 | ); | ||
| 37 | |||
| 38 | let relocated = RelocatedProgram::new(&prg.program); | ||
| 39 | let mut cfg = Config::default(); | ||
| 40 | cfg.use_program(&common.load_program(&relocated), &[]); | ||
| 41 | sm.set_config(&cfg); | ||
| 42 | sm.set_enable(true); | ||
| 43 | |||
| 44 | // not using the wait futures on purpose because they clear the irq bits, | ||
| 45 | // and we want to see in which order they are set. | ||
| 46 | while !irq_flags.check(0) {} | ||
| 47 | cortex_m::asm::nop(); | ||
| 48 | assert!(!irq_flags.check(1)); | ||
| 49 | irq_flags.clear(0); | ||
| 50 | cortex_m::asm::nop(); | ||
| 51 | assert!(irq_flags.check(1)); | ||
| 52 | |||
| 53 | info!("Test OK"); | ||
| 54 | cortex_m::asm::bkpt(); | ||
| 55 | } | ||
