kirdy/src/device/gpio.rs

165 lines
4.9 KiB
Rust
Raw Normal View History

2024-01-18 16:13:08 +08:00
use crate::laser_diode::ld_ctrl::{self, LdCtrlPhy};
use crate::laser_diode::max5719;
2024-01-26 11:43:53 +08:00
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};
2022-10-22 15:49:01 +08:00
use stm32_eth::EthPins;
use stm32f4xx_hal::gpio::alt::otg_fs::{Dm, Dp};
2022-10-20 20:57:24 +08:00
use stm32f4xx_hal::{
gpio::{gpioa::*, gpiob::*, gpioc::*, GpioExt, Input, Speed},
2022-10-20 20:57:24 +08:00
otg_fs::USB,
pac::{
GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, OTG_FS_DEVICE, OTG_FS_GLOBAL, OTG_FS_PWRCLK, SPI1, SPI2, SPI3,
TIM4,
},
2022-10-20 20:57:24 +08:00
rcc::Clocks,
2022-10-22 15:49:01 +08:00
spi::{NoMiso, Spi},
timer::{Channel1, Channel2, Channel3, pwm::PwmExt}
2022-10-20 20:57:24 +08:00
};
2022-10-21 12:05:55 +08:00
2022-10-22 15:49:01 +08:00
pub type EthernetPins =
2024-01-31 17:15:32 +08:00
EthPins<PA1<Input>, PA7<Input>, PB11<Input>, PB12<Input>, PB13<Input>, PC4<Input>, PC5<Input>>;
2022-10-20 20:57:24 +08:00
2022-10-21 12:05:55 +08:00
pub fn setup(
clocks: Clocks,
tim4: TIM4,
2022-10-22 15:49:01 +08:00
gpioa: GPIOA,
gpiob: GPIOB,
gpioc: GPIOC,
gpiod: GPIOD,
gpioe: GPIOE,
spi1: SPI1,
2022-10-22 15:49:01 +08:00
spi2: SPI2,
spi3: SPI3,
2022-10-22 15:49:01 +08:00
otg_fs_global: OTG_FS_GLOBAL,
otg_fs_device: OTG_FS_DEVICE,
otg_fs_pwrclk: OTG_FS_PWRCLK,
) -> (
HWRev,
2022-10-22 15:49:01 +08:00
EthernetPins,
EthernetMgmtPins,
2022-10-22 15:49:01 +08:00
USB,
2024-01-18 16:13:08 +08:00
LdCtrlPhy<ld_ctrl::Channel0>,
ad7172::AdcPhy,
MAX1968Phy<max1968::Channel0>,
2024-01-26 11:43:53 +08:00
LdPwrExcProtectorPhy
2022-10-21 12:05:55 +08:00
) {
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();
2022-10-22 15:49:01 +08:00
2022-10-21 12:05:55 +08:00
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()),
2022-10-21 12:05:55 +08:00
hclk: clocks.hclk(),
};
2022-10-20 20:57:24 +08:00
2022-10-21 12:05:55 +08:00
let eth_pins = EthPins {
2022-10-22 15:49:01 +08:00
ref_clk: gpioa.pa1,
crs: gpioa.pa7,
2022-10-21 12:05:55 +08:00
tx_en: gpiob.pb11,
2024-01-31 17:15:32 +08:00
tx_d0: gpiob.pb12,
2022-10-21 12:05:55 +08:00
tx_d1: gpiob.pb13,
2022-10-22 15:49:01 +08:00
rx_d0: gpioc.pc4,
2022-10-21 12:05:55 +08:00
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);
2022-10-22 15:49:01 +08:00
2024-01-18 16:13:08 +08:00
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(),
2022-10-22 15:49:01 +08:00
),
current_source_short_pin: gpioa.pa4.into_push_pull_output(),
termination_status_pin: gpiod.pd7.internal_pull_up(true),
2022-10-21 12:05:55 +08:00
};
2022-10-20 20:57:24 +08:00
2024-01-26 11:43:53 +08:00
let pd_mon_phy = LdPwrExcProtectorPhy {
2024-01-24 12:10:53 +08:00
_pd_mon_ch0: gpioa.pa3.into_analog(),
pwr_en_ch0: gpiod.pd9.into_push_pull_output(),
};
2024-01-05 15:00:50 +08:00
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)
2022-10-21 12:05:55 +08:00
}