From 98fb7361272faafbbeaaaf6fdf6bee6e83023b16 Mon Sep 17 00:00:00 2001 From: sawyer bristol Date: Thu, 31 Jul 2025 17:23:24 -0600 Subject: [PATCH] enhance usb control loop --- kernel/src/main.rs | 9 +++++++-- kernel/src/usb.rs | 22 ++++++++++++++++------ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/kernel/src/main.rs b/kernel/src/main.rs index ec81cb6..23a5291 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -24,7 +24,7 @@ use crate::{ use {defmt_rtt as _, panic_probe as _}; use embassy_executor::Spawner; -use embassy_futures::join::join3; +use embassy_futures::join::{join, join3}; use embassy_rp::{ gpio::{Input, Level, Output, Pull}, peripherals::{I2C1, USB}, @@ -32,6 +32,7 @@ use embassy_rp::{ usb as embassy_rp_usb, }; use embassy_rp::{i2c, i2c::I2c, spi}; +use embassy_sync::{blocking_mutex::raw::ThreadModeRawMutex, signal::Signal}; use embassy_time::{Delay, Timer}; use embedded_hal_bus::spi::ExclusiveDevice; use embedded_sdmmc::SdCard as SdmmcSdCard; @@ -41,6 +42,9 @@ embassy_rp::bind_interrupts!(struct Irqs { USBCTRL_IRQ => embassy_rp_usb::InterruptHandler; }); +// Controls the usb running to prevents sdcard writes via scsi and by the kernel +static USB_ENABLED: Signal = Signal::new(); + #[embassy_executor::main] async fn main(_spawner: Spawner) { let p = embassy_rp::init(Default::default()); @@ -86,7 +90,8 @@ async fn main(_spawner: Spawner) { }; let usb = embassy_rp_usb::Driver::new(p.USB, Irqs); + USB_ENABLED.signal(true); let usb_fut = usb_handler(usb, sdcard); - join3(async { loop {} }, usb_fut, display_fut).await; + join(usb_fut, display_fut).await; } diff --git a/kernel/src/usb.rs b/kernel/src/usb.rs index acf1d4c..d058e23 100644 --- a/kernel/src/usb.rs +++ b/kernel/src/usb.rs @@ -1,5 +1,5 @@ -use crate::{scsi::MassStorageClass, storage::SdCard}; -use embassy_futures::select::select; +use crate::{USB_ENABLED, scsi::MassStorageClass, storage::SdCard}; +use embassy_futures::{join::join, select::select3}; use embassy_rp::{peripherals::USB, usb::Driver}; use embassy_usb::{Builder, Config}; @@ -28,9 +28,19 @@ pub async fn usb_handler(driver: Driver<'static, USB>, sdcard: SdCard) { let mut usb = builder.build(); loop { - select(usb.run(), scsi.poll()).await; - - defmt::warn!("rebuilding usb"); - usb.disable().await; + if USB_ENABLED.wait().await { + select3( + async { + loop { + // stop usb task until usb is enabled again + USB_ENABLED.wait().await; + return; // breaks out of select + } + }, + usb.run(), + scsi.poll(), + ) + .await; + } } }