kirdy/src/device/boot.rs

86 lines
2.3 KiB
Rust
Raw Normal View History

use super::{delay, gpio, usb};
2022-10-22 15:49:01 +08:00
use crate::laser_diode::current_sources::*;
use crate::network::network;
use crate::network::network::EthernetPeripherals;
2022-10-22 15:49:01 +08:00
use fugit::ExtU32;
use log::info;
2022-10-20 21:21:01 +08:00
use stm32f4xx_hal::{
pac::{CorePeripherals, Peripherals},
2022-10-22 15:49:01 +08:00
rcc::RccExt,
time::MegaHertz,
watchdog::IndependentWatchdog,
2022-10-20 21:21:01 +08:00
};
use systick_monotonic::Systick;
2022-10-20 21:21:01 +08:00
#[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,
) {
2022-10-20 21:21:01 +08:00
core_perif.SCB.enable_icache();
core_perif.SCB.enable_dcache(&mut core_perif.CPUID);
2022-10-22 15:49:01 +08:00
let clocks = perif
.RCC
.constrain()
2022-10-20 21:21:01 +08:00
.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();
2022-10-23 20:07:44 +08:00
let systick = Systick::new(core_perif.SYST, clocks.hclk().to_Hz());
let delay = delay::AsmDelay::new(clocks.sysclk().to_Hz());
2022-10-22 01:58:18 +08:00
2022-11-01 11:16:55 +08:00
let (eth_pins, usb, current_source_phy, mdio, mdc) = gpio::setup(
2022-10-22 15:49:01 +08:00
clocks,
perif.GPIOA,
perif.GPIOB,
perif.GPIOC,
perif.GPIOD,
perif.SPI2,
perif.OTG_FS_GLOBAL,
perif.OTG_FS_DEVICE,
perif.OTG_FS_PWRCLK,
2022-10-21 12:05:55 +08:00
);
2022-10-22 01:58:18 +08:00
2022-11-01 11:16:55 +08:00
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);
2022-10-22 01:58:18 +08:00
usb::State::setup(usb);
2022-10-22 15:49:01 +08:00
let mut laser = CurrentSource {
2022-10-22 01:58:18 +08:00
phy: current_source_phy,
2022-10-23 16:59:15 +08:00
setting: CurrentSourceSettings {
2022-10-22 15:49:01 +08:00
output_current: 0.0,
},
2022-10-22 01:58:18 +08:00
};
2022-10-23 20:07:44 +08:00
laser.setup(delay);
2022-10-22 20:20:49 +08:00
laser.set_current(0.1).unwrap();
2022-10-22 15:49:01 +08:00
2022-10-20 21:21:01 +08:00
let mut wd = IndependentWatchdog::new(perif.IWDG);
wd.start(WATCHDOG_PERIOD.millis());
wd.feed();
2022-10-21 12:05:55 +08:00
info!("Kirdy setup complete");
2022-11-01 11:16:55 +08:00
(wd, systick, server)
2022-10-22 15:49:01 +08:00
}