artiq-zynq/src/szl/src/main.rs

95 lines
2.3 KiB
Rust
Raw Normal View History

2020-04-28 19:07:49 +08:00
#![no_std]
#![no_main]
extern crate log;
use core::mem;
2020-07-06 00:18:28 +08:00
use log::{debug, info, error};
2020-04-28 19:07:49 +08:00
use cstr_core::CStr;
use libcortex_a9::{
enable_fpu,
cache::{dcci_slice, iciallu, bpiall},
asm::{dsb, isb},
};
2020-04-28 19:07:49 +08:00
use libboard_zynq::{
2020-07-20 19:51:09 +08:00
self as zynq, println,
clocks::Clocks, clocks::source::{ClockSource, ArmPll, IoPll},
2020-05-01 08:18:36 +08:00
logger,
2020-04-28 19:07:49 +08:00
timer::GlobalTimer,
};
2020-05-06 22:16:34 +08:00
use libsupport_zynq as _;
2020-04-28 19:07:49 +08:00
extern "C" {
fn unlzma_simple(buf: *const u8, in_len: i32,
output: *mut u8,
error: extern fn(*const u8)) -> i32;
}
extern fn lzma_error(message: *const u8) {
error!("LZMA error: {}", unsafe { CStr::from_ptr(message) }.to_str().unwrap());
}
#[no_mangle]
pub fn main_core0() {
GlobalTimer::start();
2020-05-04 22:17:59 +08:00
logger::init().unwrap();
2020-04-28 19:07:49 +08:00
log::set_max_level(log::LevelFilter::Debug);
2020-07-20 19:51:09 +08:00
println!(r#"
__________ __
/ ___/__ / / /
\__ \ / / / /
___/ / / /__/ /___
/____/ /____/_____/
(C) 2020 M-Labs
"#);
2020-05-04 22:17:59 +08:00
info!("Simple Zynq Loader starting...");
2020-04-28 19:07:49 +08:00
2020-07-06 00:18:28 +08:00
enable_fpu();
debug!("FPU enabled on Core0");
2020-04-28 19:07:49 +08:00
const CPU_FREQ: u32 = 800_000_000;
ArmPll::setup(2 * CPU_FREQ);
Clocks::set_cpu_freq(CPU_FREQ);
IoPll::setup(1_000_000_000);
libboard_zynq::stdio::drop_uart(); // reinitialize UART after clocking change
let mut ddr = zynq::ddr::DdrRam::new();
2020-05-07 13:52:40 +08:00
let payload = include_bytes!("../../../build/szl-payload.bin.lzma");
2020-04-28 19:07:49 +08:00
info!("decompressing payload");
let result = unsafe {
unlzma_simple(payload.as_ptr(), payload.len() as i32, ddr.ptr(), lzma_error)
};
if result < 0 {
error!("decompression failed");
} else {
// Flush data cache entries for all of DDR, including
2020-07-10 16:36:45 +08:00
// Memory/Instruction Synchronization Barriers
dcci_slice(unsafe {
core::slice::from_raw_parts(ddr.ptr::<u8>(), ddr.size())
});
dsb();
iciallu();
bpiall();
dsb();
isb();
2020-05-06 22:16:34 +08:00
// Start core0 only, for compatibility with FSBL.
2020-04-28 19:07:49 +08:00
info!("executing payload");
unsafe {
(mem::transmute::<*mut u8, fn()>(ddr.ptr::<u8>()))();
}
}
loop {}
}
#[no_mangle]
pub fn main_core1() {
2020-05-06 22:16:34 +08:00
panic!("core1 started but should not have");
2020-04-28 19:07:49 +08:00
}