diff --git a/bsp/k230/.config b/bsp/k230/.config index d058d259caf..66218422f42 100644 --- a/bsp/k230/.config +++ b/bsp/k230/.config @@ -155,7 +155,6 @@ CONFIG_RT_DEBUGING_ASSERT=y CONFIG_RT_DEBUGING_COLOR=y CONFIG_RT_DEBUGING_CONTEXT=y # CONFIG_RT_DEBUGING_AUTO_INIT is not set -# CONFIG_RT_DEBUGING_PAGE_LEAK is not set # CONFIG_RT_USING_CI_ACTION is not set # @@ -173,7 +172,6 @@ CONFIG_RT_USING_MESSAGEQUEUE=y # # Memory Management # -CONFIG_RT_PAGE_MAX_ORDER=11 CONFIG_RT_USING_MEMPOOL=y # CONFIG_RT_USING_SMALL_MEM is not set CONFIG_RT_USING_SLAB=y @@ -195,7 +193,7 @@ CONFIG_RT_USING_DEVICE_OPS=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=256 CONFIG_RT_CONSOLE_DEVICE_NAME="uart" -CONFIG_RT_VER_NUM=0x50200 +CONFIG_RT_VER_NUM=0x50201 CONFIG_RT_USING_STDC_ATOMIC=y CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -203,7 +201,7 @@ CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 CONFIG_ARCH_CPU_64BIT=y CONFIG_RT_USING_CACHE=y CONFIG_ARCH_MM_MMU=y -CONFIG_KERNEL_VADDR_START=0xFFFFFFC000220000 +CONFIG_KERNEL_VADDR_START=0xffffffc000000000 CONFIG_ARCH_RISCV=y CONFIG_ARCH_RISCV_FPU=y CONFIG_ARCH_RISCV_FPU_D=y @@ -533,6 +531,23 @@ CONFIG_RT_USING_ADT_REF=y # end of Utilities # CONFIG_RT_USING_VBUS is not set + +# +# Memory management +# +CONFIG_RT_PAGE_AFFINITY_BLOCK_SIZE=0x1000 +CONFIG_RT_PAGE_MAX_ORDER=11 +# CONFIG_RT_USING_MEMBLOCK is not set + +# +# Debugging +# +# CONFIG_RT_DEBUGGING_ALIASING is not set +# CONFIG_RT_DEBUGING_PAGE_LEAK is not set +# CONFIG_RT_DEBUGGING_PAGE_POISON is not set +# end of Debugging +# end of Memory management + CONFIG_RT_USING_LWP=y CONFIG_LWP_DEBUG=y CONFIG_LWP_DEBUG_INIT=y @@ -548,12 +563,6 @@ CONFIG_RT_USING_LDSO=y CONFIG_LWP_USING_TERMINAL=y CONFIG_LWP_PTY_MAX_PARIS_LIMIT=64 -# -# Memory management -# -# CONFIG_RT_USING_MEMBLOCK is not set -# end of Memory management - # # Using USB legacy version # @@ -696,7 +705,6 @@ CONFIG_LWP_PTY_MAX_PARIS_LIMIT=64 # CONFIG_PKG_USING_LHC_MODBUS is not set # CONFIG_PKG_USING_QMODBUS is not set # CONFIG_PKG_USING_PNET is not set -# CONFIG_PKG_USING_OPENER is not set # end of IoT - internet of things # @@ -830,7 +838,6 @@ CONFIG_LWP_PTY_MAX_PARIS_LIMIT=64 # CONFIG_PKG_USING_VOFA_PLUS is not set # CONFIG_PKG_USING_ZDEBUG is not set # CONFIG_PKG_USING_RVBACKTRACE is not set -# CONFIG_PKG_USING_HPATCHLITE is not set # end of tools packages # @@ -859,6 +866,7 @@ CONFIG_LWP_PTY_MAX_PARIS_LIMIT=64 # # CONFIG_PKG_USING_CMSIS_5 is not set # CONFIG_PKG_USING_CMSIS_CORE is not set +# CONFIG_PKG_USING_CMSIS_DSP is not set # CONFIG_PKG_USING_CMSIS_NN is not set # CONFIG_PKG_USING_CMSIS_RTOS1 is not set # CONFIG_PKG_USING_CMSIS_RTOS2 is not set @@ -910,6 +918,7 @@ CONFIG_LWP_PTY_MAX_PARIS_LIMIT=64 # CONFIG_PKG_USING_ARM_2D is not set # CONFIG_PKG_USING_MCUBOOT is not set # CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_CHERRYUSB is not set # CONFIG_PKG_USING_KMULTI_RTIMER is not set # CONFIG_PKG_USING_TFDB is not set # CONFIG_PKG_USING_QPC is not set @@ -921,7 +930,6 @@ CONFIG_LWP_PTY_MAX_PARIS_LIMIT=64 # CONFIG_PKG_USING_SFDB is not set # CONFIG_PKG_USING_RTP is not set # CONFIG_PKG_USING_REB is not set -# CONFIG_PKG_USING_RMP is not set # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # end of system packages @@ -975,13 +983,6 @@ CONFIG_LWP_PTY_MAX_PARIS_LIMIT=64 # CONFIG_PKG_USING_NRFX is not set # CONFIG_PKG_USING_NUCLEI_SDK is not set # CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set -# CONFIG_PKG_USING_MM32 is not set - -# -# WCH HAL & SDK Drivers -# -# CONFIG_PKG_USING_CH32V307_SDK is not set -# end of WCH HAL & SDK Drivers # end of HAL & SDK Drivers # @@ -1025,7 +1026,6 @@ CONFIG_LWP_PTY_MAX_PARIS_LIMIT=64 # CONFIG_PKG_USING_PMSXX is not set # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set -# CONFIG_PKG_USING_MLX90382 is not set # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set @@ -1161,7 +1161,6 @@ CONFIG_LWP_PTY_MAX_PARIS_LIMIT=64 # CONFIG_PKG_USING_QUEST is not set # CONFIG_PKG_USING_NAXOS is not set # CONFIG_PKG_USING_R_TINYMAIX is not set -# CONFIG_PKG_USING_LLMCHAT is not set # end of AI packages # @@ -1238,7 +1237,6 @@ CONFIG_PKG_ZLIB_VER="latest" # CONFIG_PKG_USING_KI is not set # CONFIG_PKG_USING_ARMv7M_DWT is not set # CONFIG_PKG_USING_CRCLIB is not set -# CONFIG_PKG_USING_LIBCRC is not set # CONFIG_PKG_USING_LWGPS is not set # CONFIG_PKG_USING_STATE_MACHINE is not set # CONFIG_PKG_USING_DESIGN_PATTERN is not set @@ -1495,6 +1493,6 @@ CONFIG_PKG_ZLIB_VER="latest" # end of Drivers Configuration CONFIG_BOARD_fpgac908=y -CONFIG___STACKSIZE__=8192 +CONFIG___STACKSIZE__=65536 CONFIG_C908_PLIC_PHY_ADDR=0xF00000000 CONFIG_BSP_ROOTFS_TYPE_CROMFS=y diff --git a/bsp/k230/.gitignore b/bsp/k230/.gitignore index fffebd9e3ab..739c929cc2f 100644 --- a/bsp/k230/.gitignore +++ b/bsp/k230/.gitignore @@ -4,6 +4,7 @@ packages/ install/ rtthread.* +link.lds.generated __pycache__ .config.old diff --git a/bsp/k230/README.md b/bsp/k230/README.md index 66b5f3d5592..33017ac9f29 100644 --- a/bsp/k230/README.md +++ b/bsp/k230/README.md @@ -1,38 +1,249 @@ -# rt-smart canaan porting +CanMV-K230 Board Support Package 使用说明 -## 下载依赖的软件包 + -在软件包无需变更的情况下只须执行一次 +- [1. 参考文档](#1-参考文档) +- [2. 概述](#2-概述) +- [3. 构建](#3-构建) + - [3.1. 安装 GCC 工具链](#31-安装-gcc-工具链) + - [3.2. 安装依赖](#32-安装依赖) + - [3.2.1. apt 软件包](#321-apt-软件包) + - [3.2.2. kconfiglib](#322-kconfiglib) + - [3.2.3. Env](#323-env) + - [3.3. 下载 RT-Thread 并更新依赖的软件包](#33-下载-rt-thread-并更新依赖的软件包) + - [3.4. 构建](#34-构建) +- [4. 烧写](#4-烧写) + - [4.1. 制作启动 SD 卡](#41-制作启动-sd-卡) + - [4.1.1. 编译固件](#411-编译固件) + - [4.1.2. 烧录固件](#412-烧录固件) + - [4.2. 单独更新 RT-Thread 内核](#42-单独更新-rt-thread-内核) +- [5. 上电启动](#5-上电启动) + + + +# 1. 参考文档 + +- 【参考 1】Canaan CanMV K230 文档: +- 【参考 2】K230 RTOS Only SDK 文档: +- 【参考 3】01Studio CanMV-K230 教程: + +# 2. 概述 + +CanMV 是一个由嘉楠科技(Canaan)官方创建和维护的开源项目。该项目将 MicroPython 移植到嘉楠科技边缘计算AI 芯片 K230 上,这就是 CanMV-K230 开发板。该项目旨在创建低成本,可扩展的,使用 Python 驱动的 AI 人工智能模块。 + +目前市面上生产的以 CanMV-K230 为原型的开发板有多种型号。本 BSP 支持 01Studio CanMV-K230 AI 开发板(内存 512MB)。 + +K230 是一款嘉楠科技(Canaan)出品的 64 位双核带硬件 FPU 和卷积加速器的 RISC-V SoC。 + +采用本 BSP 构建生成的 RT-Smart 和官方 SDK (【参考 2】) 配套使用并在大核上运行。 + +# 3. 构建 + +目前只验证了 Ubuntu/Linux 下构建。 + +```shell +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 22.04.5 LTS +Release: 22.04 +Codename: jammy ``` -source ~/.env/env.sh -pkgs --update + +## 3.1. 安装 GCC 工具链 + +下载地址: + +正确解压后(假设下载后解压在 `$USER/toolchain`, 也可以自己设定解压后的目录),导出如下环境变量,建议将这些 export 命令写入 `~/.bashrc`。 + +```shell +export RTT_CC="gcc" +export RTT_CC_PREFIX="riscv64-unknown-linux-musl-" +export RTT_EXEC_PATH="$USER/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin" ``` -## 将根文件系统编译进内核 +## 3.2. 安装依赖 -为了方便测试,这里将根文件系统制作成CROMFS格式转换成C代码编译进内核。 +### 3.2.1. apt 软件包 -1. 在 https://github.com/RT-Thread/userapps 页面下载riscv64预编译镜像 -2. 解压后将其中的ext4.img挂载到一个目录中 +```shell +$ sudo apt install -y scons python3-pip ``` -sudo mount ext4.img dir + +### 3.2.2. kconfiglib + +因为本 BSP 只在 RT-Thread v5.1.0 以上才支持,所以需要确保本地已经安装过 kconfiglib。 + +```shell +$ pip3 install kconfiglib i https://pypi.tuna.tsinghua.edu.cn/simple ``` -3. 删除其中一些不必要的文件以减小内核体积 +采用清华源是为了加快安装速度。 + +### 3.2.3. Env + +安装 env,具体参考 + +## 3.3. 下载 RT-Thread 并更新依赖的软件包 + +假设我们的工作路径是 `$WS` +```shell +$ cd $WS +$ git clone git@github.com:RT-Thread/rt-thread.git +$ cd rt-thread/bsp/k230 +$ source ~/.env/env.sh +$ pkgs --update ``` -du -ha # 查看文件大小 -sudo rm -rf dir/www dir/usr/share/fonts dir/tc +## 3.4. 构建 + +在 `$WS/rt-thread/bsp/k230` 下执行如下命令: + +```shell +$ scons --menuconfig # 默认不需要修改,直接保存即可,保存后可以达到同步最新配置的效果 +$ scons -j$(nproc) ``` -4. 生成cromfs文件 -工具位于 https://github.com/RT-Thread/userapps/tree/main/tools/cromfs + +此时在 `$WS/rt-thread/bsp/k230` 下会看到生成了 `rtthread.bin`, 这个就是我们构建出来的内核二进制文件。 + + +# 4. 烧写 + +`rtthread.bin` 并不能直接运行。目前我们基于 Canaan 官方的 RTOS-only SDK 制作 SD 卡,并基于 SD 卡启动内核。 + +## 4.1. 制作启动 SD 卡 + +### 4.1.1. 编译固件 + +参考 K230 RTOS Only 用户指南中的 “如何编译固件”:。 + +假设 sdk 安装的路径在 `$WS/rtos_k230` +注意事项如下: + +- 目前用户指南的环境只在 Ubuntu 20.04 LTS (x86_64) 上验证过,*其他 Linux 发行版未经充分测试,可能存在兼容性问题*。为避免和 BSP 构建环境冲突,建议在另外一台机器或者虚拟机中搭建此环境。 + +- `rtos_k230` 克隆自 `git@gitee.com:canmv-k230/manifest.git`(国内用户建议从 gitee 下载,否则速度太慢),本文基于的 commit 是 75662ae。 + +- 根据指南步骤操作,在 “4.4 选择目标硬件配置” 中选择 01studio 的 defconfig。 + + 和 01studio 相关的配置有两项: + + ```shell + $ make list-def + 1 [ ] k230_canmv_01studio_defconfig + ...... + 10 [*] k230_rtos_01studio_defconfig + ``` + + 其中: + - 1:01Studio 的带 micropython 的 canMV。 + - 10: 01Studio 的不带 micropython 的 canMV。 + + 为简单起见,这里选择 “ k230_rtos_01studio_defconfig” 。 + +最后在 `$WS/rtos_k230/output/k230_rtos_01studio_defconfig/` 下生成 `RtSmart-K230_01Studio_rtsmart_local_nncase_v2.9.0.img` + +### 4.1.2. 烧录固件 + +参考 K230 RTOS Only 用户指南中的 “如何烧录固件”:, 通过 SD 卡烧录。熟悉 Windows 平台的可以使用 balenaEtcher。 + +## 4.2. 单独更新 RT-Thread 内核 + +在开发 BSP 过程中每次更新内核都烧写整个 SD 卡是一件非常麻烦的事情。以下操作只更新内核所在分区。 + +首先前面构建生成的 `rtthread.bin` 并不能直接用,而是需要和 opensbi 的 image 打包后才能被 u-boot 加载。我们这里利用 K230 RTOS Only SDK 来打包。具体步骤如下: + +先将前面生成的 `rtthread.bin` 拷贝到 `$WS/rtos_k230/output/k230_rtos_01studio_defconfig/images/rtsmart` 下。 + +修改 `rtos_k230/Makefile`: + +```diff +diff --git a/Makefile b/Makefile +index 45a3f0c..39a017b 100644 +--- a/Makefile ++++ b/Makefile +@@ -93,13 +93,20 @@ rtsmart-menuconfig: + @$(MAKE) -C $(SDK_RTSMART_SRC_DIR) menuconfig + + .PHONY: opensbi opensbi-clean opensbi-distclean +-opensbi: .autoconf rtsmart ++opensbi: .autoconf + @$(MAKE) -C $(SDK_OPENSBI_SRC_DIR) all + opensbi-clean: + @$(MAKE) -C $(SDK_OPENSBI_SRC_DIR) clean + opensbi-distclean: + @$(MAKE) -C $(SDK_OPENSBI_SRC_DIR) distclean ``` -sudo ./cromfs-tool-x64 dir crom.img ./ # 将生成的cromfs_data.c放入applications目录 +然后执行: + +```shell +$ make opensbi ``` -## 编译 +会在 `$WS/rtos_k230/output/k230_rtos_01studio_defconfig/images/opensbi` 下生成一个新的 `opensbi_rtt_system.bin`,这也是我们要烧写的最终文件。 -``` -export RTT_EXEC_PATH=/mnt/e/tools/riscv64gc/bin # 你自己的编译器路径 +将 SD卡通过 USB 读卡器接入 Ubuntu 机器。假设枚举为 `/dev/sdb`。执行如下命令烧写: -scons -j8 +```shell +$ sudo dd if=$WS/rtos_k230/output/k230_rtos_01studio_defconfig/images/opensbi/opensbi_rtt_system.bin of=/dev/sdb seek=20480 ``` + +# 5. 上电启动 + +将 SD 卡插入 01Studo 开发板的 SD 卡槽。 + +连接 USB 转 UART 串口线到 “CPU0 调试口”,具体见下图: + +![](https://wiki.01studio.cc/assets/images/pinout-4d00bfa5ce28bf9723c94c00c7087fee.png) + +上电后串口控制台如下所示: + +```shell +U-Boot SPL 2022.10-00015-gcf105752 (Apr 09 2025 - 22:49:49 +0800) +lpddr4 2660 +00000000: PMU Major Msg: End of CA training +00000000: PMU Major Msg: End of initialization +00000000: PMU Major Msg: End of read enable training +00000000: PMU Major Msg: End of fine write leveling +00000000: PMU Major Msg: End of read dq deskew training +00000000: PMU Major Msg: End of MPR read delay center optimization +00000000: PMU Major Msg: End of Write leveling coarse delay +00000000: PMU Major Msg: End of write delay center optimization +00000000: PMU Major Msg: End of read delay center optimization +00000000: PMU Major Msg: End of max read latency training +00000000: PMU Major Msg: Firmware run has completed +image: uboot load to 0x1000000, compress=1 src=0x2aaaacff len=0x49e27 + + +U-Boot 2022.10-00015-gcf105752 (Apr 09 2025 - 22:49:49 +0800) + +CPU: rv64imafdcvsu +Model: kendryte k230 canmv 01studio +DRAM: 1 GiB +Core: 22 devices, 13 uclasses, devicetree: embed +MMC: mmc0@91580000: 0 +Loading Environment from MMC... OK +In: serial@91400000 +Out: serial@91400000 +Err: serial@91400000 +Net: No ethernet found. +Hit any key to stop autoboot: 0 +image: rtt load to 0x0, compress=1 src=0x2aaaad07 len=0x5fb7b +Jump to big hart + +OpenSBI v1.1-2-g1de130d + + \ | / +- RT - Thread Smart Operating System + / | \ 5.2.1 build Apr 23 2025 16:04:02 + 2006 - 2024 Copyright by RT-Thread team +lwIP-2.1.2 initialized! +[I/sal.skt] Socket Abstraction Layer initialize success. +[I/drivers.serial] Using /dev/ttyS0 as default console +CromFS mount failed! +Press any key to stop init process startup ... 3 +Press any key to stop init process startup ... 2 +Press any key to stop init process startup ... 1 +Starting init ... +Hello RISC-V +msh /> +``` \ No newline at end of file diff --git a/bsp/k230/SConstruct b/bsp/k230/SConstruct index c800dc6f5ce..13bf49b42e8 100644 --- a/bsp/k230/SConstruct +++ b/bsp/k230/SConstruct @@ -1,10 +1,36 @@ import os import sys import rtconfig +import platform +import subprocess from rtconfig import RTT_ROOT import sys +def generate_ldscript(input, output): + + if not os.path.exists(input): + print('Error: file', input, 'not found') + return + + if os.path.exists(output): + os.remove(output) + + if rtconfig.PLATFORM == 'gcc': + + gcc_cmd = os.path.join(rtconfig.EXEC_PATH, rtconfig.CC) + + # gcc -E -P -x c $input -o $output + if (platform.system() == 'Windows'): + child = subprocess.Popen([gcc_cmd, '-E', '-P', '-x', 'c', input, '-o', output], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + else: + child = subprocess.Popen(gcc_cmd + f' -E -P -x c {input} -o {output}', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + + child.communicate() + + print(output, 'is generated from', input) + + sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] from building import * @@ -26,12 +52,7 @@ Export('rtconfig') # prepare building environment objs = PrepareBuilding(env, RTT_ROOT, has_libcpu = False) -stack_size = 4096 - -stack_lds = open('link_stacksize.lds', 'w') -if GetDepend('__STACKSIZE__'): stack_size = GetDepend('__STACKSIZE__') -stack_lds.write('__STACKSIZE__ = %d;' % stack_size) -stack_lds.close() +generate_ldscript('link.lds', 'link.lds.generated') # make a building DoBuilding(TARGET, objs) diff --git a/bsp/k230/board/board.c b/bsp/k230/board/board.c index 14e35beee3a..2c60af119a2 100644 --- a/bsp/k230/board/board.c +++ b/bsp/k230/board/board.c @@ -22,16 +22,30 @@ #ifdef RT_USING_SMART #include #include "page.h" +#endif + +extern unsigned int __sram_size; +extern unsigned int __sram_base; +extern unsigned int __sram_end; +#define RAM_END (rt_size_t)((void *)&__sram_end) + +extern unsigned int __bss_start; +extern unsigned int __bss_end; -/* respect to boot loader, must be 0xFFFFFFC000200000 */ -RT_STATIC_ASSERT(kmem_region, KERNEL_VADDR_START == 0xFFFFFFC000220000); +#define RT_HW_HEAP_BEGIN ((void *)&__bss_end) +#define RT_HW_HEAP_END ((void *)(((rt_size_t)RT_HW_HEAP_BEGIN) + CONFIG_MEM_RTSMART_HEAP_SIZE)) + +#define RT_HW_PAGE_START ((void *)((rt_size_t)RT_HW_HEAP_END + sizeof(rt_size_t))) +#define RT_HW_PAGE_END ((void *)(RAM_END)) + +#ifdef RT_USING_SMART rt_region_t init_page_region = {(rt_size_t)RT_HW_PAGE_START, (rt_size_t)RT_HW_PAGE_END}; extern size_t MMUTable[]; struct mem_desc platform_mem_desc[] = { - {KERNEL_VADDR_START, (rt_size_t)RT_HW_PAGE_END - 1, (rt_size_t)ARCH_MAP_FAILED, NORMAL_MEM}, + {KERNEL_VADDR_START, (rt_size_t)(KERNEL_VADDR_START + CONFIG_MEM_MMZ_BASE + CONFIG_MEM_MMZ_SIZE - 1), (rt_size_t)ARCH_MAP_FAILED, NORMAL_MEM}, }; #define NUM_MEM_DESC (sizeof(platform_mem_desc) / sizeof(platform_mem_desc[0])) @@ -50,7 +64,7 @@ void init_bss(void) unsigned int *dst; dst = &__bss_start; - while (dst < &__bss_end) + while ((rt_ubase_t)dst < (rt_ubase_t)&__bss_end) { *dst++ = 0; } diff --git a/bsp/k230/board/board.h b/bsp/k230/board/board.h index 1947c2b0bb3..dbb43d1f7c6 100644 --- a/bsp/k230/board/board.h +++ b/bsp/k230/board/board.h @@ -11,23 +11,182 @@ #ifndef BOARD_H__ #define BOARD_H__ -#include +#include "rtconfig.h" +#include "mem_layout.h" -extern unsigned int __sram_size; -extern unsigned int __sram_base; -extern unsigned int __sram_end; -#define RAM_END (rt_size_t)((void *)&__sram_end) +/* + * K230 Memory Map + * + * See K230 Technical Reference Manual, chapter 1.5 Address Space mapping + */ +#define SRAM_BASE_ADDR (0x80200000UL) +#define SRAM_IO_SIZE (0x00200000UL) + +#define KPU_BASE_ADDR (0x80400000UL) +#define KPU_IO_SIZE (0x00000800UL) + +#define FFT_BASE_ADDR (0x80400800UL) +#define FFT_IO_SIZE (0x00000400UL) + +#define AI2D_BASE_ADDR (0x80400C00UL) +#define AI2D_IO_SIZE (0x00000400UL) + +#define GSDMA_BASE_ADDR (0x80800000UL) +#define GSDMA_IO_SIZE (0x00004000UL) + +#define DMA_BASE_ADDR (0x80804000UL) +#define DMA_IO_SIZE (0x00004000UL) + +#define DECOMP_BASE_ADDR (0x80808000UL) +#define DECOMP_IO_SIZE (0x00004000UL) + +#define NON_AI2D_BASE_ADDR (0x8080C000UL) +#define NON_AI2D_IO_SIZE (0x00004000UL) + +#define ISP_BASE_ADDR (0x90000000UL) +#define ISP_IO_SIZE (0x00008000UL) + +#define DEWARP_BASE_ADDR (0x90008000UL) +#define DEWARP_IO_SIZE (0x00001000UL) + +#define CSI_BASE_ADDR (0x90009000UL) +#define CSI_IO_SIZE (0x00002000UL) + +#define VPU_BASE_ADDR (0x90400000UL) +#define VPU_IO_SIZE (0x00010000UL) + +/*2.5D*/ +#define TAAH_GPU_BASE_ADDR (0x90800000UL) +#define TAAH_GPU_IO_SIZE (0x00040000UL) + +#define VO_BASE_ADDR (0x90840000UL) +#define VO_IO_SIZE (0x00010000UL) + +#define DSI_BASE_ADDR (0x90850000UL) +#define DSI_IO_SIZE (0x00001000UL) + +#define GPU_ENGINE_BASE_ADDR (0x90A00000UL) +#define GPU_ENGINE_IO_SIZE (0x00000800UL) + +#define PMU_BASE_ADDR (0x91000000UL) +#define PMU_IO_SIZE (0x00000C00UL) + +#define RTC_BASE_ADDR (0x91000C00UL) +#define RTC_IO_SIZE (0x00000400UL) + +#define CMU_BASE_ADDR (0x91100000UL) +#define CMU_IO_SIZE (0x00001000UL) + +#define RMU_BASE_ADDR (0x91101000UL) +#define RMU_IO_SIZE (0x00001000UL) + +#define BOOT_BASE_ADDR (0x91102000UL) +#define BOOT_IO_SIZE (0x00001000UL) + +#define PWR_BASE_ADDR (0x91103000UL) +#define PWR_IO_SIZE (0x00001000UL) + +#define MAILBOX_BASE_ADDR (0x91104000UL) +#define MAILBOX_IO_SIZE (0x00001000UL) + +#define IOMUX_BASE_ADDR (0x91105000UL) +#define IOMUX_IO_SIZE (0x00000800UL) + +#define HW_TIMER_BASE_ADDR (0x91105800UL) +#define HW_TIMER_IO_SIZE (0x00000800UL) + +#define WDT0_BASE_ADDR (0x91106000UL) +#define WDT0_IO_SIZE (0x00000800UL) + +#define WDT1_BASE_ADDR (0x91106800UL) +#define WDT1_IO_SIZE (0x00000800UL) + +#define TS_BASE_ADDR (0x91107000UL) +#define TS_IO_SIZE (0x00000800UL) + +#define HDI_BASE_ADDR (0x91107800UL) +#define HDI_IO_SIZE (0x00000800UL) + +#define STC_BASE_ADDR (0x91108000UL) +#define STC_IO_SIZE (0x00001000UL) + +#define BOOTROM_BASE_ADDR (0x91200000UL) +#define BOOTROM_IO_SIZE (0x00010000UL) + +#define SECURITY_BASE_ADDR (0x91210000UL) +#define SECURITY_IO_SIZE (0x00008000UL) + +#define UART0_BASE_ADDR (0x91400000UL) +#define UART0_IO_SIZE (0x00001000UL) + +#define UART1_BASE_ADDR (0x91401000UL) +#define UART1_IO_SIZE (0x00001000UL) + +#define UART2_BASE_ADDR (0x91402000UL) +#define UART2_IO_SIZE (0x00001000UL) + +#define UART3_BASE_ADDR (0x91403000UL) +#define UART3_IO_SIZE (0x00001000UL) + +#define UART4_BASE_ADDR (0x91404000UL) +#define UART4_IO_SIZE (0x00001000UL) + +#define I2C0_BASE_ADDR (0x91405000UL) +#define I2C0_IO_SIZE (0x00001000UL) + +#define I2C1_BASE_ADDR (0x91406000UL) +#define I2C1_IO_SIZE (0x00001000UL) + +#define I2C2_BASE_ADDR (0x91407000UL) +#define I2C2_IO_SIZE (0x00001000UL) + +#define I2C3_BASE_ADDR (0x91408000UL) +#define I2C3_IO_SIZE (0x00001000UL) + +#define I2C4_BASE_ADDR (0x91409000UL) +#define I2C4_IO_SIZE (0x00001000UL) + +#define PWM_BASE_ADDR (0x9140A000UL) +#define PWM_IO_SIZE (0x00001000UL) + +#define GPIO0_BASE_ADDR (0x9140B000UL) +#define GPIO0_IO_SIZE (0x00001000UL) + +#define GPIO1_BASE_ADDR (0x9140C000UL) +#define GPIO1_IO_SIZE (0x00001000UL) + +#define ADC_BASE_ADDR (0x9140D000UL) +#define ADC_IO_SIZE (0x00001000UL) + +#define CODEC_BASE_ADDR (0x9140E000UL) +#define CODEC_IO_SIZE (0x00001000UL) + +#define AUDIO_BASE_ADDR (0x9140F000UL) +#define AUDIO_IO_SIZE (0x00001000UL) + +#define USB2_BASE_ADDR (0x91500000UL) +#define USB2_IO_SIZE (0x00080000UL) + +#define SD_HC_BASE_ADDR (0x91580000UL) +#define SD_HC_IO_SIZE (0x00002000UL) + +#define SPI_QOPI_BASE_ADDR (0x91582000UL) +#define SPI_QOPI_IO_SIZE (0x00002000UL) + +#define SPI_OPI_BASE_ADDR (0x91584000UL) +#define SPI_OPI_IO_SIZE (0x00001000UL) + +#define HI_SYS_CONFIG_BASE_ADDR (0x91585000UL) +#define HI_SYS_CONFIG_IO_SIZE (0x00000400UL) -extern unsigned int __bss_start; -extern unsigned int __bss_end; +#define DDRC_CONF_BASE_ADDR (0x98000000UL) +#define DDRC_CONF_IO_SIZE (0x02000000UL) -#define RT_HW_HEAP_BEGIN ((void *)&__bss_end) -#define RT_HW_HEAP_END ((void *)(((rt_size_t)RT_HW_HEAP_BEGIN) + 8 * 1024 * 1024)) +#define SPI_XIP_FLASH_BASE_ADDR (0xC0000000UL) +#define SPI_XIP_FLASH_IO_SIZE (0x08000000UL) -#define RT_HW_PAGE_START ((void *)((rt_size_t)RT_HW_HEAP_END + sizeof(rt_size_t))) -#define RT_HW_PAGE_END ((void *)(RAM_END)) +#define IO_SPACE_BASE_ADDR (KPU_BASE_ADDR) -void rt_hw_board_init(void); -void rt_init_user_mem(struct rt_thread *thread, const char *name, unsigned long *entry); +#define TIMER_CLK_FREQ (27000000) -#endif +#endif // BOARD_H__ diff --git a/bsp/k230/board/mem_layout.h b/bsp/k230/board/mem_layout.h new file mode 100644 index 00000000000..cca1e0f7d99 --- /dev/null +++ b/bsp/k230/board/mem_layout.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef MEMORY_LAYOUT_H__ +#define MEMORY_LAYOUT_H__ + +#include "../rtconfig.h" + +/* + * Physical Memory layout: + * + * +---------+ <- CONFIG_MEM_TOTAL_SIZE + * | ...... | maybe zero + * +---------+ <- CONFIG_MEM_MMZ_BASE + CONFIG_MEM_MMZ_SIZE + * | | + * | | + * | | + * | | + * | | + * | | + * | | + * | | + * |---------| <- CONFIG_MEM_MMZ_BASE + * | ...... | maybe zero + * +---------+ <- CONFIG_MEM_RTSMART_SIZE + * | guard | MEM_GUARD_SIZE + * +---------+ <- End of Kerenl + * | | + * | | + * +---------+ + * | heap | CONFIG_MEM_RTSMART_HEAP_SIZE + * +---------+ + * | | + * +---------+ <- Beginning of Kernel <- mapping to KERNEL_VADDR_START + MEM_OPENSBI_SIZE + * | opensbi | MEM_OPENSBI_SIZE + * +---------+ <- Beginning of Physical Memory (0) <- mapping to KERNEL_VADDR_START + */ + +#define MEM_OPENSBI_SIZE 0x20000 // 128K +#define MEM_GUARD_SIZE 0x1000 // 4K + +/* + * The value of CONFIG_XXX may come from rtconfig.h. This is mainly for + * compatibility with compiling RT-Thread in the SDK environment and using + * the SDK configuration. + * + * If CONFIG_XXX is defined, it means that the value comes from the SDK + * configuration, otherwise the default configuration of bsp/k230 in RT-Thead + * is used. The default configuration of bsp/k230 is for the 01Studio CanMV + * development board that supports 512MB of memory. + */ +#ifndef CONFIG_MEM_TOTAL_SIZE +#define CONFIG_MEM_TOTAL_SIZE 0x20000000 // 512M +#endif + +#ifndef CONFIG_MEM_RTSMART_SIZE +#define CONFIG_MEM_RTSMART_SIZE 0x10000000 // 256M +#endif + +#ifndef CONFIG_MEM_RTSMART_HEAP_SIZE +#define CONFIG_MEM_RTSMART_HEAP_SIZE 0x2000000 // 32M +#endif + +#ifndef CONFIG_MEM_MMZ_BASE +#define CONFIG_MEM_MMZ_BASE 0x10000000 // 512M +#endif + +#ifndef CONFIG_MEM_MMZ_SIZE +#define CONFIG_MEM_MMZ_SIZE 0x10000000 // 256M +#endif + +#define MEM_KERNEL_SIZE (CONFIG_MEM_RTSMART_SIZE - MEM_OPENSBI_SIZE - MEM_GUARD_SIZE) + +#endif // MEMORY_LAYOUT_H__ \ No newline at end of file diff --git a/bsp/k230/drivers/interdrv/uart/drv_uart.c b/bsp/k230/drivers/interdrv/uart/drv_uart.c index dc6a9dbf8a4..03dbe1734a5 100644 --- a/bsp/k230/drivers/interdrv/uart/drv_uart.c +++ b/bsp/k230/drivers/interdrv/uart/drv_uart.c @@ -13,12 +13,11 @@ #include "board.h" #include "drv_uart.h" #include "riscv_io.h" -#include "board.h" #define UART_DEFAULT_BAUDRATE 115200 #define UART_CLK 50000000 -#define UART_ADDR 0x91403000UL -#define UART_IRQ 0x13 +#define UART_ADDR UART0_BASE_ADDR +#define UART_IRQ 0x10 #define UART_RBR (0x00) /* receive buffer register */ @@ -94,6 +93,7 @@ struct device_uart { rt_ubase_t hw_base; + void* pa_base; rt_uint32_t irqno; }; @@ -129,7 +129,17 @@ static void _uart_init(void *uart_base) dlh = bdiv >> 12; dll = (bdiv - (dlh << 12)) / 16; dlf = bdiv - (dlh << 12) - dll * 16; - if(dlh == 0 && dll == 0) + // dlh can be 0 only if bdiv < 4096 (since we're shifting right by 12 bits) + // bdiv = UART_CLK / UART_DEFAULT_BAUDRATE + // = 50000000 / 115200 + // = 434.027 + // so when dlh is 0, + // dll = (bdiv - (dlh << 12)) / 16 + // = (434.027 - 0) / 16 + // = 27.626 + // which means dll can not reach 0, + // so we use 1 as the minimum value for dll + if((dlh == 0) && (dll < 1)) { dll = 1; dlf = 0; @@ -251,7 +261,7 @@ static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg return -RT_ENOMEM; } - mmap2->ret = lwp_map_user_phy(lwp_self(), RT_NULL, (void*)(uart->hw_base), mmap2->length, 0); + mmap2->ret = lwp_map_user_phy(lwp_self(), RT_NULL, uart->pa_base, mmap2->length, 0); } break; } @@ -311,12 +321,16 @@ static void rt_hw_uart_isr(int irq, void *param) } else if (lsr & (UART_LSR_DR | UART_LSR_BI)) { - #ifdef RT_USING_SERIAL_V2 struct rt_serial_rx_fifo *rx_fifo; - uint8_t data; - rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; - RT_ASSERT(rx_fifo != RT_NULL); + + if (rx_fifo == NULL) + { + readb((void*)(uart_base + UART_RBR)); + return; + } + #ifdef RT_USING_SERIAL_V2 + uint8_t data; do { data = readb((void*)(uart_base + UART_RBR)); @@ -352,7 +366,8 @@ int rt_hw_uart_init(void) serial->config = config; serial->config.baud_rate = UART_DEFAULT_BAUDRATE; - uart->hw_base = (rt_base_t)rt_ioremap((void *)UART_ADDR, 0x1000); + uart->pa_base = (void *)UART_ADDR; + uart->hw_base = (rt_base_t)rt_ioremap(uart->pa_base, 0x1000); uart->irqno = UART_IRQ; _uart_init((void*)(uart->hw_base)); diff --git a/bsp/k230/link.lds b/bsp/k230/link.lds index ad731cd615e..0145bda8851 100644 --- a/bsp/k230/link.lds +++ b/bsp/k230/link.lds @@ -8,21 +8,18 @@ * 2020/12/12 bernard The first version */ -INCLUDE "link_stacksize.lds" +#include "board/mem_layout.h" OUTPUT_ARCH( "riscv" ) /* * Memory layout: - * 2M ==> +128K: Bootloader(sbi) - * 2M+128K ==> +sizeof(rtthread.bin): Kernel - * ~ ==> 32M: Heap - * 32M - 66M: Page + * See mem_layout.h */ MEMORY { - SRAM(wx) : ORIGIN = 0xFFFFFFC000220000, LENGTH = 64M - 128K + SRAM : ORIGIN = KERNEL_VADDR_START + MEM_OPENSBI_SIZE, LENGTH = MEM_KERNEL_SIZE } ENTRY(_start) diff --git a/bsp/k230/link_stacksize.lds b/bsp/k230/link_stacksize.lds deleted file mode 100644 index 13e6ee8b1c3..00000000000 --- a/bsp/k230/link_stacksize.lds +++ /dev/null @@ -1 +0,0 @@ -__STACKSIZE__ = 8192; \ No newline at end of file diff --git a/bsp/k230/rtconfig.h b/bsp/k230/rtconfig.h index 54fb87177f6..e7463a1b9d7 100644 --- a/bsp/k230/rtconfig.h +++ b/bsp/k230/rtconfig.h @@ -3,6 +3,75 @@ /* RT-Thread Kernel */ +/* klibc options */ + +/* rt_vsnprintf options */ + +#define RT_KLIBC_USING_VSNPRINTF_LONGLONG +#define RT_KLIBC_USING_VSNPRINTF_STANDARD +#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS +#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS +#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER +#define RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER +#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32 +#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32 +#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6 +#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9 +#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4 +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ #define RT_NAME_MAX 8 #define RT_USING_SMART #define RT_CPUS_NR 1 @@ -10,6 +79,7 @@ #define RT_THREAD_PRIORITY_32 #define RT_THREAD_PRIORITY_MAX 32 #define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK #define RT_USING_HOOK #define RT_HOOK_USING_FUNC_PTR #define RT_USING_HOOKLIST @@ -21,19 +91,13 @@ #define RT_TIMER_THREAD_STACK_SIZE 8192 #define RT_USING_CPU_USAGE_TRACER -/* kservice optimization */ +/* kservice options */ -/* end of kservice optimization */ - -/* klibc optimization */ - -#define RT_KLIBC_USING_VSNPRINTF_LONGLONG -/* end of klibc optimization */ +/* end of kservice options */ #define RT_USING_DEBUG #define RT_DEBUGING_ASSERT #define RT_DEBUGING_COLOR #define RT_DEBUGING_CONTEXT -#define RT_USING_OVERFLOW_CHECK /* Inter-Thread communication */ @@ -46,7 +110,6 @@ /* Memory Management */ -#define RT_PAGE_MAX_ORDER 11 #define RT_USING_MEMPOOL #define RT_USING_SLAB #define RT_USING_SLAB_AS_HEAP @@ -54,18 +117,17 @@ /* end of Memory Management */ #define RT_USING_DEVICE #define RT_USING_DEVICE_OPS -#define RT_USING_SCHED_THREAD_CTX #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 256 #define RT_CONSOLE_DEVICE_NAME "uart" -#define RT_VER_NUM 0x50200 +#define RT_VER_NUM 0x50201 #define RT_USING_STDC_ATOMIC #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ #define ARCH_CPU_64BIT #define RT_USING_CACHE #define ARCH_MM_MMU -#define KERNEL_VADDR_START 0xFFFFFFC000220000 +#define KERNEL_VADDR_START 0xffffffc000000000 #define ARCH_RISCV #define ARCH_RISCV_FPU #define ARCH_RISCV_FPU_D @@ -145,6 +207,7 @@ #define RT_USING_SERIAL_V1 #define RT_SERIAL_USING_DMA #define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_SERIAL_BYPASS #define RT_USING_CPUTIME #define RT_USING_CPUTIME_RISCV #define CPUTIME_TIMER_FREQ 25000000 @@ -158,6 +221,13 @@ #define RT_MMCSD_STACK_SIZE 8192 #define RT_MMCSD_THREAD_PRIORITY 22 #define RT_MMCSD_MAX_PARTITION 16 +#define RT_USING_BLK + +/* Partition Types */ + +#define RT_BLK_PARTITION_DFS +#define RT_BLK_PARTITION_EFI +/* end of Partition Types */ #define RT_USING_PIN #define RT_USING_KTIME /* end of Device Drivers */ @@ -276,9 +346,20 @@ #define RT_USING_ADT_HASHMAP #define RT_USING_ADT_REF /* end of Utilities */ + +/* Memory management */ + +#define RT_PAGE_AFFINITY_BLOCK_SIZE 0x1000 +#define RT_PAGE_MAX_ORDER 11 + +/* Debugging */ + +/* end of Debugging */ +/* end of Memory management */ #define RT_USING_LWP #define LWP_DEBUG #define LWP_DEBUG_INIT +#define LWP_USING_RUNTIME #define RT_LWP_MAX_NR 30 #define LWP_TASK_STACK_SIZE 16384 #define RT_CH_MSG_MAX_NR 1024 @@ -288,10 +369,6 @@ #define LWP_USING_TERMINAL #define LWP_PTY_MAX_PARIS_LIMIT 64 -/* Memory management */ - -/* end of Memory management */ - /* Using USB legacy version */ /* end of Using USB legacy version */ @@ -484,7 +561,7 @@ /* end of Drivers Configuration */ #define BOARD_fpgac908 -#define __STACKSIZE__ 8192 +#define __STACKSIZE__ 65536 #define C908_PLIC_PHY_ADDR 0xF00000000 #define BSP_ROOTFS_TYPE_CROMFS diff --git a/bsp/k230/rtconfig.py b/bsp/k230/rtconfig.py index 5d7f5b3b218..10987fa320b 100644 --- a/bsp/k230/rtconfig.py +++ b/bsp/k230/rtconfig.py @@ -1,4 +1,5 @@ import os +import re # toolchains options ARCH ='risc-v' @@ -13,14 +14,18 @@ if CROSS_TOOL == 'gcc': PLATFORM = 'gcc' - EXEC_PATH = r'/opt/Xuantie-900-gcc-elf-newlib-x86_64-V2.8.1/bin' + EXEC_PATH = r'/opt/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_rtt/bin' else: print('Please make sure your toolchains is GNU GCC!') exit(0) -EXEC_PATH = os.getenv('RTT_EXEC_PATH', EXEC_PATH) +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') -BUILD = 'debug' +if re.match("-DDBGLV=0", os.getenv('KCFLAGS', '-DDBGLV=0')): + BUILD = 'release' +else: + BUILD = 'debug' if PLATFORM == 'gcc': # toolchains @@ -36,18 +41,19 @@ OBJDUMP = PREFIX + 'objdump' OBJCPY = PREFIX + 'objcopy' - DEVICE = ' -mcmodel=medany -march=rv64imafdc -mabi=lp64' + DEVICE = ' -mcmodel=medany -march=rv64imafdcv -mabi=lp64d' CFLAGS = DEVICE + ' -Wno-cpp -fvar-tracking -ffreestanding -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -D_POSIX_SOURCE ' AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__ASSEMBLY__' - LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,_start -T link.lds' + ' -lsupc++ -lgcc -static' + LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,_start -T link.lds.generated' + ' -lsupc++ -lgcc -static' CPATH = '' LPATH = '' if BUILD == 'debug': - CFLAGS += ' -O2 -g -gdwarf-2' - AFLAGS += ' -g -gdwarf-2' + CFLAGS += ' -O0 -gdwarf-2' + AFLAGS += ' -gdwarf-2' else: CFLAGS += ' -O2 -g -gdwarf-2' + CFLAGS += ' ' + os.getenv('KCFLAGS', '-DDBGLV=0') CXXFLAGS = CFLAGS