Procházet zdrojové kódy

[BSP] Enable rt-smart feature in qemu-vexpress-a9 BSP

Bernard Xiong před 5 roky
rodič
revize
966956240f

+ 169 - 22
bsp/qemu-vexpress-a9/.config

@@ -8,6 +8,7 @@
 #
 CONFIG_RT_NAME_MAX=8
 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+CONFIG_RT_USING_SMART=y
 CONFIG_RT_USING_SMP=y
 CONFIG_RT_CPUS_NR=2
 CONFIG_RT_ALIGN_SIZE=4
@@ -68,12 +69,19 @@ CONFIG_RT_USING_INTERRUPT_INFO=y
 CONFIG_RT_USING_CONSOLE=y
 CONFIG_RT_CONSOLEBUF_SIZE=256
 CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
-CONFIG_RT_VER_NUM=0x40002
+CONFIG_RT_VER_NUM=0x40003
 CONFIG_ARCH_ARM=y
 # CONFIG_RT_USING_CPU_FFS is not set
+CONFIG_ARCH_ARM_MMU=y
+CONFIG_RT_USING_USERSPACE=y
+CONFIG_KERNEL_VADDR_START=0xc0000000
+CONFIG_PV_OFFSET=0xa0000000
+# CONFIG_RT_IOREMAP_LATE is not set
 CONFIG_ARCH_ARM_CORTEX_A=y
 CONFIG_ARCH_ARM_CORTEX_A9=y
+CONFIG_RT_BACKTRACE_FUNCTION_NAME=y
 # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_RT_USING_CACHE=y
 
 #
 # RT-Thread Components
@@ -86,7 +94,7 @@ CONFIG_RT_MAIN_THREAD_PRIORITY=10
 #
 # C++ features
 #
-CONFIG_RT_USING_CPLUSPLUS=y
+# CONFIG_RT_USING_CPLUSPLUS is not set
 
 #
 # Command shell
@@ -112,7 +120,7 @@ CONFIG_FINSH_ARG_MAX=10
 #
 CONFIG_RT_USING_DFS=y
 CONFIG_DFS_USING_WORKDIR=y
-CONFIG_DFS_FILESYSTEMS_MAX=2
+CONFIG_DFS_FILESYSTEMS_MAX=4
 CONFIG_DFS_FILESYSTEM_TYPES_MAX=8
 CONFIG_DFS_FD_MAX=16
 # CONFIG_RT_USING_DFS_MNTTABLE is not set
@@ -135,6 +143,7 @@ CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=4096
 CONFIG_RT_DFS_ELM_REENTRANT=y
 CONFIG_RT_USING_DFS_DEVFS=y
 CONFIG_RT_USING_DFS_ROMFS=y
+# CONFIG_RT_USING_DFS_CROMFS is not set
 CONFIG_RT_USING_DFS_RAMFS=y
 # CONFIG_RT_USING_DFS_UFFS is not set
 # CONFIG_RT_USING_DFS_JFFS2 is not set
@@ -155,14 +164,16 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
 # CONFIG_RT_USING_HWTIMER is not set
 # CONFIG_RT_USING_CPUTIME is not set
 CONFIG_RT_USING_I2C=y
+# CONFIG_RT_I2C_DEBUG is not set
 CONFIG_RT_USING_I2C_BITOPS=y
+# CONFIG_RT_I2C_BITOPS_DEBUG is not set
 CONFIG_RT_USING_PIN=y
 # CONFIG_RT_USING_ADC is not set
+# CONFIG_RT_USING_DAC is not set
 # CONFIG_RT_USING_PWM is not set
 CONFIG_RT_USING_MTD_NOR=y
 CONFIG_RT_USING_MTD_NAND=y
 CONFIG_RT_MTD_NAND_DEBUG=y
-# CONFIG_RT_USING_MTD is not set
 # CONFIG_RT_USING_PM is not set
 CONFIG_RT_USING_RTC=y
 # CONFIG_RT_USING_ALARM is not set
@@ -181,6 +192,7 @@ CONFIG_RT_USING_SFUD=y
 CONFIG_RT_SFUD_USING_SFDP=y
 CONFIG_RT_SFUD_USING_FLASH_INFO_TABLE=y
 # CONFIG_RT_SFUD_USING_QSPI is not set
+CONFIG_RT_SFUD_SPI_MAX_HZ=50000000
 # CONFIG_RT_DEBUG_SFUD is not set
 # CONFIG_RT_USING_ENC28J60 is not set
 # CONFIG_RT_USING_SPI_WIFI is not set
@@ -188,15 +200,9 @@ 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
-
-#
-# Using Hardware Crypto drivers
-#
 # CONFIG_RT_USING_HWCRYPTO is not set
-
-#
-# Using WiFi
-#
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
 # CONFIG_RT_USING_WIFI is not set
 
 #
@@ -209,11 +215,14 @@ CONFIG_RT_USING_WDT=y
 # POSIX layer and C standard library
 #
 CONFIG_RT_USING_LIBC=y
-CONFIG_RT_USING_PTHREADS=y
-CONFIG_PTHREAD_NUM_MAX=8
+# CONFIG_RT_USING_NEWLIB is not set
+CONFIG_RT_USING_MUSL=y
+# CONFIG_RT_USING_MUSL_LIBC 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_USING_MODULE is not set
 
@@ -251,8 +260,9 @@ CONFIG_NETDEV_IPV6=0
 CONFIG_RT_USING_LWIP=y
 # CONFIG_RT_USING_LWIP141 is not set
 CONFIG_RT_USING_LWIP202=y
-# CONFIG_RT_USING_LWIP210 is not set
+# CONFIG_RT_USING_LWIP212 is not set
 # CONFIG_RT_USING_LWIP_IPV6 is not set
+CONFIG_RT_LWIP_MEM_ALIGNMENT=4
 # CONFIG_RT_LWIP_IGMP is not set
 CONFIG_RT_LWIP_ICMP=y
 # CONFIG_RT_LWIP_SNMP is not set
@@ -281,7 +291,7 @@ 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=1024
+CONFIG_RT_LWIP_TCPTHREAD_STACKSIZE=2048
 # CONFIG_LWIP_NO_RX_THREAD is not set
 # CONFIG_LWIP_NO_TX_THREAD is not set
 CONFIG_RT_LWIP_ETHTHREAD_PRIORITY=12
@@ -294,6 +304,7 @@ 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
@@ -301,11 +312,6 @@ CONFIG_LWIP_NETIF_LOOPBACK=0
 CONFIG_RT_LWIP_USING_PING=y
 # CONFIG_RT_LWIP_DEBUG is not set
 
-#
-# Modbus master and slave stack
-#
-# CONFIG_RT_USING_MODBUS is not set
-
 #
 # AT commands
 #
@@ -324,6 +330,12 @@ CONFIG_RT_LWIP_USING_PING=y
 # CONFIG_RT_USING_ULOG is not set
 # CONFIG_RT_USING_UTEST is not set
 CONFIG_RT_USING_LWP=y
+CONFIG_RT_LWP_MAX_NR=30
+# 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_USING_CORE_DUMP is not set
 
 #
 # RT-Thread online packages
@@ -332,14 +344,20 @@ CONFIG_RT_USING_LWP=y
 #
 # IoT - internet of things
 #
+# CONFIG_PKG_USING_LORAWAN_DRIVER is not set
 # CONFIG_PKG_USING_PAHOMQTT is not set
+# CONFIG_PKG_USING_UMQTT is not set
 # CONFIG_PKG_USING_WEBCLIENT is not set
 # CONFIG_PKG_USING_WEBNET is not set
 # CONFIG_PKG_USING_MONGOOSE is not set
+# CONFIG_PKG_USING_MYMQTT is not set
+# CONFIG_PKG_USING_KAWAII_MQTT is not set
+# CONFIG_PKG_USING_BC28_MQTT is not set
 # CONFIG_PKG_USING_WEBTERMINAL is not set
 # CONFIG_PKG_USING_CJSON is not set
 # CONFIG_PKG_USING_JSMN is not set
 # CONFIG_PKG_USING_LIBMODBUS is not set
+# CONFIG_PKG_USING_FREEMODBUS is not set
 # CONFIG_PKG_USING_LJSON is not set
 # CONFIG_PKG_USING_EZXML is not set
 # CONFIG_PKG_USING_NANOPB is not set
@@ -361,6 +379,8 @@ CONFIG_RT_USING_LWP=y
 # CONFIG_PKG_USING_COAP is not set
 # CONFIG_PKG_USING_NOPOLL is not set
 # CONFIG_PKG_USING_NETUTILS is not set
+# CONFIG_PKG_USING_CMUX is not set
+# CONFIG_PKG_USING_PPP_DEVICE is not set
 # CONFIG_PKG_USING_AT_DEVICE is not set
 # CONFIG_PKG_USING_ATSRV_SOCKET is not set
 # CONFIG_PKG_USING_WIZNET is not set
@@ -372,13 +392,32 @@ CONFIG_RT_USING_LWP=y
 # CONFIG_PKG_USING_GAGENT_CLOUD is not set
 # CONFIG_PKG_USING_ALI_IOTKIT is not set
 # CONFIG_PKG_USING_AZURE is not set
-# CONFIG_PKG_USING_TENCENT_IOTHUB is not set
+# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set
+# CONFIG_PKG_USING_JIOT-C-SDK is not set
+# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set
+# CONFIG_PKG_USING_JOYLINK is not set
 # CONFIG_PKG_USING_NIMBLE is not set
 # CONFIG_PKG_USING_OTA_DOWNLOADER is not set
 # CONFIG_PKG_USING_IPMSG is not set
 # CONFIG_PKG_USING_LSSDP is not set
 # CONFIG_PKG_USING_AIRKISS_OPEN is not set
 # 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
+# CONFIG_PKG_USING_ABUP_FOTA is not set
+# CONFIG_PKG_USING_LIBCURL2RTT is not set
+# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set
+# CONFIG_PKG_USING_AGILE_TELNET is not set
+# CONFIG_PKG_USING_NMEALIB is not set
+# CONFIG_PKG_USING_AGILE_JSMN is not set
+# CONFIG_PKG_USING_PDULIB is not set
+# CONFIG_PKG_USING_BTSTACK is not set
 
 #
 # security packages
@@ -386,6 +425,8 @@ CONFIG_RT_USING_LWP=y
 # CONFIG_PKG_USING_MBEDTLS is not set
 # CONFIG_PKG_USING_libsodium is not set
 # CONFIG_PKG_USING_TINYCRYPT is not set
+# CONFIG_PKG_USING_TFM is not set
+# CONFIG_PKG_USING_YD_CRYPTO is not set
 
 #
 # language packages
@@ -400,6 +441,9 @@ CONFIG_RT_USING_LWP=y
 # 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_HELIX is not set
 
 #
 # tools packages
@@ -412,6 +456,15 @@ CONFIG_RT_USING_LWP=y
 # CONFIG_PKG_USING_QRCODE is not set
 # CONFIG_PKG_USING_ULOG_EASYFLASH is not set
 # CONFIG_PKG_USING_ADBD is not set
+# CONFIG_PKG_USING_COREMARK is not set
+# CONFIG_PKG_USING_DHRYSTONE is not set
+# CONFIG_PKG_USING_NR_MICRO_SHELL is not set
+# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set
+# CONFIG_PKG_USING_LUNAR_CALENDAR is not set
+# CONFIG_PKG_USING_BS8116A is not set
+# CONFIG_PKG_USING_GPS_RMC is not set
+# CONFIG_PKG_USING_URLENCODE is not set
+# CONFIG_PKG_USING_UMCN is not set
 
 #
 # system packages
@@ -423,6 +476,7 @@ CONFIG_RT_USING_LWP=y
 # 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
@@ -430,6 +484,16 @@ CONFIG_RT_USING_LWP=y
 # CONFIG_PKG_USING_DFS_YAFFS is not set
 # CONFIG_PKG_USING_LITTLEFS 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
+# CONFIG_PKG_USING_SYSWATCH is not set
+# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set
+# CONFIG_PKG_USING_PLCCORE is not set
+# CONFIG_PKG_USING_RAMDISK is not set
+# CONFIG_PKG_USING_MININI is not set
+# CONFIG_PKG_USING_QBOOT is not set
+# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set
+# CONFIG_PKG_USING_PPOOL is not set
 
 #
 # peripheral libraries and drivers
@@ -437,6 +501,7 @@ CONFIG_RT_USING_LWP=y
 # CONFIG_PKG_USING_SENSORS_DRIVERS is not set
 # CONFIG_PKG_USING_REALTEK_AMEBA is not set
 # CONFIG_PKG_USING_SHT2X is not set
+# CONFIG_PKG_USING_SHT3X 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
@@ -445,10 +510,16 @@ CONFIG_RT_USING_LWP=y
 # CONFIG_PKG_USING_SX12XX is not set
 # CONFIG_PKG_USING_SIGNAL_LED is not set
 # CONFIG_PKG_USING_LEDBLINK is not set
+# CONFIG_PKG_USING_LITTLED is not set
+# CONFIG_PKG_USING_LKDGUI is not set
+# CONFIG_PKG_USING_NRF5X_SDK is not set
+# CONFIG_PKG_USING_NRFX is not set
 # 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
 # CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set
 # CONFIG_PKG_USING_AD7746 is not set
@@ -456,6 +527,27 @@ CONFIG_RT_USING_LWP=y
 # CONFIG_PKG_USING_I2C_TOOLS is not set
 # CONFIG_PKG_USING_NRF24L01 is not set
 # CONFIG_PKG_USING_TOUCH_DRIVERS is not set
+# CONFIG_PKG_USING_MAX17048 is not set
+# CONFIG_PKG_USING_RPLIDAR is not set
+# CONFIG_PKG_USING_AS608 is not set
+# CONFIG_PKG_USING_RC522 is not set
+# CONFIG_PKG_USING_WS2812B is not set
+# CONFIG_PKG_USING_EMBARC_BSP is not set
+# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set
+# CONFIG_PKG_USING_MULTI_RTIMER is not set
+# CONFIG_PKG_USING_MAX7219 is not set
+# CONFIG_PKG_USING_BEEP is not set
+# CONFIG_PKG_USING_EASYBLINK is not set
+# CONFIG_PKG_USING_PMS_SERIES is not set
+# CONFIG_PKG_USING_CAN_YMODEM is not set
+# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set
+# CONFIG_PKG_USING_QLED is not set
+# CONFIG_PKG_USING_PAJ7620 is not set
+# CONFIG_PKG_USING_AGILE_CONSOLE is not set
+# CONFIG_PKG_USING_LD3320 is not set
+# CONFIG_PKG_USING_WK2124 is not set
+# CONFIG_PKG_USING_LY68L6400 is not set
+# CONFIG_PKG_USING_DM9051 is not set
 
 #
 # miscellaneous packages
@@ -466,12 +558,15 @@ CONFIG_RT_USING_LWP=y
 # CONFIG_PKG_USING_MINILZO is not set
 # CONFIG_PKG_USING_QUICKLZ is not set
 # 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 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
@@ -483,8 +578,60 @@ CONFIG_RT_USING_LWP=y
 # CONFIG_PKG_USING_HELLO is not set
 # CONFIG_PKG_USING_VI 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
+# CONFIG_PKG_USING_THREES is not set
+# CONFIG_PKG_USING_2048 is not set
+# CONFIG_PKG_USING_LWGPS is not set
+# CONFIG_PKG_USING_TENSORFLOWLITEMICRO 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_SOC_VEXPRESS_A9=y
 CONFIG_RT_USING_UART0=y
 CONFIG_RT_USING_UART1=y
+CONFIG_BSP_DRV_CLCD=y
+CONFIG_BSP_LCD_WIDTH=640
+CONFIG_BSP_LCD_HEIGHT=480
 CONFIG_BSP_DRV_EMAC=y
 # CONFIG_BSP_DRV_AUDIO is not set

+ 1 - 0
bsp/qemu-vexpress-a9/.gitignore

@@ -42,3 +42,4 @@ settings/
 cconfig.h
 .settings
 drivers/automac.h
+romfs.c

+ 2 - 0
bsp/qemu-vexpress-a9/Kconfig

@@ -21,6 +21,8 @@ source "$PKGS_DIR/Kconfig"
 config SOC_VEXPRESS_A9
     bool
     select ARCH_ARM_CORTEX_A9
+    select RT_USING_CACHE
+    select ARCH_ARM_MMU
     select RT_USING_COMPONENTS_INIT
     select RT_USING_USER_MAIN
     default y

+ 2 - 2
bsp/qemu-vexpress-a9/SConscript

@@ -1,8 +1,8 @@
 # for module compiling
 import os
-Import('RTT_ROOT')
+from building import *
 
-cwd = str(Dir('#'))
+cwd = GetCurrentDir()
 objs = []
 list = os.listdir(cwd)
 

+ 2 - 1
bsp/qemu-vexpress-a9/SConstruct

@@ -15,12 +15,13 @@ TARGET = 'rtthread.' + rtconfig.TARGET_EXT
 DefaultEnvironment(tools=[])
 env = Environment(tools = ['mingw'],
     AS   = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
-    CC   = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
+    CC   = rtconfig.CC, CFLAGS = rtconfig.CFLAGS,
     CXX  = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
     AR   = rtconfig.AR, ARFLAGS = '-rc',
     LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 env['ASCOM'] = env['ASPPCOM']
+env['LINKCOM'] = '$LINK -o $TARGET $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS -Wl,--start-group $_LIBFLAGS -Wl,--end-group'
 
 Export('RTT_ROOT')
 Export('rtconfig')

+ 1 - 1
bsp/qemu-vexpress-a9/applications/SConscript

@@ -4,7 +4,7 @@ from building import *
 
 cwd     = GetCurrentDir()
 src     = Glob('*.c') + Glob('*.cpp')
-CPPPATH = [cwd, str(Dir('#'))]
+CPPPATH = [cwd]
 
 group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
 

+ 9 - 0
bsp/qemu-vexpress-a9/applications/main.c

@@ -1,3 +1,12 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2020/10/7      bernard      the first version
+ */
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>

+ 11 - 3
bsp/qemu-vexpress-a9/applications/mnt.c

@@ -2,16 +2,24 @@
 
 #ifdef RT_USING_DFS
 #include <dfs_fs.h>
+#include <dfs_romfs.h>
 
 int mnt_init(void)
 {
-    rt_thread_delay(RT_TICK_PER_SECOND);
+    if (dfs_mount(RT_NULL, "/", "rom", 0, &romfs_root) != 0)
+    {
+        rt_kprintf("Dir / mount failed!\n");
+        return -1;
+    }
 
-    if (dfs_mount("sd0", "/", "elm", 0, 0) == 0)
+    rt_thread_mdelay(200);
+    if (dfs_mount("sd0", "/mnt", "elm", 0, NULL) != 0)
     {
-        rt_kprintf("file system initialization done!\n");
+        rt_kprintf("Dir /mnt mount failed!\n");
+        return -1;
     }
 
+    rt_kprintf("file system initialization done!\n");
     return 0;
 }
 INIT_ENV_EXPORT(mnt_init);

+ 0 - 2
bsp/qemu-vexpress-a9/drivers/Kconfig

@@ -8,7 +8,6 @@ config RT_USING_UART1
 
 config BSP_DRV_CLCD
     bool "CLCD driver"
-    depends on PKG_USING_GUIENGINE
     default y
 
 if BSP_DRV_CLCD
@@ -23,7 +22,6 @@ endif
 
 config BSP_DRV_EMAC
     bool "EMAC driver"
-    depends on RT_USING_LWIP
     default y
 
 config BSP_DRV_AUDIO

+ 37 - 2
bsp/qemu-vexpress-a9/drivers/board.c

@@ -18,11 +18,21 @@
 #include "drv_timer.h"
 
 #include <mmu.h>
+#ifdef RT_USING_USERSPACE
+#include <page.h>
+#include <lwp_arch.h>
+#endif
 
+#ifdef RT_USING_USERSPACE
+struct mem_desc platform_mem_desc[] = {
+    {KERNEL_VADDR_START, KERNEL_VADDR_START + 0x0fffffff, KERNEL_VADDR_START + PV_OFFSET, NORMAL_MEM}
+};
+#else
 struct mem_desc platform_mem_desc[] = {
     {0x10000000, 0x50000000, 0x10000000, DEVICE_MEM},
-    {0x60000000, 0xe0000000, 0x60000000, NORMAL_MEM}
+    {0x60000000, 0x70000000, 0x60000000, NORMAL_MEM}
 };
+#endif
 
 const rt_uint32_t platform_mem_desc_size = sizeof(platform_mem_desc)/sizeof(platform_mem_desc[0]);
 
@@ -36,12 +46,37 @@ void idle_wfi(void)
 }
 
 /**
- * This function will initialize beaglebone board
+ * This function will initialize board
  */
+
+rt_mmu_info mmu_info;
+
+extern size_t MMUTable[];
+
+#ifdef RT_USING_USERSPACE
+rt_region_t init_page_region = {
+    (uint32_t)PAGE_START,
+    (uint32_t)PAGE_END,
+};
+#endif
+
 void rt_hw_board_init(void)
 {
+#ifdef RT_USING_USERSPACE
+    rt_hw_mmu_map_init(&mmu_info, (void*)0xf0000000, 0x10000000, MMUTable, PV_OFFSET);
+
+    rt_page_init(init_page_region);
+    rt_hw_mmu_ioremap_init(&mmu_info, (void*)0xf0000000, 0x10000000);
+
+    arch_kuser_init(&mmu_info, (void*)0xffff0000);
+#else
+    rt_hw_mmu_map_init(&mmu_info, (void*)0x80000000, 0x10000000, MMUTable, 0);
+    rt_hw_mmu_ioremap_init(&mmu_info, (void*)0x80000000, 0x10000000);
+#endif
+
     /* initialize hardware interrupt */
     rt_hw_interrupt_init();
+
     /* initialize system heap */
     rt_system_heap_init(HEAP_BEGIN, HEAP_END);
 

+ 12 - 1
bsp/qemu-vexpress-a9/drivers/board.h

@@ -15,9 +15,12 @@
 #ifndef __BOARD_H__
 #define __BOARD_H__
 
+#include <rtconfig.h>
 #include <realview.h>
 #include "vexpress_a9.h"
 
+#include "mmu.h"
+
 #if defined(__CC_ARM)
 extern int Image$$RW_IRAM1$$ZI$$Limit;
 #define HEAP_BEGIN      ((void*)&Image$$RW_IRAM1$$ZI$$Limit)
@@ -26,8 +29,16 @@ extern int __bss_end;
 #define HEAP_BEGIN      ((void*)&__bss_end)
 #endif
 
-#define HEAP_END        (void*)(0x60000000 + 8 * 1024 * 1024)
+#ifdef RT_USING_USERSPACE
+#define HEAP_END        (void*)(KERNEL_VADDR_START + 16 * 1024 * 1024)
+#define PAGE_START      HEAP_END
+#define PAGE_END        (void*)(KERNEL_VADDR_START + 128 * 1024 * 1024)
+#else
+#define HEAP_END        (void*)(0x60000000 + 64 * 1024 * 1024)
+#endif
 
 void rt_hw_board_init(void);
 
+extern rt_mmu_info mmu_info;
+
 #endif

+ 51 - 4
bsp/qemu-vexpress-a9/drivers/drv_clcd.c

@@ -3,7 +3,13 @@
 #include <stdlib.h>
 
 #include <rtthread.h>
+#include <lwp.h>
+
+#include <board.h>
+#include <lwp_user_mm.h>
+
 #include "drv_clcd.h"
+#include "rt_lcd.h"
 
 #define CLCD_WIDTH  (BSP_LCD_WIDTH)
 #define CLCD_HEIGHT (BSP_LCD_HEIGHT)
@@ -35,6 +41,7 @@ struct drv_clcd_device
     int height;
 
     uint8_t *fb;
+    uint8_t *fb_virt;
 };
 struct drv_clcd_device _lcd;
 
@@ -57,6 +64,7 @@ static rt_err_t drv_clcd_control(struct rt_device *device, int cmd, void *args)
             struct rt_device_rect_info *info = (struct rt_device_rect_info*)args;
 
             info = info; /* nothing, right now */
+            rt_kprintf("update screen...\n");
         }
         break;
 
@@ -66,20 +74,44 @@ static rt_err_t drv_clcd_control(struct rt_device *device, int cmd, void *args)
 
             RT_ASSERT(info != RT_NULL);
             info->pixel_format  = RTGRAPHIC_PIXEL_FORMAT_RGB565;
-            // info->pixel_format  = RTGRAPHIC_PIXEL_FORMAT_ARGB888;
             info->bits_per_pixel= 16;
             info->width         = lcd->width;
             info->height        = lcd->height;
             info->framebuffer   = lcd->fb;
         }
         break;
+
+    case FBIOGET_FSCREENINFO:
+    {
+#ifdef RT_USING_USERSPACE
+        struct fb_fix_screeninfo *info = (struct fb_fix_screeninfo *)args;
+        strncpy(info->id, "lcd", sizeof(info->id));
+        info->smem_len    = lcd->width * lcd->height * 2;
+        info->smem_start  = (uint32_t)lwp_map_user_phy(lwp_self(), RT_NULL, lcd->fb,
+            info->smem_len, 1);
+        info->line_length = lcd->width * 2;
+#endif
+    }
+        break;
+
+    case FBIOGET_VSCREENINFO:
+    {
+        struct fb_var_screeninfo *info = (struct fb_var_screeninfo *)args;
+        info->bits_per_pixel = 16;
+        info->xres = lcd->width;
+        info->yres = lcd->height;
+    }
+        break;
+
+    case FBIOGET_DISPINFO:
+        break;
     }
 
     return RT_EOK;
 }
 
 #ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops clcd_ops = 
+const static struct rt_device_ops clcd_ops =
 {
     drv_clcd_init,
     RT_NULL,
@@ -100,7 +132,21 @@ int drv_clcd_hw_init(void)
 
     _lcd.width  = CLCD_WIDTH;
     _lcd.height = CLCD_HEIGHT;
-    _lcd.fb     = rt_malloc (_lcd.width * _lcd.height * 2);
+    rt_kprintf("try to allocate fb... | w - %d, h - %d | ", _lcd.width, _lcd.height);
+#ifdef RT_USING_USERSPACE
+    _lcd.fb_virt= rt_pages_alloc (rt_page_bits(_lcd.width * _lcd.height * 2));
+    _lcd.fb = _lcd.fb_virt + PV_OFFSET;
+    rt_kprintf("done!\n");
+    rt_kprintf("fb => 0x%08x\n", _lcd.fb);
+    if (_lcd.fb == NULL)
+    {
+        rt_kprintf("initialize frame buffer failed!\n");
+        return -1;
+    }
+
+    memset(_lcd.fb_virt, 0xff, _lcd.width * _lcd.height * 2);
+#else
+    _lcd.fb = rt_malloc(_lcd.width * _lcd.height * 2);
     if (_lcd.fb == NULL)
     {
         rt_kprintf("initialize frame buffer failed!\n");
@@ -108,8 +154,9 @@ int drv_clcd_hw_init(void)
     }
 
     memset(_lcd.fb, 0xff, _lcd.width * _lcd.height * 2);
+#endif
 
-    plio = (PL111MMIO*)PL111_IOBASE;
+    plio = (PL111MMIO *)rt_hw_kernel_phys_to_virt((void*)PL111_IOBASE, 0x1000);
 
     plio->tim0 = 0x3F1F3C00 | ((CLCD_WIDTH/16 - 1) << 2);
     plio->tim1 = 0x080B6000 | (CLCD_HEIGHT - 1);

+ 5 - 2
bsp/qemu-vexpress-a9/drivers/drv_keyboard.c

@@ -422,9 +422,11 @@ int rt_hw_keyboard_init(void)
     rt_uint8_t value;
     rt_uint32_t id;
     struct keyboard_pl050_pdata_t *pdat;
-    virtual_addr_t virt = (virtual_addr_t)KEYBOARD_ADDRESS;
+    virtual_addr_t virt;
     int irq = KEYBOARD_IRQ_NUM;
-    
+
+    virt = (virtual_addr_t)rt_hw_kernel_phys_to_virt((void*)KEYBOARD_ADDRESS, 0x1000);
+
     id = (((read32(virt + 0xfec) & 0xff) << 24) |
                 ((read32(virt + 0xfe8) & 0xff) << 16) |
                 ((read32(virt + 0xfe4) & 0xff) <<  8) |
@@ -469,3 +471,4 @@ int rt_hw_keyboard_init(void)
 INIT_DEVICE_EXPORT(rt_hw_keyboard_init);
 
 #endif
+

+ 4 - 1
bsp/qemu-vexpress-a9/drivers/drv_mouse.c

@@ -227,9 +227,11 @@ int rt_hw_mouse_init(void)
     rt_uint8_t value;
     rt_uint32_t id;
     struct mouse_pl050_pdata_t *pdat;
-    virtual_addr_t virt = MOUSE_ADDRESS;
+    virtual_addr_t virt;
     int irq = MOUSE_IRQ_NUM;
 
+    virt = (virtual_addr_t)rt_hw_kernel_phys_to_virt((void*)MOUSE_ADDRESS, 0x1000);
+
     id = (((read32(virt + 0xfec) & 0xff) << 24) |
                 ((read32(virt + 0xfe8) & 0xff) << 16) |
                 ((read32(virt + 0xfe4) & 0xff) <<  8) |
@@ -295,3 +297,4 @@ int rt_hw_mouse_init(void)
 INIT_DEVICE_EXPORT(rt_hw_mouse_init);
 
 #endif
+

+ 12 - 0
bsp/qemu-vexpress-a9/drivers/drv_mouse.h

@@ -3,4 +3,16 @@
 
 int rt_hw_mouse_init(void);
 
+struct mouse_info
+{
+    uint32_t type;
+    uint32_t button;
+    uint32_t x;
+    uint32_t y;
+    uint32_t ts;
+    uint32_t id;
+};
+
+#define CMD_MOUSE_SET_NOTIFY 0  /* arg is shmid, in the shm, a sem point is given */
+
 #endif

+ 5 - 3
bsp/qemu-vexpress-a9/drivers/drv_sdio.c

@@ -6,6 +6,7 @@
 #include <stdint.h>
 #include <stdio.h>
 
+#include "board.h"
 #include "drv_sdio.h"
 
 #ifdef RT_USING_SDIO
@@ -286,7 +287,7 @@ static rt_err_t sdhci_pl180_setclock(struct sdhci_t * sdhci, rt_uint32_t clock)
     if(clock)
     {
         temp = read32(pdat->virt + PL180_CLOCK) | (0x1<<8);
-        temp = temp; // skip warning 
+        temp = temp; // skip warning
         write32(pdat->virt + PL180_CLOCK, 0x100);
     }
     else
@@ -379,7 +380,7 @@ static void mmc_set_iocfg(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io
     LOG_D("clock:%d bus_width:%d", io_cfg->clock, io_cfg->bus_width);
 }
 
-static const struct rt_mmcsd_host_ops ops = 
+static const struct rt_mmcsd_host_ops ops =
 {
     mmc_request_send,
     mmc_set_iocfg,
@@ -409,8 +410,9 @@ int pl180_init(void)
         goto err;
     }
     rt_memset(sdhci, 0, sizeof(struct sdhci_t));
+    
+    virt = (rt_uint32_t)rt_hw_kernel_phys_to_virt((void*)MMC_BASE_ADDR, 0x1000);
 
-    virt = MMC_BASE_ADDR;
     id = (((read32((virt + 0xfec)) & 0xff) << 24) |
                 ((read32((virt + 0xfe8)) & 0xff) << 16) |
                 ((read32((virt + 0xfe4)) & 0xff) <<  8) |

+ 20 - 21
bsp/qemu-vexpress-a9/drivers/drv_smc911x.c

@@ -1,16 +1,21 @@
 #include <board.h>
 #include <rtthread.h>
+#include <automac.h>
 #include <netif/ethernetif.h>
 #include <lwipopts.h>
-#include <automac.h>
+
+#include "mmu.h"
+#include "drv_smc911x.h"
 
 #define MAX_ADDR_LEN                6
 #define SMC911X_EMAC_DEVICE(eth)    (struct eth_device_smc911x*)(eth)
 
-#include "drv_smc911x.h"
-
 #define DRIVERNAME "EMAC"
 
+#define DBG_LVL DBG_LOG
+#define DBG_TAG "EMAC"
+#include <rtdbg.h>
+
 struct eth_device_smc911x
 {
     /* inherit from Ethernet device */
@@ -116,7 +121,7 @@ static int smc911x_detect_chip(struct eth_device_smc911x *dev)
     }
     else if (val != 0x87654321)
     {
-        rt_kprintf(DRIVERNAME ": Invalid chip endian 0x%08lx\n", val);
+        LOG_E("Invalid chip endian 0x%08lx\n", val);
         return -1;
     }
 
@@ -320,7 +325,7 @@ static void smc911x_isr(int vector, void *param)
     emac = SMC911X_EMAC_DEVICE(param);
 
     status = smc911x_reg_read(emac, INT_STS);
-    
+
     if (status & INT_STS_RSFL)
     {
         eth_device_ready(&emac->parent);
@@ -347,21 +352,12 @@ static rt_err_t smc911x_emac_init(rt_device_t dev)
     /* Turn on Tx + Rx */
     smc911x_enable(emac);
 
-#if 1
     /* Interrupt on every received packet */
     smc911x_reg_write(emac, FIFO_INT, 0x01 << 8);
     smc911x_reg_write(emac, INT_EN, INT_EN_RDFL_EN | INT_EN_RSFL_EN);
 
     /* enable interrupt */
     smc911x_reg_write(emac, INT_CFG, INT_CFG_IRQ_EN | INT_CFG_IRQ_POL | INT_CFG_IRQ_TYPE);
-#else
-
-    /* disable interrupt */
-    smc911x_reg_write(emac, INT_EN, 0);
-    value = smc911x_reg_read(emac, INT_CFG);
-    value &= ~INT_CFG_IRQ_EN;
-    smc911x_reg_write(emac, INT_CFG, value);
-#endif
 
     rt_hw_interrupt_install(emac->irqno, smc911x_isr, emac, "smc911x");
     rt_hw_interrupt_umask(emac->irqno);
@@ -383,6 +379,7 @@ static rt_err_t smc911x_emac_control(rt_device_t dev, int cmd, void *args)
         if(args) rt_memcpy(args, emac->enetaddr, 6);
         else return -RT_ERROR;
         break;
+
     default :
         break;
     }
@@ -432,12 +429,12 @@ rt_err_t smc911x_emac_tx(rt_device_t dev, struct pbuf* p)
 
     if (!status) return 0;
 
-    rt_kprintf(DRIVERNAME ": failed to send packet: %s%s%s%s%s\n",
-               status & TX_STS_LOC ? "TX_STS_LOC " : "",
-               status & TX_STS_LATE_COLL ? "TX_STS_LATE_COLL " : "",
-               status & TX_STS_MANY_COLL ? "TX_STS_MANY_COLL " : "",
-               status & TX_STS_MANY_DEFER ? "TX_STS_MANY_DEFER " : "",
-               status & TX_STS_UNDERRUN ? "TX_STS_UNDERRUN" : "");
+    LOG_E("failed to send packet: %s%s%s%s%s",
+        status & TX_STS_LOC ? "TX_STS_LOC " : "",
+        status & TX_STS_LATE_COLL ? "TX_STS_LATE_COLL " : "",
+        status & TX_STS_MANY_COLL ? "TX_STS_MANY_COLL " : "",
+        status & TX_STS_MANY_DEFER ? "TX_STS_MANY_DEFER " : "",
+        status & TX_STS_UNDERRUN ? "TX_STS_UNDERRUN" : "");
 
     return -RT_EIO;
 }
@@ -500,7 +497,9 @@ const static struct rt_device_ops smc911x_emac_ops =
 
 int smc911x_emac_hw_init(void)
 {
-    _emac.iobase = VEXPRESS_ETH_BASE;
+    rt_memset(&_emac, 0x0, sizeof(_emac));
+
+    _emac.iobase = (uint32_t)rt_hw_kernel_phys_to_virt((void*)VEXPRESS_ETH_BASE, 0x1000);
     _emac.irqno  = IRQ_VEXPRESS_A9_ETH;
 
     if (smc911x_detect_chip(&_emac))

+ 22 - 8
bsp/qemu-vexpress-a9/drivers/drv_timer.c

@@ -12,10 +12,17 @@
 #include <rtthread.h>
 #include <stdint.h>
 
+#include "mmu.h"
 #include "board.h"
 
-#define TIMER01_HW_BASE                 0x10011000
-#define TIMER23_HW_BASE                 0x10012000
+#define TIMER01_HW_BASE_PHY                 0x10011000
+#define TIMER23_HW_BASE_PHY                 0x10012000
+
+void* timer01_hw_base;
+void* timer23_hw_base;
+
+#define TIMER01_HW_BASE timer01_hw_base
+#define TIMER23_HW_BASE timer23_hw_base
 
 #define TIMER_LOAD(hw_base)             __REG32(hw_base + 0x00)
 #define TIMER_VALUE(hw_base)            __REG32(hw_base + 0x04)
@@ -51,8 +58,10 @@
 #define TIMER_MIS(hw_base)              __REG32(hw_base + 0x14)
 #define TIMER_BGLOAD(hw_base)           __REG32(hw_base + 0x18)
 
-#define SYS_CTRL                        __REG32(REALVIEW_SCTL_BASE)
-#define TIMER_HW_BASE                   REALVIEW_TIMER2_3_BASE
+void* sys_ctrl;
+#define SYS_CTRL                        __REG32(sys_ctrl)
+void* timer_hw_base;
+#define TIMER_HW_BASE                   timer_hw_base
 
 static void rt_hw_timer_isr(int vector, void *param)
 {
@@ -65,6 +74,9 @@ int rt_hw_timer_init(void)
 {
     rt_uint32_t val;
 
+    sys_ctrl = (void*)rt_hw_kernel_phys_to_virt((void*)REALVIEW_SCTL_BASE, 0x1000);
+    timer_hw_base = (void*)rt_hw_kernel_phys_to_virt((void*)REALVIEW_TIMER2_3_BASE, 0x1000);
+
     SYS_CTRL |= REALVIEW_REFCLK;
 
     /* Setup Timer0 for generating irq */
@@ -89,8 +101,9 @@ void timer_init(int timer, unsigned int preload)
 {
     uint32_t val;
 
-    if (timer == 0) 
+    if (timer == 0)
     {
+        timer01_hw_base = (void*)rt_hw_kernel_phys_to_virt((void*)TIMER01_HW_BASE_PHY, 0x1000);
         /* Setup Timer0 for generating irq */
         val = TIMER_CTRL(TIMER01_HW_BASE);
         val &= ~TIMER_CTRL_ENABLE;
@@ -101,9 +114,10 @@ void timer_init(int timer, unsigned int preload)
 
         /* enable timer */
         TIMER_CTRL(TIMER01_HW_BASE) |= TIMER_CTRL_ENABLE;
-    } 
-    else 
+    }
+    else
     {
+        timer23_hw_base = (void*)rt_hw_kernel_phys_to_virt((void*)TIMER23_HW_BASE_PHY, 0x1000);
         /* Setup Timer1 for generating irq */
         val = TIMER_CTRL(TIMER23_HW_BASE);
         val &= ~TIMER_CTRL_ENABLE;
@@ -122,7 +136,7 @@ void timer_clear_pending(int timer)
     if (timer == 0)
     {
         TIMER_INTCLR(TIMER01_HW_BASE) = 0x01;
-    } 
+    }
     else
     {
         TIMER_INTCLR(TIMER23_HW_BASE) = 0x01;

+ 1 - 0
bsp/qemu-vexpress-a9/drivers/realview.h

@@ -316,6 +316,7 @@ struct rt_hw_register
     unsigned long ORIG_r0;
 };
 
+#include <rtdef.h>
 #include <armv7.h>
 
 /* Interrupt Control Interface */

+ 59 - 0
bsp/qemu-vexpress-a9/drivers/rt_lcd.h

@@ -0,0 +1,59 @@
+#ifndef RT_LCD_H__
+#define RT_LCD_H__
+
+
+/* ioctls
+   0x46 is 'F'                                                          */
+#define FBIOGET_VSCREENINFO     0x4600
+#define FBIOPUT_VSCREENINFO     0x4601
+#define FBIOGET_FSCREENINFO     0x4602
+#define FBIOGETCMAP             0x4604
+#define FBIOPUTCMAP             0x4605
+#define FBIOPAN_DISPLAY         0x4606
+#define FBIO_CURSOR             0x4608
+/* #define FBIOGET_MONITORSPEC  0x460C */
+/* #define FBIOPUT_MONITORSPEC  0x460D */
+/* #define FBIOSWITCH_MONIBIT   0x460E */
+#define FBIOGET_CON2FBMAP       0x460F
+#define FBIOPUT_CON2FBMAP       0x4610
+#define FBIOBLANK               0x4611          /* arg: 0 or vesa level + 1 */
+#define FBIOGET_VBLANK          0x4612
+#define FBIO_ALLOC              0x4613
+#define FBIO_FREE               0x4614
+#define FBIOGET_GLYPH           0x4615
+#define FBIOGET_HWCINFO         0x4616
+#define FBIOPUT_MODEINFO        0x4617
+#define FBIOGET_DISPINFO        0x4618
+#define FBIO_WAITFORVSYNC       0x4620
+
+struct fb_bitfield
+{
+    uint32_t offset;        /* beginning of bitfield */
+    uint32_t length;        /* length of bitfield */
+    uint32_t msb_right;     /* != 0 : Most significant bit is */ 
+    /* right */
+};
+
+struct fb_var_screeninfo
+{
+    uint32_t xres;
+    uint32_t yres;
+
+    uint32_t bits_per_pixel;
+
+    struct fb_bitfield red;     /* bitfield in fb mem if true color, */
+    struct fb_bitfield green;   /* else only length is significant */
+    struct fb_bitfield blue;
+    struct fb_bitfield transp;  /* transparency         */
+};
+
+struct fb_fix_screeninfo
+{
+    char id[16];
+    unsigned long smem_start;
+    uint32_t smem_len;
+
+    uint32_t line_length;
+};
+
+#endif

+ 18 - 3
bsp/qemu-vexpress-a9/drivers/secondary_cpu.c

@@ -19,6 +19,10 @@
 #ifdef RT_USING_SMP
 #include <interrupt.h>
 
+#ifdef RT_USING_USERSPACE
+#include <mmu.h>
+#endif
+
 static void rt_hw_timer2_isr(int vector, void *param)
 {
     rt_tick_increase();
@@ -26,11 +30,22 @@ static void rt_hw_timer2_isr(int vector, void *param)
     timer_clear_pending(0);
 }
 
+#ifdef RT_USING_USERSPACE
+extern void set_secondary_cpu_boot_address(uint32_t pv_off, void *second_boot_reg);
+#else
+extern void set_secondary_cpu_boot_address(void);
+#endif
+
 void rt_hw_secondary_cpu_up(void)
 {
-    extern void set_secondary_cpu_boot_address(void);
+#ifdef RT_USING_USERSPACE
+    void *plat_boot_reg;
 
-    set_secondary_cpu_boot_address();
+    plat_boot_reg = rt_hw_mmu_map(&mmu_info, 0, (void*)0x10000034, 0x1000, MMU_MAP_K_RW);
+    set_secondary_cpu_boot_address(PV_OFFSET, plat_boot_reg);
+#else
+    extern void set_secondary_cpu_boot_address(void);
+#endif
     __asm__ volatile ("dsb":::"memory");
     rt_hw_ipi_send(0, 1 << 1);
 }
@@ -41,7 +56,7 @@ void secondary_cpu_c_start(void)
 
     rt_hw_spin_lock(&_cpus_lock);
 
-    arm_gic_cpu_init(0, REALVIEW_GIC_CPU_BASE);
+    arm_gic_cpu_init(0, 0);
     arm_gic_set_cpu(0, IRQ_PBA8_TIMER0_1, 0x2);
 
     timer_init(0, 10000);

+ 4 - 0
bsp/qemu-vexpress-a9/drivers/serial.c

@@ -31,6 +31,8 @@
 #include <rtdevice.h>
 
 #include "serial.h"
+#include "board.h"
+#include "mmu.h"
 
 struct hw_uart_device
 {
@@ -151,6 +153,7 @@ int rt_hw_uart_init(void)
     struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
 
 #ifdef RT_USING_UART0
+    _uart0_device.hw_base = (uint32_t)rt_hw_kernel_phys_to_virt((void*)_uart0_device.hw_base, 0x1000);
     uart = &_uart0_device;
 
     _serial0.ops    = &_uart_ops;
@@ -166,6 +169,7 @@ int rt_hw_uart_init(void)
 #endif
 
 #ifdef RT_USING_UART1
+    _uart1_device.hw_base = (uint32_t)rt_hw_kernel_phys_to_virt((void*)_uart1_device.hw_base, 0x1000);
     uart = &_uart1_device;
     _serial1.ops = &_uart_ops;
     _serial1.config = config;

+ 9 - 5
bsp/qemu-vexpress-a9/link.lds

@@ -2,7 +2,8 @@ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
 OUTPUT_ARCH(arm)
 SECTIONS
 {
-    . = 0x60010000;
+    /*. = 0x60010000; */
+    . = 0xc0010000;
 
     __text_start = .;
     .text :
@@ -16,7 +17,7 @@ SECTIONS
         __rt_utest_tc_tab_start = .;
         KEEP(*(UtestTcTab))
         __rt_utest_tc_tab_end = .;
-        
+
         /* section information for finsh shell */
         . = ALIGN(4);
         __fsymtab_start = .;
@@ -42,9 +43,12 @@ SECTIONS
     } =0
     __text_end = .;
 
-    __exidx_start = .;
-    .ARM.exidx   : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
-    __exidx_end = .;
+    .ARM.exidx   :
+    {
+        __exidx_start = .;
+        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+        __exidx_end = .;
+    }
 
     __rodata_start = .;
     .rodata   : { *(.rodata) *(.rodata.*) }

+ 1 - 1
bsp/qemu-vexpress-a9/qemu-dbg.bat

@@ -3,4 +3,4 @@ if exist sd.bin goto run
 qemu-img create -f raw sd.bin 64M
 
 :run
-qemu-system-arm -M vexpress-a9 -kernel rtthread.elf -serial stdio -sd sd.bin -S -s
+qemu-system-arm -M vexpress-a9 -kernel rtthread.bin -serial stdio -sd sd.bin -S -s

+ 1 - 1
bsp/qemu-vexpress-a9/qemu-nographic.bat

@@ -3,4 +3,4 @@ if exist sd.bin goto run
 qemu-img create -f raw sd.bin 64M
 
 :run
-qemu-system-arm -M vexpress-a9 -kernel rtthread.elf -nographic -sd sd.bin
+qemu-system-arm -M vexpress-a9 -kernel rtthread.bin -nographic -sd sd.bin

+ 28 - 15
bsp/qemu-vexpress-a9/rtconfig.h

@@ -7,6 +7,7 @@
 /* RT-Thread Kernel */
 
 #define RT_NAME_MAX 8
+#define RT_USING_SMART
 #define RT_USING_SMP
 #define RT_CPUS_NR 2
 #define RT_ALIGN_SIZE 4
@@ -49,10 +50,16 @@
 #define RT_USING_CONSOLE
 #define RT_CONSOLEBUF_SIZE 256
 #define RT_CONSOLE_DEVICE_NAME "uart0"
-#define RT_VER_NUM 0x40002
+#define RT_VER_NUM 0x40003
 #define ARCH_ARM
+#define ARCH_ARM_MMU
+#define RT_USING_USERSPACE
+#define KERNEL_VADDR_START 0xc0000000
+#define PV_OFFSET 0xa0000000
 #define ARCH_ARM_CORTEX_A
 #define ARCH_ARM_CORTEX_A9
+#define RT_BACKTRACE_FUNCTION_NAME
+#define RT_USING_CACHE
 
 /* RT-Thread Components */
 
@@ -63,7 +70,6 @@
 
 /* C++ features */
 
-#define RT_USING_CPLUSPLUS
 
 /* Command shell */
 
@@ -84,7 +90,7 @@
 
 #define RT_USING_DFS
 #define DFS_USING_WORKDIR
-#define DFS_FILESYSTEMS_MAX 2
+#define DFS_FILESYSTEMS_MAX 4
 #define DFS_FILESYSTEM_TYPES_MAX 8
 #define DFS_FD_MAX 16
 #define RT_USING_DFS_ELMFAT
@@ -132,22 +138,16 @@
 #define RT_USING_SFUD
 #define RT_SFUD_USING_SFDP
 #define RT_SFUD_USING_FLASH_INFO_TABLE
+#define RT_SFUD_SPI_MAX_HZ 50000000
 #define RT_USING_WDT
 
-/* Using Hardware Crypto drivers */
-
-
-/* Using WiFi */
-
-
 /* Using USB */
 
 
 /* POSIX layer and C standard library */
 
 #define RT_USING_LIBC
-#define RT_USING_PTHREADS
-#define PTHREAD_NUM_MAX 8
+#define RT_USING_MUSL
 #define RT_USING_POSIX
 #define RT_USING_POSIX_MMAP
 #define RT_USING_POSIX_TERMIOS
@@ -178,6 +178,7 @@
 
 #define RT_USING_LWIP
 #define RT_USING_LWIP202
+#define RT_LWIP_MEM_ALIGNMENT 4
 #define RT_LWIP_ICMP
 #define RT_LWIP_DNS
 #define RT_LWIP_DHCP
@@ -202,7 +203,7 @@
 #define RT_LWIP_TCP_WND 8196
 #define RT_LWIP_TCPTHREAD_PRIORITY 10
 #define RT_LWIP_TCPTHREAD_MBOX_SIZE 8
-#define RT_LWIP_TCPTHREAD_STACKSIZE 1024
+#define RT_LWIP_TCPTHREAD_STACKSIZE 2048
 #define RT_LWIP_ETHTHREAD_PRIORITY 12
 #define RT_LWIP_ETHTHREAD_STACKSIZE 1024
 #define RT_LWIP_ETHTHREAD_MBOX_SIZE 8
@@ -213,12 +214,10 @@
 #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
 
-/* Modbus master and slave stack */
-
-
 /* AT commands */
 
 
@@ -226,7 +225,12 @@
 
 
 /* Utilities */
+
 #define RT_USING_LWP
+#define RT_LWP_MAX_NR 30
+#define RT_CH_MSG_MAX_NR 1024
+#define RT_LWP_SHM_MAX_NR 64
+#define LWP_CONSOLE_INPUT_BUFFER_SIZE 1024
 
 /* RT-Thread online packages */
 
@@ -267,9 +271,18 @@
 
 /* samples: kernel and components samples */
 
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
 #define SOC_VEXPRESS_A9
 #define RT_USING_UART0
 #define RT_USING_UART1
+#define BSP_DRV_CLCD
+#define BSP_LCD_WIDTH 640
+#define BSP_LCD_HEIGHT 480
 #define BSP_DRV_EMAC
 
 #endif

+ 34 - 51
bsp/qemu-vexpress-a9/rtconfig.py

@@ -1,8 +1,8 @@
 import os
 
 import uuid
-def get_mac_address(): 
-    mac=uuid.UUID(int = uuid.getnode()).hex[-12:] 
+def get_mac_address():
+    mac=uuid.UUID(int = uuid.getnode()).hex[-12:]
     return "#define AUTOMAC".join([str(int(e/2) + 1) + '  0x' + mac[e:e+2] + '\n' for e in range(5,11,2)])
 
 header = '''
@@ -26,62 +26,45 @@ with open(automac_h_fn, 'w') as f:
     f.write(header + get_mac_address() + end)
 
 # toolchains options
-ARCH='arm'
-CPU='cortex-a'
-CROSS_TOOL='gcc'
-
-if os.getenv('RTT_CC'):
-    CROSS_TOOL = os.getenv('RTT_CC')
-
-# only support GNU GCC compiler.
+ARCH        ='arm'
+CPU         ='cortex-a'
+CROSS_TOOL  = 'gcc'
 PLATFORM    = 'gcc'
-EXEC_PATH   = '/usr/bin'
-
-if os.getenv('RTT_EXEC_PATH'):
-    EXEC_PATH = os.getenv('RTT_EXEC_PATH')
-
-BUILD = 'debug'
+EXEC_PATH   = os.getenv('RTT_EXEC_PATH') or '/usr/bin'
+BUILD       = 'debug'
 
 if PLATFORM == 'gcc':
     # toolchains
-    PREFIX = 'arm-none-eabi-'
-    CC = PREFIX + 'gcc'
-    CXX = PREFIX + 'g++'
-    AS = PREFIX + 'gcc'
-    AR = PREFIX + 'ar'
-    LINK = PREFIX + 'gcc'
+    PREFIX  = os.getenv('RTT_CC_PREFIX') or 'arm-none-eabi-'
+    CC      = PREFIX + 'gcc'
+    CXX     = PREFIX + 'g++'
+    AS      = PREFIX + 'gcc'
+    AR      = PREFIX + 'ar'
+    LINK    = PREFIX + 'gcc'
     TARGET_EXT = 'elf'
-    SIZE = PREFIX + 'size'
+    SIZE    = PREFIX + 'size'
     OBJDUMP = PREFIX + 'objdump'
-    OBJCPY = PREFIX + 'objcopy'
-    STRIP = PREFIX + 'strip'
-
-    DEVICE = ' -march=armv7-a -marm -msoft-float'
-    CFLAGS = DEVICE + ' -Wall'
-    AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__ASSEMBLY__ -I.'
-    LINK_SCRIPT = 'link.lds'
-    LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,system_vectors'+\
-                      ' -T %s' % LINK_SCRIPT
-
-    CPATH = ''
-    LPATH = ''
-
-    # generate debug info in all cases
-    AFLAGS += ' -gdwarf-2'
-    CFLAGS += ' -g -gdwarf-2'
+    OBJCPY  = PREFIX + 'objcopy'
+    STRIP   = PREFIX + 'strip'
+    CFPFLAGS = ' -msoft-float'
+    AFPFLAGS = ' -mfloat-abi=softfp -mfpu=neon'
+    DEVICE   = ' -march=armv7-a -mtune=cortex-a7 -ftree-vectorize -ffast-math -funwind-tables -fno-strict-aliasing'
+
+    CXXFLAGS= DEVICE + CFPFLAGS + ' -Wall'
+    CFLAGS  = DEVICE + CFPFLAGS + ' -Wall -std=gnu99'
+    AFLAGS  = ' -c' + AFPFLAGS + ' -x assembler-with-cpp'
+    LFLAGS  = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,system_vectors -T link.lds' + ' -lsupc++ -lgcc'
+    CPATH   = ''
+    LPATH   = ''
 
     if BUILD == 'debug':
-        CFLAGS += ' -O0'
+        CFLAGS   += ' -O0 -gdwarf-2'
+        CXXFLAGS += ' -O0 -gdwarf-2'
+        AFLAGS   += ' -gdwarf-2'
     else:
-        CFLAGS += ' -O2'
-
-    CXXFLAGS = CFLAGS + ' -Woverloaded-virtual -fno-exceptions -fno-rtti'
-
-    M_CFLAGS = CFLAGS + ' -mlong-calls -fPIC '
-    M_CXXFLAGS = CXXFLAGS + ' -mlong-calls -fPIC'
-    M_LFLAGS = DEVICE + CXXFLAGS + ' -Wl,--gc-sections,-z,max-page-size=0x4' +\
-                                    ' -shared -fPIC -nostartfiles -nostdlib -static-libgcc'
-    M_POST_ACTION = STRIP + ' -R .hash $TARGET\n' + SIZE + ' $TARGET \n'
+        CFLAGS   += ' -Os'
+        CXXFLAGS += ' -Os'
+    CXXFLAGS += ' -Woverloaded-virtual -fno-exceptions -fno-rtti'
 
-    POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' +\
-                  SIZE + ' $TARGET \n'
+DUMP_ACTION = OBJDUMP + ' -D -S $TARGET > rtt.asm\n'
+POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n'