enhance usb control loop
This commit is contained in:
@@ -24,7 +24,7 @@ use crate::{
|
|||||||
use {defmt_rtt as _, panic_probe as _};
|
use {defmt_rtt as _, panic_probe as _};
|
||||||
|
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
use embassy_futures::join::join3;
|
use embassy_futures::join::{join, join3};
|
||||||
use embassy_rp::{
|
use embassy_rp::{
|
||||||
gpio::{Input, Level, Output, Pull},
|
gpio::{Input, Level, Output, Pull},
|
||||||
peripherals::{I2C1, USB},
|
peripherals::{I2C1, USB},
|
||||||
@@ -32,6 +32,7 @@ use embassy_rp::{
|
|||||||
usb as embassy_rp_usb,
|
usb as embassy_rp_usb,
|
||||||
};
|
};
|
||||||
use embassy_rp::{i2c, i2c::I2c, spi};
|
use embassy_rp::{i2c, i2c::I2c, spi};
|
||||||
|
use embassy_sync::{blocking_mutex::raw::ThreadModeRawMutex, signal::Signal};
|
||||||
use embassy_time::{Delay, Timer};
|
use embassy_time::{Delay, Timer};
|
||||||
use embedded_hal_bus::spi::ExclusiveDevice;
|
use embedded_hal_bus::spi::ExclusiveDevice;
|
||||||
use embedded_sdmmc::SdCard as SdmmcSdCard;
|
use embedded_sdmmc::SdCard as SdmmcSdCard;
|
||||||
@@ -41,6 +42,9 @@ embassy_rp::bind_interrupts!(struct Irqs {
|
|||||||
USBCTRL_IRQ => embassy_rp_usb::InterruptHandler<USB>;
|
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]
|
#[embassy_executor::main]
|
||||||
async fn main(_spawner: Spawner) {
|
async fn main(_spawner: Spawner) {
|
||||||
let p = embassy_rp::init(Default::default());
|
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);
|
let usb = embassy_rp_usb::Driver::new(p.USB, Irqs);
|
||||||
|
USB_ENABLED.signal(true);
|
||||||
let usb_fut = usb_handler(usb, sdcard);
|
let usb_fut = usb_handler(usb, sdcard);
|
||||||
|
|
||||||
join3(async { loop {} }, usb_fut, display_fut).await;
|
join(usb_fut, display_fut).await;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
use crate::{scsi::MassStorageClass, storage::SdCard};
|
use crate::{USB_ENABLED, scsi::MassStorageClass, storage::SdCard};
|
||||||
use embassy_futures::select::select;
|
use embassy_futures::{join::join, select::select3};
|
||||||
use embassy_rp::{peripherals::USB, usb::Driver};
|
use embassy_rp::{peripherals::USB, usb::Driver};
|
||||||
use embassy_usb::{Builder, Config};
|
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();
|
let mut usb = builder.build();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
select(usb.run(), scsi.poll()).await;
|
if USB_ENABLED.wait().await {
|
||||||
|
select3(
|
||||||
defmt::warn!("rebuilding usb");
|
async {
|
||||||
usb.disable().await;
|
loop {
|
||||||
|
// stop usb task until usb is enabled again
|
||||||
|
USB_ENABLED.wait().await;
|
||||||
|
return; // breaks out of select
|
||||||
|
}
|
||||||
|
},
|
||||||
|
usb.run(),
|
||||||
|
scsi.poll(),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user