#![no_std] #![no_main] extern crate panic_halt; use cyw43_pio::PioSpi; use embassy_executor::Spawner; use embassy_rp::{ bind_interrupts, gpio::{Level, Output}, peripherals::{DMA_CH0, PIO0, USB}, pio::{self, Pio}, usb::{self, Driver}, }; use embassy_time::Timer; use log::info; use static_cell::StaticCell; const WIFI_CREDENTIALS: &[(&str, &str)] = &include!(concat!(env!("OUT_DIR"), "/wireless-credentials.rs")); // bind interrupt request to handler bind_interrupts!(struct Irqs { PIO0_IRQ_0 => pio::InterruptHandler; USBCTRL_IRQ => usb::InterruptHandler; }); // logger task #[embassy_executor::task] async fn logger_task(driver: Driver<'static, USB>) { embassy_usb_logger::run!(1024, log::LevelFilter::Info, driver); } // wireless 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()); // usb driver let driver = Driver::new(hal.USB, Irqs); // spawn logger task spawner.spawn(logger_task(driver)).unwrap(); // 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 wireless task let (_, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; spawner.spawn(cyw43_task(runner)).unwrap(); // initialize wireless control.init(clm).await; control .set_power_management(cyw43::PowerManagementMode::PowerSave) .await; // time to blink let mut led = false; loop { for (k, v) in WIFI_CREDENTIALS { info!("{k}: {v}"); } led = !led; control.gpio_set(0, led).await; Timer::after_secs(1).await; } }