#![no_std] #![no_main] use cyw43_pio::PioSpi; use defmt::*; use defmt_rtt as _; use embassy_executor::Spawner; use embassy_rp::{ bind_interrupts, gpio::{Level, Output}, peripherals::{DMA_CH0, PIO0}, pio::{InterruptHandler, Pio}, }; use embassy_time::Timer; use panic_probe as _; use static_cell::StaticCell; // bind interrupt request to handler bind_interrupts!(struct Irqs { PIO0_IRQ_0 => InterruptHandler; }); // network task #[embassy_executor::task] async fn cyw43_task( runner: cyw43::Runner<'static, Output<'static>, PioSpi<'static, PIO0, 0, DMA_CH0>>, ) -> ! { runner.run().await } #[embassy_executor::main] async fn main(spawner: Spawner) { // hardware abstraction layer let hal = embassy_rp::init(Default::default()); // wireless firmware binary let fw = include_bytes!("./firmware/43439A0.bin"); // wireless country locale matrix let clm = include_bytes!("./firmware/43439A0_clm.bin"); // wireless power on signal let pwr = Output::new(hal.PIN_23, Level::Low); // wireless serial peripheral interface chip select let cs = Output::new(hal.PIN_25, Level::High); // programmed input/output let mut pio = Pio::new(hal.PIO0, Irqs); // programmed serial peripheral interface let spi = PioSpi::new( &mut pio.common, pio.sm0, pio.irq0, cs, hal.PIN_24, hal.PIN_29, hal.DMA_CH0, ); // wireless driver state static STATE: StaticCell = StaticCell::new(); let state = STATE.init(cyw43::State::new()); // spawn network task let (_, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; unwrap!(spawner.spawn(cyw43_task(runner))); // initialize wireless control.init(clm).await; control .set_power_management(cyw43::PowerManagementMode::PowerSave) .await; // time to blink let mut led = false; loop { info!("Blink!"); led = !led; control.gpio_set(0, led).await; Timer::after_secs(1).await; } }