zynq::ddr: wait for init

master
Astro 2019-10-25 19:09:54 +02:00
parent 4cf5283ba8
commit 838434cdec
2 changed files with 37 additions and 8 deletions

View File

@ -8,7 +8,9 @@ mod regs;
const DDR_FREQ: u32 = 666_666_666;
const DCI_FREQ: u32 = 10_000_000;
pub struct DdrRam;
pub struct DdrRam {
regs: &'static mut regs::RegisterBlock,
}
impl DdrRam {
pub fn new() -> Self {
@ -16,9 +18,11 @@ impl DdrRam {
Self::clock_setup(&clocks);
Self::calibrate_iob_impedance(&clocks);
Self::configure_iob();
Self::reset_ddrc();
DdrRam
let regs = unsafe { regs::RegisterBlock::new() };
let mut ddr = DdrRam { regs };
ddr.reset_ddrc();
ddr
}
/// Zynq-7000 AP SoC Technical Reference Manual:
@ -133,15 +137,20 @@ impl DdrRam {
}
/// Reset DDR controller
fn reset_ddrc() {
let regs = unsafe { regs::RegisterBlock::new() };
regs.ddrc_ctrl.modify(|_, w| w
fn reset_ddrc(&mut self) {
self.regs.ddrc_ctrl.modify(|_, w| w
.soft_rstb(false)
);
regs.ddrc_ctrl.modify(|_, w| w
self.regs.ddrc_ctrl.modify(|_, w| w
.soft_rstb(true)
.powerdown_en(false)
.data_bus_width(regs::DataBusWidth::Width32bit)
);
while self.status() == regs::ControllerStatus::Init {}
}
pub fn status(&self) -> regs::ControllerStatus {
self.regs.mode_sts_reg.read().operating_mode()
}
}

View File

@ -8,6 +8,21 @@ pub enum DataBusWidth {
Width16bit = 0b01,
}
#[derive(Debug, Clone, PartialEq)]
#[repr(u8)]
pub enum ControllerStatus {
Init = 0,
Normal = 1,
Powerdown = 2,
SelfRefresh = 3,
Powerdown1 = 4,
Powerdown2 = 5,
Powerdown3 = 6,
Powerdown4 = 7,
}
#[repr(C)]
pub struct RegisterBlock {
pub ddrc_ctrl: DdrcCtrl,
@ -31,7 +46,7 @@ pub struct RegisterBlock {
pub dram_odt_reg: RW<u32>,
pub phy_dbg_reg: RW<u32>,
pub phy_cmd_timeout_rddata_cpt: RW<u32>,
pub mode_sts_reg: RW<u32>,
pub mode_sts_reg: ModeStsReg,
pub dll_calib: RW<u32>,
pub odt_delay_hold: RW<u32>,
pub ctrl_reg1: RW<u32>,
@ -154,3 +169,8 @@ register_bit!(ddrc_ctrl,
register_bit!(ddrc_ctrl, powerdown_en, 1);
register_bits_typed!(ddrc_ctrl, data_bus_width, u8, DataBusWidth, 2, 3);
// (ddrc_ctrl) ...
/// Controller operation mode status
register!(mode_sts_reg, ModeStsReg, RO, u32);
register_bits_typed!(mode_sts_reg, operating_mode, u8, ControllerStatus, 0, 2);
// (mode_sts_reg) ...