Compare commits
2 Commits
8fd317d580
...
55f8d02da8
Author | SHA1 | Date |
---|---|---|
Astro | 55f8d02da8 | |
Astro | 990fa56d6a |
|
@ -143,8 +143,6 @@ pub fn main_core0() {
|
|||
let timer = libboard_zynq::timer::GlobalTimer::start();
|
||||
|
||||
let mut ddr = zynq::ddr::DdrRam::ddrram();
|
||||
// ddr init may call ps7_init, reconfiguring the uart
|
||||
libboard_zynq::stdio::drop_uart();
|
||||
#[cfg(not(feature = "target_zc706"))]
|
||||
ddr.memtest();
|
||||
ram::init_alloc_ddr(&mut ddr);
|
||||
|
|
|
@ -1,12 +1,9 @@
|
|||
use libregister::{RegisterR, RegisterW, RegisterRW};
|
||||
use log::{debug, info, error};
|
||||
use crate::{print, println};
|
||||
use super::slcr::{self, DdriobVrefSel};
|
||||
use super::slcr;
|
||||
use super::clocks::{Clocks, source::{DdrPll, ClockSource}};
|
||||
|
||||
#[cfg(feature = "target_redpitaya")]
|
||||
use super::ps7_init;
|
||||
|
||||
mod regs;
|
||||
|
||||
#[cfg(feature = "target_zc706")]
|
||||
|
@ -18,8 +15,8 @@ const DDR_FREQ: u32 = 666_666_666;
|
|||
const DDR_FREQ: u32 = 525_000_000;
|
||||
|
||||
#[cfg(feature = "target_redpitaya")]
|
||||
/// Alliance Memory AS4C256M16D3B: 800 MHz DDR3
|
||||
const DDR_FREQ: u32 = 800_000_000;
|
||||
/// Alliance Memory AS4C256M16D3B: 800 MHz DDR3 at 533 MHz
|
||||
const DDR_FREQ: u32 = 533_333_333;
|
||||
|
||||
/// MT41K256M16HA-125
|
||||
const DCI_FREQ: u32 = 10_000_000;
|
||||
|
@ -30,23 +27,13 @@ pub struct DdrRam {
|
|||
|
||||
impl DdrRam {
|
||||
pub fn ddrram() -> Self {
|
||||
if cfg!(feature = "target_redpitaya") {
|
||||
// We have not yet fixed red pitaya initialization yet. It seems
|
||||
// that the clock configuration, iob settings and ddr settings are
|
||||
// all problematic
|
||||
#[cfg(feature = "target_redpitaya")]
|
||||
ps7_init::apply();
|
||||
let regs = regs::RegisterBlock::ddrc();
|
||||
DdrRam { regs }
|
||||
} else {
|
||||
let clocks = Self::clock_setup();
|
||||
Self::configure_iob();
|
||||
Self::calibrate_iob_impedance(&clocks);
|
||||
let regs = regs::RegisterBlock::ddrc();
|
||||
let mut ddr = DdrRam { regs };
|
||||
ddr.reset_ddrc(|ddr| ddr.configure());
|
||||
ddr
|
||||
}
|
||||
let clocks = Self::clock_setup();
|
||||
Self::configure_iob();
|
||||
Self::calibrate_iob_impedance(&clocks);
|
||||
let regs = regs::RegisterBlock::ddrc();
|
||||
let mut ddr = DdrRam { regs };
|
||||
ddr.reset_ddrc(|ddr| ddr.configure());
|
||||
ddr
|
||||
}
|
||||
|
||||
/// Zynq-7000 AP SoC Technical Reference Manual:
|
||||
|
@ -237,6 +224,7 @@ impl DdrRam {
|
|||
.vref_int_en(false)
|
||||
.vref_ext_en_lower(true)
|
||||
.vref_ext_en_upper(false)
|
||||
.refio_en(true)
|
||||
);
|
||||
});
|
||||
}
|
||||
|
@ -249,6 +237,13 @@ impl DdrRam {
|
|||
.t_rfc_min(0x9e)
|
||||
.post_selfref_gap_x32(0x10)
|
||||
);
|
||||
#[cfg(feature = "target_redpitaya")]
|
||||
self.regs.dram_param0.write(
|
||||
regs::DramParam0::zeroed()
|
||||
.t_rc(0x1b)
|
||||
.t_rfc_min(0xa0)
|
||||
.post_selfref_gap_x32(0x10)
|
||||
);
|
||||
#[cfg(feature = "target_zc706")]
|
||||
self.regs.dram_param0.write(
|
||||
regs::DramParam0::zeroed()
|
||||
|
@ -256,6 +251,16 @@ impl DdrRam {
|
|||
.t_rfc_min(0x56)
|
||||
.post_selfref_gap_x32(0x10)
|
||||
);
|
||||
#[cfg(feature = "target_redpitaya")]
|
||||
self.regs.dram_param1.modify(
|
||||
|_, w| w
|
||||
.wr2pre(0x12)
|
||||
.powerdown_to_x32(6)
|
||||
.t_faw(0x16)
|
||||
.t_ras_max(0x24)
|
||||
.t_ras_min(0x13)
|
||||
.t_cke(4)
|
||||
);
|
||||
|
||||
self.regs.dram_param2.write(
|
||||
regs::DramParam2::zeroed()
|
||||
|
@ -267,6 +272,20 @@ impl DdrRam {
|
|||
.rd2pre(0x4)
|
||||
.t_rcd(0x7)
|
||||
);
|
||||
#[cfg(feature = "target_redpitaya")]
|
||||
self.regs.dram_param3.modify(
|
||||
|_, w| w
|
||||
.t_ccd(4)
|
||||
.t_rrd(6)
|
||||
.refresh_margin(2)
|
||||
.t_rp(7)
|
||||
.refresh_to_x32(8)
|
||||
.mobile(false)
|
||||
.dfi_dram_clk_disable(false)
|
||||
.read_latency(7)
|
||||
.mode_ddr1_ddr2(true)
|
||||
.dis_pad_pd(false)
|
||||
);
|
||||
|
||||
self.regs.dram_emr_mr.write(
|
||||
regs::DramEmrMr::zeroed()
|
||||
|
@ -275,11 +294,19 @@ impl DdrRam {
|
|||
);
|
||||
|
||||
#[cfg(feature = "target_cora_z7_10")]
|
||||
self.regs.phy_config2.modify(
|
||||
self.regs.phy_configs[2].modify(
|
||||
|_, w| w.data_slice_in_use(false)
|
||||
);
|
||||
#[cfg(feature = "target_cora_z7_10")]
|
||||
self.regs.phy_config3.modify(
|
||||
self.regs.phy_configs[3].modify(
|
||||
|_, w| w.data_slice_in_use(false)
|
||||
);
|
||||
#[cfg(feature = "target_redpitaya")]
|
||||
self.regs.phy_configs[2].modify(
|
||||
|_, w| w.data_slice_in_use(false)
|
||||
);
|
||||
#[cfg(feature = "target_redpitaya")]
|
||||
self.regs.phy_configs[3].modify(
|
||||
|_, w| w.data_slice_in_use(false)
|
||||
);
|
||||
|
||||
|
@ -316,7 +343,7 @@ impl DdrRam {
|
|||
);
|
||||
|
||||
#[cfg(feature = "target_zc706")]
|
||||
self.regs.phy_init_ratio3.write(
|
||||
self.regs.phy_init_ratios[3].write(
|
||||
regs::PhyInitRatio::zeroed()
|
||||
.wrlvl_init_ratio(0x21)
|
||||
.gatelvl_init_ratio(0xee)
|
||||
|
@ -328,6 +355,18 @@ impl DdrRam {
|
|||
.phy_ctrl_slave_ratio(0x100)
|
||||
.phy_invert_clkout(true)
|
||||
);
|
||||
#[cfg(feature = "target_redpitaya")]
|
||||
self.regs.reg_64.modify(
|
||||
|_, w| w
|
||||
.phy_bl2(false)
|
||||
.phy_invert_clkout(true)
|
||||
.phy_sel_logic(false)
|
||||
.phy_ctrl_slave_ratio(0x100)
|
||||
.phy_ctrl_slave_force(false)
|
||||
.phy_ctrl_slave_delay(0)
|
||||
.phy_lpddr(false)
|
||||
.phy_cmd_latency(false)
|
||||
);
|
||||
|
||||
self.regs.reg_65.write(
|
||||
regs::Reg65::zeroed()
|
||||
|
@ -364,7 +403,7 @@ impl DdrRam {
|
|||
self.regs.dram_addr_map_col.write(0xFFF00000);
|
||||
self.regs.dram_addr_map_row.write(0x0F666666);
|
||||
}
|
||||
#[cfg(feature = "target_cora_z7_10")]
|
||||
#[cfg(any(feature = "target_cora_z7_10", feature = "target_redpitaya"))]
|
||||
unsafe {
|
||||
// row/column address bits
|
||||
self.regs.dram_addr_map_bank.write(0x00000666);
|
||||
|
|
|
@ -60,7 +60,7 @@ pub struct RegisterBlock {
|
|||
pub ctrl6: RW<u32>,
|
||||
_unused1: [RO<u32>; 8],
|
||||
pub che_refresh_timer01: RW<u32>,
|
||||
pub che_t_zq: RW<u32>,
|
||||
pub che_t_zq: CheTZq,
|
||||
pub che_t_zq_short_interval: RW<u32>,
|
||||
pub deep_pwrdwn: RW<u32>,
|
||||
pub reg_2c: Reg2C,
|
||||
|
@ -84,15 +84,9 @@ pub struct RegisterBlock {
|
|||
pub che_ecc_corr_bit_mask_63_32_offset: RW<u32>,
|
||||
_unused3: [RO<u32>; 5],
|
||||
pub phy_rcvr_enable: RW<u32>,
|
||||
pub phy_config0: PhyConfig,
|
||||
pub phy_config1: PhyConfig,
|
||||
pub phy_config2: PhyConfig,
|
||||
pub phy_config3: PhyConfig,
|
||||
pub phy_configs: [PhyConfig; 4],
|
||||
_unused4: RO<u32>,
|
||||
pub phy_init_ratio0: PhyInitRatio,
|
||||
pub phy_init_ratio1: PhyInitRatio,
|
||||
pub phy_init_ratio2: PhyInitRatio,
|
||||
pub phy_init_ratio3: PhyInitRatio,
|
||||
pub phy_init_ratios: [PhyInitRatio; 4],
|
||||
_unused5: RO<u32>,
|
||||
pub phy_rd_dqs_cfg0: RW<u32>,
|
||||
pub phy_rd_dqs_cfg1: RW<u32>,
|
||||
|
@ -138,10 +132,7 @@ pub struct RegisterBlock {
|
|||
_unused14: [RO<u32>; 5],
|
||||
pub axi_id: RW<u32>,
|
||||
pub page_mask: RW<u32>,
|
||||
pub axi_priority_wr_port0: RW<u32>,
|
||||
pub axi_priority_wr_port1: RW<u32>,
|
||||
pub axi_priority_wr_port2: RW<u32>,
|
||||
pub axi_priority_wr_port3: RW<u32>,
|
||||
pub axi_priority_wr_ports: [RW<u32>; 4],
|
||||
pub axi_priority_rd_ports: [AxiPriorityRd; 4],
|
||||
_unused15: [RO<u32>; 27],
|
||||
pub excl_access_cfg0: RW<u32>,
|
||||
|
@ -222,6 +213,13 @@ register_bit!(phy_cmd_timeout_rddata_cpt, clk_stall_level, 19);
|
|||
register_bits!(phy_cmd_timeout_rddata_cpt, gatelvl_num_of_dq0, u8, 24, 27);
|
||||
register_bits!(phy_cmd_timeout_rddata_cpt, wrlvl_num_of_dq0, u8, 28, 31);
|
||||
|
||||
register!(che_t_zq, CheTZq, RW, u32);
|
||||
register_bit!(che_t_zq, dis_auto_zq, 0);
|
||||
register_bit!(che_t_zq, ddr3, 1);
|
||||
register_bits!(che_t_zq, t_mod, u8, 2, 11);
|
||||
register_bits!(che_t_zq, t_zq_long_nop, u16, 12, 21);
|
||||
register_bits!(che_t_zq, t_zq_short_nop, u16, 22, 31);
|
||||
|
||||
register!(reg_2c, Reg2C, RW, u32);
|
||||
register_bits!(reg_2c, wrlvl_max_x1024, u16, 0, 11);
|
||||
register_bits!(reg_2c, rdlvl_max_x1024, u16, 12, 23);
|
||||
|
|
|
@ -3,16 +3,12 @@ use crate::println;
|
|||
|
||||
#[cfg(feature = "target_zc706")]
|
||||
mod zc706;
|
||||
#[cfg(feature = "target_redpitaya")]
|
||||
mod redpitaya;
|
||||
#[cfg(not(any(feature = "target_zc706", feature = "target_redpitaya")))]
|
||||
#[cfg(not(feature = "target_zc706"))]
|
||||
mod none;
|
||||
|
||||
#[cfg(feature = "target_zc706")]
|
||||
use zc706 as target;
|
||||
#[cfg(feature = "target_redpitaya")]
|
||||
use redpitaya as target;
|
||||
#[cfg(not(any(feature = "target_zc706", feature = "target_redpitaya")))]
|
||||
#[cfg(not(feature = "target_zc706"))]
|
||||
use none as target;
|
||||
|
||||
pub fn report_differences() {
|
||||
|
|
|
@ -1,106 +0,0 @@
|
|||
use super::InitOp::{self, *};
|
||||
|
||||
pub const INIT_DATA: &'static [InitOp] = &[
|
||||
MaskWrite(0xF8000008, 0xFFFFFFFF, 0x0000DF0D),
|
||||
MaskWrite(0xF8000124, 0xFFF00003 ,0x0C200003),
|
||||
MaskWrite(0xF8000B40, 0x00000FFF, 0x00000600),
|
||||
MaskWrite(0xF8000B44, 0x00000FFF, 0x00000600),
|
||||
MaskWrite(0xF8000B48, 0x00000FFF, 0x00000672),
|
||||
MaskWrite(0xF8000B4C, 0x00000FFF, 0x00000800),
|
||||
MaskWrite(0xF8000B50, 0x00000FFF, 0x00000674),
|
||||
MaskWrite(0xF8000B54, 0x00000FFF, 0x00000800),
|
||||
MaskWrite(0xF8000B58, 0x00000FFF, 0x00000600),
|
||||
MaskWrite(0xF8000B5C, 0xFFFFFFFF, 0x0018C61C),
|
||||
MaskWrite(0xF8000B60, 0xFFFFFFFF, 0x00F9861C),
|
||||
MaskWrite(0xF8000B64, 0xFFFFFFFF, 0x00F9861C),
|
||||
MaskWrite(0xF8000B68, 0xFFFFFFFF, 0x00F9861C),
|
||||
MaskWrite(0xF8000B6C, 0x00007FFF, 0x00000220),
|
||||
MaskWrite(0xF8000B70, 0x00000001, 0x00000001),
|
||||
MaskWrite(0xF8000B70, 0x00000021, 0x00000020),
|
||||
MaskWrite(0xF8000B70, 0x07FEFFFF, 0x00000823),
|
||||
MaskWrite(0xF8000700, 0x00003FFF, 0x00001600),
|
||||
MaskWrite(0xF8000704, 0x00003FFF, 0x00001602),
|
||||
MaskWrite(0xF8000004, 0xFFFFFFFF, 0x0000767B),
|
||||
MaskWrite(0xF8006000, 0x0001FFFF, 0x00000084),
|
||||
MaskWrite(0xF8006004, 0x0007FFFF, 0x00001081),
|
||||
MaskWrite(0xF8006008, 0x03FFFFFF, 0x03C0780F),
|
||||
MaskWrite(0xF800600C, 0x03FFFFFF, 0x02001001),
|
||||
MaskWrite(0xF8006010, 0x03FFFFFF, 0x00014001),
|
||||
MaskWrite(0xF8006014, 0x001FFFFF, 0x0004281B),
|
||||
MaskWrite(0xF8006018, 0xF7FFFFFF, 0x44E458D2),
|
||||
MaskWrite(0xF800601C, 0xFFFFFFFF, 0x720238E5),
|
||||
MaskWrite(0xF8006020, 0x7FDFFFFC, 0x270872D0),
|
||||
MaskWrite(0xF8006024, 0x0FFFFFC3, 0x00000000),
|
||||
MaskWrite(0xF8006028, 0x00003FFF, 0x00002007),
|
||||
MaskWrite(0xF800602C, 0xFFFFFFFF, 0x00000008),
|
||||
MaskWrite(0xF8006030, 0xFFFFFFFF, 0x00040930),
|
||||
MaskWrite(0xF8006034, 0x13FF3FFF, 0x000116D4),
|
||||
MaskWrite(0xF8006038, 0x00000003, 0x00000000),
|
||||
MaskWrite(0xF800603C, 0x000FFFFF, 0x00000666),
|
||||
MaskWrite(0xF8006040, 0xFFFFFFFF, 0xFFFF0000),
|
||||
MaskWrite(0xF8006044, 0x0FFFFFFF, 0x0F555555),
|
||||
MaskWrite(0xF8006048, 0x0003F03F, 0x0003C008),
|
||||
MaskWrite(0xF8006050, 0xFF0F8FFF, 0x77010800),
|
||||
MaskWrite(0xF8006058, 0x00010000, 0x00000000),
|
||||
MaskWrite(0xF800605C, 0x0000FFFF, 0x00005003),
|
||||
MaskWrite(0xF8006060, 0x000017FF, 0x0000003E),
|
||||
MaskWrite(0xF8006064, 0x00021FE0, 0x00020000),
|
||||
MaskWrite(0xF8006068, 0x03FFFFFF, 0x00284141),
|
||||
MaskWrite(0xF800606C, 0x0000FFFF, 0x00001610),
|
||||
MaskWrite(0xF8006078, 0x03FFFFFF, 0x00466111),
|
||||
MaskWrite(0xF800607C, 0x000FFFFF, 0x00032222),
|
||||
MaskWrite(0xF80060A4, 0xFFFFFFFF, 0x10200802),
|
||||
MaskWrite(0xF80060A8, 0x0FFFFFFF, 0x0690CB73),
|
||||
MaskWrite(0xF80060AC, 0x000001FF, 0x000001FE),
|
||||
MaskWrite(0xF80060B0, 0x1FFFFFFF, 0x1CFFFFFF),
|
||||
MaskWrite(0xF80060B4, 0x00000200, 0x00000200),
|
||||
MaskWrite(0xF80060B8, 0x01FFFFFF, 0x00200066),
|
||||
MaskWrite(0xF80060C4, 0x00000003, 0x00000000),
|
||||
MaskWrite(0xF80060C8, 0x000000FF, 0x00000000),
|
||||
MaskWrite(0xF80060DC, 0x00000001, 0x00000000),
|
||||
MaskWrite(0xF80060F0, 0x0000FFFF, 0x00000000),
|
||||
MaskWrite(0xF80060F4, 0x0000000F, 0x00000008),
|
||||
MaskWrite(0xF8006114, 0x000000FF, 0x00000000),
|
||||
MaskWrite(0xF8006118, 0x7FFFFFCF, 0x40000001),
|
||||
MaskWrite(0xF800611C, 0x7FFFFFCF, 0x40000001),
|
||||
MaskWrite(0xF8006120, 0x7FFFFFCF, 0x40000000),
|
||||
MaskWrite(0xF8006124, 0x7FFFFFCF, 0x40000000),
|
||||
MaskWrite(0xF800612C, 0x000FFFFF, 0x00029000),
|
||||
MaskWrite(0xF8006130, 0x000FFFFF, 0x00029000),
|
||||
MaskWrite(0xF8006134, 0x000FFFFF, 0x00029000),
|
||||
MaskWrite(0xF8006138, 0x000FFFFF, 0x00029000),
|
||||
MaskWrite(0xF8006140, 0x000FFFFF, 0x00000035),
|
||||
MaskWrite(0xF8006144, 0x000FFFFF, 0x00000035),
|
||||
MaskWrite(0xF8006148, 0x000FFFFF, 0x00000035),
|
||||
MaskWrite(0xF800614C, 0x000FFFFF, 0x00000035),
|
||||
MaskWrite(0xF8006154, 0x000FFFFF, 0x00000080),
|
||||
MaskWrite(0xF8006158, 0x000FFFFF, 0x00000080),
|
||||
MaskWrite(0xF800615C, 0x000FFFFF, 0x00000080),
|
||||
MaskWrite(0xF8006160, 0x000FFFFF, 0x00000080),
|
||||
MaskWrite(0xF8006168, 0x001FFFFF, 0x000000F9),
|
||||
MaskWrite(0xF800616C, 0x001FFFFF, 0x000000F9),
|
||||
MaskWrite(0xF8006170, 0x001FFFFF, 0x000000F9),
|
||||
MaskWrite(0xF8006174, 0x001FFFFF, 0x000000F9),
|
||||
MaskWrite(0xF800617C, 0x000FFFFF, 0x000000C0),
|
||||
MaskWrite(0xF8006180, 0x000FFFFF, 0x000000C0),
|
||||
MaskWrite(0xF8006184, 0x000FFFFF, 0x000000C0),
|
||||
MaskWrite(0xF8006188, 0x000FFFFF, 0x000000C0),
|
||||
MaskWrite(0xF8006190, 0x6FFFFEFE, 0x00040080),
|
||||
MaskWrite(0xF8006194, 0x000FFFFF, 0x0001FC82),
|
||||
MaskWrite(0xF8006204, 0xFFFFFFFF, 0x00000000),
|
||||
MaskWrite(0xF8006208, 0x000703FF, 0x000003FF),
|
||||
MaskWrite(0xF800620C, 0x000703FF, 0x000003FF),
|
||||
MaskWrite(0xF8006210, 0x000703FF, 0x000003FF),
|
||||
MaskWrite(0xF8006214, 0x000703FF, 0x000003FF),
|
||||
MaskWrite(0xF8006218, 0x000F03FF, 0x000003FF),
|
||||
MaskWrite(0xF800621C, 0x000F03FF, 0x000003FF),
|
||||
MaskWrite(0xF8006220, 0x000F03FF, 0x000003FF),
|
||||
MaskWrite(0xF8006224, 0x000F03FF, 0x000003FF),
|
||||
MaskWrite(0xF80062A8, 0x00000FF5, 0x00000000),
|
||||
MaskWrite(0xF80062AC, 0xFFFFFFFF, 0x00000000),
|
||||
MaskWrite(0xF80062B0, 0x003FFFFF, 0x00005125),
|
||||
MaskWrite(0xF80062B4, 0x0003FFFF, 0x000012A8),
|
||||
MaskPoll(0xF8000B74, 0x00002000),
|
||||
MaskWrite(0xF8006000, 0x0001FFFF, 0x00000085),
|
||||
MaskPoll(0xF8006054, 0x00000007),
|
||||
];
|
Loading…
Reference in New Issue