You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/12/16 02:52:22 UTC

(nuttx) branch master updated: boards/riscv: Add support for PINE64 Ox64 BL808 SBC

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 87c1b81857 boards/riscv: Add support for PINE64 Ox64 BL808 SBC
87c1b81857 is described below

commit 87c1b81857cd25ec267864f346ab0b61821cb60e
Author: Lee Lup Yuen <lu...@appkaki.com>
AuthorDate: Wed Dec 13 08:21:37 2023 +0800

    boards/riscv: Add support for PINE64 Ox64 BL808 SBC
    
    This PR adds support for PINE64 Ox64 64-bit RISC-V SBC, based on Bouffalo Lab BL808 SoC (T-Head C906 Core). Most of the code is derived from NuttX for Star64 JH7110. The source files are explained in the articles here: https://github.com/lupyuen/nuttx-ox64
    
    ### Modified Files
    
    `boards/Kconfig`: Added Ox64 board
    
    ### New Files in boards/risc-v/bl808/ox64
    
    `src/bl808_appinit.c`: Startup Code
    
    `include/board.h`: Ox64 Definitions
    
    `include/board_memorymap.h`: Memory Map
    
    `src/etc/init.d/rc.sysinit`, `rcS`: Startup Script
    
    `src/.gitignore`: Ignore the tmp filesystem
    
    `scripts/ld.script`: Linker Script
    
    `scripts/Make.defs`: Ox64 Makefile
    
    `src/Makefile`: Ox64 Makefile
    
    `Kconfig`: Ox64 Config
    
    `configs/nsh/defconfig`: Build Config for `ox64:nsh`
    
    ### Updated Documentation
    
    `platforms/risc-v/bl808/index.rst`: New page for Bouffalo Lab BL808 SoC
    
    `platforms/risc-v/bl808/boards/ox64/index.rst`: Building and booting NuttX for Ox64
    
    `platforms/risc-v/jh7110/boards/star64/index.rst`: Fix typo
---
 .../platforms/risc-v/bl808/boards/ox64/index.rst   | 149 ++++++++++++++++++
 Documentation/platforms/risc-v/bl808/index.rst     |  45 ++++++
 .../risc-v/jh7110/boards/star64/index.rst          |   2 +-
 boards/Kconfig                                     |  11 ++
 boards/risc-v/bl808/ox64/Kconfig                   |   0
 boards/risc-v/bl808/ox64/configs/nsh/defconfig     |  84 +++++++++++
 boards/risc-v/bl808/ox64/include/board.h           |  78 ++++++++++
 boards/risc-v/bl808/ox64/include/board_memorymap.h |  88 +++++++++++
 boards/risc-v/bl808/ox64/scripts/Make.defs         |  43 ++++++
 boards/risc-v/bl808/ox64/scripts/ld.script         | 150 ++++++++++++++++++
 boards/risc-v/bl808/ox64/src/.gitignore            |   2 +
 boards/risc-v/bl808/ox64/src/Makefile              |  27 ++++
 boards/risc-v/bl808/ox64/src/bl808_appinit.c       | 167 +++++++++++++++++++++
 boards/risc-v/bl808/ox64/src/etc/init.d/rc.sysinit |  19 +++
 boards/risc-v/bl808/ox64/src/etc/init.d/rcS        |  19 +++
 15 files changed, 883 insertions(+), 1 deletion(-)

diff --git a/Documentation/platforms/risc-v/bl808/boards/ox64/index.rst b/Documentation/platforms/risc-v/bl808/boards/ox64/index.rst
new file mode 100644
index 0000000000..d293af3e92
--- /dev/null
+++ b/Documentation/platforms/risc-v/bl808/boards/ox64/index.rst
@@ -0,0 +1,149 @@
+===========
+PINE64 Ox64
+===========
+
+`Ox64 <https://wiki.pine64.org/wiki/Ox64>`_ is a RISC-V Single-Board Computer
+based on the Bouffalo Lab BL808 RISC-V SoC with C906 64-bit CPU Core and
+E907 / E902 32-bit CPU Cores supported by 64 MB of embedded PSRAM memory,
+with built-in WiFi, Bluetooth and Zigbee radio interfaces.
+
+Ox64 comes in a breadboard-friendly form factor. It has a microSD Card slot,
+USB 2.0 Type-C port and other peripheral interfaces.
+
+Features
+========
+
+- **System on Chip:** Bouffalo Lab BL808
+    - **CPU:** 
+        - 64-bit T-Head C906 "D0" (RV64IMAFCV)
+        - 32-bit T-Head E907 "M0" (RV32IMAFCP)
+        - 32-bit T-Head E902 "LP" (RV32E[M]C)
+    - **RAM:** Embedded 64 MB PSRAM
+- **Wireless:** 2.4 GHz 1T1R WiFi 802.11 b/g/n, Bluetooth 5.2, Zigbee
+- **Ethernet:** 10 / 100 Mbps (optional)
+- **Storage:** On-board 128 Mbit (16 MB) XSPI NOR Flash Memory, microSD (SDHC and SDXC)
+- **USB:** USB 2.0 OTG
+- **Audio:** Microphone and Speaker (optional)
+- **Video Input:** Dual-lane MIPI CSI port for Camera Module (USB-C)
+- **Expansion Ports:** 26 GPIO pins (including SPI, I2C and UART)
+
+Serial Console
+==============
+
+A **USB Serial Adapter** that supports 2 Mbps (like `CH340G Serial Adapter <https://lupyuen.github.io/articles/ox64#test-the-usb-serial-adapter>`_)
+is required to run NuttX on Ox64.
+
+Connect the USB Serial Adapter to Ox64 Serial Console at:
+
+========== ========
+USB Serial Ox64 Pin
+========== ========
+TX         Pin 31 (GPIO 17 / UART3 RX)
+RX         Pin 32 (GPIO 16 / UART3 TX)
+GND        Pin 33 (GND)
+========== ========
+
+On the USB Serial Adapter, set the **Voltage Level** to 3V3.
+
+Connect Ox64 to our computer with the USB Serial Adapter.
+On our computer, start a Serial Terminal and connect to the USB Serial Port
+at **2 Mbps**.
+
+NuttX will appear in the Serial Console when it boots on Ox64.
+
+RISC-V Toolchain
+================
+
+Before building NuttX for Ox64, download the **RISC-V Toolchain riscv64-unknown-elf**
+from `SiFive RISC-V Tools <https://github.com/sifive/freedom-tools/releases/tag/v2020.12.0>`_.
+
+Add the downloaded toolchain ``riscv64-unknown-elf-toolchain-.../bin``
+to the ``PATH`` Environment Variable.
+
+Check the RISC-V Toolchain:
+
+.. code:: console
+
+   $ riscv64-unknown-elf-gcc -v
+
+Building
+========
+
+To build NuttX for Ox64, :doc:`install the prerequisites </quickstart/install>` and
+:doc:`clone the git repositories </quickstart/install>` for ``nuttx`` and ``apps``.
+
+Configure the NuttX project and build the project:
+
+.. code:: console
+
+   $ cd nuttx
+   $ tools/configure.sh ox64:nsh
+   $ make
+   $ riscv64-unknown-elf-objcopy -O binary nuttx nuttx.bin
+
+This produces the NuttX Kernel ``nuttx.bin``.  Next, build the NuttX Apps Filesystem:
+
+.. code:: console
+
+   $ make export
+   $ pushd ../apps
+   $ tools/mkimport.sh -z -x ../nuttx/nuttx-export-*.tar.gz
+   $ make import
+   $ popd
+   $ genromfs -f initrd -d ../apps/bin -V "NuttXBootVol"
+
+This generates the Initial RAM Disk ``initrd``.
+
+Package the NuttX Kernel and Initial RAM Disk into a NuttX Image:
+
+.. code:: console
+
+   $ head -c 65536 /dev/zero >/tmp/nuttx.pad
+   $ cat nuttx.bin /tmp/nuttx.pad initrd >Image
+
+The NuttX Image ``Image`` will be copied to a microSD Card in the next step.
+
+Booting
+=======
+
+To boot NuttX on Ox64, flash
+`OpenSBI and U-Boot Bootloader <https://lupyuen.github.io/articles/ox64>`_ to Ox64.
+
+NuttX boots on Star64 via a microSD Card. Prepare a
+`Linux microSD Card <https://lupyuen.github.io/articles/ox64>`_ for Ox64.
+
+Copy the file ``Image`` from the previous section
+and overwrite the file on the microSD Card.
+
+Check that Ox64 is connected to our computer via a USB Serial Adapter at 2 Mbps.
+
+Insert the microSD Card into Ox64 and power up Ox64 via the Micro USB Port.
+NuttX boots on Ox64 and NuttShell (nsh) appears in the Serial Console.
+
+To see the available commands in NuttShell:
+
+.. code:: console
+
+   $ help
+
+Configurations
+==============
+
+nsh
+---
+
+Basic configuration that runs NuttShell (nsh).
+This configuration is focused on low level, command-line driver testing.
+Built-in applications are supported, but none are enabled.
+Serial Console is enabled on UART3 at 2 Mbps.
+
+Peripheral Support
+==================
+
+NuttX for Ox64 supports these peripherals:
+
+======================== ======= =====
+Peripheral               Support NOTES
+======================== ======= =====
+UART                     Yes
+======================== ======= =====
diff --git a/Documentation/platforms/risc-v/bl808/index.rst b/Documentation/platforms/risc-v/bl808/index.rst
new file mode 100644
index 0000000000..8befaecda3
--- /dev/null
+++ b/Documentation/platforms/risc-v/bl808/index.rst
@@ -0,0 +1,45 @@
+==================
+Bouffalo Lab BL808
+==================
+
+`Bouffalo Lab BL808 <https://github.com/bouffalolab/bl_docs/tree/main/BL808_RM/en>`_ is a 64-bit / 32-bit RISC-V SoC with 3 RISC-V Cores:
+
+- **D0 Multimedia Core:** T-Head C906 480 MHz 64-bit RISC-V CPU
+    - RV64IMAFCV
+    - Level 1 Instruction and Data Cache (Harvard architecture)
+    - Sv39 Memory Management Unit
+    - jTLB (128 entries)
+    - AXI 4.0 128-bit master interface
+    - Core Local Interrupt (CLINT) and Platform-Level Interrupt Controller (PLIC)
+    - 80 External Interrupt Sources
+    - BHT (8K) and BTB
+    - RISC-V PMP (8 configurable areas)
+
+- **M0 Wireless Core:** T-Head E907 320 MHz 32-bit RISC-V CPU
+    - RV32IMAFCP
+    - 32-bit / 16-bit Mixed Instruction Set
+    - RISC-V Machine Mode and User Mode
+    - 32 x 32-bit Integer General Purpose Registers (GPR)
+    - 32 x 32-bit / 64-bit Floating-Point GPRs
+    - AXI 4.0 main device interface and AHB 5.0 peripheral interface
+    - Instruction and Data Cache
+
+- **LP Low Power Core:** T-Head E902 150 MHz 32-bit RISC-V CPU
+    - RV32E[M]C
+
+- **RAM:** Embedded 64 MB PSRAM
+- **Wireless:** 2.4 GHz 1T1R WiFi 802.11 b/g/n, Bluetooth 5.2, Zigbee
+- **Ethernet:** 10 / 100 Mbps
+- **USB:** USB 2.0 OTG
+- **Audio:** Microphone and Speaker
+- **Video Input:** Dual-lane MIPI CSI
+- **Peripherals:** UART, SPI, I2C, PWM, SDH, EMAC, USB
+
+Supported Boards
+================
+
+.. toctree::
+   :glob:
+   :maxdepth: 1
+
+   boards/*/*
diff --git a/Documentation/platforms/risc-v/jh7110/boards/star64/index.rst b/Documentation/platforms/risc-v/jh7110/boards/star64/index.rst
index 84d9048094..8028e8b9d8 100644
--- a/Documentation/platforms/risc-v/jh7110/boards/star64/index.rst
+++ b/Documentation/platforms/risc-v/jh7110/boards/star64/index.rst
@@ -211,7 +211,7 @@ Serial Console is enabled on UART0 at 115.2 kbps.
 Peripheral Support
 ==================
 
-NuttX for PinePhone supports these peripherals:
+NuttX for Star64 supports these peripherals:
 
 ======================== ======= =====
 Peripheral               Support NOTES
diff --git a/boards/Kconfig b/boards/Kconfig
index 1c944deaf9..3f9e0afd70 100644
--- a/boards/Kconfig
+++ b/boards/Kconfig
@@ -1947,6 +1947,13 @@ config ARCH_BOARD_JH7110_STAR64
 		This options selects support for NuttX on PINE64 Star64 based
 		on StarFive JH7110 SoC.
 
+config ARCH_BOARD_BL808_OX64
+	bool "PINE64 Ox64"
+	depends on ARCH_CHIP_BL808
+	---help---
+		This options selects support for NuttX on PINE64 Ox64 based
+		on Bouffalo Lab BL808 SoC.
+
 config ARCH_BOARD_S32K118EVB
 	bool "NXP S32K118EVB"
 	depends on ARCH_CHIP_S32K118
@@ -3260,6 +3267,7 @@ config ARCH_BOARD
 	default "rv32m1-vega"               if ARCH_BOARD_RV32M1_VEGA
 	default "rv-virt"                   if ARCH_BOARD_QEMU_RV_VIRT
 	default "star64"                    if ARCH_BOARD_JH7110_STAR64
+	default "ox64"                      if ARCH_BOARD_BL808_OX64
 	default "sabre-6quad"               if ARCH_BOARD_SABRE_6QUAD
 	default "qemu-armv7a"               if ARCH_BOARD_QEMU_ARMV7A
 	default "qemu-armv8a"               if ARCH_BOARD_QEMU_ARMV8A
@@ -4151,6 +4159,9 @@ endif
 if ARCH_BOARD_JH7110_STAR64
 source "boards/risc-v/jh7110/star64/Kconfig"
 endif
+if ARCH_BOARD_BL808_OX64
+source "boards/risc-v/bl808/ox64/Kconfig"
+endif
 if ARCH_BOARD_ESP32C3_DEVKIT
 source "boards/risc-v/esp32c3/esp32c3-devkit/Kconfig"
 endif
diff --git a/boards/risc-v/bl808/ox64/Kconfig b/boards/risc-v/bl808/ox64/Kconfig
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/boards/risc-v/bl808/ox64/configs/nsh/defconfig b/boards/risc-v/bl808/ox64/configs/nsh/defconfig
new file mode 100644
index 0000000000..32aaa1ea5d
--- /dev/null
+++ b/boards/risc-v/bl808/ox64/configs/nsh/defconfig
@@ -0,0 +1,84 @@
+#
+# This file is autogenerated: PLEASE DO NOT EDIT IT.
+#
+# You can use "make menuconfig" to make any modifications to the installed .config file.
+# You can then do "make savedefconfig" to generate a new defconfig file that includes your
+# modifications.
+#
+# CONFIG_DISABLE_OS_API is not set
+# CONFIG_NSH_DISABLE_LOSMART is not set
+# CONFIG_STANDARD_SERIAL is not set
+CONFIG_ARCH="risc-v"
+CONFIG_ARCH_ADDRENV=y
+CONFIG_ARCH_BOARD="ox64"
+CONFIG_ARCH_BOARD_BL808_OX64=y
+CONFIG_ARCH_CHIP="bl808"
+CONFIG_ARCH_CHIP_BL808=y
+CONFIG_ARCH_DATA_NPAGES=128
+CONFIG_ARCH_DATA_VBASE=0x80100000
+CONFIG_ARCH_HEAP_NPAGES=128
+CONFIG_ARCH_HEAP_VBASE=0x80200000
+CONFIG_ARCH_INTERRUPTSTACK=2048
+CONFIG_ARCH_KERNEL_STACKSIZE=3072
+CONFIG_ARCH_PGPOOL_MAPPING=y
+CONFIG_ARCH_PGPOOL_PBASE=0x50600000
+CONFIG_ARCH_PGPOOL_SIZE=4194304
+CONFIG_ARCH_PGPOOL_VBASE=0x50600000
+CONFIG_ARCH_RISCV=y
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_ARCH_TEXT_NPAGES=128
+CONFIG_ARCH_TEXT_VBASE=0x80000000
+CONFIG_ARCH_USE_MMU=y
+CONFIG_ARCH_USE_MPU=y
+CONFIG_ARCH_USE_S_MODE=y
+CONFIG_BL808_UART3=y
+CONFIG_BOARDCTL_ROMDISK=y
+CONFIG_BOARD_LATE_INITIALIZE=y
+CONFIG_BOARD_LOOPSPERMSEC=116524
+CONFIG_BUILD_KERNEL=y
+CONFIG_DEBUG_ASSERTIONS=y
+CONFIG_DEBUG_ASSERTIONS_EXPRESSION=y
+CONFIG_DEBUG_FEATURES=y
+CONFIG_DEBUG_FULLOPT=y
+CONFIG_DEBUG_SYMBOLS=y
+CONFIG_DEV_ZERO=y
+CONFIG_ELF=y
+CONFIG_EXAMPLES_HELLO=m
+CONFIG_FS_PROCFS=y
+CONFIG_FS_ROMFS=y
+CONFIG_IDLETHREAD_STACKSIZE=3072
+CONFIG_INIT_FILEPATH="/system/bin/init"
+CONFIG_INIT_MOUNT=y
+CONFIG_INIT_MOUNT_FLAGS=0x1
+CONFIG_INIT_MOUNT_TARGET="/system/bin"
+CONFIG_INIT_STACKSIZE=3072
+CONFIG_INTELHEX_BINARY=y
+CONFIG_LIBC_ENVPATH=y
+CONFIG_LIBC_EXECFUNCS=y
+CONFIG_LIBC_PERROR_STDOUT=y
+CONFIG_LIBC_STRERROR=y
+CONFIG_MEMSET_64BIT=y
+CONFIG_MEMSET_OPTSPEED=y
+CONFIG_MM_PGALLOC=y
+CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
+CONFIG_NSH_ARCHINIT=y
+CONFIG_NSH_FILEIOSIZE=512
+CONFIG_NSH_FILE_APPS=y
+CONFIG_NSH_READLINE=y
+CONFIG_PATH_INITIAL="/system/bin"
+CONFIG_RAM_SIZE=1048576
+CONFIG_RAM_START=0x50200000
+CONFIG_READLINE_CMD_HISTORY=y
+CONFIG_RR_INTERVAL=200
+CONFIG_SCHED_LPWORK=y
+CONFIG_SCHED_WAITPID=y
+CONFIG_STACK_COLORATION=y
+CONFIG_START_MONTH=12
+CONFIG_START_YEAR=2021
+CONFIG_SYMTAB_ORDEREDBYNAME=y
+CONFIG_SYSTEM_NSH=y
+CONFIG_SYSTEM_NSH_PROGNAME="init"
+CONFIG_TESTING_GETPRIME=y
+CONFIG_UART3_BAUD=2000000
+CONFIG_UART3_SERIAL_CONSOLE=y
+CONFIG_USEC_PER_TICK=1000
diff --git a/boards/risc-v/bl808/ox64/include/board.h b/boards/risc-v/bl808/ox64/include/board.h
new file mode 100644
index 0000000000..59546c4c72
--- /dev/null
+++ b/boards/risc-v/bl808/ox64/include/board.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+ * boards/risc-v/bl808/ox64/include/board.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 __BOARDS_RISCV_BL808_OX64_INCLUDE_BOARD_H
+#define __BOARDS_RISCV_BL808_OX64_INCLUDE_BOARD_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define LED_STARTED       0  /* N/A */
+#define LED_HEAPALLOCATE  1  /* N/A */
+#define LED_IRQSENABLED   2  /* N/A */
+#define LED_STACKCREATED  3  /* N/A */
+#define LED_INIRQ         4  /* N/A */
+#define LED_SIGNAL        5  /* N/A */
+#define LED_ASSERTION     6  /* N/A */
+#define LED_PANIC         7  /* N/A */
+#define LED_CPU           8  /* LED */
+
+/****************************************************************************
+ * 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
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: bl808_boardinitialize
+ ****************************************************************************/
+
+void bl808_boardinitialize(void);
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+#endif /* __ASSEMBLY__ */
+#endif /* __BOARDS_RISCV_BL808_OX64_INCLUDE_BOARD_H */
diff --git a/boards/risc-v/bl808/ox64/include/board_memorymap.h b/boards/risc-v/bl808/ox64/include/board_memorymap.h
new file mode 100644
index 0000000000..5221fb7847
--- /dev/null
+++ b/boards/risc-v/bl808/ox64/include/board_memorymap.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+ * boards/risc-v/bl808/ox64/include/board_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 __BOARDS_RISCV_BL808_OX64_INCLUDE_BOARD_MEMORYMAP_H
+#define __BOARDS_RISCV_BL808_OX64_INCLUDE_BOARD_MEMORYMAP_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stdint.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* DDR start address */
+
+#define BL808_DDR_BASE   (0x50200000)
+#define BL808_DDR_SIZE   (0x03e00000)
+
+/* Kernel code memory (RX) */
+
+#define KFLASH_START    (uintptr_t)__kflash_start
+#define KFLASH_SIZE     (uintptr_t)__kflash_size
+#define KSRAM_START     (uintptr_t)__ksram_start
+#define KSRAM_SIZE      (uintptr_t)__ksram_size
+#define KSRAM_END       (uintptr_t)__ksram_end
+
+/* Kernel RAM (RW) */
+
+#define PGPOOL_START    (uintptr_t)__pgheap_start
+#define PGPOOL_SIZE     (uintptr_t)__pgheap_size
+
+/* Page pool (RWX) */
+
+#define PGPOOL_START    (uintptr_t)__pgheap_start
+#define PGPOOL_SIZE     (uintptr_t)__pgheap_size
+#define PGPOOL_END      (PGPOOL_START + PGPOOL_SIZE)
+
+/* Ramdisk (RW) */
+
+#define RAMDISK_START   (uintptr_t)__ramdisk_start
+#define RAMDISK_SIZE    (uintptr_t)__ramdisk_size
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/* Kernel code memory (RX)  */
+
+extern uint8_t          __kflash_start[];
+extern uint8_t          __kflash_size[];
+
+/* Kernel RAM (RW) */
+
+extern uint8_t          __ksram_start[];
+extern uint8_t          __ksram_size[];
+extern uint8_t          __ksram_end[];
+
+/* Page pool (RWX) */
+
+extern uint8_t          __pgheap_start[];
+extern uint8_t          __pgheap_size[];
+
+/* Ramdisk (RW) */
+
+extern uint8_t          __ramdisk_start[];
+extern uint8_t          __ramdisk_size[];
+
+#endif /* __BOARDS_RISCV_BL808_OX64_INCLUDE_BOARD_MEMORYMAP_H */
diff --git a/boards/risc-v/bl808/ox64/scripts/Make.defs b/boards/risc-v/bl808/ox64/scripts/Make.defs
new file mode 100644
index 0000000000..8675982571
--- /dev/null
+++ b/boards/risc-v/bl808/ox64/scripts/Make.defs
@@ -0,0 +1,43 @@
+############################################################################
+# boards/risc-v/bl808/ox64/scripts/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.
+#
+############################################################################
+
+include $(TOPDIR)/.config
+include $(TOPDIR)/tools/Config.mk
+include $(TOPDIR)/arch/risc-v/src/common/Toolchain.defs
+
+LDSCRIPT = ld.script
+ARCHSCRIPT += $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)
+ARCHPICFLAGS = -fpic -msingle-pic-base
+
+CFLAGS := $(ARCHCFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
+CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
+CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
+CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS)
+CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS)
+AFLAGS += $(CFLAGS) -D__ASSEMBLY__
+
+# ELF module definitions
+
+CELFFLAGS = $(CFLAGS)
+CXXELFFLAGS = $(CXXFLAGS)
+
+LDELFFLAGS = --oformat elf64-littleriscv
+LDELFFLAGS += -r -e main
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/libelf/gnu-elf.ld)
diff --git a/boards/risc-v/bl808/ox64/scripts/ld.script b/boards/risc-v/bl808/ox64/scripts/ld.script
new file mode 100644
index 0000000000..94f115dd79
--- /dev/null
+++ b/boards/risc-v/bl808/ox64/scripts/ld.script
@@ -0,0 +1,150 @@
+/****************************************************************************
+ * boards/risc-v/bl808/ox64/scripts/ld.script
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+MEMORY
+{
+    kflash (rx) : ORIGIN = 0x50200000, LENGTH = 2048K   /* w/ cache */
+    ksram (rwx) : ORIGIN = 0x50400000, LENGTH = 2048K   /* w/ cache */
+    pgram (rwx) : ORIGIN = 0x50600000, LENGTH = 4096K   /* w/ cache */
+    ramdisk (rwx) : ORIGIN = 0x50A00000, LENGTH = 16M   /* w/ cache */
+}
+
+OUTPUT_ARCH("riscv")
+
+/* Provide the kernel boundaries */
+
+__kflash_start = ORIGIN(kflash);
+__kflash_size = LENGTH(kflash);
+__ksram_start = ORIGIN(ksram);
+__ksram_size = LENGTH(ksram);
+__ksram_end = ORIGIN(ksram) + LENGTH(ksram);
+
+/* Page heap */
+
+__pgheap_start = ORIGIN(pgram);
+__pgheap_size = LENGTH(pgram) + LENGTH(ramdisk);
+
+/* Application ramdisk */
+
+__ramdisk_start = ORIGIN(ramdisk);
+__ramdisk_size = LENGTH(ramdisk);
+__ramdisk_end  = ORIGIN(ramdisk) + LENGTH(ramdisk);
+
+SECTIONS
+{
+  . = 0x50200000;
+
+  .text :
+    {
+      _stext = . ;
+      *(.text)
+      *(.text.*)
+      *(.gnu.warning)
+      *(.stub)
+      *(.glue_7)
+      *(.glue_7t)
+      *(.jcr)
+
+      /* C++ support:  The .init and .fini sections contain specific logic
+       * to manage static constructors and destructors.
+       */
+
+      *(.gnu.linkonce.t.*)
+      *(.init)             /* Old ABI */
+      *(.fini)             /* Old ABI */
+      _etext = . ;
+    }
+
+  .rodata :
+    {
+      _srodata = . ;
+      *(.rodata)
+      *(.rodata1)
+      *(.rodata.*)
+      *(.gnu.linkonce.r*)
+      _erodata = . ;
+    }
+
+  .tdata : {
+      _stdata = ABSOLUTE(.);
+      *(.tdata .tdata.* .gnu.linkonce.td.*);
+      _etdata = ABSOLUTE(.);
+  }
+
+  .tbss : {
+      _stbss = ABSOLUTE(.);
+      *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon);
+      _etbss = ABSOLUTE(.);
+  }
+
+  _eronly = ABSOLUTE(.);
+
+  .data :
+    {
+      _sdata = . ;
+      *(.data)
+      *(.data1)
+      *(.data.*)
+      *(.gnu.linkonce.d*)
+      . = ALIGN(4);
+      _edata = . ;
+    }
+
+  .bss :
+    {
+      _sbss = . ;
+      *(.bss)
+      *(.bss.*)
+      *(.sbss)
+      *(.sbss.*)
+      *(.gnu.linkonce.b*)
+      *(COMMON)
+      _ebss = . ;
+    } > ksram
+
+    /* Page tables here, align to 4K boundary */
+
+    .pgtables (NOLOAD) : ALIGN(0x1000) {
+        *(.pgtables)
+        . = ALIGN(4);
+    } > ksram
+
+    /* Stack top */
+
+    .stack_top : {
+        . = ALIGN(32);
+        _ebss = ABSOLUTE(.);
+    } > ksram
+
+    /* Stabs debugging sections.    */
+
+    .stab 0 : { *(.stab) }
+    .stabstr 0 : { *(.stabstr) }
+    .stab.excl 0 : { *(.stab.excl) }
+    .stab.exclstr 0 : { *(.stab.exclstr) }
+    .stab.index 0 : { *(.stab.index) }
+    .stab.indexstr 0 : { *(.stab.indexstr) }
+    .comment 0 : { *(.comment) }
+    .debug_abbrev 0 : { *(.debug_abbrev) }
+    .debug_info 0 : { *(.debug_info) }
+    .debug_line 0 : { *(.debug_line) }
+    .debug_pubnames 0 : { *(.debug_pubnames) }
+    .debug_aranges 0 : { *(.debug_aranges) }
+}
diff --git a/boards/risc-v/bl808/ox64/src/.gitignore b/boards/risc-v/bl808/ox64/src/.gitignore
new file mode 100644
index 0000000000..cc92d189b5
--- /dev/null
+++ b/boards/risc-v/bl808/ox64/src/.gitignore
@@ -0,0 +1,2 @@
+etctmp
+etctmp.c
diff --git a/boards/risc-v/bl808/ox64/src/Makefile b/boards/risc-v/bl808/ox64/src/Makefile
new file mode 100644
index 0000000000..0131625ea2
--- /dev/null
+++ b/boards/risc-v/bl808/ox64/src/Makefile
@@ -0,0 +1,27 @@
+############################################################################
+# boards/risc-v/bl808/ox64/src/Makefile
+#
+# 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.
+#
+############################################################################
+
+include $(TOPDIR)/Make.defs
+
+RCSRCS = etc/init.d/rc.sysinit etc/init.d/rcS
+
+CSRCS = bl808_appinit.c
+
+include $(TOPDIR)/boards/Board.mk
diff --git a/boards/risc-v/bl808/ox64/src/bl808_appinit.c b/boards/risc-v/bl808/ox64/src/bl808_appinit.c
new file mode 100644
index 0000000000..d960bc7f4c
--- /dev/null
+++ b/boards/risc-v/bl808/ox64/src/bl808_appinit.c
@@ -0,0 +1,167 @@
+/****************************************************************************
+ * boards/risc-v/bl808/ox64/src/bl808_appinit.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 <stdbool.h>
+#include <stdio.h>
+#include <syslog.h>
+#include <errno.h>
+
+#include <nuttx/board.h>
+#include <nuttx/drivers/ramdisk.h>
+#include <sys/mount.h>
+#include <sys/boardctl.h>
+#include <arch/board/board_memorymap.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Ramdisk Definition */
+
+#define SECTORSIZE   512
+#define NSECTORS(b)  (((b) + SECTORSIZE - 1) / SECTORSIZE)
+#define RAMDISK_DEVICE_MINOR 0
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: mount_ramdisk
+ *
+ * Description:
+ *  Mount a ramdisk defined in the ld.script to /dev/ramX.  The ramdisk is
+ *  intended to contain a romfs with applications which can be spawned at
+ *  runtime.
+ *
+ * Returned Value:
+ *   OK is returned on success.
+ *   -ERRORNO is returned on failure.
+ *
+ ****************************************************************************/
+
+static int mount_ramdisk(void)
+{
+  int ret;
+  struct boardioc_romdisk_s desc;
+
+  desc.minor    = RAMDISK_DEVICE_MINOR;
+  desc.nsectors = NSECTORS((ssize_t)__ramdisk_size);
+  desc.sectsize = SECTORSIZE;
+  desc.image    = __ramdisk_start;
+
+  ret = boardctl(BOARDIOC_ROMDISK, (uintptr_t)&desc);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "Ramdisk register failed: %s\n", strerror(errno));
+      syslog(LOG_ERR, "Ramdisk mountpoint /dev/ram%d\n",
+             RAMDISK_DEVICE_MINOR);
+      syslog(LOG_ERR, "Ramdisk length %lu, origin %lx\n",
+             (ssize_t)__ramdisk_size, (uintptr_t)__ramdisk_start);
+    }
+
+  return ret;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_app_initialize
+ *
+ * Description:
+ *   Perform architecture specific initialization
+ *
+ * Input Parameters:
+ *   arg - The boardctl() argument is passed to the board_app_initialize()
+ *         implementation without modification.  The argument has no
+ *         meaning to NuttX; the meaning of the argument is a contract
+ *         between the board-specific initialization logic and the
+ *         matching application logic.  The value could be such things as a
+ *         mode enumeration value, a set of DIP switch switch settings, a
+ *         pointer to configuration data read from a file or serial FLASH,
+ *         or whatever you would like to do with it.  Every implementation
+ *         should accept zero/NULL as a default configuration.
+ *
+ * Returned Value:
+ *   Zero (OK) is returned on success; a negated errno value is returned on
+ *   any failure to indicate the nature of the failure.
+ *
+ ****************************************************************************/
+
+int board_app_initialize(uintptr_t arg)
+{
+#ifdef CONFIG_BOARD_LATE_INITIALIZE
+  /* Board initialization already performed by board_late_initialize() */
+
+  return OK;
+#else
+  /* Perform board-specific initialization */
+
+#ifdef CONFIG_NSH_ARCHINIT
+
+  mount(NULL, "/proc", "procfs", 0, NULL);
+
+#endif
+
+  return OK;
+#endif
+}
+
+/****************************************************************************
+ * Name: board_late_initialize
+ *
+ * Description:
+ *   If CONFIG_BOARD_LATE_INITIALIZE is selected, then an additional
+ *   initialization call will be performed in the boot-up sequence to a
+ *   function called board_late_initialize().  board_late_initialize() will
+ *   be called after up_initialize() and board_early_initialize() and just
+ *   before the initial application is started.  This additional
+ *   initialization phase may be used, for example, to initialize board-
+ *   specific device drivers for which board_early_initialize() is not
+ *   suitable.
+ *
+ *   Waiting for events, use of I2C, SPI, etc are permissible in the context
+ *   of board_late_initialize().  That is because board_late_initialize()
+ *   will run on a temporary, internal kernel thread.
+ *
+ ****************************************************************************/
+
+void board_late_initialize(void)
+{
+  /* Mount the RAM Disk */
+
+  mount_ramdisk();
+
+  /* Perform board-specific initialization */
+
+#ifdef CONFIG_NSH_ARCHINIT
+
+  mount(NULL, "/proc", "procfs", 0, NULL);
+
+#endif
+}
diff --git a/boards/risc-v/bl808/ox64/src/etc/init.d/rc.sysinit b/boards/risc-v/bl808/ox64/src/etc/init.d/rc.sysinit
new file mode 100644
index 0000000000..ab47deb747
--- /dev/null
+++ b/boards/risc-v/bl808/ox64/src/etc/init.d/rc.sysinit
@@ -0,0 +1,19 @@
+/****************************************************************************
+ * boards/risc-v/bl808/ox64/src/etc/init.d/rc.sysinit
+ *
+ * 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.
+ *
+ ****************************************************************************/
diff --git a/boards/risc-v/bl808/ox64/src/etc/init.d/rcS b/boards/risc-v/bl808/ox64/src/etc/init.d/rcS
new file mode 100644
index 0000000000..6651c257d2
--- /dev/null
+++ b/boards/risc-v/bl808/ox64/src/etc/init.d/rcS
@@ -0,0 +1,19 @@
+/****************************************************************************
+ * boards/risc-v/bl808/ox64/src/etc/init.d/rcS
+ *
+ * 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.
+ *
+ ****************************************************************************/