81 lines
2.4 KiB
Rust
81 lines
2.4 KiB
Rust
use super::{gpio, usb, delay};
|
|
use crate::laser_diode::current_sources::*;
|
|
use smoltcp::iface::{SocketHandle, Interface};
|
|
use stm32_eth::stm32::ETHERNET_DMA;
|
|
use systick_monotonic::Systick;
|
|
use fugit::ExtU32;
|
|
use log::info;
|
|
use stm32f4xx_hal::{
|
|
pac::{CorePeripherals, Peripherals},
|
|
rcc::RccExt,
|
|
time::MegaHertz,
|
|
watchdog::IndependentWatchdog,
|
|
};
|
|
use crate::network::network;
|
|
use crate::network::network::EthernetPeripherals;
|
|
|
|
#[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.GPIOG,
|
|
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)
|
|
}
|