2019-05-05 20:56:23 +08:00
|
|
|
#![no_std]
|
|
|
|
#![no_main]
|
|
|
|
|
2020-01-24 05:44:10 +08:00
|
|
|
use libboard_zynq::{print, println, self as zynq, clocks::Clocks, clocks::source::{ClockSource, ArmPll, IoPll}};
|
2020-02-06 01:22:14 +08:00
|
|
|
use libsupport_zynq as _;
|
2019-12-17 08:07:46 +08:00
|
|
|
|
2019-12-18 07:06:10 +08:00
|
|
|
#[no_mangle]
|
|
|
|
pub fn main_core0() {
|
2019-12-10 09:50:44 +08:00
|
|
|
println!("\nzc706 main");
|
2020-01-31 04:11:45 +08:00
|
|
|
let clocks = zynq::clocks::Clocks::get();
|
|
|
|
println!("CPU Clocks: {}/{}/{}/{}", clocks.cpu_6x4x(), clocks.cpu_3x2x(), clocks.cpu_2x(), clocks.cpu_1x());
|
2019-12-10 09:50:44 +08:00
|
|
|
|
2020-02-06 01:22:14 +08:00
|
|
|
// Clock setup
|
2020-01-24 05:44:10 +08:00
|
|
|
#[cfg(feature = "target_zc706")]
|
|
|
|
const CPU_FREQ: u32 = 800_000_000;
|
|
|
|
#[cfg(feature = "target_cora_z7_10")]
|
|
|
|
const CPU_FREQ: u32 = 650_000_000;
|
|
|
|
|
|
|
|
println!("Setup clock sources...");
|
|
|
|
ArmPll::setup(2 * CPU_FREQ);
|
|
|
|
Clocks::set_cpu_freq(CPU_FREQ);
|
|
|
|
IoPll::setup(700_000_000);
|
|
|
|
libboard_zynq::stdio::drop_uart();
|
|
|
|
println!("PLLs set up");
|
|
|
|
let clocks = zynq::clocks::Clocks::get();
|
|
|
|
println!("CPU Clocks: {}/{}/{}/{}", clocks.cpu_6x4x(), clocks.cpu_3x2x(), clocks.cpu_2x(), clocks.cpu_1x());
|
|
|
|
|
2020-02-06 01:22:14 +08:00
|
|
|
// Flash: Linear Addressing Mode
|
2019-12-10 09:50:44 +08:00
|
|
|
let mut flash = zynq::flash::Flash::new(200_000_000).linear_addressing_mode();
|
|
|
|
let flash_ram: &[u8] = unsafe { core::slice::from_raw_parts(flash.ptr(), flash.size()) };
|
|
|
|
for i in 0..=1 {
|
|
|
|
print!("Flash {}:", i);
|
|
|
|
for b in &flash_ram[(i * 16 * 1024 * 1024)..][..128] {
|
|
|
|
print!(" {:02X}", *b);
|
|
|
|
}
|
|
|
|
println!("");
|
|
|
|
}
|
|
|
|
let mut flash = flash.stop();
|
2019-10-22 04:19:03 +08:00
|
|
|
|
2020-02-06 01:22:14 +08:00
|
|
|
// Flash: Manual I/O Mode
|
|
|
|
for i in 0..=1 {
|
2019-12-10 09:50:44 +08:00
|
|
|
let mut flash_io = flash.manual_mode(i);
|
2020-01-31 04:11:45 +08:00
|
|
|
|
2019-12-10 09:50:44 +08:00
|
|
|
print!("Flash {} ID:", i);
|
2020-01-31 04:11:45 +08:00
|
|
|
for (i, b) in flash_io.rdid().enumerate() {
|
2019-12-10 09:50:44 +08:00
|
|
|
print!(" {:02X}", b);
|
2020-01-31 04:11:45 +08:00
|
|
|
if i % 0x10 == 0xf {
|
|
|
|
println!("");
|
|
|
|
} else if i % 8 == 7 {
|
|
|
|
print!(" ");
|
|
|
|
} else if i % 4 == 3 {
|
|
|
|
print!(" ");
|
|
|
|
}
|
2019-12-10 09:50:44 +08:00
|
|
|
}
|
|
|
|
println!("");
|
|
|
|
print!("Flash {} I/O:", i);
|
2019-12-17 08:07:46 +08:00
|
|
|
for o in 0..8 {
|
|
|
|
const CHUNK: u32 = 8;
|
|
|
|
for b in flash_io.read(CHUNK * o, CHUNK as usize) {
|
2019-12-10 09:50:44 +08:00
|
|
|
print!(" {:02X}", b);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
println!("");
|
2019-12-17 08:07:46 +08:00
|
|
|
|
|
|
|
flash_io.dump("Read cr1", 0x35);
|
|
|
|
flash_io.dump("Read Autoboot", 0x14);
|
|
|
|
flash_io.dump("Read Bank", 0x16);
|
|
|
|
flash_io.dump("DLP Bank", 0x16);
|
|
|
|
flash_io.dump("Read ESig", 0xAB);
|
|
|
|
flash_io.dump("OTP Read", 0x4B);
|
|
|
|
flash_io.dump("DYB Read", 0xE0);
|
|
|
|
flash_io.dump("PPB Read", 0xE2);
|
|
|
|
flash_io.dump("ASP Read", 0x2B);
|
|
|
|
flash_io.dump("Password Read", 0xE7);
|
|
|
|
|
2020-01-31 04:11:45 +08:00
|
|
|
for o in 0..8 {
|
|
|
|
const SIZE: u32 = 0x100;
|
|
|
|
flash_io.write_enabled(|flash_io| {
|
|
|
|
println!("Erase page {}", o);
|
|
|
|
flash_io.erase(o * SIZE);
|
|
|
|
});
|
|
|
|
flash_io.write_enabled(|flash_io| {
|
|
|
|
println!("Program page {}", o);
|
2020-02-06 01:22:14 +08:00
|
|
|
flash_io.program(o * SIZE, [0x55FD02AA; (SIZE >> 2) as usize].iter().cloned());
|
2020-01-31 04:11:45 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
print!("Flash {} I/O:", i);
|
|
|
|
for o in 0..8 {
|
|
|
|
const CHUNK: u32 = 32;
|
|
|
|
for b in flash_io.read(CHUNK * o, CHUNK as usize) {
|
|
|
|
print!(" {:02X}", b);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
println!("");
|
2019-12-17 08:07:46 +08:00
|
|
|
|
2019-12-10 09:50:44 +08:00
|
|
|
flash = flash_io.stop();
|
|
|
|
}
|
2019-05-28 06:28:35 +08:00
|
|
|
}
|
2019-05-31 02:30:19 +08:00
|
|
|
|
2019-12-18 07:06:10 +08:00
|
|
|
#[no_mangle]
|
2019-11-16 07:21:57 +08:00
|
|
|
pub fn main_core1() {
|
|
|
|
loop {}
|
|
|
|
}
|