From 443afd80fd0bcba69d9eaf13d81c2847c3742431 Mon Sep 17 00:00:00 2001 From: GuEe_GUI <2991707448@qq.com> Date: Mon, 7 Mar 2022 10:35:22 +0800 Subject: [PATCH] [libcpu/aarch64] add virtual machine mode --- bsp/raspberry-pi/raspi4-64/.config | 234 ++++++++++------- bsp/raspberry-pi/raspi4-64/drivers/Kconfig | 8 + .../raspi4-64/drivers/drv_dsi_touch.c | 240 ++++++++++++++++++ bsp/raspberry-pi/raspi4-64/drivers/drv_hdmi.c | 67 ++++- bsp/raspberry-pi/raspi4-64/drivers/mbox.c | 20 +- bsp/raspberry-pi/raspi4-64/drivers/mbox.h | 6 + bsp/raspberry-pi/raspi4-64/rtconfig.h | 29 ++- libcpu/aarch64/common/hypercall.c | 16 ++ libcpu/aarch64/common/hypercall.h | 27 ++ 9 files changed, 534 insertions(+), 113 deletions(-) create mode 100644 bsp/raspberry-pi/raspi4-64/drivers/drv_dsi_touch.c create mode 100644 libcpu/aarch64/common/hypercall.c create mode 100644 libcpu/aarch64/common/hypercall.h diff --git a/bsp/raspberry-pi/raspi4-64/.config b/bsp/raspberry-pi/raspi4-64/.config index 39180551f5..50ba318d8f 100644 --- a/bsp/raspberry-pi/raspi4-64/.config +++ b/bsp/raspberry-pi/raspi4-64/.config @@ -73,6 +73,8 @@ CONFIG_ARCH_CPU_64BIT=y CONFIG_RT_USING_CACHE=y # CONFIG_RT_USING_CPU_FFS is not set # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set +CONFIG_ARCH_MM_MMU=y +CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_MMU=y CONFIG_RT_USING_USERSPACE=y CONFIG_KERNEL_VADDR_START=0xffff000000000000 @@ -97,6 +99,7 @@ CONFIG_RT_MAIN_THREAD_PRIORITY=10 # CONFIG_RT_USING_FINSH=y CONFIG_RT_USING_MSH=y +CONFIG_FINSH_USING_MSH=y CONFIG_FINSH_THREAD_NAME="tshell" CONFIG_FINSH_USING_HISTORY=y CONFIG_FINSH_HISTORY_LINES=5 @@ -147,6 +150,7 @@ CONFIG_RT_USING_DFS_ROMFS=y # Device Drivers # CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 CONFIG_RT_PIPE_BUFSZ=512 CONFIG_RT_USING_SYSTEM_WORKQUEUE=y CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=8192 @@ -154,6 +158,8 @@ CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 CONFIG_RT_USING_SERIAL=y # CONFIG_RT_SERIAL_USING_DMA is not set CONFIG_RT_SERIAL_RB_BUFSZ=64 +CONFIG_RT_USING_TTY=y +# CONFIG_RT_TTY_DEBUG is not set # CONFIG_RT_USING_CAN is not set CONFIG_RT_USING_HWTIMER=y # CONFIG_RT_USING_CPUTIME is not set @@ -191,7 +197,7 @@ CONFIG_RT_USING_SPI=y CONFIG_RT_USING_WDT=y # CONFIG_RT_USING_AUDIO is not set # CONFIG_RT_USING_SENSOR is not set -# CONFIG_RT_USING_TOUCH is not set +CONFIG_RT_USING_TOUCH=y # CONFIG_RT_USING_HWCRYPTO is not set # CONFIG_RT_USING_PULSE_ENCODER is not set # CONFIG_RT_USING_INPUT_CAPTURE is not set @@ -209,10 +215,10 @@ CONFIG_RT_USING_WDT=y CONFIG_RT_USING_LIBC=y # CONFIG_RT_USING_NEWLIB is not set CONFIG_RT_USING_MUSL=y +# CONFIG_RT_USING_MLIB is not set # CONFIG_RT_USING_PTHREADS is not set CONFIG_RT_USING_POSIX=y CONFIG_RT_USING_POSIX_MMAP=y -CONFIG_RT_USING_POSIX_TERMIOS=y # CONFIG_RT_USING_POSIX_GETLINE is not set CONFIG_RT_USING_POSIX_AIO=y CONFIG_RT_POSIX_AIO_THREAD_STACK_SIZE=8192 @@ -322,14 +328,14 @@ CONFIG_RT_LWIP_USING_PING=y # CONFIG_RT_USING_RYM is not set # CONFIG_RT_USING_ULOG is not set # CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_RT_LINK is not set CONFIG_RT_USING_LWP=y CONFIG_RT_LWP_MAX_NR=30 CONFIG_LWP_TASK_STACK_SIZE=16384 -# CONFIG_RT_USING_GDBSERVER is not set CONFIG_RT_CH_MSG_MAX_NR=1024 -CONFIG_RT_LWP_SHM_MAX_NR=64 CONFIG_LWP_CONSOLE_INPUT_BUFFER_SIZE=1024 CONFIG_LWP_TID_MAX_NR=64 +CONFIG_RT_LWP_SHM_MAX_NR=64 # CONFIG_LWP_UNIX98_PTY is not set # @@ -379,6 +385,7 @@ CONFIG_LWP_TID_MAX_NR=64 # CONFIG_PKG_USING_AT_DEVICE is not set # CONFIG_PKG_USING_ATSRV_SOCKET is not set # CONFIG_PKG_USING_WIZNET is not set +# CONFIG_PKG_USING_ZB_COORDINATOR is not set # # IoT Cloud @@ -399,8 +406,6 @@ CONFIG_LWP_TID_MAX_NR=64 # CONFIG_PKG_USING_LIBRWS is not set # CONFIG_PKG_USING_TCPSERVER is not set # CONFIG_PKG_USING_PROTOBUF_C is not set -# CONFIG_PKG_USING_ONNX_PARSER is not set -# CONFIG_PKG_USING_ONNX_BACKEND is not set # CONFIG_PKG_USING_DLT645 is not set # CONFIG_PKG_USING_QXWZ is not set # CONFIG_PKG_USING_SMTP_CLIENT is not set @@ -415,6 +420,18 @@ CONFIG_LWP_TID_MAX_NR=64 # CONFIG_PKG_USING_BTSTACK is not set # CONFIG_PKG_USING_LORAWAN_ED_STACK is not set # CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set # # security packages @@ -431,18 +448,36 @@ CONFIG_LWP_TID_MAX_NR=64 # CONFIG_PKG_USING_LUA is not set # CONFIG_PKG_USING_JERRYSCRIPT is not set # CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set # # multimedia packages # + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_LVGL is not set # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set # CONFIG_PKG_USING_WAVPLAYER is not set # CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set # CONFIG_PKG_USING_HELIX is not set # CONFIG_PKG_USING_AZUREGUIX is not set # CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set # # tools packages @@ -451,6 +486,7 @@ CONFIG_LWP_TID_MAX_NR=64 # CONFIG_PKG_USING_EASYFLASH is not set # CONFIG_PKG_USING_EASYLOGGER is not set # CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set # CONFIG_PKG_USING_RDB is not set # CONFIG_PKG_USING_QRCODE is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set @@ -474,23 +510,58 @@ CONFIG_LWP_TID_MAX_NR=64 # CONFIG_PKG_USING_KDB is not set # CONFIG_PKG_USING_WAMR is not set # CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set # # system packages # + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_5_AUX is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set # CONFIG_PKG_USING_GUIENGINE is not set # CONFIG_PKG_USING_CAIRO is not set # CONFIG_PKG_USING_PIXMAN is not set -# CONFIG_PKG_USING_LWEXT4 is not set # CONFIG_PKG_USING_PARTITION is not set # CONFIG_PKG_USING_FAL is not set # CONFIG_PKG_USING_FLASHDB is not set # CONFIG_PKG_USING_SQLITE is not set # CONFIG_PKG_USING_RTI is not set -# CONFIG_PKG_USING_LITTLEVGL2RTT is not set -# CONFIG_PKG_USING_CMSIS is not set # CONFIG_PKG_USING_DFS_YAFFS is not set # CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set # CONFIG_PKG_USING_THREAD_POOL is not set # CONFIG_PKG_USING_ROBOTS is not set # CONFIG_PKG_USING_EV is not set @@ -500,24 +571,16 @@ CONFIG_LWP_TID_MAX_NR=64 # CONFIG_PKG_USING_RAMDISK is not set # CONFIG_PKG_USING_MININI is not set # CONFIG_PKG_USING_QBOOT is not set - -# -# Micrium: Micrium software products porting for RT-Thread -# -# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set -# CONFIG_PKG_USING_UCOSII_WRAPPER is not set -# CONFIG_PKG_USING_UC_CRC is not set -# CONFIG_PKG_USING_UC_CLK is not set -# CONFIG_PKG_USING_UC_COMMON is not set -# CONFIG_PKG_USING_UC_MODBUS is not set # CONFIG_PKG_USING_PPOOL is not set # CONFIG_PKG_USING_OPENAMP is not set # CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set -# CONFIG_PKG_USING_RT_MEMCPY_CM is not set -# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set -# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set -# CONFIG_PKG_USING_QFPLIB_M3 is not set # CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_WCWIDTH is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set # # peripheral libraries and drivers @@ -529,7 +592,6 @@ CONFIG_LWP_TID_MAX_NR=64 # CONFIG_PKG_USING_AS7341 is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ICM20608 is not set -# CONFIG_PKG_USING_U8G2 is not set # CONFIG_PKG_USING_BUTTON is not set # CONFIG_PKG_USING_PCF8574 is not set # CONFIG_PKG_USING_SX12XX is not set @@ -542,7 +604,6 @@ CONFIG_LWP_TID_MAX_NR=64 # CONFIG_PKG_USING_WM_LIBRARIES is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set # CONFIG_PKG_USING_INFRARED is not set -# CONFIG_PKG_USING_ROSSERIAL is not set # CONFIG_PKG_USING_AGILE_BUTTON is not set # CONFIG_PKG_USING_AGILE_LED is not set # CONFIG_PKG_USING_AT24CXX is not set @@ -580,10 +641,60 @@ CONFIG_LWP_TID_MAX_NR=64 # CONFIG_PKG_USING_VIRTUAL_SENSOR is not set # CONFIG_PKG_USING_VDEVICE is not set # CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_BL_MCU_SDK is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set # # miscellaneous packages # + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set # CONFIG_PKG_USING_LIBCSV is not set # CONFIG_PKG_USING_OPTPARSE is not set # CONFIG_PKG_USING_FASTLZ is not set @@ -594,90 +705,28 @@ CONFIG_LWP_TID_MAX_NR=64 # CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set # CONFIG_PKG_USING_CANFESTIVAL is not set # CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set # CONFIG_PKG_USING_KENDRYTE_DEMO is not set # CONFIG_PKG_USING_DIGITALCTRL is not set # CONFIG_PKG_USING_UPACKER is not set # CONFIG_PKG_USING_UPARAM is not set - -# -# samples: kernel and components samples -# -# CONFIG_PKG_USING_KERNEL_SAMPLES is not set -# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set -# CONFIG_PKG_USING_NETWORK_SAMPLES is not set -# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set # CONFIG_PKG_USING_VI is not set # CONFIG_PKG_USING_KI is not set -# CONFIG_PKG_USING_NNOM is not set -# CONFIG_PKG_USING_LIBANN is not set -# CONFIG_PKG_USING_ELAPACK is not set # CONFIG_PKG_USING_ARMv7M_DWT is not set # CONFIG_PKG_USING_VT100 is not set -# CONFIG_PKG_USING_ULAPACK is not set # CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_CRCLIB is not set - -# -# games: games run on RT-Thread console -# -# CONFIG_PKG_USING_THREES is not set -# CONFIG_PKG_USING_2048 is not set -# CONFIG_PKG_USING_SNAKE is not set -# CONFIG_PKG_USING_TETRIS is not set # CONFIG_PKG_USING_LWGPS is not set -# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set # CONFIG_PKG_USING_STATE_MACHINE is not set - -# -# Privated Packages of RealThread -# -# CONFIG_PKG_USING_CODEC is not set -# CONFIG_PKG_USING_PLAYER is not set -# CONFIG_PKG_USING_MPLAYER is not set -# CONFIG_PKG_USING_PERSIMMON_SRC is not set -# CONFIG_PKG_USING_JS_PERSIMMON is not set -# CONFIG_PKG_USING_JERRYSCRIPT_WIN32 is not set - -# -# Network Utilities -# -# CONFIG_PKG_USING_MDNS is not set -# CONFIG_PKG_USING_UPNP is not set -# CONFIG_PKG_USING_WICED is not set -# CONFIG_PKG_USING_CLOUDSDK is not set -# CONFIG_PKG_USING_POWER_MANAGER is not set -# CONFIG_PKG_USING_RT_OTA is not set -# CONFIG_PKG_USING_RDBD_SRC is not set -# CONFIG_PKG_USING_RTINSIGHT is not set -# CONFIG_PKG_USING_SMARTCONFIG is not set -# CONFIG_PKG_USING_RTX is not set -# CONFIG_RT_USING_TESTCASE is not set -# CONFIG_PKG_USING_NGHTTP2 is not set -# CONFIG_PKG_USING_AVS is not set -# CONFIG_PKG_USING_ALI_LINKKIT is not set -# CONFIG_PKG_USING_STS is not set -# CONFIG_PKG_USING_DLMS is not set -# CONFIG_PKG_USING_AUDIO_FRAMEWORK is not set -# CONFIG_PKG_USING_ZBAR is not set -# CONFIG_PKG_USING_MCF is not set -# CONFIG_PKG_USING_URPC is not set -# CONFIG_PKG_USING_BSAL is not set -# CONFIG_PKG_USING_DCM is not set -# CONFIG_PKG_USING_EMQ is not set -# CONFIG_PKG_USING_CFGM is not set -# CONFIG_PKG_USING_RT_CMSIS_DAP is not set -# CONFIG_PKG_USING_SMODULE is not set -# CONFIG_PKG_USING_SNFD is not set -# CONFIG_PKG_USING_UDBD is not set -# CONFIG_PKG_USING_BENCHMARK is not set -# CONFIG_PKG_USING_UBJSON is not set -# CONFIG_PKG_USING_DATATYPE is not set -# CONFIG_PKG_USING_FASTFS is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_TERMBOX is not set CONFIG_BCM2711_SOC=y # CONFIG_BSP_SUPPORT_FPU is not set +# CONFIG_BSP_USING_VM_MODE is not set # # Hardware Drivers Config @@ -709,3 +758,4 @@ CONFIG_BSP_USING_SDIO0=y # CONFIG_BSP_USING_HDMI=y # CONFIG_BSP_USING_HDMI_DISPLAY is not set +# CONFIG_BSP_USING_TOUCH is not set diff --git a/bsp/raspberry-pi/raspi4-64/drivers/Kconfig b/bsp/raspberry-pi/raspi4-64/drivers/Kconfig index 5dca313513..77274013b8 100644 --- a/bsp/raspberry-pi/raspi4-64/drivers/Kconfig +++ b/bsp/raspberry-pi/raspi4-64/drivers/Kconfig @@ -3,6 +3,10 @@ config BSP_SUPPORT_FPU bool "Using Float" default n +menuconfig BSP_USING_VM_MODE + bool "Enable VM mode" + default n + menu "Hardware Drivers Config" menu "BCM Peripheral Drivers" menuconfig BSP_USING_UART @@ -128,5 +132,9 @@ menu "Hardware Drivers Config" bool "HDMI DISPLAY" default n endif + + menuconfig BSP_USING_TOUCH + bool "Enable Touch" + default n endmenu endmenu diff --git a/bsp/raspberry-pi/raspi4-64/drivers/drv_dsi_touch.c b/bsp/raspberry-pi/raspi4-64/drivers/drv_dsi_touch.c new file mode 100644 index 0000000000..d911704057 --- /dev/null +++ b/bsp/raspberry-pi/raspi4-64/drivers/drv_dsi_touch.c @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-11-26 bigmagic first version + */ +#include +#include +#include +#include +#include +#include +#include + +#include + +#ifdef BSP_USING_TOUCH + +#include "mbox.h" +#include "drv_dsi_touch.h" + +#define DBG_TAG "dsi_touch" +#define DBG_LVL DBG_INFO +#include + +static rt_touch_t touch_device = RT_NULL; +static struct rt_semaphore dsi_touch_ack; + +static rt_uint32_t touch_x; +static rt_uint32_t touch_y; +static rt_uint32_t touch_state = 0; + +static rt_thread_t dsi_touch_tid = RT_NULL; +#define DSI_TOUCH_THREAD_STACK_SIZE (4096) +#define DSI_TOUCH_THREAD_PRIORITY (25) +#define DSI_TOUCH_THREAD_TIMESLICE (10) + +#define MAXIMUM_SUPPORTED_POINTS (10) + +struct touch_regs +{ + uint8_t device_mode; + uint8_t gesture_id; + uint8_t num_points; + struct touch + { + uint8_t xh; + uint8_t xl; + uint8_t yh; + uint8_t yl; + uint8_t res1; + uint8_t res2; + } point[MAXIMUM_SUPPORTED_POINTS]; +}; + +struct drv_mouse_device +{ + struct rt_device parent; + struct rt_touch_data touchdata; + int channel; +}; + +struct drv_mouse_device _mouse; + +static void post_event(rt_uint16_t x, rt_uint16_t y, rt_uint8_t event) +{ + struct rt_touch_data *minfo = &_mouse.touchdata; + struct rt_channel_msg ch_msg; + + LOG_D("event:%d, x:%d, y:%d\n", event, x, y); + + minfo->x_coordinate = x; + minfo->y_coordinate = y; + minfo->event = event; + ch_msg.type = RT_CHANNEL_RAW; + ch_msg.u.d = (void *)(size_t)event; + rt_channel_send(_mouse.channel, &ch_msg); +} + +static void dsi_touch_thread_entry(void *param) +{ + static volatile unsigned long touchbuf; + touchbuf = bcm271x_mbox_get_touch(); + + if (touchbuf == RT_NULL) + { + rt_kprintf("init dsi touch err!\n"); + return; + } + +#ifdef BSP_USING_VM_MODE + if (rt_hv_stage2_map((unsigned long)touchbuf, 0x1000)) + { + rt_kprintf("alloc mmio from hyper fail!\n"); + return; + } +#endif + + touchbuf = (unsigned long)rt_ioremap((void *)touchbuf, 0x1000); + + while (1) + { + struct touch_regs *regs = (struct touch_regs *)touchbuf; + if ((regs->num_points > 0) && (regs->num_points < MAXIMUM_SUPPORTED_POINTS)) + { + /* only one touch point */ + touch_x = (((int)regs->point[0].xh & 0xf) << 8) + regs->point[0].xl; + touch_y = (((int)regs->point[0].yh & 0xf) << 8) + regs->point[0].yl; + if (!touch_state) + { + post_event(touch_x, touch_y, RT_TOUCH_EVENT_DOWN); + } + else + { + post_event(touch_x, touch_y, RT_TOUCH_EVENT_MOVE); + } + touch_state = 1; + } + else + { + if (touch_state) + { + post_event(touch_x, touch_y, RT_TOUCH_EVENT_UP); + } + touch_state = 0; + } + rt_thread_mdelay(1); + } +} + +static rt_size_t dsi_read_point(struct rt_touch_device *touch, void *buf, rt_size_t read_num) +{ + rt_uint16_t* touchxy = (rt_uint16_t *)buf; + + if ((read_num != 0) && (touch_state == 1)) + { + touchxy[0] = touch_x; + touchxy[1] = touch_y; + touch_state = 0; + return read_num; + } + else + { + return 0; + } +} + +static rt_err_t dsi_control(struct rt_touch_device *device, int cmd, void *data) +{ + return RT_EOK; +} + +static struct rt_touch_ops dsi_touch_ops = +{ + .touch_readpoint = dsi_read_point, + .touch_control = dsi_control, +}; + +static rt_err_t drv_mouse_init(struct rt_device *device) +{ + struct drv_mouse_device *mouse = (struct drv_mouse_device*)device; + + return RT_EOK; +} + +static rt_err_t drv_mouse_control(struct rt_device *device, int cmd, void *args) +{ + switch (cmd) + { +#define CMD_MOUSE_SET_NOTIFY 0 /* arg is shmid, in the shm, a sem point is given */ + case CMD_MOUSE_SET_NOTIFY: + *(unsigned long *)args = (rt_uint32_t)(unsigned long)lwp_map_user_phy(lwp_self(), RT_NULL, (uint32_t*)((size_t)&_mouse.touchdata + PV_OFFSET), sizeof(struct rt_touch_data), 1); + break; + default: + break; + } + return RT_EOK; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops _mouse_ops = +{ + drv_mouse_init, + RT_NULL, + RT_NULL, + RT_NULL, + RT_NULL, + drv_mouse_control +}; +#endif + +static int hw_dsi_touch_init(void) +{ + struct rt_device *device = &_mouse.parent; + +#ifdef RT_USING_DEVICE_OPS + device->ops = &_mouse_ops; +#else + device->init = drv_mouse_init; + device->open = RT_NULL; + device->close = RT_NULL; + device->read = RT_NULL; + device->write = RT_NULL; + device->control = drv_mouse_control; +#endif + rt_device_register(device, "mouse", RT_DEVICE_FLAG_RDWR); + _mouse.channel = rt_channel_open("mouse", O_CREAT); + + /* touch sem */ + rt_sem_init(&dsi_touch_ack, "dsi_touch_ack", 0, RT_IPC_FLAG_FIFO); + + dsi_touch_tid = rt_thread_create("dsi_touch", + dsi_touch_thread_entry, RT_NULL, + DSI_TOUCH_THREAD_STACK_SIZE, + DSI_TOUCH_THREAD_PRIORITY, DSI_TOUCH_THREAD_TIMESLICE); + if (dsi_touch_tid != RT_NULL) + { + rt_thread_startup(dsi_touch_tid); + } + + touch_device = (rt_touch_t)rt_malloc(sizeof(struct rt_touch_device)); + + if (touch_device == RT_NULL) + { + return -RT_ERROR; + } + + /* register touch device */ + touch_device->info.type = RT_TOUCH_TYPE_RESISTANCE; + touch_device->info.vendor = RT_TOUCH_VENDOR_UNKNOWN; + + touch_device->ops = &dsi_touch_ops; + rt_hw_touch_register(touch_device, "dsi_touch", RT_DEVICE_FLAG_INT_RX, RT_NULL); + return 0; +} +INIT_APP_EXPORT(hw_dsi_touch_init); +#endif /* BSP_USING_TOUCH */ diff --git a/bsp/raspberry-pi/raspi4-64/drivers/drv_hdmi.c b/bsp/raspberry-pi/raspi4-64/drivers/drv_hdmi.c index d51ab2898e..be6412dca5 100644 --- a/bsp/raspberry-pi/raspi4-64/drivers/drv_hdmi.c +++ b/bsp/raspberry-pi/raspi4-64/drivers/drv_hdmi.c @@ -10,6 +10,12 @@ #include #include +#include +#include +#include + +#include + #include "mbox.h" #include "drv_hdmi.h" @@ -89,26 +95,50 @@ rt_size_t hdmi_fb_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_si rt_err_t hdmi_fb_control(rt_device_t dev, int cmd, void *args) { + static unsigned long smem_start = 0; + static unsigned long smem_len = 0; struct rt_hdmi_fb_device *lcd = LCD_DEVICE(dev); + switch (cmd) { case RTGRAPHIC_CTRL_RECT_UPDATE: { - struct rt_device_rect_info *info = (struct rt_device_rect_info*)args; - info = info; + if (smem_start != 0) + { + extern void rt_hw_cpu_dcache_clean_and_invalidate(void *addr, int size); + + rt_hw_cpu_dcache_clean_and_invalidate((void *)smem_start, smem_len); + } } break; - case RTGRAPHIC_CTRL_GET_INFO: { - struct rt_device_graphic_info* info = (struct rt_device_graphic_info*)args; - - RT_ASSERT(info != RT_NULL); - info->pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB888; - info->bits_per_pixel= LCD_DEPTH; - info->width = lcd->width; - info->height = lcd->height; - info->framebuffer = lcd->fb; + struct rt_device_graphic_info *lcd_info = (struct rt_device_graphic_info *)args; + lcd_info->bits_per_pixel = 32; + lcd_info->pixel_format = RTGRAPHIC_PIXEL_FORMAT_ARGB888; /* should be coherent to adding layers */ + lcd_info->width = lcd->width; + lcd_info->height = lcd->height; + lcd_info->framebuffer = (void *)lwp_map_user_phy(lwp_self(), RT_NULL, lcd->fb, lcd->width * lcd->height * sizeof(rt_uint32_t), 1); + } + break; +#define FBIOGET_FSCREENINFO 0x4602 + case FBIOGET_FSCREENINFO: + { + struct fb_fix_screeninfo + { + char id[16]; + unsigned long smem_start; + uint32_t smem_len; + + uint32_t line_length; + } *info = (struct fb_fix_screeninfo *)args; + rt_strncpy(info->id, "lcd", sizeof(info->id)); + info->smem_len = lcd->width * lcd->height * sizeof(rt_uint32_t); + info->smem_start = (size_t)lwp_map_user_phy(lwp_self(), RT_NULL, lcd->fb, info->smem_len, 1); + info->line_length = lcd->width * sizeof(rt_uint32_t); + rt_memset((void *)info->smem_start, 0, info->smem_len); + smem_start = info->smem_start; + smem_len = info->smem_len; } break; } @@ -291,6 +321,21 @@ void *bcm271x_mbox_fb_alloc(int width, int height, int bpp, int nrender) int hdmi_fb_init(void) { _hdmi.fb = (rt_uint8_t *)bcm271x_mbox_fb_alloc(LCD_WIDTH, LCD_HEIGHT, LCD_BPP, 1); + + if (_hdmi.fb == RT_NULL) + { + rt_kprintf("init hdmi fb err!\n"); + return -RT_ERROR; + } + +#ifdef BSP_USING_VM_MODE + if (rt_hv_stage2_map((unsigned long)_hdmi.fb, 0x1400000)) + { + rt_kprintf("alloc mmio from hyper fail!\n"); + return -RT_ERROR; + } +#endif + bcm271x_mbox_fb_setoffset(0, 0); bcm271x_mbox_fb_set_porder(0); _hdmi.width = LCD_WIDTH; diff --git a/bsp/raspberry-pi/raspi4-64/drivers/mbox.c b/bsp/raspberry-pi/raspi4-64/drivers/mbox.c index 177b043a8a..aa766bbbac 100644 --- a/bsp/raspberry-pi/raspi4-64/drivers/mbox.c +++ b/bsp/raspberry-pi/raspi4-64/drivers/mbox.c @@ -51,6 +51,24 @@ int mbox_call(unsigned char ch, int mmu_enable) return 0; } +int bcm271x_mbox_get_touch(void) +{ + mbox[0] = 8 * 4; // length of the message + mbox[1] = MBOX_REQUEST; // this is a request message + + mbox[2] = MBOX_TAG_GET_TOUCHBUF; + mbox[3] = 4; // buffer size + mbox[4] = 0; // len + + mbox[5] = 0; // id + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + mbox_call(8, MMU_DISABLE); + + return (int)(mbox[5] & ~0xC0000000); +} + int bcm271x_notify_reboot(void) { mbox[0] = 7*4; // length of the message @@ -174,7 +192,7 @@ int bcm271x_mbox_hardware_get_serial(rt_uint64_t* sn) mbox[7] = MBOX_TAG_LAST; mbox_call(8, MMU_DISABLE); - sn = (rt_uint64_t *)&mbox[5]; + *sn = *(rt_uint64_t *)&mbox[5]; return 0; } diff --git a/bsp/raspberry-pi/raspi4-64/drivers/mbox.h b/bsp/raspberry-pi/raspi4-64/drivers/mbox.h index 40c50f4080..27db087b6e 100644 --- a/bsp/raspberry-pi/raspi4-64/drivers/mbox.h +++ b/bsp/raspberry-pi/raspi4-64/drivers/mbox.h @@ -133,6 +133,11 @@ enum { #define MBOX_TAG_NOTIFY_REBOOT 0x00030048 #define MBOX_TAG_NOTIFY_XHCI_RESET 0x00030058 +/* +* touch +*/ +#define MBOX_TAG_GET_TOUCHBUF (0x0004000F) + #define MBOX_ADDR 0x08000000 extern size_t mbox_addr; @@ -149,6 +154,7 @@ extern size_t mbox_addr; #define PWM_CLK_ID (0x00000000a) int mbox_call(unsigned char ch, int mmu_enable); +int bcm271x_mbox_get_touch(void); int bcm271x_notify_reboot(void); int bcm271x_notify_xhci_reset(void); int bcm271x_gpu_enable(void); diff --git a/bsp/raspberry-pi/raspi4-64/rtconfig.h b/bsp/raspberry-pi/raspi4-64/rtconfig.h index 62ab56578b..f381e13616 100644 --- a/bsp/raspberry-pi/raspi4-64/rtconfig.h +++ b/bsp/raspberry-pi/raspi4-64/rtconfig.h @@ -48,6 +48,8 @@ #define RT_VER_NUM 0x50000 #define ARCH_CPU_64BIT #define RT_USING_CACHE +#define ARCH_MM_MMU +#define ARCH_ARM #define ARCH_ARM_MMU #define RT_USING_USERSPACE #define KERNEL_VADDR_START 0xffff000000000000 @@ -68,6 +70,7 @@ #define RT_USING_FINSH #define RT_USING_MSH +#define FINSH_USING_MSH #define FINSH_THREAD_NAME "tshell" #define FINSH_USING_HISTORY #define FINSH_HISTORY_LINES 5 @@ -103,12 +106,14 @@ /* Device Drivers */ #define RT_USING_DEVICE_IPC +#define RT_UNAMED_PIPE_NUMBER 64 #define RT_PIPE_BUFSZ 512 #define RT_USING_SYSTEM_WORKQUEUE #define RT_SYSTEM_WORKQUEUE_STACKSIZE 8192 #define RT_SYSTEM_WORKQUEUE_PRIORITY 23 #define RT_USING_SERIAL #define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_TTY #define RT_USING_HWTIMER #define RT_USING_I2C #define RT_USING_I2C_BITOPS @@ -126,6 +131,7 @@ #define RT_MMCSD_MAX_PARTITION 16 #define RT_USING_SPI #define RT_USING_WDT +#define RT_USING_TOUCH /* Using USB */ @@ -136,7 +142,6 @@ #define RT_USING_MUSL #define RT_USING_POSIX #define RT_USING_POSIX_MMAP -#define RT_USING_POSIX_TERMIOS #define RT_USING_POSIX_AIO #define RT_POSIX_AIO_THREAD_STACK_SIZE 8192 #define RT_USING_POSIX_CLOCKTIME @@ -219,9 +224,9 @@ #define RT_LWP_MAX_NR 30 #define LWP_TASK_STACK_SIZE 16384 #define RT_CH_MSG_MAX_NR 1024 -#define RT_LWP_SHM_MAX_NR 64 #define LWP_CONSOLE_INPUT_BUFFER_SIZE 1024 #define LWP_TID_MAX_NR 64 +#define RT_LWP_SHM_MAX_NR 64 /* RT-Thread online packages */ @@ -247,32 +252,38 @@ /* multimedia packages */ +/* LVGL: powerful and easy-to-use embedded GUI library */ + + +/* u8g2: a monochrome graphic library */ + /* tools packages */ /* system packages */ +/* acceleration: Assembly language or algorithmic acceleration packages */ -/* Micrium: Micrium software products porting for RT-Thread */ +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ -/* peripheral libraries and drivers */ +/* Micrium: Micrium software products porting for RT-Thread */ -/* miscellaneous packages */ +/* peripheral libraries and drivers */ -/* samples: kernel and components samples */ +/* AI packages */ -/* games: games run on RT-Thread console */ +/* miscellaneous packages */ -/* Privated Packages of RealThread */ +/* samples: kernel and components samples */ -/* Network Utilities */ +/* entertainment: terminal games and other interesting software packages */ #define BCM2711_SOC diff --git a/libcpu/aarch64/common/hypercall.c b/libcpu/aarch64/common/hypercall.c new file mode 100644 index 0000000000..73b64d5aae --- /dev/null +++ b/libcpu/aarch64/common/hypercall.c @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-02-24 GuEe-GUI first version + */ + +#include + +rt_err_t rt_hv_stage2_map(unsigned long paddr, unsigned long size) +{ + return rt_hw_hypercall(120, paddr & (~4095), (paddr & (~4095)) + size, (1 << 0) | (1 << 1) | (1 << 4), 0, 0, 0, 0); +} diff --git a/libcpu/aarch64/common/hypercall.h b/libcpu/aarch64/common/hypercall.h new file mode 100644 index 0000000000..e9599d7f78 --- /dev/null +++ b/libcpu/aarch64/common/hypercall.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-02-24 GuEe-GUI first version + */ + +#ifndef __HYPERCALL_H__ +#define __HYPERCALL_H__ + +#include + +rt_inline rt_uint32_t rt_hw_hypercall(rt_uint32_t w0, rt_uint64_t x1, rt_uint64_t x2, + rt_uint64_t x3, rt_uint64_t x4, rt_uint64_t x5, rt_uint64_t x6, rt_uint32_t w7) +{ + register rt_uint64_t ret __asm__ ("x0"); + __asm__ volatile ("hvc #0"); + + return (rt_uint32_t)ret; +} + +rt_err_t rt_hv_stage2_map(unsigned long paddr, unsigned long size); + +#endif -- Gitee