only enable scsi when sdcard is detected

This commit is contained in:
2025-08-01 01:29:03 -06:00
parent 98fb736127
commit db81470531
2 changed files with 30 additions and 20 deletions

View File

@@ -1,7 +1,17 @@
use crate::{USB_ENABLED, scsi::MassStorageClass, storage::SdCard};
use embassy_futures::{join::join, select::select3};
use core::sync::atomic::Ordering;
use crate::{scsi::MassStorageClass, storage::SdCard};
use embassy_futures::{
join::join,
select::{select, select3},
};
use embassy_rp::{peripherals::USB, usb::Driver};
use embassy_sync::{blocking_mutex::raw::ThreadModeRawMutex, signal::Signal};
use embassy_usb::{Builder, Config};
use portable_atomic::AtomicBool;
static RESTART_USB: Signal<ThreadModeRawMutex, ()> = Signal::new();
static ENABLE_SCSI: AtomicBool = AtomicBool::new(false);
pub async fn usb_handler(driver: Driver<'static, USB>, sdcard: SdCard) {
let mut config = Config::new(0xc0de, 0xcafe);
@@ -24,23 +34,27 @@ pub async fn usb_handler(driver: Driver<'static, USB>, sdcard: SdCard) {
&mut control_buf,
);
if sdcard.is_attached() {
ENABLE_SCSI.store(true, Ordering::Relaxed);
}
let mut scsi = MassStorageClass::new(&mut builder, sdcard);
let mut usb = builder.build();
loop {
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;
}
select3(
async {
loop {
RESTART_USB.wait().await;
return;
}
},
usb.run(),
async {
if ENABLE_SCSI.load(Ordering::Acquire) {
scsi.poll().await
}
},
)
.await;
}
}