From 6ad84408b50b2849d4c871ac33cb827bb8e76c96 Mon Sep 17 00:00:00 2001 From: dannyray019 Date: Wed, 27 Aug 2025 10:46:49 +0800 Subject: [PATCH] bsp:k230:add pdma support for uart driver Added pdma support for uart driver and a test file test_uart.c. The test uses pdma to improve uart send speed, to check if the driver works correctly. Signed-off-by: XU HU 1337858472@qq.com --- bsp/k230/.config | 227 ++++---------- bsp/k230/board/Kconfig | 31 ++ bsp/k230/drivers/interdrv/uart/drv_uart.c | 356 ++++++++++++++++++---- bsp/k230/drivers/interdrv/uart/drv_uart.h | 29 +- bsp/k230/drivers/utest/SConscript | 3 + bsp/k230/drivers/utest/test_pdma.c | 2 +- bsp/k230/drivers/utest/test_uart.c | 169 ++++++++++ bsp/k230/rtconfig.h | 152 ++------- 8 files changed, 603 insertions(+), 366 deletions(-) create mode 100644 bsp/k230/drivers/utest/test_uart.c diff --git a/bsp/k230/.config b/bsp/k230/.config index fe8a8a9a6e9..84ee86997f7 100644 --- a/bsp/k230/.config +++ b/bsp/k230/.config @@ -118,10 +118,10 @@ CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4 # CONFIG_RT_UTEST_TC_USING_KLIBC is not set # end of klibc options -CONFIG_RT_NAME_MAX=16 +CONFIG_RT_NAME_MAX=8 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set # CONFIG_RT_USING_NANO is not set -CONFIG_RT_USING_SMART=y +# CONFIG_RT_USING_SMART is not set # CONFIG_RT_USING_AMP is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_CPUS_NR=1 @@ -134,15 +134,15 @@ CONFIG_RT_TICK_PER_SECOND=1000 CONFIG_RT_USING_OVERFLOW_CHECK=y CONFIG_RT_USING_HOOK=y CONFIG_RT_HOOK_USING_FUNC_PTR=y -CONFIG_RT_USING_HOOKLIST=y +# CONFIG_RT_USING_HOOKLIST is not set CONFIG_RT_USING_IDLE_HOOK=y CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 -CONFIG_IDLE_THREAD_STACK_SIZE=8192 +CONFIG_IDLE_THREAD_STACK_SIZE=1024 CONFIG_RT_USING_TIMER_SOFT=y CONFIG_RT_TIMER_THREAD_PRIO=4 -CONFIG_RT_TIMER_THREAD_STACK_SIZE=8192 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=2048 # CONFIG_RT_USING_TIMER_ALL_SOFT is not set -CONFIG_RT_USING_CPU_USAGE_TRACER=y +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set # # kservice options @@ -173,12 +173,12 @@ CONFIG_RT_USING_MESSAGEQUEUE=y # Memory Management # CONFIG_RT_USING_MEMPOOL=y -# CONFIG_RT_USING_SMALL_MEM is not set -CONFIG_RT_USING_SLAB=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set # CONFIG_RT_USING_MEMHEAP is not set -# CONFIG_RT_USING_SMALL_MEM_AS_HEAP is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y # CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set -CONFIG_RT_USING_SLAB_AS_HEAP=y +# CONFIG_RT_USING_SLAB_AS_HEAP is not set # CONFIG_RT_USING_USERHEAP is not set # CONFIG_RT_USING_NOHEAP is not set # CONFIG_RT_USING_MEMTRACE is not set @@ -187,21 +187,20 @@ CONFIG_RT_USING_HEAP=y # end of Memory Management CONFIG_RT_USING_DEVICE=y -CONFIG_RT_USING_DEVICE_OPS=y +# CONFIG_RT_USING_DEVICE_OPS is not set # CONFIG_RT_USING_INTERRUPT_INFO is not set # CONFIG_RT_USING_THREADSAFE_PRINTF is not set CONFIG_RT_USING_CONSOLE=y -CONFIG_RT_CONSOLEBUF_SIZE=256 -CONFIG_RT_CONSOLE_DEVICE_NAME="uart" +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" CONFIG_RT_VER_NUM=0x50201 -CONFIG_RT_USING_STDC_ATOMIC=y +# CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel CONFIG_ARCH_CPU_64BIT=y CONFIG_RT_USING_CACHE=y CONFIG_ARCH_MM_MMU=y -CONFIG_KERNEL_VADDR_START=0xffffffc000000000 CONFIG_ARCH_RISCV=y CONFIG_ARCH_RISCV_FPU=y CONFIG_ARCH_RISCV_VECTOR=y @@ -210,14 +209,13 @@ CONFIG_ARCH_VECTOR_VLEN_128=y CONFIG_ARCH_RISCV_FPU_D=y CONFIG_ARCH_RISCV64=y CONFIG_ARCH_USING_NEW_CTX_SWITCH=y -CONFIG_ARCH_REMAP_KERNEL=y # # RT-Thread Components # CONFIG_RT_USING_COMPONENTS_INIT=y CONFIG_RT_USING_USER_MAIN=y -CONFIG_RT_MAIN_THREAD_STACK_SIZE=8192 +CONFIG_RT_MAIN_THREAD_STACK_SIZE=6144 CONFIG_RT_MAIN_THREAD_PRIORITY=10 # CONFIG_RT_USING_LEGACY is not set CONFIG_RT_USING_MSH=y @@ -225,7 +223,7 @@ CONFIG_RT_USING_FINSH=y CONFIG_FINSH_USING_MSH=y CONFIG_FINSH_THREAD_NAME="tshell" CONFIG_FINSH_THREAD_PRIORITY=20 -CONFIG_FINSH_THREAD_STACK_SIZE=8192 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 CONFIG_FINSH_USING_HISTORY=y CONFIG_FINSH_HISTORY_LINES=5 # CONFIG_FINSH_USING_WORD_OPERATION is not set @@ -244,8 +242,12 @@ CONFIG_FINSH_USING_OPTION_COMPLETION=y CONFIG_RT_USING_DFS=y CONFIG_DFS_USING_POSIX=y CONFIG_DFS_USING_WORKDIR=y +# CONFIG_RT_USING_DFS_MNTTABLE is not set CONFIG_DFS_FD_MAX=16 -CONFIG_RT_USING_DFS_V2=y +CONFIG_RT_USING_DFS_V1=y +# CONFIG_RT_USING_DFS_V2 is not set +CONFIG_DFS_FILESYSTEMS_MAX=4 +CONFIG_DFS_FILESYSTEM_TYPES_MAX=4 CONFIG_RT_USING_DFS_ELMFAT=y # @@ -274,23 +276,10 @@ CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000 CONFIG_RT_USING_DFS_DEVFS=y # CONFIG_RT_USING_DFS_ROMFS is not set -CONFIG_RT_USING_DFS_PTYFS=y -# CONFIG_RT_USING_DFS_PROCFS is not set -CONFIG_RT_USING_DFS_CROMFS=y -CONFIG_RT_USING_DFS_TMPFS=y +# CONFIG_RT_USING_DFS_CROMFS is not set +# CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_TMPFS is not set # CONFIG_RT_USING_DFS_MQUEUE is not set -CONFIG_RT_USING_PAGECACHE=y - -# -# page cache config -# -CONFIG_RT_PAGECACHE_COUNT=4096 -CONFIG_RT_PAGECACHE_ASPACE_COUNT=1024 -CONFIG_RT_PAGECACHE_PRELOAD=4 -CONFIG_RT_PAGECACHE_HASH_NR=1024 -CONFIG_RT_PAGECACHE_GC_WORK_LEVEL=90 -CONFIG_RT_PAGECACHE_GC_STOP_LEVEL=70 -# end of page cache config # end of DFS: device virtual file system # CONFIG_RT_USING_FAL is not set @@ -302,40 +291,34 @@ CONFIG_RT_PAGECACHE_GC_STOP_LEVEL=70 # CONFIG_RT_USING_DEV_BUS is not set CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_UNAMED_PIPE_NUMBER=64 -CONFIG_RT_USING_SYSTEM_WORKQUEUE=y -CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=8192 -CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set CONFIG_RT_USING_SERIAL=y CONFIG_RT_USING_SERIAL_V1=y # CONFIG_RT_USING_SERIAL_V2 is not set CONFIG_RT_SERIAL_USING_DMA=y CONFIG_RT_SERIAL_RB_BUFSZ=64 -CONFIG_RT_USING_SERIAL_BYPASS=y +# CONFIG_RT_USING_SERIAL_BYPASS is not set # CONFIG_RT_USING_CAN is not set -CONFIG_RT_USING_CPUTIME=y -CONFIG_RT_USING_CPUTIME_RISCV=y -CONFIG_CPUTIME_TIMER_FREQ=25000000 +# CONFIG_RT_USING_CPUTIME is not set # CONFIG_RT_USING_I2C is not set # CONFIG_RT_USING_PHY is not set # CONFIG_RT_USING_PHY_V2 is not set # CONFIG_RT_USING_ADC is not set # CONFIG_RT_USING_DAC is not set -CONFIG_RT_USING_NULL=y -CONFIG_RT_USING_ZERO=y -CONFIG_RT_USING_RANDOM=y +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set # CONFIG_RT_USING_PWM is not set # CONFIG_RT_USING_PULSE_ENCODER is not set # CONFIG_RT_USING_INPUT_CAPTURE is not set # CONFIG_RT_USING_MTD_NOR is not set # CONFIG_RT_USING_MTD_NAND is not set # CONFIG_RT_USING_PM is not set -CONFIG_RT_USING_RTC=y -# CONFIG_RT_USING_ALARM is not set -# CONFIG_RT_USING_SOFT_RTC is not set +# CONFIG_RT_USING_RTC is not set CONFIG_RT_USING_SDIO=y -CONFIG_RT_SDIO_STACK_SIZE=8192 +CONFIG_RT_SDIO_STACK_SIZE=512 CONFIG_RT_SDIO_THREAD_PRIORITY=15 -CONFIG_RT_MMCSD_STACK_SIZE=8192 +CONFIG_RT_MMCSD_STACK_SIZE=1024 CONFIG_RT_MMCSD_THREAD_PRIORITY=22 CONFIG_RT_MMCSD_MAX_PARTITION=16 # CONFIG_RT_SDIO_DEBUG is not set @@ -359,7 +342,7 @@ CONFIG_RT_BLK_PARTITION_EFI=y # CONFIG_RT_USING_VIRTIO is not set CONFIG_RT_USING_PIN=y -CONFIG_RT_USING_KTIME=y +# CONFIG_RT_USING_KTIME is not set # CONFIG_RT_USING_HWTIMER is not set # CONFIG_RT_USING_CHERRYUSB is not set # end of Device Drivers @@ -386,23 +369,10 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # POSIX (Portable Operating System Interface) layer # -CONFIG_RT_USING_POSIX_FS=y -CONFIG_RT_USING_POSIX_DEVIO=y -CONFIG_RT_USING_POSIX_STDIO=y -CONFIG_RT_USING_POSIX_POLL=y -CONFIG_RT_USING_POSIX_SELECT=y -# CONFIG_RT_USING_POSIX_EVENTFD is not set -CONFIG_RT_USING_POSIX_EPOLL=y -CONFIG_RT_USING_POSIX_SIGNALFD=y -CONFIG_RT_SIGNALFD_MAX_NUM=10 -# CONFIG_RT_USING_POSIX_TIMERFD is not set -CONFIG_RT_USING_POSIX_SOCKET=y -CONFIG_RT_USING_POSIX_TERMIOS=y -# CONFIG_RT_USING_POSIX_AIO is not set -# CONFIG_RT_USING_POSIX_MMAN is not set -CONFIG_RT_USING_POSIX_DELAY=y -CONFIG_RT_USING_POSIX_CLOCK=y -CONFIG_RT_USING_POSIX_TIMER=y +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set # CONFIG_RT_USING_PTHREADS is not set # CONFIG_RT_USING_MODULE is not set @@ -425,89 +395,9 @@ CONFIG_RT_USING_POSIX_TIMER=y # # Network # -CONFIG_RT_USING_SAL=y -CONFIG_SAL_INTERNET_CHECK=y - -# -# Docking with protocol stacks -# -CONFIG_SAL_USING_LWIP=y -# CONFIG_SAL_USING_AT is not set -# CONFIG_SAL_USING_TLS is not set -# end of Docking with protocol stacks - -CONFIG_SAL_USING_POSIX=y -CONFIG_RT_USING_NETDEV=y -CONFIG_NETDEV_USING_IFCONFIG=y -CONFIG_NETDEV_USING_PING=y -CONFIG_NETDEV_USING_NETSTAT=y -CONFIG_NETDEV_USING_AUTO_DEFAULT=y -# CONFIG_NETDEV_USING_LINK_STATUS_CALLBACK is not set -# CONFIG_NETDEV_USING_IPV6 is not set -CONFIG_NETDEV_IPV4=1 -CONFIG_NETDEV_IPV6=0 -CONFIG_RT_USING_LWIP=y -# CONFIG_RT_USING_LWIP_LOCAL_VERSION is not set -# CONFIG_RT_USING_LWIP141 is not set -# CONFIG_RT_USING_LWIP203 is not set -CONFIG_RT_USING_LWIP212=y -# CONFIG_RT_USING_LWIP_LATEST is not set -CONFIG_RT_USING_LWIP_VER_NUM=0x20102 -# CONFIG_RT_USING_LWIP_IPV6 is not set -CONFIG_RT_LWIP_MEM_ALIGNMENT=8 -CONFIG_RT_LWIP_IGMP=y -CONFIG_RT_LWIP_ICMP=y -# CONFIG_RT_LWIP_SNMP is not set -CONFIG_RT_LWIP_DNS=y -CONFIG_RT_LWIP_DHCP=y -CONFIG_IP_SOF_BROADCAST=1 -CONFIG_IP_SOF_BROADCAST_RECV=1 - -# -# Static IPv4 Address -# -CONFIG_RT_LWIP_IPADDR="192.168.1.30" -CONFIG_RT_LWIP_GWADDR="192.168.1.1" -CONFIG_RT_LWIP_MSKADDR="255.255.255.0" -# end of Static IPv4 Address - -CONFIG_RT_LWIP_UDP=y -CONFIG_RT_LWIP_TCP=y -CONFIG_RT_LWIP_RAW=y -# CONFIG_RT_LWIP_PPP is not set -CONFIG_RT_MEMP_NUM_NETCONN=8 -CONFIG_RT_LWIP_PBUF_NUM=16 -CONFIG_RT_LWIP_RAW_PCB_NUM=4 -CONFIG_RT_LWIP_UDP_PCB_NUM=4 -CONFIG_RT_LWIP_TCP_PCB_NUM=4 -CONFIG_RT_LWIP_TCP_SEG_NUM=40 -CONFIG_RT_LWIP_TCP_SND_BUF=8196 -CONFIG_RT_LWIP_TCP_WND=8196 -CONFIG_RT_LWIP_TCPTHREAD_PRIORITY=10 -CONFIG_RT_LWIP_TCPTHREAD_MBOX_SIZE=8 -CONFIG_RT_LWIP_TCPTHREAD_STACKSIZE=8192 -# CONFIG_LWIP_NO_RX_THREAD is not set -# CONFIG_LWIP_NO_TX_THREAD is not set -CONFIG_RT_LWIP_ETHTHREAD_PRIORITY=12 -CONFIG_RT_LWIP_ETHTHREAD_STACKSIZE=8192 -CONFIG_RT_LWIP_ETHTHREAD_MBOX_SIZE=8 -# CONFIG_RT_LWIP_REASSEMBLY_FRAG is not set -CONFIG_LWIP_NETIF_STATUS_CALLBACK=1 -CONFIG_LWIP_NETIF_LINK_CALLBACK=1 -CONFIG_RT_LWIP_NETIF_NAMESIZE=6 -CONFIG_SO_REUSE=1 -CONFIG_LWIP_SO_RCVTIMEO=1 -CONFIG_LWIP_SO_SNDTIMEO=1 -CONFIG_LWIP_SO_RCVBUF=1 -CONFIG_LWIP_SO_LINGER=0 -# CONFIG_RT_LWIP_NETIF_LOOPBACK is not set -CONFIG_LWIP_NETIF_LOOPBACK=0 -# CONFIG_RT_LWIP_STATS is not set -# CONFIG_RT_LWIP_USING_HW_CHECKSUM is not set -CONFIG_RT_LWIP_USING_PING=y -# CONFIG_LWIP_USING_DHCPD is not set -# CONFIG_RT_LWIP_ENABLE_USER_HOOKS is not set -# CONFIG_RT_LWIP_DEBUG is not set +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set # CONFIG_RT_USING_AT is not set # end of Network @@ -525,7 +415,7 @@ CONFIG_RT_LWIP_USING_PING=y # CONFIG_RT_USING_ULOG is not set # CONFIG_RT_USING_UTEST is not set # CONFIG_RT_USING_VAR_EXPORT is not set -CONFIG_RT_USING_RESOURCE_ID=y +# CONFIG_RT_USING_RESOURCE_ID is not set CONFIG_RT_USING_ADT=y CONFIG_RT_USING_ADT_AVL=y CONFIG_RT_USING_ADT_BITMAP=y @@ -552,22 +442,6 @@ CONFIG_RT_PAGE_MAX_ORDER=11 # end of Debugging # end of Memory management -CONFIG_RT_USING_LWP=y -CONFIG_LWP_DEBUG=y -CONFIG_LWP_DEBUG_INIT=y -CONFIG_LWP_USING_RUNTIME=y -CONFIG_RT_LWP_MAX_NR=30 -CONFIG_LWP_TASK_STACK_SIZE=16384 -CONFIG_RT_CH_MSG_MAX_NR=1024 -CONFIG_LWP_TID_MAX_NR=64 -CONFIG_RT_LWP_SHM_MAX_NR=64 -CONFIG_RT_USING_LDSO=y -# CONFIG_ELF_DEBUG_ENABLE is not set -# CONFIG_ELF_LOAD_RANDOMIZE is not set -CONFIG_LWP_USING_TERMINAL=y -CONFIG_LWP_PTY_MAX_PARIS_LIMIT=64 -CONFIG_RT_USING_VDSO=y - # # Using USB legacy version # @@ -1318,13 +1192,7 @@ CONFIG_RT_USING_VDSO=y # CONFIG_PKG_USING_MULTIBUTTON is not set # CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set # CONFIG_PKG_USING_CANFESTIVAL is not set -CONFIG_PKG_USING_ZLIB=y -CONFIG_PKG_ZLIB_PATH="/packages/misc/zlib" -# CONFIG_ZLIB_USING_SAMPLE is not set -# CONFIG_PKG_USING_ZLIB_V100 is not set -# CONFIG_PKG_USING_ZLIB_V123 is not set -CONFIG_PKG_USING_ZLIB_LATEST_VERSION=y -CONFIG_PKG_ZLIB_VER="latest" +# CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_MINIZIP is not set # CONFIG_PKG_USING_HEATSHRINK is not set # CONFIG_PKG_USING_DSTR is not set @@ -1594,6 +1462,13 @@ CONFIG_PKG_ZLIB_VER="latest" # CONFIG_BSP_USING_ADC is not set # CONFIG_BSP_USING_TS is not set # CONFIG_BSP_USING_PWM is not set +CONFIG_BSP_USING_UART=y +CONFIG_BSP_UART_USING_DMA=y +CONFIG_BSP_USING_UART0=y +# CONFIG_BSP_USING_UART1 is not set +# CONFIG_BSP_USING_UART2 is not set +# CONFIG_BSP_USING_UART3 is not set +# CONFIG_BSP_USING_UART4 is not set CONFIG_BSP_USING_HARDLOCK=y CONFIG_BSP_USING_SDIO=y CONFIG_BSP_USING_SDIO0=y @@ -1608,7 +1483,7 @@ CONFIG_BSP_SD_MNT_DEVNAME="sd0p1" # end of Drivers Configuration CONFIG_BOARD_C908=y -CONFIG___STACKSIZE__=65536 +CONFIG___STACKSIZE__=4096 CONFIG_BSP_ROOTFS_TYPE_ELMFAT=y # CONFIG_BSP_ROOTFS_TYPE_CROMFS is not set # CONFIG_BSP_RISCV_FPU_SOFT is not set diff --git a/bsp/k230/board/Kconfig b/bsp/k230/board/Kconfig index 4cef88069e5..0d60b03b8fa 100644 --- a/bsp/k230/board/Kconfig +++ b/bsp/k230/board/Kconfig @@ -25,6 +25,37 @@ menu "Drivers Configuration" default n endif + + menuconfig BSP_USING_UART + bool "Enable UART" + select RT_USING_UART + default y + + if BSP_USING_UART + config BSP_UART_USING_DMA + bool "Enable UART with DMA" + default y + + config BSP_USING_UART0 + bool "Enable UART0" + default y + + config BSP_USING_UART1 + bool "Enable UART1" + default n + + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_USING_UART3 + bool "Enable UART3" + default n + + config BSP_USING_UART4 + bool "Enable UART4" + default n + endif config BSP_USING_HARDLOCK bool "Enable Hard-Lock" diff --git a/bsp/k230/drivers/interdrv/uart/drv_uart.c b/bsp/k230/drivers/interdrv/uart/drv_uart.c index 71090417f22..471815d5105 100644 --- a/bsp/k230/drivers/interdrv/uart/drv_uart.c +++ b/bsp/k230/drivers/interdrv/uart/drv_uart.c @@ -1,24 +1,52 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ /* - * Copyright (c) 2019-2020 + * Copyright (c) 2006-2025 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 - * */ #include #include #include #include - +#include #include "board.h" +#include "drv_pdma.h" +#include #include "drv_uart.h" #include "riscv_io.h" #define UART_DEFAULT_BAUDRATE 115200 #define UART_CLK 50000000 -#define UART_ADDR UART0_BASE_ADDR -#define UART_IRQ K230_IRQ_UART0 - +#define PDMA_CH_INVALID 0xFF +#define UART0_IRQ K230_IRQ_UART0 +#define UART1_IRQ K230_IRQ_UART1 +#define UART2_IRQ K230_IRQ_UART2 +#define UART3_IRQ K230_IRQ_UART3 +#define UART4_IRQ K230_IRQ_UART4 #define UART_RBR (0x00) /* receive buffer register */ #define UART_THR (0x00) /* transmit holding register */ @@ -90,6 +118,15 @@ #define UART_IIR_IID_BUSBSY (7) #define UART_IIR_IID_CHARTO (12) +#ifdef BSP_UART_USING_DMA +typedef enum +{ + K230_UART_PDMA_EVENT_NONE, + K230_UART_PDMA_EVENT_COMPLETE, + K230_UART_PDMA_EVENT_TIMEOUT +} uart_pdma_event_t; +#endif + struct device_uart { rt_ubase_t hw_base; @@ -97,27 +134,110 @@ struct device_uart rt_uint32_t irqno; }; -static rt_err_t rt_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg); -static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg); -static int drv_uart_putc(struct rt_serial_device *serial, char c); -static int drv_uart_getc(struct rt_serial_device *serial); +static rt_err_t _rt_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg); +static rt_err_t _uart_control(struct rt_serial_device *serial, int cmd, void *arg); +static int _drv_uart_putc(struct rt_serial_device *serial, char c); +static int _drv_uart_getc(struct rt_serial_device *serial); +#ifdef BSP_UART_USING_DMA +static rt_ssize_t _uart_dma_tran(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction); +#endif const struct rt_uart_ops _uart_ops = { - rt_uart_configure, - uart_control, - drv_uart_putc, - drv_uart_getc, - //TODO: add DMA support - RT_NULL + .configure = _rt_uart_configure, + .control = _uart_control, + .putc = _drv_uart_putc, + .getc = _drv_uart_getc, +#ifdef BSP_UART_USING_DMA + .dma_transmit = _uart_dma_tran +#else + .dma_transmit = RT_NULL +#endif }; -struct rt_serial_device serial1; -struct device_uart uart1; +struct k230_uart_dev +{ + struct rt_serial_device serial; + struct device_uart uart; + const char *name; + rt_uint32_t pa_base; + rt_uint32_t uart_to_size; + rt_uint32_t irqno; + + #ifdef BSP_UART_USING_DMA + /* DMA info */ + rt_uint8_t dma_ch; + usr_pdma_cfg_t pdma_cfg; + rt_event_t dma_event; + #endif +}; + +static struct k230_uart_dev uart_devs[] = +{ +#ifdef BSP_USING_UART0 + { + .name = "uart0", + .pa_base = UART0_BASE_ADDR, + .uart_to_size = UART0_IO_SIZE, + .irqno = UART0_IRQ, + }, +#endif +#ifdef BSP_USING_UART1 + { + .name = "uart1", + .pa_base = UART1_BASE_ADDR, + .uart_to_size = UART1_IO_SIZE, + .irqno = UART1_IRQ, + }, +#endif +#ifdef BSP_USING_UART2 + { + .name = "uart2", + .pa_base = UART2_BASE_ADDR, + .uart_to_size = UART2_IO_SIZE, + .irqno = UART2_IRQ, + }, +#endif +#ifdef BSP_USING_UART3 + { + .name = "uart3", + .pa_base = UART3_BASE_ADDR, + .uart_to_size = UART3_IO_SIZE, + .irqno = UART3_IRQ, + }, +#endif +#ifdef BSP_USING_UART4 + { + .name = "uart4", + .pa_base = UART4_BASE_ADDR, + .uart_to_size = UART4_IO_SIZE, + .irqno = UART4_IRQ, + }, +#endif +#if !defined(BSP_USING_UART0) && !defined(BSP_USING_UART1) && !defined(BSP_USING_UART2) && !defined(BSP_USING_UART3) && !defined(BSP_USING_UART4) +#error "No UART device defined!" +#endif +}; #define write32(addr, val) writel(val, (void*)(addr)) #define read32(addr) readl((void*)(addr)) +#ifdef BSP_UART_USING_DMA +static void _k230_uart_pdma_call_back(rt_uint8_t ch, rt_bool_t is_done) +{ + uart_pdma_event_t event_type = is_done ? K230_UART_PDMA_EVENT_COMPLETE : K230_UART_PDMA_EVENT_TIMEOUT; + for (size_t i = 0; i < sizeof(uart_devs)/sizeof(uart_devs[0]); i++) + { + struct k230_uart_dev *d = &uart_devs[i]; + if (d->dma_ch != PDMA_CH_INVALID && d->dma_ch == ch && d->dma_event != RT_NULL) + { + rt_event_send(d->dma_event, event_type); + return; + } + } +} +#endif + static void _uart_init(void *uart_base) { uint32_t bdiv; @@ -150,7 +270,8 @@ static void _uart_init(void *uart_base) write32(uart_base + UART_IER, 0x00); /* Enable DLAB */ write32(uart_base + UART_LCR, 0x80); - if (bdiv) { + if (bdiv) + { /* Set divisor low byte */ write32(uart_base + UART_DLL, dll); /* Set divisor high byte */ @@ -176,7 +297,7 @@ static void _uart_init(void *uart_base) // write32(uart_base + UART_IER, 0x01); } -static void uart_set_isr(void *uart_base, uint8_t enable, uint32_t irq_type) +static void _uart_set_isr(void *uart_base, uint8_t enable, uint32_t irq_type) { uint32_t value; @@ -196,12 +317,12 @@ static void uart_set_isr(void *uart_base, uint8_t enable, uint32_t irq_type) /* * UART interface */ -static rt_err_t rt_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg) +static rt_err_t _rt_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg) { return (RT_EOK); } -static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg) +static rt_err_t _uart_control(struct rt_serial_device *serial, int cmd, void *arg) { struct device_uart *uart = (struct device_uart*)serial->parent.user_data; @@ -228,7 +349,7 @@ static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg if ((size_t)arg == RT_DEVICE_FLAG_INT_RX) #endif { - uart_set_isr((void*)(uart->hw_base), 0, UART_IER_RDI); + _uart_set_isr((void*)(uart->hw_base), 0, UART_IER_RDI); } break; @@ -239,14 +360,14 @@ static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg if ((size_t)arg == RT_DEVICE_FLAG_INT_RX) #endif { - uart_set_isr((void*)(uart->hw_base), 1, UART_IER_RDI); + _uart_set_isr((void*)(uart->hw_base), 1, UART_IER_RDI); } break; #ifdef RT_USING_SERIAL_V2 case RT_DEVICE_CTRL_CONFIG: if (ctrl_flag & RT_DEVICE_FLAG_INT_RX) { - uart_set_isr((void*)(uart->hw_base), 1, UART_IER_RDI); + _uart_set_isr((void*)(uart->hw_base), 1, UART_IER_RDI); } break; #endif @@ -270,7 +391,7 @@ static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg return (RT_EOK); } -static int drv_uart_putc(struct rt_serial_device *serial, char c) +static int _drv_uart_putc(struct rt_serial_device *serial, char c) { volatile uint32_t *sed_buf; volatile uint32_t *sta; @@ -288,7 +409,7 @@ static int drv_uart_putc(struct rt_serial_device *serial, char c) return (1); } -static int drv_uart_getc(struct rt_serial_device *serial) +static int _drv_uart_getc(struct rt_serial_device *serial) { struct device_uart *uart = (struct device_uart*)serial->parent.user_data; volatile uint32_t *lsr = (uint32_t *)(uart->hw_base + UART_LSR); @@ -301,7 +422,112 @@ static int drv_uart_getc(struct rt_serial_device *serial) return (int)*rbr; } -static void rt_hw_uart_isr(int irq, void *param) +#ifdef BSP_UART_USING_DMA +static rt_err_t _uart_dma_init(struct k230_uart_dev *dev) +{ + rt_err_t err; + + usr_pdma_cfg_t *cfg = &dev->pdma_cfg; + + if (!strcmp(dev->name, "uart0")) + { + cfg->device = UART0_TX; + } + else if (!strcmp(dev->name, "uart1")) + { + cfg->device = UART1_TX; + } + else if (!strcmp(dev->name, "uart2")) + { + cfg->device = UART2_TX; + } + else if (!strcmp(dev->name, "uart3")) + { + cfg->device = UART3_TX; + } + else if (!strcmp(dev->name, "uart4")) + { + cfg->device = UART4_TX; + } + + cfg->dst_addr = (rt_uint8_t *)(uintptr_t)dev->pa_base; + + cfg->pdma_ch_cfg.ch_src_type = CONTINUE; + cfg->pdma_ch_cfg.ch_dev_hsize = PSBYTE1; + cfg->pdma_ch_cfg.ch_dat_endian = PDEFAULT; + cfg->pdma_ch_cfg.ch_dev_blen = PBURST_LEN_16; + cfg->pdma_ch_cfg.ch_priority = 7; // channel priority + cfg->pdma_ch_cfg.ch_dev_tout = 0xFFF; // device timeout + + return RT_EOK; +} + +static rt_ssize_t _uart_dma_write(struct rt_serial_device *serial, const void *buffer, rt_size_t size) +{ + struct k230_uart_dev *uart_dev = rt_container_of(serial, struct k230_uart_dev, serial); + rt_uint32_t recv_event; + rt_err_t err; + rt_uint8_t ch; + + err = k230_pdma_request_channel(&ch); + if (err != RT_EOK) + { + const char *ptr = buffer; + for (rt_size_t i = 0; i < size; i++) + { + _drv_uart_putc(serial, ptr[i]); + } + return size; + } + + uint32_t len = RT_ALIGN(size, 64); + uint8_t *buf = rt_malloc_align(len, 64); + rt_memcpy(buf, buffer, size); + rt_hw_cpu_dcache_clean((void*)buf, len); + void *buf_pa = rt_kmem_v2p(buf); + uart_dev->dma_ch = ch; + + err = k230_pdma_set_callback(ch, _k230_uart_pdma_call_back); + if (err != RT_EOK) + { + k230_pdma_release_channel(ch); + rt_free_align(buf); + return err; + } + + uart_dev->pdma_cfg.src_addr = buf_pa; + uart_dev->pdma_cfg.line_size = len; + rt_event_control(uart_dev->dma_event, RT_IPC_CMD_RESET, NULL); + + err = k230_pdma_config(ch, &uart_dev->pdma_cfg); + err = k230_pdma_start(ch); + + err = rt_event_recv(uart_dev->dma_event, + K230_UART_PDMA_EVENT_COMPLETE | K230_UART_PDMA_EVENT_TIMEOUT, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + RT_WAITING_FOREVER, + &recv_event); + + k230_pdma_stop(ch); + k230_pdma_release_channel(ch); + uart_dev->dma_ch = PDMA_CH_INVALID; + rt_free_align(buf); + return size; +} + +static rt_ssize_t _uart_dma_tran(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction) +{ + rt_ssize_t len; + if (RT_SERIAL_DMA_TX == direction) + { + len = _uart_dma_write(serial, (void*)buf, size); + } + rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DMADONE); + return len; +} +#endif + +static void _rt_hw_uart_isr(int irq, void *param) { struct rt_serial_device *serial = (struct rt_serial_device*)param; struct device_uart *uart; @@ -349,37 +575,65 @@ static void rt_hw_uart_isr(int irq, void *param) } } -/* - * UART Initiation - */ int rt_hw_uart_init(void) { - struct rt_serial_device *serial; - struct device_uart *uart; struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + rt_err_t ret; + for (int i = 0; i < sizeof(uart_devs)/sizeof(uart_devs[0]); i++) { - serial = &serial1; - uart = &uart1; + struct k230_uart_dev *dev = &uart_devs[i]; + + dev->serial.ops = &_uart_ops; + dev->serial.config = config; + dev->serial.config.baud_rate = UART_DEFAULT_BAUDRATE; + + dev->uart.pa_base = (void *)(uintptr_t)dev->pa_base; + dev->uart.hw_base = (rt_base_t)rt_ioremap(dev->uart.pa_base, dev->uart_to_size); + dev->uart.irqno = dev->irqno; + + #ifdef BSP_UART_USING_DMA + dev->dma_ch = PDMA_CH_INVALID; + dev->dma_event = (rt_event_t)rt_malloc(sizeof(struct rt_event)); + if (dev->dma_event == RT_NULL) + { + LOG_E("Failed to allocate memory for %s pdma_event!", dev->name); + return -RT_ENOMEM; + } + + ret = rt_event_init(dev->dma_event, dev->name, RT_IPC_FLAG_FIFO); + if (ret != RT_EOK) + { + LOG_E("Failed to init pdma_event for %s!", dev->name); + rt_free(dev->dma_event); + return ret; + } - serial->ops = &_uart_ops; - serial->config = config; - serial->config.baud_rate = UART_DEFAULT_BAUDRATE; + ret = _uart_dma_init(dev); + if (ret != RT_EOK) + { + LOG_E("Failed to init DMA for %s, ret=%d\n", dev->name, ret); + return ret; + } + #endif - 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*)(dev->uart.hw_base)); - _uart_init((void*)(uart->hw_base)); + rt_hw_interrupt_install(dev->uart.irqno, _rt_hw_uart_isr, &dev->serial, dev->name); + rt_hw_interrupt_umask(dev->uart.irqno); - rt_hw_interrupt_install(uart->irqno, rt_hw_uart_isr, serial, "uart1"); - rt_hw_interrupt_umask(uart->irqno); + rt_uint32_t flags; + flags = RT_DEVICE_FLAG_STREAM | RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX; + #ifdef BSP_UART_USING_DMA + flags = RT_DEVICE_FLAG_STREAM | RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_DMA_TX; + #endif - rt_hw_serial_register(serial, - RT_CONSOLE_DEVICE_NAME, - RT_DEVICE_FLAG_STREAM | RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, - uart); + ret = rt_hw_serial_register(&dev->serial, dev->name, flags, &dev->uart); + if (ret != RT_EOK) + { + LOG_E("Failed to register %s, ret=%d\n", dev->name, ret); + return ret; + } } - - return 0; -} + return RT_EOK; +} \ No newline at end of file diff --git a/bsp/k230/drivers/interdrv/uart/drv_uart.h b/bsp/k230/drivers/interdrv/uart/drv_uart.h index a7a18d0ddea..f3d70372797 100644 --- a/bsp/k230/drivers/interdrv/uart/drv_uart.h +++ b/bsp/k230/drivers/interdrv/uart/drv_uart.h @@ -1,15 +1,36 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ /* - * Copyright (c) 2019-2020, Xim + * Copyright (c) 2006-2025 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 - * */ #ifndef __DRV_UART_H__ #define __DRV_UART_H__ -void rt_hw_uart_start_rx_thread(); int rt_hw_uart_init(void); -void drv_uart_puts(char *str); // for syscall #endif /* __DRV_UART_H__ */ diff --git a/bsp/k230/drivers/utest/SConscript b/bsp/k230/drivers/utest/SConscript index 7ceb8e74812..029554df230 100644 --- a/bsp/k230/drivers/utest/SConscript +++ b/bsp/k230/drivers/utest/SConscript @@ -24,6 +24,9 @@ if GetDepend('RT_UTEST_USING_ALL_CASES') or GetDepend('BSP_UTEST_DRIVERS'): if GetDepend('BSP_USING_TS'): src += ['test_ts.c'] + if GetDepend('BSP_USING_UART'): + src += ['test_uart.c'] + group = DefineGroup('utestcases', src, depend = ['']) Return('group') \ No newline at end of file diff --git a/bsp/k230/drivers/utest/test_pdma.c b/bsp/k230/drivers/utest/test_pdma.c index 5ac30ab9da6..23a34494386 100644 --- a/bsp/k230/drivers/utest/test_pdma.c +++ b/bsp/k230/drivers/utest/test_pdma.c @@ -296,4 +296,4 @@ void test_pdma() UTEST_UNIT_RUN(test_pdma_rx); } -UTEST_TC_EXPORT(test_pdma, "pdma", utest_tc_init, utest_tc_cleanup, 10); +UTEST_TC_EXPORT(test_pdma, "pdma", utest_tc_init, utest_tc_cleanup, 10); \ No newline at end of file diff --git a/bsp/k230/drivers/utest/test_uart.c b/bsp/k230/drivers/utest/test_uart.c new file mode 100644 index 00000000000..bffeba039a2 --- /dev/null +++ b/bsp/k230/drivers/utest/test_uart.c @@ -0,0 +1,169 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* + * Copyright (c) 2006-2025 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include "drv_uart.h" +#include + +/* + * 测试 UART3 在 DMA 模式下的数据发送功能,以及 UART0 在中断模式下的数据接收功能 + * 编译时配置上要开启 enable uart3 + * + * 功能说明: + * 1. 发送测试(uart_tx_demo): + * - 查找名为 "uart3" 的串口设备; + * - 打开设备,并配置为 DMA 发送(DMA_TX)+ 流式传输(STREAM)模式; + * - 设置串口参数: + * - 波特率:115200; + * - 数据位:8 位; + * - 停止位:1 位; + * - 校验位:无; + * - 动态分配一段 2000 字节的内存作为发送缓冲区: + * - 填充 1999 个字符 '['; + * - 最后添加 '\0' 作为字符串结尾; + * - 调用 `rt_device_write` 接口,将缓冲区数据通过 UART3 DMA 方式发送出去; + * - 发送完成后关闭 UART3 设备并释放发送缓冲区内存。 + * + * 2. 接收测试(uart_rx_demo): + * - 查找名为 "uart0" 的串口设备; + * - 打开设备,并配置为中断接收(INT_RX)+ 流式传输(STREAM)模式; + * - 设置串口参数(波特率 115200,8N1,无校验); + * - 在 5 秒超时范围内循环读取 UART0 接收到的数据: + * - 如果有数据,则立即打印接收到的内容; + * - 如果没有数据,每隔 2.5 秒检查一次; + * - 超时或接收后关闭 UART0 设备。 + * + * 硬件说明: + * - 本测试基于 K230 平台; + * - UART3 用于发送测试,可在串口调试工具上观察 1999 个 '[' 输出; + * - UART0 用于接收测试,在 5 秒内通过外部串口助手发送数据,可在日志中看到接收结果; + * + */ + +#define UART0_DEV_NAME "uart0" +#define UART3_DEV_NAME "uart3" +#define TEXT_LENGTH 2000 +#define TEXT_TIME 5 +#define RX_TEXT_PERIOD 2500 + +static void uart_tx_demo(void) +{ + rt_device_t uart_dev; + char *msg = rt_malloc(TEXT_LENGTH); + for (int i = 0; i < TEXT_LENGTH - 1; i++) + { + msg[i] = '['; + } + msg[TEXT_LENGTH-1]='\0'; + + rt_err_t ret; + + uart_dev = rt_device_find(UART3_DEV_NAME); + uassert_not_null(uart_dev); + + ret = rt_device_open(uart_dev, RT_DEVICE_FLAG_DMA_TX | RT_DEVICE_FLAG_STREAM); + uassert_int_equal(ret, RT_EOK); + + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.baud_rate = 115200; + config.data_bits = DATA_BITS_8; + config.stop_bits = STOP_BITS_1; + config.parity = PARITY_NONE; + ret = rt_device_control(uart_dev, RT_DEVICE_CTRL_CONFIG, &config); + uassert_int_equal(ret, RT_EOK); + struct rt_serial_device *serial; + serial = rt_container_of(uart_dev, struct rt_serial_device, parent); + uassert_not_null(serial); + size_t len = TEXT_LENGTH; + ret = rt_device_write(serial,0,msg,len); + uassert_int_equal(ret, len); + ret = rt_device_close(uart_dev); + uassert_int_equal(ret, RT_EOK); + rt_free(msg); +} + +static void uart_rx_demo(void) +{ + rt_device_t uart_dev; + char rx_buf[32]; + rt_size_t rx_len; + + uart_dev = rt_device_find(UART0_DEV_NAME); + uassert_not_null(uart_dev); + + rt_err_t ret = rt_device_open(uart_dev, RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM); + uassert_int_equal(ret, RT_EOK); + + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.baud_rate = 115200; + config.data_bits = DATA_BITS_8; + config.stop_bits = STOP_BITS_1; + config.parity = PARITY_NONE; + ret = rt_device_control(uart_dev, RT_DEVICE_CTRL_CONFIG, &config); + uassert_int_equal(ret, RT_EOK); + + LOG_I("UART RX demo: please send data to uart0 within 5s...\n"); + + rt_tick_t timeout = rt_tick_get() + RT_TICK_PER_SECOND * TEXT_TIME; + while (rt_tick_get() < timeout) + { + rx_len = rt_device_read(uart_dev, 0, rx_buf, sizeof(rx_buf) - 1); + if (rx_len > 0) + { + rx_buf[rx_len] = '\0'; + LOG_I("UART RX got %d bytes: %s", rx_len, rx_buf); + break; + } + rt_thread_mdelay(RX_TEXT_PERIOD); + } + + ret = rt_device_close(uart_dev); + uassert_int_equal(ret, RT_EOK); +} + +static void uart_testcase(void) +{ + UTEST_UNIT_RUN(uart_tx_demo); + UTEST_UNIT_RUN(uart_rx_demo); +} + +static rt_err_t utest_tc_init(void) +{ + return RT_EOK; +} + +static rt_err_t utest_tc_cleanup(void) +{ + return RT_EOK; +} + +UTEST_TC_EXPORT(uart_testcase, "uart", utest_tc_init, utest_tc_cleanup, 10); \ No newline at end of file diff --git a/bsp/k230/rtconfig.h b/bsp/k230/rtconfig.h index e4b87a3d3c4..c1f28dba364 100644 --- a/bsp/k230/rtconfig.h +++ b/bsp/k230/rtconfig.h @@ -72,8 +72,7 @@ /* end of rt_strnlen options */ /* end of klibc options */ -#define RT_NAME_MAX 16 -#define RT_USING_SMART +#define RT_NAME_MAX 8 #define RT_CPUS_NR 1 #define RT_ALIGN_SIZE 8 #define RT_THREAD_PRIORITY_32 @@ -82,14 +81,12 @@ #define RT_USING_OVERFLOW_CHECK #define RT_USING_HOOK #define RT_HOOK_USING_FUNC_PTR -#define RT_USING_HOOKLIST #define RT_USING_IDLE_HOOK #define RT_IDLE_HOOK_LIST_SIZE 4 -#define IDLE_THREAD_STACK_SIZE 8192 +#define IDLE_THREAD_STACK_SIZE 1024 #define RT_USING_TIMER_SOFT #define RT_TIMER_THREAD_PRIO 4 -#define RT_TIMER_THREAD_STACK_SIZE 8192 -#define RT_USING_CPU_USAGE_TRACER +#define RT_TIMER_THREAD_STACK_SIZE 2048 /* kservice options */ @@ -111,23 +108,20 @@ /* Memory Management */ #define RT_USING_MEMPOOL -#define RT_USING_SLAB -#define RT_USING_SLAB_AS_HEAP +#define RT_USING_SMALL_MEM +#define RT_USING_SMALL_MEM_AS_HEAP #define RT_USING_HEAP /* end of Memory Management */ #define RT_USING_DEVICE -#define RT_USING_DEVICE_OPS #define RT_USING_CONSOLE -#define RT_CONSOLEBUF_SIZE 256 -#define RT_CONSOLE_DEVICE_NAME "uart" +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart1" #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 0xffffffc000000000 #define ARCH_RISCV #define ARCH_RISCV_FPU #define ARCH_RISCV_VECTOR @@ -135,20 +129,19 @@ #define ARCH_RISCV_FPU_D #define ARCH_RISCV64 #define ARCH_USING_NEW_CTX_SWITCH -#define ARCH_REMAP_KERNEL /* RT-Thread Components */ #define RT_USING_COMPONENTS_INIT #define RT_USING_USER_MAIN -#define RT_MAIN_THREAD_STACK_SIZE 8192 +#define RT_MAIN_THREAD_STACK_SIZE 6144 #define RT_MAIN_THREAD_PRIORITY 10 #define RT_USING_MSH #define RT_USING_FINSH #define FINSH_USING_MSH #define FINSH_THREAD_NAME "tshell" #define FINSH_THREAD_PRIORITY 20 -#define FINSH_THREAD_STACK_SIZE 8192 +#define FINSH_THREAD_STACK_SIZE 4096 #define FINSH_USING_HISTORY #define FINSH_HISTORY_LINES 5 #define FINSH_USING_SYMTAB @@ -164,7 +157,9 @@ #define DFS_USING_POSIX #define DFS_USING_WORKDIR #define DFS_FD_MAX 16 -#define RT_USING_DFS_V2 +#define RT_USING_DFS_V1 +#define DFS_FILESYSTEMS_MAX 4 +#define DFS_FILESYSTEM_TYPES_MAX 4 #define RT_USING_DFS_ELMFAT /* elm-chan's FatFs, Generic FAT Filesystem Module */ @@ -182,45 +177,20 @@ #define RT_DFS_ELM_MUTEX_TIMEOUT 3000 /* end of elm-chan's FatFs, Generic FAT Filesystem Module */ #define RT_USING_DFS_DEVFS -#define RT_USING_DFS_PTYFS -#define RT_USING_DFS_CROMFS -#define RT_USING_DFS_TMPFS -#define RT_USING_PAGECACHE - -/* page cache config */ - -#define RT_PAGECACHE_COUNT 4096 -#define RT_PAGECACHE_ASPACE_COUNT 1024 -#define RT_PAGECACHE_PRELOAD 4 -#define RT_PAGECACHE_HASH_NR 1024 -#define RT_PAGECACHE_GC_WORK_LEVEL 90 -#define RT_PAGECACHE_GC_STOP_LEVEL 70 -/* end of page cache config */ /* end of DFS: device virtual file system */ /* Device Drivers */ #define RT_USING_DEVICE_IPC #define RT_UNAMED_PIPE_NUMBER 64 -#define RT_USING_SYSTEM_WORKQUEUE -#define RT_SYSTEM_WORKQUEUE_STACKSIZE 8192 -#define RT_SYSTEM_WORKQUEUE_PRIORITY 23 #define RT_USING_SERIAL #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 -#define RT_USING_NULL -#define RT_USING_ZERO -#define RT_USING_RANDOM -#define RT_USING_RTC #define RT_USING_SDIO -#define RT_SDIO_STACK_SIZE 8192 +#define RT_SDIO_STACK_SIZE 512 #define RT_SDIO_THREAD_PRIORITY 15 -#define RT_MMCSD_STACK_SIZE 8192 +#define RT_MMCSD_STACK_SIZE 1024 #define RT_MMCSD_THREAD_PRIORITY 22 #define RT_MMCSD_MAX_PARTITION 16 #define RT_USING_BLK @@ -231,7 +201,6 @@ #define RT_BLK_PARTITION_EFI /* end of Partition Types */ #define RT_USING_PIN -#define RT_USING_KTIME /* end of Device Drivers */ /* C/C++ and POSIX layer */ @@ -249,19 +218,6 @@ /* POSIX (Portable Operating System Interface) layer */ -#define RT_USING_POSIX_FS -#define RT_USING_POSIX_DEVIO -#define RT_USING_POSIX_STDIO -#define RT_USING_POSIX_POLL -#define RT_USING_POSIX_SELECT -#define RT_USING_POSIX_EPOLL -#define RT_USING_POSIX_SIGNALFD -#define RT_SIGNALFD_MAX_NUM 10 -#define RT_USING_POSIX_SOCKET -#define RT_USING_POSIX_TERMIOS -#define RT_USING_POSIX_DELAY -#define RT_USING_POSIX_CLOCK -#define RT_USING_POSIX_TIMER /* Interprocess Communication (IPC) */ @@ -274,65 +230,6 @@ /* Network */ -#define RT_USING_SAL -#define SAL_INTERNET_CHECK - -/* Docking with protocol stacks */ - -#define SAL_USING_LWIP -/* end of Docking with protocol stacks */ -#define SAL_USING_POSIX -#define RT_USING_NETDEV -#define NETDEV_USING_IFCONFIG -#define NETDEV_USING_PING -#define NETDEV_USING_NETSTAT -#define NETDEV_USING_AUTO_DEFAULT -#define NETDEV_IPV4 1 -#define NETDEV_IPV6 0 -#define RT_USING_LWIP -#define RT_USING_LWIP212 -#define RT_USING_LWIP_VER_NUM 0x20102 -#define RT_LWIP_MEM_ALIGNMENT 8 -#define RT_LWIP_IGMP -#define RT_LWIP_ICMP -#define RT_LWIP_DNS -#define RT_LWIP_DHCP -#define IP_SOF_BROADCAST 1 -#define IP_SOF_BROADCAST_RECV 1 - -/* Static IPv4 Address */ - -#define RT_LWIP_IPADDR "192.168.1.30" -#define RT_LWIP_GWADDR "192.168.1.1" -#define RT_LWIP_MSKADDR "255.255.255.0" -/* end of Static IPv4 Address */ -#define RT_LWIP_UDP -#define RT_LWIP_TCP -#define RT_LWIP_RAW -#define RT_MEMP_NUM_NETCONN 8 -#define RT_LWIP_PBUF_NUM 16 -#define RT_LWIP_RAW_PCB_NUM 4 -#define RT_LWIP_UDP_PCB_NUM 4 -#define RT_LWIP_TCP_PCB_NUM 4 -#define RT_LWIP_TCP_SEG_NUM 40 -#define RT_LWIP_TCP_SND_BUF 8196 -#define RT_LWIP_TCP_WND 8196 -#define RT_LWIP_TCPTHREAD_PRIORITY 10 -#define RT_LWIP_TCPTHREAD_MBOX_SIZE 8 -#define RT_LWIP_TCPTHREAD_STACKSIZE 8192 -#define RT_LWIP_ETHTHREAD_PRIORITY 12 -#define RT_LWIP_ETHTHREAD_STACKSIZE 8192 -#define RT_LWIP_ETHTHREAD_MBOX_SIZE 8 -#define LWIP_NETIF_STATUS_CALLBACK 1 -#define LWIP_NETIF_LINK_CALLBACK 1 -#define RT_LWIP_NETIF_NAMESIZE 6 -#define SO_REUSE 1 -#define LWIP_SO_RCVTIMEO 1 -#define LWIP_SO_SNDTIMEO 1 -#define LWIP_SO_RCVBUF 1 -#define LWIP_SO_LINGER 0 -#define LWIP_NETIF_LOOPBACK 0 -#define RT_LWIP_USING_PING /* end of Network */ /* Memory protection */ @@ -341,7 +238,6 @@ /* Utilities */ -#define RT_USING_RESOURCE_ID #define RT_USING_ADT #define RT_USING_ADT_AVL #define RT_USING_ADT_BITMAP @@ -358,19 +254,6 @@ /* 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 -#define LWP_TID_MAX_NR 64 -#define RT_LWP_SHM_MAX_NR 64 -#define RT_USING_LDSO -#define LWP_USING_TERMINAL -#define LWP_PTY_MAX_PARIS_LIMIT 64 -#define RT_USING_VDSO /* Using USB legacy version */ @@ -526,8 +409,6 @@ /* entertainment: terminal games and other interesting software packages */ /* end of entertainment: terminal games and other interesting software packages */ -#define PKG_USING_ZLIB -#define PKG_USING_ZLIB_LATEST_VERSION /* end of miscellaneous packages */ /* Arduino libraries */ @@ -578,13 +459,16 @@ /* Drivers Configuration */ +#define BSP_USING_UART +#define BSP_UART_USING_DMA +#define BSP_USING_UART0 #define BSP_USING_HARDLOCK #define BSP_USING_SDIO #define BSP_USING_SDIO0 #define BSP_SD_MNT_DEVNAME "sd0p1" /* end of Drivers Configuration */ #define BOARD_C908 -#define __STACKSIZE__ 65536 +#define __STACKSIZE__ 4096 #define BSP_ROOTFS_TYPE_ELMFAT #define BSP_RISCV_FPU_D