Added support for Sifive Freedom FE310 soc on Arty A7 FPGA board. Update #3785.
Signed-off-by: Pragnesh Patel <pragnesh.pa...@sifive.com> --- Changes in v5: - Added BSD-2-Clause LICENSE for the new code Changes in v4: - Revert fdt32_t *val to const in riscv_clock_get_timebase_frequency() - make RISCV_ENABLE_FRDME310ARTY_SUPPORT consistent all over the code - Revert to the default configuration for riscv/configure.ac - Added riscv/config/frdme310arty.cfg as a new riscv config Changes in v3: - Remove bsps/riscv/frdme310arty/ directory and added support for Freedom FE310 soc in common bsps/riscv/riscv/ directory - Added #define RISCV_ENABLE_FRDME310ARTY_SUPPORT in configure.ac to enable support for FE310 - Change the RISCV_RAM_REGION_SIZE to 256 MB for riscv Changes in v2: bsps/riscv/frdme310arty/btimer/btimer.c - Remove the read_csr() function from btimer.c - Remove CONFIG_BTIMER_RISCV_GET_MCYCLES macro to get time in microseconds bsps/riscv/frdme310arty/clock/clockdrv.c bsps/riscv/riscv/clock/clockdrv.c - Delete both files and Add bsps/riscv/shared/clock/clockdrv.c - riscv_clock_get_timebase_frequency(): Get timebase-frequency from cpus or cpu@0 devicetree node because riscv uses "cpus" node and frdme310arty uses "cpu@0" node to look for timebase-frequency - Remove rtems_counter_initialize_converter() and rtems_timecounter_simple_install() functions bsps/riscv/frdme310arty/include/bsp/riscv.h - Remove unused frdme310arty_l2c_base; bsps/riscv/frdme310arty/start/bsp_fatal_halt.c bsps/riscv/riscv/start/bsp_fatal_halt.c - Delete this file and Add bsps/riscv/shared/start/bsp_fatal_halt.c bsps/riscv/frdme310arty/start/bspstart.c - Remove unused function riscv_get_node_byname() bsps/riscv/frdme310arty/start/linkcmds.in - Use @RISCV_RAM_REGION_BEGIN@ and @RISCV_RAM_REGION_SIZE@ instead of hard coded values c/src/lib/libbsp/riscv/frdme310arty/Makefile.am - librtemsbsp_a_SOURCES -> bsps/riscv/shared/start/bsp_fatal_halt.c - librtemsbsp_a_SOURCES -> bsps/riscv/shared/clock/clockdrv.c c/src/lib/libbsp/riscv/frdme310arty/configure.ac - change RISCV_RAM_REGION_SIZE to default 256MiB bsps/riscv/riscv/irq/irq.c - Delete this irq.c and it will now use bsps/riscv/shared/irq/irq.c c/src/lib/libbsp/riscv/riscv/Makefile.am - librtemsbsp_a_SOURCES -> bsps/riscv/shared/start/bsp_fatal_halt.c - librtemsbsp_a_SOURCES -> bsps/riscv/shared/clock/clockdrv.c - librtemsbsp_a_SOURCES -> bsps/riscv/shared/irq/irq.c bsps/include/bsp/fatal.h | 3 +- bsps/riscv/riscv/clock/clockdrv.c | 16 ++- bsps/riscv/riscv/config/frdme310arty.cfg | 9 ++ bsps/riscv/riscv/console/console-config.c | 57 ++++++++++ bsps/riscv/riscv/console/fe310-uart.c | 118 ++++++++++++++++++++ bsps/riscv/riscv/dts/frdme310arty.dts | 130 ++++++++++++++++++++++ bsps/riscv/riscv/include/bsp/fe310-uart.h | 61 ++++++++++ bsps/riscv/riscv/include/bsp/riscv.h | 4 + bsps/riscv/riscv/start/bspstart.c | 52 +++++++++ c/src/lib/libbsp/riscv/riscv/Makefile.am | 8 ++ c/src/lib/libbsp/riscv/riscv/configure.ac | 16 ++- 11 files changed, 467 insertions(+), 7 deletions(-) create mode 100644 bsps/riscv/riscv/config/frdme310arty.cfg create mode 100644 bsps/riscv/riscv/console/fe310-uart.c create mode 100644 bsps/riscv/riscv/dts/frdme310arty.dts create mode 100644 bsps/riscv/riscv/include/bsp/fe310-uart.h diff --git a/bsps/include/bsp/fatal.h b/bsps/include/bsp/fatal.h index fae5461699..3f8e1eb591 100644 --- a/bsps/include/bsp/fatal.h +++ b/bsps/include/bsp/fatal.h @@ -152,7 +152,8 @@ typedef enum { RISCV_FATAL_INVALID_PLIC_NDEV_IN_DEVICE_TREE, RISCV_FATAL_TOO_LARGE_PLIC_NDEV_IN_DEVICE_TREE, RISCV_FATAL_INVALID_INTERRUPT_AFFINITY, - RISCV_FATAL_NO_NS16550_INTERRUPTS_IN_DEVICE_TREE + RISCV_FATAL_NO_NS16550_INTERRUPTS_IN_DEVICE_TREE, + RISCV_FATAL_NO_TLCLOCK_FREQUENCY_IN_DEVICE_TREE } bsp_fatal_code; RTEMS_NO_RETURN static inline void diff --git a/bsps/riscv/riscv/clock/clockdrv.c b/bsps/riscv/riscv/clock/clockdrv.c index 7e6034d4d1..d085b6bd95 100644 --- a/bsps/riscv/riscv/clock/clockdrv.c +++ b/bsps/riscv/riscv/clock/clockdrv.c @@ -130,15 +130,21 @@ static uint32_t riscv_clock_get_timecount(struct timecounter *base) static uint32_t riscv_clock_get_timebase_frequency(const void *fdt) { int node; - const uint32_t *val; - int len; + const fdt32_t *val; + int len=0; node = fdt_path_offset(fdt, "/cpus"); - val = fdt_getprop(fdt, node, "timebase-frequency", &len); + + val = (fdt32_t *) fdt_getprop(fdt, node, "timebase-frequency", &len); + if (val == NULL || len < 4) { - bsp_fatal(RISCV_FATAL_NO_TIMEBASE_FREQUENCY_IN_DEVICE_TREE); - } + int cpu0 = fdt_subnode_offset(fdt, node, "cpu@0"); + val = (fdt32_t *) fdt_getprop(fdt, cpu0, "timebase-frequency", &len); + if (val == NULL || len < 4) { + bsp_fatal(RISCV_FATAL_NO_TIMEBASE_FREQUENCY_IN_DEVICE_TREE); + } + } return fdt32_to_cpu(*val); } diff --git a/bsps/riscv/riscv/config/frdme310arty.cfg b/bsps/riscv/riscv/config/frdme310arty.cfg new file mode 100644 index 0000000000..e19e431b53 --- /dev/null +++ b/bsps/riscv/riscv/config/frdme310arty.cfg @@ -0,0 +1,9 @@ +include $(RTEMS_ROOT)/make/custom/default.cfg + +RTEMS_CPU = riscv + +CPU_CFLAGS = -march=rv32imac -mabi=ilp32 + +LDFLAGS = -Wl,--gc-sections + +CFLAGS_OPTIMIZE_V ?= -O2 -g -ffunction-sections -fdata-sections diff --git a/bsps/riscv/riscv/console/console-config.c b/bsps/riscv/riscv/console/console-config.c index 464b4b0e26..3cd1d89e08 100644 --- a/bsps/riscv/riscv/console/console-config.c +++ b/bsps/riscv/riscv/console/console-config.c @@ -28,6 +28,11 @@ #include <libfdt.h> #include <string.h> +#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0 +#include <bsp/fe310-uart.h> +fe310_uart_context driver_context; +#endif + #if RISCV_ENABLE_HTIF_SUPPORT != 0 static htif_console_context htif_console_instance; #endif @@ -59,7 +64,18 @@ static int riscv_get_console_node(const void *fdt) stdout_path = ""; } +#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0 + int root; + int soc; + root = fdt_path_offset(fdt, "/"); + soc = fdt_subnode_offset(fdt, root, "soc"); + + int offset=fdt_subnode_offset(fdt, soc,stdout_path); + + return offset; +#else return fdt_path_offset(fdt, stdout_path); +#endif } #if RISCV_CONSOLE_MAX_NS16550_DEVICES > 0 @@ -193,6 +209,27 @@ static void riscv_console_probe(void) } #endif +#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0 + if (RISCV_CONSOLE_IS_COMPATIBLE(compat, compat_len, "sifive,uart0")) { + fe310_uart_context *ctx ; + + ctx=&driver_context; + ctx->regs = (uintptr_t) riscv_fdt_get_address(fdt, node); + if (ctx->regs == 0) + { + bsp_fatal(RISCV_FATAL_NO_NS16550_REG_IN_DEVICE_TREE); + } + + if (node == console_node) { + riscv_console.context = &ctx->base; + riscv_console.putchar = fe310_console_putchar; + riscv_console.getchar = fe310_uart_read; + } + + rtems_termios_device_context_initialize(&ctx->base, "FE310UART"); + } +#endif + node = fdt_next_node(fdt, node, NULL); } @@ -224,6 +261,10 @@ rtems_status_code console_initialize( size_t i; #endif +#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0 + char path[] = "/dev/ttyS0"; +#endif + rtems_termios_initialize(); #if RISCV_ENABLE_HTIF_SUPPORT != 0 @@ -255,6 +296,22 @@ rtems_status_code console_initialize( } #endif +#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0 + fe310_uart_context * ctx = &driver_context; + + rtems_termios_device_install( + path, + &fe310_uart_handler, + NULL, + &ctx->base + ); + + if (&ctx->base == riscv_console.context) { + link(path, CONSOLE_DEVICE_NAME); + } + +#endif + return RTEMS_SUCCESSFUL; } diff --git a/bsps/riscv/riscv/console/fe310-uart.c b/bsps/riscv/riscv/console/fe310-uart.c new file mode 100644 index 0000000000..a8e87f452c --- /dev/null +++ b/bsps/riscv/riscv/console/fe310-uart.c @@ -0,0 +1,118 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2019 Pragnesh Patel <pragnesh.pa...@sifive.com> + * Copyright (c) 2019 Sachin Ghadi <sachin.gh...@sifive.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <bsp/riscv.h> +#include <bsp/fe310-uart.h> + +#include <assert.h> + +static void irq_handler(void *arg) +{ + /*TODO*/ +} + +int fe310_uart_read(rtems_termios_device_context *base) +{ + fe310_uart_context * ctx = (fe310_uart_context*) base; + size_t i; + + if (((ctx->regs->rxdata) & TXRXREADY) != 0) { + return -1; + } else { + return ctx->regs->rxdata; + } +} + +static ssize_t fe310_uart_write ( + rtems_termios_device_context *base, + const char *buf, + size_t n +) +{ + fe310_uart_context * ctx = (fe310_uart_context*) base; + size_t i; + + rtems_status_code sc; + + (ctx->regs)->div = riscv_get_core_frequency()/ 115200 - 1; + (ctx->regs)->txctrl |= 1; + (ctx->regs)->rxctrl |= 1; + + for (i = 0; i < n; ++i) { + while (((ctx->regs->txdata) & TXRXREADY) != 0) { + ; + } + ctx->regs->txdata = buf[i]; + } + return n; +} + +void fe310_console_putchar(rtems_termios_device_context * context,char c) +{ + fe310_uart_write ( context, &c,1); +} + +void console_context_init( + rtems_termios_device_context *base, + int device_tree_node +) +{ + /*TODO*/ +} + +static bool fe310_uart_first_open ( + rtems_termios_tty *tty, + rtems_termios_device_context *base, + struct termios *term, + rtems_libio_open_close_args_t *args +) +{ + fe310_uart_context * ctx; + rtems_status_code sc; + + /* Configure GPIO to be UART */ + + sc = rtems_termios_set_initial_baud (tty, B115200); + if ( sc != RTEMS_SUCCESSFUL ) { + return false; + } + + /* Set up a baud rate and enable tx and rx */ + ctx = (fe310_uart_context *) base; + (ctx->regs)->div = riscv_get_core_frequency()/ 115200 - 1; + (ctx->regs)->txctrl |= 1; + (ctx->regs)->rxctrl |= 1; + return true; +}; + +const rtems_termios_device_handler fe310_uart_handler = { + .first_open = fe310_uart_first_open, + .write = fe310_uart_write, + .poll_read = fe310_uart_read, + .mode = TERMIOS_POLLED +}; diff --git a/bsps/riscv/riscv/dts/frdme310arty.dts b/bsps/riscv/riscv/dts/frdme310arty.dts new file mode 100644 index 0000000000..a7a216de28 --- /dev/null +++ b/bsps/riscv/riscv/dts/frdme310arty.dts @@ -0,0 +1,130 @@ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + compatible = "SiFive,FE310G-dev", "fe310-dev", "sifive-dev"; + model = "SiFive,FE310G"; + L20: chosen { + stdout-path = "serial@20000000"; + }; + L17: cpus { + #address-cells = <1>; + #size-cells = <0>; + L6: cpu@0 { + clocks = <&refclk>; + 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; + L19: tlclk { + #clock-cells = <0>; + clock-frequency = <32500000>; + clock-output-names = "tlclk"; + compatible = "fixed-clock"; + }; + refclk: refclk { + #clock-cells = <0>; + compatible = "fixed-clock"; + clock-frequency = <66666666>; + clock-output-names = "refclk"; + }; + 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>; + }; + }; +}; diff --git a/bsps/riscv/riscv/include/bsp/fe310-uart.h b/bsps/riscv/riscv/include/bsp/fe310-uart.h new file mode 100644 index 0000000000..c6c6fcb876 --- /dev/null +++ b/bsps/riscv/riscv/include/bsp/fe310-uart.h @@ -0,0 +1,61 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (C) 2019 Pragnesh Patel <pragnesh.pa...@sifive.com> + * Copyright (c) 2019 Sachin Ghadi <sachin.gh...@sifive.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FE310_UART_H +#define FE310_UART_H + +#define TXRXREADY (1 << 31) + +#include <rtems/termiostypes.h> +#include <rtems/irq.h> + +typedef struct { + uint32_t txdata; + uint32_t rxdata; + uint32_t txctrl; + uint32_t rxctrl; + uint32_t ie; + uint32_t ip; + uint32_t div; +} fe310_uart_t; + +/* Low-level driver specific data structure */ +typedef struct { + rtems_termios_device_context base; + const char *device_name; + volatile fe310_uart_t *regs; +} fe310_uart_context; + +int fe310_uart_read(rtems_termios_device_context *base); +void fe310_console_putchar(rtems_termios_device_context * context,char c); + +extern const rtems_termios_device_handler fe310_uart_handler; + +extern fe310_uart_context driver_context; + +#endif /* FE310_UART_H */ diff --git a/bsps/riscv/riscv/include/bsp/riscv.h b/bsps/riscv/riscv/include/bsp/riscv.h index 374d5f7a77..f2f1a597ca 100644 --- a/bsps/riscv/riscv/include/bsp/riscv.h +++ b/bsps/riscv/riscv/include/bsp/riscv.h @@ -38,6 +38,10 @@ extern volatile RISCV_CLINT_regs *riscv_clint; void *riscv_fdt_get_address(const void *fdt, int node); +#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0 +uint32_t riscv_get_core_frequency(void); +#endif + #ifdef RTEMS_SMP extern uint32_t riscv_hart_count; #else diff --git a/bsps/riscv/riscv/start/bspstart.c b/bsps/riscv/riscv/start/bspstart.c index d4c4e1ff7f..a462bbe6e1 100644 --- a/bsps/riscv/riscv/start/bspstart.c +++ b/bsps/riscv/riscv/start/bspstart.c @@ -30,6 +30,11 @@ #include <bsp/riscv.h> #include <libfdt.h> +#include <string.h> + +#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0 +unsigned int riscv_core_freq; +#endif void *riscv_fdt_get_address(const void *fdt, int node) { @@ -161,8 +166,55 @@ uint32_t riscv_get_hart_index_by_phandle(uint32_t phandle) return UINT32_MAX; } +#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0 +static uint32_t get_core_frequency(void) +{ + uint32_t node; + const char *fdt=bsp_fdt_get(); + + char *tlclk; + uint32_t len; + + do + { + node=fdt_node_offset_by_compatible(fdt, -1,"fixed-clock"); + uint32_t *val=NULL; + if (node>0) + { + tlclk = fdt_getprop(fdt, node, "clock-output-names", &len); + + if (strcmp(tlclk,"tlclk") == 0) + { + val = fdt_getprop(fdt, node, "clock-frequency", &len); + if(val !=NULL) + { + riscv_core_freq=fdt32_to_cpu(*val); + break; + } + } + }else + { + bsp_fatal(RISCV_FATAL_NO_TLCLOCK_FREQUENCY_IN_DEVICE_TREE); + } + + } while (node > 0); + + return riscv_core_freq; +} + +inline uint32_t riscv_get_core_frequency(void) +{ + return riscv_core_freq; +} +#endif + void bsp_start(void) { riscv_find_harts(); bsp_interrupt_initialize(); + +#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0 + riscv_core_freq=get_core_frequency(); +#endif + } diff --git a/c/src/lib/libbsp/riscv/riscv/Makefile.am b/c/src/lib/libbsp/riscv/riscv/Makefile.am index 34bedf844f..15b0865306 100644 --- a/c/src/lib/libbsp/riscv/riscv/Makefile.am +++ b/c/src/lib/libbsp/riscv/riscv/Makefile.am @@ -46,7 +46,11 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/start/bspgetworkarea-defa librtemsbsp_a_SOURCES +=../../../../../../bsps/riscv/riscv/clock/clockdrv.c # Timer +#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0 +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/btimer/btimer-cpucounter.c +#else librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/btimer/btimer-stub.c +#endif # IRQ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/irq/irq-default-handler.c @@ -60,6 +64,10 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termio librtemsbsp_a_SOURCES += ../../../../../../bsps/riscv/riscv/console/console-config.c librtemsbsp_a_SOURCES += ../../../../../../bsps/riscv/riscv/console/htif.c +#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0 +librtemsbsp_a_SOURCES += ../../../../../../bsps/riscv/riscv/console/fe310-uart.c +#endif + if HAS_SMP librtemsbsp_a_SOURCES += ../../../../../../bsps/riscv/riscv/start/bspsmp.c endif diff --git a/c/src/lib/libbsp/riscv/riscv/configure.ac b/c/src/lib/libbsp/riscv/riscv/configure.ac index b01dee242e..26a3e07e98 100644 --- a/c/src/lib/libbsp/riscv/riscv/configure.ac +++ b/c/src/lib/libbsp/riscv/riscv/configure.ac @@ -36,9 +36,14 @@ RTEMS_BSPOPTS_HELP([RISCV_MAXIMUM_EXTERNAL_INTERRUPTS],[maximum number of extern RTEMS_BSPOPTS_SET([RISCV_ENABLE_HTIF_SUPPORT],[*],[]) RTEMS_BSPOPTS_HELP([RISCV_ENABLE_HTIF_SUPPORT],[enables the HTIF support if defined to a non-zero value, otherwise it is disabled (disabled by default)]) +RTEMS_BSPOPTS_SET([RISCV_CONSOLE_MAX_NS16550_DEVICES],[frdme310arty*],[]) RTEMS_BSPOPTS_SET([RISCV_CONSOLE_MAX_NS16550_DEVICES],[*],[2]) RTEMS_BSPOPTS_HELP([RISCV_CONSOLE_MAX_NS16550_DEVICES],[maximum number of NS16550 devices supported by the console driver (2 by default)]) +RTEMS_BSPOPTS_SET([RISCV_ENABLE_FRDME310ARTY_SUPPORT],[frdme310arty*],[1]) +RTEMS_BSPOPTS_SET([RISCV_ENABLE_FRDME310ARTY_SUPPORT],[*],[]) +RTEMS_BSPOPTS_HELP([RISCV_ENABLE_FRDME310ARTY_SUPPORT],[enables support sifive Freedom E310 Arty board if defined to a non-zero value,otherwise it is disabled (disabled by default)]) + RTEMS_BSP_CLEANUP_OPTIONS case "${RTEMS_BSP}" in @@ -53,13 +58,22 @@ case "${RTEMS_BSP}" in ;; esac +case "${RTEMS_BSP}" in + frdm*310arty) + RISCV_RAM_REGION_SIZE_DEFAULT=0x10000000 + ;; + *) + RISCV_RAM_REGION_SIZE_DEFAULT=0x04000000 + ;; +esac + AC_DEFUN([RISCV_LINKCMD],[ AC_ARG_VAR([$1],[$2])dnl [$1]=[$]{[$1]:-[$3]} ]) RISCV_LINKCMD([RISCV_RAM_REGION_BEGIN],[begin of the RAM region for linker command file (default is 0x70000000 for 64-bit with -mcmodel=medlow and 0x80000000 for all other)],[${RISCV_RAM_REGION_BEGIN_DEFAULT}]) -RISCV_LINKCMD([RISCV_RAM_REGION_SIZE],[size of the RAM region for linker command file (default 64MiB)],[0x04000000]) +RISCV_LINKCMD([RISCV_RAM_REGION_SIZE],[size of the RAM region for linker command file (default is 256 MiB for frdme310arty and 64 MiB for all other)],[${RISCV_RAM_REGION_SIZE_DEFAULT}]) AC_CONFIG_FILES([ Makefile -- 2.17.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel