Compare commits

...

1 Commits
master ... pcap

Author SHA1 Message Date
Stewart Mackenzie
8f9b8a7f3d WIP 2020-01-23 05:06:04 +08:00
6 changed files with 149 additions and 7 deletions

View File

@ -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");
{ {

View File

@ -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();
}

View File

@ -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
}
}
}
} }

View File

@ -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);

View File

@ -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(),
}
}
}

View File

@ -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;