From d6bd334ec0846501c7a904802ed2aefe8e664671 Mon Sep 17 00:00:00 2001 From: Nathaniel Graff Date: Thu, 13 Dec 2018 13:59:49 -0800 Subject: Move hello example to submodule Signed-off-by: Nathaniel Graff --- .gitmodules | 3 +++ software/hello | 1 + software/hello/.gitignore | 1 - software/hello/Makefile | 6 ------ software/hello/hello.c | 8 -------- 5 files changed, 4 insertions(+), 15 deletions(-) create mode 100644 .gitmodules create mode 160000 software/hello delete mode 100644 software/hello/.gitignore delete mode 100644 software/hello/Makefile delete mode 100644 software/hello/hello.c diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..4f23d3e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "software/hello"] + path = software/hello + url = https://github.com/sifive/example-hello.git diff --git a/software/hello b/software/hello new file mode 160000 index 0000000..41918cb --- /dev/null +++ b/software/hello @@ -0,0 +1 @@ +Subproject commit 41918cb70f42ce0cae2be36a6ba0f1df6a598f0f diff --git a/software/hello/.gitignore b/software/hello/.gitignore deleted file mode 100644 index ce01362..0000000 --- a/software/hello/.gitignore +++ /dev/null @@ -1 +0,0 @@ -hello diff --git a/software/hello/Makefile b/software/hello/Makefile deleted file mode 100644 index 058621c..0000000 --- a/software/hello/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -TARGET = hello -C_SRCS += hello.c -CFLAGS += -O2 -fno-builtin-printf - -BSP_BASE = ../../bsp -include $(BSP_BASE)/env/common.mk diff --git a/software/hello/hello.c b/software/hello/hello.c deleted file mode 100644 index befc6ee..0000000 --- a/software/hello/hello.c +++ /dev/null @@ -1,8 +0,0 @@ -#include - -int main() -{ - puts("hello world!\n"); - - return 0; -} -- cgit v1.2.3 From b38973e0327f79d1c2ca2f86872a0954b0ad4c79 Mon Sep 17 00:00:00 2001 From: Nathaniel Graff Date: Thu, 13 Dec 2018 14:01:32 -0800 Subject: Add Freedom MEE as a submodule Signed-off-by: Nathaniel Graff --- .gitmodules | 3 +++ freedom-mee | 1 + 2 files changed, 4 insertions(+) create mode 160000 freedom-mee diff --git a/.gitmodules b/.gitmodules index 4f23d3e..68ab3b2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "software/hello"] path = software/hello url = https://github.com/sifive/example-hello.git +[submodule "freedom-mee"] + path = freedom-mee + url = https://github.com/sifive/freedom-mee.git diff --git a/freedom-mee b/freedom-mee new file mode 160000 index 0000000..6ae66a2 --- /dev/null +++ b/freedom-mee @@ -0,0 +1 @@ +Subproject commit 6ae66a2ba3e1c69e4e411900d61f99486266b919 -- cgit v1.2.3 From cc139c77212bd1c8bf306048539eef20ad955f9a Mon Sep 17 00:00:00 2001 From: Nathaniel Graff Date: Thu, 13 Dec 2018 14:02:52 -0800 Subject: Support Building of MEE and MEE examples Signed-off-by: Nathaniel Graff --- .gitignore | 7 ++- Makefile | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- scripts/debug | 34 ++++++++++++++ scripts/upload | 34 ++++++++++++++ 4 files changed, 203 insertions(+), 12 deletions(-) create mode 100755 scripts/debug create mode 100755 scripts/upload diff --git a/.gitignore b/.gitignore index 534c2dc..2f420c2 100644 --- a/.gitignore +++ b/.gitignore @@ -9,8 +9,13 @@ software/demo_gpio/demo_gpio software/dhrystone/dhrystone software/double_tap_dontboot/double_tap_dontboot software/global_interrupts/global_interrupts -software/hello/hello software/led_fade/led_fade software/local_interrupts/local_interrupts software/performance_counters/performance_counters software/smp/smp + +bsp/*/build +bsp/*/install + +/Makefile.local +/enter.bash diff --git a/Makefile b/Makefile index 5b1b186..ec363a9 100644 --- a/Makefile +++ b/Makefile @@ -15,21 +15,32 @@ include $(extra_configs) endif # Default target + +# legacy for old e-sdk or mee +BSP ?= legacy + +ifeq ($(BSP),legacy) +BSP_SUBDIR ?= env BOARD ?= freedom-e300-hifive1 PROGRAM ?= demo_gpio LINK_TARGET ?= flash GDB_PORT ?= 3333 -# Variables the user probably shouldn't override. -builddir := work/build +else # MEE +BSP_SUBDIR ?= +PROGRAM ?= hello +BOARD ?= sifive-hifive1 +endif # $(BSP) + +# Variables the user probably shouldn't override. ############################################################# # BSP Loading ############################################################# # Finds the directory in which this BSP is located, ensuring that there is # exactly one. -board_dir := $(wildcard bsp/env/$(BOARD)) +board_dir := $(wildcard bsp/$(BSP_SUBDIR)/$(BOARD)) ifeq ($(words $(board_dir)),0) $(error Unable to find BSP for $(BOARD), expected to find either "bsp/$(BOARD)" or "bsp-addons/$(BOARD)") endif @@ -37,10 +48,17 @@ ifneq ($(words $(board_dir)),1) $(error Found multiple BSPs for $(BOARD): "$(board_dir)") endif +ifeq ($(BSP), mee) + +include $(board_dir)/settings.mk + +else + # There must be a settings makefile fragment in the BSP's board directory. ifeq ($(wildcard $(board_dir)/settings.mk),) $(error Unable to find BSP for $(BOARD), expected to find $(board_dir)/settings.mk) endif + include $(board_dir)/settings.mk ifeq ($(RISCV_ARCH),) @@ -51,6 +69,8 @@ ifeq ($(RISCV_ABI),) $(error $(board_dir)/board.mk must set RISCV_ABI, the ABI to target) endif +endif + # Determines the XLEN from the toolchain tuple ifeq ($(patsubst rv32%,rv32,$(RISCV_ARCH)),rv32) RISCV_XLEN := 32 @@ -68,10 +88,16 @@ help: @echo " SiFive Freedom E Software Development Kit " @echo " Makefile targets:" @echo "" - @echo " software [PROGRAM=$(PROGRAM) BOARD=$(BOARD)]:" + @echo " software BSP=legacy [PROGRAM=$(PROGRAM) BOARD=$(BOARD)]:" @echo " Build a software program to load with the" @echo " debugger." @echo "" + @echo " mee BSP=mee [BOARD=$(BOARD)]" + @echo " Build the MEE library for BOARD" + @echo "" + @echo " examples BSP=mee [BOARD=$(BOARD)]" + @echo " Build all the examples for the given board." + @echo "" @echo " clean [PROGRAM=$(PROGRAM) BOARD=$(BOARD)]:" @echo " Clean compiled objects for a specified " @echo " software program." @@ -90,29 +116,112 @@ help: @echo "" @echo " For more information, visit dev.sifive.com" +.PHONY: clean +clean: + ############################################################# # This section is for tool configuration ############################################################# -toolchain_builddir := $(builddir)/riscv-gnu-toolchain/riscv64-unknown-elf -toolchain_prefix := $(toolchain_builddir)/prefix - -RISCV_PATH ?= $(toolchain_prefix) - +# If users don't specify RISCV_PATH then assume that the tools will just be in +# their path. +ifeq ($(RISCV_PATH),) +RISCV_GCC := $(CROSS_COMPILE)-gcc +RISCV_GXX := $(CROSS_COMPILE)-g++ +RISCV_OBJDUMP := $(CROSS_COMPILE)-objdump +RISCV_GDB := $(CROSS_COMPILE)-gdb +RISCV_AR := $(CROSS_COMPILE)-ar +RISCV_OPENOCD := openocd +else RISCV_GCC := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)-gcc) RISCV_GXX := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)-g++) RISCV_OBJDUMP := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)-objdump) RISCV_GDB := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)-gdb) RISCV_AR := $(abspath $(RISCV_PATH)/bin/$(CROSS_COMPILE)-ar) +RISCV_OPENOCD := $(abspath $(RISCV_PATH)/bin/openocd) +PATH := $(abspath $(RISCV_PATH)/bin):$(PATH) +endif -PATH := $(abspath $(RISCV_PATH)/bin):$(PATH) +############################################################# +# Compiles an instance of the MEE targeted at $(BOARD) +############################################################# +ifeq ($(BSP),mee) +MEE_SOURCE_PATH ?= freedom-mee +MEE_BSP_PATH = bsp/$(BOARD) +MEE_LDSCRIPT = $(MEE_BSP_PATH)/mee.lds +MEE_HEADER = $(MEE_BSP_PATH)/mee.h + +.PHONY: mee +mee: $(MEE_BSP_PATH)/install/stamp + +$(MEE_BSP_PATH)/build/Makefile: + @rm -rf $(dir $@) + @mkdir -p $(dir $@) + cd $(dir $@) && \ + CFLAGS="-march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -g" \ + $(abspath $(MEE_SOURCE_PATH)/configure) \ + --host=$(CROSS_COMPILE) \ + --prefix=$(abspath $(MEE_BSP_PATH)/install) \ + --with-preconfigured \ + --with-machine-name=$(BOARD) \ + --with-machine-header=$(abspath $(MEE_HEADER)) \ + --with-machine-ldscript=$(abspath $(MEE_LDSCRIPT)) \ + --with-builtin-libgloss + touch -c $@ + +$(MEE_BSP_PATH)/install/stamp: $(MEE_BSP_PATH)/build/Makefile + $(MAKE) -C $(abspath $(MEE_BSP_PATH)/build) install + date > $@ + +$(MEE_BSP_PATH)/install/lib/libriscv%.a: $(MEE_BSP_PATH)/install/stamp ;@: + +$(MEE_BSP_PATH)/install/lib/libmee.a: $(MEE_BSP_PATH)/install/lib/libriscv__mmachine__$(BOARD).a + cp $< $@ + +$(MEE_BSP_PATH)/install/lib/libmee-gloss.a: $(MEE_BSP_PATH)/install/lib/libriscv__menv__mee.a + cp $< $@ + +.PHONY: clean-mee +clean-mee: + rm -rf $(MEE_BSP_PATH)/install + rm -rf $(MEE_BSP_PATH)/build +clean: clean-mee +endif + +mee_install: mee + $(MAKE) -C $(MEE_SOURCE_PATH) install ############################################################# # This Section is for Software Compilation ############################################################# -PROGRAM_DIR = software/$(PROGRAM) PROGRAM_ELF = software/$(PROGRAM)/$(PROGRAM) +ifeq ($(BSP),mee) +.PHONY: software +software: $(PROGRAM_ELF) + +$(PROGRAM_ELF): \ + $(shell find $(abspath $(dir $(PROGRAM_ELF))) -type f) \ + $(MEE_BSP_PATH)/install/lib/libmee.a \ + $(MEE_BSP_PATH)/install/lib/libmee-gloss.a \ + $(MEE_BSP_PATH)/mee.lds + $(MAKE) -C $(dir $@) $(notdir $@) \ + CC=$(RISCV_GCC) \ + CXX=$(RISCV_GXX) \ + CFLAGS="-Os -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -g" \ + CXXFLAGS="-Os -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -g" \ + LDFLAGS="-nostartfiles -nostdlib -L$(sort $(dir $(abspath $(filter %.a,$^)))) -T$(abspath $(filter %.lds,$^))" \ + LDLIBS="-Wl,--start-group -lc -lmee -lmee-gloss -Wl,--end-group" + touch -c $@ + +.PHONY: clean-software +clean-software: + $(MAKE) -C $(dir $(PROGRAM_ELF)) clean +clean: clean-software + +else +PROGRAM_DIR=$(dir $(PROGRAM_ELF)) + .PHONY: software_clean clean: software_clean software_clean: @@ -124,10 +233,18 @@ software: software_clean dasm: software $(RISCV_OBJDUMP) $(RISCV_OBJDUMP) -D $(PROGRAM_ELF) +endif ############################################################# # This Section is for uploading a program to SPI Flash ############################################################# +ifeq ($(BSP),mee) +upload: $(PROGRAM_ELF) + scripts/upload --elf $(PROGRAM_ELF) --openocd $(RISCV_OPENOCD) --gdb $(RISCV_GDB) --openocd-config bsp/$(BOARD)/openocd.cfg + +debug: $(PROGRAM_ELF) + scripts/debug --elf $(PROGRAM_ELF) --openocd $(RISCV_OPENOCD) --gdb $(RISCV_GDB) --openocd-config bsp/$(BOARD)/openocd.cfg +else OPENOCDCFG ?= bsp/env/$(BOARD)/openocd.cfg OPENOCDARGS += -f $(OPENOCDCFG) @@ -146,6 +263,7 @@ upload: $(RISCV_OPENOCD) $(OPENOCDARGS) & \ $(RISCV_GDB) $(PROGRAM_DIR)/$(PROGRAM) $(GDB_UPLOAD_ARGS) $(GDB_UPLOAD_CMDS) && \ echo "Successfully uploaded '$(PROGRAM)' to $(BOARD)." +endif ############################################################# # This Section is for launching the debugger diff --git a/scripts/debug b/scripts/debug new file mode 100755 index 0000000..d02c42c --- /dev/null +++ b/scripts/debug @@ -0,0 +1,34 @@ +#!/bin/bash + +set -e +set -o pipefail + +unset elf +unset cfg +unset openocd +unset gdb +while [[ "$1" != "" ]] +do + case "$1" + in + --elf) elf="$2"; shift 2;; + --openocd) openocd="$2"; shift 2;; + --openocd-config) cfg="$2"; shift 2;; + --gdb) gdb="$2"; shift 2;; + *) echo "$0: Unknown argument $1"; exit 1;; + esac +done + +if [[ "$elf" == "" ]] +then + echo "$0: --elf is required" >&2 + exit 1 +fi + +export GDB_PORT=3333 + +$openocd -f $cfg & + +$gdb $elf -ex "set remotetimeout 240" -ex "target extended-remote localhost:${GDB_PORT}" + +kill %1 diff --git a/scripts/upload b/scripts/upload new file mode 100755 index 0000000..66e9ed8 --- /dev/null +++ b/scripts/upload @@ -0,0 +1,34 @@ +#!/bin/bash + +set -e +set -o pipefail + +unset elf +unset cfg +unset openocd +unset gdb +while [[ "$1" != "" ]] +do + case "$1" + in + --elf) elf="$2"; shift 2;; + --openocd) openocd="$2"; shift 2;; + --openocd-config) cfg="$2"; shift 2;; + --gdb) gdb="$2"; shift 2;; + *) echo "$0: Unknown argument $1"; exit 1;; + esac +done + +if [[ "$elf" == "" ]] +then + echo "$0: --elf is required" >&2 + exit 1 +fi + +export GDB_PORT=3333 + +$openocd -f $cfg & + +$gdb $elf --batch -ex "set remotetimeout 240" -ex "target extended-remote localhost:${GDB_PORT}" -ex "monitor reset halt" -ex "monitor flash protect 0 64 last off" -ex "load" -ex "monitor resume" -ex "monitor shutdown" -ex "quit" + +kill %1 -- cgit v1.2.3 From 7202b8ed15a46645de54906f0f08c7f7e9b5e654 Mon Sep 17 00:00:00 2001 From: Nathaniel Graff Date: Thu, 13 Dec 2018 14:03:18 -0800 Subject: Add MEE BSP for SiFive HiFive1 Signed-off-by: Nathaniel Graff --- bsp/sifive-hifive1/design.dts | 187 ++++++++++++++++++++++++++++++++++++++++ bsp/sifive-hifive1/mee.h | 138 ++++++++++++++++++++++++++++++ bsp/sifive-hifive1/mee.lds | 190 +++++++++++++++++++++++++++++++++++++++++ bsp/sifive-hifive1/openocd.cfg | 34 ++++++++ bsp/sifive-hifive1/settings.mk | 2 + 5 files changed, 551 insertions(+) create mode 100644 bsp/sifive-hifive1/design.dts create mode 100644 bsp/sifive-hifive1/mee.h create mode 100644 bsp/sifive-hifive1/mee.lds create mode 100644 bsp/sifive-hifive1/openocd.cfg create mode 100644 bsp/sifive-hifive1/settings.mk diff --git a/bsp/sifive-hifive1/design.dts b/bsp/sifive-hifive1/design.dts new file mode 100644 index 0000000..a71956a --- /dev/null +++ b/bsp/sifive-hifive1/design.dts @@ -0,0 +1,187 @@ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + compatible = "sifive,hifive1"; + model = "sifive,hifive1"; + + chosen { + stdout-path = "/soc/serial@10013000:115200"; + mee,entry = <&sip0 0x400000>; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + compatible = "sifive,fe310-g000"; + L6: cpu@0 { + clocks = <&hfclk>; + compatible = "sifive,rocket0", "riscv"; + device_type = "cpu"; + i-cache-block-size = <64>; + i-cache-sets = <128>; + i-cache-size = <16384>; + next-level-cache = <&sip0>; + reg = <0>; + riscv,isa = "rv32imac"; + sifive,dtim = <&dtim>; + sifive,itim = <&itim>; + status = "okay"; + timebase-frequency = <1000000>; + hlic: interrupt-controller { + #interrupt-cells = <1>; + compatible = "riscv,cpu-intc"; + interrupt-controller; + }; + }; + }; + + soc { + #address-cells = <1>; + #size-cells = <1>; + #clock-cells = <1>; + compatible = "sifive,hifive1"; + ranges; + + hfxoscin: clock@0 { + #clock-cells = <0>; + compatible = "fixed-clock"; + clock-frequency = <16000000>; + }; + hfxoscout: clock@1 { + compatible = "sifive,fe310-g000,hfxosc"; + clocks = <&hfxoscin>; + reg = <&prci 0x4>; + reg-names = "config"; + }; + hfroscin: clock@2 { + #clock-cells = <0>; + compatible = "fixed-clock"; + clock-frequency = <72000000>; + }; + hfroscout: clock@3 { + compatible = "sifive,fe310-g000,hfrosc"; + clocks = <&hfroscin>; + reg = <&prci 0x0>; + reg-names = "config"; + }; + hfclk: clock@4 { + compatible = "sifive,fe310-g000,pll"; + clocks = <&hfxoscout &hfroscout>; + clock-names = "pllref", "pllsel0"; + reg = <&prci 0x8 &prci 0xc>; + reg-names = "config", "divider"; + clock-frequency = <16000000>; + }; + + lfroscin: clock@5 { + #clock-cells = <0>; + compatible = "fixed-clock"; + clock-frequency = <32000000>; + }; + lfclk: clock@6 { + compatible = "sifive,fe310-g000,lfrosc"; + clocks = <&lfroscin>; + reg = <&aon 0x70>; + reg-names = "config"; + }; + + aon: aon@10000000 { + compatible = "sifive,aon0"; + reg = <0x10000000 0x8000>; + reg-names = "mem"; + }; + + prci: prci@10008000 { + compatible = "sifive,fe310-g000,prci"; + reg = <0x10008000 0x8000>; + reg-names = "mem"; + }; + + clint: clint@2000000 { + compatible = "riscv,clint0"; + interrupts-extended = <&hlic 3 &hlic 7>; + reg = <0x2000000 0x10000>; + reg-names = "control"; + }; + local-external-interrupts-0 { + compatible = "sifive,local-external-interrupts0"; + interrupt-parent = <&hlic>; + interrupts = <16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31>; + }; + plic: interrupt-controller@c000000 { + #interrupt-cells = <1>; + compatible = "riscv,plic0"; + interrupt-controller; + interrupts-extended = <&hlic 11>; + reg = <0xc000000 0x4000000>; + reg-names = "control"; + riscv,max-priority = <7>; + riscv,ndev = <26>; + }; + global-external-interrupts { + compatile = "sifive,global-external-interrupts0"; + interrupt-parent = <&plic>; + interrupts = <1 2 3 4>; + }; + + debug-controller@0 { + compatible = "sifive,debug-011", "riscv,debug-011"; + interrupts-extended = <&hlic 65535>; + reg = <0x0 0x100>; + reg-names = "control"; + }; + + maskrom@1000 { + reg = <0x1000 0x2000>; + reg-names = "mem"; + }; + otp@20000 { + reg = <0x20000 0x2000 0x10010000 0x1000>; + reg-names = "mem", "control"; + }; + + dtim: dtim@80000000 { + compatible = "sifive,dtim0"; + reg = <0x80000000 0x4000>; + reg-names = "mem"; + }; + itim: itim@8000000 { + compatible = "sifive,itim0"; + reg = <0x8000000 0x4000>; + reg-names = "mem"; + }; + + pwm@10015000 { + compatible = "sifive,pwm0"; + interrupt-parent = <&plic>; + interrupts = <23 24 25 26>; + reg = <0x10015000 0x1000>; + reg-names = "control"; + }; + gpio0: gpio@10012000 { + compatible = "sifive,gpio0"; + interrupt-parent = <&plic>; + interrupts = <7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22>; + reg = <0x10012000 0x1000>; + reg-names = "control"; + }; + uart0: serial@10013000 { + compatible = "sifive,uart0"; + interrupt-parent = <&plic>; + interrupts = <5>; + reg = <0x10013000 0x1000>; + reg-names = "control"; + clocks = <&hfclk>; + pinmux = <&gpio0 0x30000 0x30000>; + }; + sip0: spi@10014000 { + compatible = "sifive,spi0"; + interrupt-parent = <&plic>; + interrupts = <6>; + reg = <0x10014000 0x1000 0x20000000 0x20000000>; + reg-names = "control", "mem"; + }; + }; +}; diff --git a/bsp/sifive-hifive1/mee.h b/bsp/sifive-hifive1/mee.h new file mode 100644 index 0000000..e220490 --- /dev/null +++ b/bsp/sifive-hifive1/mee.h @@ -0,0 +1,138 @@ +#ifndef ASSEMBLY +#include +#include +#include +#include +#include +#include +#include +/* From clock@0 */ +asm (".weak __mee_dt_clock_0"); +struct __mee_driver_fixed_clock __mee_dt_clock_0; + +/* From clock@2 */ +asm (".weak __mee_dt_clock_2"); +struct __mee_driver_fixed_clock __mee_dt_clock_2; + +/* From clock@5 */ +asm (".weak __mee_dt_clock_5"); +struct __mee_driver_fixed_clock __mee_dt_clock_5; + +/* From clock@4 */ +asm (".weak __mee_dt_clock_4"); +struct __mee_driver_sifive_fe310_g000_pll __mee_dt_clock_4; + +/* From prci@10008000 */ +asm (".weak __mee_dt_prci_10008000"); +struct __mee_driver_sifive_fe310_g000_prci __mee_dt_prci_10008000; + +/* From clock@1 */ +asm (".weak __mee_dt_clock_1"); +struct __mee_driver_sifive_fe310_g000_hfxosc __mee_dt_clock_1; + +/* From clock@3 */ +asm (".weak __mee_dt_clock_3"); +struct __mee_driver_sifive_fe310_g000_hfrosc __mee_dt_clock_3; + +/* From gpio@10012000 */ +asm (".weak __mee_dt_gpio_10012000"); +struct __mee_driver_sifive_gpio0 __mee_dt_gpio_10012000; + +/* From serial@10013000 */ +asm (".weak __mee_dt_serial_10013000"); +struct __mee_driver_sifive_uart0 __mee_dt_serial_10013000; + +/* From clock@0 */ +struct __mee_driver_fixed_clock __mee_dt_clock_0 = { + .vtable = &__mee_driver_vtable_fixed_clock, + .clock.vtable = &__mee_driver_vtable_fixed_clock.clock, + .rate = 16000000UL, +}; + +/* From clock@2 */ +struct __mee_driver_fixed_clock __mee_dt_clock_2 = { + .vtable = &__mee_driver_vtable_fixed_clock, + .clock.vtable = &__mee_driver_vtable_fixed_clock.clock, + .rate = 72000000UL, +}; + +/* From clock@5 */ +struct __mee_driver_fixed_clock __mee_dt_clock_5 = { + .vtable = &__mee_driver_vtable_fixed_clock, + .clock.vtable = &__mee_driver_vtable_fixed_clock.clock, + .rate = 32000000UL, +}; + +/* From clock@4 */ +struct __mee_driver_sifive_fe310_g000_pll __mee_dt_clock_4 = { + .vtable = &__mee_driver_vtable_sifive_fe310_g000_pll, + .clock.vtable = &__mee_driver_vtable_sifive_fe310_g000_pll.clock, +/* From clock@3 */ + .pllsel0 = &__mee_dt_clock_3.clock, +/* From clock@1 */ + .pllref = &__mee_dt_clock_1.clock, +/* From prci@10008000 */ + .divider_base = &__mee_dt_prci_10008000, + .divider_offset = 12UL, +/* From prci@10008000 */ + .config_base = &__mee_dt_prci_10008000, + .config_offset = 8UL, + .init_rate = 16000000UL, +}; + +/* From clock@4 */ +#define __MEE_DT_SIFIVE_FE310_G000_PLL_HANDLE (&__mee_dt_clock_4) +/* From prci@10008000 */ +struct __mee_driver_sifive_fe310_g000_prci __mee_dt_prci_10008000 = { + .vtable = &__mee_driver_vtable_sifive_fe310_g000_prci, + .base = 268468224UL, + .size = 32768UL, +}; + +/* From clock@1 */ +struct __mee_driver_sifive_fe310_g000_hfxosc __mee_dt_clock_1 = { + .vtable = &__mee_driver_vtable_sifive_fe310_g000_hfxosc, + .clock.vtable = &__mee_driver_vtable_sifive_fe310_g000_hfxosc.clock, +/* From clock@0 */ + .ref = &__mee_dt_clock_0.clock, +/* From prci@10008000 */ + .config_base = &__mee_dt_prci_10008000, + .config_offset = 4UL, +}; + +/* From clock@3 */ +struct __mee_driver_sifive_fe310_g000_hfrosc __mee_dt_clock_3 = { + .vtable = &__mee_driver_vtable_sifive_fe310_g000_hfrosc, + .clock.vtable = &__mee_driver_vtable_sifive_fe310_g000_hfrosc.clock, +/* From clock@2 */ + .ref = &__mee_dt_clock_2.clock, +/* From prci@10008000 */ + .config_base = &__mee_dt_prci_10008000, + .config_offset = 0UL, +}; + +/* From gpio@10012000 */ +struct __mee_driver_sifive_gpio0 __mee_dt_gpio_10012000 = { + .vtable = &__mee_driver_vtable_sifive_gpio0, + .base = 268509184UL, + .size = 4096UL, +}; + +/* From serial@10013000 */ +struct __mee_driver_sifive_uart0 __mee_dt_serial_10013000 = { + .vtable = &__mee_driver_vtable_sifive_uart0, + .uart.vtable = &__mee_driver_vtable_sifive_uart0.uart, + .control_base = 268513280UL, + .control_size = 4096UL, +/* From clock@4 */ + .clock = &__mee_dt_clock_4.clock, +/* From gpio@10012000 */ + .pinmux = &__mee_dt_gpio_10012000, + .pinmux_output_selector = 196608UL, + .pinmux_source_selector = 196608UL, +}; + +/* From serial@10013000 */ +#define __MEE_DT_STDOUT_UART_HANDLE (&__mee_dt_serial_10013000.uart) +#define __MEE_DT_STDOUT_UART_BAUD 115200 +#endif/*ASSEMBLY*/ diff --git a/bsp/sifive-hifive1/mee.lds b/bsp/sifive-hifive1/mee.lds new file mode 100644 index 0000000..cf24a7c --- /dev/null +++ b/bsp/sifive-hifive1/mee.lds @@ -0,0 +1,190 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ + ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x4000 + flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 0x20000000 +} + +PHDRS +{ + flash PT_LOAD; + ram_init PT_LOAD; + ram PT_NULL; +} + +SECTIONS +{ + __stack_size = DEFINED(__stack_size) ? __stack_size : 0x800; + + + .init : + { + KEEP (*(.text.mee.init.enter)) + KEEP (*(SORT_NONE(.init))) + } >flash AT>flash :flash + + + .text : + { + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >flash AT>flash :flash + + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >flash AT>flash :flash + + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + + .rodata : + { + *(.rdata) + *(.rodata .rodata.*) + *(.gnu.linkonce.r.*) + } >flash AT>flash :flash + + + . = ALIGN(4); + + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >flash AT>flash :flash + + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >flash AT>flash :flash + + + .finit_array : + { + PROVIDE_HIDDEN (__finit_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__finit_array_end = .); + } >flash AT>flash :flash + + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >flash AT>flash :flash + + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >flash AT>flash :flash + + + .lalign : + { + . = ALIGN(4); + PROVIDE( _data_lma = . ); + PROVIDE( mee_segment_data_source_start = . ); + } >flash AT>flash :flash + + + .dalign : + { + . = ALIGN(4); + PROVIDE( mee_segment_data_target_start = . ); + } >ram AT>flash :ram_init + + + .data : + { + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram AT>flash :ram_init + + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + PROVIDE( mee_segment_data_target_end = . ); + PROVIDE( _fbss = . ); + PROVIDE( __bss_start = . ); + PROVIDE( mee_segment_bss_target_start = . ); + + + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram AT>ram :ram + + + . = ALIGN(8); + PROVIDE( _end = . ); + PROVIDE( end = . ); + PROVIDE( mee_segment_bss_target_end = . ); + PROVIDE( mee_segment_heap_target_start = . ); + + + .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : + { + PROVIDE( mee_segment_heap_target_end = . ); + PROVIDE( _heap_end = . ); + . = __stack_size; + PROVIDE( _sp = . ); + PROVIDE(mee_segment_stack_end = .); + } >ram AT>ram :ram + + +} + diff --git a/bsp/sifive-hifive1/openocd.cfg b/bsp/sifive-hifive1/openocd.cfg new file mode 100644 index 0000000..b531e9c --- /dev/null +++ b/bsp/sifive-hifive1/openocd.cfg @@ -0,0 +1,34 @@ +adapter_khz 10000 + +interface ftdi +ftdi_device_desc "Dual RS232-HS" +ftdi_vid_pid 0x0403 0x6010 + +ftdi_layout_init 0x0008 0x001b +ftdi_layout_signal nSRST -oe 0x0020 -data 0x0020 + +#Reset Stretcher logic on FE310 is ~1 second long +#This doesn't apply if you use +# ftdi_set_signal, but still good to document +#adapter_nsrst_delay 1500 + +set _CHIPNAME riscv +jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 + +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME riscv -chain-position $_TARGETNAME +$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 + +flash bank onboard_spi_flash fespi 0x20000000 0 0 0 $_TARGETNAME +init +#reset -- This type of reset is not implemented yet +if {[ info exists pulse_srst]} { + ftdi_set_signal nSRST 0 + ftdi_set_signal nSRST z + #Wait for the reset stretcher + #It will work without this, but + #will incur lots of delays for later commands. + sleep 1500 +} +halt +#flash protect 0 64 last off diff --git a/bsp/sifive-hifive1/settings.mk b/bsp/sifive-hifive1/settings.mk new file mode 100644 index 0000000..b9424bc --- /dev/null +++ b/bsp/sifive-hifive1/settings.mk @@ -0,0 +1,2 @@ +RISCV_ARCH = rv32imac +RISCV_ABI = ilp32 -- cgit v1.2.3 From 6f82d0324a9b4cd2a049315ceea927b4ff5ac056 Mon Sep 17 00:00:00 2001 From: Nathaniel Graff Date: Thu, 13 Dec 2018 14:03:37 -0800 Subject: Add MEE BSP for Freedom E310 Arty Signed-off-by: Nathaniel Graff --- bsp/freedom-e310-arty/design.dts | 138 +++++++++++++++++++++++++++ bsp/freedom-e310-arty/mee.h | 48 ++++++++++ bsp/freedom-e310-arty/mee.lds | 190 ++++++++++++++++++++++++++++++++++++++ bsp/freedom-e310-arty/settings.mk | 4 + 4 files changed, 380 insertions(+) create mode 100644 bsp/freedom-e310-arty/design.dts create mode 100644 bsp/freedom-e310-arty/mee.h create mode 100644 bsp/freedom-e310-arty/mee.lds create mode 100644 bsp/freedom-e310-arty/settings.mk diff --git a/bsp/freedom-e310-arty/design.dts b/bsp/freedom-e310-arty/design.dts new file mode 100644 index 0000000..73f8fbb --- /dev/null +++ b/bsp/freedom-e310-arty/design.dts @@ -0,0 +1,138 @@ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + compatible = "sifive,freedom-e310-arty"; + model = "sifive,freedom-e310-arty"; + + chosen { + stdout-path = "/soc/serial@10013000:115200"; + mee,entry = <&sip0 0x400000>; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + compatible = "sifive,fe310-g000"; + L6: cpu@0 { + clocks = <&hfclk>; + compatible = "sifive,rocket0", "riscv"; + device_type = "cpu"; + i-cache-block-size = <64>; + i-cache-sets = <128>; + i-cache-size = <16384>; + next-level-cache = <&sip0>; + reg = <0>; + riscv,isa = "rv32imac"; + sifive,dtim = <&dtim>; + sifive,itim = <&itim>; + status = "okay"; + timebase-frequency = <1000000>; + hlic: interrupt-controller { + #interrupt-cells = <1>; + compatible = "riscv,cpu-intc"; + interrupt-controller; + }; + }; + }; + + soc { + #address-cells = <1>; + #size-cells = <1>; + #clock-cells = <1>; + compatible = "sifive,freedom-e310-arty"; + ranges; + + hfclk: clock@0 { + #clock-cells = <0>; + compatible = "fixed-clock"; + clock-frequency = <65000000>; + }; + + clint: clint@2000000 { + compatible = "riscv,clint0"; + interrupts-extended = <&hlic 3 &hlic 7>; + reg = <0x2000000 0x10000>; + reg-names = "control"; + }; + local-external-interrupts-0 { + compatible = "sifive,local-external-interrupts0"; + interrupt-parent = <&hlic>; + interrupts = <16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31>; + }; + plic: interrupt-controller@c000000 { + #interrupt-cells = <1>; + compatible = "riscv,plic0"; + interrupt-controller; + interrupts-extended = <&hlic 11>; + reg = <0xc000000 0x4000000>; + reg-names = "control"; + riscv,max-priority = <7>; + riscv,ndev = <26>; + }; + global-external-interrupts { + compatile = "sifive,global-external-interrupts0"; + interrupt-parent = <&plic>; + interrupts = <1 2 3 4>; + }; + + debug-controller@0 { + compatible = "sifive,debug-011", "riscv,debug-011"; + interrupts-extended = <&hlic 65535>; + reg = <0x0 0x100>; + reg-names = "control"; + }; + + maskrom@1000 { + reg = <0x1000 0x2000>; + reg-names = "mem"; + }; + otp@20000 { + reg = <0x20000 0x2000 0x10010000 0x1000>; + reg-names = "mem", "control"; + }; + + dtim: dtim@80000000 { + compatible = "sifive,dtim0"; + reg = <0x80000000 0x4000>; + reg-names = "mem"; + }; + itim: itim@8000000 { + compatible = "sifive,itim0"; + reg = <0x8000000 0x4000>; + reg-names = "mem"; + }; + + pwm@10015000 { + compatible = "sifive,pwm0"; + interrupt-parent = <&plic>; + interrupts = <23 24 25 26>; + reg = <0x10015000 0x1000>; + reg-names = "control"; + }; + gpio0: gpio@10012000 { + compatible = "sifive,gpio0"; + interrupt-parent = <&plic>; + interrupts = <7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22>; + reg = <0x10012000 0x1000>; + reg-names = "control"; + }; + uart0: serial@10013000 { + compatible = "sifive,uart0"; + interrupt-parent = <&plic>; + interrupts = <5>; + reg = <0x10013000 0x1000>; + reg-names = "control"; + clocks = <&hfclk>; + pinmux = <&gpio0 0x30000 0x30000>; + }; + sip0: spi@10014000 { + compatible = "sifive,spi0"; + interrupt-parent = <&plic>; + interrupts = <6>; + reg = <0x10014000 0x1000 0x20000000 0x20000000>; + reg-names = "control", "mem"; + }; + }; +}; diff --git a/bsp/freedom-e310-arty/mee.h b/bsp/freedom-e310-arty/mee.h new file mode 100644 index 0000000..79b81cc --- /dev/null +++ b/bsp/freedom-e310-arty/mee.h @@ -0,0 +1,48 @@ +#ifndef ASSEMBLY +#include +#include +#include +/* From clock@0 */ +asm (".weak __mee_dt_clock_0"); +struct __mee_driver_fixed_clock __mee_dt_clock_0; + +/* From gpio@10012000 */ +asm (".weak __mee_dt_gpio_10012000"); +struct __mee_driver_sifive_gpio0 __mee_dt_gpio_10012000; + +/* From serial@10013000 */ +asm (".weak __mee_dt_serial_10013000"); +struct __mee_driver_sifive_uart0 __mee_dt_serial_10013000; + +/* From clock@0 */ +struct __mee_driver_fixed_clock __mee_dt_clock_0 = { + .vtable = &__mee_driver_vtable_fixed_clock, + .clock.vtable = &__mee_driver_vtable_fixed_clock.clock, + .rate = 65000000UL, +}; + +/* From gpio@10012000 */ +struct __mee_driver_sifive_gpio0 __mee_dt_gpio_10012000 = { + .vtable = &__mee_driver_vtable_sifive_gpio0, + .base = 268509184UL, + .size = 4096UL, +}; + +/* From serial@10013000 */ +struct __mee_driver_sifive_uart0 __mee_dt_serial_10013000 = { + .vtable = &__mee_driver_vtable_sifive_uart0, + .uart.vtable = &__mee_driver_vtable_sifive_uart0.uart, + .control_base = 268513280UL, + .control_size = 4096UL, +/* From clock@0 */ + .clock = &__mee_dt_clock_0.clock, +/* From gpio@10012000 */ + .pinmux = &__mee_dt_gpio_10012000, + .pinmux_output_selector = 196608UL, + .pinmux_source_selector = 196608UL, +}; + +/* From serial@10013000 */ +#define __MEE_DT_STDOUT_UART_HANDLE (&__mee_dt_serial_10013000.uart) +#define __MEE_DT_STDOUT_UART_BAUD 115200 +#endif/*ASSEMBLY*/ diff --git a/bsp/freedom-e310-arty/mee.lds b/bsp/freedom-e310-arty/mee.lds new file mode 100644 index 0000000..cf24a7c --- /dev/null +++ b/bsp/freedom-e310-arty/mee.lds @@ -0,0 +1,190 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ + ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x4000 + flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 0x20000000 +} + +PHDRS +{ + flash PT_LOAD; + ram_init PT_LOAD; + ram PT_NULL; +} + +SECTIONS +{ + __stack_size = DEFINED(__stack_size) ? __stack_size : 0x800; + + + .init : + { + KEEP (*(.text.mee.init.enter)) + KEEP (*(SORT_NONE(.init))) + } >flash AT>flash :flash + + + .text : + { + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >flash AT>flash :flash + + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >flash AT>flash :flash + + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + + .rodata : + { + *(.rdata) + *(.rodata .rodata.*) + *(.gnu.linkonce.r.*) + } >flash AT>flash :flash + + + . = ALIGN(4); + + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >flash AT>flash :flash + + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >flash AT>flash :flash + + + .finit_array : + { + PROVIDE_HIDDEN (__finit_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__finit_array_end = .); + } >flash AT>flash :flash + + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >flash AT>flash :flash + + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >flash AT>flash :flash + + + .lalign : + { + . = ALIGN(4); + PROVIDE( _data_lma = . ); + PROVIDE( mee_segment_data_source_start = . ); + } >flash AT>flash :flash + + + .dalign : + { + . = ALIGN(4); + PROVIDE( mee_segment_data_target_start = . ); + } >ram AT>flash :ram_init + + + .data : + { + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram AT>flash :ram_init + + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + PROVIDE( mee_segment_data_target_end = . ); + PROVIDE( _fbss = . ); + PROVIDE( __bss_start = . ); + PROVIDE( mee_segment_bss_target_start = . ); + + + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram AT>ram :ram + + + . = ALIGN(8); + PROVIDE( _end = . ); + PROVIDE( end = . ); + PROVIDE( mee_segment_bss_target_end = . ); + PROVIDE( mee_segment_heap_target_start = . ); + + + .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : + { + PROVIDE( mee_segment_heap_target_end = . ); + PROVIDE( _heap_end = . ); + . = __stack_size; + PROVIDE( _sp = . ); + PROVIDE(mee_segment_stack_end = .); + } >ram AT>ram :ram + + +} + diff --git a/bsp/freedom-e310-arty/settings.mk b/bsp/freedom-e310-arty/settings.mk new file mode 100644 index 0000000..eacecc3 --- /dev/null +++ b/bsp/freedom-e310-arty/settings.mk @@ -0,0 +1,4 @@ +#write_config_file + +RISCV_ARCH=rv32imac +RISCV_ABI=ilp32 -- cgit v1.2.3 From 6f093407b960b296cf578fa446a4dd82aa674236 Mon Sep 17 00:00:00 2001 From: Nathaniel Graff Date: Thu, 13 Dec 2018 14:04:04 -0800 Subject: Add MEE BSP for E31 CoreIP Signed-off-by: Nathaniel Graff --- bsp/coreip-e31/design.dts | 105 +++++++++++++++++++++++++ bsp/coreip-e31/mee.h | 17 ++++ bsp/coreip-e31/mee.lds | 189 +++++++++++++++++++++++++++++++++++++++++++++ bsp/coreip-e31/settings.mk | 4 + 4 files changed, 315 insertions(+) create mode 100644 bsp/coreip-e31/design.dts create mode 100644 bsp/coreip-e31/mee.h create mode 100644 bsp/coreip-e31/mee.lds create mode 100644 bsp/coreip-e31/settings.mk diff --git a/bsp/coreip-e31/design.dts b/bsp/coreip-e31/design.dts new file mode 100644 index 0000000..3884085 --- /dev/null +++ b/bsp/coreip-e31/design.dts @@ -0,0 +1,105 @@ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + compatible = "SiFive,FE310G-dev", "fe310-dev", "sifive-dev"; + model = "SiFive,FE310G"; + L15: cpus { + #address-cells = <1>; + #size-cells = <0>; + L6: cpu@0 { + clock-frequency = <0>; + compatible = "sifive,rocket0", "riscv"; + device_type = "cpu"; + i-cache-block-size = <64>; + i-cache-sets = <128>; + i-cache-size = <16384>; + reg = <0>; + riscv,isa = "rv32imac"; + sifive,dtim = <&L5>; + sifive,itim = <&L4>; + status = "okay"; + timebase-frequency = <1000000>; + L3: interrupt-controller { + #interrupt-cells = <1>; + compatible = "riscv,cpu-intc"; + interrupt-controller; + }; + }; + }; + L14: soc { + #address-cells = <1>; + #size-cells = <1>; + compatible = "SiFive,FE310G-soc", "fe310-soc", "sifive-soc", "simple-bus"; + ranges; + L12: ahb-periph-port@20000000 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "simple-bus"; + ranges = <0x20000000 0x20000000 0x20000000>; + }; + L11: ahb-sys-port@40000000 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "simple-bus"; + ranges = <0x40000000 0x40000000 0x20000000>; + }; + L1: clint@2000000 { + compatible = "riscv,clint0"; + interrupts-extended = <&L3 3 &L3 7>; + reg = <0x2000000 0x10000>; + reg-names = "control"; + }; + L2: debug-controller@0 { + compatible = "sifive,debug-013", "riscv,debug-013"; + interrupts-extended = <&L3 65535>; + reg = <0x0 0x1000>; + reg-names = "control"; + }; + L5: dtim@80000000 { + compatible = "sifive,dtim0"; + reg = <0x80000000 0x10000>; + reg-names = "mem"; + }; + L8: error-device@3000 { + compatible = "sifive,error0"; + reg = <0x3000 0x1000>; + reg-names = "mem"; + }; + L9: global-external-interrupts { + interrupt-parent = <&L0>; + interrupts = <1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127>; + }; + L0: interrupt-controller@c000000 { + #interrupt-cells = <1>; + compatible = "riscv,plic0"; + interrupt-controller; + interrupts-extended = <&L3 11>; + reg = <0xc000000 0x4000000>; + reg-names = "control"; + riscv,max-priority = <7>; + riscv,ndev = <127>; + }; + L4: itim@8000000 { + compatible = "sifive,itim0"; + reg = <0x8000000 0x4000>; + reg-names = "mem"; + }; + L10: local-external-interrupts-0 { + interrupt-parent = <&L3>; + interrupts = <16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31>; + }; + L7: teststatus@4000 { + compatible = "sifive,test0"; + reg = <0x4000 0x1000>; + reg-names = "control"; + }; + test_memory: testram@20000000 { + compatible = "sifive,testram0"; + reg = <0x20000000 0x8000000>; + reg-names = "mem"; + word-size-bytes = <4>; + }; + }; +}; diff --git a/bsp/coreip-e31/mee.h b/bsp/coreip-e31/mee.h new file mode 100644 index 0000000..39520a3 --- /dev/null +++ b/bsp/coreip-e31/mee.h @@ -0,0 +1,17 @@ +#ifndef ASSEMBLY +#include +/* From teststatus@4000 */ +asm (".weak __mee_dt_teststatus_4000"); +struct __mee_driver_sifive_test0 __mee_dt_teststatus_4000; + +/* From teststatus@4000 */ +struct __mee_driver_sifive_test0 __mee_dt_teststatus_4000 = { + .vtable = &__mee_driver_vtable_sifive_test0, + .shutdown.vtable = &__mee_driver_vtable_sifive_test0.shutdown, + .base = 16384UL, + .size = 4096UL, +}; + +/* From teststatus@4000 */ +#define __MEE_DT_SHUTDOWN_HANDLE (&__mee_dt_teststatus_4000.shutdown) +#endif/*ASSEMBLY*/ diff --git a/bsp/coreip-e31/mee.lds b/bsp/coreip-e31/mee.lds new file mode 100644 index 0000000..c446555 --- /dev/null +++ b/bsp/coreip-e31/mee.lds @@ -0,0 +1,189 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ + ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 0x8000000 +} + +PHDRS +{ + flash PT_LOAD; + ram_init PT_LOAD; + ram PT_LOAD; +} + +SECTIONS +{ + __stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; + + + .init : + { + KEEP (*(.text.mee.init.enter)) + KEEP (*(SORT_NONE(.init))) + } >ram AT>ram :ram + + + .text : + { + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >ram AT>ram :ram + + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >ram AT>ram :ram + + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + + .rodata : + { + *(.rdata) + *(.rodata .rodata.*) + *(.gnu.linkonce.r.*) + } >ram AT>ram :ram + + + . = ALIGN(4); + + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >ram AT>ram :ram + + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >ram AT>ram :ram + + + .finit_array : + { + PROVIDE_HIDDEN (__finit_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__finit_array_end = .); + } >ram AT>ram :ram + + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >ram AT>ram :ram + + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >ram AT>ram :ram + + + .lalign : + { + . = ALIGN(4); + PROVIDE( _data_lma = . ); + PROVIDE( mee_segment_data_source_start = . ); + } >ram AT>ram :ram + + + .dalign : + { + . = ALIGN(4); + PROVIDE( mee_segment_data_target_start = . ); + } >ram AT>ram :ram_init + + + .data : + { + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram AT>ram :ram_init + + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + PROVIDE( mee_segment_data_target_end = . ); + PROVIDE( _fbss = . ); + PROVIDE( __bss_start = . ); + PROVIDE( mee_segment_bss_target_start = . ); + + + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram AT>ram :ram + + + . = ALIGN(8); + PROVIDE( _end = . ); + PROVIDE( end = . ); + PROVIDE( mee_segment_bss_target_end = . ); + PROVIDE( mee_segment_heap_target_start = . ); + + + .stack : + { + . = ALIGN(8); + . += __stack_size; + PROVIDE( _sp = . ); + PROVIDE( _heap_end = . ); + PROVIDE(mee_segment_stack_end = .); + } >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e31/settings.mk b/bsp/coreip-e31/settings.mk new file mode 100644 index 0000000..eacecc3 --- /dev/null +++ b/bsp/coreip-e31/settings.mk @@ -0,0 +1,4 @@ +#write_config_file + +RISCV_ARCH=rv32imac +RISCV_ABI=ilp32 -- cgit v1.2.3 From 6d4351c39214389ebf4ea170e9d067810af1f790 Mon Sep 17 00:00:00 2001 From: Nathaniel Graff Date: Thu, 13 Dec 2018 14:04:23 -0800 Subject: Add MEE BSP for E31 CoreIP Arty Signed-off-by: Nathaniel Graff --- bsp/coreip-e31-arty/design.dts | 122 ++++++++++++++++++++++++++ bsp/coreip-e31-arty/mee.h | 47 ++++++++++ bsp/coreip-e31-arty/mee.lds | 190 ++++++++++++++++++++++++++++++++++++++++ bsp/coreip-e31-arty/settings.mk | 4 + 4 files changed, 363 insertions(+) create mode 100644 bsp/coreip-e31-arty/design.dts create mode 100644 bsp/coreip-e31-arty/mee.h create mode 100644 bsp/coreip-e31-arty/mee.lds create mode 100644 bsp/coreip-e31-arty/settings.mk diff --git a/bsp/coreip-e31-arty/design.dts b/bsp/coreip-e31-arty/design.dts new file mode 100644 index 0000000..2e9eaff --- /dev/null +++ b/bsp/coreip-e31-arty/design.dts @@ -0,0 +1,122 @@ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + compatible = "SiFive,FE310G-dev", "fe310-dev", "sifive-dev"; + model = "SiFive,FE310G"; + + chosen { + stdout-path = "/soc/serial@20000000:115200"; + mee,entry = <&L12 0x400000>; + }; + + L17: cpus { + #address-cells = <1>; + #size-cells = <0>; + L6: cpu@0 { + clock-frequency = <0>; + compatible = "sifive,rocket0", "riscv"; + device_type = "cpu"; + i-cache-block-size = <64>; + i-cache-sets = <128>; + i-cache-size = <16384>; + next-level-cache = <&L12>; + reg = <0>; + riscv,isa = "rv32imac"; + sifive,dtim = <&L5>; + sifive,itim = <&L4>; + status = "okay"; + timebase-frequency = <1000000>; + L3: interrupt-controller { + #interrupt-cells = <1>; + compatible = "riscv,cpu-intc"; + interrupt-controller; + }; + }; + }; + L16: soc { + #address-cells = <1>; + #size-cells = <1>; + compatible = "SiFive,FE310G-soc", "fe310-soc", "sifive-soc", "simple-bus"; + ranges; + L1: clint@2000000 { + compatible = "riscv,clint0"; + interrupts-extended = <&L3 3 &L3 7>; + reg = <0x2000000 0x10000>; + reg-names = "control"; + }; + L2: debug-controller@0 { + compatible = "sifive,debug-013", "riscv,debug-013"; + interrupts-extended = <&L3 65535>; + reg = <0x0 0x1000>; + reg-names = "control"; + }; + L5: dtim@80000000 { + compatible = "sifive,dtim0"; + reg = <0x80000000 0x10000>; + reg-names = "mem"; + }; + L8: error-device@3000 { + compatible = "sifive,error0"; + reg = <0x3000 0x1000>; + reg-names = "mem"; + }; + L9: global-external-interrupts { + interrupt-parent = <&L0>; + interrupts = <1 2 3 4>; + }; + L13: gpio@20002000 { + compatible = "sifive,gpio0"; + interrupt-parent = <&L0>; + interrupts = <7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22>; + reg = <0x20002000 0x1000>; + reg-names = "control"; + }; + L0: interrupt-controller@c000000 { + #interrupt-cells = <1>; + compatible = "riscv,plic0"; + interrupt-controller; + interrupts-extended = <&L3 11>; + reg = <0xc000000 0x4000000>; + reg-names = "control"; + riscv,max-priority = <7>; + riscv,ndev = <26>; + }; + L4: itim@8000000 { + compatible = "sifive,itim0"; + reg = <0x8000000 0x4000>; + reg-names = "mem"; + }; + L10: local-external-interrupts-0 { + interrupt-parent = <&L3>; + interrupts = <16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31>; + }; + L14: pwm@20005000 { + compatible = "sifive,pwm0"; + interrupt-parent = <&L0>; + interrupts = <23 24 25 26>; + reg = <0x20005000 0x1000>; + reg-names = "control"; + }; + L11: serial@20000000 { + compatible = "sifive,uart0"; + interrupt-parent = <&L0>; + interrupts = <5>; + reg = <0x20000000 0x1000>; + reg-names = "control"; + }; + L12: spi@20004000 { + compatible = "sifive,spi0"; + interrupt-parent = <&L0>; + interrupts = <6>; + reg = <0x20004000 0x1000 0x40000000 0x20000000>; + reg-names = "control", "mem"; + }; + L7: teststatus@4000 { + compatible = "sifive,test0"; + reg = <0x4000 0x1000>; + reg-names = "control"; + }; + }; +}; diff --git a/bsp/coreip-e31-arty/mee.h b/bsp/coreip-e31-arty/mee.h new file mode 100644 index 0000000..fe68d1f --- /dev/null +++ b/bsp/coreip-e31-arty/mee.h @@ -0,0 +1,47 @@ +#ifndef ASSEMBLY +#include +#include +#include +/* From gpio@20002000 */ +asm (".weak __mee_dt_gpio_20002000"); +struct __mee_driver_sifive_gpio0 __mee_dt_gpio_20002000; + +/* From serial@20000000 */ +asm (".weak __mee_dt_serial_20000000"); +struct __mee_driver_sifive_uart0 __mee_dt_serial_20000000; + +/* From teststatus@4000 */ +asm (".weak __mee_dt_teststatus_4000"); +struct __mee_driver_sifive_test0 __mee_dt_teststatus_4000; + +/* From gpio@20002000 */ +struct __mee_driver_sifive_gpio0 __mee_dt_gpio_20002000 = { + .vtable = &__mee_driver_vtable_sifive_gpio0, + .base = 536879104UL, + .size = 4096UL, +}; + +/* From serial@20000000 */ +struct __mee_driver_sifive_uart0 __mee_dt_serial_20000000 = { + .vtable = &__mee_driver_vtable_sifive_uart0, + .uart.vtable = &__mee_driver_vtable_sifive_uart0.uart, + .control_base = 536870912UL, + .control_size = 4096UL, + .clock = NULL, + .pinmux = NULL, +}; + +/* From teststatus@4000 */ +struct __mee_driver_sifive_test0 __mee_dt_teststatus_4000 = { + .vtable = &__mee_driver_vtable_sifive_test0, + .shutdown.vtable = &__mee_driver_vtable_sifive_test0.shutdown, + .base = 16384UL, + .size = 4096UL, +}; + +/* From teststatus@4000 */ +#define __MEE_DT_SHUTDOWN_HANDLE (&__mee_dt_teststatus_4000.shutdown) +/* From serial@20000000 */ +#define __MEE_DT_STDOUT_UART_HANDLE (&__mee_dt_serial_20000000.uart) +#define __MEE_DT_STDOUT_UART_BAUD 115200 +#endif/*ASSEMBLY*/ diff --git a/bsp/coreip-e31-arty/mee.lds b/bsp/coreip-e31-arty/mee.lds new file mode 100644 index 0000000..d0434f8 --- /dev/null +++ b/bsp/coreip-e31-arty/mee.lds @@ -0,0 +1,190 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ + ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000 + flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x20000000 +} + +PHDRS +{ + flash PT_LOAD; + ram_init PT_LOAD; + ram PT_NULL; +} + +SECTIONS +{ + __stack_size = DEFINED(__stack_size) ? __stack_size : 0x800; + + + .init : + { + KEEP (*(.text.mee.init.enter)) + KEEP (*(SORT_NONE(.init))) + } >flash AT>flash :flash + + + .text : + { + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >flash AT>flash :flash + + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >flash AT>flash :flash + + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + + .rodata : + { + *(.rdata) + *(.rodata .rodata.*) + *(.gnu.linkonce.r.*) + } >flash AT>flash :flash + + + . = ALIGN(4); + + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >flash AT>flash :flash + + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >flash AT>flash :flash + + + .finit_array : + { + PROVIDE_HIDDEN (__finit_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__finit_array_end = .); + } >flash AT>flash :flash + + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >flash AT>flash :flash + + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >flash AT>flash :flash + + + .lalign : + { + . = ALIGN(4); + PROVIDE( _data_lma = . ); + PROVIDE( mee_segment_data_source_start = . ); + } >flash AT>flash :flash + + + .dalign : + { + . = ALIGN(4); + PROVIDE( mee_segment_data_target_start = . ); + } >ram AT>flash :ram_init + + + .data : + { + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram AT>flash :ram_init + + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + PROVIDE( mee_segment_data_target_end = . ); + PROVIDE( _fbss = . ); + PROVIDE( __bss_start = . ); + PROVIDE( mee_segment_bss_target_start = . ); + + + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram AT>ram :ram + + + . = ALIGN(8); + PROVIDE( _end = . ); + PROVIDE( end = . ); + PROVIDE( mee_segment_bss_target_end = . ); + PROVIDE( mee_segment_heap_target_start = . ); + + + .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : + { + PROVIDE( mee_segment_heap_target_end = . ); + PROVIDE( _heap_end = . ); + . = __stack_size; + PROVIDE( _sp = . ); + PROVIDE(mee_segment_stack_end = .); + } >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e31-arty/settings.mk b/bsp/coreip-e31-arty/settings.mk new file mode 100644 index 0000000..eacecc3 --- /dev/null +++ b/bsp/coreip-e31-arty/settings.mk @@ -0,0 +1,4 @@ +#write_config_file + +RISCV_ARCH=rv32imac +RISCV_ABI=ilp32 -- cgit v1.2.3 From 826efe6185c0be81b66731a45879ea03f5fde6e7 Mon Sep 17 00:00:00 2001 From: Nathaniel Graff Date: Thu, 13 Dec 2018 14:04:43 -0800 Subject: Add MEE BSP for S51 CoreIP Signed-off-by: Nathaniel Graff --- bsp/coreip-s51/design.dts | 105 +++++++++++++++++++++++++ bsp/coreip-s51/mee.h | 17 ++++ bsp/coreip-s51/mee.lds | 189 +++++++++++++++++++++++++++++++++++++++++++++ bsp/coreip-s51/settings.mk | 4 + 4 files changed, 315 insertions(+) create mode 100644 bsp/coreip-s51/design.dts create mode 100644 bsp/coreip-s51/mee.h create mode 100644 bsp/coreip-s51/mee.lds create mode 100644 bsp/coreip-s51/settings.mk diff --git a/bsp/coreip-s51/design.dts b/bsp/coreip-s51/design.dts new file mode 100644 index 0000000..ebfd42a --- /dev/null +++ b/bsp/coreip-s51/design.dts @@ -0,0 +1,105 @@ +/dts-v1/; + +/ { + #address-cells = <2>; + #size-cells = <2>; + compatible = "SiFive,FE510G-dev", "fe510-dev", "sifive-dev"; + model = "SiFive,FE510G"; + L15: cpus { + #address-cells = <1>; + #size-cells = <0>; + L6: cpu@0 { + clock-frequency = <0>; + compatible = "sifive,rocket0", "riscv"; + device_type = "cpu"; + i-cache-block-size = <64>; + i-cache-sets = <128>; + i-cache-size = <16384>; + reg = <0>; + riscv,isa = "rv64imac"; + sifive,dtim = <&L5>; + sifive,itim = <&L4>; + status = "okay"; + timebase-frequency = <1000000>; + L3: interrupt-controller { + #interrupt-cells = <1>; + compatible = "riscv,cpu-intc"; + interrupt-controller; + }; + }; + }; + L14: soc { + #address-cells = <2>; + #size-cells = <2>; + compatible = "SiFive,FE510G-soc", "fe510-soc", "sifive-soc", "simple-bus"; + ranges; + L12: axi4-periph-port@20000000 { + #address-cells = <2>; + #size-cells = <2>; + compatible = "simple-bus"; + ranges = <0x0 0x20000000 0x0 0x20000000 0x0 0x20000000 0x1 0x0 0x1 0x0 0xf 0x0>; + }; + L11: axi4-sys-port@40000000 { + #address-cells = <2>; + #size-cells = <2>; + compatible = "simple-bus"; + ranges = <0x0 0x40000000 0x0 0x40000000 0x0 0x20000000 0x10 0x0 0x10 0x0 0xf0 0x0>; + }; + L1: clint@2000000 { + compatible = "riscv,clint0"; + interrupts-extended = <&L3 3 &L3 7>; + reg = <0x0 0x2000000 0x0 0x10000>; + reg-names = "control"; + }; + L2: debug-controller@0 { + compatible = "sifive,debug-013", "riscv,debug-013"; + interrupts-extended = <&L3 65535>; + reg = <0x0 0x0 0x0 0x1000>; + reg-names = "control"; + }; + L5: dtim@80000000 { + compatible = "sifive,dtim0"; + reg = <0x0 0x80000000 0x0 0x10000>; + reg-names = "mem"; + }; + L8: error-device@3000 { + compatible = "sifive,error0"; + reg = <0x0 0x3000 0x0 0x1000>; + reg-names = "mem"; + }; + L9: global-external-interrupts { + interrupt-parent = <&L0>; + interrupts = <1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255>; + }; + L0: interrupt-controller@c000000 { + #interrupt-cells = <1>; + compatible = "riscv,plic0"; + interrupt-controller; + interrupts-extended = <&L3 11>; + reg = <0x0 0xc000000 0x0 0x4000000>; + reg-names = "control"; + riscv,max-priority = <7>; + riscv,ndev = <255>; + }; + L4: itim@8000000 { + compatible = "sifive,itim0"; + reg = <0x0 0x8000000 0x0 0x4000>; + reg-names = "mem"; + }; + L10: local-external-interrupts-0 { + interrupt-parent = <&L3>; + interrupts = <16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31>; + }; + L7: teststatus@4000 { + compatible = "sifive,test0"; + reg = <0x0 0x4000 0x0 0x1000>; + reg-names = "control"; + }; + test_memory: testram@20000000 { + compatible = "sifive,testram0"; + reg = <0x0 0x20000000 0x0 0x4000000>; + reg-names = "mem"; + word-size-bytes = <8>; + }; + }; +}; diff --git a/bsp/coreip-s51/mee.h b/bsp/coreip-s51/mee.h new file mode 100644 index 0000000..39520a3 --- /dev/null +++ b/bsp/coreip-s51/mee.h @@ -0,0 +1,17 @@ +#ifndef ASSEMBLY +#include +/* From teststatus@4000 */ +asm (".weak __mee_dt_teststatus_4000"); +struct __mee_driver_sifive_test0 __mee_dt_teststatus_4000; + +/* From teststatus@4000 */ +struct __mee_driver_sifive_test0 __mee_dt_teststatus_4000 = { + .vtable = &__mee_driver_vtable_sifive_test0, + .shutdown.vtable = &__mee_driver_vtable_sifive_test0.shutdown, + .base = 16384UL, + .size = 4096UL, +}; + +/* From teststatus@4000 */ +#define __MEE_DT_SHUTDOWN_HANDLE (&__mee_dt_teststatus_4000.shutdown) +#endif/*ASSEMBLY*/ diff --git a/bsp/coreip-s51/mee.lds b/bsp/coreip-s51/mee.lds new file mode 100644 index 0000000..9f73234 --- /dev/null +++ b/bsp/coreip-s51/mee.lds @@ -0,0 +1,189 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ + ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 0x4000000 +} + +PHDRS +{ + flash PT_LOAD; + ram_init PT_LOAD; + ram PT_LOAD; +} + +SECTIONS +{ + __stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; + + + .init : + { + KEEP (*(.text.mee.init.enter)) + KEEP (*(SORT_NONE(.init))) + } >ram AT>ram :ram + + + .text : + { + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >ram AT>ram :ram + + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >ram AT>ram :ram + + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + + .rodata : + { + *(.rdata) + *(.rodata .rodata.*) + *(.gnu.linkonce.r.*) + } >ram AT>ram :ram + + + . = ALIGN(4); + + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >ram AT>ram :ram + + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >ram AT>ram :ram + + + .finit_array : + { + PROVIDE_HIDDEN (__finit_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__finit_array_end = .); + } >ram AT>ram :ram + + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >ram AT>ram :ram + + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >ram AT>ram :ram + + + .lalign : + { + . = ALIGN(4); + PROVIDE( _data_lma = . ); + PROVIDE( mee_segment_data_source_start = . ); + } >ram AT>ram :ram + + + .dalign : + { + . = ALIGN(4); + PROVIDE( mee_segment_data_target_start = . ); + } >ram AT>ram :ram_init + + + .data : + { + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram AT>ram :ram_init + + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + PROVIDE( mee_segment_data_target_end = . ); + PROVIDE( _fbss = . ); + PROVIDE( __bss_start = . ); + PROVIDE( mee_segment_bss_target_start = . ); + + + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram AT>ram :ram + + + . = ALIGN(8); + PROVIDE( _end = . ); + PROVIDE( end = . ); + PROVIDE( mee_segment_bss_target_end = . ); + PROVIDE( mee_segment_heap_target_start = . ); + + + .stack : + { + . = ALIGN(8); + . += __stack_size; + PROVIDE( _sp = . ); + PROVIDE( _heap_end = . ); + PROVIDE(mee_segment_stack_end = .); + } >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s51/settings.mk b/bsp/coreip-s51/settings.mk new file mode 100644 index 0000000..31aca11 --- /dev/null +++ b/bsp/coreip-s51/settings.mk @@ -0,0 +1,4 @@ +#write_config_file + +RISCV_ARCH=rv64imac +RISCV_ABI=lp64 -- cgit v1.2.3 From 853e244604682b57e88535671b9c66cfbd3e8f3f Mon Sep 17 00:00:00 2001 From: Nathaniel Graff Date: Thu, 13 Dec 2018 14:05:04 -0800 Subject: Add MEE BSP for S51 CoreIP Arty Signed-off-by: Nathaniel Graff --- bsp/coreip-s51-arty/design.dts | 122 ++++++++++++++++++++++++++ bsp/coreip-s51-arty/mee.h | 47 ++++++++++ bsp/coreip-s51-arty/mee.lds | 190 ++++++++++++++++++++++++++++++++++++++++ bsp/coreip-s51-arty/settings.mk | 4 + 4 files changed, 363 insertions(+) create mode 100644 bsp/coreip-s51-arty/design.dts create mode 100644 bsp/coreip-s51-arty/mee.h create mode 100644 bsp/coreip-s51-arty/mee.lds create mode 100644 bsp/coreip-s51-arty/settings.mk diff --git a/bsp/coreip-s51-arty/design.dts b/bsp/coreip-s51-arty/design.dts new file mode 100644 index 0000000..23362f2 --- /dev/null +++ b/bsp/coreip-s51-arty/design.dts @@ -0,0 +1,122 @@ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + compatible = "SiFive,FE510G-dev", "fe510-dev", "sifive-dev"; + model = "SiFive,FE510G"; + + chosen { + stdout-path = "/soc/serial@20000000:115200"; + mee,entry = <&L12 0x400000>; + }; + + L17: cpus { + #address-cells = <1>; + #size-cells = <0>; + L6: cpu@0 { + clock-frequency = <0>; + compatible = "sifive,rocket0", "riscv"; + device_type = "cpu"; + i-cache-block-size = <64>; + i-cache-sets = <128>; + i-cache-size = <16384>; + next-level-cache = <&L12>; + reg = <0>; + riscv,isa = "rv64imac"; + sifive,dtim = <&L5>; + sifive,itim = <&L4>; + status = "okay"; + timebase-frequency = <1000000>; + L3: interrupt-controller { + #interrupt-cells = <1>; + compatible = "riscv,cpu-intc"; + interrupt-controller; + }; + }; + }; + L16: soc { + #address-cells = <1>; + #size-cells = <1>; + compatible = "SiFive,FE510G-soc", "fe510-soc", "sifive-soc", "simple-bus"; + ranges; + L1: clint@2000000 { + compatible = "riscv,clint0"; + interrupts-extended = <&L3 3 &L3 7>; + reg = <0x2000000 0x10000>; + reg-names = "control"; + }; + L2: debug-controller@0 { + compatible = "sifive,debug-013", "riscv,debug-013"; + interrupts-extended = <&L3 65535>; + reg = <0x0 0x1000>; + reg-names = "control"; + }; + L5: dtim@80000000 { + compatible = "sifive,dtim0"; + reg = <0x80000000 0x10000>; + reg-names = "mem"; + }; + L8: error-device@3000 { + compatible = "sifive,error0"; + reg = <0x3000 0x1000>; + reg-names = "mem"; + }; + L9: global-external-interrupts { + interrupt-parent = <&L0>; + interrupts = <1 2 3 4>; + }; + L13: gpio@20002000 { + compatible = "sifive,gpio0"; + interrupt-parent = <&L0>; + interrupts = <7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22>; + reg = <0x20002000 0x1000>; + reg-names = "control"; + }; + L0: interrupt-controller@c000000 { + #interrupt-cells = <1>; + compatible = "riscv,plic0"; + interrupt-controller; + interrupts-extended = <&L3 11>; + reg = <0xc000000 0x4000000>; + reg-names = "control"; + riscv,max-priority = <7>; + riscv,ndev = <26>; + }; + L4: itim@8000000 { + compatible = "sifive,itim0"; + reg = <0x8000000 0x4000>; + reg-names = "mem"; + }; + L10: local-external-interrupts-0 { + interrupt-parent = <&L3>; + interrupts = <16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31>; + }; + L14: pwm@20005000 { + compatible = "sifive,pwm0"; + interrupt-parent = <&L0>; + interrupts = <23 24 25 26>; + reg = <0x20005000 0x1000>; + reg-names = "control"; + }; + L11: serial@20000000 { + compatible = "sifive,uart0"; + interrupt-parent = <&L0>; + interrupts = <5>; + reg = <0x20000000 0x1000>; + reg-names = "control"; + }; + L12: spi@20004000 { + compatible = "sifive,spi0"; + interrupt-parent = <&L0>; + interrupts = <6>; + reg = <0x20004000 0x1000 0x40000000 0x20000000>; + reg-names = "control", "mem"; + }; + L7: teststatus@4000 { + compatible = "sifive,test0"; + reg = <0x4000 0x1000>; + reg-names = "control"; + }; + }; +}; diff --git a/bsp/coreip-s51-arty/mee.h b/bsp/coreip-s51-arty/mee.h new file mode 100644 index 0000000..fe68d1f --- /dev/null +++ b/bsp/coreip-s51-arty/mee.h @@ -0,0 +1,47 @@ +#ifndef ASSEMBLY +#include +#include +#include +/* From gpio@20002000 */ +asm (".weak __mee_dt_gpio_20002000"); +struct __mee_driver_sifive_gpio0 __mee_dt_gpio_20002000; + +/* From serial@20000000 */ +asm (".weak __mee_dt_serial_20000000"); +struct __mee_driver_sifive_uart0 __mee_dt_serial_20000000; + +/* From teststatus@4000 */ +asm (".weak __mee_dt_teststatus_4000"); +struct __mee_driver_sifive_test0 __mee_dt_teststatus_4000; + +/* From gpio@20002000 */ +struct __mee_driver_sifive_gpio0 __mee_dt_gpio_20002000 = { + .vtable = &__mee_driver_vtable_sifive_gpio0, + .base = 536879104UL, + .size = 4096UL, +}; + +/* From serial@20000000 */ +struct __mee_driver_sifive_uart0 __mee_dt_serial_20000000 = { + .vtable = &__mee_driver_vtable_sifive_uart0, + .uart.vtable = &__mee_driver_vtable_sifive_uart0.uart, + .control_base = 536870912UL, + .control_size = 4096UL, + .clock = NULL, + .pinmux = NULL, +}; + +/* From teststatus@4000 */ +struct __mee_driver_sifive_test0 __mee_dt_teststatus_4000 = { + .vtable = &__mee_driver_vtable_sifive_test0, + .shutdown.vtable = &__mee_driver_vtable_sifive_test0.shutdown, + .base = 16384UL, + .size = 4096UL, +}; + +/* From teststatus@4000 */ +#define __MEE_DT_SHUTDOWN_HANDLE (&__mee_dt_teststatus_4000.shutdown) +/* From serial@20000000 */ +#define __MEE_DT_STDOUT_UART_HANDLE (&__mee_dt_serial_20000000.uart) +#define __MEE_DT_STDOUT_UART_BAUD 115200 +#endif/*ASSEMBLY*/ diff --git a/bsp/coreip-s51-arty/mee.lds b/bsp/coreip-s51-arty/mee.lds new file mode 100644 index 0000000..d0434f8 --- /dev/null +++ b/bsp/coreip-s51-arty/mee.lds @@ -0,0 +1,190 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ + ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000 + flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x20000000 +} + +PHDRS +{ + flash PT_LOAD; + ram_init PT_LOAD; + ram PT_NULL; +} + +SECTIONS +{ + __stack_size = DEFINED(__stack_size) ? __stack_size : 0x800; + + + .init : + { + KEEP (*(.text.mee.init.enter)) + KEEP (*(SORT_NONE(.init))) + } >flash AT>flash :flash + + + .text : + { + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >flash AT>flash :flash + + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >flash AT>flash :flash + + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + + .rodata : + { + *(.rdata) + *(.rodata .rodata.*) + *(.gnu.linkonce.r.*) + } >flash AT>flash :flash + + + . = ALIGN(4); + + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >flash AT>flash :flash + + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >flash AT>flash :flash + + + .finit_array : + { + PROVIDE_HIDDEN (__finit_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__finit_array_end = .); + } >flash AT>flash :flash + + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >flash AT>flash :flash + + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >flash AT>flash :flash + + + .lalign : + { + . = ALIGN(4); + PROVIDE( _data_lma = . ); + PROVIDE( mee_segment_data_source_start = . ); + } >flash AT>flash :flash + + + .dalign : + { + . = ALIGN(4); + PROVIDE( mee_segment_data_target_start = . ); + } >ram AT>flash :ram_init + + + .data : + { + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram AT>flash :ram_init + + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + PROVIDE( mee_segment_data_target_end = . ); + PROVIDE( _fbss = . ); + PROVIDE( __bss_start = . ); + PROVIDE( mee_segment_bss_target_start = . ); + + + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram AT>ram :ram + + + . = ALIGN(8); + PROVIDE( _end = . ); + PROVIDE( end = . ); + PROVIDE( mee_segment_bss_target_end = . ); + PROVIDE( mee_segment_heap_target_start = . ); + + + .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : + { + PROVIDE( mee_segment_heap_target_end = . ); + PROVIDE( _heap_end = . ); + . = __stack_size; + PROVIDE( _sp = . ); + PROVIDE(mee_segment_stack_end = .); + } >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s51-arty/settings.mk b/bsp/coreip-s51-arty/settings.mk new file mode 100644 index 0000000..31aca11 --- /dev/null +++ b/bsp/coreip-s51-arty/settings.mk @@ -0,0 +1,4 @@ +#write_config_file + +RISCV_ARCH=rv64imac +RISCV_ABI=lp64 -- cgit v1.2.3