You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by bt...@apache.org on 2020/12/15 08:48:32 UTC
[incubator-nuttx] 01/01: WIP: Initial work to support BL602 chip
This is an automated email from the ASF dual-hosted git repository.
btashton pushed a commit to branch bl602
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 715b1ec21e741845ecc4959ef2983b9f754f0f20
Author: Brennan Ashton <ba...@brennanashton.com>
AuthorDate: Tue Dec 15 00:20:45 2020 -0800
WIP: Initial work to support BL602 chip
---
arch/risc-v/Kconfig | 6 +
arch/risc-v/include/bl60x/chip.h | 24 +++
arch/risc-v/include/bl60x/irq.h | 114 ++++++++++++++
arch/risc-v/src/bl60x/Kconfig | 28 ++++
arch/risc-v/src/bl60x/Make.defs | 53 +++++++
arch/risc-v/src/bl60x/bl.h | 38 +++++
arch/risc-v/src/bl60x/bl_allocateheap.c | 41 ++++++
arch/risc-v/src/bl60x/bl_clockconfig.c | 63 ++++++++
arch/risc-v/src/bl60x/bl_clockconfig.h | 65 ++++++++
arch/risc-v/src/bl60x/bl_config.h | 54 +++++++
arch/risc-v/src/bl60x/bl_head.S | 204 ++++++++++++++++++++++++++
arch/risc-v/src/bl60x/bl_idle.c | 67 +++++++++
arch/risc-v/src/bl60x/bl_irq.c | 147 +++++++++++++++++++
arch/risc-v/src/bl60x/bl_irq_dispatch.c | 58 ++++++++
arch/risc-v/src/bl60x/bl_lowputc.c | 104 +++++++++++++
arch/risc-v/src/bl60x/bl_lowputc.h | 59 ++++++++
arch/risc-v/src/bl60x/bl_memorymap.h | 47 ++++++
arch/risc-v/src/bl60x/bl_schedulesigaction.c | 195 ++++++++++++++++++++++++
arch/risc-v/src/bl60x/bl_start.c | 125 ++++++++++++++++
arch/risc-v/src/bl60x/bl_timerisr.c | 94 ++++++++++++
arch/risc-v/src/bl60x/bl_vectors.S | 42 ++++++
arch/risc-v/src/bl60x/chip.h | 32 ++++
arch/risc-v/src/bl60x/hardware/bl_clic.h | 37 +++++
arch/risc-v/src/bl60x/hardware/bl_memorymap.h | 33 +++++
arch/risc-v/src/bl60x/hardware/bl_uart.h | 28 ++++
25 files changed, 1758 insertions(+)
diff --git a/arch/risc-v/Kconfig b/arch/risc-v/Kconfig
index 4617062..e2dce76 100644
--- a/arch/risc-v/Kconfig
+++ b/arch/risc-v/Kconfig
@@ -10,6 +10,12 @@ choice
prompt "RISC-V chip selection"
default ARCH_CHIP_NR5
+config ARCH_CHIP_BL60X
+ bool "Bouffalo Lab BL60x"
+ select ARCH_RV32IM
+ ---help---
+ Bouffalo Lab BL602/4 Processor (RISC-V Core with BLE and WIFI).
+
config ARCH_CHIP_FE310
bool "SiFive FE310"
select ARCH_RV32IM
diff --git a/arch/risc-v/include/bl60x/chip.h b/arch/risc-v/include/bl60x/chip.h
new file mode 100644
index 0000000..6ed3c0b
--- /dev/null
+++ b/arch/risc-v/include/bl60x/chip.h
@@ -0,0 +1,24 @@
+/****************************************************************************
+ * arch/risc-v/include/bl60x/chip.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_RISCV_INCLUDE_BL60X_CHIP_H
+#define __ARCH_RISCV_INCLUDE_BL60X_CHIP_H
+
+#endif /* __ARCH_RISCV_INCLUDE_BL60X_CHIP_H */
diff --git a/arch/risc-v/include/bl60x/irq.h b/arch/risc-v/include/bl60x/irq.h
new file mode 100644
index 0000000..6ec6b32
--- /dev/null
+++ b/arch/risc-v/include/bl60x/irq.h
@@ -0,0 +1,114 @@
+/****************************************************************************
+ * arch/risc-v/include/bl60x/irq.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_RISCV_INCLUDE_BL60X_IRQ_H
+#define __ARCH_RISCV_INCLUDE_BL60X_IRQ_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <arch/irq.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* In mstatus register */
+
+#define MSTATUS_MIE (0x1 << 3) /* Machine Interrupt Enable */
+#define MSTATUS_MPIE (0x1 << 7) /* Machine Previous Interrupt Enable */
+#define MSTATUS_MPPM (0x3 << 11) /* Machine Previous Privilege (m-mode) */
+
+/* In mie (machine interrupt enable) register */
+
+#define MIE_MSIE (0x1 << 3) /* Machine Software Interrupt Enable */
+#define MIE_MTIE (0x1 << 7) /* Machine Timer Interrupt Enable */
+#define MIE_MEIE (0x1 << 11) /* Machine External Interrupt Enable */
+#define MIP_MTIP (0x1 << 7) /* Machine Timer Interrupt Pending */
+
+/* Map RISC-V exception code to NuttX IRQ */
+
+/* See the listing here for more information
+ * https://github.com/bouffalolab/bl_iot_sdk/blob/f8c47051ed9338b0f1036e55d8cb1eb56c86c089/components/bl602/bl602_std/bl602_std/RISCV/Device/Bouffalo/BL602/Startup/interrupt.c
+ */
+
+/* IRQ 0-15 : (exception:interrupt=0) */
+
+#define BL_IRQ_IAMISALIGNED (0) /* Instruction Address Misaligned */
+#define BL_IRQ_IAFAULT (1) /* Instruction Address Fault */
+#define BL_IRQ_IINSTRUCTION (2) /* Illegal Instruction */
+#define BL_IRQ_BPOINT (3) /* Break Point */
+#define BL_IRQ_LAMISALIGNED (4) /* Load Address Misaligned */
+#define BL_IRQ_LAFAULT (5) /* Load Access Fault */
+#define BL_IRQ_SAMISALIGNED (6) /* Store/AMO Address Misaligned */
+#define BL_IRQ_SAFAULT (7) /* Store/AMO Access Fault */
+#define BL_IRQ_ECALLU (8) /* Environment Call from U-mode */
+ /* 9-10: Reserved */
+
+#define BL_IRQ_ECALLM (11) /* Environment Call from M-mode */
+ /* 12-15: Reserved */
+
+#define BL_IRQ_CLIC_MSIP (16 + 3) /* Machine Software Interrupt */
+#define BL_IRQ_CLIC_MTIMER (16 + 7) /* Machine Timer Interrupt */
+#define BL_IRQ_CLIC_MEXT (16 + 7) /* Machine External Interrupt */
+#define BL_IRQ_CLIC_CSOFT (16 + 8)
+#define BL_IRQ_BMX_ERR (32 + 0)
+#define BL_IRQ_UART0 (32 + 29)
+#define BL_IRQ_UART0 (32 + 30)
+#define BL_IRQ_WIFI_IPC_PUBLIC (32 + 63)
+
+/* Total number of IRQs */
+
+#define NR_IRQS (BL_IRQ_WIFI_IPC_PUBLIC + 1)
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+EXTERN irqstate_t up_irq_save(void);
+EXTERN void up_irq_restore(irqstate_t);
+EXTERN irqstate_t up_irq_enable(void);
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+#endif /* __ASSEMBLY__ */
+#endif /* __ARCH_RISCV_INCLUDE_BL60X_IRQ_H */
diff --git a/arch/risc-v/src/bl60x/Kconfig b/arch/risc-v/src/bl60x/Kconfig
new file mode 100644
index 0000000..be4f596
--- /dev/null
+++ b/arch/risc-v/src/bl60x/Kconfig
@@ -0,0 +1,28 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+comment "BL60x Configuration Options"
+
+menu "BL60x Peripheral Support"
+
+# These "hidden" settings determine whether a peripheral option is available
+# for the selected MCU
+
+config BL_HAVE_UART0
+ bool
+ default y
+ select BL_SERIALDRIVER
+ select ARCH_HAVE_SERIAL_TERMIOS
+
+# These are the peripheral selections proper
+
+config BL_UART0
+ bool "UART0"
+ default y
+ select ARCH_HAVE_UART0
+ select ARCH_HAVE_SERIAL_TERMIOS
+ select BL_UART
+
+endmenu
diff --git a/arch/risc-v/src/bl60x/Make.defs b/arch/risc-v/src/bl60x/Make.defs
new file mode 100644
index 0000000..7148cef
--- /dev/null
+++ b/arch/risc-v/src/bl60x/Make.defs
@@ -0,0 +1,53 @@
+############################################################################
+# arch/risc-v/src/bl60x/Make.defs
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+# Specify our HEAD assembly file. This will be linked as
+# the first object file, so it will appear at address 0
+HEAD_ASRC = bl_vectors.S
+
+# Specify our general Assembly files
+CHIP_ASRCS = bl_head.S riscv_syscall.S
+
+ifeq ($(CONFIG_ARCH_SETJMP_H),y)
+CMN_ASRCS += riscv_setjmp.S
+endif
+
+# Specify C code within the common directory to be included
+CMN_CSRCS += riscv_initialize.c riscv_swint.c
+CMN_CSRCS += riscv_allocateheap.c riscv_createstack.c riscv_exit.c
+CMN_CSRCS += riscv_assert.c riscv_blocktask.c riscv_copystate.c riscv_initialstate.c
+CMN_CSRCS += riscv_interruptcontext.c riscv_modifyreg32.c riscv_puts.c riscv_mdelay.c
+CMN_CSRCS += riscv_releasepending.c riscv_reprioritizertr.c
+CMN_CSRCS += riscv_releasestack.c riscv_stackframe.c bl_schedulesigaction.c
+CMN_CSRCS += riscv_sigdeliver.c riscv_udelay.c riscv_unblocktask.c riscv_usestack.c
+
+ifeq ($(CONFIG_STACK_COLORATION),y)
+CMN_CSRCS += riscv_checkstack.c
+endif
+
+ifeq ($(CONFIG_ARCH_HAVE_VFORK),y)
+CMN_CSRCS += riscv_vfork.c
+endif
+
+# Specify our C code within this directory to be included
+CHIP_CSRCS = bl_allocateheap.c bl_clockconfig.c
+CHIP_CSRCS += bl_idle.c bl_irq.c bl_irq_dispatch.c
+CHIP_CSRCS += bl_lowputc.c bl_serial.c
+CHIP_CSRCS += bl_start.c bl_timerisr.c
diff --git a/arch/risc-v/src/bl60x/bl.h b/arch/risc-v/src/bl60x/bl.h
new file mode 100644
index 0000000..58c5083
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl.h
@@ -0,0 +1,38 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_RISCV_SRC_BL60X_BL_H
+#define __ARCH_RISCV_SRC_BL60X_BL_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <sys/types.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#include <arch/irq.h>
+#include "riscv_internal.h"
+#include "chip.h"
+#include "bl_lowputc.h"
+
+#endif /* __ARCH_RISCV_SRC_BL60X_BL_H */
diff --git a/arch/risc-v/src/bl60x/bl_allocateheap.c b/arch/risc-v/src/bl60x/bl_allocateheap.c
new file mode 100644
index 0000000..6612c63
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_allocateheap.c
@@ -0,0 +1,41 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_allocateheap.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <arch/board/board.h>
+
+#include "bl.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: up_addregion
+ ****************************************************************************/
+
+void up_addregion(void)
+{
+}
diff --git a/arch/risc-v/src/bl60x/bl_clockconfig.c b/arch/risc-v/src/bl60x/bl_clockconfig.c
new file mode 100644
index 0000000..f44ab0c
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_clockconfig.c
@@ -0,0 +1,63 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_clockconfig.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdint.h>
+#include <assert.h>
+#include <debug.h>
+
+#include <nuttx/arch.h>
+#include <arch/board/board.h>
+
+#include "riscv_arch.h"
+#include "bl_clockconfig.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: bl_get_hfclk
+ ****************************************************************************/
+
+uint32_t bl_get_hfclk(void)
+{
+ /* fpga fabric default sys frequency */
+
+ return 100000000UL;
+}
+
+/****************************************************************************
+ * Name: bl_clockconfig
+ ****************************************************************************/
+
+void bl_clockconfig(void)
+{
+ /* TODO */
+}
diff --git a/arch/risc-v/src/bl60x/bl_clockconfig.h b/arch/risc-v/src/bl60x/bl_clockconfig.h
new file mode 100644
index 0000000..01392fb
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_clockconfig.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_clockconfig.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_RISCV_SRC_BL60X_BL_CLOCKCONFIG_H
+#define __ARCH_RISCV_SRC_BL60X_BL_CLOCKCONFIG_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include "bl_memorymap.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+EXTERN uint32_t bl_get_hfclk(void);
+EXTERN void bl_clockconfig(void);
+
+#if defined(__cplusplus)
+}
+#endif
+#undef EXTERN
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ARCH_RISCV_SRC_BL60X_BL_CLOCKCONFIG_H */
diff --git a/arch/risc-v/src/bl60x/bl_config.h b/arch/risc-v/src/bl60x/bl_config.h
new file mode 100644
index 0000000..2f97a76
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_config.h
@@ -0,0 +1,54 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_config.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_RISCV_SRC_BL60X_BL_CONFIG_H
+#define __ARCH_RISCV_SRC_BL60X_BL_CONFIG_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <arch/chip/chip.h>
+#include <arch/board/board.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#undef HAVE_UART_DEVICE
+#if defined(CONFIG_BL_UART0) || defined(CONFIG_BL_UART1)
+# define HAVE_UART_DEVICE 1
+#endif
+
+#if defined(CONFIG_UART0_SERIAL_CONSOLE) && defined(CONFIG_BL_UART0)
+# undef CONFIG_UART1_SERIAL_CONSOLE
+# define HAVE_SERIAL_CONSOLE 1
+#elif defined(CONFIG_UART1_SERIAL_CONSOLE) && defined(CONFIG_BL_UART1)
+# undef CONFIG_UART0_SERIAL_CONSOLE
+# define HAVE_SERIAL_CONSOLE 1
+#else
+# undef CONFIG_UART0_SERIAL_CONSOLE
+# undef CONFIG_UART1_SERIAL_CONSOLE
+# undef HAVE_SERIAL_CONSOLE
+#endif
+
+#endif /* __ARCH_RISCV_SRC_BL60X_BL_CONFIG_H */
diff --git a/arch/risc-v/src/bl60x/bl_head.S b/arch/risc-v/src/bl60x/bl_head.S
new file mode 100644
index 0000000..608d1c3
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_head.S
@@ -0,0 +1,204 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_head.S
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <arch/rv32im/irq.h>
+
+#include "chip.h"
+
+/****************************************************************************
+ * Public Symbols
+ ****************************************************************************/
+
+ .global exception_common
+
+ /* Imported symbols */
+
+ .extern __trap_vec
+
+ .section .text
+ .global __start
+
+__start:
+
+ /* Set stack pointer to the idle thread stack */
+
+ lui sp, %hi(BL_IDLESTACK_TOP)
+ addi sp, sp, %lo(BL_IDLESTACK_TOP)
+
+ /* Disable all interrupts (i.e. timer, external) in mie */
+
+ csrw mie, zero
+
+ /* Initialize the Machine Trap Vector */
+
+ lui t0, %hi(__trap_vec)
+ addi t0, t0, %lo(__trap_vec)
+ csrw mtvec, t0
+
+ /* Jump to __bl_start */
+
+ jal x1, __bl_start
+
+ /* We shouldn't return from __bl_start */
+
+ .global _init
+ .global _fini
+
+_init:
+_fini:
+
+ /* These don't have to do anything since we use init_array/fini_array. */
+
+ ret
+
+/****************************************************************************
+ * Name: exception_common
+ ****************************************************************************/
+
+exception_common:
+
+ addi sp, sp, -XCPTCONTEXT_SIZE
+
+ sw x1, 1*4(sp) /* ra */
+ sw x3, 3*4(sp) /* gp */
+ sw x4, 4*4(sp) /* tp */
+ sw x5, 5*4(sp) /* t0 */
+ sw x6, 6*4(sp) /* t1 */
+ sw x7, 7*4(sp) /* t2 */
+ sw x8, 8*4(sp) /* s0 */
+ sw x9, 9*4(sp) /* s1 */
+ sw x10, 10*4(sp) /* a0 */
+ sw x11, 11*4(sp) /* a1 */
+ sw x12, 12*4(sp) /* a2 */
+ sw x13, 13*4(sp) /* a3 */
+ sw x14, 14*4(sp) /* a4 */
+ sw x15, 15*4(sp) /* a5 */
+ sw x16, 16*4(sp) /* a6 */
+ sw x17, 17*4(sp) /* a7 */
+ sw x18, 18*4(sp) /* s2 */
+ sw x19, 19*4(sp) /* s3 */
+ sw x20, 20*4(sp) /* s4 */
+ sw x21, 21*4(sp) /* s5 */
+ sw x22, 22*4(sp) /* s6 */
+ sw x23, 23*4(sp) /* s7 */
+ sw x24, 24*4(sp) /* s8 */
+ sw x25, 25*4(sp) /* s9 */
+ sw x26, 26*4(sp) /* s10 */
+ sw x27, 27*4(sp) /* s11 */
+ sw x28, 28*4(sp) /* t3 */
+ sw x29, 29*4(sp) /* t4 */
+ sw x30, 30*4(sp) /* t5 */
+ sw x31, 31*4(sp) /* t6 */
+
+ csrr s0, mstatus
+ sw s0, 32*4(sp) /* mstatus */
+
+ addi s0, sp, XCPTCONTEXT_SIZE
+ sw s0, 2*4(sp) /* original SP */
+
+ /* Setup arg0(exception cause), arg1(context) */
+
+ csrr a0, mcause /* exception cause */
+ csrr s0, mepc
+ sw s0, 0(sp) /* exception PC */
+
+ mv a1, sp /* context = sp */
+
+#if CONFIG_ARCH_INTERRUPTSTACK > 3
+ /* Switch to interrupt stack */
+
+ lui sp, %hi(g_intstackbase)
+ addi sp, sp, %lo(g_intstackbase)
+#endif
+
+ /* Call interrupt handler in C */
+
+ jal x1, bl_dispatch_irq
+
+ /* If context switch is needed, return a new sp */
+
+ mv sp, a0
+ lw s0, 0(sp) /* restore mepc */
+ csrw mepc, s0
+
+ lw s0, 32*4(sp) /* restore mstatus */
+ csrw mstatus, s0
+
+ lw x3, 3*4(sp) /* gp */
+ lw x4, 4*4(sp) /* tp */
+ lw x5, 5*4(sp) /* t0 */
+ lw x6, 6*4(sp) /* t1 */
+ lw x7, 7*4(sp) /* t2 */
+ lw x8, 8*4(sp) /* s0 */
+ lw x9, 9*4(sp) /* s1 */
+ lw x10, 10*4(sp) /* a0 */
+ lw x11, 11*4(sp) /* a1 */
+ lw x12, 12*4(sp) /* a2 */
+ lw x13, 13*4(sp) /* a3 */
+ lw x14, 14*4(sp) /* a4 */
+ lw x15, 15*4(sp) /* a5 */
+ lw x16, 16*4(sp) /* a6 */
+ lw x17, 17*4(sp) /* a7 */
+ lw x18, 18*4(sp) /* s2 */
+ lw x19, 19*4(sp) /* s3 */
+ lw x20, 20*4(sp) /* s4 */
+ lw x21, 21*4(sp) /* s5 */
+ lw x22, 22*4(sp) /* s6 */
+ lw x23, 23*4(sp) /* s7 */
+ lw x24, 24*4(sp) /* s8 */
+ lw x25, 25*4(sp) /* s9 */
+ lw x26, 26*4(sp) /* s10 */
+ lw x27, 27*4(sp) /* s11 */
+ lw x28, 28*4(sp) /* t3 */
+ lw x29, 29*4(sp) /* t4 */
+ lw x30, 30*4(sp) /* t5 */
+ lw x31, 31*4(sp) /* t6 */
+
+ lw x1, 1*4(sp) /* ra */
+
+ lw sp, 2*4(sp) /* restore original sp */
+
+ /* Return from Machine Interrupt */
+
+ mret
+
+/************************************************************************************
+ * Name: g_intstackalloc and g_intstackbase
+ ************************************************************************************/
+
+#if CONFIG_ARCH_INTERRUPTSTACK > 3
+ .bss
+ .align 4
+ .global g_intstackalloc
+ .global g_intstackbase
+ .type g_intstackalloc, object
+ .type g_intstackbase, object
+g_intstackalloc:
+ .skip ((CONFIG_ARCH_INTERRUPTSTACK & ~3))
+g_intstackbase:
+ .skip 4
+ .size g_intstackbase, 4
+ .size g_intstackalloc, (CONFIG_ARCH_INTERRUPTSTACK & ~3)
+#endif
diff --git a/arch/risc-v/src/bl60x/bl_idle.c b/arch/risc-v/src/bl60x/bl_idle.c
new file mode 100644
index 0000000..4ab7756
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_idle.c
@@ -0,0 +1,67 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_idle.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/irq.h>
+#include <nuttx/arch.h>
+#include <nuttx/board.h>
+#include <arch/board/board.h>
+
+#include "riscv_internal.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: up_idle
+ *
+ * Description:
+ * up_idle() is the logic that will be executed when there is no other
+ * ready-to-run task. This is processor idle time and will continue until
+ * some interrupt occurs to cause a context switch from the idle task.
+ *
+ * Processing in this state may be processor-specific. e.g., this is where
+ * power management operations might be performed.
+ *
+ ****************************************************************************/
+
+void up_idle(void)
+{
+#if defined(CONFIG_SUPPRESS_INTERRUPTS) || defined(CONFIG_SUPPRESS_TIMER_INTS)
+ /* If the system is idle and there are no timer interrupts, then process
+ * "fake" timer interrupts. Hopefully, something will wake up.
+ */
+
+ nxsched_process_timer();
+#else
+
+ /* This would be an appropriate place to put some MCU-specific logic to
+ * sleep in a reduced power mode until an interrupt occurs to save power
+ */
+
+ asm("WFI");
+
+#endif
+}
diff --git a/arch/risc-v/src/bl60x/bl_irq.c b/arch/risc-v/src/bl60x/bl_irq.c
new file mode 100644
index 0000000..1b4fbd7
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_irq.c
@@ -0,0 +1,147 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_irq.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdint.h>
+#include <stdio.h>
+#include <debug.h>
+
+#include <nuttx/arch.h>
+#include <nuttx/board.h>
+#include <arch/irq.h>
+#include <arch/board/board.h>
+
+#include "riscv_internal.h"
+#include "riscv_arch.h"
+
+#include "bl.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: up_irqinitialize
+ ****************************************************************************/
+
+void up_irqinitialize(void)
+{
+#warning "Not Implemented"
+}
+
+/****************************************************************************
+ * Name: up_disable_irq
+ *
+ * Description:
+ * Disable the IRQ specified by 'irq'
+ *
+ ****************************************************************************/
+
+void up_disable_irq(int irq)
+{
+#warning "Not implemented"
+}
+
+/****************************************************************************
+ * Name: up_enable_irq
+ *
+ * Description:
+ * Enable the IRQ specified by 'irq'
+ *
+ ****************************************************************************/
+
+void up_enable_irq(int irq)
+{
+#warning "Not Implemented"
+}
+
+/****************************************************************************
+ * Name: up_get_newintctx
+ *
+ * Description:
+ * Return initial mstatus when a task is created.
+ *
+ ****************************************************************************/
+
+uint32_t up_get_newintctx(void)
+{
+#warning "Not Implemented"
+ return 0;
+}
+
+/****************************************************************************
+ * Name: up_ack_irq
+ *
+ * Description:
+ * Acknowledge the IRQ
+ *
+ ****************************************************************************/
+
+void up_ack_irq(int irq)
+{
+}
+
+/****************************************************************************
+ * Name: up_irq_save
+ *
+ * Description:
+ * Return the current interrupt state and disable interrupts
+ *
+ ****************************************************************************/
+
+irqstate_t up_irq_save(void)
+{
+ irqstate_t state;
+#warning "Not Implemented"
+ return state;
+}
+
+/****************************************************************************
+ * Name: up_irq_restore
+ *
+ * Description:
+ * Restore previous IRQ mask state
+ *
+ ****************************************************************************/
+
+void up_irq_restore(irqstate_t flags)
+{
+#error "Not Implemented"
+}
+
+/****************************************************************************
+ * Name: up_irq_enable
+ *
+ * Description:
+ * Return the current interrupt state and enable interrupts
+ *
+ ****************************************************************************/
+
+irqstate_t up_irq_enable(void)
+{
+ irqstate_t state;
+#warning "Not Implemented"
+ return state;
+}
diff --git a/arch/risc-v/src/bl60x/bl_irq_dispatch.c b/arch/risc-v/src/bl60x/bl_irq_dispatch.c
new file mode 100644
index 0000000..67caa97
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_irq_dispatch.c
@@ -0,0 +1,58 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_irq_dispatch.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdint.h>
+#include <assert.h>
+
+#include <nuttx/irq.h>
+#include <nuttx/arch.h>
+#include <nuttx/board.h>
+#include <arch/board/board.h>
+
+#include "riscv_arch.h"
+#include "riscv_internal.h"
+
+#include "bl.h"
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+volatile uint32_t * g_current_regs;
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * bl_dispatch_irq
+ ****************************************************************************/
+
+void *bl_dispatch_irq(uint32_t vector, uint32_t *regs)
+{
+#warning "Not Implemented"
+ return regs;
+}
diff --git a/arch/risc-v/src/bl60x/bl_lowputc.c b/arch/risc-v/src/bl60x/bl_lowputc.c
new file mode 100644
index 0000000..186bce7
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_lowputc.c
@@ -0,0 +1,104 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_lowputc.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdint.h>
+
+#include <arch/board/board.h>
+
+#include "riscv_internal.h"
+#include "riscv_arch.h"
+
+#include "bl_config.h"
+#include "hardware/bl_memorymap.h"
+#include "hardware/bl_uart.h"
+#include "bl_clockconfig.h"
+#include "bl.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Select UART parameters for the selected console */
+
+#ifdef HAVE_SERIAL_CONSOLE
+# if defined(CONFIG_UART0_SERIAL_CONSOLE)
+# define BL_CONSOLE_BASE BL_UART0_BASE
+# define BL_CONSOLE_BAUD CONFIG_UART0_BAUD
+# define HAVE_UART
+# elif defined(CONFIG_UART1_SERIAL_CONSOLE)
+# define BL_CONSOLE_BASE BL_UART1_BASE
+# define BL_CONSOLE_BAUD CONFIG_UART1_BAUD
+# define HAVE_UART
+# endif
+#endif /* HAVE_CONSOLE */
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: up_lowputc
+ *
+ * Description:
+ * Output one byte on the serial console
+ *
+ ****************************************************************************/
+
+void up_lowputc(char ch)
+{
+#ifdef HAVE_SERIAL_CONSOLE
+ /* Wait until the TX data register is empty */
+
+ /* Then send the character */
+
+#endif /* HAVE_CONSOLE */
+}
+
+/****************************************************************************
+ * Name: bl_lowsetup
+ *
+ * Description:
+ * This performs basic initialization of the UART used for the serial
+ * console. Its purpose is to get the console output available as soon
+ * as possible.
+ *
+ ****************************************************************************/
+
+void bl_lowsetup(void)
+{
+#if defined(HAVE_UART)
+
+ /* Enable and configure the selected console device */
+
+#if defined(HAVE_SERIAL_CONSOLE) && !defined(CONFIG_SUPPRESS_UART_CONFIG)
+
+ /* Set Baudrate */
+
+ /* Enable TX */
+
+#endif /* HAVE_SERIAL_CONSOLE && !CONFIG_SUPPRESS_UART_CONFIG */
+#endif /* HAVE_UART */
+}
diff --git a/arch/risc-v/src/bl60x/bl_lowputc.h b/arch/risc-v/src/bl60x/bl_lowputc.h
new file mode 100644
index 0000000..8d092d2
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_lowputc.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_lowputc.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_RISCV_SRC_BL60X_BL_LOWPUTC_H
+#define __ARCH_RISCV_SRC_BL60X_BL_LOWPUTC_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include "chip.h"
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Name: bl_lowsetup
+ ****************************************************************************/
+
+EXTERN void bl_lowsetup(void);
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ARCH_RISCV_SRC_BL60X_BL_LOWPUTC_H */
diff --git a/arch/risc-v/src/bl60x/bl_memorymap.h b/arch/risc-v/src/bl60x/bl_memorymap.h
new file mode 100644
index 0000000..b8d4710
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_memorymap.h
@@ -0,0 +1,47 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_memorymap.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef _ARCH_RISCV_SRC_BL60X_BL_MEMORYMAP_H
+#define _ARCH_RISCV_SRC_BL60X_BL_MEMORYMAP_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include "hardware/bl_memorymap.h"
+#include "hardware/bl_uart.h"
+#include "hardware/bl_clic.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Idle thread stack starts from _ebss */
+
+#ifndef __ASSEMBLY__
+#define BL_IDLESTACK_BASE (uint32_t)&_ebss
+#else
+#define BL_IDLESTACK_BASE _ebss
+#endif
+
+#define BL_IDLESTACK_SIZE (CONFIG_IDLETHREAD_STACKSIZE & ~3)
+#define BL_IDLESTACK_TOP (BL_IDLESTACK_BASE + BL_IDLESTACK_SIZE)
+
+#endif /* _ARCH_RISCV_SRC_BL60X_BL_MEMORYMAP_H */
diff --git a/arch/risc-v/src/bl60x/bl_schedulesigaction.c b/arch/risc-v/src/bl60x/bl_schedulesigaction.c
new file mode 100644
index 0000000..7331231
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_schedulesigaction.c
@@ -0,0 +1,195 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_schedulesigaction.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <inttypes.h>
+#include <stdint.h>
+#include <sched.h>
+#include <debug.h>
+
+#include <nuttx/irq.h>
+#include <nuttx/arch.h>
+#include <arch/bl/irq.h>
+
+#include "sched/sched.h"
+#include "riscv_internal.h"
+#include "riscv_arch.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: up_schedule_sigaction
+ *
+ * Description:
+ * This function is called by the OS when one or more
+ * signal handling actions have been queued for execution.
+ * The architecture specific code must configure things so
+ * that the 'sigdeliver' callback is executed on the thread
+ * specified by 'tcb' as soon as possible.
+ *
+ * This function may be called from interrupt handling logic.
+ *
+ * This operation should not cause the task to be unblocked
+ * nor should it cause any immediate execution of sigdeliver.
+ * Typically, a few cases need to be considered:
+ *
+ * (1) This function may be called from an interrupt handler
+ * During interrupt processing, all xcptcontext structures
+ * should be valid for all tasks. That structure should
+ * be modified to invoke sigdeliver() either on return
+ * from (this) interrupt or on some subsequent context
+ * switch to the recipient task.
+ * (2) If not in an interrupt handler and the tcb is NOT
+ * the currently executing task, then again just modify
+ * the saved xcptcontext structure for the recipient
+ * task so it will invoke sigdeliver when that task is
+ * later resumed.
+ * (3) If not in an interrupt handler and the tcb IS the
+ * currently executing task -- just call the signal
+ * handler now.
+ *
+ ****************************************************************************/
+
+void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
+{
+ irqstate_t flags;
+ uint32_t int_ctx;
+
+ sinfo("tcb=0x%p sigdeliver=0x%p\n", tcb, sigdeliver);
+
+ /* Make sure that interrupts are disabled */
+
+ flags = enter_critical_section();
+
+ /* Refuse to handle nested signal actions */
+
+ if (!tcb->xcp.sigdeliver)
+ {
+ /* First, handle some special cases when the signal is
+ * being delivered to the currently executing task.
+ */
+
+ sinfo("rtcb=0x%p g_current_regs=0x%p\n",
+ this_task(), g_current_regs);
+
+ if (tcb == this_task())
+ {
+ /* CASE 1: We are not in an interrupt handler and
+ * a task is signalling itself for some reason.
+ */
+
+ if (!g_current_regs)
+ {
+ /* In this case just deliver the signal now. */
+
+ sigdeliver(tcb);
+ }
+
+ /* CASE 2: We are in an interrupt handler AND the
+ * interrupted task is the same as the one that
+ * must receive the signal, then we will have to modify
+ * the return state as well as the state in the TCB.
+ *
+ * Hmmm... there looks like a latent bug here: The following
+ * logic would fail in the strange case where we are in an
+ * interrupt handler, the thread is signalling itself, but
+ * a context switch to another task has occurred so that
+ * g_current_regs does not refer to the thread of this_task()!
+ */
+
+ else
+ {
+ /* Save the return EPC and STATUS registers. These will be
+ * restored by the signal trampoline after the signals have
+ * been delivered.
+ */
+
+ tcb->xcp.sigdeliver = sigdeliver;
+ tcb->xcp.saved_epc = g_current_regs[REG_EPC];
+ tcb->xcp.saved_int_ctx = g_current_regs[REG_INT_CTX];
+
+ /* Then set up to vector to the trampoline with interrupts
+ * disabled
+ */
+
+ g_current_regs[REG_EPC] = (uint32_t)up_sigdeliver;
+
+ int_ctx = g_current_regs[REG_INT_CTX];
+ int_ctx &= ~MSTATUS_MPIE;
+
+ g_current_regs[REG_INT_CTX] = int_ctx;
+
+ /* And make sure that the saved context in the TCB
+ * is the same as the interrupt return context.
+ */
+
+ up_savestate(tcb->xcp.regs);
+
+ sinfo("PC/STATUS Saved: %08" PRIx32 "/%08" PRIx32
+ " New: %08" PRIx32 "/%08" PRIx32 "\n",
+ tcb->xcp.saved_epc, tcb->xcp.saved_int_ctx,
+ g_current_regs[REG_EPC], g_current_regs[REG_INT_CTX]);
+ }
+ }
+
+ /* Otherwise, we are (1) signaling a task is not running
+ * from an interrupt handler or (2) we are not in an
+ * interrupt handler and the running task is signalling
+ * some non-running task.
+ */
+
+ else
+ {
+ /* Save the return EPC and STATUS registers. These will be
+ * restored by the signal trampoline after the signals have
+ * been delivered.
+ */
+
+ tcb->xcp.sigdeliver = sigdeliver;
+ tcb->xcp.saved_epc = tcb->xcp.regs[REG_EPC];
+ tcb->xcp.saved_int_ctx = tcb->xcp.regs[REG_INT_CTX];
+
+ /* Then set up to vector to the trampoline with interrupts
+ * disabled
+ */
+
+ tcb->xcp.regs[REG_EPC] = (uint32_t)up_sigdeliver;
+
+ int_ctx = tcb->xcp.regs[REG_INT_CTX];
+ int_ctx &= ~MSTATUS_MPIE;
+
+ tcb->xcp.regs[REG_INT_CTX] = int_ctx;
+
+ sinfo("PC/STATUS Saved: %08" PRIx32 "/%08" PRIx32
+ " New: %08" PRIx32 "/%08" PRIx32 "\n",
+ tcb->xcp.saved_epc, tcb->xcp.saved_int_ctx,
+ tcb->xcp.regs[REG_EPC], tcb->xcp.regs[REG_INT_CTX]);
+ }
+ }
+
+ leave_critical_section(flags);
+}
diff --git a/arch/risc-v/src/bl60x/bl_start.c b/arch/risc-v/src/bl60x/bl_start.c
new file mode 100644
index 0000000..6ab5886
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_start.c
@@ -0,0 +1,125 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_init.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stdint.h>
+
+#include <nuttx/config.h>
+
+#include <arch/board/board.h>
+
+#include "bl_clockconfig.h"
+#include "bl.h"
+#include "chip.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#ifdef CONFIG_DEBUG_FEATURES
+# define showprogress(c) up_lowputc(c)
+#else
+# define showprogress(c)
+#endif
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/* g_idle_topstack: _sbss is the start of the BSS region as defined by the
+ * linker script. _ebss lies at the end of the BSS region. The idle task
+ * stack starts at the end of BSS and is of size CONFIG_IDLETHREAD_STACKSIZE.
+ * The IDLE thread is the thread that the system boots on and, eventually,
+ * becomes the IDLE, do nothing task that runs only when there is nothing
+ * else to run. The heap continues from there until the end of memory.
+ * g_idle_topstack is a read-only variable the provides this computed
+ * address.
+ */
+
+uint32_t g_idle_topstack = BL_IDLESTACK_TOP;
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: bl_start
+ ****************************************************************************/
+
+void __bl_start(void)
+{
+ const uint32_t *src;
+ uint32_t *dest;
+
+ /* Clear .bss. We'll do this inline (vs. calling memset) just to be
+ * certain that there are no issues with the state of global variables.
+ */
+
+ for (dest = &_sbss; dest < &_ebss; )
+ {
+ *dest++ = 0;
+ }
+
+ /* Move the initialized data section from his temporary holding spot in
+ * FLASH into the correct place in SRAM. The correct place in SRAM is
+ * give by _sdata and _edata. The temporary location is in FLASH at the
+ * end of all of the other read-only data (.text, .rodata) at _eronly.
+ */
+
+ /* for vexriscv the full image is loaded in ddr ram */
+
+ for (src = &_eronly, dest = &_sdata; dest < &_edata; )
+ {
+ *dest++ = *src++;
+ }
+
+ /* Setup PLL */
+
+ bl_clockconfig();
+
+ /* Configure the UART so we can get debug output */
+
+ bl_lowsetup();
+
+ showprogress('A');
+
+#ifdef USE_EARLYSERIALINIT
+ up_earlyserialinit();
+#endif
+
+ showprogress('B');
+
+ /* Do board initialization */
+
+ bl_boardinitialize();
+
+ showprogress('C');
+
+ /* Call nx_start() */
+
+ nx_start();
+
+ /* Shouldn't get here */
+
+ for (; ; );
+}
diff --git a/arch/risc-v/src/bl60x/bl_timerisr.c b/arch/risc-v/src/bl60x/bl_timerisr.c
new file mode 100644
index 0000000..0cc1f64
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_timerisr.c
@@ -0,0 +1,94 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_timerisr.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdint.h>
+#include <time.h>
+#include <debug.h>
+
+#include <nuttx/arch.h>
+#include <nuttx/clock.h>
+#include <arch/board/board.h>
+
+#include "riscv_arch.h"
+
+#include "bl.h"
+#include "bl_clockconfig.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define TICK_COUNT (bl_get_hfclk() / TICK_PER_SEC)
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: bl_timerisr
+ ****************************************************************************/
+
+static int bl_timerisr(int irq, void *context, FAR void *arg)
+{
+ /* TODO: Reload timer */
+
+ /* Process timer interrupt */
+
+ nxsched_process_timer();
+ return 0;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: up_timer_initialize
+ *
+ * Description:
+ * This function is called during start-up to initialize
+ * the timer interrupt.
+ *
+ ****************************************************************************/
+
+void up_timer_initialize(void)
+{
+#if 0
+ /* Attach timer interrupt handler */
+
+ irq_attach(BL_IRQ_TIMER, bl_timerisr, NULL);
+
+ /* TODO: Reload timer */
+
+ /* And enable the timer interrupt */
+
+ up_enable_irq(BL_IRQ_TIMER);
+#endif
+}
diff --git a/arch/risc-v/src/bl60x/bl_vectors.S b/arch/risc-v/src/bl60x/bl_vectors.S
new file mode 100644
index 0000000..78e61c6
--- /dev/null
+++ b/arch/risc-v/src/bl60x/bl_vectors.S
@@ -0,0 +1,42 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/bl_vectors.S
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/************************************************************************************
+ * Included Files
+ ************************************************************************************/
+
+ .section .text.vec
+ .global __reset_vec
+ .global __trap_vec
+
+/****************************************************************************
+ * Name: __reset_vec
+ ****************************************************************************/
+
+__reset_vec:
+ jal __start
+
+/****************************************************************************
+ * Name: exception_common
+ ****************************************************************************/
+
+__trap_vec:
+ j exception_common
+ nop
diff --git a/arch/risc-v/src/bl60x/chip.h b/arch/risc-v/src/bl60x/chip.h
new file mode 100644
index 0000000..e5c7faf
--- /dev/null
+++ b/arch/risc-v/src/bl60x/chip.h
@@ -0,0 +1,32 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/chip.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_RISCV_SRC_BL60X_CHIP_H
+#define __ARCH_RISCV_SRC_BL60X_CHIP_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include "bl_memorymap.h"
+
+#endif /* __ARCH_RISCV_SRC_BL60X_CHIP_H */
diff --git a/arch/risc-v/src/bl60x/hardware/bl_clic.h b/arch/risc-v/src/bl60x/hardware/bl_clic.h
new file mode 100644
index 0000000..85d2164
--- /dev/null
+++ b/arch/risc-v/src/bl60x/hardware/bl_clic.h
@@ -0,0 +1,37 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/hardware/bl_clint.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_RISCV_SRC_BL60X_HARDWARE_BL_CLINT_H
+#define __ARCH_RISCV_SRC_BL60X_HARDWARE_BL_CLINT_H
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define BL_CLIC_MSIP (BL_CLIC_CTRL_BASE + 0x0000) /* size 4 */
+#define BL_CLIC_MTIMECMP (BL_CLIC_CTRL_BASE + 0x4000) /* size 8 */
+#define BL_CLIC_MTIME (BL_CLIC_CTRL_BASE + 0xBFF8) /* size 8 */
+
+#define BL_CLIC_INTIP (BL_CLIC_HART0_BASE + 0x000)
+#define BL_CLIC_INTIE (BL_CLIC_HART0_BASE + 0x400)
+#define BL_CLIC_INTCFG (BL_CLIC_HART0_BASE + 0x800)
+#define BL_CLIC_CFG (BL_CLIC_HART0_BASE + 0xC00)
+
+#endif /* __ARCH_RISCV_SRC_BL60X_HARDWARE_BL_CLINT_H */
diff --git a/arch/risc-v/src/bl60x/hardware/bl_memorymap.h b/arch/risc-v/src/bl60x/hardware/bl_memorymap.h
new file mode 100644
index 0000000..4d71a5c
--- /dev/null
+++ b/arch/risc-v/src/bl60x/hardware/bl_memorymap.h
@@ -0,0 +1,33 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/hardware/bl_memorymap.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_RISCV_SRC_BL60X_HARDWARE_BL_MEMORYMAP_H
+#define __ARCH_RISCV_SRC_BL60X_HARDWARE_BL_MEMORYMAP_H
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Register Base Address ****************************************************/
+
+#define BL_CLIC_CTRL_BASE 0x02000000
+#define BL_CLIC_HART0_BASE 0x02800000
+
+#endif /* __ARCH_RISCV_SRC_BL60X_HARDWARE_BL_MEMORYMAP_H */
diff --git a/arch/risc-v/src/bl60x/hardware/bl_uart.h b/arch/risc-v/src/bl60x/hardware/bl_uart.h
new file mode 100644
index 0000000..4895ae3
--- /dev/null
+++ b/arch/risc-v/src/bl60x/hardware/bl_uart.h
@@ -0,0 +1,28 @@
+/****************************************************************************
+ * arch/risc-v/src/bl60x/hardware/bl_uart.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef ARCH_RISCV_SRC_BL60X_CHIP_BL_UART_H
+#define ARCH_RISCV_SRC_BL60X_CHIP_BL_UART_H
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#endif /* __ARCH_RISCV_SRC_BL60X_CHIP_BL_UART_H */