use crate::laser_diode::ld_ctrl::{self, LdCtrlPhy}; use crate::laser_diode::max5719; use crate::laser_diode::ld_pwr_exc_protector::LdPwrExcProtectorPhy; use crate::thermostat::ad5680; use crate::thermostat::max1968::{self, MAX1968PinSet, MAX1968Phy, PWM_FREQ_KHZ}; use crate::thermostat::ad7172; use crate::net::net::EthernetMgmtPins; use crate::device::hw_rev::{HWRev, HwRevPins}; use stm32_eth::EthPins; use stm32f4xx_hal::gpio::alt::otg_fs::{Dm, Dp}; use stm32f4xx_hal::{ gpio::{gpioa::*, gpiob::*, gpioc::*, GpioExt, Input, Speed}, otg_fs::USB, pac::{ GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, OTG_FS_DEVICE, OTG_FS_GLOBAL, OTG_FS_PWRCLK, SPI1, SPI2, SPI3, TIM4, }, rcc::Clocks, spi::{NoMiso, Spi}, timer::{Channel1, Channel2, Channel3, pwm::PwmExt} }; pub type EthernetPins = EthPins, PA7, PB11, PB12, PB13, PC4, PC5>; pub fn setup( clocks: Clocks, tim4: TIM4, gpioa: GPIOA, gpiob: GPIOB, gpioc: GPIOC, gpiod: GPIOD, gpioe: GPIOE, spi1: SPI1, spi2: SPI2, spi3: SPI3, otg_fs_global: OTG_FS_GLOBAL, otg_fs_device: OTG_FS_DEVICE, otg_fs_pwrclk: OTG_FS_PWRCLK, ) -> ( HWRev, EthernetPins, EthernetMgmtPins, USB, LdCtrlPhy, ad7172::AdcPhy, MAX1968Phy, LdPwrExcProtectorPhy ) { let gpioa = gpioa.split(); let gpiob = gpiob.split(); let gpioc = gpioc.split(); let gpiod = gpiod.split(); let gpioe = gpioe.split(); let mut hw_rev = HWRev::detect_hw_rev( HwRevPins { h0: gpioe.pe8.into_input(), h1: gpioe.pe9.into_input(), h2: gpioe.pe10.into_input(), h3: gpioe.pe11.into_input(), } ); hw_rev.startup_delay_before_gpio_init(); let usb = USB { usb_global: otg_fs_global, usb_device: otg_fs_device, usb_pwrclk: otg_fs_pwrclk, pin_dm: Dm::PA11(gpioa.pa11.into_alternate()), pin_dp: Dp::PA12(gpioa.pa12.into_alternate()), hclk: clocks.hclk(), }; let eth_pins = EthPins { ref_clk: gpioa.pa1, crs: gpioa.pa7, tx_en: gpiob.pb11, tx_d0: gpiob.pb12, tx_d1: gpiob.pb13, rx_d0: gpioc.pc4, rx_d1: gpioc.pc5, }; let mut eth_mgmt_pins = EthernetMgmtPins { mdio: gpioa.pa2.into_alternate::<11>(), mdc: gpioc.pc1.into_alternate::<11>(), }; eth_mgmt_pins.mdio.set_speed(Speed::VeryHigh); eth_mgmt_pins.mdc.set_speed(Speed::VeryHigh); let current_source_phy = LdCtrlPhy { dac: max5719::Dac::new(Spi::new( spi2, ( gpiob.pb10.into_alternate(), NoMiso::new(), gpiob.pb15.into_alternate(), ), max5719::SPI_MODE, max5719::SPI_CLOCK_MHZ.convert(), &clocks, ), gpiod.pd8.into_push_pull_output(), gpiob.pb14.into_push_pull_output(), ), current_source_short_pin: gpioa.pa4.into_push_pull_output(), termination_status_pin: gpiod.pd7.internal_pull_up(true), }; let pd_mon_phy = LdPwrExcProtectorPhy { _pd_mon_ch0: gpioa.pa3.into_analog(), pwr_en_ch0: gpiod.pd9.into_push_pull_output(), }; let pwm_chs = ( Channel1::new(gpiob.pb6), Channel2::new(gpiob.pb7), Channel3::new(gpiob.pb8), ); let (max_i_neg0, max_v0, max_i_pos0) = tim4.pwm_hz(pwm_chs, PWM_FREQ_KHZ.convert(), &clocks).split(); let max1968_phy = MAX1968Phy::new(MAX1968PinSet { dac: ad5680::Dac::new( Spi::new( spi1, ( gpiob.pb3.into_alternate(), NoMiso::new(), gpiob.pb5.into_alternate(), ), ad5680::SPI_MODE, ad5680::SPI_CLOCK_MHZ.convert(), &clocks, ), gpiob.pb4.into_push_pull_output(), ), shdn: gpioa.pa5.into_push_pull_output(), vref_pin: gpioa.pa6.into_analog(), itec_pin: gpiob.pb1.into_analog(), dac_feedback_pin: gpioc.pc0.into_analog(), vtec_pin: gpiob.pb0.into_analog(), max_v: max_v0, max_i_pos: max_i_pos0, max_i_neg: max_i_neg0, }); let ad7172_phy = ad7172::Adc::new( Spi::new(spi3, ( gpioc.pc10.into_alternate(), gpioc.pc11.into_alternate(), gpioc.pc12.into_alternate(), ), ad7172::SPI_MODE, ad7172::SPI_CLOCK_MHZ.convert(), &clocks ), gpioa.pa15.into_push_pull_output(), ).unwrap(); (hw_rev, eth_pins, eth_mgmt_pins, usb, current_source_phy, ad7172_phy, max1968_phy, pd_mon_phy) }