From f6fb25fe03e24f50a2f4ebc4e9b219bc1767e70b Mon Sep 17 00:00:00 2001 From: Wang Chen Date: Wed, 2 Apr 2025 15:04:51 +0800 Subject: [PATCH 1/7] bsp: k230: support canmv board Some changes to support canmv board, such as: - Address constant, some may need be set as configuration later. - link script - build script Signed-off-by: Wang Chen --- bsp/k230/board/board.c | 4 +- bsp/k230/board/board.h | 174 +++++++++++++++++++++++++++++++++++- bsp/k230/link.lds | 2 +- bsp/k230/link_stacksize.lds | 2 +- bsp/k230/rtconfig.py | 18 ++-- 5 files changed, 188 insertions(+), 12 deletions(-) diff --git a/bsp/k230/board/board.c b/bsp/k230/board/board.c index 14e35beee3a..3ab1bd29a4d 100644 --- a/bsp/k230/board/board.c +++ b/bsp/k230/board/board.c @@ -24,14 +24,14 @@ #include "page.h" /* respect to boot loader, must be 0xFFFFFFC000200000 */ -RT_STATIC_ASSERT(kmem_region, KERNEL_VADDR_START == 0xFFFFFFC000220000); +RT_STATIC_ASSERT(kmem_region, KERNEL_VADDR_START == 0xffffffc000020000); 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)0xFFFFFFC020000000 - 1, (rt_size_t)ARCH_MAP_FAILED, NORMAL_MEM}, }; #define NUM_MEM_DESC (sizeof(platform_mem_desc) / sizeof(platform_mem_desc[0])) diff --git a/bsp/k230/board/board.h b/bsp/k230/board/board.h index 1947c2b0bb3..ebb6cf1eaf3 100644 --- a/bsp/k230/board/board.h +++ b/bsp/k230/board/board.h @@ -16,13 +16,13 @@ extern unsigned int __sram_size; extern unsigned int __sram_base; extern unsigned int __sram_end; -#define RAM_END (rt_size_t)((void *)&__sram_end) +#define RAM_END (rt_size_t)((void *)&__sram_end) extern unsigned int __bss_start; extern unsigned int __bss_end; #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 RT_HW_HEAP_END ((void *)(((rt_size_t)RT_HW_HEAP_BEGIN) + 0x2000000 )) #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)) @@ -30,4 +30,174 @@ extern unsigned int __bss_end; 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) + +/* From 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) + +#define DDRC_CONF_BASE_ADDR (0x98000000UL) +#define DDRC_CONF_IO_SIZE (0x02000000UL) + +#define SPI_XIP_FLASH_BASE_ADDR (0xC0000000UL) +#define SPI_XIP_FLASH_IO_SIZE (0x08000000UL) + +#define IO_SPACE_BASE_ADDR (KPU_BASE_ADDR) #endif diff --git a/bsp/k230/link.lds b/bsp/k230/link.lds index ad731cd615e..3f3818cdd78 100644 --- a/bsp/k230/link.lds +++ b/bsp/k230/link.lds @@ -22,7 +22,7 @@ OUTPUT_ARCH( "riscv" ) MEMORY { - SRAM(wx) : ORIGIN = 0xFFFFFFC000220000, LENGTH = 64M - 128K + SRAM : ORIGIN = 0xffffffc000020000, LENGTH = 262012K } ENTRY(_start) diff --git a/bsp/k230/link_stacksize.lds b/bsp/k230/link_stacksize.lds index 13e6ee8b1c3..89ab4af217a 100644 --- a/bsp/k230/link_stacksize.lds +++ b/bsp/k230/link_stacksize.lds @@ -1 +1 @@ -__STACKSIZE__ = 8192; \ No newline at end of file +__STACKSIZE__ = 65536; \ No newline at end of file diff --git a/bsp/k230/rtconfig.py b/bsp/k230/rtconfig.py index 5d7f5b3b218..4cd6df869a6 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,7 +41,7 @@ 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' @@ -44,10 +49,11 @@ 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 From f29dcf3b123ed949660f4c4257a33587d2e2b53f Mon Sep 17 00:00:00 2001 From: Wang Chen Date: Wed, 2 Apr 2025 15:50:31 +0800 Subject: [PATCH 2/7] bsp: k230: update uart driver Signed-off-by: Wang Chen --- bsp/k230/drivers/interdrv/uart/drv_uart.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/bsp/k230/drivers/interdrv/uart/drv_uart.c b/bsp/k230/drivers/interdrv/uart/drv_uart.c index dc6a9dbf8a4..d5528241b82 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; }; @@ -251,7 +251,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 +311,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 +356,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)); From 6058c90f7a4e657ab82df149539a8e8130cce100 Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Mon, 7 Apr 2025 08:47:37 +0800 Subject: [PATCH 3/7] bsp: k230: updated config KERNEL_VADDR_START changed to 0xffffffc000020000. __STACKSIZE__ changed to 65536. Signed-off-by: Chen Wang --- bsp/k230/.config | 46 +++++++++--------- bsp/k230/rtconfig.h | 111 +++++++++++++++++++++++++++++++++++++------- 2 files changed, 116 insertions(+), 41 deletions(-) diff --git a/bsp/k230/.config b/bsp/k230/.config index d058d259caf..bfd6ee0ecbf 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=0xffffffc000020000 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/rtconfig.h b/bsp/k230/rtconfig.h index 54fb87177f6..27a37f7d2c2 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 0xffffffc000020000 #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 From 7ee48b21e9eedac0c404b601311f402add8f4ac9 Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Thu, 10 Apr 2025 18:27:28 +0800 Subject: [PATCH 4/7] bsp: k230: use rtconfig.h for linkscript For linker script, use constant macro defined from rtconfig.h, not immediate value. Also cleanup the link_statksize.lds, it is also not needed when using new mechanism. Signed-off-by: Chen Wang --- bsp/k230/.gitignore | 1 + bsp/k230/SConstruct | 33 +++++++++++++++++++++++++++------ bsp/k230/link.lds | 4 ++-- bsp/k230/link_stacksize.lds | 1 - bsp/k230/rtconfig.py | 2 +- 5 files changed, 31 insertions(+), 10 deletions(-) delete mode 100644 bsp/k230/link_stacksize.lds 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/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/link.lds b/bsp/k230/link.lds index 3f3818cdd78..2ce0fe3f02d 100644 --- a/bsp/k230/link.lds +++ b/bsp/k230/link.lds @@ -8,7 +8,7 @@ * 2020/12/12 bernard The first version */ -INCLUDE "link_stacksize.lds" +#include "rtconfig.h" OUTPUT_ARCH( "riscv" ) @@ -22,7 +22,7 @@ OUTPUT_ARCH( "riscv" ) MEMORY { - SRAM : ORIGIN = 0xffffffc000020000, LENGTH = 262012K + SRAM : ORIGIN = KERNEL_VADDR_START, LENGTH = 262012K } ENTRY(_start) diff --git a/bsp/k230/link_stacksize.lds b/bsp/k230/link_stacksize.lds deleted file mode 100644 index 89ab4af217a..00000000000 --- a/bsp/k230/link_stacksize.lds +++ /dev/null @@ -1 +0,0 @@ -__STACKSIZE__ = 65536; \ No newline at end of file diff --git a/bsp/k230/rtconfig.py b/bsp/k230/rtconfig.py index 4cd6df869a6..10987fa320b 100644 --- a/bsp/k230/rtconfig.py +++ b/bsp/k230/rtconfig.py @@ -44,7 +44,7 @@ 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 = '' From e4a7973947d2cddad705682f3007431578672a16 Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Fri, 11 Apr 2025 09:39:03 +0800 Subject: [PATCH 5/7] bsp: k230: use configuration instead of immediate value The original code used immediate values directly when it came to memory layout, which was not a good programming habit. Now we use macros and try to be compatible with SDK configuration values in the SDK compilation environment. The main changes are to clean up board.h, and extract some memory layout constants to define a new header file mem_layout.h. Also update KERNEL_VADDR_START to the default value for Smart, so we can use it as base to calculate other mapping address. Signed-off-by: Chen Wang --- bsp/k230/.config | 2 +- bsp/k230/board/board.c | 20 ++++++++-- bsp/k230/board/board.h | 33 ++++++---------- bsp/k230/board/mem_layout.h | 76 +++++++++++++++++++++++++++++++++++++ bsp/k230/link.lds | 9 ++--- bsp/k230/rtconfig.h | 2 +- 6 files changed, 109 insertions(+), 33 deletions(-) create mode 100644 bsp/k230/board/mem_layout.h diff --git a/bsp/k230/.config b/bsp/k230/.config index bfd6ee0ecbf..66218422f42 100644 --- a/bsp/k230/.config +++ b/bsp/k230/.config @@ -201,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=0xffffffc000020000 +CONFIG_KERNEL_VADDR_START=0xffffffc000000000 CONFIG_ARCH_RISCV=y CONFIG_ARCH_RISCV_FPU=y CONFIG_ARCH_RISCV_FPU_D=y diff --git a/bsp/k230/board/board.c b/bsp/k230/board/board.c index 3ab1bd29a4d..3afcc4d3511 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 == 0xffffffc000020000); +#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)0xFFFFFFC020000000 - 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])) diff --git a/bsp/k230/board/board.h b/bsp/k230/board/board.h index ebb6cf1eaf3..dbb43d1f7c6 100644 --- a/bsp/k230/board/board.h +++ b/bsp/k230/board/board.h @@ -11,28 +11,14 @@ #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) - -extern unsigned int __bss_start; -extern unsigned int __bss_end; - -#define RT_HW_HEAP_BEGIN ((void *)&__bss_end) -#define RT_HW_HEAP_END ((void *)(((rt_size_t)RT_HW_HEAP_BEGIN) + 0x2000000 )) - -#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)) - -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) - -/* From K230 Technical Reference Manual, chapter 1.5 Address Space mapping */ +/* + * K230 Memory Map + * + * See K230 Technical Reference Manual, chapter 1.5 Address Space mapping + */ #define SRAM_BASE_ADDR (0x80200000UL) #define SRAM_IO_SIZE (0x00200000UL) @@ -200,4 +186,7 @@ void rt_init_user_mem(struct rt_thread *thread, const char *name, unsigned long #define SPI_XIP_FLASH_IO_SIZE (0x08000000UL) #define IO_SPACE_BASE_ADDR (KPU_BASE_ADDR) -#endif + +#define TIMER_CLK_FREQ (27000000) + +#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/link.lds b/bsp/k230/link.lds index 2ce0fe3f02d..0145bda8851 100644 --- a/bsp/k230/link.lds +++ b/bsp/k230/link.lds @@ -8,21 +8,18 @@ * 2020/12/12 bernard The first version */ -#include "rtconfig.h" +#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 : ORIGIN = KERNEL_VADDR_START, LENGTH = 262012K + SRAM : ORIGIN = KERNEL_VADDR_START + MEM_OPENSBI_SIZE, LENGTH = MEM_KERNEL_SIZE } ENTRY(_start) diff --git a/bsp/k230/rtconfig.h b/bsp/k230/rtconfig.h index 27a37f7d2c2..e7463a1b9d7 100644 --- a/bsp/k230/rtconfig.h +++ b/bsp/k230/rtconfig.h @@ -127,7 +127,7 @@ #define ARCH_CPU_64BIT #define RT_USING_CACHE #define ARCH_MM_MMU -#define KERNEL_VADDR_START 0xffffffc000020000 +#define KERNEL_VADDR_START 0xffffffc000000000 #define ARCH_RISCV #define ARCH_RISCV_FPU #define ARCH_RISCV_FPU_D From 8ce4bf2ac8c5bca5a0d0fc0976dff2121c080452 Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Wed, 23 Apr 2025 16:02:27 +0800 Subject: [PATCH 6/7] bsp: canmv: update README Signed-off-by: Chen Wang --- bsp/k230/README.md | 251 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 231 insertions(+), 20 deletions(-) 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 From d5cca2a1692fe52f2edf6a3bbf2dfc263f8fbae1 Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Wed, 23 Apr 2025 16:29:54 +0800 Subject: [PATCH 7/7] bsp: k230: fix some cpp_check warnings Signed-off-by: Chen Wang --- bsp/k230/board/board.c | 2 +- bsp/k230/drivers/interdrv/uart/drv_uart.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/bsp/k230/board/board.c b/bsp/k230/board/board.c index 3afcc4d3511..2c60af119a2 100644 --- a/bsp/k230/board/board.c +++ b/bsp/k230/board/board.c @@ -64,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/drivers/interdrv/uart/drv_uart.c b/bsp/k230/drivers/interdrv/uart/drv_uart.c index d5528241b82..03dbe1734a5 100644 --- a/bsp/k230/drivers/interdrv/uart/drv_uart.c +++ b/bsp/k230/drivers/interdrv/uart/drv_uart.c @@ -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;