only enable scsi when sdcard is detected
This commit is contained in:
@@ -42,9 +42,6 @@ embassy_rp::bind_interrupts!(struct Irqs {
|
||||
USBCTRL_IRQ => embassy_rp_usb::InterruptHandler<USB>;
|
||||
});
|
||||
|
||||
// Controls the usb running to prevents sdcard writes via scsi and by the kernel
|
||||
static USB_ENABLED: Signal<ThreadModeRawMutex, bool> = Signal::new();
|
||||
|
||||
#[embassy_executor::main]
|
||||
async fn main(_spawner: Spawner) {
|
||||
let p = embassy_rp::init(Default::default());
|
||||
@@ -90,7 +87,6 @@ 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);
|
||||
|
||||
join(usb_fut, display_fut).await;
|
||||
|
||||
@@ -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
|
||||
RESTART_USB.wait().await;
|
||||
return;
|
||||
}
|
||||
},
|
||||
usb.run(),
|
||||
scsi.poll(),
|
||||
async {
|
||||
if ENABLE_SCSI.load(Ordering::Acquire) {
|
||||
scsi.poll().await
|
||||
}
|
||||
},
|
||||
)
|
||||
.await;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user