From f8fb1b81c23567499898202637a7d1e2bdea4633 Mon Sep 17 00:00:00 2001 From: sawyer bristol Date: Wed, 30 Jul 2025 14:59:53 -0600 Subject: [PATCH] stateless scsi --- src/scsi/mod.rs | 24 +----------------------- src/storage.rs | 2 -- src/usb.rs | 17 ++++++++--------- 3 files changed, 9 insertions(+), 34 deletions(-) diff --git a/src/scsi/mod.rs b/src/scsi/mod.rs index 6bcf5ab..a50ff26 100644 --- a/src/scsi/mod.rs +++ b/src/scsi/mod.rs @@ -12,18 +12,10 @@ use crate::storage::SdCard; const BULK_ENDPOINT_PACKET_SIZE: usize = 64; -#[derive(PartialEq, Eq)] -enum State { - Ready, - Ejected, -} - pub struct MassStorageClass<'d, D: Driver<'d>> { sdcard: SdCard, - state: State, bulk_out: D::EndpointOut, bulk_in: D::EndpointIn, - last_sense: Option, } impl<'d, D: Driver<'d>> MassStorageClass<'d, D> { @@ -39,8 +31,6 @@ impl<'d, D: Driver<'d>> MassStorageClass<'d, D> { bulk_out, bulk_in, sdcard, - state: State::Ready, - last_sense: None, } } @@ -50,12 +40,6 @@ impl<'d, D: Driver<'d>> MassStorageClass<'d, D> { if let Ok(n) = self.bulk_out.read(&mut cbw_buf).await { if n == 31 { if let Some(cbw) = CommandBlockWrapper::parse(&cbw_buf[..n]) { - if self.state == State::Ejected { - self.last_sense = Some(ScsiError::NotReady); - self.send_csw_fail(cbw.dCBWTag).await; - continue; - } - // TODO: validate cbw if self.handle_command(&cbw.CBWCB).await.is_ok() { self.send_csw_success(cbw.dCBWTag).await @@ -268,13 +252,7 @@ impl<'d, D: Driver<'d>> MassStorageClass<'d, D> { .map_err(|_| ()) } ScsiCommand::PreventAllowMediumRemoval { prevent: _prevent } => Ok(()), - ScsiCommand::StartStopUnit { start, load_eject } => { - if !start && load_eject { - self.state = State::Ejected; - self.last_sense = Some(ScsiError::NotReady); - } - Ok(()) - } + ScsiCommand::StartStopUnit { start, load_eject } => Ok(()), } } diff --git a/src/storage.rs b/src/storage.rs index ad1a8fa..04b4353 100644 --- a/src/storage.rs +++ b/src/storage.rs @@ -34,8 +34,6 @@ impl SdCard { pub const BLOCK_SIZE: u16 = 512; pub fn new(sdcard: SD, det: Input<'static>) -> Self { - sdcard.get_card_type().unwrap(); - defmt::info!("Card size is {} bytes", sdcard.num_bytes().unwrap()); let volume_mgr = VolumeManager::<_, _, MAX_DIRS, MAX_FILES, MAX_VOLUMES>::new_with_limits( sdcard, DummyTimeSource {}, diff --git a/src/usb.rs b/src/usb.rs index 68e96e9..acf1d4c 100644 --- a/src/usb.rs +++ b/src/usb.rs @@ -1,12 +1,6 @@ use crate::{scsi::MassStorageClass, storage::SdCard}; -use embassy_futures::join::{self, join}; -use embassy_rp::{ - gpio::Output, - peripherals::{SPI0, USB}, - spi::{Async, Spi}, - usb::Driver, -}; -use embassy_time::Delay; +use embassy_futures::select::select; +use embassy_rp::{peripherals::USB, usb::Driver}; use embassy_usb::{Builder, Config}; pub async fn usb_handler(driver: Driver<'static, USB>, sdcard: SdCard) { @@ -33,5 +27,10 @@ pub async fn usb_handler(driver: Driver<'static, USB>, sdcard: SdCard) { let mut scsi = MassStorageClass::new(&mut builder, sdcard); let mut usb = builder.build(); - join(usb.run(), scsi.poll()).await; + loop { + select(usb.run(), scsi.poll()).await; + + defmt::warn!("rebuilding usb"); + usb.disable().await; + } }