WIP
This commit is contained in:
parent
a26d187219
commit
8f9b8a7f3d
|
@ -3,7 +3,10 @@
|
||||||
|
|
||||||
use core::mem::transmute;
|
use core::mem::transmute;
|
||||||
use libcortex_a9::mutex::Mutex;
|
use libcortex_a9::mutex::Mutex;
|
||||||
use libboard_zynq::{print, println, self as zynq};
|
use libboard_zynq::{print, println, self as zynq,
|
||||||
|
dmac::{DmaC},
|
||||||
|
devc::{DevC},
|
||||||
|
};
|
||||||
use libboard_zc706::{
|
use libboard_zc706::{
|
||||||
ram, alloc::{vec, vec::Vec},
|
ram, alloc::{vec, vec::Vec},
|
||||||
boot,
|
boot,
|
||||||
|
@ -13,6 +16,8 @@ use libboard_zc706::{
|
||||||
smoltcp::socket::SocketSet,
|
smoltcp::socket::SocketSet,
|
||||||
smoltcp::socket::{TcpSocket, TcpSocketBuffer},
|
smoltcp::socket::{TcpSocket, TcpSocketBuffer},
|
||||||
};
|
};
|
||||||
|
mod pl_config;
|
||||||
|
use pl_config::load_pl;
|
||||||
|
|
||||||
const HWADDR: [u8; 6] = [0, 0x23, 0xde, 0xea, 0xbe, 0xef];
|
const HWADDR: [u8; 6] = [0, 0x23, 0xde, 0xea, 0xbe, 0xef];
|
||||||
|
|
||||||
|
@ -20,6 +25,8 @@ static mut STACK_CORE1: [u32; 512] = [0; 512];
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub fn main_core0() {
|
pub fn main_core0() {
|
||||||
|
let mut devc = DevC::new();
|
||||||
|
load_pl(&mut devc);
|
||||||
// zynq::clocks::CpuClocks::enable_io(1_250_000_000);
|
// zynq::clocks::CpuClocks::enable_io(1_250_000_000);
|
||||||
println!("\nzc706 main");
|
println!("\nzc706 main");
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
use libboard_zynq::{print, println, self as zynq,
|
||||||
|
devc::{DevC},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn load_pl(devc: &mut DevC) {
|
||||||
|
devc.enable_and_select_pcap();
|
||||||
|
devc.clear_interrupts(); // removed despite TRM suggestion
|
||||||
|
devc.initialize_pl();
|
||||||
|
devc.wait_for_pl_to_be_ready();
|
||||||
|
devc.wait_for_command_queue_space();
|
||||||
|
devc.disable_pcap_loopback();
|
||||||
|
devc.enable_pcap_non_secure_mode();
|
||||||
|
// load pcap
|
||||||
|
//devc.wait_for_dma_transfer();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -1,8 +1,9 @@
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
|
|
||||||
use libregister::*;
|
use libregister::*;
|
||||||
mod regs;
|
mod regs;
|
||||||
|
|
||||||
|
use crate::println;
|
||||||
|
|
||||||
pub struct DevC {
|
pub struct DevC {
|
||||||
regs: &'static mut regs::RegisterBlock,
|
regs: &'static mut regs::RegisterBlock,
|
||||||
}
|
}
|
||||||
|
@ -14,16 +15,117 @@ impl DevC {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn enable(&mut self) {
|
pub fn enable_and_select_pcap(&mut self) {
|
||||||
self.regs.control.modify(|_, w| {
|
self.regs.control.modify(|_, w| {
|
||||||
w.pcap_mode(true)
|
w.pcap_mode(true)
|
||||||
.pcap_pr(true)
|
.pcap_pr(true)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
pub fn disable(&mut self) {
|
|
||||||
|
pub fn enable_and_select_icap(&mut self) {
|
||||||
self.regs.control.modify(|_, w| {
|
self.regs.control.modify(|_, w| {
|
||||||
w.pcap_mode(false)
|
w.pcap_mode(true)
|
||||||
.pcap_pr(false)
|
.pcap_pr(false)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn clear_interrupts(&mut self) {
|
||||||
|
self.regs.int_sts.modify(|_, w| {
|
||||||
|
w.pps_gts_usr_b_int(true)
|
||||||
|
.pps_fst_cfg_b_int(true)
|
||||||
|
.pps_gpwrdwn_b_int(true)
|
||||||
|
.pps_gts_cfg_b_int(true)
|
||||||
|
.pps_cfg_reset_b_int(true)
|
||||||
|
.ixr_axi_wto(true)
|
||||||
|
.ixr_axi_werr(true)
|
||||||
|
.ixr_axi_rto(true)
|
||||||
|
.ixr_axi_rerr(true)
|
||||||
|
.ixr_rx_fifo_ov(true)
|
||||||
|
.ixr_wr_fifo_lvl(true)
|
||||||
|
.ixr_rd_fifo_lvl(true)
|
||||||
|
.ixr_dma_cmd_err(true)
|
||||||
|
.ixr_dma_q_ov(true)
|
||||||
|
.ixr_dma_done(true)
|
||||||
|
.ixr_d_p_done(true)
|
||||||
|
.ixr_p2d_len_err(true)
|
||||||
|
.ixr_pcfg_hmac_err(true)
|
||||||
|
.ixr_pcfg_seu_err(true)
|
||||||
|
.ixr_pcfg_por_b(true)
|
||||||
|
.ixr_pcfg_cfg_rst(true)
|
||||||
|
.ixr_pcfg_done(true)
|
||||||
|
.ixr_pcfg_init_pe(true)
|
||||||
|
.ixr_pcfg_init_ne(true)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn initialize_pl(&mut self) {
|
||||||
|
self.regs.mctrl.modify(|_, w| {
|
||||||
|
w.pcfg_por_b(true)
|
||||||
|
.pcfg_por_b(false)
|
||||||
|
});
|
||||||
|
self.wait_for_status_pcfg_init_to_be(false);
|
||||||
|
self.regs.mctrl.modify(|_, w| {
|
||||||
|
w.pcfg_por_b(true)
|
||||||
|
});
|
||||||
|
self.regs.int_sts.modify(|_,w| {
|
||||||
|
w.ixr_pcfg_done(true)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn wait_for_pl_to_be_ready(&self) {
|
||||||
|
self.wait_for_status_pcfg_init_to_be(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn wait_for_command_queue_space(&self){
|
||||||
|
self.wait_for_status_dma_cmd_q_f_to_be(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn disable_pcap_loopback(&mut self) {
|
||||||
|
self.regs.mctrl.modify(|_,w| {
|
||||||
|
w.pcap_lpbk(false)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn enable_pcap_secure_mode(&mut self) {
|
||||||
|
self.regs.control.modify(|_, w| {
|
||||||
|
w.pcap_rate_en(true)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
pub fn enable_pcap_non_secure_mode(&mut self) {
|
||||||
|
self.regs.control.modify(|_, w| {
|
||||||
|
w.pcap_rate_en(false)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn wait_for_dma_transfer(&self) {
|
||||||
|
self.wait_for_int_sts_ixr_dma_done_to_be(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn wait_for_status_pcfg_init_to_be(&self, value: bool) {
|
||||||
|
loop {
|
||||||
|
let status = self.regs.status.read();
|
||||||
|
println!("expected value: {}, actual pcfg_init: {}",value, status.pcfg_init());
|
||||||
|
if value == status.pcfg_init() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn wait_for_status_dma_cmd_q_f_to_be(&self, value: bool) {
|
||||||
|
loop {
|
||||||
|
let status = self.regs.status.read();
|
||||||
|
if value == status.pcfg_init() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn wait_for_int_sts_ixr_dma_done_to_be(&self, value: bool) {
|
||||||
|
loop {
|
||||||
|
let int_sts = self.regs.int_sts.read();
|
||||||
|
if value == int_sts.ixr_dma_done() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,7 +101,7 @@ register_bit!(int_sts, ixr_pcfg_hmac_err, 6);
|
||||||
register_bit!(int_sts, ixr_pcfg_seu_err, 5);
|
register_bit!(int_sts, ixr_pcfg_seu_err, 5);
|
||||||
register_bit!(int_sts, ixr_pcfg_por_b, 4);
|
register_bit!(int_sts, ixr_pcfg_por_b, 4);
|
||||||
register_bit!(int_sts, ixr_pcfg_cfg_rst, 3);
|
register_bit!(int_sts, ixr_pcfg_cfg_rst, 3);
|
||||||
register_bit!(int_sts, ixr_pcfg_done, 2);
|
register_bit!(int_sts, ixr_pcfg_done, 2); // seems to be PCFG_DONE_INT on pg 218 in TRM
|
||||||
register_bit!(int_sts, ixr_pcfg_init_pe, 1);
|
register_bit!(int_sts, ixr_pcfg_init_pe, 1);
|
||||||
register_bit!(int_sts, ixr_pcfg_init_ne, 0);
|
register_bit!(int_sts, ixr_pcfg_init_ne, 0);
|
||||||
|
|
||||||
|
|
|
@ -1 +1,16 @@
|
||||||
|
use core::fmt;
|
||||||
|
|
||||||
|
use libregister::*;
|
||||||
mod regs;
|
mod regs;
|
||||||
|
|
||||||
|
pub struct DmaC {
|
||||||
|
regs: &'static mut regs::RegisterBlock,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DmaC {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
DmaC {
|
||||||
|
regs: regs::RegisterBlock::dmac0_ns(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ pub mod slcr;
|
||||||
pub mod clocks;
|
pub mod clocks;
|
||||||
pub mod uart;
|
pub mod uart;
|
||||||
pub mod devc;
|
pub mod devc;
|
||||||
|
pub mod dmac;
|
||||||
pub mod stdio;
|
pub mod stdio;
|
||||||
pub mod eth;
|
pub mod eth;
|
||||||
pub mod axi_hp;
|
pub mod axi_hp;
|
||||||
|
|
Loading…
Reference in New Issue