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

106 lines
2.5 KiB
Rust
Raw Normal View History

2020-04-28 19:07:49 +08:00
#![no_std]
#![no_main]
#![feature(panic_info_message)]
2020-04-28 19:07:49 +08:00
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,
l2c::enable_l2_cache,
cache::{dcciall, 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},
stdio,
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) {
let msg = unsafe {CStr::from_ptr(message)}.to_str();
if let Ok(msg) = msg {
println!("LZMA error: {}", msg);
}
}
#[panic_handler]
fn panic(_: &core::panic::PanicInfo) -> ! {
stdio::drop_uart();
println!("panicked!");
loop {}
2020-04-28 19:07:49 +08:00
}
#[no_mangle]
pub fn main_core0() {
GlobalTimer::start();
enable_fpu();
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...");
enable_l2_cache();
2020-04-28 19:07:49 +08:00
2020-07-06 00:18:28 +08:00
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
2020-08-18 01:17:15 +08:00
let mut ddr = zynq::ddr::DdrRam::ddrram();
2020-04-28 19:07:49 +08:00
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 L1 cache, including
2020-07-10 16:36:45 +08:00
// Memory/Instruction Synchronization Barriers
dcciall();
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
}