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.
+ *
+ ****************************************************************************/