#![no_std] #![no_main] #![feature(impl_trait_in_assoc_type)] use molybdos::{ embassy_embedded_hal::shared_bus::asynch::spi::SpiDevice, embassy_rp::{ i2c::{ self, I2c, }, peripherals::{ I2C0, SPI0, SPI1, }, spi::{ self, Spi, }, }, embassy_sync::{ blocking_mutex::raw::CriticalSectionRawMutex, pubsub, }, embedded_sdmmc_async::{ VolumeIdx, VolumeManager, }, genlog, genlog::defmt, pal::StaticOutput, }; mod bringup; mod usb; pub type BMESpi = Spi<'static, SPI1, spi::Async>; pub type BMESpiDev = SpiDevice<'static, CriticalSectionRawMutex, BMESpi, StaticOutput>; pub type SdSpi = Spi<'static, SPI0, spi::Async>; pub type SdSpiDev = SpiDevice<'static, CriticalSectionRawMutex, SdSpi, StaticOutput>; pub type SensorI2c = I2c<'static, I2C0, i2c::Async>; #[embassy_executor::main] async fn main(spawner: embassy_executor::Spawner) { molybdos::pal::heap::init(); genlog::info!("boot"); let bringup::Split { sd_spi, sd_cs, bme_spi, bme_cs, wdt, usb, .. } = bringup::split(Default::default()); // spawner.must_spawn(molybdos::pal::watchdog(wdt)); let (acm,) = molybdos::lib::usb::bringup!( spawn, usb, molybdos::pal::UsbDriver, molybdos::lib::usb::config("npry", "ocularium", 0x8888, 0x0011), endpoints = { acm => |builder| molybdos::lib::usb::acm!(builder), } ); molybdos::lib::usb::start!(molybdos::pal::UsbDriver, acm, &usb::UPLINK, &usb::DOWNLINK); molybdos::lib::util::cobs::start!( ocularium::Uplink, &usb::UPLINK, &usb::COBS_UPLINK, ocularium::Downlink, &usb::DOWNLINK, &usb::COBS_DOWNLINK ); #[cfg(not(feature = "disable_sd"))] { let vm = molybdos::rt::sd::bringup!(sd_spi, SdSpi, sd_cs); { let vol = VolumeManager::open_volume(vm, VolumeIdx(0)).await.expect("opening volume"); } // spawner.must_spawn(sd::run_sd(vm, pubsub::LED.sender().into())); } loop { molybdos::embassy_time::Timer::after(molybdos::embassy_time::Duration::from_secs(1)).await; } }