risc-v: Initial support for CanMV-k230 board and K230 chip
The code is mainly derived from the NuttX qemu-rv/rv-virt codebase. Major changes: - boards/Kconfig: add new BOARD_K230_CANMV - arch/risc-v/Kconfig: add new CHIP_K230 chip and ARCH_RV_MMIO_BITS - arch/risc-v/src/common/riscv_mtimer.c: use ARCH_RV_MMIO_BITS to select MMIO access width New additions: - arch/risc-v/include/k230/: k230 SoC definitions - arch/risc-v/src/k230/: k230 SoC sources - boards/risc-v/k230/canmv230/: CanMV-K230 board sources and configs - Documentation/platforms/risc-v/k230/: simple doc Note that only FLAT build works for canmv230 now. This PR has changes in RiscV common layer thus may affect other RiscV ports It changes the mtime/mtimecmp access control from using config ARCH_RV64 to newly intorduced config ARCH_RV_MMIO_BITS. Original design uses ARCH_RV64 to select 64bit MMIO in riscv_mtimer.c, this can't cope with the situation with K230 --- it has ARCH_RV64 but only can do 32bit MMIO. So a new ARCH_RV_MMIO_BITS config has been introduced. Its value depicts the MMIO width in bits. The MMIO_BITS defaults to 32/64 for RV32/ RV64 respectively. This allows the macro to replace current use of ARCH_RV64 in riscv_mtimer.c. The new MMIO_BITS config is a derived one, and for RiscV chips with equal CPU and MMIO widths there is no need to explicitly set it as the default rule will do that. Only chips with different CPU and MMIO widths need set it in Kconfig. So by design this change should be safe but RiscV ports should be checked. "ostest" verification has been done for: - canmv230/nsh - rv-vivt/nsh - rv-virt/nsh64 configuration generation and manual check of derived RV_MMIO_BITS has been done for: - star64/nsh - arty_a7/nsh - bl602evb/nsh Signed-off-by: Yanfeng Liu <yfliu2008@qq.com>
This commit is contained in:
parent
751bc1528a
commit
75d0c2946d
35 changed files with 2606 additions and 2 deletions
|
@ -0,0 +1,63 @@
|
|||
=============
|
||||
CanMV K230
|
||||
=============
|
||||
|
||||
The `Kendryte K230 <https://www.canaan.io/product/k230>`_ SoC contains two indepedent T-Head C908 based RV64GC CPU cores. The CPU1 even has RVV1.0 vector extension and operates at higher speed. The SoC contains accelerators for depth image processing, audio processing and neural network inferencing etc.
|
||||
|
||||
The `CanMV K230 <https://developer.canaan-creative.com/k230/dev/zh/CanMV_K230_%E6%95%99%E7%A8%8B.html>`_ is a raspberry-pi sized single board computer with 512MB DRAM and a microSD card slot for booting. It comes with serial console, Ethernet, HDMI and USB/OTG ports. Unfortuunately it doesn't support JTAG alike debugging interfaces.
|
||||
|
||||
The `K230 SDK <https://github.com/kendryte/k230_sdk>`_ contains source code, libraries and user guides for booting up an AMP enviroment with Linux on CPU0 and RT-Thread on CPU1.
|
||||
|
||||
K230 boots from CPU0 and loads U-Boot into DRAM first, then U-Boot kicks off OpenSBI wrapped Linux/RTT OS images on respective CPU cores accordingly.
|
||||
|
||||
The K230 U-Boot operates in machine mode, thus provides an ideal environment for NuttX. allowing one to run flat or kernel builds in theory.
|
||||
|
||||
|
||||
Preparations
|
||||
============
|
||||
|
||||
Please follow the K230 SDK to prepare a booting SD card for the board, or use prebuilt boot image from `here <https://kendryte-download.canaan-creative.com/developer/k230/k230_canmv_sdcard_v1.2_nncase_v2.5.1.img.gz>`_.
|
||||
|
||||
Make sure that before trying NuttX:
|
||||
|
||||
- The board can boot default SDK image normally.
|
||||
- U-Boot console can be accessed from host(e.g. `minicom -D /dev/ttyACM0`).
|
||||
- U-Boot has access to a TFTP service is available.
|
||||
- You can drop files to the TFTP service folder.
|
||||
|
||||
Note for below NuttX tests, the SD image is only used to enter U-Boot console.
|
||||
|
||||
RISC-V Toolchain
|
||||
================
|
||||
|
||||
Before building NuttX for Star64, download the **RISC-V Toolchain riscv64-unknown-elf** from `XPack <https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack>`_ or use "gcc-riscv64-unknown-elf" on Ubuntu.
|
||||
|
||||
|
||||
Building
|
||||
========
|
||||
|
||||
To build NuttX for CanMV, :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 canmv230:nsh
|
||||
$ make -j4
|
||||
|
||||
There should have `nuttx.bin` generated.
|
||||
|
||||
Booting
|
||||
=======
|
||||
|
||||
Copy the `nuttx.bin` to the TFTP service folder and work with the U-Boot console:
|
||||
|
||||
.. code:: console
|
||||
|
||||
k230# usb start
|
||||
k230# ping $serverip
|
||||
k230# tftp 8000000 nuttx.bin
|
||||
k230# boot_barememtal 0 8000000 $filesize
|
||||
|
||||
Then the `nsh> `console should appear, type `help` to see available commands.
|
12
Documentation/platforms/risc-v/k230/index.rst
Normal file
12
Documentation/platforms/risc-v/k230/index.rst
Normal file
|
@ -0,0 +1,12 @@
|
|||
=============
|
||||
Kendryte K230
|
||||
=============
|
||||
|
||||
Supported Boards
|
||||
================
|
||||
|
||||
.. toctree::
|
||||
:glob:
|
||||
:maxdepth: 1
|
||||
|
||||
boards/*/*
|
|
@ -230,6 +230,27 @@ config ARCH_CHIP_BL808
|
|||
---help---
|
||||
Bouffalo Lab BL808 SoC.
|
||||
|
||||
config ARCH_CHIP_K230
|
||||
bool "Kendryte K230"
|
||||
select ARCH_RV64
|
||||
select ARCH_RV_ISA_M
|
||||
select ARCH_RV_ISA_A
|
||||
select ARCH_RV_ISA_C
|
||||
select ARCH_HAVE_FPU
|
||||
select ARCH_HAVE_DPFPU
|
||||
select ARCH_HAVE_MISALIGN_EXCEPTION
|
||||
select ARCH_HAVE_MPU
|
||||
select ARCH_HAVE_MMU
|
||||
select ARCH_MMU_TYPE_SV39
|
||||
select ARCH_HAVE_ADDRENV
|
||||
select ARCH_NEED_ADDRENV_MAPPING
|
||||
select ARCH_HAVE_S_MODE
|
||||
select ONESHOT
|
||||
select ALARM_ARCH
|
||||
---help---
|
||||
Kendryte K230 SoC (RV64GCV and RV64GCVX C908 cores).
|
||||
|
||||
|
||||
config ARCH_CHIP_RISCV_CUSTOM
|
||||
bool "Custom RISC-V chip"
|
||||
select ARCH_CHIP_CUSTOM
|
||||
|
@ -260,6 +281,14 @@ config ARCH_RV_ISA_C
|
|||
bool
|
||||
default n
|
||||
|
||||
config ARCH_RV_MMIO_BITS
|
||||
int
|
||||
# special cases
|
||||
default 32 if ARCH_CHIP_K230
|
||||
# general fallbacks
|
||||
default 32 if ARCH_RV32
|
||||
default 64 if ARCH_RV64
|
||||
|
||||
config ARCH_FAMILY
|
||||
string
|
||||
default "rv32" if ARCH_RV32
|
||||
|
@ -281,6 +310,7 @@ config ARCH_CHIP
|
|||
default "hpm6750" if ARCH_CHIP_HPM6750
|
||||
default "jh7110" if ARCH_CHIP_JH7110
|
||||
default "bl808" if ARCH_CHIP_BL808
|
||||
default "k230" if ARCH_CHIP_K230
|
||||
|
||||
config ARCH_RISCV_INTXCPT_EXTENSIONS
|
||||
bool "RISC-V Integer Context Extensions"
|
||||
|
@ -449,4 +479,7 @@ endif
|
|||
if ARCH_CHIP_BL808
|
||||
source "arch/risc-v/src/bl808/Kconfig"
|
||||
endif
|
||||
if ARCH_CHIP_K230
|
||||
source "arch/risc-v/src/k230/Kconfig"
|
||||
endif
|
||||
endif
|
||||
|
|
24
arch/risc-v/include/k230/chip.h
Normal file
24
arch/risc-v/include/k230/chip.h
Normal file
|
@ -0,0 +1,24 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/include/k230/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_K230_CHIP_H
|
||||
#define __ARCH_RISCV_INCLUDE_K230_CHIP_H
|
||||
|
||||
#endif /* __ARCH_RISCV_INCLUDE_K230_CHIP_H */
|
38
arch/risc-v/include/k230/irq.h
Normal file
38
arch/risc-v/include/k230/irq.h
Normal file
|
@ -0,0 +1,38 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/include/k230/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_K230_IRQ_H
|
||||
#define __ARCH_RISCV_INCLUDE_K230_IRQ_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* Map RISC-V exception code to NuttX IRQ */
|
||||
|
||||
#define K230_IRQ_UART0 (RISCV_IRQ_MEXT + 16)
|
||||
|
||||
#define NR_IRQS (K230_IRQ_UART0 + 1)
|
||||
|
||||
#endif /* __ARCH_RISCV_INCLUDE_K230_IRQ_H */
|
|
@ -83,7 +83,7 @@ static const struct oneshot_operations_s g_riscv_mtimer_ops =
|
|||
#ifndef CONFIG_ARCH_USE_S_MODE
|
||||
static uint64_t riscv_mtimer_get_mtime(struct riscv_mtimer_lowerhalf_s *priv)
|
||||
{
|
||||
#ifdef CONFIG_ARCH_RV64
|
||||
#if CONFIG_ARCH_RV_MMIO_BITS == 64
|
||||
/* priv->mtime is -1, means this SoC:
|
||||
* 1. does NOT support 64bit/DWORD write for the mtimer compare value regs,
|
||||
* 2. has NO memory mapped regs which hold the value of mtimer counter,
|
||||
|
@ -109,7 +109,7 @@ static uint64_t riscv_mtimer_get_mtime(struct riscv_mtimer_lowerhalf_s *priv)
|
|||
static void riscv_mtimer_set_mtimecmp(struct riscv_mtimer_lowerhalf_s *priv,
|
||||
uint64_t value)
|
||||
{
|
||||
#ifdef CONFIG_ARCH_RV64
|
||||
#if CONFIG_ARCH_RV_MMIO_BITS == 64
|
||||
if (-1 != priv->mtime)
|
||||
{
|
||||
putreg64(value, priv->mtimecmp);
|
||||
|
|
0
arch/risc-v/src/k230/Kconfig
Normal file
0
arch/risc-v/src/k230/Kconfig
Normal file
38
arch/risc-v/src/k230/Make.defs
Normal file
38
arch/risc-v/src/k230/Make.defs
Normal file
|
@ -0,0 +1,38 @@
|
|||
############################################################################
|
||||
# arch/risc-v/src/k230/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 common/Make.defs
|
||||
|
||||
# Specify our HEAD assembly file. This will be linked as
|
||||
# the first object file, so it will appear at address 0
|
||||
HEAD_ASRC = k230_head.S
|
||||
|
||||
# Specify our C code within this directory to be included
|
||||
CHIP_CSRCS = k230_start.c k230_irq_dispatch.c k230_irq.c
|
||||
CHIP_CSRCS += k230_timerisr.c k230_allocateheap.c
|
||||
|
||||
ifeq ($(CONFIG_BUILD_KERNEL),y)
|
||||
CHIP_CSRCS += k230_mm_init.c
|
||||
CMN_ASRCS += k230_exception_m.S
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_MM_PGALLOC),y)
|
||||
CHIP_CSRCS += k230_pgalloc.c
|
||||
endif
|
75
arch/risc-v/src/k230/chip.h
Normal file
75
arch/risc-v/src/k230/chip.h
Normal file
|
@ -0,0 +1,75 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/k230/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_K230_CHIP_H
|
||||
#define __ARCH_RISCV_SRC_K230_CHIP_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
/* Include the chip capabilities file */
|
||||
|
||||
#include <arch/k230/chip.h>
|
||||
|
||||
#include "k230_memorymap.h"
|
||||
|
||||
#include "hardware/k230_memorymap.h"
|
||||
#include "hardware/k230_plic.h"
|
||||
|
||||
#include "riscv_internal.h"
|
||||
#include "riscv_percpu.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Macro Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
|
||||
/****************************************************************************
|
||||
* Name: setintstack
|
||||
*
|
||||
* Description:
|
||||
* Set the current stack pointer to the "top" the correct interrupt stack
|
||||
* for the current CPU.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_SMP) && CONFIG_ARCH_INTERRUPTSTACK > 15
|
||||
.macro setintstack tmp0, tmp1
|
||||
riscv_mhartid \tmp0
|
||||
li \tmp1, STACK_ALIGN_DOWN(CONFIG_ARCH_INTERRUPTSTACK)
|
||||
mul \tmp1, \tmp0, \tmp1
|
||||
la \tmp0, g_intstacktop
|
||||
sub sp, \tmp0, \tmp1
|
||||
.endm
|
||||
#endif /* CONFIG_SMP && CONFIG_ARCH_INTERRUPTSTACK > 15 */
|
||||
|
||||
#if CONFIG_ARCH_INTERRUPTSTACK > 15
|
||||
#if !defined(CONFIG_SMP) && defined(CONFIG_ARCH_USE_S_MODE)
|
||||
.macro setintstack tmp0, tmp1
|
||||
csrr \tmp0, CSR_SCRATCH
|
||||
REGLOAD sp, RISCV_PERCPU_IRQSTACK(\tmp0)
|
||||
.endm
|
||||
#endif /* !defined(CONFIG_SMP) && defined(CONFIG_ARCH_USE_S_MODE) */
|
||||
#endif /* CONFIG_ARCH_INTERRUPTSTACK > 15 */
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ARCH_RISCV_SRC_K230_CHIP_H */
|
40
arch/risc-v/src/k230/hardware/k230_clint.h
Normal file
40
arch/risc-v/src/k230/hardware/k230_clint.h
Normal file
|
@ -0,0 +1,40 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/k230/hardware/k230_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_K230_HARDWARE_K230_CLINT_H
|
||||
#define __ARCH_RISCV_SRC_K230_HARDWARE_K230_CLINT_H
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define K230_CLINT_MSIP (K230_CLINT_BASE + 0x0000)
|
||||
#define K230_CLINT_MTIMECMP (K230_CLINT_BASE + 0x4000)
|
||||
#define K230_CLINT_MTIME (K230_CLINT_BASE + 0xBFF8)
|
||||
|
||||
#define RISCV_CLINT_MSIP K230_CLINT_MSIP
|
||||
|
||||
#ifdef CONFIG_ARCH_USE_S_MODE
|
||||
# define RISCV_IPI
|
||||
#else
|
||||
# define RISCV_IPI RISCV_CLINT_MSIP
|
||||
#endif
|
||||
|
||||
#endif /* __ARCH_RISCV_SRC_K230_HARDWARE_K230_CLINT_H */
|
33
arch/risc-v/src/k230/hardware/k230_memorymap.h
Normal file
33
arch/risc-v/src/k230/hardware/k230_memorymap.h
Normal file
|
@ -0,0 +1,33 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/k230/hardware/k230_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_K230_HARDWARE_K230_MEMORYMAP_H
|
||||
#define __ARCH_RISCV_SRC_K230_HARDWARE_K230_MEMORYMAP_H
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* Register Base Address ****************************************************/
|
||||
|
||||
#define K230_PLIC_BASE 0xF00000000
|
||||
#define K230_CLINT_BASE (K230_PLIC_BASE + 0x04000000)
|
||||
|
||||
#endif /* __ARCH_RISCV_SRC_K230_HARDWARE_K230_MEMORYMAP_H */
|
49
arch/risc-v/src/k230/hardware/k230_plic.h
Normal file
49
arch/risc-v/src/k230/hardware/k230_plic.h
Normal file
|
@ -0,0 +1,49 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/k230/hardware/k230_plic.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_K230_HARDWARE_K230_PLIC_H
|
||||
#define __ARCH_RISCV_SRC_K230_HARDWARE_K230_PLIC_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define K230_PLIC_PRIORITY (K230_PLIC_BASE + 0x000000)
|
||||
#define K230_PLIC_PENDING1 (K230_PLIC_BASE + 0x001000)
|
||||
|
||||
#ifdef CONFIG_ARCH_USE_S_MODE
|
||||
# define K230_PLIC_ENABLE1 (K230_PLIC_BASE + 0x002080)
|
||||
# define K230_PLIC_ENABLE2 (K230_PLIC_BASE + 0x002084)
|
||||
# define K230_PLIC_THRESHOLD (K230_PLIC_BASE + 0x201000)
|
||||
# define K230_PLIC_CLAIM (K230_PLIC_BASE + 0x201004)
|
||||
#else
|
||||
# define K230_PLIC_ENABLE1 (K230_PLIC_BASE + 0x002000)
|
||||
# define K230_PLIC_ENABLE2 (K230_PLIC_BASE + 0x002004)
|
||||
# define K230_PLIC_THRESHOLD (K230_PLIC_BASE + 0x200000)
|
||||
# define K230_PLIC_CLAIM (K230_PLIC_BASE + 0x200004)
|
||||
#endif
|
||||
|
||||
#endif /* __ARCH_RISCV_SRC_K230_HARDWARE_K230_PLIC_H */
|
150
arch/risc-v/src/k230/k230_allocateheap.c
Normal file
150
arch/risc-v/src/k230/k230_allocateheap.c
Normal file
|
@ -0,0 +1,150 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/k230/k230_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 <nuttx/kmalloc.h>
|
||||
#include <nuttx/userspace.h>
|
||||
|
||||
#include <nuttx/arch.h>
|
||||
|
||||
#ifdef CONFIG_MM_KERNEL_HEAP
|
||||
#include <arch/board/board_memorymap.h>
|
||||
#endif
|
||||
|
||||
#include "riscv_internal.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_MM_KERNEL_HEAP
|
||||
#define KRAM_END KSRAM_END
|
||||
#else
|
||||
#define KRAM_END CONFIG_RAM_END
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: up_allocate_heap
|
||||
*
|
||||
* Description:
|
||||
* This function will be called to dynamically set aside the heap region.
|
||||
*
|
||||
* For the kernel build (CONFIG_BUILD_PROTECTED=y) with both kernel- and
|
||||
* user-space heaps (CONFIG_MM_KERNEL_HEAP=y), this function provides the
|
||||
* size of the unprotected, user-space heap.
|
||||
*
|
||||
* If a protected kernel-space heap is provided, the kernel heap must be
|
||||
* allocated (and protected) by an analogous up_allocate_kheap().
|
||||
*
|
||||
* The following memory map is assumed for the flat build:
|
||||
*
|
||||
* .data region. Size determined at link time.
|
||||
* .bss region Size determined at link time.
|
||||
* IDLE thread stack. Size determined by CONFIG_IDLETHREAD_STACKSIZE.
|
||||
* Heap. Extends to the end of User SRAM.
|
||||
*
|
||||
* The following memory map is assumed for the protect build.
|
||||
* The kernel and user space have it's own dedicated heap space.
|
||||
*
|
||||
* User .data region Size determined at link time
|
||||
* User .bss region Size determined at link time
|
||||
* User heap Extends to the end of User SRAM
|
||||
* Kernel .data region Size determined at link time
|
||||
* Kernel .bss region Size determined at link time
|
||||
* Kernel IDLE thread stack Size determined by CONFIG_IDLETHREAD_STACKSIZE
|
||||
* Kernel heap Size determined by CONFIG_MM_KERNEL_HEAPSIZE
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_BUILD_KERNEL
|
||||
void up_allocate_kheap(void **heap_start, size_t *heap_size)
|
||||
#else
|
||||
void up_allocate_heap(void **heap_start, size_t *heap_size)
|
||||
#endif /* CONFIG_BUILD_KERNEL */
|
||||
{
|
||||
#if defined(CONFIG_BUILD_PROTECTED) && defined(CONFIG_MM_KERNEL_HEAP)
|
||||
/* Get the size and position of the user-space heap.
|
||||
* This heap begins after the user-space .bss section.
|
||||
*/
|
||||
|
||||
uintptr_t ubase = (uintptr_t)USERSPACE->us_bssend;
|
||||
size_t usize = (uintptr_t)USERSPACE->us_heapend - ubase;
|
||||
|
||||
/* Return the user-space heap settings */
|
||||
|
||||
*heap_start = (void *)ubase;
|
||||
*heap_size = usize;
|
||||
|
||||
/* Allow user-mode access to the user heap memory in PMP
|
||||
* is already done in k230_userspace().
|
||||
*/
|
||||
|
||||
#else
|
||||
/* Return the heap settings */
|
||||
|
||||
*heap_start = (void *)g_idle_topstack;
|
||||
*heap_size = KRAM_END - g_idle_topstack;
|
||||
#endif /* CONFIG_BUILD_PROTECTED && CONFIG_MM_KERNEL_HEAP */
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: up_allocate_kheap
|
||||
*
|
||||
* Description:
|
||||
* For the kernel build (CONFIG_BUILD_PROTECTED=y) with both kernel- and
|
||||
* user-space heaps (CONFIG_MM_KERNEL_HEAP=y), this function allocates
|
||||
* (and protects) the kernel-space heap.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_BUILD_PROTECTED) && defined(CONFIG_MM_KERNEL_HEAP) && \
|
||||
defined(__KERNEL__)
|
||||
void up_allocate_kheap(void **heap_start, size_t *heap_size)
|
||||
{
|
||||
/* Return the kernel heap settings. */
|
||||
|
||||
*heap_start = (void *)g_idle_topstack;
|
||||
*heap_size = KRAM_END - g_idle_topstack;
|
||||
}
|
||||
#endif /* CONFIG_BUILD_PROTECTED && CONFIG_MM_KERNEL_HEAP */
|
||||
|
||||
/****************************************************************************
|
||||
* Name: riscv_addregion
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_MM_REGIONS > 1
|
||||
void riscv_addregion(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
105
arch/risc-v/src/k230/k230_exception_m.S
Normal file
105
arch/risc-v/src/k230/k230_exception_m.S
Normal file
|
@ -0,0 +1,105 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/qemu-rv/k230_exception_m.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/arch.h>
|
||||
#include <arch/irq.h>
|
||||
#include <arch/mode.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "chip.h"
|
||||
|
||||
#include "riscv_macros.S"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* Provide a default section for the exeception handler. */
|
||||
|
||||
#ifndef EXCEPTION_SECTION
|
||||
# define EXCEPTION_SECTION .text
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Symbols
|
||||
****************************************************************************/
|
||||
|
||||
.section .text
|
||||
.balign 8
|
||||
.global __trap_vec_m
|
||||
|
||||
/****************************************************************************
|
||||
* Name: __trap_vec_m
|
||||
*
|
||||
* Description:
|
||||
* All M-mode exceptions and interrupts will be handled from here. If
|
||||
* kernel is in S-mode delegated exceptions and interrupts are handled.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
__trap_vec_m:
|
||||
j exception_m
|
||||
|
||||
/****************************************************************************
|
||||
* Name: exception_m
|
||||
*
|
||||
* Description:
|
||||
* Handles interrupts for m-mode
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
.section EXCEPTION_SECTION
|
||||
.global exception_m
|
||||
.align 8
|
||||
|
||||
exception_m:
|
||||
|
||||
/* Swap mscratch with sp */
|
||||
/* NOTE: mscratch has been set in up_mtimer_initialize() */
|
||||
|
||||
csrrw sp, mscratch, sp
|
||||
|
||||
/* Save the context */
|
||||
|
||||
save_ctx sp
|
||||
|
||||
/* Handle the mtimer interrupt */
|
||||
/* NOTE: we assume exception/interrupt only happens for mtimer */
|
||||
|
||||
jal ra, k230_mtimer_interrupt
|
||||
|
||||
/* Restore the context */
|
||||
|
||||
load_ctx sp
|
||||
|
||||
/* Swap mscratch with sp */
|
||||
|
||||
csrrw sp, mscratch, sp
|
||||
|
||||
/* Return from exception */
|
||||
|
||||
mret
|
121
arch/risc-v/src/k230/k230_head.S
Normal file
121
arch/risc-v/src/k230/k230_head.S
Normal file
|
@ -0,0 +1,121 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/k230/k230_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/arch.h>
|
||||
#include <arch/irq.h>
|
||||
|
||||
#include "chip.h"
|
||||
#include "riscv_internal.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Public Symbols
|
||||
****************************************************************************/
|
||||
|
||||
/* Exported Symbols */
|
||||
|
||||
.section .text
|
||||
.global __start
|
||||
|
||||
__start:
|
||||
|
||||
/* Preserve a1 as it contains the pointer to DTB */
|
||||
/* Load mhartid (cpuid) */
|
||||
|
||||
csrr a0, mhartid
|
||||
|
||||
/* Set stack pointer to the idle thread stack */
|
||||
|
||||
bnez a0, 1f
|
||||
la sp, K230_IDLESTACK_TOP
|
||||
j 2f
|
||||
1:
|
||||
|
||||
/* Load the number of CPUs that the kernel supports */
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
li t1, CONFIG_SMP_NCPUS
|
||||
#else
|
||||
li t1, 1
|
||||
#endif
|
||||
|
||||
/* If a0 (mhartid) >= t1 (the number of CPUs), stop here */
|
||||
|
||||
blt a0, t1, 3f
|
||||
csrw mie, zero
|
||||
wfi
|
||||
|
||||
3:
|
||||
/* To get g_cpu_basestack[mhartid], must get g_cpu_basestack first */
|
||||
|
||||
la t0, g_cpu_basestack
|
||||
|
||||
/* Offset = pointer width * hart id */
|
||||
|
||||
#ifdef CONFIG_ARCH_RV32
|
||||
slli t1, a0, 2
|
||||
#else
|
||||
slli t1, a0, 3
|
||||
#endif
|
||||
add t0, t0, t1
|
||||
|
||||
/* Load idle stack base to sp */
|
||||
|
||||
REGLOAD sp, 0(t0)
|
||||
|
||||
/*
|
||||
* sp (stack top) = sp + idle stack size - XCPTCONTEXT_SIZE
|
||||
*
|
||||
* Note: Reserve some space used by up_initial_state since we are already
|
||||
* running and using the per CPU idle stack.
|
||||
*/
|
||||
|
||||
li t0, STACK_ALIGN_UP(CONFIG_IDLETHREAD_STACKSIZE - XCPTCONTEXT_SIZE)
|
||||
add sp, sp, t0
|
||||
|
||||
2:
|
||||
|
||||
/* Disable all interrupts (i.e. timer, external) in mie */
|
||||
|
||||
csrw mie, zero
|
||||
|
||||
la t0, __trap_vec
|
||||
csrw mtvec, t0
|
||||
|
||||
/* Jump to k230_start */
|
||||
|
||||
jal x1, k230_start
|
||||
|
||||
/* We shouldn't return from _start */
|
||||
|
||||
.global _init
|
||||
.global _fini
|
||||
|
||||
_init:
|
||||
_fini:
|
||||
|
||||
/* These don't have to do anything since we use init_array/fini_array. */
|
||||
|
||||
ret
|
202
arch/risc-v/src/k230/k230_irq.c
Normal file
202
arch/risc-v/src/k230/k230_irq.c
Normal file
|
@ -0,0 +1,202 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/k230/k230_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 <assert.h>
|
||||
#include <debug.h>
|
||||
|
||||
#include <nuttx/arch.h>
|
||||
#include <nuttx/irq.h>
|
||||
|
||||
#include "riscv_internal.h"
|
||||
#include "chip.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: up_irqinitialize
|
||||
****************************************************************************/
|
||||
|
||||
void up_irqinitialize(void)
|
||||
{
|
||||
/* Disable Machine interrupts */
|
||||
|
||||
up_irq_save();
|
||||
|
||||
/* Disable all global interrupts */
|
||||
|
||||
putreg32(0x0, K230_PLIC_ENABLE1);
|
||||
putreg32(0x0, K230_PLIC_ENABLE2);
|
||||
|
||||
/* Colorize the interrupt stack for debug purposes */
|
||||
|
||||
#if defined(CONFIG_STACK_COLORATION) && CONFIG_ARCH_INTERRUPTSTACK > 15
|
||||
size_t intstack_size = (CONFIG_ARCH_INTERRUPTSTACK & ~15);
|
||||
riscv_stack_color(g_intstackalloc, intstack_size);
|
||||
#endif
|
||||
|
||||
/* Set priority for all global interrupts to 1 (lowest) */
|
||||
|
||||
int id;
|
||||
|
||||
for (id = 1; id <= NR_IRQS; id++)
|
||||
{
|
||||
putreg32(1, (uintptr_t)(K230_PLIC_PRIORITY + 4 * id));
|
||||
}
|
||||
|
||||
/* Set irq threshold to 0 (permits all global interrupts) */
|
||||
|
||||
putreg32(0, K230_PLIC_THRESHOLD);
|
||||
|
||||
/* Attach the common interrupt handler */
|
||||
|
||||
riscv_exception_attach();
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/* Clear RISCV_IPI for CPU0 */
|
||||
|
||||
putreg32(0, RISCV_IPI);
|
||||
|
||||
up_enable_irq(RISCV_IRQ_SOFT);
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_SUPPRESS_INTERRUPTS
|
||||
|
||||
/* And finally, enable interrupts */
|
||||
|
||||
up_irq_enable();
|
||||
#endif
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: up_disable_irq
|
||||
*
|
||||
* Description:
|
||||
* Disable the IRQ specified by 'irq'
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void up_disable_irq(int irq)
|
||||
{
|
||||
int extirq;
|
||||
|
||||
if (irq == RISCV_IRQ_SOFT)
|
||||
{
|
||||
/* Read m/sstatus & clear machine software interrupt enable in m/sie */
|
||||
|
||||
CLEAR_CSR(CSR_IE, IE_SIE);
|
||||
}
|
||||
else if (irq == RISCV_IRQ_TIMER)
|
||||
{
|
||||
/* Read m/sstatus & clear timer interrupt enable in m/sie */
|
||||
|
||||
CLEAR_CSR(CSR_IE, IE_TIE);
|
||||
}
|
||||
else if (irq > RISCV_IRQ_EXT)
|
||||
{
|
||||
extirq = irq - RISCV_IRQ_EXT;
|
||||
|
||||
/* Clear enable bit for the irq */
|
||||
|
||||
if (0 <= extirq && extirq <= 63)
|
||||
{
|
||||
modifyreg32(K230_PLIC_ENABLE1 + (4 * (extirq / 32)),
|
||||
1 << (extirq % 32), 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
PANIC();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: up_enable_irq
|
||||
*
|
||||
* Description:
|
||||
* Enable the IRQ specified by 'irq'
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void up_enable_irq(int irq)
|
||||
{
|
||||
int extirq;
|
||||
|
||||
if (irq == RISCV_IRQ_SOFT)
|
||||
{
|
||||
/* Read m/sstatus & set machine software interrupt enable in m/sie */
|
||||
|
||||
SET_CSR(CSR_IE, IE_SIE);
|
||||
}
|
||||
else if (irq == RISCV_IRQ_TIMER)
|
||||
{
|
||||
/* Read m/sstatus & set timer interrupt enable in m/sie */
|
||||
|
||||
SET_CSR(CSR_IE, IE_TIE);
|
||||
}
|
||||
#ifdef CONFIG_BUILD_KERNEL
|
||||
else if (irq == RISCV_IRQ_MTIMER)
|
||||
{
|
||||
/* Read m/sstatus & set timer interrupt enable in m/sie */
|
||||
|
||||
SET_CSR(mie, MIE_MTIE);
|
||||
}
|
||||
#endif
|
||||
else if (irq > RISCV_IRQ_EXT)
|
||||
{
|
||||
extirq = irq - RISCV_IRQ_EXT;
|
||||
|
||||
/* Set enable bit for the irq */
|
||||
|
||||
if (0 <= extirq && extirq <= 63)
|
||||
{
|
||||
modifyreg32(K230_PLIC_ENABLE1 + (4 * (extirq / 32)),
|
||||
0, 1 << (extirq % 32));
|
||||
}
|
||||
else
|
||||
{
|
||||
PANIC();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
irqstate_t up_irq_enable(void)
|
||||
{
|
||||
irqstate_t oldstat;
|
||||
|
||||
/* Enable external interrupts (mie/sie) */
|
||||
|
||||
SET_CSR(CSR_IE, IE_EIE);
|
||||
|
||||
/* Read and enable global interrupts (M/SIE) in m/sstatus */
|
||||
|
||||
oldstat = READ_AND_SET_CSR(CSR_STATUS, STATUS_IE);
|
||||
|
||||
return oldstat;
|
||||
}
|
88
arch/risc-v/src/k230/k230_irq_dispatch.c
Normal file
88
arch/risc-v/src/k230/k230_irq_dispatch.c
Normal file
|
@ -0,0 +1,88 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/k230/k230_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 <sys/types.h>
|
||||
|
||||
#include "riscv_internal.h"
|
||||
#include "hardware/k230_memorymap.h"
|
||||
#include "hardware/k230_plic.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_ARCH_RV32
|
||||
# define RV_IRQ_MASK 27
|
||||
#else
|
||||
# define RV_IRQ_MASK 59
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* riscv_dispatch_irq
|
||||
****************************************************************************/
|
||||
|
||||
void *riscv_dispatch_irq(uintptr_t vector, uintptr_t *regs)
|
||||
{
|
||||
int irq = (vector >> RV_IRQ_MASK) | (vector & 0xf);
|
||||
|
||||
/* Firstly, check if the irq is machine external interrupt */
|
||||
|
||||
if (RISCV_IRQ_EXT == irq)
|
||||
{
|
||||
uintptr_t val = getreg32(K230_PLIC_CLAIM);
|
||||
|
||||
/* Add the value to nuttx irq which is offset to the mext */
|
||||
|
||||
irq += val;
|
||||
}
|
||||
|
||||
/* EXT means no interrupt */
|
||||
|
||||
if (RISCV_IRQ_EXT != irq)
|
||||
{
|
||||
/* Deliver the IRQ */
|
||||
|
||||
regs = riscv_doirq(irq, regs);
|
||||
}
|
||||
|
||||
if (RISCV_IRQ_EXT <= irq)
|
||||
{
|
||||
/* Then write PLIC_CLAIM to clear pending in PLIC */
|
||||
|
||||
putreg32(irq - RISCV_IRQ_EXT, K230_PLIC_CLAIM);
|
||||
}
|
||||
|
||||
return regs;
|
||||
}
|
45
arch/risc-v/src/k230/k230_memorymap.h
Normal file
45
arch/risc-v/src/k230/k230_memorymap.h
Normal file
|
@ -0,0 +1,45 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/k230/k230_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_K230_K230_MEMORYMAP_H
|
||||
#define __ARCH_RISCV_SRC_K230_K230_MEMORYMAP_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include "riscv_common_memorymap.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* Idle thread stack starts from _ebss */
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#define K230_IDLESTACK_BASE (uintptr_t)_ebss
|
||||
#else
|
||||
#define K230_IDLESTACK_BASE _ebss
|
||||
#endif
|
||||
|
||||
#define K230_IDLESTACK_SIZE (CONFIG_IDLETHREAD_STACKSIZE & ~3)
|
||||
#define K230_IDLESTACK_TOP (K230_IDLESTACK_BASE + K230_IDLESTACK_SIZE)
|
||||
|
||||
#endif /* __ARCH_RISCV_SRC_K230_K230_MEMORYMAP_H */
|
309
arch/risc-v/src/k230/k230_mm_init.c
Normal file
309
arch/risc-v/src/k230/k230_mm_init.c
Normal file
|
@ -0,0 +1,309 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/k230/k230_mm_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 <nuttx/config.h>
|
||||
#include <nuttx/arch.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <assert.h>
|
||||
#include <debug.h>
|
||||
|
||||
#include <arch/board/board_memorymap.h>
|
||||
|
||||
#include "k230_memorymap.h"
|
||||
|
||||
#include "riscv_internal.h"
|
||||
#include "riscv_mmu.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* Map the whole I/O memory with vaddr = paddr mappings */
|
||||
|
||||
#define MMU_IO_BASE (0x80400000) // KPU config
|
||||
#define MMU_IO_SIZE (0x19c00000) // DDR config
|
||||
|
||||
#ifdef CONFIG_ARCH_MMU_TYPE_SV32
|
||||
|
||||
/* Physical and virtual addresses to page tables (vaddr = paddr mapping) */
|
||||
|
||||
#define PGT_L1_PBASE (uintptr_t)&m_l1_pgtable
|
||||
#define PGT_L2_PBASE (uintptr_t)&m_l2_pgtable
|
||||
#define PGT_L1_VBASE PGT_L1_PBASE
|
||||
#define PGT_L2_VBASE PGT_L2_PBASE
|
||||
|
||||
#define PGT_L1_SIZE (1024) /* Enough to map 4 GiB */
|
||||
#define PGT_L2_SIZE (3072) /* Enough to map 12 MiB */
|
||||
|
||||
#define SLAB_COUNT (sizeof(m_l2_pgtable) / RV_MMU_PAGE_SIZE)
|
||||
|
||||
#define KMM_PAGE_SIZE RV_MMU_L2_PAGE_SIZE
|
||||
#define KMM_PBASE PGT_L2_PBASE
|
||||
#define KMM_PBASE_IDX 2
|
||||
#define KMM_SPBASE PGT_L1_PBASE
|
||||
#define KMM_SPBASE_IDX 1
|
||||
|
||||
#elif CONFIG_ARCH_MMU_TYPE_SV39
|
||||
|
||||
/* Physical and virtual addresses to page tables (vaddr = paddr mapping) */
|
||||
|
||||
#define PGT_L1_PBASE (uintptr_t)&m_l1_pgtable
|
||||
#define PGT_L2_PBASE (uintptr_t)&m_l2_pgtable
|
||||
#define PGT_L3_PBASE (uintptr_t)&m_l3_pgtable
|
||||
#define PGT_L1_VBASE PGT_L1_PBASE
|
||||
#define PGT_L2_VBASE PGT_L2_PBASE
|
||||
#define PGT_L3_VBASE PGT_L3_PBASE
|
||||
|
||||
#define PGT_L1_SIZE (512) /* Enough to map 512 GiB */
|
||||
#define PGT_L2_SIZE (512) /* Enough to map 1 GiB */
|
||||
#define PGT_L3_SIZE (1024) /* Enough to map 4 MiB (2MiB x 2) */
|
||||
|
||||
#define SLAB_COUNT (sizeof(m_l3_pgtable) / RV_MMU_PAGE_SIZE)
|
||||
|
||||
#define KMM_PAGE_SIZE RV_MMU_L3_PAGE_SIZE
|
||||
#define KMM_PBASE PGT_L3_PBASE
|
||||
#define KMM_PBASE_IDX 3
|
||||
#define KMM_SPBASE PGT_L2_PBASE
|
||||
#define KMM_SPBASE_IDX 2
|
||||
|
||||
#else
|
||||
#error No valid MMU defined.
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
struct pgalloc_slab_s
|
||||
{
|
||||
sq_entry_t *next;
|
||||
void *memory;
|
||||
};
|
||||
typedef struct pgalloc_slab_s pgalloc_slab_t;
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/* Kernel mappings simply here, mapping is vaddr=paddr */
|
||||
|
||||
static size_t m_l1_pgtable[PGT_L1_SIZE] locate_data(".pgtables");
|
||||
static size_t m_l2_pgtable[PGT_L2_SIZE] locate_data(".pgtables");
|
||||
#ifdef CONFIG_ARCH_MMU_TYPE_SV39
|
||||
static size_t m_l3_pgtable[PGT_L3_SIZE] locate_data(".pgtables");
|
||||
#endif
|
||||
|
||||
/* Kernel mappings (L1 base) */
|
||||
|
||||
uintptr_t g_kernel_mappings = PGT_L1_VBASE;
|
||||
uintptr_t g_kernel_pgt_pbase = PGT_L1_PBASE;
|
||||
|
||||
/* L3 page table allocator */
|
||||
|
||||
static sq_queue_t g_free_slabs;
|
||||
static pgalloc_slab_t g_slabs[SLAB_COUNT];
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: slab_init
|
||||
*
|
||||
* Description:
|
||||
* Initialize slab allocator for L2 or L3 page table entries
|
||||
*
|
||||
* L2 Page table is used for SV32. L3 used for SV39
|
||||
*
|
||||
* Input Parameters:
|
||||
* start - Beginning of the L2 or L3 page table pool
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void slab_init(uintptr_t start)
|
||||
{
|
||||
int i;
|
||||
|
||||
sq_init(&g_free_slabs);
|
||||
|
||||
for (i = 0; i < SLAB_COUNT; i++)
|
||||
{
|
||||
g_slabs[i].memory = (void *)start;
|
||||
sq_addlast((sq_entry_t *)&g_slabs[i], (sq_queue_t *)&g_free_slabs);
|
||||
start += RV_MMU_PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: slab_alloc
|
||||
*
|
||||
* Description:
|
||||
* Allocate single slab for L2/L3 page table entry
|
||||
*
|
||||
* L2 Page table is used for SV32. L3 used for SV39
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static uintptr_t slab_alloc(void)
|
||||
{
|
||||
pgalloc_slab_t *slab = (pgalloc_slab_t *)sq_remfirst(&g_free_slabs);
|
||||
return slab ? (uintptr_t)slab->memory : 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: map_region
|
||||
*
|
||||
* Description:
|
||||
* Map a region of physical memory to the L3 page table
|
||||
*
|
||||
* Input Parameters:
|
||||
* paddr - Beginning of the physical address mapping
|
||||
* vaddr - Beginning of the virtual address mapping
|
||||
* size - Size of the region in bytes
|
||||
* mmuflags - The MMU flags to use in the mapping
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void map_region(uintptr_t paddr, uintptr_t vaddr, size_t size,
|
||||
uint32_t mmuflags)
|
||||
{
|
||||
uintptr_t endaddr;
|
||||
uintptr_t pbase;
|
||||
int npages;
|
||||
int i;
|
||||
int j;
|
||||
|
||||
/* How many pages */
|
||||
|
||||
npages = (size + RV_MMU_PAGE_MASK) >> RV_MMU_PAGE_SHIFT;
|
||||
endaddr = vaddr + size;
|
||||
|
||||
for (i = 0; i < npages; i += RV_MMU_PAGE_ENTRIES)
|
||||
{
|
||||
/* See if a mapping exists ? */
|
||||
|
||||
pbase = mmu_pte_to_paddr(mmu_ln_getentry(
|
||||
KMM_SPBASE_IDX, KMM_SPBASE, vaddr));
|
||||
if (!pbase)
|
||||
{
|
||||
/* No, allocate 1 page, this must not fail */
|
||||
|
||||
pbase = slab_alloc();
|
||||
DEBUGASSERT(pbase);
|
||||
|
||||
/* Map it to the new table */
|
||||
|
||||
mmu_ln_setentry(
|
||||
KMM_SPBASE_IDX, KMM_SPBASE, pbase, vaddr, MMU_UPGT_FLAGS);
|
||||
}
|
||||
|
||||
/* Then add the mappings */
|
||||
|
||||
for (j = 0; j < RV_MMU_PAGE_ENTRIES && vaddr < endaddr; j++)
|
||||
{
|
||||
mmu_ln_setentry(KMM_PBASE_IDX, pbase, paddr, vaddr, mmuflags);
|
||||
paddr += KMM_PAGE_SIZE;
|
||||
vaddr += KMM_PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: k230_kernel_mappings
|
||||
*
|
||||
* Description:
|
||||
* Setup kernel mappings when using CONFIG_BUILD_KERNEL. Sets up the kernel
|
||||
* MMU mappings.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void k230_kernel_mappings(void)
|
||||
{
|
||||
/* Initialize slab allocator for the L2/L3 page tables */
|
||||
|
||||
slab_init(KMM_PBASE);
|
||||
|
||||
/* Begin mapping memory to MMU; note that at this point the MMU is not yet
|
||||
* active, so the page table virtual addresses are actually physical
|
||||
* addresses and so forth. M-mode does not perform translations anyhow, so
|
||||
* this mapping is quite simple to do
|
||||
*/
|
||||
|
||||
/* Map I/O region, use enough large page tables for the IO region. */
|
||||
|
||||
binfo("map I/O regions\n");
|
||||
mmu_ln_map_region(1, PGT_L1_VBASE, MMU_IO_BASE, MMU_IO_BASE,
|
||||
MMU_IO_SIZE, MMU_IO_FLAGS);
|
||||
|
||||
/* Map the kernel text and data for L2/L3 */
|
||||
|
||||
binfo("map kernel text\n");
|
||||
map_region(KFLASH_START, KFLASH_START, KFLASH_SIZE, MMU_KTEXT_FLAGS);
|
||||
|
||||
binfo("map kernel data\n");
|
||||
map_region(KSRAM_START, KSRAM_START, KSRAM_SIZE, MMU_KDATA_FLAGS);
|
||||
|
||||
#ifdef CONFIG_ARCH_MMU_TYPE_SV39
|
||||
|
||||
/* Connect the L1 and L2 page tables for the kernel text and data */
|
||||
|
||||
binfo("connect the L1 and L2 page tables\n");
|
||||
mmu_ln_setentry(1, PGT_L1_VBASE, PGT_L2_PBASE, KFLASH_START, PTE_G);
|
||||
|
||||
/* Map the page pool */
|
||||
|
||||
binfo("map the page pool\n");
|
||||
mmu_ln_map_region(2, PGT_L2_VBASE, PGPOOL_START, PGPOOL_START, PGPOOL_SIZE,
|
||||
MMU_KDATA_FLAGS);
|
||||
#elif CONFIG_ARCH_MMU_TYPE_SV32
|
||||
binfo("map the page pool\n");
|
||||
map_region(PGPOOL_START, PGPOOL_START, PGPOOL_SIZE, MMU_KDATA_FLAGS);
|
||||
#endif
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: k230_mm_init
|
||||
*
|
||||
* Description:
|
||||
* Setup kernel mappings when using CONFIG_BUILD_KERNEL. Sets up kernel MMU
|
||||
* mappings. Function also sets the first address environment (satp value).
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void k230_mm_init(void)
|
||||
{
|
||||
/* Setup the kernel mappings */
|
||||
|
||||
k230_kernel_mappings();
|
||||
|
||||
/* Enable MMU (note: system is still in M-mode) */
|
||||
|
||||
binfo("mmu_enable: satp=%" PRIuPTR "\n", g_kernel_pgt_pbase);
|
||||
mmu_enable(g_kernel_pgt_pbase, 0);
|
||||
}
|
58
arch/risc-v/src/k230/k230_mm_init.h
Normal file
58
arch/risc-v/src/k230/k230_mm_init.h
Normal file
|
@ -0,0 +1,58 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/k230/k230_mm_init.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_RISC_V_SRC_K230_K230_MM_INIT_H
|
||||
#define __ARCH_RISC_V_SRC_K230_K230_MM_INIT_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include "riscv_mmu.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: k230_kernel_mappings
|
||||
*
|
||||
* Description:
|
||||
* Setup kernel mappings when using CONFIG_BUILD_KERNEL. Sets up the kernel
|
||||
* MMU mappings.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void k230_kernel_mappings(void);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: k230_mm_init
|
||||
*
|
||||
* Description:
|
||||
* Setup kernel mappings when using CONFIG_BUILD_KERNEL. Sets up kernel MMU
|
||||
* mappings. Function also sets the first address environment (satp value).
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void k230_mm_init(void);
|
||||
|
||||
#endif /* __ARCH_RISC_V_SRC_K230_K230_MM_INIT_H */
|
53
arch/risc-v/src/k230/k230_pgalloc.c
Normal file
53
arch/risc-v/src/k230/k230_pgalloc.c
Normal file
|
@ -0,0 +1,53 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/k230/k230_pgalloc.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/arch.h>
|
||||
#include <nuttx/config.h>
|
||||
#include <nuttx/pgalloc.h>
|
||||
#include <assert.h>
|
||||
#include <debug.h>
|
||||
#include <arch/board/board_memorymap.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: up_allocate_pgheap
|
||||
*
|
||||
* Description:
|
||||
* If there is a page allocator in the configuration, then this function
|
||||
* must be provided by the platform-specific code. The OS initialization
|
||||
* logic will call this function early in the initialization sequence to
|
||||
* get the page heap information needed to configure the page allocator.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void up_allocate_pgheap(void **heap_start, size_t *heap_size)
|
||||
{
|
||||
DEBUGASSERT(heap_start && heap_size);
|
||||
|
||||
*heap_start = (void *)PGPOOL_START;
|
||||
*heap_size = (size_t)PGPOOL_SIZE;
|
||||
}
|
239
arch/risc-v/src/k230/k230_start.c
Normal file
239
arch/risc-v/src/k230/k230_start.c
Normal file
|
@ -0,0 +1,239 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/k230/k230_start.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/init.h>
|
||||
#include <nuttx/arch.h>
|
||||
#include <nuttx/serial/uart_16550.h>
|
||||
#include <arch/board/board.h>
|
||||
|
||||
#include "riscv_internal.h"
|
||||
#include "chip.h"
|
||||
|
||||
#ifdef CONFIG_BUILD_KERNEL
|
||||
# include "k230_mm_init.h"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEVICE_TREE
|
||||
# include <nuttx/fdt.h>
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_DEBUG_FEATURES
|
||||
#define showprogress(c) up_putc(c)
|
||||
#else
|
||||
#define showprogress(c)
|
||||
#endif
|
||||
|
||||
#if defined (CONFIG_BUILD_KERNEL) && !defined (CONFIG_ARCH_USE_S_MODE)
|
||||
# error "Target requires kernel in S-mode, enable CONFIG_ARCH_USE_S_MODE"
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Extern Function Declarations
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_BUILD_KERNEL
|
||||
extern void __trap_vec(void);
|
||||
extern void __trap_vec_m(void);
|
||||
extern void up_mtimer_initialize(void);
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: k230_clear_bss
|
||||
****************************************************************************/
|
||||
|
||||
void k230_clear_bss(void)
|
||||
{
|
||||
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 = (uint32_t *)_sbss; dest < (uint32_t *)_ebss; )
|
||||
{
|
||||
*dest++ = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/* NOTE: g_idle_topstack needs to point the top of the idle stack
|
||||
* for CPU0 and this value is used in up_initial_state()
|
||||
*/
|
||||
|
||||
uintptr_t g_idle_topstack = K230_IDLESTACK_TOP;
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: k230_start
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_BUILD_KERNEL
|
||||
void k230_start_s(int mhartid, const char *dtb)
|
||||
#else
|
||||
void k230_start(int mhartid, const char *dtb)
|
||||
#endif
|
||||
{
|
||||
/* Configure FPU */
|
||||
|
||||
riscv_fpuconfig();
|
||||
|
||||
if (mhartid > 0)
|
||||
{
|
||||
goto cpux;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_BUILD_KERNEL
|
||||
k230_clear_bss();
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEVICE_TREE
|
||||
fdt_register(dtb);
|
||||
#endif
|
||||
|
||||
showprogress('A');
|
||||
|
||||
#ifdef USE_EARLYSERIALINIT
|
||||
riscv_earlyserialinit();
|
||||
#endif
|
||||
|
||||
showprogress('B');
|
||||
|
||||
/* Do board initialization */
|
||||
|
||||
#ifdef CONFIG_BUILD_KERNEL
|
||||
/* Setup page tables for kernel and enable MMU */
|
||||
|
||||
k230_mm_init();
|
||||
#endif
|
||||
|
||||
showprogress('C');
|
||||
|
||||
/* Call nx_start() */
|
||||
|
||||
nx_start();
|
||||
|
||||
cpux:
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
riscv_cpu_boot(mhartid);
|
||||
#endif
|
||||
|
||||
while (true)
|
||||
{
|
||||
asm("WFI");
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BUILD_KERNEL
|
||||
|
||||
/****************************************************************************
|
||||
* Name: k230_start
|
||||
****************************************************************************/
|
||||
|
||||
void k230_start(int mhartid, const char *dtb)
|
||||
{
|
||||
/* NOTE: still in M-mode */
|
||||
|
||||
if (0 == mhartid)
|
||||
{
|
||||
k230_clear_bss();
|
||||
|
||||
/* Initialize the per CPU areas */
|
||||
|
||||
riscv_percpu_add_hart(mhartid);
|
||||
}
|
||||
|
||||
/* Disable MMU and enable PMP */
|
||||
|
||||
WRITE_CSR(satp, 0x0);
|
||||
WRITE_CSR(pmpaddr0, 0x3fffffffffffffull);
|
||||
WRITE_CSR(pmpcfg0, 0xf);
|
||||
|
||||
/* Set exception and interrupt delegation for S-mode */
|
||||
|
||||
WRITE_CSR(medeleg, 0xffff);
|
||||
WRITE_CSR(mideleg, 0xffff);
|
||||
|
||||
/* Allow to write satp from S-mode */
|
||||
|
||||
CLEAR_CSR(mstatus, MSTATUS_TVM);
|
||||
|
||||
/* Set mstatus to S-mode and enable SUM */
|
||||
|
||||
CLEAR_CSR(mstatus, ~MSTATUS_MPP_MASK);
|
||||
SET_CSR(mstatus, MSTATUS_MPPS | SSTATUS_SUM);
|
||||
|
||||
/* Set the trap vector for S-mode */
|
||||
|
||||
WRITE_CSR(stvec, (uintptr_t)__trap_vec);
|
||||
|
||||
/* Set the trap vector for M-mode */
|
||||
|
||||
WRITE_CSR(mtvec, (uintptr_t)__trap_vec_m);
|
||||
|
||||
if (0 == mhartid)
|
||||
{
|
||||
/* Only the primary CPU needs to initialize mtimer
|
||||
* before entering to S-mode
|
||||
*/
|
||||
|
||||
up_mtimer_initialize();
|
||||
}
|
||||
|
||||
/* Set mepc to the entry */
|
||||
|
||||
WRITE_CSR(mepc, (uintptr_t)k230_start_s);
|
||||
|
||||
/* Set a0 to mhartid and a1 to dtb explicitly and enter to S-mode */
|
||||
|
||||
asm volatile (
|
||||
"mv a0, %0 \n"
|
||||
"mv a1, %1 \n"
|
||||
"mret \n"
|
||||
:: "r" (mhartid), "r" (dtb)
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
void riscv_earlyserialinit(void)
|
||||
{
|
||||
u16550_earlyserialinit();
|
||||
}
|
||||
|
||||
void riscv_serialinit(void)
|
||||
{
|
||||
u16550_serialinit();
|
||||
}
|
211
arch/risc-v/src/k230/k230_timerisr.c
Normal file
211
arch/risc-v/src/k230/k230_timerisr.c
Normal file
|
@ -0,0 +1,211 @@
|
|||
/****************************************************************************
|
||||
* arch/risc-v/src/k230/k230_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 <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <time.h>
|
||||
#include <debug.h>
|
||||
|
||||
#include <nuttx/arch.h>
|
||||
#include <nuttx/clock.h>
|
||||
#include <nuttx/init.h>
|
||||
#include <nuttx/spinlock.h>
|
||||
#include <nuttx/timers/arch_alarm.h>
|
||||
#include <arch/board/board.h>
|
||||
|
||||
#include "riscv_internal.h"
|
||||
#include "riscv_mtimer.h"
|
||||
#include "riscv_percpu.h"
|
||||
#include "hardware/k230_memorymap.h"
|
||||
#include "hardware/k230_clint.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define MTIMER_FREQ 10000000
|
||||
#define TICK_COUNT (10000000 / TICK_PER_SEC)
|
||||
|
||||
#ifdef CONFIG_BUILD_KERNEL
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
static uint32_t g_mtimer_cnt = 0;
|
||||
static uint32_t g_stimer_pending = false;
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions for S-mode
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: k230_ssoft_interrupt
|
||||
*
|
||||
* Description:
|
||||
* This function is S-mode software interrupt handler to proceed
|
||||
* the OS timer
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static int k230_ssoft_interrupt(int irq, void *context, void *arg)
|
||||
{
|
||||
/* Cleaer Supervisor Software Interrupt */
|
||||
|
||||
CLEAR_CSR(sip, SIP_SSIP);
|
||||
|
||||
if (g_stimer_pending)
|
||||
{
|
||||
g_stimer_pending = false;
|
||||
|
||||
/* Proceed the OS timer */
|
||||
|
||||
nxsched_process_timer();
|
||||
}
|
||||
#ifdef CONFIG_SMP
|
||||
else
|
||||
{
|
||||
/* We assume IPI has been issued */
|
||||
|
||||
riscv_pause_handler(irq, context, arg);
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: k230_reload_mtimecmp
|
||||
*
|
||||
* Description:
|
||||
* This function is called during start-up to initialize mtimecmp
|
||||
* for CONFIG_BUILD_KERNEL=y
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void k230_reload_mtimecmp(void)
|
||||
{
|
||||
uint64_t current;
|
||||
uint64_t next;
|
||||
|
||||
current = READ_CSR(time);
|
||||
next = current + TICK_COUNT;
|
||||
putreg64(next, K230_CLINT_MTIMECMP);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_BUILD_KERNEL */
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: up_timer_initialize
|
||||
*
|
||||
* Description:
|
||||
* This function is called during start-up to initialize
|
||||
* the timer interrupt.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void up_timer_initialize(void)
|
||||
{
|
||||
#ifndef CONFIG_BUILD_KERNEL
|
||||
|
||||
struct oneshot_lowerhalf_s *lower = riscv_mtimer_initialize(
|
||||
K230_CLINT_MTIME, K230_CLINT_MTIMECMP,
|
||||
RISCV_IRQ_MTIMER, MTIMER_FREQ);
|
||||
|
||||
DEBUGASSERT(lower);
|
||||
|
||||
up_alarm_set_lowerhalf(lower);
|
||||
#else
|
||||
/* NOTE: This function is called in S-mode */
|
||||
|
||||
irq_attach(RISCV_IRQ_SSOFT, k230_ssoft_interrupt, NULL);
|
||||
up_enable_irq(RISCV_IRQ_SSOFT);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BUILD_KERNEL
|
||||
|
||||
/****************************************************************************
|
||||
* Name: up_mtimer_initialize
|
||||
*
|
||||
* Description:
|
||||
* This function is called during start-up to initialize the M-mode timer
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void up_mtimer_initialize(void)
|
||||
{
|
||||
uintptr_t irqstacktop = riscv_percpu_get_irqstack();
|
||||
|
||||
/* Set the irq stack base to mscratch */
|
||||
|
||||
WRITE_CSR(mscratch,
|
||||
irqstacktop - STACK_ALIGN_DOWN(CONFIG_ARCH_INTERRUPTSTACK));
|
||||
|
||||
/* NOTE: we do not attach a handler for mtimer,
|
||||
* because it is handled in the exception_m directly
|
||||
*/
|
||||
|
||||
up_enable_irq(RISCV_IRQ_MTIMER);
|
||||
k230_reload_mtimecmp();
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: k230_mtimer_interrupt
|
||||
*
|
||||
* Description:
|
||||
* In RISC-V with S-mode, M-mode timer must be handled in M-mode
|
||||
* This function is called from exception_m in M-mode directly
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void k230_mtimer_interrupt(void)
|
||||
{
|
||||
uint64_t current;
|
||||
uint64_t next;
|
||||
|
||||
/* Update mtimercmp */
|
||||
|
||||
current = getreg64(K230_CLINT_MTIMECMP);
|
||||
next = current + TICK_COUNT;
|
||||
putreg64(next, K230_CLINT_MTIMECMP);
|
||||
|
||||
g_mtimer_cnt++;
|
||||
g_stimer_pending = true;
|
||||
|
||||
if (OSINIT_HW_READY())
|
||||
{
|
||||
/* Post Supervisor Software Interrupt */
|
||||
|
||||
SET_CSR(sip, SIP_SSIP);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* CONFIG_BUILD_KERNEL */
|
|
@ -1947,6 +1947,12 @@ config ARCH_BOARD_JH7110_STAR64
|
|||
This options selects support for NuttX on PINE64 Star64 based
|
||||
on StarFive JH7110 SoC.
|
||||
|
||||
config ARCH_BOARD_K230_CANMV
|
||||
bool "CanMV K230"
|
||||
depends on ARCH_CHIP_K230
|
||||
---help---
|
||||
This selects NuttX on CanMV-K230 board with Kendryte K230 SoC.
|
||||
|
||||
config ARCH_BOARD_BL808_OX64
|
||||
bool "PINE64 Ox64"
|
||||
depends on ARCH_CHIP_BL808
|
||||
|
@ -3267,6 +3273,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 "canmv230" if ARCH_BOARD_K230_CANMV
|
||||
default "ox64" if ARCH_BOARD_BL808_OX64
|
||||
default "sabre-6quad" if ARCH_BOARD_SABRE_6QUAD
|
||||
default "qemu-armv7a" if ARCH_BOARD_QEMU_ARMV7A
|
||||
|
@ -4159,6 +4166,9 @@ endif
|
|||
if ARCH_BOARD_JH7110_STAR64
|
||||
source "boards/risc-v/jh7110/star64/Kconfig"
|
||||
endif
|
||||
if ARCH_BOARD_K230_CANMV
|
||||
source "boards/risc-v/k230/canmv230/Kconfig"
|
||||
endif
|
||||
if ARCH_BOARD_BL808_OX64
|
||||
source "boards/risc-v/bl808/ox64/Kconfig"
|
||||
endif
|
||||
|
|
0
boards/risc-v/k230/canmv230/Kconfig
Normal file
0
boards/risc-v/k230/canmv230/Kconfig
Normal file
65
boards/risc-v/k230/canmv230/configs/nsh/defconfig
Normal file
65
boards/risc-v/k230/canmv230/configs/nsh/defconfig
Normal file
|
@ -0,0 +1,65 @@
|
|||
#
|
||||
# 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_16550_ADDRWIDTH=0
|
||||
CONFIG_16550_REGWIDTH=32
|
||||
CONFIG_16550_SERIAL_DISABLE_REORDERING=y
|
||||
CONFIG_16550_SUPRESS_CONFIG=y
|
||||
CONFIG_16550_UART0=y
|
||||
CONFIG_16550_UART0_BASE=0x91400000
|
||||
CONFIG_16550_UART0_CLOCK=50000000
|
||||
CONFIG_16550_UART0_IRQ=43
|
||||
CONFIG_16550_UART0_SERIAL_CONSOLE=y
|
||||
CONFIG_16550_UART=y
|
||||
CONFIG_16550_WAIT_LCR=y
|
||||
CONFIG_ARCH="risc-v"
|
||||
CONFIG_ARCH_BOARD="canmv230"
|
||||
CONFIG_ARCH_BOARD_K230_CANMV=y
|
||||
CONFIG_ARCH_CHIP="k230"
|
||||
CONFIG_ARCH_CHIP_K230=y
|
||||
CONFIG_ARCH_INTERRUPTSTACK=2048
|
||||
CONFIG_ARCH_RISCV=y
|
||||
CONFIG_ARCH_STACKDUMP=y
|
||||
CONFIG_BOARD_LOOPSPERMSEC=6366
|
||||
CONFIG_BUILTIN=y
|
||||
CONFIG_DEV_ZERO=y
|
||||
CONFIG_ELF=y
|
||||
CONFIG_EXAMPLES_HELLO=y
|
||||
CONFIG_FS_PROCFS=y
|
||||
CONFIG_IDLETHREAD_STACKSIZE=2048
|
||||
CONFIG_INIT_ENTRYPOINT="nsh_main"
|
||||
CONFIG_INIT_STACKSIZE=3072
|
||||
CONFIG_LIBC_ENVPATH=y
|
||||
CONFIG_LIBC_EXECFUNCS=y
|
||||
CONFIG_LIBC_PERROR_STDOUT=y
|
||||
CONFIG_LIBC_STRERROR=y
|
||||
CONFIG_LIBM=y
|
||||
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
|
||||
CONFIG_NSH_ARCHINIT=y
|
||||
CONFIG_NSH_BUILTIN_APPS=y
|
||||
CONFIG_NSH_FILEIOSIZE=512
|
||||
CONFIG_NSH_READLINE=y
|
||||
CONFIG_PATH_INITIAL="/system/bin"
|
||||
CONFIG_RAM_SIZE=134217728
|
||||
CONFIG_RAM_START=0x8000000
|
||||
CONFIG_RAW_BINARY=y
|
||||
CONFIG_READLINE_CMD_HISTORY=y
|
||||
CONFIG_RR_INTERVAL=200
|
||||
CONFIG_SCHED_WAITPID=y
|
||||
CONFIG_SERIAL_UART_ARCH_MMIO=y
|
||||
CONFIG_STACK_COLORATION=y
|
||||
CONFIG_STANDARD_SERIAL=y
|
||||
CONFIG_START_MONTH=12
|
||||
CONFIG_START_YEAR=2021
|
||||
CONFIG_SYMTAB_ORDEREDBYNAME=y
|
||||
CONFIG_SYSTEM_NSH=y
|
||||
CONFIG_SYSTEM_NSH_STACKSIZE=3072
|
||||
CONFIG_TESTING_GETPRIME=y
|
||||
CONFIG_TESTING_OSTEST=y
|
||||
CONFIG_USEC_PER_TICK=1000
|
78
boards/risc-v/k230/canmv230/include/board.h
Normal file
78
boards/risc-v/k230/canmv230/include/board.h
Normal file
|
@ -0,0 +1,78 @@
|
|||
/****************************************************************************
|
||||
* boards/risc-v/k230/canmv230/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_K230_CANMV_INCLUDE_BOARD_H
|
||||
#define __BOARDS_RISCV_K230_CANMV_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: k230_boardinitialize
|
||||
****************************************************************************/
|
||||
|
||||
void k230_boardinitialize(void);
|
||||
|
||||
#undef EXTERN
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __BOARDS_RISCV_K230_CANMV_INCLUDE_BOARD_H */
|
98
boards/risc-v/k230/canmv230/include/board_memorymap.h
Normal file
98
boards/risc-v/k230/canmv230/include/board_memorymap.h
Normal file
|
@ -0,0 +1,98 @@
|
|||
/****************************************************************************
|
||||
* boards/risc-v/k230/canmv230/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_K230_CANMV230_INCLUDE_BOARD_MEMORYMAP_H
|
||||
#define __BOARDS_RISCV_K230_CANMV230_INCLUDE_BOARD_MEMORYMAP_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* DDR start address */
|
||||
|
||||
#define K230_DDR_BASE (0x8000000)
|
||||
#define K230_DDR_SIZE (0x8000000)
|
||||
|
||||
/* 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)
|
||||
|
||||
/* User flash */
|
||||
|
||||
#define UFLASH_START (uintptr_t)__uflash_start
|
||||
#define UFLASH_SIZE (uintptr_t)__uflash_size
|
||||
|
||||
/* User RAM */
|
||||
|
||||
#define USRAM_START (uintptr_t)__usram_start
|
||||
#define USRAM_SIZE (uintptr_t)__usram_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[];
|
||||
|
||||
/* User code memory (RX) */
|
||||
|
||||
extern uint8_t __uflash_start[];
|
||||
extern uint8_t __uflash_size[];
|
||||
|
||||
/* User RAM (RW) */
|
||||
|
||||
extern uint8_t __usram_start[];
|
||||
extern uint8_t __usram_size[];
|
||||
|
||||
#endif /* __BOARDS_RISC_V_K230_CANMV230_INCLUDE_BOARD_MEMORYMAP_H */
|
50
boards/risc-v/k230/canmv230/scripts/Make.defs
Normal file
50
boards/risc-v/k230/canmv230/scripts/Make.defs
Normal file
|
@ -0,0 +1,50 @@
|
|||
############################################################################
|
||||
# boards/risc-v/k230/canmv230/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
|
||||
|
||||
ifeq ($(CONFIG_ARCH_CHIP_K230),y)
|
||||
ifeq ($(CONFIG_BUILD_KERNEL),y)
|
||||
LDSCRIPT = ld-kernel.script
|
||||
else
|
||||
LDSCRIPT = ld-flat.script
|
||||
endif
|
||||
endif
|
||||
|
||||
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)
|
131
boards/risc-v/k230/canmv230/scripts/ld-flat.script
Normal file
131
boards/risc-v/k230/canmv230/scripts/ld-flat.script
Normal file
|
@ -0,0 +1,131 @@
|
|||
/****************************************************************************
|
||||
* boards/risc-v/qemu-rv/rv-virt/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.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x08000000;
|
||||
|
||||
.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 = . ;
|
||||
}
|
||||
|
||||
/* C++ support. For each global and static local C++ object,
|
||||
* GCC creates a small subroutine to construct the object. Pointers
|
||||
* to these routines (not the routines themselves) are stored as
|
||||
* simple, linear arrays in the .ctors section of the object file.
|
||||
* Similarly, pointers to global/static destructor routines are
|
||||
* stored in .dtors.
|
||||
*/
|
||||
|
||||
.ctors :
|
||||
{
|
||||
_sctors = . ;
|
||||
*(.ctors) /* Old ABI: Unallocated */
|
||||
*(.init_array) /* New ABI: Allocated */
|
||||
_edtors = . ;
|
||||
}
|
||||
|
||||
.dtors :
|
||||
{
|
||||
_sdtors = . ;
|
||||
*(.dtors) /* Old ABI: Unallocated */
|
||||
*(.fini_array) /* New ABI: Allocated */
|
||||
_edtors = . ;
|
||||
}
|
||||
|
||||
.bss :
|
||||
{
|
||||
_sbss = . ;
|
||||
*(.bss)
|
||||
*(.bss.*)
|
||||
*(.sbss)
|
||||
*(.sbss.*)
|
||||
*(.gnu.linkonce.b*)
|
||||
*(COMMON)
|
||||
_ebss = . ;
|
||||
}
|
||||
|
||||
/* 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) }
|
||||
}
|
1
boards/risc-v/k230/canmv230/src/.gitignore
vendored
Normal file
1
boards/risc-v/k230/canmv230/src/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/etctmp*
|
27
boards/risc-v/k230/canmv230/src/Makefile
Normal file
27
boards/risc-v/k230/canmv230/src/Makefile
Normal file
|
@ -0,0 +1,27 @@
|
|||
############################################################################
|
||||
# boards/risc-v/k230/canmv-k230/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 = k230_appinit.c
|
||||
|
||||
include $(TOPDIR)/boards/Board.mk
|
19
boards/risc-v/k230/canmv230/src/etc/init.d/rc.sysinit
Normal file
19
boards/risc-v/k230/canmv230/src/etc/init.d/rc.sysinit
Normal file
|
@ -0,0 +1,19 @@
|
|||
/****************************************************************************
|
||||
* boards/risc-v/k230/canmv230/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.
|
||||
*
|
||||
****************************************************************************/
|
19
boards/risc-v/k230/canmv230/src/etc/init.d/rcS
Normal file
19
boards/risc-v/k230/canmv230/src/etc/init.d/rcS
Normal file
|
@ -0,0 +1,19 @@
|
|||
/****************************************************************************
|
||||
* boards/risc-v/k230/canmv230/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.
|
||||
*
|
||||
****************************************************************************/
|
120
boards/risc-v/k230/canmv230/src/k230_appinit.c
Normal file
120
boards/risc-v/k230/canmv230/src/k230_appinit.c
Normal file
|
@ -0,0 +1,120 @@
|
|||
/****************************************************************************
|
||||
* boards/risc-v/k230/canmv230/src/k230_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
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* 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)
|
||||
{
|
||||
/* Perform board-specific initialization */
|
||||
|
||||
#ifdef CONFIG_NSH_ARCHINIT
|
||||
|
||||
mount(NULL, "/proc", "procfs", 0, NULL);
|
||||
|
||||
#endif
|
||||
}
|
Loading…
Reference in a new issue