use super::{delay, gpio, usb}; use crate::laser_diode::current_sources::*; use crate::network::network; use crate::network::network::EthernetPeripherals; use fugit::ExtU32; use log::info; use stm32f4xx_hal::{ pac::{CorePeripherals, Peripherals}, rcc::RccExt, time::MegaHertz, watchdog::IndependentWatchdog, }; use systick_monotonic::Systick; #[cfg(not(feature = "semihosting"))] const WATCHDOG_PERIOD: u32 = 1000; #[cfg(feature = "semihosting")] const WATCHDOG_PERIOD: u32 = 30000; pub fn bootup( mut core_perif: CorePeripherals, perif: Peripherals, server_storage: &'static mut network::ServerStorage, ) -> ( IndependentWatchdog, Systick<1000_u32>, network::ServerHandle, ) { core_perif.SCB.enable_icache(); core_perif.SCB.enable_dcache(&mut core_perif.CPUID); let clocks = perif .RCC .constrain() .cfgr .use_hse(MegaHertz::from_raw(8).convert()) .sysclk(MegaHertz::from_raw(168).convert()) .hclk(MegaHertz::from_raw(168).convert()) .pclk1(MegaHertz::from_raw(32).convert()) .pclk2(MegaHertz::from_raw(64).convert()) .freeze(); let systick = Systick::new(core_perif.SYST, clocks.hclk().to_Hz()); let delay = delay::AsmDelay::new(clocks.sysclk().to_Hz()); let (eth_pins, usb, current_source_phy, mdio, mdc) = gpio::setup( clocks, perif.GPIOA, perif.GPIOB, perif.GPIOC, perif.GPIOD, perif.SPI2, perif.OTG_FS_GLOBAL, perif.OTG_FS_DEVICE, perif.OTG_FS_PWRCLK, ); let ethernet = EthernetPeripherals { dma: perif.ETHERNET_DMA, mac: perif.ETHERNET_MAC, mmc: perif.ETHERNET_MMC, }; let server = network::ServerHandle::new(eth_pins, ethernet, clocks, server_storage, mdio, mdc); // let (serverhandle, iface) = network::setup(eth_pins, ethernet, clocks); usb::State::setup(usb); let mut laser = CurrentSource { phy: current_source_phy, setting: CurrentSourceSettings { output_current: 0.0, }, }; laser.setup(delay); laser.set_current(0.1).unwrap(); let mut wd = IndependentWatchdog::new(perif.IWDG); wd.start(WATCHDOG_PERIOD.millis()); wd.feed(); info!("Kirdy setup complete"); (wd, systick, server) }