فهرست منبع

[libcpu/aarch64] add virtual machine mode

GuEe_GUI 3 سال پیش
والد
کامیت
443afd80fd

+ 142 - 92
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

+ 8 - 0
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

+ 240 - 0
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 <rtthread.h>
+#include <rtdevice.h>
+#include <touch.h>
+#include <ioremap.h>
+#include <lwp.h>
+#include <lwp_user_mm.h>
+#include <mmu.h>
+
+#include <hypercall.h>
+
+#ifdef BSP_USING_TOUCH
+
+#include "mbox.h"
+#include "drv_dsi_touch.h"
+
+#define DBG_TAG "dsi_touch"
+#define DBG_LVL DBG_INFO
+#include <rtdbg.h>
+
+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 */

+ 56 - 11
bsp/raspberry-pi/raspi4-64/drivers/drv_hdmi.c

@@ -10,6 +10,12 @@
 
 #include <stdint.h>
 #include <rtthread.h>
+#include <ioremap.h>
+#include <lwp.h>
+#include <lwp_user_mm.h>
+
+#include <hypercall.h>
+
 #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;

+ 19 - 1
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;
 }

+ 6 - 0
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);

+ 20 - 9
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
 

+ 16 - 0
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 <hypercall.h>
+
+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);
+}

+ 27 - 0
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 <rtdef.h>
+
+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