forked from M-Labs/zynq-rs
Compare commits
7 Commits
4168eb63a7
...
195a21fe78
Author | SHA1 | Date |
---|---|---|
Florian Agbuya | 195a21fe78 | |
Florian Agbuya | 96cefe6f06 | |
morgan | 7c58c0cf43 | |
morgan | 9005b73316 | |
morgan | b1994dbe16 | |
morgan | 5bd336c961 | |
morgan | 298f64a2f9 |
|
@ -18,5 +18,5 @@ embedded-hal = "0.2"
|
||||||
libregister = { path = "../libregister" }
|
libregister = { path = "../libregister" }
|
||||||
libcortex_a9 = { path = "../libcortex_a9" }
|
libcortex_a9 = { path = "../libcortex_a9" }
|
||||||
libboard_zynq = { path = "../libboard_zynq" }
|
libboard_zynq = { path = "../libboard_zynq" }
|
||||||
libsupport_zynq = { path = "../libsupport_zynq", default-features = false, features = ["panic_handler"]}
|
libsupport_zynq = { path = "../libsupport_zynq", default-features = false, features = ["panic_handler", "dummy_fiq_handler"]}
|
||||||
libasync = { path = "../libasync" }
|
libasync = { path = "../libasync" }
|
||||||
|
|
|
@ -39,7 +39,7 @@ use libcortex_a9::{
|
||||||
};
|
};
|
||||||
use libregister::{RegisterR, RegisterW};
|
use libregister::{RegisterR, RegisterW};
|
||||||
use libsupport_zynq::{
|
use libsupport_zynq::{
|
||||||
boot, ram,
|
boot, exception_vectors, ram,
|
||||||
};
|
};
|
||||||
use log::{info, warn};
|
use log::{info, warn};
|
||||||
use core::sync::atomic::{AtomicBool, Ordering};
|
use core::sync::atomic::{AtomicBool, Ordering};
|
||||||
|
@ -96,6 +96,7 @@ pub fn restart_core1() {
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub fn main_core0() {
|
pub fn main_core0() {
|
||||||
|
exception_vectors::set_vector_table(0x0);
|
||||||
// zynq::clocks::CpuClocks::enable_io(1_250_000_000);
|
// zynq::clocks::CpuClocks::enable_io(1_250_000_000);
|
||||||
enable_l2_cache(0x8);
|
enable_l2_cache(0x8);
|
||||||
println!("\nZynq experiments");
|
println!("\nZynq experiments");
|
||||||
|
|
138
flake.nix
138
flake.nix
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
outputs = { self, nixpkgs, mozilla-overlay }:
|
outputs = { self, nixpkgs, mozilla-overlay }:
|
||||||
let
|
let
|
||||||
pkgs = import nixpkgs { system = "x86_64-linux"; overlays = [ (import mozilla-overlay) ]; };
|
pkgs = import nixpkgs { system = "x86_64-linux"; overlays = [ (import mozilla-overlay) crosspkgs-overlay ]; };
|
||||||
|
|
||||||
rustManifest = pkgs.fetchurl {
|
rustManifest = pkgs.fetchurl {
|
||||||
url = "https://static.rust-lang.org/dist/2021-01-29/channel-rust-nightly.toml";
|
url = "https://static.rust-lang.org/dist/2021-01-29/channel-rust-nightly.toml";
|
||||||
|
@ -26,118 +26,19 @@
|
||||||
cargo = rust;
|
cargo = rust;
|
||||||
});
|
});
|
||||||
|
|
||||||
gnu-platform = "arm-none-eabi";
|
crosspkgs-overlay = (self: super: {
|
||||||
|
pkgsCross = super.pkgsCross // {
|
||||||
binutils-pkg = { zlib, extraConfigureFlags ? [] }: pkgs.stdenv.mkDerivation rec {
|
zynq-baremetal = import super.path {
|
||||||
basename = "binutils";
|
system = "x86_64-linux";
|
||||||
version = "2.30";
|
crossSystem = {
|
||||||
name = "${basename}-${gnu-platform}-${version}";
|
config = "arm-none-eabihf";
|
||||||
src = pkgs.fetchurl {
|
libc = "newlib";
|
||||||
url = "https://ftp.gnu.org/gnu/binutils/binutils-${version}.tar.bz2";
|
gcc.cpu = "cortex-a9";
|
||||||
sha256 = "028cklfqaab24glva1ks2aqa1zxa6w6xmc8q34zs1sb7h22dxspg";
|
gcc.fpu = "vfpv3";
|
||||||
};
|
|
||||||
configureFlags = [
|
|
||||||
"--enable-deterministic-archives"
|
|
||||||
"--target=${gnu-platform}"
|
|
||||||
"--with-cpu=cortex-a9"
|
|
||||||
"--with-fpu=vfpv3"
|
|
||||||
"--with-float=hard"
|
|
||||||
"--with-mode=thumb"
|
|
||||||
] ++ extraConfigureFlags;
|
|
||||||
outputs = [ "out" "info" "man" ];
|
|
||||||
depsBuildBuild = [ pkgs.buildPackages.stdenv.cc ];
|
|
||||||
buildInputs = [ zlib ];
|
|
||||||
enableParallelBuilding = true;
|
|
||||||
meta = {
|
|
||||||
description = "Tools for manipulating binaries (linker, assembler, etc.)";
|
|
||||||
longDescription = ''
|
|
||||||
The GNU Binutils are a collection of binary tools. The main
|
|
||||||
ones are `ld' (the GNU linker) and `as' (the GNU assembler).
|
|
||||||
They also include the BFD (Binary File Descriptor) library,
|
|
||||||
`gprof', `nm', `strip', etc.
|
|
||||||
'';
|
|
||||||
homepage = http://www.gnu.org/software/binutils/;
|
|
||||||
license = pkgs.lib.licenses.gpl3Plus;
|
|
||||||
/* Give binutils a lower priority than gcc-wrapper to prevent a
|
|
||||||
collision due to the ld/as wrappers/symlinks in the latter. */
|
|
||||||
priority = "10";
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
gcc-pkg = { gmp, mpfr, libmpc, platform-binutils, extraConfigureFlags ? [] }: pkgs.stdenv.mkDerivation rec {
|
|
||||||
basename = "gcc";
|
|
||||||
version = "9.1.0";
|
|
||||||
name = "${basename}-${gnu-platform}-${version}";
|
|
||||||
src = pkgs.fetchurl {
|
|
||||||
url = "https://ftp.gnu.org/gnu/gcc/gcc-${version}/gcc-${version}.tar.xz";
|
|
||||||
sha256 = "1817nc2bqdc251k0lpc51cimna7v68xjrnvqzvc50q3ax4s6i9kr";
|
|
||||||
};
|
|
||||||
preConfigure = ''
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
'';
|
|
||||||
configureScript = "../configure";
|
|
||||||
configureFlags = [
|
|
||||||
"--target=${gnu-platform}"
|
|
||||||
"--with-arch=armv7-a"
|
|
||||||
"--with-tune=cortex-a9"
|
|
||||||
"--with-fpu=vfpv3"
|
|
||||||
"--with-float=hard"
|
|
||||||
"--disable-libssp"
|
|
||||||
"--enable-languages=c"
|
|
||||||
"--with-as=${platform-binutils}/bin/${gnu-platform}-as"
|
|
||||||
"--with-ld=${platform-binutils}/bin/${gnu-platform}-ld" ] ++ extraConfigureFlags;
|
|
||||||
outputs = [ "out" "info" "man" ];
|
|
||||||
hardeningDisable = [ "format" "pie" ];
|
|
||||||
propagatedBuildInputs = [ gmp mpfr libmpc platform-binutils ];
|
|
||||||
enableParallelBuilding = true;
|
|
||||||
dontFixup = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
newlib-pkg = { platform-binutils, platform-gcc }: pkgs.stdenv.mkDerivation rec {
|
|
||||||
pname = "newlib";
|
|
||||||
version = "3.1.0";
|
|
||||||
src = pkgs.fetchurl {
|
|
||||||
url = "ftp://sourceware.org/pub/newlib/newlib-${version}.tar.gz";
|
|
||||||
sha256 = "0ahh3n079zjp7d9wynggwrnrs27440aac04340chf1p9476a2kzv";
|
|
||||||
};
|
|
||||||
nativeBuildInputs = [ platform-binutils platform-gcc ];
|
|
||||||
configureFlags = [
|
|
||||||
"--target=${gnu-platform}"
|
|
||||||
|
|
||||||
"--with-cpu=cortex-a9"
|
|
||||||
"--with-fpu=vfpv3"
|
|
||||||
"--with-float=hard"
|
|
||||||
"--with-mode=thumb"
|
|
||||||
"--enable-interwork"
|
|
||||||
"--disable-multilib"
|
|
||||||
|
|
||||||
"--disable-newlib-supplied-syscalls"
|
|
||||||
"--with-gnu-ld"
|
|
||||||
"--with-gnu-as"
|
|
||||||
"--disable-newlib-io-float"
|
|
||||||
"--disable-werror"
|
|
||||||
];
|
|
||||||
dontFixup = true;
|
|
||||||
};
|
|
||||||
gnutoolchain = rec {
|
|
||||||
binutils-bootstrap = pkgs.callPackage binutils-pkg { };
|
|
||||||
gcc-bootstrap = pkgs.callPackage gcc-pkg {
|
|
||||||
platform-binutils = binutils-bootstrap;
|
|
||||||
extraConfigureFlags = [ "--disable-libgcc" ];
|
|
||||||
};
|
|
||||||
newlib = pkgs.callPackage newlib-pkg {
|
|
||||||
platform-binutils = binutils-bootstrap;
|
|
||||||
platform-gcc = gcc-bootstrap;
|
|
||||||
};
|
|
||||||
binutils = pkgs.callPackage binutils-pkg {
|
|
||||||
extraConfigureFlags = [ "--with-lib-path=${newlib}/arm-none-eabi/lib" ];
|
|
||||||
};
|
|
||||||
gcc = pkgs.callPackage gcc-pkg {
|
|
||||||
platform-binutils = binutils;
|
|
||||||
extraConfigureFlags = [ "--enable-newlib" "--with-headers=${newlib}/arm-none-eabi/include" ];
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
});
|
||||||
|
|
||||||
mkbootimage = pkgs.stdenv.mkDerivation {
|
mkbootimage = pkgs.stdenv.mkDerivation {
|
||||||
pname = "mkbootimage";
|
pname = "mkbootimage";
|
||||||
|
@ -168,19 +69,20 @@
|
||||||
src = pkgs.fetchFromGitHub {
|
src = pkgs.fetchFromGitHub {
|
||||||
owner = "Xilinx";
|
owner = "Xilinx";
|
||||||
repo = "embeddedsw";
|
repo = "embeddedsw";
|
||||||
rev = "65c849ed46c88c67457e1fc742744f96db968ff1";
|
rev = "xilinx_v2022.2";
|
||||||
sha256 = "1rvl06ha40dzd6s9aa4sylmksh4xb9dqaxq462lffv1fdk342pda";
|
sha256 = "sha256-UDz9KK/Hw3qM1BAeKif30rE8Bi6C2uvuZlvyvtJCMfw=";
|
||||||
};
|
};
|
||||||
patches = [ ./fsbl.patch ];
|
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
pkgs.gnumake
|
pkgs.pkgsCross.zynq-baremetal.buildPackages.binutils
|
||||||
gnutoolchain.binutils
|
pkgs.pkgsCross.zynq-baremetal.buildPackages.gcc
|
||||||
gnutoolchain.gcc
|
|
||||||
];
|
];
|
||||||
patchPhase = ''
|
patchPhase = ''
|
||||||
patch -p1 -i ${./fsbl.patch}
|
|
||||||
patchShebangs lib/sw_apps/zynq_fsbl/misc/copy_bsp.sh
|
patchShebangs lib/sw_apps/zynq_fsbl/misc/copy_bsp.sh
|
||||||
echo 'SEARCH_DIR("${gnutoolchain.newlib}/arm-none-eabi/lib");' >> lib/sw_apps/zynq_fsbl/src/lscript.ld
|
|
||||||
|
for x in lib/sw_apps/zynq_fsbl/src/Makefile lib/sw_apps/zynq_fsbl/misc/copy_bsp.sh lib/bsp/standalone/src/arm/cortexa9/gcc/Makefile; do
|
||||||
|
substituteInPlace $x \
|
||||||
|
--replace "arm-none-eabi-" "arm-none-eabihf-"
|
||||||
|
done
|
||||||
'';
|
'';
|
||||||
buildPhase = ''
|
buildPhase = ''
|
||||||
cd lib/sw_apps/zynq_fsbl/src
|
cd lib/sw_apps/zynq_fsbl/src
|
||||||
|
|
31
fsbl.patch
31
fsbl.patch
|
@ -1,31 +0,0 @@
|
||||||
diff --git a/lib/sw_apps/zynq_fsbl/src/Makefile b/lib/sw_apps/zynq_fsbl/src/Makefile
|
|
||||||
index 0e3ccdf1c5..a5b02f386e 100644
|
|
||||||
--- a/lib/sw_apps/zynq_fsbl/src/Makefile
|
|
||||||
+++ b/lib/sw_apps/zynq_fsbl/src/Makefile
|
|
||||||
@@ -71,11 +71,14 @@ endif
|
|
||||||
all: $(EXEC)
|
|
||||||
|
|
||||||
$(EXEC): $(LIBS) $(OBJS) $(INCLUDES)
|
|
||||||
- cp $(BSP_DIR)/$(BOARD)/ps7_init.* .
|
|
||||||
$(LINKER) $(LD1FLAGS) -o $@ $(OBJS) $(LDFLAGS)
|
|
||||||
rm -rf $(OBJS)
|
|
||||||
-
|
|
||||||
-
|
|
||||||
+
|
|
||||||
+.PHONY: ps7_init
|
|
||||||
+
|
|
||||||
+ps7_init:
|
|
||||||
+ cp $(BSP_DIR)/$(BOARD)/ps7_init.* .
|
|
||||||
+
|
|
||||||
$(LIBS):
|
|
||||||
echo "Copying BSP files"
|
|
||||||
$(BSP_DIR)/copy_bsp.sh $(BOARD) $(CC)
|
|
||||||
@@ -86,7 +89,7 @@ $(LIBS):
|
|
||||||
make -C $(BSP_DIR) -k all "CC=armcc" "AR=armar" "C_FLAGS= -O2 -c" "EC_FLAGS=--debug --wchar32"; \
|
|
||||||
fi;
|
|
||||||
|
|
||||||
-%.o:%.c
|
|
||||||
+%.o:%.c ps7_init
|
|
||||||
$(CC) $(CC_FLAGS) $(CFLAGS) $(ECFLAGS) -c $< -o $@ $(INCLUDEPATH)
|
|
||||||
|
|
||||||
%.o:%.S
|
|
|
@ -34,6 +34,12 @@ pub fn isb() {
|
||||||
unsafe { llvm_asm!("isb" :::: "volatile") }
|
unsafe { llvm_asm!("isb" :::: "volatile") }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Enable FIQ
|
||||||
|
#[inline]
|
||||||
|
pub unsafe fn enable_fiq() {
|
||||||
|
llvm_asm!("cpsie f":::: "volatile");
|
||||||
|
}
|
||||||
|
|
||||||
/// Enable IRQ
|
/// Enable IRQ
|
||||||
#[inline]
|
#[inline]
|
||||||
pub unsafe fn enable_irq() {
|
pub unsafe fn enable_irq() {
|
||||||
|
|
|
@ -12,9 +12,10 @@ target_redpitaya = ["libboard_zynq/target_redpitaya"]
|
||||||
target_kasli_soc = ["libboard_zynq/target_kasli_soc"]
|
target_kasli_soc = ["libboard_zynq/target_kasli_soc"]
|
||||||
panic_handler = []
|
panic_handler = []
|
||||||
dummy_irq_handler = []
|
dummy_irq_handler = []
|
||||||
|
dummy_fiq_handler = []
|
||||||
alloc_core = []
|
alloc_core = []
|
||||||
|
|
||||||
default = ["panic_handler", "dummy_irq_handler"]
|
default = ["panic_handler", "dummy_irq_handler", "dummy_fiq_handler"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
r0 = "1"
|
r0 = "1"
|
||||||
|
|
|
@ -54,6 +54,7 @@ unsafe extern "C" fn boot_core0() -> ! {
|
||||||
asm::dmb();
|
asm::dmb();
|
||||||
asm::dsb();
|
asm::dsb();
|
||||||
|
|
||||||
|
asm::enable_fiq();
|
||||||
asm::enable_irq();
|
asm::enable_irq();
|
||||||
main_core0();
|
main_core0();
|
||||||
panic!("return from main");
|
panic!("return from main");
|
||||||
|
@ -75,6 +76,7 @@ unsafe extern "C" fn boot_core1() -> ! {
|
||||||
asm::dmb();
|
asm::dmb();
|
||||||
asm::dsb();
|
asm::dsb();
|
||||||
|
|
||||||
|
asm::enable_fiq();
|
||||||
asm::enable_irq();
|
asm::enable_irq();
|
||||||
main_core1();
|
main_core1();
|
||||||
panic!("return from main_core1");
|
panic!("return from main_core1");
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
use libregister::RegisterR;
|
use libregister::{RegisterR, RegisterW};
|
||||||
use libcortex_a9::{regs::{DFSR, MPIDR}, interrupt_handler};
|
use libcortex_a9::{regs::{DFSR, MPIDR, VBAR}, interrupt_handler};
|
||||||
use libboard_zynq::{println, stdio};
|
use libboard_zynq::{println, stdio};
|
||||||
|
|
||||||
|
pub fn set_vector_table(base_addr: u32){
|
||||||
|
VBAR.write(base_addr);
|
||||||
|
}
|
||||||
|
|
||||||
interrupt_handler!(UndefinedInstruction, undefined_instruction, __irq_stack0_start, __irq_stack1_start, {
|
interrupt_handler!(UndefinedInstruction, undefined_instruction, __irq_stack0_start, __irq_stack1_start, {
|
||||||
stdio::drop_uart();
|
stdio::drop_uart();
|
||||||
println!("UndefinedInstruction");
|
println!("UndefinedInstruction");
|
||||||
|
@ -42,6 +46,7 @@ interrupt_handler!(IRQ, irq, __irq_stack0_start, __irq_stack1_start, {
|
||||||
loop {}
|
loop {}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
#[cfg(feature = "dummy_fiq_handler")]
|
||||||
interrupt_handler!(FIQ, fiq, __irq_stack0_start, __irq_stack1_start, {
|
interrupt_handler!(FIQ, fiq, __irq_stack0_start, __irq_stack1_start, {
|
||||||
stdio::drop_uart();
|
stdio::drop_uart();
|
||||||
println!("FIQ");
|
println!("FIQ");
|
|
@ -9,7 +9,7 @@ pub extern crate alloc;
|
||||||
pub extern crate compiler_builtins;
|
pub extern crate compiler_builtins;
|
||||||
|
|
||||||
pub mod boot;
|
pub mod boot;
|
||||||
mod abort;
|
pub mod exception_vectors;
|
||||||
#[cfg(feature = "panic_handler")]
|
#[cfg(feature = "panic_handler")]
|
||||||
mod panic;
|
mod panic;
|
||||||
pub mod ram;
|
pub mod ram;
|
||||||
|
|
Loading…
Reference in New Issue