diff --git a/Cargo.lock b/Cargo.lock index 544eb93..13dc994 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1267,9 +1267,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" dependencies = [ "critical-section", ] diff --git a/src/ble.rs b/src/ble.rs index fb4e4b6..c5aa13a 100644 --- a/src/ble.rs +++ b/src/ble.rs @@ -1,5 +1,7 @@ -use cyw43::{Control, bluetooth::BtDriver}; +use cyw43::{Control, aligned_bytes, bluetooth::BtDriver}; +use cyw43_pio::PioSpi; use embassy_executor::Spawner; +use embassy_rp::{gpio::Output, peripherals::PIO0}; use embassy_time::Duration; use sachy_fmt::{error, info, unwrap}; use static_cell::StaticCell; @@ -28,7 +30,33 @@ const CONNECTIONS_MAX: usize = 1; /// Max number of L2CAP channels. const L2CAP_CHANNELS_MAX: usize = 3; // Signal + att + CoC -pub async fn run(spawner: Spawner, controller: BleController, mut control: Control<'static>) -> ! { +#[embassy_executor::task] +pub async fn setup(spawner: Spawner, pwr: Output<'static>, spi: PioSpi<'static, PIO0, 0>) { + let (fw, clm, btfw, nvram) = { + let fw = aligned_bytes!("../firmware/43439A0.bin"); + let clm = aligned_bytes!("../firmware/43439A0_clm.bin"); + let btfw = aligned_bytes!("../firmware/43439A0_btfw.bin"); + let nvram = aligned_bytes!("../firmware/nvram_rp2040.bin"); + (fw, clm, btfw, nvram) + }; + + static STATE: StaticCell = StaticCell::new(); + let state = STATE.init_with(cyw43::State::new); + + let (_net_device, bt_device, mut control, runner) = + cyw43::new_with_bluetooth(state, pwr, spi, fw, btfw, nvram).await; + + spawner.spawn(unwrap!(cyw43_runner_task(runner))); + + control.init(clm).await; + + let controller: ExternalController<_, 10> = ExternalController::new(bt_device); + + spawner.spawn(unwrap!(ble_run(spawner, controller, control))); +} + +#[embassy_executor::task] +async fn ble_run(spawner: Spawner, controller: BleController, mut control: Control<'static>) -> ! { let address: Address = Address::random([0xff, 0x8f, 0x1a, 0x05, 0xe4, 0xff]); info!("Our address = {:?}", address); @@ -45,7 +73,7 @@ pub async fn run(spawner: Spawner, controller: BleController, mut control: Contr .. } = stack.build(); - spawner.spawn(unwrap!(ble_runner(runner))); + spawner.spawn(unwrap!(ble_runner_task(runner))); let mut adv_data = [0; 31]; let adv_data_len = unwrap!(AdStructure::encode_slice( @@ -108,10 +136,17 @@ pub async fn run(spawner: Spawner, controller: BleController, mut control: Contr } #[embassy_executor::task] -async fn ble_runner(mut runner: BleRunner) { +async fn ble_runner_task(mut runner: BleRunner) { loop { if let Err(e) = runner.run().await { panic!("BLE runner error: {:?}", e); } } } + +#[embassy_executor::task] +async fn cyw43_runner_task( + runner: cyw43::Runner<'static, cyw43::SpiBus, PioSpi<'static, PIO0, 0>>>, +) -> ! { + runner.run().await +} diff --git a/src/main.rs b/src/main.rs index 65141c9..b7a8799 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,9 +15,7 @@ mod timer; extern crate alloc; use crate::allocator::PicoHeap; -use cyw43::aligned_bytes; use cyw43_pio::{DEFAULT_CLOCK_DIVIDER, PioSpi}; -use embassy_executor::Spawner; use embassy_rp::{ bind_interrupts, dma, executor::Executor, @@ -28,7 +26,6 @@ use embassy_rp::{ use portable_atomic::AtomicPtr; use sachy_fmt::{info, unwrap}; use static_cell::StaticCell; -use trouble_host::prelude::ExternalController; #[cfg(feature = "defmt")] use {defmt_rtt as _, panic_probe as _}; @@ -73,36 +70,7 @@ fn main() -> ! { static CORE0: StaticCell = StaticCell::new(); CORE0.init_with(Executor::new).run(|spawner| { - spawner.spawn(unwrap!(ble_setup(spawner, pwr, spi))); + spawner.spawn(unwrap!(ble::setup(spawner, pwr, spi))); spawner.spawn(unwrap!(timer::run(p.POWMAN))); }); } - -#[embassy_executor::task] -async fn cyw43_task( - runner: cyw43::Runner<'static, cyw43::SpiBus, PioSpi<'static, PIO0, 0>>>, -) -> ! { - runner.run().await -} - -#[embassy_executor::task] -async fn ble_setup(spawner: Spawner, pwr: Output<'static>, spi: PioSpi<'static, PIO0, 0>) { - let (fw, clm, btfw, nvram) = { - let fw = aligned_bytes!("../firmware/43439A0.bin"); - let clm = aligned_bytes!("../firmware/43439A0_clm.bin"); - let btfw = aligned_bytes!("../firmware/43439A0_btfw.bin"); - let nvram = aligned_bytes!("../firmware/nvram_rp2040.bin"); - (fw, clm, btfw, nvram) - }; - - static STATE: StaticCell = StaticCell::new(); - let state = STATE.init_with(cyw43::State::new); - let (_net_device, bt_device, mut control, runner) = - cyw43::new_with_bluetooth(state, pwr, spi, fw, btfw, nvram).await; - spawner.spawn(unwrap!(cyw43_task(runner))); - control.init(clm).await; - - let controller: ExternalController<_, 10> = ExternalController::new(bt_device); - - ble::run(spawner, controller, control).await; -}