use super::*;
pub fn chip_setup() {
let pmu = crate::peripherals::PMU::regs();
pmu.ext_ldo_p1_0p2a_ana().modify(|_, w| {
w.ana_0p2a_en_cur_lim_1().set_bit();
w.ana_0p2a_en_vdet_1().set_bit()
});
pmu.ext_ldo_p1_0p2a().modify(|_, w| {
w._0p2a_force_tieh_sel_1().set_bit();
unsafe { w._0p2a_tieh_sel_1().bits(0) };
w._0p2a_tieh_1().set_bit();
w._0p2a_xpd_1().set_bit()
});
crate::rom::ets_delay_us(500);
pmu.ext_ldo_p1_0p2a_ana()
.modify(|_, w| w.ana_0p2a_en_cur_lim_1().clear_bit());
crate::rom::ets_delay_us(100);
}
pub fn set_module_clock(_source: ClockSource, div: u8) {
let c = crate::peripherals::HP_SYS_CLKRST::regs();
c.ref_clk_ctrl2()
.modify(|_, w| w.ref_160m_clk_en().set_bit());
c.peri_clk_ctrl01().modify(|_, w| {
w.sdio_ls_clk_src_sel().bit(false); w.sdio_ls_clk_en().set_bit()
});
if div > 1 {
let h = div / 2 - 1;
let l = div - 1;
let n = div - 1;
c.peri_clk_ctrl02().modify(|_, w| unsafe {
w.sdio_ls_clk_edge_h().bits(h);
w.sdio_ls_clk_edge_l().bits(l);
w.sdio_ls_clk_edge_n().bits(n)
});
} else {
c.peri_clk_ctrl01()
.modify(|_, w| w.sdio_hs_mode().set_bit());
c.peri_clk_ctrl02().modify(|_, w| unsafe {
w.sdio_ls_clk_edge_h().bits(0);
w.sdio_ls_clk_edge_l().bits(0);
w.sdio_ls_clk_edge_n().bits(0)
});
}
c.peri_clk_ctrl02().modify(|_, w| unsafe {
w.sdio_ls_drv_clk_en().set_bit();
w.sdio_ls_sam_clk_en().set_bit();
w.sdio_ls_slf_clk_en().set_bit();
w.sdio_ls_drv_clk_edge_sel().bits(1);
w.sdio_ls_sam_clk_edge_sel().bits(0);
w.sdio_ls_slf_clk_edge_sel().bits(0)
});
c.peri_clk_ctrl02()
.modify(|_, w| w.sdio_ls_clk_edge_cfg_update().set_bit());
c.peri_clk_ctrl02()
.modify(|_, w| w.sdio_ls_clk_edge_cfg_update().clear_bit());
}
const SDR104_HZ: u32 = 200_000_000;
pub fn set_input_delay_phase(phase: DelayPhase, hz: u32) {
let v = match phase {
DelayPhase::_0 => 0u8,
DelayPhase::_1 => 1,
DelayPhase::_2 => 2,
DelayPhase::_3 => 3,
};
if hz >= SDR104_HZ {
let bits = v << 3;
SDHOST::regs().dll_clk_conf().modify(|_, w| unsafe {
w.dll_cclk_in_sam_phase().bits(bits);
w.dll_cclk_in_drv_phase().bits(bits)
});
return;
}
let c = crate::peripherals::HP_SYS_CLKRST::regs();
c.peri_clk_ctrl02()
.modify(|_, w| unsafe { w.sdio_ls_sam_clk_edge_sel().bits(v) });
c.peri_clk_ctrl02()
.modify(|_, w| w.sdio_ls_clk_edge_cfg_update().set_bit());
c.peri_clk_ctrl02()
.modify(|_, w| w.sdio_ls_clk_edge_cfg_update().clear_bit());
}