diff --git a/.travis.yml b/.travis.yml
index f7ecc85ca749d67c94ff14503c4a35a325914747..c8e8951f071f766c2158a4dade15ebdda201b868 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -69,7 +69,7 @@ env:
# - RTT_BSP='nuvoton_nuc472' RTT_TOOL_CHAIN='sourcery-arm'
# - RTT_BSP='nuvoton_m05x' RTT_TOOL_CHAIN='sourcery-arm'
# - RTT_BSP='pic32ethernet' # no scons
- - RTT_BSP='qemu-vexpress-a9' RTT_TOOL_CHAIN='sourcery-arm'
+# - RTT_BSP='qemu-vexpress-a9' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='qemu-vexpress-gemini' RTT_TOOL_CHAIN='sourcery-arm'
- RTT_BSP='sam7x' RTT_TOOL_CHAIN='sourcery-arm'
# - RTT_BSP='simulator' # x86
diff --git a/bsp/allwinner_tina/.config b/bsp/allwinner_tina/.config
index 2c39e4435ecf06d9520f2f4868c03297a89e1d28..06570d57dd64716d573d03f0c7004c41a3d00d78 100644
--- a/bsp/allwinner_tina/.config
+++ b/bsp/allwinner_tina/.config
@@ -7,20 +7,33 @@
# RT-Thread Kernel
#
CONFIG_RT_NAME_MAX=8
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
+# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
CONFIG_RT_THREAD_PRIORITY_32=y
# CONFIG_RT_THREAD_PRIORITY_256 is not set
CONFIG_RT_THREAD_PRIORITY_MAX=32
CONFIG_RT_TICK_PER_SECOND=100
-CONFIG_RT_DEBUG=y
-CONFIG_RT_DEBUG_COLOR=y
CONFIG_RT_USING_OVERFLOW_CHECK=y
-CONFIG_RT_DEBUG_INIT=0
-CONFIG_RT_DEBUG_THREAD=0
CONFIG_RT_USING_HOOK=y
+CONFIG_RT_USING_IDLE_HOOK=y
+CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
CONFIG_IDLE_THREAD_STACK_SIZE=256
# CONFIG_RT_USING_TIMER_SOFT is not set
+CONFIG_RT_DEBUG=y
+CONFIG_RT_DEBUG_COLOR=y
+# CONFIG_RT_DEBUG_INIT_CONFIG is not set
+# CONFIG_RT_DEBUG_THREAD_CONFIG is not set
+# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set
+# CONFIG_RT_DEBUG_IPC_CONFIG is not set
+# CONFIG_RT_DEBUG_TIMER_CONFIG is not set
+# CONFIG_RT_DEBUG_IRQ_CONFIG is not set
+# CONFIG_RT_DEBUG_MEM_CONFIG is not set
+# CONFIG_RT_DEBUG_SLAB_CONFIG is not set
+# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set
+# CONFIG_RT_DEBUG_MODULE_CONFIG is not set
#
# Inter-Thread communication
@@ -47,11 +60,15 @@ CONFIG_RT_USING_HEAP=y
# Kernel Device Object
#
CONFIG_RT_USING_DEVICE=y
+# CONFIG_RT_USING_DEVICE_OPS is not set
# CONFIG_RT_USING_INTERRUPT_INFO is not set
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
-# CONFIG_RT_USING_MODULE is not set
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
+# CONFIG_RT_USING_CPU_FFS is not set
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
CONFIG_ARCH_ARM=y
CONFIG_ARCH_ARM_ARM9=y
@@ -60,6 +77,8 @@ CONFIG_ARCH_ARM_ARM9=y
#
CONFIG_RT_USING_COMPONENTS_INIT=y
CONFIG_RT_USING_USER_MAIN=y
+CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048
+CONFIG_RT_MAIN_THREAD_PRIORITY=10
#
# C++ features
@@ -75,6 +94,7 @@ CONFIG_FINSH_USING_HISTORY=y
CONFIG_FINSH_HISTORY_LINES=5
CONFIG_FINSH_USING_SYMTAB=y
CONFIG_FINSH_USING_DESCRIPTION=y
+# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
CONFIG_FINSH_THREAD_PRIORITY=20
CONFIG_FINSH_THREAD_STACK_SIZE=4096
CONFIG_FINSH_CMD_SIZE=80
@@ -82,6 +102,7 @@ CONFIG_FINSH_CMD_SIZE=80
CONFIG_FINSH_USING_MSH=y
CONFIG_FINSH_USING_MSH_DEFAULT=y
# CONFIG_FINSH_USING_MSH_ONLY is not set
+CONFIG_FINSH_ARG_MAX=10
#
# Device virtual file system
@@ -91,6 +112,7 @@ CONFIG_DFS_USING_WORKDIR=y
CONFIG_DFS_FILESYSTEMS_MAX=2
CONFIG_DFS_FILESYSTEM_TYPES_MAX=2
CONFIG_DFS_FD_MAX=4
+# CONFIG_RT_USING_DFS_MNTTABLE is not set
CONFIG_RT_USING_DFS_ELMFAT=y
#
@@ -109,30 +131,59 @@ CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=512
# CONFIG_RT_DFS_ELM_USE_ERASE is not set
CONFIG_RT_DFS_ELM_REENTRANT=y
CONFIG_RT_USING_DFS_DEVFS=y
-# CONFIG_RT_USING_DFS_NET is not set
# CONFIG_RT_USING_DFS_ROMFS is not set
+# CONFIG_RT_USING_DFS_CROMFS is not set
# CONFIG_RT_USING_DFS_RAMFS is not set
# CONFIG_RT_USING_DFS_UFFS is not set
# CONFIG_RT_USING_DFS_JFFS2 is not set
-# CONFIG_RT_USING_DFS_NFS is not set
#
# Device Drivers
#
CONFIG_RT_USING_DEVICE_IPC=y
+CONFIG_RT_PIPE_BUFSZ=512
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
CONFIG_RT_USING_SERIAL=y
CONFIG_RT_SERIAL_USING_DMA=y
+CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_CAN is not set
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
+# CONFIG_RT_USING_PM is not set
# CONFIG_RT_USING_RTC is not set
-# CONFIG_RT_USING_SDIO is not set
-# CONFIG_RT_USING_SPI is not set
+CONFIG_RT_USING_SDIO=y
+CONFIG_RT_SDIO_STACK_SIZE=512
+CONFIG_RT_SDIO_THREAD_PRIORITY=15
+CONFIG_RT_MMCSD_STACK_SIZE=1024
+CONFIG_RT_MMCSD_THREAD_PREORITY=22
+CONFIG_RT_MMCSD_MAX_PARTITION=16
+# CONFIG_RT_SDIO_DEBUG is not set
+CONFIG_RT_USING_SPI=y
+# CONFIG_RT_USING_QSPI is not set
+# CONFIG_RT_USING_SPI_MSD is not set
+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
# CONFIG_RT_USING_WDT is not set
+# CONFIG_RT_USING_AUDIO is not set
+# CONFIG_RT_USING_SENSOR is not set
+# CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
# CONFIG_RT_USING_WIFI is not set
#
@@ -149,26 +200,33 @@ CONFIG_RT_USING_LIBC=y
CONFIG_RT_USING_POSIX=y
# CONFIG_RT_USING_POSIX_MMAP is not set
# CONFIG_RT_USING_POSIX_TERMIOS is not set
+# CONFIG_RT_USING_POSIX_GETLINE is not set
# CONFIG_RT_USING_POSIX_AIO is not set
+# CONFIG_RT_USING_MODULE is not set
#
-# Network stack
+# Network
#
#
-# light weight TCP/IP stack
+# Socket abstraction layer
#
-# CONFIG_RT_USING_LWIP is not set
+# CONFIG_RT_USING_SAL is not set
#
-# Modbus master and slave stack
+# Network interface device
#
-# CONFIG_RT_USING_MODBUS is not set
+# CONFIG_RT_USING_NETDEV is not set
#
-# RT-Thread UI Engine
+# light weight TCP/IP stack
#
-# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_RT_USING_LWIP is not set
+
+#
+# AT commands
+#
+# CONFIG_RT_USING_AT is not set
#
# VBUS(Virtual Software BUS)
@@ -178,34 +236,35 @@ CONFIG_RT_USING_POSIX=y
#
# Utilities
#
-# CONFIG_RT_USING_LOGTRACE is not set
# CONFIG_RT_USING_RYM is not set
+# CONFIG_RT_USING_ULOG is not set
+# CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_LWP is not set
#
# RT-Thread online packages
#
-#
-# system packages
-#
-# CONFIG_PKG_USING_LWEXT4 is not set
-# CONFIG_PKG_USING_PARTITION is not set
-# CONFIG_PKG_USING_PERSIMMON is not set
-# CONFIG_PKG_USING_SQLITE is not set
-# CONFIG_PKG_USING_RTI is not set
-
#
# 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
-# CONFIG_PKG_USING_GAGENT_CLOUD is not set
#
# Wi-Fi
@@ -220,8 +279,49 @@ CONFIG_RT_USING_POSIX=y
# Wiced WiFi
#
# CONFIG_PKG_USING_WLAN_WICED is not set
+# CONFIG_PKG_USING_RW007 is not set
# 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
+
+#
+# IoT Cloud
+#
+# CONFIG_PKG_USING_ONENET is not set
+# 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_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
@@ -229,10 +329,13 @@ CONFIG_RT_USING_POSIX=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
#
+# CONFIG_PKG_USING_LUA is not set
# CONFIG_PKG_USING_JERRYSCRIPT is not set
# CONFIG_PKG_USING_MICROPYTHON is not set
@@ -240,28 +343,197 @@ CONFIG_RT_USING_POSIX=y
# multimedia packages
#
# 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
#
# CONFIG_PKG_USING_CMBACKTRACE is not set
+# CONFIG_PKG_USING_EASYFLASH is not set
# CONFIG_PKG_USING_EASYLOGGER is not set
# CONFIG_PKG_USING_SYSTEMVIEW is not set
-# CONFIG_PKG_USING_IPERF 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
+# 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
+#
+# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON 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_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
+#
+# 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
+# CONFIG_PKG_USING_BUTTON is not set
+# CONFIG_PKG_USING_PCF8574 is not set
+# 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
+# CONFIG_PKG_USING_PCA9685 is not set
+# 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
#
+# CONFIG_PKG_USING_LIBCSV is not set
+# CONFIG_PKG_USING_OPTPARSE is not set
# CONFIG_PKG_USING_FASTLZ is not set
# 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
#
-# example package: hello
+# 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_MULTIBUTTON 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_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_TINA=y
CONFIG_TINA_USING_UART0=y
# CONFIG_TINA_USING_UART1 is not set
CONFIG_TINA_USING_UART2=y
-CONFIG_RT_USING_CPU_FFS=y
-CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048
+CONFIG_TINA_USING_SDIO0=y
+CONFIG_TINA_USING_SPI0=y
+CONFIG_TINA_USING_SPI1=y
+CONFIG_TINA_USING_SPI_FLASH=y
diff --git a/bsp/allwinner_tina/Kconfig b/bsp/allwinner_tina/Kconfig
index 8f9a367dc2f183e30674cbd498abbc19ad2e8413..1f976aa50e287fbd8ac0361716ef9d9e5acc11f6 100644
--- a/bsp/allwinner_tina/Kconfig
+++ b/bsp/allwinner_tina/Kconfig
@@ -24,6 +24,7 @@ source "$PKGS_DIR/Kconfig"
config SOC_TINA
bool
select ARCH_ARM_ARM9
+ select RT_USING_CACHE
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
diff --git a/bsp/allwinner_tina/rtconfig.h b/bsp/allwinner_tina/rtconfig.h
index b9221509b4ef9e6f6690fdd602f27abef6197220..8aff170e0731ef79d1b8893f378172371c7aa279 100644
--- a/bsp/allwinner_tina/rtconfig.h
+++ b/bsp/allwinner_tina/rtconfig.h
@@ -8,19 +8,16 @@
#define RT_NAME_MAX 8
#define RT_ALIGN_SIZE 4
-/* RT_THREAD_PRIORITY_8 is not set */
#define RT_THREAD_PRIORITY_32
-/* RT_THREAD_PRIORITY_256 is not set */
#define RT_THREAD_PRIORITY_MAX 32
#define RT_TICK_PER_SECOND 100
-#define RT_DEBUG
-#define RT_DEBUG_COLOR
#define RT_USING_OVERFLOW_CHECK
-#define RT_DEBUG_INIT 0
-#define RT_DEBUG_THREAD 0
#define RT_USING_HOOK
+#define RT_USING_IDLE_HOOK
+#define RT_IDLE_HOOK_LIST_SIZE 4
#define IDLE_THREAD_STACK_SIZE 256
-/* RT_USING_TIMER_SOFT is not set */
+#define RT_DEBUG
+#define RT_DEBUG_COLOR
/* Inter-Thread communication */
@@ -29,26 +26,21 @@
#define RT_USING_EVENT
#define RT_USING_MAILBOX
#define RT_USING_MESSAGEQUEUE
-/* RT_USING_SIGNALS is not set */
/* Memory Management */
#define RT_USING_MEMPOOL
-/* RT_USING_MEMHEAP is not set */
-/* RT_USING_NOHEAP is not set */
#define RT_USING_SMALL_MEM
-/* RT_USING_SLAB is not set */
-/* RT_USING_MEMTRACE is not set */
#define RT_USING_HEAP
/* Kernel Device Object */
#define RT_USING_DEVICE
-/* RT_USING_INTERRUPT_INFO is not set */
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
-/* RT_USING_MODULE is not set */
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
#define ARCH_ARM
#define ARCH_ARM_ARM9
@@ -56,10 +48,11 @@
#define RT_USING_COMPONENTS_INIT
#define RT_USING_USER_MAIN
+#define RT_MAIN_THREAD_STACK_SIZE 2048
+#define RT_MAIN_THREAD_PRIORITY 10
/* C++ features */
-/* RT_USING_CPLUSPLUS is not set */
/* Command shell */
@@ -72,10 +65,9 @@
#define FINSH_THREAD_PRIORITY 20
#define FINSH_THREAD_STACK_SIZE 4096
#define FINSH_CMD_SIZE 80
-/* FINSH_USING_AUTH is not set */
#define FINSH_USING_MSH
#define FINSH_USING_MSH_DEFAULT
-/* FINSH_USING_MSH_ONLY is not set */
+#define FINSH_ARG_MAX 10
/* Device virtual file system */
@@ -91,147 +83,112 @@
#define RT_DFS_ELM_CODE_PAGE 437
#define RT_DFS_ELM_WORD_ACCESS
#define RT_DFS_ELM_USE_LFN_0
-/* RT_DFS_ELM_USE_LFN_1 is not set */
-/* RT_DFS_ELM_USE_LFN_2 is not set */
-/* RT_DFS_ELM_USE_LFN_3 is not set */
#define RT_DFS_ELM_USE_LFN 0
#define RT_DFS_ELM_MAX_LFN 255
#define RT_DFS_ELM_DRIVES 2
#define RT_DFS_ELM_MAX_SECTOR_SIZE 512
-/* RT_DFS_ELM_USE_ERASE is not set */
#define RT_DFS_ELM_REENTRANT
#define RT_USING_DFS_DEVFS
-/* RT_USING_DFS_NET is not set */
-/* RT_USING_DFS_ROMFS is not set */
-/* RT_USING_DFS_RAMFS is not set */
-/* RT_USING_DFS_UFFS is not set */
-/* RT_USING_DFS_JFFS2 is not set */
-/* RT_USING_DFS_NFS is not set */
/* Device Drivers */
#define RT_USING_DEVICE_IPC
+#define RT_PIPE_BUFSZ 512
#define RT_USING_SERIAL
#define RT_SERIAL_USING_DMA
-/* RT_USING_CAN is not set */
-/* RT_USING_HWTIMER is not set */
-/* RT_USING_CPUTIME is not set */
-/* RT_USING_I2C is not set */
+#define RT_SERIAL_RB_BUFSZ 64
#define RT_USING_PIN
-/* RT_USING_MTD_NOR is not set */
-/* RT_USING_MTD_NAND is not set */
-/* RT_USING_RTC is not set */
-/* RT_USING_SDIO is not set */
-/* RT_USING_SPI is not set */
-/* RT_USING_WDT is not set */
-/* RT_USING_WIFI is not set */
+#define RT_USING_SDIO
+#define RT_SDIO_STACK_SIZE 512
+#define RT_SDIO_THREAD_PRIORITY 15
+#define RT_MMCSD_STACK_SIZE 1024
+#define RT_MMCSD_THREAD_PREORITY 22
+#define RT_MMCSD_MAX_PARTITION 16
+#define RT_USING_SPI
+#define RT_USING_SFUD
+#define RT_SFUD_USING_SFDP
+#define RT_SFUD_USING_FLASH_INFO_TABLE
+#define RT_SFUD_SPI_MAX_HZ 50000000
/* Using USB */
-/* RT_USING_USB_HOST is not set */
-/* RT_USING_USB_DEVICE is not set */
/* POSIX layer and C standard library */
#define RT_USING_LIBC
-/* RT_USING_PTHREADS is not set */
#define RT_USING_POSIX
-/* RT_USING_POSIX_MMAP is not set */
-/* RT_USING_POSIX_TERMIOS is not set */
-/* RT_USING_POSIX_AIO is not set */
-/* Network stack */
+/* Network */
-/* light weight TCP/IP stack */
+/* Socket abstraction layer */
-/* RT_USING_LWIP is not set */
-/* Modbus master and slave stack */
+/* Network interface device */
-/* RT_USING_MODBUS is not set */
-/* RT-Thread UI Engine */
+/* light weight TCP/IP stack */
+
+
+/* AT commands */
-/* PKG_USING_GUIENGINE is not set */
/* VBUS(Virtual Software BUS) */
-/* RT_USING_VBUS is not set */
/* Utilities */
-/* RT_USING_LOGTRACE is not set */
-/* RT_USING_RYM is not set */
/* RT-Thread online packages */
-/* system packages */
-
-/* PKG_USING_LWEXT4 is not set */
-/* PKG_USING_PARTITION is not set */
-/* PKG_USING_PERSIMMON is not set */
-/* PKG_USING_SQLITE is not set */
-/* PKG_USING_RTI is not set */
-
/* IoT - internet of things */
-/* PKG_USING_PAHOMQTT is not set */
-/* PKG_USING_WEBCLIENT is not set */
-/* PKG_USING_MONGOOSE is not set */
-/* PKG_USING_WEBTERMINAL is not set */
-/* PKG_USING_CJSON is not set */
-/* PKG_USING_LJSON is not set */
-/* PKG_USING_EZXML is not set */
-/* PKG_USING_NANOPB is not set */
-/* PKG_USING_GAGENT_CLOUD is not set */
/* Wi-Fi */
/* Marvell WiFi */
-/* PKG_USING_WLANMARVELL is not set */
/* Wiced WiFi */
-/* PKG_USING_WLAN_WICED is not set */
-/* PKG_USING_COAP is not set */
-/* PKG_USING_NOPOLL is not set */
+
+/* IoT Cloud */
+
/* security packages */
-/* PKG_USING_MBEDTLS is not set */
-/* PKG_USING_libsodium is not set */
-/* PKG_USING_TINYCRYPT is not set */
/* language packages */
-/* PKG_USING_JERRYSCRIPT is not set */
-/* PKG_USING_MICROPYTHON is not set */
/* multimedia packages */
-/* PKG_USING_OPENMV is not set */
/* tools packages */
-/* PKG_USING_CMBACKTRACE is not set */
-/* PKG_USING_EASYLOGGER is not set */
-/* PKG_USING_SYSTEMVIEW is not set */
-/* PKG_USING_IPERF is not set */
+
+/* system packages */
+
+
+/* peripheral libraries and drivers */
+
/* miscellaneous packages */
-/* PKG_USING_FASTLZ is not set */
-/* PKG_USING_MINILZO is not set */
-/* example package: hello */
+/* samples: kernel and components samples */
+
+
+/* Privated Packages of RealThread */
-/* PKG_USING_HELLO is not set */
-/* PKG_USING_MULTIBUTTON is not set */
+
+/* Network Utilities */
+
+#define SOC_TINA
#define TINA_USING_UART0
-/* TINA_USING_UART1 is not set */
#define TINA_USING_UART2
-#define RT_USING_CPU_FFS
-#define RT_MAIN_THREAD_STACK_SIZE 2048
+#define TINA_USING_SDIO0
+#define TINA_USING_SPI0
+#define TINA_USING_SPI1
+#define TINA_USING_SPI_FLASH
#endif
diff --git a/bsp/asm9260t/.config b/bsp/asm9260t/.config
index 04964a837555a10e7d0731ab78cff8400f31e19a..28d2fb9d30f1aa9e1051dd946be9e4e5ab95f31f 100644
--- a/bsp/asm9260t/.config
+++ b/bsp/asm9260t/.config
@@ -7,20 +7,35 @@
# RT-Thread Kernel
#
CONFIG_RT_NAME_MAX=8
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
+# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
+# CONFIG_RT_THREAD_PRIORITY_8 is not set
+CONFIG_RT_THREAD_PRIORITY_32=y
+# CONFIG_RT_THREAD_PRIORITY_256 is not set
CONFIG_RT_THREAD_PRIORITY_MAX=32
CONFIG_RT_TICK_PER_SECOND=100
-CONFIG_RT_DEBUG=y
-CONFIG_RT_DEBUG_COLOR=y
CONFIG_RT_USING_OVERFLOW_CHECK=y
-CONFIG_RT_DEBUG_INIT=0
-# CONFIG_RT_DEBUG_THREAD is not set
-CONFIG_RT_USING_INTERRUPT_INFO=y
CONFIG_RT_USING_HOOK=y
+CONFIG_RT_USING_IDLE_HOOK=y
+CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
CONFIG_IDLE_THREAD_STACK_SIZE=256
CONFIG_RT_USING_TIMER_SOFT=y
CONFIG_RT_TIMER_THREAD_PRIO=4
CONFIG_RT_TIMER_THREAD_STACK_SIZE=512
+CONFIG_RT_DEBUG=y
+CONFIG_RT_DEBUG_COLOR=y
+# CONFIG_RT_DEBUG_INIT_CONFIG is not set
+# CONFIG_RT_DEBUG_THREAD_CONFIG is not set
+# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set
+# CONFIG_RT_DEBUG_IPC_CONFIG is not set
+# CONFIG_RT_DEBUG_TIMER_CONFIG is not set
+# CONFIG_RT_DEBUG_IRQ_CONFIG is not set
+# CONFIG_RT_DEBUG_MEM_CONFIG is not set
+# CONFIG_RT_DEBUG_SLAB_CONFIG is not set
+# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set
+# CONFIG_RT_DEBUG_MODULE_CONFIG is not set
#
# Inter-Thread communication
@@ -37,24 +52,35 @@ CONFIG_RT_USING_MESSAGEQUEUE=y
#
CONFIG_RT_USING_MEMPOOL=y
CONFIG_RT_USING_MEMHEAP=y
-CONFIG_RT_USING_HEAP=y
+# CONFIG_RT_USING_NOHEAP is not set
# CONFIG_RT_USING_SMALL_MEM is not set
CONFIG_RT_USING_SLAB=y
+# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set
+CONFIG_RT_USING_HEAP=y
#
# Kernel Device Object
#
CONFIG_RT_USING_DEVICE=y
+# CONFIG_RT_USING_DEVICE_OPS is not set
+CONFIG_RT_USING_INTERRUPT_INFO=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart3"
-# CONFIG_RT_USING_MODULE is not set
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
+# CONFIG_RT_USING_CPU_FFS is not set
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+CONFIG_ARCH_ARM_ARM9=y
#
# RT-Thread Components
#
CONFIG_RT_USING_COMPONENTS_INIT=y
CONFIG_RT_USING_USER_MAIN=y
+CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048
+CONFIG_RT_MAIN_THREAD_PRIORITY=10
#
# C++ features
@@ -65,9 +91,12 @@ CONFIG_RT_USING_USER_MAIN=y
# Command shell
#
CONFIG_RT_USING_FINSH=y
+CONFIG_FINSH_THREAD_NAME="tshell"
CONFIG_FINSH_USING_HISTORY=y
+CONFIG_FINSH_HISTORY_LINES=5
CONFIG_FINSH_USING_SYMTAB=y
CONFIG_FINSH_USING_DESCRIPTION=y
+# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
CONFIG_FINSH_THREAD_PRIORITY=20
CONFIG_FINSH_THREAD_STACK_SIZE=4096
CONFIG_FINSH_CMD_SIZE=80
@@ -83,18 +112,38 @@ CONFIG_FINSH_CMD_SIZE=80
# Device Drivers
#
CONFIG_RT_USING_DEVICE_IPC=y
+CONFIG_RT_PIPE_BUFSZ=512
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
CONFIG_RT_USING_SERIAL=y
CONFIG_RT_SERIAL_USING_DMA=y
+CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_CAN is not set
# CONFIG_RT_USING_HWTIMER is not set
+# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY is not set
# CONFIG_RT_USING_PIN is not set
+# 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
+# CONFIG_RT_USING_PM is not set
# CONFIG_RT_USING_RTC is not set
# CONFIG_RT_USING_SDIO is not set
# CONFIG_RT_USING_SPI is not set
# CONFIG_RT_USING_WDT is not set
+# CONFIG_RT_USING_AUDIO is not set
+# CONFIG_RT_USING_SENSOR is not set
+# CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
+# CONFIG_RT_USING_WIFI is not set
+
+#
+# Using USB
+#
# CONFIG_RT_USING_USB_HOST is not set
# CONFIG_RT_USING_USB_DEVICE is not set
@@ -103,11 +152,21 @@ CONFIG_RT_SERIAL_USING_DMA=y
#
CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_PTHREADS is not set
-# CONFIG_RT_USING_POSIX is not set
+# CONFIG_RT_USING_MODULE is not set
+
+#
+# Network
+#
#
-# Network stack
+# Socket abstraction layer
#
+# CONFIG_RT_USING_SAL is not set
+
+#
+# Network interface device
+#
+# CONFIG_RT_USING_NETDEV is not set
#
# light weight TCP/IP stack
@@ -115,68 +174,312 @@ CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_LWIP is not set
#
-# Modbus master and slave stack
+# AT commands
#
-# CONFIG_RT_USING_MODBUS is not set
+# CONFIG_RT_USING_AT is not set
#
-# RT-Thread UI Engine
+# VBUS(Virtual Software BUS)
#
-# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_RT_USING_VBUS is not set
#
-# RT-Thread online packages
+# Utilities
#
+# CONFIG_RT_USING_RYM is not set
+# CONFIG_RT_USING_ULOG is not set
+# CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_LWP is not set
#
-# system packages
+# RT-Thread online packages
#
-# CONFIG_PKG_USING_PARTITION is not set
-# CONFIG_PKG_USING_SQLITE is not set
#
# 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
+
+#
+# Wi-Fi
+#
#
# Marvell WiFi
#
-# CONFIG_PKG_USING_MARVELLWIFI is not set
+# CONFIG_PKG_USING_WLANMARVELL is not set
+
+#
+# Wiced WiFi
+#
+# CONFIG_PKG_USING_WLAN_WICED is not set
+# CONFIG_PKG_USING_RW007 is not set
+# 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
+
+#
+# IoT Cloud
+#
+# CONFIG_PKG_USING_ONENET is not set
+# 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_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
#
# 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
#
+# CONFIG_PKG_USING_LUA is not set
# CONFIG_PKG_USING_JERRYSCRIPT is not set
+# CONFIG_PKG_USING_MICROPYTHON is not set
#
# multimedia packages
#
+# 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
#
# CONFIG_PKG_USING_CMBACKTRACE is not set
+# CONFIG_PKG_USING_EASYFLASH is not set
# CONFIG_PKG_USING_EASYLOGGER is not set
+# CONFIG_PKG_USING_SYSTEMVIEW 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
+# 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
+#
+# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON 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_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
+#
+# 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
+# CONFIG_PKG_USING_BUTTON is not set
+# CONFIG_PKG_USING_PCF8574 is not set
+# 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
+# CONFIG_PKG_USING_PCA9685 is not set
+# 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
#
+# CONFIG_PKG_USING_LIBCSV is not set
+# CONFIG_PKG_USING_OPTPARSE is not set
+# CONFIG_PKG_USING_FASTLZ is not set
+# 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
+#
+# 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_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
#
-# BSP_SPECIAL CONFIG
+# 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_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_AT91SAM926=y
# CONFIG_RT_USING_UART0 is not set
CONFIG_RT_USING_UART3=y
# CONFIG_RT_USING_UART4 is not set
diff --git a/bsp/asm9260t/Kconfig b/bsp/asm9260t/Kconfig
index a51e8064973db6a51aa3dc8d298bf68b0a9ba6b1..49c0baa80ea9646412b6ede511ccadc6d84e2a4d 100644
--- a/bsp/asm9260t/Kconfig
+++ b/bsp/asm9260t/Kconfig
@@ -19,8 +19,11 @@ source "$RTT_DIR/Kconfig"
source "$PKGS_DIR/Kconfig"
config SOC_AT91SAM926
+ bool
+ select ARCH_ARM_ARM9
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
config RT_USING_UART0
@@ -40,3 +43,4 @@ config RT_USING_LED
default y
help
led blink demo
+
diff --git a/bsp/asm9260t/rtconfig.h b/bsp/asm9260t/rtconfig.h
index 8ca5daa56551c4b2fe9b22dc6d97fce031eec790..48cd0c032d61ab26e0fc1f21cb22f89ff86f3c63 100644
--- a/bsp/asm9260t/rtconfig.h
+++ b/bsp/asm9260t/rtconfig.h
@@ -8,19 +8,19 @@
#define RT_NAME_MAX 8
#define RT_ALIGN_SIZE 4
+#define RT_THREAD_PRIORITY_32
#define RT_THREAD_PRIORITY_MAX 32
#define RT_TICK_PER_SECOND 100
-#define RT_DEBUG
-#define RT_DEBUG_COLOR
#define RT_USING_OVERFLOW_CHECK
-#define RT_DEBUG_INIT 0
-/* RT_DEBUG_THREAD is not set */
-#define RT_USING_INTERRUPT_INFO
#define RT_USING_HOOK
+#define RT_USING_IDLE_HOOK
+#define RT_IDLE_HOOK_LIST_SIZE 4
#define IDLE_THREAD_STACK_SIZE 256
#define RT_USING_TIMER_SOFT
#define RT_TIMER_THREAD_PRIO 4
#define RT_TIMER_THREAD_STACK_SIZE 512
+#define RT_DEBUG
+#define RT_DEBUG_COLOR
/* Inter-Thread communication */
@@ -29,131 +29,133 @@
#define RT_USING_EVENT
#define RT_USING_MAILBOX
#define RT_USING_MESSAGEQUEUE
-/* RT_USING_SIGNALS is not set */
/* Memory Management */
#define RT_USING_MEMPOOL
#define RT_USING_MEMHEAP
-#define RT_USING_HEAP
-/* RT_USING_SMALL_MEM is not set */
#define RT_USING_SLAB
+#define RT_USING_HEAP
/* Kernel Device Object */
#define RT_USING_DEVICE
+#define RT_USING_INTERRUPT_INFO
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart3"
-/* RT_USING_MODULE is not set */
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
+#define ARCH_ARM
+#define ARCH_ARM_ARM9
/* RT-Thread Components */
#define RT_USING_COMPONENTS_INIT
#define RT_USING_USER_MAIN
+#define RT_MAIN_THREAD_STACK_SIZE 2048
+#define RT_MAIN_THREAD_PRIORITY 10
/* C++ features */
-/* RT_USING_CPLUSPLUS is not set */
/* Command shell */
#define RT_USING_FINSH
+#define FINSH_THREAD_NAME "tshell"
#define FINSH_USING_HISTORY
+#define FINSH_HISTORY_LINES 5
#define FINSH_USING_SYMTAB
#define FINSH_USING_DESCRIPTION
#define FINSH_THREAD_PRIORITY 20
#define FINSH_THREAD_STACK_SIZE 4096
#define FINSH_CMD_SIZE 80
-/* FINSH_USING_AUTH is not set */
-/* FINSH_USING_MSH is not set */
/* Device virtual file system */
-/* RT_USING_DFS is not set */
/* Device Drivers */
#define RT_USING_DEVICE_IPC
+#define RT_PIPE_BUFSZ 512
#define RT_USING_SERIAL
#define RT_SERIAL_USING_DMA
-/* RT_USING_CAN is not set */
-/* RT_USING_HWTIMER is not set */
-/* RT_USING_I2C is not set */
-/* RT_USING_PIN is not set */
-/* RT_USING_MTD_NOR is not set */
-/* RT_USING_MTD_NAND is not set */
-/* RT_USING_RTC is not set */
-/* RT_USING_SDIO is not set */
-/* RT_USING_SPI is not set */
-/* RT_USING_WDT is not set */
-/* RT_USING_USB_HOST is not set */
-/* RT_USING_USB_DEVICE is not set */
+#define RT_SERIAL_RB_BUFSZ 64
+
+/* Using USB */
+
/* POSIX layer and C standard library */
#define RT_USING_LIBC
-/* RT_USING_PTHREADS is not set */
-/* RT_USING_POSIX is not set */
-/* Network stack */
+/* Network */
+
+/* Socket abstraction layer */
+
+
+/* Network interface device */
+
/* light weight TCP/IP stack */
-/* RT_USING_LWIP is not set */
-/* Modbus master and slave stack */
+/* AT commands */
-/* RT_USING_MODBUS is not set */
-/* RT-Thread UI Engine */
+/* VBUS(Virtual Software BUS) */
-/* PKG_USING_GUIENGINE is not set */
-/* RT-Thread online packages */
+/* Utilities */
-/* system packages */
-/* PKG_USING_PARTITION is not set */
-/* PKG_USING_SQLITE is not set */
+/* RT-Thread online packages */
/* IoT - internet of things */
-/* PKG_USING_PAHOMQTT is not set */
-/* PKG_USING_WEBCLIENT is not set */
-/* PKG_USING_MONGOOSE is not set */
-/* PKG_USING_WEBTERMINAL is not set */
-/* PKG_USING_CJSON is not set */
-/* PKG_USING_EZXML is not set */
+
+/* Wi-Fi */
/* Marvell WiFi */
-/* PKG_USING_MARVELLWIFI is not set */
+
+/* Wiced WiFi */
+
+
+/* IoT Cloud */
+
/* security packages */
-/* PKG_USING_MBEDTLS is not set */
/* language packages */
-/* PKG_USING_JERRYSCRIPT is not set */
/* multimedia packages */
+
/* tools packages */
-/* PKG_USING_CMBACKTRACE is not set */
-/* PKG_USING_EASYLOGGER is not set */
+
+/* system packages */
+
+
+/* peripheral libraries and drivers */
+
/* miscellaneous packages */
-/* PKG_USING_HELLO is not set */
-/* BSP_SPECIAL CONFIG */
+/* samples: kernel and components samples */
+
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
-/* RT_USING_UART0 is not set */
+#define SOC_AT91SAM926
#define RT_USING_UART3
-/* RT_USING_UART4 is not set */
#define RT_USING_LED
#endif
diff --git a/bsp/at91sam9260/.config b/bsp/at91sam9260/.config
index d0998436fecaf7a799ed3f188dbccae38c225967..a4dceff449219eba6b814359c74c2bb534aec088 100644
--- a/bsp/at91sam9260/.config
+++ b/bsp/at91sam9260/.config
@@ -7,6 +7,9 @@
# RT-Thread Kernel
#
CONFIG_RT_NAME_MAX=8
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
+# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
CONFIG_RT_THREAD_PRIORITY_32=y
@@ -15,6 +18,7 @@ CONFIG_RT_THREAD_PRIORITY_MAX=32
CONFIG_RT_TICK_PER_SECOND=100
CONFIG_RT_USING_OVERFLOW_CHECK=y
CONFIG_RT_USING_HOOK=y
+CONFIG_RT_USING_IDLE_HOOK=y
CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
CONFIG_IDLE_THREAD_STACK_SIZE=256
# CONFIG_RT_USING_TIMER_SOFT is not set
@@ -61,6 +65,12 @@ CONFIG_RT_USING_INTERRUPT_INFO=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="dbgu"
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
+# CONFIG_RT_USING_CPU_FFS is not set
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+CONFIG_ARCH_ARM_ARM9=y
#
# RT-Thread Components
@@ -106,31 +116,43 @@ CONFIG_DFS_FD_MAX=16
# CONFIG_RT_USING_DFS_ELMFAT is not set
CONFIG_RT_USING_DFS_DEVFS=y
# CONFIG_RT_USING_DFS_ROMFS is not set
+# CONFIG_RT_USING_DFS_CROMFS is not set
# CONFIG_RT_USING_DFS_RAMFS is not set
# CONFIG_RT_USING_DFS_UFFS is not set
# CONFIG_RT_USING_DFS_JFFS2 is not set
-# CONFIG_RT_USING_DFS_NFS is not set
#
# Device Drivers
#
CONFIG_RT_USING_DEVICE_IPC=y
CONFIG_RT_PIPE_BUFSZ=512
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
CONFIG_RT_USING_SERIAL=y
+CONFIG_RT_SERIAL_USING_DMA=y
+CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_CAN is not set
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
+# CONFIG_RT_USING_PM is not set
# CONFIG_RT_USING_RTC is not set
# CONFIG_RT_USING_SDIO is not set
# CONFIG_RT_USING_SPI is not set
# CONFIG_RT_USING_WDT is not set
-# CONFIG_RT_USING_WIFI is not set
# CONFIG_RT_USING_AUDIO is not set
+# CONFIG_RT_USING_SENSOR is not set
+# CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
+# CONFIG_RT_USING_WIFI is not set
#
# Using USB
@@ -143,6 +165,11 @@ CONFIG_RT_USING_PIN=y
#
CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_PTHREADS is not set
+CONFIG_RT_USING_POSIX=y
+# CONFIG_RT_USING_POSIX_MMAP is not set
+# CONFIG_RT_USING_POSIX_TERMIOS is not set
+# CONFIG_RT_USING_POSIX_GETLINE is not set
+# CONFIG_RT_USING_POSIX_AIO is not set
# CONFIG_RT_USING_MODULE is not set
#
@@ -155,14 +182,14 @@ CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_SAL is not set
#
-# light weight TCP/IP stack
+# Network interface device
#
-# CONFIG_RT_USING_LWIP is not set
+# CONFIG_RT_USING_NETDEV is not set
#
-# Modbus master and slave stack
+# light weight TCP/IP stack
#
-# CONFIG_RT_USING_MODBUS is not set
+# CONFIG_RT_USING_LWIP is not set
#
# AT commands
@@ -177,8 +204,10 @@ CONFIG_RT_USING_LIBC=y
#
# Utilities
#
-# CONFIG_RT_USING_LOGTRACE is not set
# CONFIG_RT_USING_RYM is not set
+# CONFIG_RT_USING_ULOG is not set
+# CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_LWP is not set
#
# RT-Thread online packages
@@ -187,12 +216,20 @@ CONFIG_RT_USING_LIBC=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
@@ -210,10 +247,15 @@ CONFIG_RT_USING_LIBC=y
# Wiced WiFi
#
# CONFIG_PKG_USING_WLAN_WICED is not set
+# CONFIG_PKG_USING_RW007 is not set
# 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
#
# IoT Cloud
@@ -222,6 +264,32 @@ CONFIG_RT_USING_LIBC=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_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
@@ -229,6 +297,8 @@ CONFIG_RT_USING_LIBC=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
@@ -242,6 +312,10 @@ CONFIG_RT_USING_LIBC=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
@@ -250,30 +324,102 @@ CONFIG_RT_USING_LIBC=y
# CONFIG_PKG_USING_EASYFLASH is not set
# CONFIG_PKG_USING_EASYLOGGER is not set
# CONFIG_PKG_USING_SYSTEMVIEW 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
+# 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
#
# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON 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_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
#
-# CONFIG_PKG_USING_STM32F4_HAL is not set
-# CONFIG_PKG_USING_STM32F4_DRIVERS is not set
+# 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_AHT10 is not set
-# CONFIG_PKG_USING_AP3216C 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
+# CONFIG_PKG_USING_BUTTON is not set
+# CONFIG_PKG_USING_PCF8574 is not set
+# 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
+# CONFIG_PKG_USING_PCA9685 is not set
+# 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
@@ -284,13 +430,15 @@ CONFIG_RT_USING_LIBC=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
-
-#
-# sample package
-#
+# 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
@@ -299,11 +447,57 @@ CONFIG_RT_USING_LIBC=y
# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set
# CONFIG_PKG_USING_NETWORK_SAMPLES is not set
# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set
-
-#
-# example package: hello
-#
# 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_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_AT91SAM926=y
CONFIG_RT_USING_DBGU=y
# CONFIG_RT_USING_UART0 is not set
# CONFIG_RT_USING_UART1 is not set
diff --git a/bsp/at91sam9260/Kconfig b/bsp/at91sam9260/Kconfig
index 23b4eea1d415d6b6d173171b61974822bfb5e21e..6f021e4c0f59d59a3c2fa4e62a5c0bc407a26557 100644
--- a/bsp/at91sam9260/Kconfig
+++ b/bsp/at91sam9260/Kconfig
@@ -20,8 +20,10 @@ source "$PKGS_DIR/Kconfig"
config SOC_AT91SAM926
bool
+ select ARCH_ARM_ARM9
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
config RT_USING_DBGU
diff --git a/bsp/at91sam9260/rtconfig.h b/bsp/at91sam9260/rtconfig.h
index 46ccc8f1675ae851ca6767c653e2705c478ecfbd..1c33c6a1c1911801b4d5b65b11f1ce865ef8547e 100755
--- a/bsp/at91sam9260/rtconfig.h
+++ b/bsp/at91sam9260/rtconfig.h
@@ -13,6 +13,7 @@
#define RT_TICK_PER_SECOND 100
#define RT_USING_OVERFLOW_CHECK
#define RT_USING_HOOK
+#define RT_USING_IDLE_HOOK
#define RT_IDLE_HOOK_LIST_SIZE 4
#define IDLE_THREAD_STACK_SIZE 256
#define RT_DEBUG
@@ -39,6 +40,10 @@
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "dbgu"
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
+#define ARCH_ARM
+#define ARCH_ARM_ARM9
/* RT-Thread Components */
@@ -49,9 +54,6 @@
/* C++ features */
-#define RT_USING_DEVICE_IPC
-#define RT_USING_SERIAL
-#define RT_SERIAL_USING_DMA
/* Command shell */
@@ -82,6 +84,8 @@
#define RT_USING_DEVICE_IPC
#define RT_PIPE_BUFSZ 512
#define RT_USING_SERIAL
+#define RT_SERIAL_USING_DMA
+#define RT_SERIAL_RB_BUFSZ 64
#define RT_USING_PIN
/* Using USB */
@@ -90,16 +94,17 @@
/* POSIX layer and C standard library */
#define RT_USING_LIBC
+#define RT_USING_POSIX
/* Network */
/* Socket abstraction layer */
-/* light weight TCP/IP stack */
+/* Network interface device */
-/* Modbus master and slave stack */
+/* light weight TCP/IP stack */
/* AT commands */
@@ -148,13 +153,15 @@
/* miscellaneous packages */
-/* sample package */
-
/* samples: kernel and components samples */
-/* example package: hello */
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+#define SOC_AT91SAM926
#define RT_USING_DBGU
#define RT_USING_LED
diff --git a/bsp/beaglebone/.config b/bsp/beaglebone/.config
index e3fcf0f7ad5c83d5e556733048fc89e8fe02f181..f0886969c5bfe6de6fa7962ba0accf9f5edf34e9 100644
--- a/bsp/beaglebone/.config
+++ b/bsp/beaglebone/.config
@@ -7,6 +7,9 @@
# RT-Thread Kernel
#
CONFIG_RT_NAME_MAX=8
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
+# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
CONFIG_RT_THREAD_PRIORITY_32=y
@@ -15,6 +18,7 @@ CONFIG_RT_THREAD_PRIORITY_MAX=32
CONFIG_RT_TICK_PER_SECOND=100
CONFIG_RT_USING_OVERFLOW_CHECK=y
CONFIG_RT_USING_HOOK=y
+CONFIG_RT_USING_IDLE_HOOK=y
CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
CONFIG_IDLE_THREAD_STACK_SIZE=256
# CONFIG_RT_USING_TIMER_SOFT is not set
@@ -61,6 +65,14 @@ CONFIG_RT_USING_DEVICE=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart"
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
+# CONFIG_RT_USING_CPU_FFS is not set
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+# CONFIG_RT_IOREMAP_LATE is not set
+CONFIG_ARCH_ARM_CORTEX_A=y
+# CONFIG_RT_BACKTRACE_FUNCTION_NAME is not set
#
# RT-Thread Components
@@ -106,6 +118,7 @@ CONFIG_DFS_FD_MAX=16
# CONFIG_RT_USING_DFS_ELMFAT is not set
CONFIG_RT_USING_DFS_DEVFS=y
# CONFIG_RT_USING_DFS_ROMFS is not set
+# CONFIG_RT_USING_DFS_CROMFS is not set
# CONFIG_RT_USING_DFS_RAMFS is not set
# CONFIG_RT_USING_DFS_UFFS is not set
# CONFIG_RT_USING_DFS_JFFS2 is not set
@@ -115,22 +128,33 @@ CONFIG_RT_USING_DFS_DEVFS=y
#
CONFIG_RT_USING_DEVICE_IPC=y
CONFIG_RT_PIPE_BUFSZ=512
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
CONFIG_RT_USING_SERIAL=y
CONFIG_RT_SERIAL_USING_DMA=y
+CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_CAN is not set
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
+# CONFIG_RT_USING_PM is not set
# CONFIG_RT_USING_RTC is not set
# CONFIG_RT_USING_SDIO is not set
# CONFIG_RT_USING_SPI is not set
# CONFIG_RT_USING_WDT is not set
-# CONFIG_RT_USING_WIFI is not set
# CONFIG_RT_USING_AUDIO is not set
+# CONFIG_RT_USING_SENSOR is not set
+# CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
+# CONFIG_RT_USING_WIFI is not set
#
# Using USB
@@ -143,6 +167,11 @@ CONFIG_RT_USING_PIN=y
#
CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_PTHREADS is not set
+CONFIG_RT_USING_POSIX=y
+# CONFIG_RT_USING_POSIX_MMAP is not set
+# CONFIG_RT_USING_POSIX_TERMIOS is not set
+# CONFIG_RT_USING_POSIX_GETLINE is not set
+# CONFIG_RT_USING_POSIX_AIO is not set
# CONFIG_RT_USING_MODULE is not set
#
@@ -155,14 +184,14 @@ CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_SAL is not set
#
-# light weight TCP/IP stack
+# Network interface device
#
-# CONFIG_RT_USING_LWIP is not set
+# CONFIG_RT_USING_NETDEV is not set
#
-# Modbus master and slave stack
+# light weight TCP/IP stack
#
-# CONFIG_RT_USING_MODBUS is not set
+# CONFIG_RT_USING_LWIP is not set
#
# AT commands
@@ -177,8 +206,10 @@ CONFIG_RT_USING_LIBC=y
#
# Utilities
#
-# CONFIG_RT_USING_LOGTRACE is not set
# CONFIG_RT_USING_RYM is not set
+# CONFIG_RT_USING_ULOG is not set
+# CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_LWP is not set
#
# RT-Thread online packages
@@ -187,12 +218,20 @@ CONFIG_RT_USING_LIBC=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
@@ -210,10 +249,15 @@ CONFIG_RT_USING_LIBC=y
# Wiced WiFi
#
# CONFIG_PKG_USING_WLAN_WICED is not set
+# CONFIG_PKG_USING_RW007 is not set
# 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
#
# IoT Cloud
@@ -221,6 +265,33 @@ CONFIG_RT_USING_LIBC=y
# CONFIG_PKG_USING_ONENET is not set
# 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_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
@@ -228,6 +299,8 @@ CONFIG_RT_USING_LIBC=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
@@ -241,6 +314,10 @@ CONFIG_RT_USING_LIBC=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
@@ -249,26 +326,102 @@ CONFIG_RT_USING_LIBC=y
# CONFIG_PKG_USING_EASYFLASH is not set
# CONFIG_PKG_USING_EASYLOGGER is not set
# CONFIG_PKG_USING_SYSTEMVIEW 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
+# 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
#
# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON 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_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
#
-# CONFIG_PKG_USING_STM32F4_HAL is not set
-# CONFIG_PKG_USING_STM32F4_DRIVERS is not set
+# 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
+# CONFIG_PKG_USING_BUTTON is not set
+# CONFIG_PKG_USING_PCF8574 is not set
+# 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
+# CONFIG_PKG_USING_PCA9685 is not set
+# 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
@@ -279,17 +432,72 @@ CONFIG_RT_USING_LIBC=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
#
-# sample package
-#
-# CONFIG_PKG_USING_SAMPLES is not set
-
-#
-# example package: hello
+# 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_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_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_AM335X=y
CONFIG_RT_USING_UART1=y
diff --git a/bsp/beaglebone/Kconfig b/bsp/beaglebone/Kconfig
index 2784e360686115e9edfb9e9280f520a811f9fbf0..883b838b268025b87b3b7607aa54350fd50463f6 100644
--- a/bsp/beaglebone/Kconfig
+++ b/bsp/beaglebone/Kconfig
@@ -27,9 +27,11 @@ source "$RTT_DIR/Kconfig"
source "$PKGS_DIR/Kconfig"
config SOC_AM335X
- bool
+ bool
+ select ARCH_ARM_CORTEX_A
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
config RT_USING_UART1
diff --git a/bsp/beaglebone/rtconfig.h b/bsp/beaglebone/rtconfig.h
index 4a9030fc4835cafbd30e5e2cb77d83821b0d532d..6e0fc5efc0d7d3a398b9f1114c6869b010cd0b89 100644
--- a/bsp/beaglebone/rtconfig.h
+++ b/bsp/beaglebone/rtconfig.h
@@ -13,6 +13,7 @@
#define RT_TICK_PER_SECOND 100
#define RT_USING_OVERFLOW_CHECK
#define RT_USING_HOOK
+#define RT_USING_IDLE_HOOK
#define RT_IDLE_HOOK_LIST_SIZE 4
#define IDLE_THREAD_STACK_SIZE 256
#define RT_DEBUG
@@ -38,6 +39,10 @@
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart"
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
+#define ARCH_ARM
+#define ARCH_ARM_CORTEX_A
/* RT-Thread Components */
@@ -79,6 +84,7 @@
#define RT_PIPE_BUFSZ 512
#define RT_USING_SERIAL
#define RT_SERIAL_USING_DMA
+#define RT_SERIAL_RB_BUFSZ 64
#define RT_USING_PIN
/* Using USB */
@@ -87,16 +93,17 @@
/* POSIX layer and C standard library */
#define RT_USING_LIBC
+#define RT_USING_POSIX
/* Network */
/* Socket abstraction layer */
-/* light weight TCP/IP stack */
+/* Network interface device */
-/* Modbus master and slave stack */
+/* light weight TCP/IP stack */
/* AT commands */
@@ -145,11 +152,15 @@
/* miscellaneous packages */
-/* sample package */
+/* samples: kernel and components samples */
+
+
+/* Privated Packages of RealThread */
-/* example package: hello */
+/* Network Utilities */
+#define SOC_AM335X
#define RT_USING_UART1
#endif
diff --git a/bsp/efm32/rtconfig.h b/bsp/efm32/rtconfig.h
index 040f07fa02d48e66e03e197fa6c5b3fe8d2ccb51..fe3569cb68ba19389175d59e39d3b1f2b0f5df40 100644
--- a/bsp/efm32/rtconfig.h
+++ b/bsp/efm32/rtconfig.h
@@ -213,6 +213,7 @@
/* SECTION: Runtime library */
// #define RT_USING_NOLIBC
// #define RT_USING_NEWLIB
+#define RT_USING_LIBC
#define RT_LIBC_USING_TIME
/* SECTION: Console options */
@@ -281,7 +282,7 @@
#define RT_USING_DFS_ELMFAT
#define DFS_ELMFAT_INTERFACE_EFM
#endif /* defined(EFM32_USING_SPISD) */
-#if defined(RT_USING_NEWLIB)
+#if defined(RT_USING_LIBC)
#define RT_USING_DFS_DEVFS
#endif /* defined(RT_USING_NEWLIB) */
diff --git a/bsp/fh8620/rtconfig.h b/bsp/fh8620/rtconfig.h
index ea210a4703b0e0a3688d32e2597fae40d270a256..7fe505e88248ffea899570fc1a6d5356f9fb4943 100644
--- a/bsp/fh8620/rtconfig.h
+++ b/bsp/fh8620/rtconfig.h
@@ -69,6 +69,8 @@
// #define RT_USING_SLAB
//
+#define RT_USING_CACHE
+
//
#define RT_USING_DEVICE
//
diff --git a/bsp/gkipc/.config b/bsp/gkipc/.config
index 9ef3dadbdef9d9fb540dddceb2d00f0fbfe50998..094dd3482d2d9cf3b0157570f7442680e89db779 100644
--- a/bsp/gkipc/.config
+++ b/bsp/gkipc/.config
@@ -7,22 +7,35 @@
# RT-Thread Kernel
#
CONFIG_RT_NAME_MAX=32
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
+# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
# CONFIG_RT_THREAD_PRIORITY_32 is not set
CONFIG_RT_THREAD_PRIORITY_256=y
CONFIG_RT_THREAD_PRIORITY_MAX=256
CONFIG_RT_TICK_PER_SECOND=100
-CONFIG_RT_DEBUG=y
-CONFIG_RT_DEBUG_COLOR=y
CONFIG_RT_USING_OVERFLOW_CHECK=y
-CONFIG_RT_DEBUG_INIT=0
-CONFIG_RT_DEBUG_THREAD=0
CONFIG_RT_USING_HOOK=y
+CONFIG_RT_USING_IDLE_HOOK=y
+CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
CONFIG_IDLE_THREAD_STACK_SIZE=1024
CONFIG_RT_USING_TIMER_SOFT=y
CONFIG_RT_TIMER_THREAD_PRIO=4
CONFIG_RT_TIMER_THREAD_STACK_SIZE=10240
+CONFIG_RT_DEBUG=y
+CONFIG_RT_DEBUG_COLOR=y
+# CONFIG_RT_DEBUG_INIT_CONFIG is not set
+# CONFIG_RT_DEBUG_THREAD_CONFIG is not set
+# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set
+# CONFIG_RT_DEBUG_IPC_CONFIG is not set
+# CONFIG_RT_DEBUG_TIMER_CONFIG is not set
+# CONFIG_RT_DEBUG_IRQ_CONFIG is not set
+# CONFIG_RT_DEBUG_MEM_CONFIG is not set
+# CONFIG_RT_DEBUG_SLAB_CONFIG is not set
+# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set
+# CONFIG_RT_DEBUG_MODULE_CONFIG is not set
#
# Inter-Thread communication
@@ -50,11 +63,17 @@ CONFIG_RT_USING_HEAP=y
# Kernel Device Object
#
CONFIG_RT_USING_DEVICE=y
+# CONFIG_RT_USING_DEVICE_OPS is not set
CONFIG_RT_USING_INTERRUPT_INFO=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
-# CONFIG_RT_USING_MODULE is not set
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
+CONFIG_RT_USING_CPU_FFS=y
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+CONFIG_ARCH_ARM_ARM9=y
#
# RT-Thread Components
@@ -62,6 +81,7 @@ CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
CONFIG_RT_USING_COMPONENTS_INIT=y
CONFIG_RT_USING_USER_MAIN=y
CONFIG_RT_MAIN_THREAD_STACK_SIZE=16384
+CONFIG_RT_MAIN_THREAD_PRIORITY=85
#
# C++ features
@@ -77,6 +97,7 @@ CONFIG_FINSH_USING_HISTORY=y
CONFIG_FINSH_HISTORY_LINES=5
CONFIG_FINSH_USING_SYMTAB=y
CONFIG_FINSH_USING_DESCRIPTION=y
+# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
CONFIG_FINSH_THREAD_PRIORITY=20
CONFIG_FINSH_THREAD_STACK_SIZE=4096
CONFIG_FINSH_CMD_SIZE=80
@@ -84,6 +105,7 @@ CONFIG_FINSH_CMD_SIZE=80
CONFIG_FINSH_USING_MSH=y
CONFIG_FINSH_USING_MSH_DEFAULT=y
# CONFIG_FINSH_USING_MSH_ONLY is not set
+CONFIG_FINSH_ARG_MAX=10
#
# Device virtual file system
@@ -93,6 +115,7 @@ CONFIG_DFS_USING_WORKDIR=y
CONFIG_DFS_FILESYSTEMS_MAX=9
CONFIG_DFS_FILESYSTEM_TYPES_MAX=9
CONFIG_DFS_FD_MAX=16
+# CONFIG_RT_USING_DFS_MNTTABLE is not set
CONFIG_RT_USING_DFS_ELMFAT=y
#
@@ -111,8 +134,8 @@ CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=4096
# CONFIG_RT_DFS_ELM_USE_ERASE is not set
CONFIG_RT_DFS_ELM_REENTRANT=y
CONFIG_RT_USING_DFS_DEVFS=y
-# CONFIG_RT_USING_DFS_NET is not set
# CONFIG_RT_USING_DFS_ROMFS is not set
+# CONFIG_RT_USING_DFS_CROMFS is not set
# CONFIG_RT_USING_DFS_RAMFS is not set
# CONFIG_RT_USING_DFS_UFFS is not set
CONFIG_RT_USING_DFS_JFFS2=y
@@ -123,26 +146,47 @@ CONFIG_RT_NFS_HOST_EXPORT="192.168.10.82:/"
# Device Drivers
#
CONFIG_RT_USING_DEVICE_IPC=y
+CONFIG_RT_PIPE_BUFSZ=512
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
CONFIG_RT_USING_SERIAL=y
CONFIG_RT_SERIAL_USING_DMA=y
+CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_CAN is not set
# 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_PHY is not set
CONFIG_RT_USING_PIN=y
+CONFIG_RT_USING_ADC=y
+# CONFIG_RT_USING_DAC is not set
+CONFIG_RT_USING_PWM=y
CONFIG_RT_USING_MTD_NOR=y
# CONFIG_RT_USING_MTD_NAND is not set
+# CONFIG_RT_USING_PM is not set
# CONFIG_RT_USING_RTC is not set
CONFIG_RT_USING_SDIO=y
+CONFIG_RT_SDIO_STACK_SIZE=512
+CONFIG_RT_SDIO_THREAD_PRIORITY=15
+CONFIG_RT_MMCSD_STACK_SIZE=1024
+CONFIG_RT_MMCSD_THREAD_PREORITY=22
+CONFIG_RT_MMCSD_MAX_PARTITION=16
+# CONFIG_RT_SDIO_DEBUG is not set
CONFIG_RT_USING_SPI=y
+# CONFIG_RT_USING_QSPI is not set
# CONFIG_RT_USING_SPI_MSD is not set
# CONFIG_RT_USING_SFUD is not set
-# CONFIG_RT_USING_W25QXX is not set
-# CONFIG_RT_USING_GD is not set
# CONFIG_RT_USING_ENC28J60 is not set
# CONFIG_RT_USING_SPI_WIFI is not set
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_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
# CONFIG_RT_USING_WIFI is not set
#
@@ -156,11 +200,24 @@ CONFIG_RT_USING_WDT=y
#
CONFIG_RT_USING_LIBC=y
CONFIG_RT_USING_PTHREADS=y
+CONFIG_PTHREAD_NUM_MAX=8
# CONFIG_RT_USING_POSIX is not set
+# CONFIG_RT_USING_MODULE is not set
+
+#
+# Network
+#
+
+#
+# Socket abstraction layer
+#
+# CONFIG_RT_USING_SAL is not set
#
-# Network stack
+# Network interface device
#
+# CONFIG_RT_USING_NETDEV is not set
+CONFIG_NETDEV_USING_PING=y
#
# light weight TCP/IP stack
@@ -168,7 +225,9 @@ CONFIG_RT_USING_PTHREADS=y
CONFIG_RT_USING_LWIP=y
# CONFIG_RT_USING_LWIP141 is not set
CONFIG_RT_USING_LWIP202=y
+# 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=y
CONFIG_RT_LWIP_ICMP=y
# CONFIG_RT_LWIP_SNMP is not set
@@ -185,7 +244,7 @@ CONFIG_RT_LWIP_GWADDR="192.168.1.1"
CONFIG_RT_LWIP_MSKADDR="255.255.255.0"
CONFIG_RT_LWIP_UDP=y
CONFIG_RT_LWIP_TCP=y
-# CONFIG_RT_LWIP_RAW is not set
+CONFIG_RT_LWIP_RAW=y
# CONFIG_RT_LWIP_PPP is not set
CONFIG_RT_MEMP_NUM_NETCONN=64
CONFIG_RT_LWIP_PBUF_NUM=16
@@ -198,28 +257,34 @@ CONFIG_RT_LWIP_TCP_WND=11680
CONFIG_RT_LWIP_TCPTHREAD_PRIORITY=100
CONFIG_RT_LWIP_TCPTHREAD_MBOX_SIZE=32
CONFIG_RT_LWIP_TCPTHREAD_STACKSIZE=32768
+# CONFIG_LWIP_NO_RX_THREAD is not set
+# CONFIG_LWIP_NO_TX_THREAD is not set
CONFIG_RT_LWIP_ETHTHREAD_PRIORITY=126
CONFIG_RT_LWIP_ETHTHREAD_STACKSIZE=1024
CONFIG_RT_LWIP_ETHTHREAD_MBOX_SIZE=32
CONFIG_RT_LWIP_REASSEMBLY_FRAG=y
CONFIG_LWIP_NETIF_STATUS_CALLBACK=1
+CONFIG_LWIP_NETIF_LINK_CALLBACK=1
CONFIG_SO_REUSE=1
CONFIG_LWIP_SO_RCVTIMEO=1
CONFIG_LWIP_SO_SNDTIMEO=1
CONFIG_LWIP_SO_RCVBUF=1
+CONFIG_LWIP_SO_LINGER=0
# CONFIG_RT_LWIP_NETIF_LOOPBACK is not set
CONFIG_LWIP_NETIF_LOOPBACK=0
+# CONFIG_RT_LWIP_STATS is not set
+# CONFIG_RT_LWIP_USING_HW_CHECKSUM is not set
+CONFIG_RT_LWIP_USING_PING=y
+# CONFIG_RT_LWIP_DEBUG is not set
#
-# Modbus master and slave stack
+# AT commands
#
-# CONFIG_RT_USING_MODBUS is not set
+# CONFIG_RT_USING_AT is not set
CONFIG_LWIP_USING_DHCPD=y
-
-#
-# RT-Thread UI Engine
-#
-# CONFIG_RT_USING_GUIENGINE is not set
+CONFIG_DHCPD_SERVER_IP="192.168.169.1"
+CONFIG_DHCPD_USING_ROUTER=y
+# CONFIG_LWIP_USING_CUSTOMER_DNS_SERVER is not set
#
# VBUS(Virtual Software BUS)
@@ -229,32 +294,35 @@ CONFIG_LWIP_USING_DHCPD=y
#
# Utilities
#
-# CONFIG_RT_USING_LOGTRACE is not set
# CONFIG_RT_USING_RYM is not set
+# CONFIG_RT_USING_ULOG is not set
+# CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_LWP is not set
#
# RT-Thread online packages
#
-#
-# system packages
-#
-# CONFIG_PKG_USING_PARTITION is not set
-# CONFIG_PKG_USING_SQLITE is not set
-# CONFIG_PKG_USING_RTI is not set
-
#
# 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
-# CONFIG_PKG_USING_GAGENT_CLOUD is not set
#
# Wi-Fi
@@ -269,8 +337,49 @@ CONFIG_LWIP_USING_DHCPD=y
# Wiced WiFi
#
# CONFIG_PKG_USING_WLAN_WICED is not set
+# CONFIG_PKG_USING_RW007 is not set
# 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
+
+#
+# IoT Cloud
+#
+# CONFIG_PKG_USING_ONENET is not set
+# 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_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
@@ -278,10 +387,13 @@ CONFIG_LWIP_USING_DHCPD=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
#
+# CONFIG_PKG_USING_LUA is not set
# CONFIG_PKG_USING_JERRYSCRIPT is not set
# CONFIG_PKG_USING_MICROPYTHON is not set
@@ -289,26 +401,195 @@ CONFIG_LWIP_USING_DHCPD=y
# multimedia packages
#
# 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
#
# CONFIG_PKG_USING_CMBACKTRACE is not set
+# CONFIG_PKG_USING_EASYFLASH is not set
# CONFIG_PKG_USING_EASYLOGGER is not set
# CONFIG_PKG_USING_SYSTEMVIEW is not set
-# CONFIG_PKG_USING_IPERF 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
+# 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
#
-# miscellaneous packages
+# system packages
#
-# CONFIG_PKG_USING_FASTLZ is not set
-# CONFIG_PKG_USING_MINILZO is not set
+# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON 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_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
+#
+# 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
+# CONFIG_PKG_USING_BUTTON is not set
+# CONFIG_PKG_USING_PCF8574 is not set
+# 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
+# CONFIG_PKG_USING_PCA9685 is not set
+# 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
#
-# example package: hello
+# miscellaneous packages
#
+# CONFIG_PKG_USING_LIBCSV is not set
+# CONFIG_PKG_USING_OPTPARSE is not set
+# CONFIG_PKG_USING_FASTLZ is not set
+# 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
+#
+# 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_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_GK710=y
# CONFIG_SOC_GK7101 is not set
# CONFIG_SOC_GK7102 is not set
# CONFIG_SOC_GK7101S is not set
@@ -325,14 +606,11 @@ CONFIG_TUNNING_TOOL_SUPPORT=y
CONFIG_RT_USING_DMA_MEM=y
CONFIG_ARM1176_USE_VFP=y
CONFIG_RT_USING_VFP=y
-CONFIG_RT_USING_CPU_FFS=y
#
# Goke Peripheral Device Config
#
-CONFIG_RT_USING_ADC=y
CONFIG_RT_USING_GMAC=y
-CONFIG_RT_USING_PWM=y
CONFIG_RT_USING_GK_DMA=y
CONFIG_RT_USING_LIBZ=y
CONFIG_RT_USING_LOGCAPTURE=y
diff --git a/bsp/gkipc/Kconfig b/bsp/gkipc/Kconfig
index e49a4af73e41e6c3bea2caf3a54f604b3b3fbaf1..5e38d05fbc8c4358671d97be4a99ed314e7ea03c 100644
--- a/bsp/gkipc/Kconfig
+++ b/bsp/gkipc/Kconfig
@@ -20,8 +20,10 @@ source "$PKGS_DIR/Kconfig"
config SOC_GK710
bool
+ select ARCH_ARM_ARM9
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
choice
diff --git a/bsp/gkipc/armv6/rtos_lib.c b/bsp/gkipc/armv6/rtos_lib.c
index 7d7aec5c51d24a2e05dec33a95357ed8bdbed858..4d0a75a10d8e15f69a5048cbf5d2ba610b3d5934 100644
--- a/bsp/gkipc/armv6/rtos_lib.c
+++ b/bsp/gkipc/armv6/rtos_lib.c
@@ -524,7 +524,7 @@ void RTOS_SetErrno(const int err)
}
int RTOS_GetErrno()
{
- int err;
+ int err = 0;
#if 0
rt_base_t level;
level = rt_hw_interrupt_disable();
@@ -663,7 +663,7 @@ U32 msleep( U32 msecs )
U32 RTOS_SuspendThread( RTOS_ThreadT threadHandle )
{
- return rt_thread_suspend((rt_thread_t)threadHandle);
+ return rt_thread_suspend_witch_flag((rt_thread_t)threadHandle, RT_UNINTERRUPTIBLE);
}
U32 RTOS_WakeupThread( RTOS_ThreadT threadHandle )
@@ -720,7 +720,7 @@ void thread_statistics()
rt_kprintf("%-32.*s %3d", RT_NAME_MAX, thread->name, priority);
#endif
if (thread->stat == RT_THREAD_READY) rt_kprintf(" ready");
- else if (thread->stat == RT_THREAD_SUSPEND) rt_kprintf(" suspend");
+ else if ((thread->stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK) rt_kprintf(" suspend");
else if (thread->stat == RT_THREAD_INIT) rt_kprintf(" init");
else if (thread->stat == RT_THREAD_CLOSE) rt_kprintf(" close");
diff --git a/bsp/gkipc/armv6/trap.c b/bsp/gkipc/armv6/trap.c
index 602badff39211dea78e9e235a9c2e20486875f64..f3ed43ab13bd1b790fe10b2bbd9799ab57cd8e16 100644
--- a/bsp/gkipc/armv6/trap.c
+++ b/bsp/gkipc/armv6/trap.c
@@ -88,7 +88,7 @@ static void _rtt_statistics()
rt_kprintf("%-32.*s %03d", RT_NAME_MAX, thread->name, priority);
#endif
if (thread->stat == RT_THREAD_READY) rt_kprintf(" ready ");
- else if (thread->stat == RT_THREAD_SUSPEND) rt_kprintf(" suspend");
+ else if ((thread->stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK) rt_kprintf(" suspend");
else if (thread->stat == RT_THREAD_INIT) rt_kprintf(" init ");
else if (thread->stat == RT_THREAD_CLOSE) rt_kprintf(" close ");
diff --git a/bsp/gkipc/rtconfig.h b/bsp/gkipc/rtconfig.h
index 82262adfd540740a7306e9f3e49ac4568d7704e5..4ce66e9820d6945073b89a4ac757f61b6076e1fb 100644
--- a/bsp/gkipc/rtconfig.h
+++ b/bsp/gkipc/rtconfig.h
@@ -8,21 +8,19 @@
#define RT_NAME_MAX 32
#define RT_ALIGN_SIZE 4
-/* RT_THREAD_PRIORITY_8 is not set */
-/* RT_THREAD_PRIORITY_32 is not set */
#define RT_THREAD_PRIORITY_256
#define RT_THREAD_PRIORITY_MAX 256
#define RT_TICK_PER_SECOND 100
-#define RT_DEBUG
-#define RT_DEBUG_COLOR
#define RT_USING_OVERFLOW_CHECK
-#define RT_DEBUG_INIT 0
-#define RT_DEBUG_THREAD 0
#define RT_USING_HOOK
+#define RT_USING_IDLE_HOOK
+#define RT_IDLE_HOOK_LIST_SIZE 4
#define IDLE_THREAD_STACK_SIZE 1024
#define RT_USING_TIMER_SOFT
#define RT_TIMER_THREAD_PRIO 4
#define RT_TIMER_THREAD_STACK_SIZE 10240
+#define RT_DEBUG
+#define RT_DEBUG_COLOR
/* Inter-Thread communication */
@@ -31,17 +29,11 @@
#define RT_USING_EVENT
#define RT_USING_MAILBOX
#define RT_USING_MESSAGEQUEUE
-/* RT_USING_SIGNALS is not set */
/* Memory Management */
-/* RT_USING_MEMPOOL is not set */
#define RT_USING_MEMHEAP
-/* RT_USING_NOHEAP is not set */
#define RT_USING_SMALL_MEM
-/* RT_USING_SLAB is not set */
-/* RT_USING_MEMHEAP_AS_HEAP is not set */
-/* RT_USING_MEMTRACE is not set */
#define RT_USING_HEAP
/* Kernel Device Object */
@@ -51,13 +43,18 @@
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
-/* RT_USING_MODULE is not set */
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
+#define RT_USING_CPU_FFS
+#define ARCH_ARM
+#define ARCH_ARM_ARM9
/* RT-Thread Components */
#define RT_USING_COMPONENTS_INIT
#define RT_USING_USER_MAIN
#define RT_MAIN_THREAD_STACK_SIZE 16384
+#define RT_MAIN_THREAD_PRIORITY 85
/* C++ features */
@@ -74,10 +71,9 @@
#define FINSH_THREAD_PRIORITY 20
#define FINSH_THREAD_STACK_SIZE 4096
#define FINSH_CMD_SIZE 80
-/* FINSH_USING_AUTH is not set */
#define FINSH_USING_MSH
#define FINSH_USING_MSH_DEFAULT
-/* FINSH_USING_MSH_ONLY is not set */
+#define FINSH_ARG_MAX 10
/* Device virtual file system */
@@ -93,20 +89,12 @@
#define RT_DFS_ELM_CODE_PAGE 437
#define RT_DFS_ELM_WORD_ACCESS
#define RT_DFS_ELM_USE_LFN_0
-/* RT_DFS_ELM_USE_LFN_1 is not set */
-/* RT_DFS_ELM_USE_LFN_2 is not set */
-/* RT_DFS_ELM_USE_LFN_3 is not set */
#define RT_DFS_ELM_USE_LFN 0
#define RT_DFS_ELM_MAX_LFN 255
#define RT_DFS_ELM_DRIVES 2
#define RT_DFS_ELM_MAX_SECTOR_SIZE 4096
-/* RT_DFS_ELM_USE_ERASE is not set */
#define RT_DFS_ELM_REENTRANT
#define RT_USING_DFS_DEVFS
-/* RT_USING_DFS_NET is not set */
-/* RT_USING_DFS_ROMFS is not set */
-/* RT_USING_DFS_RAMFS is not set */
-/* RT_USING_DFS_UFFS is not set */
#define RT_USING_DFS_JFFS2
#define RT_USING_DFS_NFS
#define RT_NFS_HOST_EXPORT "192.168.10.82:/"
@@ -114,50 +102,50 @@
/* Device Drivers */
#define RT_USING_DEVICE_IPC
+#define RT_PIPE_BUFSZ 512
#define RT_USING_SERIAL
#define RT_SERIAL_USING_DMA
-/* RT_USING_CAN is not set */
-/* RT_USING_HWTIMER is not set */
-/* RT_USING_CPUTIME is not set */
+#define RT_SERIAL_RB_BUFSZ 64
#define RT_USING_I2C
#define RT_USING_I2C_BITOPS
#define RT_USING_PIN
+#define RT_USING_ADC
+#define RT_USING_PWM
#define RT_USING_MTD_NOR
-/* RT_USING_MTD_NAND is not set */
-/* RT_USING_RTC is not set */
#define RT_USING_SDIO
+#define RT_SDIO_STACK_SIZE 512
+#define RT_SDIO_THREAD_PRIORITY 15
+#define RT_MMCSD_STACK_SIZE 1024
+#define RT_MMCSD_THREAD_PREORITY 22
+#define RT_MMCSD_MAX_PARTITION 16
#define RT_USING_SPI
-/* RT_USING_SPI_MSD is not set */
-/* RT_USING_SFUD is not set */
-/* RT_USING_W25QXX is not set */
-/* RT_USING_GD is not set */
-/* RT_USING_ENC28J60 is not set */
-/* RT_USING_SPI_WIFI is not set */
#define RT_USING_WDT
-/* RT_USING_WIFI is not set */
/* Using USB */
-/* RT_USING_USB_HOST is not set */
-/* RT_USING_USB_DEVICE is not set */
/* POSIX layer and C standard library */
#define RT_USING_LIBC
#define RT_USING_PTHREADS
-/* RT_USING_POSIX is not set */
+#define PTHREAD_NUM_MAX 8
-/* Network stack */
+/* Network */
+
+/* Socket abstraction layer */
+
+
+/* Network interface device */
+
+#define NETDEV_USING_PING
/* light weight TCP/IP stack */
#define RT_USING_LWIP
-/* RT_USING_LWIP141 is not set */
#define RT_USING_LWIP202
-/* RT_USING_LWIP_IPV6 is not set */
+#define RT_LWIP_MEM_ALIGNMENT 4
#define RT_LWIP_IGMP
#define RT_LWIP_ICMP
-/* RT_LWIP_SNMP is not set */
#define RT_LWIP_DNS
#define RT_LWIP_DHCP
#define IP_SOF_BROADCAST 1
@@ -170,8 +158,7 @@
#define RT_LWIP_MSKADDR "255.255.255.0"
#define RT_LWIP_UDP
#define RT_LWIP_TCP
-/* RT_LWIP_RAW is not set */
-/* RT_LWIP_PPP is not set */
+#define RT_LWIP_RAW
#define RT_MEMP_NUM_NETCONN 64
#define RT_LWIP_PBUF_NUM 16
#define RT_LWIP_RAW_PCB_NUM 10
@@ -188,139 +175,84 @@
#define RT_LWIP_ETHTHREAD_MBOX_SIZE 32
#define RT_LWIP_REASSEMBLY_FRAG
#define LWIP_NETIF_STATUS_CALLBACK 1
+#define LWIP_NETIF_LINK_CALLBACK 1
#define SO_REUSE 1
#define LWIP_SO_RCVTIMEO 1
#define LWIP_SO_SNDTIMEO 1
#define LWIP_SO_RCVBUF 1
-/* RT_LWIP_NETIF_LOOPBACK is not set */
+#define LWIP_SO_LINGER 0
#define LWIP_NETIF_LOOPBACK 0
+#define RT_LWIP_USING_PING
-/* Modbus master and slave stack */
+/* AT commands */
-/* RT_USING_MODBUS is not set */
#define LWIP_USING_DHCPD
-/* RT_USING_NETUTILS is not set */
-
-/* RT-Thread UI Engine */
-
-/* RT_USING_GUIENGINE is not set */
+#define DHCPD_SERVER_IP "192.168.169.1"
+#define DHCPD_USING_ROUTER
/* VBUS(Virtual Software BUS) */
-/* RT_USING_VBUS is not set */
/* Utilities */
-/* RT_USING_LOGTRACE is not set */
-/* RT_USING_RYM is not set */
/* RT-Thread online packages */
-/* system packages */
-
-/* PKG_USING_PARTITION is not set */
-/* PKG_USING_SQLITE is not set */
-/* PKG_USING_RTI is not set */
-
/* IoT - internet of things */
-/* PKG_USING_PAHOMQTT is not set */
-/* PKG_USING_WEBCLIENT is not set */
-/* PKG_USING_MONGOOSE is not set */
-/* PKG_USING_WEBTERMINAL is not set */
-/* PKG_USING_CJSON is not set */
-/* PKG_USING_LJSON is not set */
-/* PKG_USING_EZXML is not set */
-/* PKG_USING_NANOPB is not set */
-/* PKG_USING_GAGENT_CLOUD is not set */
/* Wi-Fi */
/* Marvell WiFi */
-/* PKG_USING_WLANMARVELL is not set */
/* Wiced WiFi */
-/* PKG_USING_WLAN_WICED is not set */
-/* PKG_USING_COAP is not set */
-/* PKG_USING_NOPOLL is not set */
+
+/* IoT Cloud */
+
/* security packages */
-/* PKG_USING_MBEDTLS is not set */
-/* PKG_USING_libsodium is not set */
-/* PKG_USING_TINYCRYPT is not set */
/* language packages */
-/* PKG_USING_JERRYSCRIPT is not set */
-/* PKG_USING_MICROPYTHON is not set */
/* multimedia packages */
-/* PKG_USING_OPENMV is not set */
/* tools packages */
-/* PKG_USING_CMBACKTRACE is not set */
-/* PKG_USING_EASYLOGGER is not set */
-/* PKG_USING_SYSTEMVIEW is not set */
-/* PKG_USING_IPERF is not set */
-/* miscellaneous packages */
+/* system packages */
-/* PKG_USING_FASTLZ is not set */
-/* PKG_USING_MINILZO is not set */
-/* example package: hello */
+/* peripheral libraries and drivers */
-/* PKG_USING_HELLO is not set */
-/* Privated Packages of RealThread */
+/* miscellaneous packages */
-/* PKG_USING_CODEC is not set */
-/* PKG_USING_PLAYER is not set */
-/* PKG_USING_PERSIMMON_SRC is not set */
-/* Network Utilities */
+/* samples: kernel and components samples */
-/* PKG_USING_MDNS is not set */
-/* PKG_USING_UPNP is not set */
-/* PKG_USING_WLAN_WICED_SRC is not set */
-/* Cloudsdk: RT_thread IOT Cloudsdk */
+/* Privated Packages of RealThread */
-/* PKG_USING_CLOUDSDK is not set */
-/* Webnet: A web server package for rt-thread */
+/* Network Utilities */
-/* PKG_USING_WEBNET is not set */
-/* PKG_USING_COREMARK is not set */
-/* PKG_USING_POWER_MANAGER is not set */
-/* SOC_GK7101 is not set */
-/* SOC_GK7102 is not set */
-/* SOC_GK7101S is not set */
-/* SOC_GK7102S is not set */
+#define SOC_GK710
#define SOC_GK7102C
#define BOARD_GK7102C_EVB
#define SENSOR_TYPE_SC1135
-/* SENSOR_TYPE_SC1145 is not set */
-/* SENSOR_TYPE_JXH65 is not set */
-/* SENSOR_TYPE_OV9750 is not set */
-/* SENSOR_TYPE_AR0130 is not set */
-/* SENSOR_TYPE_JXH42 is not set */
#define TUNNING_TOOL_SUPPORT
#define RT_USING_DMA_MEM
#define ARM1176_USE_VFP
#define RT_USING_VFP
-#define RT_USING_CPU_FFS
/* Goke Peripheral Device Config */
-#define RT_USING_ADC
#define RT_USING_GMAC
-#define RT_USING_PWM
#define RT_USING_GK_DMA
#define RT_USING_LIBZ
#define RT_USING_LOGCAPTURE
diff --git a/bsp/imx6sx/cortex-a9/.config b/bsp/imx6sx/cortex-a9/.config
index 937db81a3cbf3ca075f46d2c191f5a6de2a83c19..0384fea7986888c09d24205f8f06212255f8d0c9 100644
--- a/bsp/imx6sx/cortex-a9/.config
+++ b/bsp/imx6sx/cortex-a9/.config
@@ -8,6 +8,7 @@
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -64,9 +65,15 @@ CONFIG_RT_USING_DEVICE=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
-CONFIG_RT_VER_NUM=0x40002
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
# CONFIG_RT_USING_CPU_FFS is not set
# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+# CONFIG_RT_IOREMAP_LATE is not set
+CONFIG_ARCH_ARM_CORTEX_A=y
+CONFIG_ARCH_ARM_CORTEX_A9=y
+# CONFIG_RT_BACKTRACE_FUNCTION_NAME is not set
#
# RT-Thread Components
@@ -112,6 +119,7 @@ CONFIG_DFS_FD_MAX=16
# CONFIG_RT_USING_DFS_ELMFAT is not set
CONFIG_RT_USING_DFS_DEVFS=y
# CONFIG_RT_USING_DFS_ROMFS is not set
+# CONFIG_RT_USING_DFS_CROMFS is not set
# CONFIG_RT_USING_DFS_RAMFS is not set
# CONFIG_RT_USING_DFS_UFFS is not set
# CONFIG_RT_USING_DFS_JFFS2 is not set
@@ -132,12 +140,13 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
-# CONFIG_RT_USING_MTD is not set
# CONFIG_RT_USING_PM is not set
# CONFIG_RT_USING_RTC is not set
# CONFIG_RT_USING_SDIO is not set
@@ -146,15 +155,9 @@ CONFIG_RT_USING_PIN=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
#
@@ -171,6 +174,7 @@ CONFIG_RT_USING_LIBC=y
CONFIG_RT_USING_POSIX=y
# CONFIG_RT_USING_POSIX_MMAP is not set
# CONFIG_RT_USING_POSIX_TERMIOS is not set
+# CONFIG_RT_USING_POSIX_GETLINE is not set
# CONFIG_RT_USING_POSIX_AIO is not set
# CONFIG_RT_USING_MODULE is not set
@@ -209,8 +213,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=y
CONFIG_RT_LWIP_ICMP=y
# CONFIG_RT_LWIP_SNMP is not set
@@ -252,6 +257,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
@@ -259,11 +265,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
#
@@ -281,6 +282,7 @@ 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_LWP is not set
#
# RT-Thread online packages
@@ -289,14 +291,20 @@ CONFIG_RT_LWIP_USING_PING=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
@@ -318,6 +326,8 @@ CONFIG_RT_LWIP_USING_PING=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
@@ -329,13 +339,32 @@ CONFIG_RT_LWIP_USING_PING=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
@@ -343,6 +372,8 @@ CONFIG_RT_LWIP_USING_PING=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
@@ -357,6 +388,9 @@ CONFIG_RT_LWIP_USING_PING=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
@@ -369,16 +403,27 @@ CONFIG_RT_LWIP_USING_PING=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
#
# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON 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
@@ -386,6 +431,16 @@ CONFIG_RT_LWIP_USING_PING=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
@@ -393,6 +448,7 @@ CONFIG_RT_LWIP_USING_PING=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
@@ -401,10 +457,16 @@ CONFIG_RT_LWIP_USING_PING=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
@@ -412,6 +474,27 @@ CONFIG_RT_LWIP_USING_PING=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
@@ -422,12 +505,15 @@ CONFIG_RT_LWIP_USING_PING=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
@@ -439,4 +525,54 @@ CONFIG_RT_LWIP_USING_PING=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_MCIMX6X4=y
CONFIG_RT_USING_UART1=y
diff --git a/bsp/imx6sx/cortex-a9/Kconfig b/bsp/imx6sx/cortex-a9/Kconfig
index 0898ab8dd65d7ef6cb1acf2470e077e3b304db95..16ad23cf48cef3a2143902ec0d8d7ecb647b20c7 100644
--- a/bsp/imx6sx/cortex-a9/Kconfig
+++ b/bsp/imx6sx/cortex-a9/Kconfig
@@ -28,8 +28,10 @@ source "$PKGS_DIR/Kconfig"
config SOC_MCIMX6X4
bool
+ select ARCH_ARM_CORTEX_A9
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
config RT_USING_UART1
diff --git a/bsp/imx6sx/cortex-a9/rtconfig.h b/bsp/imx6sx/cortex-a9/rtconfig.h
index ce8ed7880c4a1c552ad0e1050d372ac02efd6a64..b122d915cf3eaa6009b72ec39576c841e4c2d7f1 100644
--- a/bsp/imx6sx/cortex-a9/rtconfig.h
+++ b/bsp/imx6sx/cortex-a9/rtconfig.h
@@ -39,7 +39,11 @@
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart1"
-#define RT_VER_NUM 0x40002
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
+#define ARCH_ARM
+#define ARCH_ARM_CORTEX_A
+#define ARCH_ARM_CORTEX_A9
/* RT-Thread Components */
@@ -87,12 +91,6 @@
#define RT_SERIAL_RB_BUFSZ 64
#define RT_USING_PIN
-/* Using Hardware Crypto drivers */
-
-
-/* Using WiFi */
-
-
/* Using USB */
@@ -126,6 +124,7 @@
#define RT_USING_LWIP
#define RT_USING_LWIP202
+#define RT_LWIP_MEM_ALIGNMENT 4
#define RT_LWIP_IGMP
#define RT_LWIP_ICMP
#define RT_LWIP_DNS
@@ -161,12 +160,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 */
@@ -215,6 +212,13 @@
/* samples: kernel and components samples */
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
+#define SOC_MCIMX6X4
#define RT_USING_UART1
#endif
diff --git a/bsp/imx6ul/.config b/bsp/imx6ul/.config
index 0068adc43f4cbe6540bcc462d279f1b2326e88ff..3201c377364899cbf70f26c04dabba9fff765882 100644
--- a/bsp/imx6ul/.config
+++ b/bsp/imx6ul/.config
@@ -9,6 +9,7 @@ CONFIG_BOARD_IMX6UL=y
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -65,12 +66,15 @@ CONFIG_RT_USING_DEVICE=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart"
-CONFIG_RT_VER_NUM=0x40002
-CONFIG_ARCH_ARM=y
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
# CONFIG_RT_USING_CPU_FFS is not set
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+# CONFIG_RT_IOREMAP_LATE is not set
CONFIG_ARCH_ARM_CORTEX_A=y
CONFIG_ARCH_ARM_CORTEX_A7=y
-# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+# CONFIG_RT_BACKTRACE_FUNCTION_NAME is not set
#
# RT-Thread Components
@@ -114,6 +118,7 @@ CONFIG_DFS_FD_MAX=16
# CONFIG_RT_USING_DFS_ELMFAT is not set
CONFIG_RT_USING_DFS_DEVFS=y
# CONFIG_RT_USING_DFS_ROMFS is not set
+# CONFIG_RT_USING_DFS_CROMFS is not set
# CONFIG_RT_USING_DFS_RAMFS is not set
# CONFIG_RT_USING_DFS_UFFS is not set
# CONFIG_RT_USING_DFS_JFFS2 is not set
@@ -131,8 +136,10 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
@@ -163,6 +170,7 @@ CONFIG_RT_USING_LIBC=y
CONFIG_RT_USING_POSIX=y
# CONFIG_RT_USING_POSIX_MMAP is not set
# CONFIG_RT_USING_POSIX_TERMIOS is not set
+# CONFIG_RT_USING_POSIX_GETLINE is not set
# CONFIG_RT_USING_POSIX_AIO is not set
# CONFIG_RT_USING_MODULE is not set
@@ -210,10 +218,15 @@ CONFIG_RT_USING_POSIX=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
@@ -240,6 +253,8 @@ CONFIG_RT_USING_POSIX=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
@@ -251,8 +266,10 @@ CONFIG_RT_USING_POSIX=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
@@ -263,6 +280,18 @@ CONFIG_RT_USING_POSIX=y
# 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
@@ -270,6 +299,8 @@ CONFIG_RT_USING_POSIX=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
@@ -286,6 +317,7 @@ CONFIG_RT_USING_POSIX=y
# 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
@@ -298,6 +330,15 @@ CONFIG_RT_USING_POSIX=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
@@ -309,6 +350,7 @@ CONFIG_RT_USING_POSIX=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
@@ -317,6 +359,15 @@ CONFIG_RT_USING_POSIX=y
# 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
@@ -324,6 +375,7 @@ CONFIG_RT_USING_POSIX=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
@@ -332,10 +384,16 @@ CONFIG_RT_USING_POSIX=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
@@ -343,8 +401,27 @@ CONFIG_RT_USING_POSIX=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_LCD_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
@@ -379,4 +456,47 @@ CONFIG_RT_USING_POSIX=y
# 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_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_MCIMX6X4=y
diff --git a/bsp/imx6ul/Kconfig b/bsp/imx6ul/Kconfig
index 9fbc95e841fd513578cc4a85d8c3d0e6d38834f4..06b830af268feadb0522840595bf076da55c1583 100644
--- a/bsp/imx6ul/Kconfig
+++ b/bsp/imx6ul/Kconfig
@@ -18,6 +18,7 @@ config PKGS_DIR
config BOARD_IMX6UL
bool
select ARCH_ARM_CORTEX_A7
+ select RT_USING_CACHE
default y
source "$RTT_DIR/Kconfig"
diff --git a/bsp/imx6ul/imx6.lds b/bsp/imx6ul/imx6.lds
index a889774f852ef0d15923d9f3e605ec85c2925857..4beeb3770e82da47d168aebc335c936b62cd6838 100644
--- a/bsp/imx6ul/imx6.lds
+++ b/bsp/imx6ul/imx6.lds
@@ -37,6 +37,13 @@ SECTIONS
} =0
__text_end = .;
+ .ARM.exidx :
+ {
+ __exidx_start = .;
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ __exidx_end = .;
+ }
+
__rodata_start = .;
.rodata : { *(.rodata) *(.rodata.*) }
__rodata_end = .;
diff --git a/bsp/imx6ul/rtconfig.h b/bsp/imx6ul/rtconfig.h
index 19826089e27988e8645cefa70540b24bae14f7e1..261b34481e91456a560fbd87d170a9a1c888e9d7 100644
--- a/bsp/imx6ul/rtconfig.h
+++ b/bsp/imx6ul/rtconfig.h
@@ -9,12 +9,8 @@
/* RT-Thread Kernel */
#define RT_NAME_MAX 8
-/* RT_USING_ARCH_DATA_TYPE is not set */
-/* RT_USING_SMP is not set */
#define RT_ALIGN_SIZE 4
-/* RT_THREAD_PRIORITY_8 is not set */
#define RT_THREAD_PRIORITY_32
-/* RT_THREAD_PRIORITY_256 is not set */
#define RT_THREAD_PRIORITY_MAX 32
#define RT_TICK_PER_SECOND 100
#define RT_USING_OVERFLOW_CHECK
@@ -22,19 +18,7 @@
#define RT_USING_IDLE_HOOK
#define RT_IDLE_HOOK_LIST_SIZE 4
#define IDLE_THREAD_STACK_SIZE 256
-/* RT_USING_TIMER_SOFT is not set */
#define RT_DEBUG
-/* RT_DEBUG_COLOR is not set */
-/* RT_DEBUG_INIT_CONFIG is not set */
-/* RT_DEBUG_THREAD_CONFIG is not set */
-/* RT_DEBUG_SCHEDULER_CONFIG is not set */
-/* RT_DEBUG_IPC_CONFIG is not set */
-/* RT_DEBUG_TIMER_CONFIG is not set */
-/* RT_DEBUG_IRQ_CONFIG is not set */
-/* RT_DEBUG_MEM_CONFIG is not set */
-/* RT_DEBUG_SLAB_CONFIG is not set */
-/* RT_DEBUG_MEMHEAP_CONFIG is not set */
-/* RT_DEBUG_MODULE_CONFIG is not set */
/* Inter-Thread communication */
@@ -43,41 +27,31 @@
#define RT_USING_EVENT
#define RT_USING_MAILBOX
#define RT_USING_MESSAGEQUEUE
-/* RT_USING_SIGNALS is not set */
/* Memory Management */
#define RT_USING_MEMPOOL
-/* RT_USING_MEMHEAP is not set */
-/* RT_USING_NOHEAP is not set */
#define RT_USING_SMALL_MEM
-/* RT_USING_SLAB is not set */
-/* RT_USING_MEMTRACE is not set */
#define RT_USING_HEAP
/* Kernel Device Object */
#define RT_USING_DEVICE
-/* RT_USING_DEVICE_OPS is not set */
-/* RT_USING_INTERRUPT_INFO is not set */
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart"
-#define RT_VER_NUM 0x40002
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
#define ARCH_ARM
-/* RT_USING_CPU_FFS is not set */
#define ARCH_ARM_CORTEX_A
#define ARCH_ARM_CORTEX_A7
-/* ARCH_CPU_STACK_GROWS_UPWARD is not set */
/* RT-Thread Components */
#define RT_USING_COMPONENTS_INIT
-/* RT_USING_USER_MAIN is not set */
/* C++ features */
-/* RT_USING_CPLUSPLUS is not set */
/* Command shell */
@@ -87,14 +61,11 @@
#define FINSH_HISTORY_LINES 5
#define FINSH_USING_SYMTAB
#define FINSH_USING_DESCRIPTION
-/* FINSH_ECHO_DISABLE_DEFAULT is not set */
#define FINSH_THREAD_PRIORITY 20
#define FINSH_THREAD_STACK_SIZE 4096
#define FINSH_CMD_SIZE 80
-/* FINSH_USING_AUTH is not set */
#define FINSH_USING_MSH
#define FINSH_USING_MSH_DEFAULT
-/* FINSH_USING_MSH_ONLY is not set */
#define FINSH_ARG_MAX 10
/* Device virtual file system */
@@ -104,248 +75,90 @@
#define DFS_FILESYSTEMS_MAX 2
#define DFS_FILESYSTEM_TYPES_MAX 2
#define DFS_FD_MAX 16
-/* RT_USING_DFS_MNTTABLE is not set */
-/* RT_USING_DFS_ELMFAT is not set */
#define RT_USING_DFS_DEVFS
-/* RT_USING_DFS_ROMFS is not set */
-/* RT_USING_DFS_RAMFS is not set */
-/* RT_USING_DFS_UFFS is not set */
-/* RT_USING_DFS_JFFS2 is not set */
/* Device Drivers */
#define RT_USING_DEVICE_IPC
#define RT_PIPE_BUFSZ 512
-/* RT_USING_SYSTEM_WORKQUEUE is not set */
#define RT_USING_SERIAL
#define RT_SERIAL_USING_DMA
#define RT_SERIAL_RB_BUFSZ 64
-/* RT_USING_CAN is not set */
-/* RT_USING_HWTIMER is not set */
-/* RT_USING_CPUTIME is not set */
-/* RT_USING_I2C is not set */
#define RT_USING_PIN
-/* RT_USING_ADC is not set */
-/* RT_USING_PWM is not set */
-/* RT_USING_MTD_NOR is not set */
-/* RT_USING_MTD_NAND is not set */
-/* RT_USING_PM is not set */
-/* RT_USING_RTC is not set */
-/* RT_USING_SDIO is not set */
-/* RT_USING_SPI is not set */
-/* RT_USING_WDT is not set */
-/* RT_USING_AUDIO is not set */
-/* RT_USING_SENSOR is not set */
-/* RT_USING_TOUCH is not set */
-/* RT_USING_HWCRYPTO is not set */
-/* RT_USING_PULSE_ENCODER is not set */
-/* RT_USING_INPUT_CAPTURE is not set */
-/* RT_USING_WIFI is not set */
/* Using USB */
-/* RT_USING_USB_HOST is not set */
-/* RT_USING_USB_DEVICE is not set */
/* POSIX layer and C standard library */
#define RT_USING_LIBC
-/* RT_USING_PTHREADS is not set */
#define RT_USING_POSIX
-/* RT_USING_POSIX_MMAP is not set */
-/* RT_USING_POSIX_TERMIOS is not set */
-/* RT_USING_POSIX_AIO is not set */
-/* RT_USING_MODULE is not set */
/* Network */
/* Socket abstraction layer */
-/* RT_USING_SAL is not set */
/* Network interface device */
-/* RT_USING_NETDEV is not set */
/* light weight TCP/IP stack */
-/* RT_USING_LWIP is not set */
/* AT commands */
-/* RT_USING_AT is not set */
/* VBUS(Virtual Software BUS) */
-/* RT_USING_VBUS is not set */
/* Utilities */
-/* RT_USING_RYM is not set */
-/* RT_USING_ULOG is not set */
-/* RT_USING_UTEST is not set */
-/* RT_USING_LWP is not set */
/* RT-Thread online packages */
/* IoT - internet of things */
-/* PKG_USING_PAHOMQTT is not set */
-/* PKG_USING_WEBCLIENT is not set */
-/* PKG_USING_WEBNET is not set */
-/* PKG_USING_MONGOOSE is not set */
-/* PKG_USING_WEBTERMINAL is not set */
-/* PKG_USING_CJSON is not set */
-/* PKG_USING_JSMN is not set */
-/* PKG_USING_LIBMODBUS is not set */
-/* PKG_USING_FREEMODBUS is not set */
-/* PKG_USING_LJSON is not set */
-/* PKG_USING_EZXML is not set */
-/* PKG_USING_NANOPB is not set */
/* Wi-Fi */
/* Marvell WiFi */
-/* PKG_USING_WLANMARVELL is not set */
/* Wiced WiFi */
-/* PKG_USING_WLAN_WICED is not set */
-/* PKG_USING_RW007 is not set */
-/* PKG_USING_COAP is not set */
-/* PKG_USING_NOPOLL is not set */
-/* PKG_USING_NETUTILS is not set */
-/* PKG_USING_AT_DEVICE is not set */
-/* PKG_USING_ATSRV_SOCKET is not set */
-/* PKG_USING_WIZNET is not set */
/* IoT Cloud */
-/* PKG_USING_ONENET is not set */
-/* PKG_USING_GAGENT_CLOUD is not set */
-/* PKG_USING_ALI_IOTKIT is not set */
-/* PKG_USING_AZURE is not set */
-/* PKG_USING_TENCENT_IOTHUB is not set */
-/* PKG_USING_JIOT-C-SDK is not set */
-/* PKG_USING_NIMBLE is not set */
-/* PKG_USING_OTA_DOWNLOADER is not set */
-/* PKG_USING_IPMSG is not set */
-/* PKG_USING_LSSDP is not set */
-/* PKG_USING_AIRKISS_OPEN is not set */
-/* PKG_USING_LIBRWS is not set */
-/* PKG_USING_TCPSERVER is not set */
-/* PKG_USING_PROTOBUF_C is not set */
-/* PKG_USING_ONNX_PARSER is not set */
-/* PKG_USING_ONNX_BACKEND is not set */
/* security packages */
-/* PKG_USING_MBEDTLS is not set */
-/* PKG_USING_libsodium is not set */
-/* PKG_USING_TINYCRYPT is not set */
/* language packages */
-/* PKG_USING_LUA is not set */
-/* PKG_USING_JERRYSCRIPT is not set */
-/* PKG_USING_MICROPYTHON is not set */
/* multimedia packages */
-/* PKG_USING_OPENMV is not set */
-/* PKG_USING_MUPDF is not set */
-/* PKG_USING_STEMWIN is not set */
-/* PKG_USING_WAVPLAYER is not set */
-/* PKG_USING_TJPGD is not set */
/* tools packages */
-/* PKG_USING_CMBACKTRACE is not set */
-/* PKG_USING_EASYFLASH is not set */
-/* PKG_USING_EASYLOGGER is not set */
-/* PKG_USING_SYSTEMVIEW is not set */
-/* PKG_USING_RDB is not set */
-/* PKG_USING_QRCODE is not set */
-/* PKG_USING_ULOG_EASYFLASH is not set */
-/* PKG_USING_ADBD is not set */
/* system packages */
-/* PKG_USING_GUIENGINE is not set */
-/* PKG_USING_PERSIMMON is not set */
-/* PKG_USING_CAIRO is not set */
-/* PKG_USING_PIXMAN is not set */
-/* PKG_USING_LWEXT4 is not set */
-/* PKG_USING_PARTITION is not set */
-/* PKG_USING_FAL is not set */
-/* PKG_USING_SQLITE is not set */
-/* PKG_USING_RTI is not set */
-/* PKG_USING_LITTLEVGL2RTT is not set */
-/* PKG_USING_CMSIS is not set */
-/* PKG_USING_DFS_YAFFS is not set */
-/* PKG_USING_LITTLEFS is not set */
-/* PKG_USING_THREAD_POOL is not set */
-/* PKG_USING_ROBOTS is not set */
/* peripheral libraries and drivers */
-/* PKG_USING_SENSORS_DRIVERS is not set */
-/* PKG_USING_REALTEK_AMEBA is not set */
-/* PKG_USING_SHT2X is not set */
-/* PKG_USING_STM32_SDIO is not set */
-/* PKG_USING_ICM20608 is not set */
-/* PKG_USING_U8G2 is not set */
-/* PKG_USING_BUTTON is not set */
-/* PKG_USING_PCF8574 is not set */
-/* PKG_USING_SX12XX is not set */
-/* PKG_USING_SIGNAL_LED is not set */
-/* PKG_USING_LEDBLINK is not set */
-/* PKG_USING_WM_LIBRARIES is not set */
-/* PKG_USING_KENDRYTE_SDK is not set */
-/* PKG_USING_INFRARED is not set */
-/* PKG_USING_ROSSERIAL is not set */
-/* PKG_USING_AT24CXX is not set */
-/* PKG_USING_MOTIONDRIVER2RTT is not set */
-/* PKG_USING_AD7746 is not set */
-/* PKG_USING_PCA9685 is not set */
-/* PKG_USING_I2C_TOOLS is not set */
-/* PKG_USING_NRF24L01 is not set */
-/* PKG_USING_TOUCH_DRIVERS is not set */
-/* PKG_USING_LCD_DRIVERS is not set */
-/* PKG_USING_MAX17048 is not set */
/* miscellaneous packages */
-/* PKG_USING_LIBCSV is not set */
-/* PKG_USING_OPTPARSE is not set */
-/* PKG_USING_FASTLZ is not set */
-/* PKG_USING_MINILZO is not set */
-/* PKG_USING_QUICKLZ is not set */
-/* PKG_USING_MULTIBUTTON is not set */
-/* PKG_USING_FLEXIBLE_BUTTON is not set */
-/* PKG_USING_CANFESTIVAL is not set */
-/* PKG_USING_ZLIB is not set */
-/* PKG_USING_DSTR is not set */
-/* PKG_USING_TINYFRAME is not set */
-/* PKG_USING_KENDRYTE_DEMO is not set */
-/* PKG_USING_DIGITALCTRL is not set */
-/* PKG_USING_UPACKER is not set */
-/* PKG_USING_UPARAM is not set */
/* samples: kernel and components samples */
-/* PKG_USING_KERNEL_SAMPLES is not set */
-/* PKG_USING_FILESYSTEM_SAMPLES is not set */
-/* PKG_USING_NETWORK_SAMPLES is not set */
-/* PKG_USING_PERIPHERAL_SAMPLES is not set */
-/* PKG_USING_HELLO is not set */
-/* PKG_USING_VI is not set */
-/* PKG_USING_NNOM is not set */
-/* PKG_USING_LIBANN is not set */
-/* PKG_USING_ELAPACK is not set */
-/* PKG_USING_ARMv7M_DWT is not set */
-/* PKG_USING_VT100 is not set */
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
#define SOC_MCIMX6X4
#endif
diff --git a/bsp/imxrt/imxrt1052-atk-commander/.config b/bsp/imxrt/imxrt1052-atk-commander/.config
index a707d7ab616682ed3d0bd892fdcbd21c3cb4f6a0..31b61577bca3b32608706a41f399c934a15e4f69 100644
--- a/bsp/imxrt/imxrt1052-atk-commander/.config
+++ b/bsp/imxrt/imxrt1052-atk-commander/.config
@@ -7,6 +7,8 @@
# RT-Thread Kernel
#
CONFIG_RT_NAME_MAX=8
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -63,8 +65,13 @@ CONFIG_RT_USING_DEVICE=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
-CONFIG_RT_VER_NUM=0x40001
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
+CONFIG_RT_USING_CPU_FFS=y
# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+CONFIG_ARCH_ARM_CORTEX_M=y
+CONFIG_ARCH_ARM_CORTEX_M7=y
#
# RT-Thread Components
@@ -110,6 +117,7 @@ CONFIG_DFS_FD_MAX=16
# CONFIG_RT_USING_DFS_ELMFAT is not set
CONFIG_RT_USING_DFS_DEVFS=y
# CONFIG_RT_USING_DFS_ROMFS is not set
+# CONFIG_RT_USING_DFS_CROMFS is not set
# CONFIG_RT_USING_DFS_RAMFS is not set
# CONFIG_RT_USING_DFS_UFFS is not set
# CONFIG_RT_USING_DFS_JFFS2 is not set
@@ -119,19 +127,22 @@ CONFIG_RT_USING_DFS_DEVFS=y
#
CONFIG_RT_USING_DEVICE_IPC=y
CONFIG_RT_PIPE_BUFSZ=512
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
CONFIG_RT_USING_SERIAL=y
CONFIG_RT_SERIAL_USING_DMA=y
CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_CAN is not set
# CONFIG_RT_USING_HWTIMER is not set
CONFIG_RT_USING_CPUTIME=y
+CONFIG_RT_USING_CPUTIME_CORTEXM=y
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
-# CONFIG_RT_USING_MTD is not set
# CONFIG_RT_USING_PM is not set
# CONFIG_RT_USING_RTC is not set
# CONFIG_RT_USING_SDIO is not set
@@ -142,18 +153,17 @@ CONFIG_RT_USING_SFUD=y
CONFIG_RT_SFUD_USING_SFDP=y
# CONFIG_RT_SFUD_USING_FLASH_INFO_TABLE is not set
# 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_W25QXX is not set
-# CONFIG_RT_USING_GD is not set
# CONFIG_RT_USING_ENC28J60 is not set
# CONFIG_RT_USING_SPI_WIFI is not set
# CONFIG_RT_USING_WDT is not set
# CONFIG_RT_USING_AUDIO is not set
# CONFIG_RT_USING_SENSOR is not set
-
-#
-# Using WiFi
-#
+# CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
# CONFIG_RT_USING_WIFI is not set
#
@@ -170,6 +180,7 @@ CONFIG_RT_USING_LIBC=y
CONFIG_RT_USING_POSIX=y
# CONFIG_RT_USING_POSIX_MMAP is not set
# CONFIG_RT_USING_POSIX_TERMIOS is not set
+# CONFIG_RT_USING_POSIX_GETLINE is not set
# CONFIG_RT_USING_POSIX_AIO is not set
# CONFIG_RT_USING_MODULE is not set
@@ -183,14 +194,14 @@ CONFIG_RT_USING_POSIX=y
# CONFIG_RT_USING_SAL is not set
#
-# light weight TCP/IP stack
+# Network interface device
#
-# CONFIG_RT_USING_LWIP is not set
+# CONFIG_RT_USING_NETDEV is not set
#
-# Modbus master and slave stack
+# light weight TCP/IP stack
#
-# CONFIG_RT_USING_MODBUS is not set
+# CONFIG_RT_USING_LWIP is not set
#
# AT commands
@@ -205,10 +216,10 @@ CONFIG_RT_USING_POSIX=y
#
# Utilities
#
-# CONFIG_RT_USING_LOGTRACE is not set
# CONFIG_RT_USING_RYM is not set
# CONFIG_RT_USING_ULOG is not set
# CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_LWP is not set
#
# RT-Thread online packages
@@ -217,14 +228,20 @@ CONFIG_RT_USING_POSIX=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
@@ -246,6 +263,8 @@ CONFIG_RT_USING_POSIX=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
@@ -257,13 +276,32 @@ CONFIG_RT_USING_POSIX=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
@@ -271,6 +309,8 @@ CONFIG_RT_USING_POSIX=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
@@ -285,6 +325,9 @@ CONFIG_RT_USING_POSIX=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
@@ -297,16 +340,27 @@ CONFIG_RT_USING_POSIX=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
#
# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON 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
@@ -314,6 +368,16 @@ CONFIG_RT_USING_POSIX=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
@@ -321,6 +385,7 @@ CONFIG_RT_USING_POSIX=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
@@ -329,15 +394,44 @@ CONFIG_RT_USING_POSIX=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
# CONFIG_PKG_USING_PCA9685 is not set
# 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
@@ -348,12 +442,15 @@ CONFIG_RT_USING_POSIX=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
@@ -365,6 +462,53 @@ CONFIG_RT_USING_POSIX=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_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
#
# Hardware Drivers Config
@@ -394,3 +538,5 @@ CONFIG_BSP_USING_SPI3=y
#
# CONFIG_BSP_USING_SPI_FLASH is not set
# CONFIG_BSP_USING_SDRAM is not set
+# CONFIG_BSP_USING_USB_DEVICE is not set
+CONFIG_SOC_IMXRT1052=y
diff --git a/bsp/imxrt/imxrt1052-atk-commander/Kconfig b/bsp/imxrt/imxrt1052-atk-commander/Kconfig
index c9221717cb4e42111c0276448be858c983657b2b..7156555e031e22dd37e80c0f62b76d3e68282f63 100644
--- a/bsp/imxrt/imxrt1052-atk-commander/Kconfig
+++ b/bsp/imxrt/imxrt1052-atk-commander/Kconfig
@@ -14,3 +14,9 @@ source "$RTT_DIR/Kconfig"
source "$PKGS_DIR/Kconfig"
source "../libraries/Kconfig"
source "board/Kconfig"
+
+config SOC_IMXRT1052
+ bool
+ select ARCH_ARM_CORTEX_M7
+ select RT_USING_CACHE
+ default y
diff --git a/bsp/imxrt/imxrt1052-atk-commander/rtconfig.h b/bsp/imxrt/imxrt1052-atk-commander/rtconfig.h
index 5c5cb81922c194f80e4a59ad3f1c34319d2b0b37..4f01487d1032b43cb4d98423115bb1d4c812baed 100644
--- a/bsp/imxrt/imxrt1052-atk-commander/rtconfig.h
+++ b/bsp/imxrt/imxrt1052-atk-commander/rtconfig.h
@@ -40,7 +40,12 @@
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart1"
-#define RT_VER_NUM 0x40001
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
+#define RT_USING_CPU_FFS
+#define ARCH_ARM
+#define ARCH_ARM_CORTEX_M
+#define ARCH_ARM_CORTEX_M7
/* RT-Thread Components */
@@ -85,13 +90,12 @@
#define RT_SERIAL_USING_DMA
#define RT_SERIAL_RB_BUFSZ 64
#define RT_USING_CPUTIME
+#define RT_USING_CPUTIME_CORTEXM
#define RT_USING_PIN
#define RT_USING_SPI
#define RT_USING_SFUD
#define RT_SFUD_USING_SFDP
-
-/* Using WiFi */
-
+#define RT_SFUD_SPI_MAX_HZ 50000000
/* Using USB */
@@ -106,10 +110,10 @@
/* Socket abstraction layer */
-/* light weight TCP/IP stack */
+/* Network interface device */
-/* Modbus master and slave stack */
+/* light weight TCP/IP stack */
/* AT commands */
@@ -161,6 +165,12 @@
/* samples: kernel and components samples */
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
+
/* Hardware Drivers Config */
#define SOC_IMXRT1052CVL5B
@@ -181,5 +191,6 @@
/* Onboard Peripheral Drivers */
+#define SOC_IMXRT1052
#endif
diff --git a/bsp/imxrt/imxrt1052-fire-pro/.config b/bsp/imxrt/imxrt1052-fire-pro/.config
index b70593a8cc53caec04535665549e3a36e7c2a3ac..52cc14f2e3009ef35475593869249575f9c69bf5 100644
--- a/bsp/imxrt/imxrt1052-fire-pro/.config
+++ b/bsp/imxrt/imxrt1052-fire-pro/.config
@@ -7,6 +7,8 @@
# RT-Thread Kernel
#
CONFIG_RT_NAME_MAX=8
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -63,8 +65,13 @@ CONFIG_RT_USING_DEVICE=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
-CONFIG_RT_VER_NUM=0x40001
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
+CONFIG_RT_USING_CPU_FFS=y
# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+CONFIG_ARCH_ARM_CORTEX_M=y
+CONFIG_ARCH_ARM_CORTEX_M7=y
#
# RT-Thread Components
@@ -108,19 +115,22 @@ CONFIG_FINSH_ARG_MAX=10
#
CONFIG_RT_USING_DEVICE_IPC=y
CONFIG_RT_PIPE_BUFSZ=512
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
CONFIG_RT_USING_SERIAL=y
CONFIG_RT_SERIAL_USING_DMA=y
CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_CAN is not set
# CONFIG_RT_USING_HWTIMER is not set
CONFIG_RT_USING_CPUTIME=y
+CONFIG_RT_USING_CPUTIME_CORTEXM=y
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
-# CONFIG_RT_USING_MTD is not set
# CONFIG_RT_USING_PM is not set
# CONFIG_RT_USING_RTC is not set
# CONFIG_RT_USING_SDIO is not set
@@ -128,10 +138,10 @@ CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_WDT is not set
# CONFIG_RT_USING_AUDIO is not set
# CONFIG_RT_USING_SENSOR is not set
-
-#
-# Using WiFi
-#
+# CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
# CONFIG_RT_USING_WIFI is not set
#
@@ -145,6 +155,7 @@ CONFIG_RT_USING_PIN=y
#
CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_PTHREADS is not set
+# CONFIG_RT_USING_MODULE is not set
#
# Network
@@ -156,14 +167,14 @@ CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_SAL is not set
#
-# light weight TCP/IP stack
+# Network interface device
#
-# CONFIG_RT_USING_LWIP is not set
+# CONFIG_RT_USING_NETDEV is not set
#
-# Modbus master and slave stack
+# light weight TCP/IP stack
#
-# CONFIG_RT_USING_MODBUS is not set
+# CONFIG_RT_USING_LWIP is not set
#
# AT commands
@@ -178,10 +189,10 @@ CONFIG_RT_USING_LIBC=y
#
# Utilities
#
-# CONFIG_RT_USING_LOGTRACE is not set
# CONFIG_RT_USING_RYM is not set
# CONFIG_RT_USING_ULOG is not set
# CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_LWP is not set
#
# RT-Thread online packages
@@ -190,14 +201,20 @@ CONFIG_RT_USING_LIBC=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
@@ -219,6 +236,8 @@ CONFIG_RT_USING_LIBC=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
@@ -230,13 +249,32 @@ CONFIG_RT_USING_LIBC=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
@@ -244,6 +282,8 @@ CONFIG_RT_USING_LIBC=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
@@ -258,6 +298,9 @@ CONFIG_RT_USING_LIBC=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
@@ -270,16 +313,27 @@ CONFIG_RT_USING_LIBC=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
#
# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON 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
@@ -287,6 +341,16 @@ CONFIG_RT_USING_LIBC=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
@@ -294,6 +358,7 @@ CONFIG_RT_USING_LIBC=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
@@ -302,15 +367,44 @@ CONFIG_RT_USING_LIBC=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
# CONFIG_PKG_USING_PCA9685 is not set
# 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
@@ -321,12 +415,15 @@ CONFIG_RT_USING_LIBC=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
@@ -338,6 +435,53 @@ CONFIG_RT_USING_LIBC=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_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
#
# Hardware Drivers Config
@@ -349,6 +493,7 @@ CONFIG_SOC_IMXRT1052CVL5B=y
#
# CONFIG_BSP_USING_DMA is not set
CONFIG_BSP_USING_GPIO=y
+# CONFIG_BSP_USING_CAN is not set
CONFIG_BSP_USING_LPUART=y
CONFIG_BSP_USING_LPUART1=y
# CONFIG_BSP_LPUART1_RX_USING_DMA is not set
@@ -372,3 +517,4 @@ CONFIG_BSP_USING_LPUART1=y
#
# Board extended module Drivers
#
+CONFIG_SOC_IMXRT1052=y
diff --git a/bsp/imxrt/imxrt1052-fire-pro/Kconfig b/bsp/imxrt/imxrt1052-fire-pro/Kconfig
index c9221717cb4e42111c0276448be858c983657b2b..7156555e031e22dd37e80c0f62b76d3e68282f63 100644
--- a/bsp/imxrt/imxrt1052-fire-pro/Kconfig
+++ b/bsp/imxrt/imxrt1052-fire-pro/Kconfig
@@ -14,3 +14,9 @@ source "$RTT_DIR/Kconfig"
source "$PKGS_DIR/Kconfig"
source "../libraries/Kconfig"
source "board/Kconfig"
+
+config SOC_IMXRT1052
+ bool
+ select ARCH_ARM_CORTEX_M7
+ select RT_USING_CACHE
+ default y
diff --git a/bsp/imxrt/imxrt1052-fire-pro/rtconfig.h b/bsp/imxrt/imxrt1052-fire-pro/rtconfig.h
index 6ab1a06a926715f80ba1a644e48915bbe48a486e..1d558f328f78ca458e52d08bde35ba7d6b98799c 100644
--- a/bsp/imxrt/imxrt1052-fire-pro/rtconfig.h
+++ b/bsp/imxrt/imxrt1052-fire-pro/rtconfig.h
@@ -40,7 +40,12 @@
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart1"
-#define RT_VER_NUM 0x40001
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
+#define RT_USING_CPU_FFS
+#define ARCH_ARM
+#define ARCH_ARM_CORTEX_M
+#define ARCH_ARM_CORTEX_M7
/* RT-Thread Components */
@@ -78,14 +83,10 @@
#define RT_USING_SERIAL
#define RT_SERIAL_USING_DMA
#define RT_SERIAL_RB_BUFSZ 64
-#define RT_USING_CAN
-#define RT_CAN_USING_HDR
#define RT_USING_CPUTIME
+#define RT_USING_CPUTIME_CORTEXM
#define RT_USING_PIN
-/* Using WiFi */
-
-
/* Using USB */
@@ -98,10 +99,10 @@
/* Socket abstraction layer */
-/* light weight TCP/IP stack */
+/* Network interface device */
-/* Modbus master and slave stack */
+/* light weight TCP/IP stack */
/* AT commands */
@@ -153,6 +154,12 @@
/* samples: kernel and components samples */
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
+
/* Hardware Drivers Config */
#define SOC_IMXRT1052CVL5B
@@ -160,8 +167,6 @@
/* On-chip Peripheral Drivers */
#define BSP_USING_GPIO
-#define BSP_USING_CAN
-#define BSP_USING_CAN2
#define BSP_USING_LPUART
#define BSP_USING_LPUART1
@@ -170,5 +175,6 @@
/* Board extended module Drivers */
+#define SOC_IMXRT1052
#endif
diff --git a/bsp/imxrt/imxrt1052-nxp-evk/.config b/bsp/imxrt/imxrt1052-nxp-evk/.config
index 6c073109cc676c3f9d1513c03f09fdeb29b8a87c..1d533718b15600550045f9648f930aa2ea22c1df 100644
--- a/bsp/imxrt/imxrt1052-nxp-evk/.config
+++ b/bsp/imxrt/imxrt1052-nxp-evk/.config
@@ -8,6 +8,7 @@
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -65,8 +66,12 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
CONFIG_RT_VER_NUM=0x40003
-# CONFIG_RT_USING_CPU_FFS is not set
+CONFIG_RT_USING_CACHE=y
+CONFIG_RT_USING_CPU_FFS=y
# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+CONFIG_ARCH_ARM_CORTEX_M=y
+CONFIG_ARCH_ARM_CORTEX_M7=y
#
# RT-Thread Components
@@ -117,6 +122,7 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_CAN is not set
# CONFIG_RT_USING_HWTIMER is not set
CONFIG_RT_USING_CPUTIME=y
+CONFIG_RT_USING_CPUTIME_CORTEXM=y
# CONFIG_RT_USING_I2C is not set
CONFIG_RT_USING_PHY=y
CONFIG_RT_USING_PIN=y
@@ -177,9 +183,6 @@ CONFIG_NETDEV_IPV6=0
# light weight TCP/IP stack
#
# CONFIG_RT_USING_LWIP is not set
-# CONFIG_RT_USING_LWIP141 is not set
-# CONFIG_RT_USING_LWIP202 is not set
-# CONFIG_RT_USING_LWIP212 is not set
#
# AT commands
@@ -197,6 +200,7 @@ CONFIG_NETDEV_IPV6=0
# CONFIG_RT_USING_RYM is not set
# CONFIG_RT_USING_ULOG is not set
# CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_LWP is not set
#
# RT-Thread online packages
@@ -205,14 +209,20 @@ CONFIG_NETDEV_IPV6=0
#
# 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
@@ -234,6 +244,8 @@ CONFIG_NETDEV_IPV6=0
# 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
@@ -245,12 +257,32 @@ CONFIG_NETDEV_IPV6=0
# 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_IOTKIT 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
@@ -258,6 +290,8 @@ CONFIG_NETDEV_IPV6=0
# 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
@@ -272,6 +306,9 @@ CONFIG_NETDEV_IPV6=0
# 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
@@ -284,16 +321,27 @@ CONFIG_NETDEV_IPV6=0
# 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
#
# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON 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
@@ -301,6 +349,16 @@ CONFIG_NETDEV_IPV6=0
# 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
@@ -308,7 +366,7 @@ CONFIG_NETDEV_IPV6=0
# 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_AP3216C 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
@@ -317,14 +375,44 @@ CONFIG_NETDEV_IPV6=0
# 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
# CONFIG_PKG_USING_PCA9685 is not set
+# 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
@@ -335,12 +423,15 @@ CONFIG_NETDEV_IPV6=0
# 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
@@ -352,6 +443,53 @@ CONFIG_NETDEV_IPV6=0
# 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_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
#
# Hardware Drivers Config
@@ -379,3 +517,4 @@ CONFIG_BSP_USING_LPUART1=y
#
# Board extended module Drivers
#
+CONFIG_SOC_IMXRT1052=y
diff --git a/bsp/imxrt/imxrt1052-nxp-evk/Kconfig b/bsp/imxrt/imxrt1052-nxp-evk/Kconfig
index c9221717cb4e42111c0276448be858c983657b2b..7156555e031e22dd37e80c0f62b76d3e68282f63 100644
--- a/bsp/imxrt/imxrt1052-nxp-evk/Kconfig
+++ b/bsp/imxrt/imxrt1052-nxp-evk/Kconfig
@@ -14,3 +14,9 @@ source "$RTT_DIR/Kconfig"
source "$PKGS_DIR/Kconfig"
source "../libraries/Kconfig"
source "board/Kconfig"
+
+config SOC_IMXRT1052
+ bool
+ select ARCH_ARM_CORTEX_M7
+ select RT_USING_CACHE
+ default y
diff --git a/bsp/imxrt/imxrt1052-nxp-evk/rtconfig.h b/bsp/imxrt/imxrt1052-nxp-evk/rtconfig.h
index 1ed1ff6671104ff57efa4ae317898b4dea8c9b6a..3410c16c7ae110daf620ae35bc238d6ecb80b0b4 100644
--- a/bsp/imxrt/imxrt1052-nxp-evk/rtconfig.h
+++ b/bsp/imxrt/imxrt1052-nxp-evk/rtconfig.h
@@ -41,6 +41,11 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart1"
#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
+#define RT_USING_CPU_FFS
+#define ARCH_ARM
+#define ARCH_ARM_CORTEX_M
+#define ARCH_ARM_CORTEX_M7
/* RT-Thread Components */
@@ -78,6 +83,7 @@
#define RT_USING_SERIAL
#define RT_SERIAL_RB_BUFSZ 64
#define RT_USING_CPUTIME
+#define RT_USING_CPUTIME_CORTEXM
#define RT_USING_PHY
#define RT_USING_PIN
@@ -155,6 +161,12 @@
/* samples: kernel and components samples */
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
+
/* Hardware Drivers Config */
#define BSP_USING_HYPERFLASH
@@ -171,5 +183,6 @@
/* Board extended module Drivers */
+#define SOC_IMXRT1052
#endif
diff --git a/bsp/imxrt/imxrt1064-nxp-evk/.config b/bsp/imxrt/imxrt1064-nxp-evk/.config
index 83cfa1e49580ea3cd398caf6769a6891fc2dff42..1edcd2f9f60fefe6e3e0576365f48e2989c0f273 100644
--- a/bsp/imxrt/imxrt1064-nxp-evk/.config
+++ b/bsp/imxrt/imxrt1064-nxp-evk/.config
@@ -7,6 +7,8 @@
# RT-Thread Kernel
#
CONFIG_RT_NAME_MAX=8
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -63,8 +65,13 @@ CONFIG_RT_USING_DEVICE=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
-CONFIG_RT_VER_NUM=0x40001
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
+CONFIG_RT_USING_CPU_FFS=y
# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+CONFIG_ARCH_ARM_CORTEX_M=y
+CONFIG_ARCH_ARM_CORTEX_M7=y
#
# RT-Thread Components
@@ -108,19 +115,22 @@ CONFIG_FINSH_ARG_MAX=10
#
CONFIG_RT_USING_DEVICE_IPC=y
CONFIG_RT_PIPE_BUFSZ=512
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
CONFIG_RT_USING_SERIAL=y
# CONFIG_RT_SERIAL_USING_DMA is not set
CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_CAN is not set
# CONFIG_RT_USING_HWTIMER is not set
CONFIG_RT_USING_CPUTIME=y
+CONFIG_RT_USING_CPUTIME_CORTEXM=y
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
-# CONFIG_RT_USING_MTD is not set
# CONFIG_RT_USING_PM is not set
# CONFIG_RT_USING_RTC is not set
# CONFIG_RT_USING_SDIO is not set
@@ -128,10 +138,10 @@ CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_WDT is not set
# CONFIG_RT_USING_AUDIO is not set
# CONFIG_RT_USING_SENSOR is not set
-
-#
-# Using WiFi
-#
+# CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
# CONFIG_RT_USING_WIFI is not set
#
@@ -145,6 +155,7 @@ CONFIG_RT_USING_PIN=y
#
CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_PTHREADS is not set
+# CONFIG_RT_USING_MODULE is not set
#
# Network
@@ -156,14 +167,14 @@ CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_SAL is not set
#
-# light weight TCP/IP stack
+# Network interface device
#
-# CONFIG_RT_USING_LWIP is not set
+# CONFIG_RT_USING_NETDEV is not set
#
-# Modbus master and slave stack
+# light weight TCP/IP stack
#
-# CONFIG_RT_USING_MODBUS is not set
+# CONFIG_RT_USING_LWIP is not set
#
# AT commands
@@ -178,10 +189,10 @@ CONFIG_RT_USING_LIBC=y
#
# Utilities
#
-# CONFIG_RT_USING_LOGTRACE is not set
# CONFIG_RT_USING_RYM is not set
# CONFIG_RT_USING_ULOG is not set
# CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_LWP is not set
#
# RT-Thread online packages
@@ -190,14 +201,20 @@ CONFIG_RT_USING_LIBC=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
@@ -219,6 +236,8 @@ CONFIG_RT_USING_LIBC=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
@@ -230,12 +249,32 @@ CONFIG_RT_USING_LIBC=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_IOTKIT 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
@@ -243,6 +282,8 @@ CONFIG_RT_USING_LIBC=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
@@ -257,6 +298,9 @@ CONFIG_RT_USING_LIBC=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
@@ -269,16 +313,27 @@ CONFIG_RT_USING_LIBC=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
#
# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON 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
@@ -286,6 +341,16 @@ CONFIG_RT_USING_LIBC=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
@@ -293,7 +358,7 @@ CONFIG_RT_USING_LIBC=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_AP3216C 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
@@ -302,14 +367,44 @@ CONFIG_RT_USING_LIBC=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
# CONFIG_PKG_USING_PCA9685 is not set
+# 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
@@ -320,12 +415,15 @@ CONFIG_RT_USING_LIBC=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
@@ -337,6 +435,53 @@ CONFIG_RT_USING_LIBC=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_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
#
# Hardware Drivers Config
@@ -355,7 +500,10 @@ CONFIG_BSP_USING_LPUART1=y
#
# Onboard Peripheral Drivers
#
+# CONFIG_BSP_USING_SDRAM is not set
+# CONFIG_BSP_USING_ETH is not set
#
# Board extended module Drivers
#
+CONFIG_SOC_IMXRT1064=y
diff --git a/bsp/imxrt/imxrt1064-nxp-evk/Kconfig b/bsp/imxrt/imxrt1064-nxp-evk/Kconfig
index c9221717cb4e42111c0276448be858c983657b2b..1d44b9ded2a25d0fa3f63a7be014f5815962b229 100644
--- a/bsp/imxrt/imxrt1064-nxp-evk/Kconfig
+++ b/bsp/imxrt/imxrt1064-nxp-evk/Kconfig
@@ -14,3 +14,9 @@ source "$RTT_DIR/Kconfig"
source "$PKGS_DIR/Kconfig"
source "../libraries/Kconfig"
source "board/Kconfig"
+
+config SOC_IMXRT1064
+ bool
+ select ARCH_ARM_CORTEX_M7
+ select RT_USING_CACHE
+ default y
diff --git a/bsp/imxrt/imxrt1064-nxp-evk/rtconfig.h b/bsp/imxrt/imxrt1064-nxp-evk/rtconfig.h
index dfba538fd70a13f67217545877c02afa2b15628b..642cb532d83c0c6020d60226a8997b430f51a27d 100644
--- a/bsp/imxrt/imxrt1064-nxp-evk/rtconfig.h
+++ b/bsp/imxrt/imxrt1064-nxp-evk/rtconfig.h
@@ -10,7 +10,7 @@
#define RT_ALIGN_SIZE 4
#define RT_THREAD_PRIORITY_32
#define RT_THREAD_PRIORITY_MAX 32
-#define RT_TICK_PER_SECOND 100
+#define RT_TICK_PER_SECOND 1000
#define RT_USING_OVERFLOW_CHECK
#define RT_USING_HOOK
#define RT_USING_IDLE_HOOK
@@ -40,7 +40,12 @@
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart1"
-#define RT_VER_NUM 0x40001
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
+#define RT_USING_CPU_FFS
+#define ARCH_ARM
+#define ARCH_ARM_CORTEX_M
+#define ARCH_ARM_CORTEX_M7
/* RT-Thread Components */
@@ -78,11 +83,9 @@
#define RT_USING_SERIAL
#define RT_SERIAL_RB_BUFSZ 64
#define RT_USING_CPUTIME
+#define RT_USING_CPUTIME_CORTEXM
#define RT_USING_PIN
-/* Using WiFi */
-
-
/* Using USB */
@@ -95,10 +98,10 @@
/* Socket abstraction layer */
-/* light weight TCP/IP stack */
+/* Network interface device */
-/* Modbus master and slave stack */
+/* light weight TCP/IP stack */
/* AT commands */
@@ -150,6 +153,12 @@
/* samples: kernel and components samples */
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
+
/* Hardware Drivers Config */
#define BSP_USING_4MFLASH
@@ -163,7 +172,9 @@
/* Onboard Peripheral Drivers */
+
/* Board extended module Drivers */
+#define SOC_IMXRT1064
#endif
diff --git a/bsp/lpc176x/rtconfig.h b/bsp/lpc176x/rtconfig.h
index 6b28d64d326ca796bb6cdcf735724b7690ef4f82..adc9d5105d4d067627d1ed183c248b105b0da9d8 100644
--- a/bsp/lpc176x/rtconfig.h
+++ b/bsp/lpc176x/rtconfig.h
@@ -92,7 +92,7 @@
//
//
-// #define RT_USING_LIBC
+#define RT_USING_LIBC
//
// #define RT_USING_PTHREADS
//
diff --git a/bsp/lpc178x/rtconfig.h b/bsp/lpc178x/rtconfig.h
index 25f99888f751bb59459e04ba1d109dc5ed3d6a30..798ba4a50b6bab7862913965c8502ae09e0ef444 100644
--- a/bsp/lpc178x/rtconfig.h
+++ b/bsp/lpc178x/rtconfig.h
@@ -88,6 +88,7 @@
//
//
+#define RT_USING_LIBC
//
// #define RT_USING_NEWLIB
//
diff --git a/bsp/lpc408x/.config b/bsp/lpc408x/.config
index b07e256c2620311ff2c689882f95c38eaac3353f..844d162e98e16430b31c3ab05a4f744371ebcd9c 100644
--- a/bsp/lpc408x/.config
+++ b/bsp/lpc408x/.config
@@ -8,6 +8,7 @@
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -65,11 +66,12 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
CONFIG_RT_VER_NUM=0x40003
-CONFIG_ARCH_ARM=y
+# CONFIG_RT_USING_CACHE is not set
CONFIG_RT_USING_CPU_FFS=y
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
CONFIG_ARCH_ARM_CORTEX_M=y
CONFIG_ARCH_ARM_CORTEX_M4=y
-# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
#
# RT-Thread Components
@@ -131,6 +133,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 is not set
+# CONFIG_RT_USING_DFS_CROMFS is not set
# CONFIG_RT_USING_DFS_RAMFS is not set
# CONFIG_RT_USING_DFS_UFFS is not set
# CONFIG_RT_USING_DFS_JFFS2 is not set
@@ -148,6 +151,7 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY is not set
CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
@@ -176,9 +180,14 @@ CONFIG_RT_USING_PIN=y
#
# POSIX layer and C standard library
#
-# CONFIG_RT_USING_LIBC is not set
+CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_PTHREADS is not set
-CONFIG_RT_LIBC_USING_TIME=y
+CONFIG_RT_USING_POSIX=y
+# CONFIG_RT_USING_POSIX_MMAP is not set
+# CONFIG_RT_USING_POSIX_TERMIOS is not set
+# CONFIG_RT_USING_POSIX_GETLINE is not set
+# CONFIG_RT_USING_POSIX_AIO is not set
+# CONFIG_RT_USING_MODULE is not set
#
# Network
@@ -295,6 +304,9 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -320,6 +332,7 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -340,6 +353,7 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -368,6 +382,7 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -419,6 +434,9 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -457,6 +475,45 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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_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_LPC4088=y
#
diff --git a/bsp/lpc408x/rtconfig.h b/bsp/lpc408x/rtconfig.h
index 25bba085a6490ff33c62909adc2286c2d04fe6bc..1d621a5719df0c24ee0439215f5667fdeef0a2d8 100644
--- a/bsp/lpc408x/rtconfig.h
+++ b/bsp/lpc408x/rtconfig.h
@@ -41,8 +41,8 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_VER_NUM 0x40003
-#define ARCH_ARM
#define RT_USING_CPU_FFS
+#define ARCH_ARM
#define ARCH_ARM_CORTEX_M
#define ARCH_ARM_CORTEX_M4
@@ -107,7 +107,8 @@
/* POSIX layer and C standard library */
-#define RT_LIBC_USING_TIME
+#define RT_USING_LIBC
+#define RT_USING_POSIX
/* Network */
@@ -168,6 +169,12 @@
/* samples: kernel and components samples */
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
#define SOC_LPC4088
/* Hardware Drivers Config */
diff --git a/bsp/mini2440/.config b/bsp/mini2440/.config
index 1e1372162c24f6c9f740998632ebfe2295a7280d..97c5a7151996a3f1edbcd5371fe7ec3af4d22485 100644
--- a/bsp/mini2440/.config
+++ b/bsp/mini2440/.config
@@ -9,6 +9,7 @@ CONFIG_BOARD_MINI2440=y
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -69,10 +70,11 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart"
CONFIG_RT_VER_NUM=0x40003
-CONFIG_ARCH_ARM=y
+CONFIG_RT_USING_CACHE=y
# CONFIG_RT_USING_CPU_FFS is not set
-CONFIG_ARCH_ARM_ARM9=y
# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+CONFIG_ARCH_ARM_ARM9=y
#
# RT-Thread Components
@@ -134,6 +136,7 @@ CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=512
CONFIG_RT_DFS_ELM_REENTRANT=y
CONFIG_RT_USING_DFS_DEVFS=y
# CONFIG_RT_USING_DFS_ROMFS is not set
+# 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
@@ -154,8 +157,10 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
@@ -193,6 +198,7 @@ CONFIG_PTHREAD_NUM_MAX=8
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=y
CONFIG_RT_USING_CUSTOM_DLMODULE=y
@@ -230,9 +236,10 @@ CONFIG_NETDEV_IPV6=0
#
CONFIG_RT_USING_LWIP=y
# CONFIG_RT_USING_LWIP141 is not set
-# CONFIG_RT_USING_LWIP202 is not set
-CONFIG_RT_USING_LWIP210=y
+CONFIG_RT_USING_LWIP202=y
+# 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=y
CONFIG_RT_LWIP_ICMP=y
# CONFIG_RT_LWIP_SNMP is not set
@@ -274,6 +281,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=y
CONFIG_LWIP_NETIF_LOOPBACK=1
CONFIG_RT_LWIP_STATS=y
@@ -309,12 +317,15 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=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
@@ -341,6 +352,7 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=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
@@ -353,7 +365,7 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=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
@@ -375,6 +387,10 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
# 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
@@ -383,6 +399,7 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
# 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
@@ -399,6 +416,7 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
# 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
@@ -417,6 +435,9 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
# 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
@@ -428,6 +449,7 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=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
@@ -440,6 +462,11 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
# 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
@@ -458,6 +485,8 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
# 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
@@ -475,12 +504,23 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
# 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
@@ -517,3 +557,46 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
# 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
diff --git a/bsp/mini2440/Kconfig b/bsp/mini2440/Kconfig
index 48e4f26a38ab111b9ee8fc5c806e655aebdc3f95..4040e73c9f5362a64749a14ea048a901afbfc227 100644
--- a/bsp/mini2440/Kconfig
+++ b/bsp/mini2440/Kconfig
@@ -20,6 +20,7 @@ config BOARD_MINI2440
select ARCH_ARM_ARM9
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
choice
diff --git a/bsp/mini2440/rtconfig.h b/bsp/mini2440/rtconfig.h
index 37c215bdd0e99dc3aa29c693d220178414888747..6c6156c1531925d05435810ebf1f8c4e0542f24c 100644
--- a/bsp/mini2440/rtconfig.h
+++ b/bsp/mini2440/rtconfig.h
@@ -45,6 +45,7 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart"
#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
#define ARCH_ARM
#define ARCH_ARM_ARM9
@@ -153,7 +154,8 @@
/* light weight TCP/IP stack */
#define RT_USING_LWIP
-#define RT_USING_LWIP210
+#define RT_USING_LWIP202
+#define RT_LWIP_MEM_ALIGNMENT 4
#define RT_LWIP_IGMP
#define RT_LWIP_ICMP
#define RT_LWIP_DNS
@@ -189,6 +191,7 @@
#define LWIP_SO_RCVTIMEO 1
#define LWIP_SO_SNDTIMEO 1
#define LWIP_SO_RCVBUF 1
+#define LWIP_SO_LINGER 0
#define RT_LWIP_NETIF_LOOPBACK
#define LWIP_NETIF_LOOPBACK 1
#define RT_LWIP_STATS
@@ -246,4 +249,10 @@
/* samples: kernel and components samples */
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
+
#endif
diff --git a/bsp/qemu-vexpress-a9/.config b/bsp/qemu-vexpress-a9/.config
index d333d8865b29330351b3976c2abb47b0deef3355..3a3fa62497f8b53ed42431d1b316d5bbd1bc7622 100644
--- a/bsp/qemu-vexpress-a9/.config
+++ b/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
@@ -20,7 +21,7 @@ CONFIG_RT_USING_OVERFLOW_CHECK=y
CONFIG_RT_USING_HOOK=y
CONFIG_RT_USING_IDLE_HOOK=y
CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
-CONFIG_IDLE_THREAD_STACK_SIZE=1024
+CONFIG_IDLE_THREAD_STACK_SIZE=4096
CONFIG_RT_USING_TIMER_SOFT=y
CONFIG_RT_TIMER_THREAD_PRIO=4
CONFIG_RT_TIMER_THREAD_STACK_SIZE=1024
@@ -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_ARCH_ARM=y
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
# CONFIG_RT_USING_CPU_FFS is not set
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+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_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_RT_BACKTRACE_FUNCTION_NAME=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
@@ -94,13 +102,13 @@ CONFIG_RT_USING_CPLUSPLUS=y
CONFIG_RT_USING_FINSH=y
CONFIG_FINSH_THREAD_NAME="tshell"
CONFIG_FINSH_USING_HISTORY=y
-CONFIG_FINSH_HISTORY_LINES=5
+CONFIG_FINSH_HISTORY_LINES=10
CONFIG_FINSH_USING_SYMTAB=y
CONFIG_FINSH_USING_DESCRIPTION=y
# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
CONFIG_FINSH_THREAD_PRIORITY=20
CONFIG_FINSH_THREAD_STACK_SIZE=4096
-CONFIG_FINSH_CMD_SIZE=80
+CONFIG_FINSH_CMD_SIZE=256
# CONFIG_FINSH_USING_AUTH is not set
CONFIG_FINSH_USING_MSH=y
CONFIG_FINSH_USING_MSH_DEFAULT=y
@@ -112,9 +120,9 @@ 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_DFS_FD_MAX=32
# CONFIG_RT_USING_DFS_MNTTABLE is not set
CONFIG_RT_USING_DFS_ELMFAT=y
@@ -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
@@ -150,19 +159,24 @@ CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048
CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23
CONFIG_RT_USING_SERIAL=y
CONFIG_RT_SERIAL_USING_DMA=y
-CONFIG_RT_SERIAL_RB_BUFSZ=64
+CONFIG_RT_SERIAL_RB_BUFSZ=256
# CONFIG_RT_USING_CAN is not set
# 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_PHY 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_NULL is not set
+CONFIG_RT_USING_RANDOM=y
# 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 +195,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 +203,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 +218,13 @@ 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_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 +262,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 +293,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 +306,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 +314,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 +332,11 @@ 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
#
# RT-Thread online packages
@@ -332,14 +345,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 +380,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 +393,33 @@ 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
+# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set
#
# security packages
@@ -386,6 +427,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 +443,11 @@ 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
+# CONFIG_PKG_USING_AZUREGUIX is not set
+# CONFIG_PKG_USING_TOUCHGFX2RTT is not set
#
# tools packages
@@ -412,6 +460,18 @@ 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_MEMORYPERF 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
+# CONFIG_PKG_USING_LWRB2RTT is not set
+# CONFIG_PKG_USING_CPU_USAGE is not set
#
# system packages
@@ -423,6 +483,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 +491,25 @@ 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
+
+#
+# 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
#
# peripheral libraries and drivers
@@ -437,6 +517,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 +526,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 +543,30 @@ 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
+# CONFIG_PKG_USING_SSD1306 is not set
+# CONFIG_PKG_USING_QKEY is not set
+# CONFIG_PKG_USING_RS485 is not set
#
# miscellaneous packages
@@ -466,12 +577,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
@@ -482,9 +596,72 @@ CONFIG_RT_USING_LWP=y
# 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
+
+#
+# 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_VIRTUAL_DEVICE is not set
+# CONFIG_PKG_USING_SMODULE is not set
+# CONFIG_PKG_USING_SNFD 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
diff --git a/bsp/qemu-vexpress-a9/.gitignore b/bsp/qemu-vexpress-a9/.gitignore
index fba5a7a92ebed8855971b5a8a20308dcdd96e170..0ce2d51447d4e9a98b2429f171655766260f06be 100644
--- a/bsp/qemu-vexpress-a9/.gitignore
+++ b/bsp/qemu-vexpress-a9/.gitignore
@@ -42,3 +42,4 @@ settings/
cconfig.h
.settings
drivers/automac.h
+romfs.c
diff --git a/bsp/qemu-vexpress-a9/Kconfig b/bsp/qemu-vexpress-a9/Kconfig
index 25921e6e7c61267fa3ac5a0c6fafaf61ca729cbb..4f518f891fcd1e35771e1e28f48194498b582167 100644
--- a/bsp/qemu-vexpress-a9/Kconfig
+++ b/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
diff --git a/bsp/qemu-vexpress-a9/SConscript b/bsp/qemu-vexpress-a9/SConscript
index fe0ae941ae9a759ae478de901caec1c961e56af8..c7ef7659ecea92b1dd9b71a97736a8552ee02551 100644
--- a/bsp/qemu-vexpress-a9/SConscript
+++ b/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)
diff --git a/bsp/qemu-vexpress-a9/SConstruct b/bsp/qemu-vexpress-a9/SConstruct
index ddfe03da28069040e4db9e96b30b6a4d0e2dba4f..e1bc58f2c0b68d97bda381cde3e5456dcddcc7aa 100644
--- a/bsp/qemu-vexpress-a9/SConstruct
+++ b/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')
diff --git a/bsp/qemu-vexpress-a9/applications/SConscript b/bsp/qemu-vexpress-a9/applications/SConscript
index 2ec6848e1dde4b705a2515ce2593b73bcdda0b38..89083a964a159e254033baaa552061b3f03addb0 100644
--- a/bsp/qemu-vexpress-a9/applications/SConscript
+++ b/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)
diff --git a/bsp/qemu-vexpress-a9/applications/main.c b/bsp/qemu-vexpress-a9/applications/main.c
index d59513bce87ec6d98d1b704ffb8ada261ce7acc3..d6a5fedd0719e44aec0cb01f9a2fa14c883d6569 100644
--- a/bsp/qemu-vexpress-a9/applications/main.c
+++ b/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
#include
#include
diff --git a/bsp/qemu-vexpress-a9/applications/mnt.c b/bsp/qemu-vexpress-a9/applications/mnt.c
index de2cd0b87cc42d869990e9583cd5f13af71ac9d5..bb5c977e8848c4b7c69a1196fd709cc31564abde 100644
--- a/bsp/qemu-vexpress-a9/applications/mnt.c
+++ b/bsp/qemu-vexpress-a9/applications/mnt.c
@@ -2,16 +2,24 @@
#ifdef RT_USING_DFS
#include
+#include
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);
diff --git a/bsp/qemu-vexpress-a9/applications/romfs.c b/bsp/qemu-vexpress-a9/applications/romfs.c
new file mode 100644
index 0000000000000000000000000000000000000000..c28ba8ea7f2e52f05d808138b39f60d531ee57a2
--- /dev/null
+++ b/bsp/qemu-vexpress-a9/applications/romfs.c
@@ -0,0 +1,16 @@
+/* Generated by mkromfs. Edit with caution. */
+#include
+#include
+
+
+
+
+
+static const struct romfs_dirent _romfs_root[] = {
+ {ROMFS_DIRENT_DIR, "etc", RT_NULL, 0},
+ {ROMFS_DIRENT_DIR, "mnt", RT_NULL, 0}
+};
+
+const struct romfs_dirent romfs_root = {
+ ROMFS_DIRENT_DIR, "/", (rt_uint8_t *)_romfs_root, sizeof(_romfs_root)/sizeof(_romfs_root[0])
+};
diff --git a/bsp/qemu-vexpress-a9/drivers/Kconfig b/bsp/qemu-vexpress-a9/drivers/Kconfig
index d2aa5bc8e4cc568e85e1c9e9481d0b001d4d80f0..ce3d2c397893717c1c9965d1b7f7c13dc2999ca5 100644
--- a/bsp/qemu-vexpress-a9/drivers/Kconfig
+++ b/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
diff --git a/bsp/qemu-vexpress-a9/drivers/automac.h b/bsp/qemu-vexpress-a9/drivers/automac.h
deleted file mode 100644
index 5f08b79a41d262ffab75f25f61ecb6f4e20fdd5f..0000000000000000000000000000000000000000
--- a/bsp/qemu-vexpress-a9/drivers/automac.h
+++ /dev/null
@@ -1,15 +0,0 @@
-
-#ifndef __MAC_AUTO_GENERATE_H__
-#define __MAC_AUTO_GENERATE_H__
-
-/* Automatically generated file; DO NOT EDIT. */
-/* mac configure file for RT-Thread qemu */
-
-#define AUTOMAC0 0x52
-#define AUTOMAC1 0x54
-#define AUTOMAC2 0x00
-#define AUTOMAC3 0x28
-#define AUTOMAC4 0xae
-#define AUTOMAC5 0xeb
-
-#endif
diff --git a/bsp/qemu-vexpress-a9/drivers/board.c b/bsp/qemu-vexpress-a9/drivers/board.c
index e236c68b80b1f611bd8fe51b714228d8998ed7c4..2c6e172f0b5661295ba50cdeaf2ec45e57b2f6cb 100644
--- a/bsp/qemu-vexpress-a9/drivers/board.c
+++ b/bsp/qemu-vexpress-a9/drivers/board.c
@@ -18,11 +18,21 @@
#include "drv_timer.h"
#include
+#ifdef RT_USING_USERSPACE
+#include
+#include
+#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);
diff --git a/bsp/qemu-vexpress-a9/drivers/board.h b/bsp/qemu-vexpress-a9/drivers/board.h
index ccbe0f8c9e4c09c235d7a4bf117d9ef3f100aaea..9564ac41dc66e4a656a759afbc88e62d334f3770 100644
--- a/bsp/qemu-vexpress-a9/drivers/board.h
+++ b/bsp/qemu-vexpress-a9/drivers/board.h
@@ -15,9 +15,12 @@
#ifndef __BOARD_H__
#define __BOARD_H__
+#include
#include
#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
diff --git a/bsp/qemu-vexpress-a9/drivers/drv_clcd.c b/bsp/qemu-vexpress-a9/drivers/drv_clcd.c
index 62b5aa772d70de97477e0c7130d57bd666621763..389191a4e51daf57bdb49f93a37a4e7152784b3d 100644
--- a/bsp/qemu-vexpress-a9/drivers/drv_clcd.c
+++ b/bsp/qemu-vexpress-a9/drivers/drv_clcd.c
@@ -3,7 +3,13 @@
#include
#include
+#include
+
+#include
+#include
+
#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);
diff --git a/bsp/qemu-vexpress-a9/drivers/drv_keyboard.c b/bsp/qemu-vexpress-a9/drivers/drv_keyboard.c
index 246e053a60ed5d1dcbf01ddcdcbe2bca593c9ade..0074addafeb29878ed1b1a4e614e78fee61da271 100644
--- a/bsp/qemu-vexpress-a9/drivers/drv_keyboard.c
+++ b/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
+
diff --git a/bsp/qemu-vexpress-a9/drivers/drv_mouse.c b/bsp/qemu-vexpress-a9/drivers/drv_mouse.c
index 07e3ed16f6feeabd78664701eed2d8be38ca5881..d17aaff2f4191d7dc0eb6da318a38620ab142900 100644
--- a/bsp/qemu-vexpress-a9/drivers/drv_mouse.c
+++ b/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
+
diff --git a/bsp/qemu-vexpress-a9/drivers/drv_mouse.h b/bsp/qemu-vexpress-a9/drivers/drv_mouse.h
index c5d190950a6e1b49b0ea4ab46130a505b3eab3c3..cfceabc00d461735b863e4970711d7473161cceb 100644
--- a/bsp/qemu-vexpress-a9/drivers/drv_mouse.h
+++ b/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
\ No newline at end of file
diff --git a/bsp/qemu-vexpress-a9/drivers/drv_sdio.c b/bsp/qemu-vexpress-a9/drivers/drv_sdio.c
index 26282226273dbf1beba0f6698ac2751c04a270fa..4b363931ac5d6ac11c84f9bde0503f193330d65a 100644
--- a/bsp/qemu-vexpress-a9/drivers/drv_sdio.c
+++ b/bsp/qemu-vexpress-a9/drivers/drv_sdio.c
@@ -6,6 +6,7 @@
#include
#include
+#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) |
diff --git a/bsp/qemu-vexpress-a9/drivers/drv_smc911x.c b/bsp/qemu-vexpress-a9/drivers/drv_smc911x.c
index 91a931125567d641c154787804a564b7907c0e15..ac4d9713162da307c09e18abe7ff2a00dcc3eb63 100644
--- a/bsp/qemu-vexpress-a9/drivers/drv_smc911x.c
+++ b/bsp/qemu-vexpress-a9/drivers/drv_smc911x.c
@@ -1,16 +1,21 @@
#include
#include
+#include
#include
#include
-#include
+
+#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
+
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))
diff --git a/bsp/qemu-vexpress-a9/drivers/drv_timer.c b/bsp/qemu-vexpress-a9/drivers/drv_timer.c
index 7abfea0fae6fe1aa68b86ad9905a4d67c8ee987d..d05464c5874ea64eed5fd9dc616fe97b7d38a4b0 100644
--- a/bsp/qemu-vexpress-a9/drivers/drv_timer.c
+++ b/bsp/qemu-vexpress-a9/drivers/drv_timer.c
@@ -12,10 +12,17 @@
#include
#include
+#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;
diff --git a/bsp/qemu-vexpress-a9/drivers/realview.h b/bsp/qemu-vexpress-a9/drivers/realview.h
index 1a369dbdd053a8892f62b2e7048da67997d1030d..73e3aa7e2ae02e3451a19bf31830072c203481a4 100644
--- a/bsp/qemu-vexpress-a9/drivers/realview.h
+++ b/bsp/qemu-vexpress-a9/drivers/realview.h
@@ -316,6 +316,7 @@ struct rt_hw_register
unsigned long ORIG_r0;
};
+#include
#include
/* Interrupt Control Interface */
diff --git a/bsp/qemu-vexpress-a9/drivers/rt_lcd.h b/bsp/qemu-vexpress-a9/drivers/rt_lcd.h
new file mode 100644
index 0000000000000000000000000000000000000000..e496a871da38693db597dcc45ac9a181c8d0c55a
--- /dev/null
+++ b/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
diff --git a/bsp/qemu-vexpress-a9/drivers/secondary_cpu.c b/bsp/qemu-vexpress-a9/drivers/secondary_cpu.c
index 3b0428859f4a52c335cf63ea254dded17a56a461..5c43ec03bb307ffb38b1055fe637e4b987ab4b0c 100644
--- a/bsp/qemu-vexpress-a9/drivers/secondary_cpu.c
+++ b/bsp/qemu-vexpress-a9/drivers/secondary_cpu.c
@@ -19,6 +19,10 @@
#ifdef RT_USING_SMP
#include
+#ifdef RT_USING_USERSPACE
+#include
+#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);
diff --git a/bsp/qemu-vexpress-a9/drivers/serial.c b/bsp/qemu-vexpress-a9/drivers/serial.c
index 786a26a4ba0f115f594870da23094c6e647296d1..8c400030e8808c8f8ace540cbb513a5f650d6889 100644
--- a/bsp/qemu-vexpress-a9/drivers/serial.c
+++ b/bsp/qemu-vexpress-a9/drivers/serial.c
@@ -31,6 +31,8 @@
#include
#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;
diff --git a/bsp/qemu-vexpress-a9/gdb.init b/bsp/qemu-vexpress-a9/gdb.init
new file mode 100644
index 0000000000000000000000000000000000000000..b16f519fc68630344fcf9ff3405b4ac444410f78
--- /dev/null
+++ b/bsp/qemu-vexpress-a9/gdb.init
@@ -0,0 +1,3 @@
+target remote localhost:1234
+b *0x100010
+add-symbol-file ../../../userapps/gnu-apps/wget/wget-1.20/src/wget 0x100000
diff --git a/bsp/qemu-vexpress-a9/link.lds b/bsp/qemu-vexpress-a9/link.lds
index 797cd7e3ef8c0707525878d8665574b95186e615..ab4674d485a4788d467a6b246d2b3e65c2d5559e 100644
--- a/bsp/qemu-vexpress-a9/link.lds
+++ b/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.*) }
diff --git a/bsp/qemu-vexpress-a9/qemu-dbg.bat b/bsp/qemu-vexpress-a9/qemu-dbg.bat
index b4a04cf2a94d9fb42a2c56103d5b926d9d6908e8..9190b74398dd95584cabc86ab00a8927ee250934 100644
--- a/bsp/qemu-vexpress-a9/qemu-dbg.bat
+++ b/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
diff --git a/bsp/qemu-vexpress-a9/qemu-dbg.sh b/bsp/qemu-vexpress-a9/qemu-dbg.sh
index 44bc1ad9676e8a0c2abeb3446d32195da737cc19..4f2067cbc899a7c7199974e190ac584263ec7beb 100755
--- a/bsp/qemu-vexpress-a9/qemu-dbg.sh
+++ b/bsp/qemu-vexpress-a9/qemu-dbg.sh
@@ -2,5 +2,6 @@ if [ ! -f "sd.bin" ]; then
dd if=/dev/zero of=sd.bin bs=1024 count=65536
fi
+#qemu-system-arm -M vexpress-a9 -kernel rtthread.elf -serial vc -serial vc -sd sd.bin -S -s
+qemu-system-arm -M vexpress-a9 -kernel rtthread.bin -nographic -sd sd.bin -S -s
-qemu-system-arm -M vexpress-a9 -kernel rtthread.elf -serial vc -serial vc -sd sd.bin -S -s
\ No newline at end of file
diff --git a/bsp/qemu-vexpress-a9/qemu-nographic.bat b/bsp/qemu-vexpress-a9/qemu-nographic.bat
index 4b978dc967c878822c58a87553eaed5d1903fdff..323d70b77f264e37f67f77ca3ba13c63ad9f775c 100644
--- a/bsp/qemu-vexpress-a9/qemu-nographic.bat
+++ b/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
diff --git a/bsp/qemu-vexpress-a9/qemu-nographic.sh b/bsp/qemu-vexpress-a9/qemu-nographic.sh
index b4168b8d5c9f78c2ea23735cf04e558463721e83..5519c6c2213e4e3168781cf11b2b2c227ce8d95e 100755
--- a/bsp/qemu-vexpress-a9/qemu-nographic.sh
+++ b/bsp/qemu-vexpress-a9/qemu-nographic.sh
@@ -2,5 +2,4 @@ if [ ! -f "sd.bin" ]; then
dd if=/dev/zero of=sd.bin bs=1024 count=65536
fi
-qemu-system-arm -M vexpress-a9 -smp cpus=2 -kernel rtthread.bin -nographic -sd sd.bin -net nic -net tap
-
+qemu-system-arm -M vexpress-a9 -smp cpus=2 -kernel rtthread.bin -nographic -sd sd.bin
diff --git a/bsp/qemu-vexpress-a9/rtconfig.h b/bsp/qemu-vexpress-a9/rtconfig.h
index cec4ec6ba4b882c2af8cca0c2efb1c4208bcfba5..c429182d6c0bde43de130bfd2466ddc3a3e3e2d7 100644
--- a/bsp/qemu-vexpress-a9/rtconfig.h
+++ b/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
@@ -17,7 +18,7 @@
#define RT_USING_HOOK
#define RT_USING_IDLE_HOOK
#define RT_IDLE_HOOK_LIST_SIZE 4
-#define IDLE_THREAD_STACK_SIZE 1024
+#define IDLE_THREAD_STACK_SIZE 4096
#define RT_USING_TIMER_SOFT
#define RT_TIMER_THREAD_PRIO 4
#define RT_TIMER_THREAD_STACK_SIZE 1024
@@ -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 RT_USING_CACHE
#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
/* RT-Thread Components */
@@ -63,19 +70,18 @@
/* C++ features */
-#define RT_USING_CPLUSPLUS
/* Command shell */
#define RT_USING_FINSH
#define FINSH_THREAD_NAME "tshell"
#define FINSH_USING_HISTORY
-#define FINSH_HISTORY_LINES 5
+#define FINSH_HISTORY_LINES 10
#define FINSH_USING_SYMTAB
#define FINSH_USING_DESCRIPTION
#define FINSH_THREAD_PRIORITY 20
#define FINSH_THREAD_STACK_SIZE 4096
-#define FINSH_CMD_SIZE 80
+#define FINSH_CMD_SIZE 256
#define FINSH_USING_MSH
#define FINSH_USING_MSH_DEFAULT
#define FINSH_ARG_MAX 10
@@ -84,9 +90,9 @@
#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 DFS_FD_MAX 32
#define RT_USING_DFS_ELMFAT
/* elm-chan's FatFs, Generic FAT Filesystem Module */
@@ -112,10 +118,11 @@
#define RT_SYSTEM_WORKQUEUE_PRIORITY 23
#define RT_USING_SERIAL
#define RT_SERIAL_USING_DMA
-#define RT_SERIAL_RB_BUFSZ 64
+#define RT_SERIAL_RB_BUFSZ 256
#define RT_USING_I2C
#define RT_USING_I2C_BITOPS
#define RT_USING_PIN
+#define RT_USING_RANDOM
#define RT_USING_MTD_NOR
#define RT_USING_MTD_NAND
#define RT_MTD_NAND_DEBUG
@@ -132,22 +139,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 +179,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 +204,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 +215,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 +226,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 */
@@ -259,6 +264,9 @@
/* system packages */
+/* Micrium: Micrium software products porting for RT-Thread */
+
+
/* peripheral libraries and drivers */
@@ -267,9 +275,21 @@
/* samples: kernel and components samples */
+
+/* games: games run on RT-Thread console */
+
+
+/* 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
diff --git a/bsp/qemu-vexpress-a9/rtconfig.py b/bsp/qemu-vexpress-a9/rtconfig.py
index 49727b6d202b2f6aa78172cfa6c0fda7bcd6ca6a..bfb911b176c22e53607bf760aae24c84a712dc7f 100644
--- a/bsp/qemu-vexpress-a9/rtconfig.py
+++ b/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'
diff --git a/bsp/qemu-vexpress-gemini/.config b/bsp/qemu-vexpress-gemini/.config
index 8be74ae0c02e8c91868088cc3b760f4c3ac124a3..01ce42ff807225c31ebba8a1a9a4925340038b28 100644
--- a/bsp/qemu-vexpress-gemini/.config
+++ b/bsp/qemu-vexpress-gemini/.config
@@ -7,6 +7,9 @@
# RT-Thread Kernel
#
CONFIG_RT_NAME_MAX=6
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
+# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
CONFIG_RT_THREAD_PRIORITY_32=y
@@ -15,6 +18,7 @@ CONFIG_RT_THREAD_PRIORITY_MAX=32
CONFIG_RT_TICK_PER_SECOND=1000
CONFIG_RT_USING_OVERFLOW_CHECK=y
CONFIG_RT_USING_HOOK=y
+CONFIG_RT_USING_IDLE_HOOK=y
CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
CONFIG_IDLE_THREAD_STACK_SIZE=512
# CONFIG_RT_USING_TIMER_SOFT is not set
@@ -61,10 +65,15 @@ CONFIG_RT_USING_INTERRUPT_INFO=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
-# CONFIG_RT_USING_MODULE is not set
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
+# CONFIG_RT_USING_CPU_FFS is not set
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
CONFIG_ARCH_ARM=y
+# CONFIG_RT_IOREMAP_LATE is not set
CONFIG_ARCH_ARM_CORTEX_A=y
CONFIG_ARCH_ARM_CORTEX_A9=y
+# CONFIG_RT_BACKTRACE_FUNCTION_NAME is not set
#
# RT-Thread Components
@@ -108,32 +117,43 @@ CONFIG_DFS_FD_MAX=4
# CONFIG_RT_USING_DFS_ELMFAT is not set
CONFIG_RT_USING_DFS_DEVFS=y
# CONFIG_RT_USING_DFS_ROMFS is not set
+# CONFIG_RT_USING_DFS_CROMFS is not set
# CONFIG_RT_USING_DFS_RAMFS is not set
# CONFIG_RT_USING_DFS_UFFS is not set
# CONFIG_RT_USING_DFS_JFFS2 is not set
-# CONFIG_RT_USING_DFS_NFS is not set
#
# Device Drivers
#
CONFIG_RT_USING_DEVICE_IPC=y
CONFIG_RT_PIPE_BUFSZ=512
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
CONFIG_RT_USING_SERIAL=y
CONFIG_RT_SERIAL_USING_DMA=y
+CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_CAN is not set
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
+# CONFIG_RT_USING_PM is not set
# CONFIG_RT_USING_RTC is not set
# CONFIG_RT_USING_SDIO is not set
# CONFIG_RT_USING_SPI is not set
# CONFIG_RT_USING_WDT is not set
-# CONFIG_RT_USING_WIFI is not set
# CONFIG_RT_USING_AUDIO is not set
+# CONFIG_RT_USING_SENSOR is not set
+# CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
+# CONFIG_RT_USING_WIFI is not set
#
# Using USB
@@ -146,10 +166,13 @@ CONFIG_RT_USING_PIN=y
#
CONFIG_RT_USING_LIBC=y
CONFIG_RT_USING_PTHREADS=y
+CONFIG_PTHREAD_NUM_MAX=8
CONFIG_RT_USING_POSIX=y
# CONFIG_RT_USING_POSIX_MMAP is not set
# CONFIG_RT_USING_POSIX_TERMIOS is not set
+# CONFIG_RT_USING_POSIX_GETLINE is not set
# CONFIG_RT_USING_POSIX_AIO is not set
+# CONFIG_RT_USING_MODULE is not set
#
# Network
@@ -161,14 +184,14 @@ CONFIG_RT_USING_POSIX=y
# CONFIG_RT_USING_SAL is not set
#
-# light weight TCP/IP stack
+# Network interface device
#
-# CONFIG_RT_USING_LWIP is not set
+# CONFIG_RT_USING_NETDEV is not set
#
-# Modbus master and slave stack
+# light weight TCP/IP stack
#
-# CONFIG_RT_USING_MODBUS is not set
+# CONFIG_RT_USING_LWIP is not set
#
# AT commands
@@ -192,16 +215,10 @@ CONFIG_RT_VBUS_RFS_DEV_NAME="rfs"
#
# Utilities
#
-CONFIG_RT_USING_LOGTRACE=y
-CONFIG_LOG_TRACE_MAX_SESSION=16
-# CONFIG_LOG_TRACE_USING_LEVEL_NOTRACE is not set
-# CONFIG_LOG_TRACE_USING_LEVEL_ERROR is not set
-# CONFIG_LOG_TRACE_USING_LEVEL_WARNING is not set
-CONFIG_LOG_TRACE_USING_LEVEL_INFO=y
-# CONFIG_LOG_TRACE_USING_LEVEL_VERBOSE is not set
-# CONFIG_LOG_TRACE_USING_LEVEL_DEBUG is not set
-# CONFIG_LOG_TRACE_USING_MEMLOG is not set
# CONFIG_RT_USING_RYM is not set
+# CONFIG_RT_USING_ULOG is not set
+# CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_LWP is not set
#
# RT-Thread online packages
@@ -210,12 +227,20 @@ CONFIG_LOG_TRACE_USING_LEVEL_INFO=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
@@ -233,10 +258,15 @@ CONFIG_LOG_TRACE_USING_LEVEL_INFO=y
# Wiced WiFi
#
# CONFIG_PKG_USING_WLAN_WICED is not set
+# CONFIG_PKG_USING_RW007 is not set
# 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
#
# IoT Cloud
@@ -245,6 +275,32 @@ CONFIG_LOG_TRACE_USING_LEVEL_INFO=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_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
@@ -252,6 +308,8 @@ CONFIG_LOG_TRACE_USING_LEVEL_INFO=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
@@ -265,6 +323,10 @@ CONFIG_LOG_TRACE_USING_LEVEL_INFO=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
@@ -273,6 +335,19 @@ CONFIG_LOG_TRACE_USING_LEVEL_INFO=y
# CONFIG_PKG_USING_EASYFLASH is not set
# CONFIG_PKG_USING_EASYLOGGER is not set
# CONFIG_PKG_USING_SYSTEMVIEW 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
+# 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
@@ -284,18 +359,78 @@ CONFIG_LOG_TRACE_USING_LEVEL_INFO=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
+# 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_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
#
-# CONFIG_PKG_USING_STM32F4_HAL is not set
-# CONFIG_PKG_USING_STM32F4_DRIVERS is not set
+# 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_AHT10 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
+# CONFIG_PKG_USING_BUTTON is not set
+# CONFIG_PKG_USING_PCF8574 is not set
+# 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
+# CONFIG_PKG_USING_PCA9685 is not set
+# 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
@@ -306,19 +441,73 @@ CONFIG_LOG_TRACE_USING_LEVEL_INFO=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
#
-# sample package
-#
-# CONFIG_PKG_USING_SAMPLES is not set
-
-#
-# example package: hello
+# 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_SOC_VEXPRESS_GEMINI=y
+# 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_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 is not set
CONFIG_RT_USING_UART1=y
diff --git a/bsp/qemu-vexpress-gemini/Kconfig b/bsp/qemu-vexpress-gemini/Kconfig
index e86e36974747c5e91c116810f6290c6b719477bf..425a81578ecbb4a75ca131b0bd41301ed1650c5f 100644
--- a/bsp/qemu-vexpress-gemini/Kconfig
+++ b/bsp/qemu-vexpress-gemini/Kconfig
@@ -18,9 +18,10 @@ config PKGS_DIR
source "$RTT_DIR/Kconfig"
source "$PKGS_DIR/Kconfig"
-config SOC_VEXPRESS_GEMINI
+config SOC_VEXPRESS_A9
bool
select ARCH_ARM_CORTEX_A9
+ select RT_USING_CACHE
select RT_USING_COMPONENTS_INIT
# select RT_USING_USER_MAIN
default y
diff --git a/bsp/qemu-vexpress-gemini/rtconfig.h b/bsp/qemu-vexpress-gemini/rtconfig.h
index 0d7ead92ddca7afcdff365014c39129add9800e8..190aa3520d11b12a4ef634a0d5ebe2b50d7acdc0 100644
--- a/bsp/qemu-vexpress-gemini/rtconfig.h
+++ b/bsp/qemu-vexpress-gemini/rtconfig.h
@@ -8,28 +8,16 @@
#define RT_NAME_MAX 6
#define RT_ALIGN_SIZE 4
-/* RT_THREAD_PRIORITY_8 is not set */
#define RT_THREAD_PRIORITY_32
-/* RT_THREAD_PRIORITY_256 is not set */
#define RT_THREAD_PRIORITY_MAX 32
#define RT_TICK_PER_SECOND 1000
#define RT_USING_OVERFLOW_CHECK
#define RT_USING_HOOK
+#define RT_USING_IDLE_HOOK
#define RT_IDLE_HOOK_LIST_SIZE 4
#define IDLE_THREAD_STACK_SIZE 512
-/* RT_USING_TIMER_SOFT is not set */
#define RT_DEBUG
#define RT_DEBUG_COLOR
-/* RT_DEBUG_INIT_CONFIG is not set */
-/* RT_DEBUG_THREAD_CONFIG is not set */
-/* RT_DEBUG_SCHEDULER_CONFIG is not set */
-/* RT_DEBUG_IPC_CONFIG is not set */
-/* RT_DEBUG_TIMER_CONFIG is not set */
-/* RT_DEBUG_IRQ_CONFIG is not set */
-/* RT_DEBUG_MEM_CONFIG is not set */
-/* RT_DEBUG_SLAB_CONFIG is not set */
-/* RT_DEBUG_MEMHEAP_CONFIG is not set */
-/* RT_DEBUG_MODULE_CONFIG is not set */
/* Inter-Thread communication */
@@ -38,27 +26,22 @@
#define RT_USING_EVENT
#define RT_USING_MAILBOX
#define RT_USING_MESSAGEQUEUE
-/* RT_USING_SIGNALS is not set */
/* Memory Management */
#define RT_USING_MEMPOOL
-/* RT_USING_MEMHEAP is not set */
-/* RT_USING_NOHEAP is not set */
#define RT_USING_SMALL_MEM
-/* RT_USING_SLAB is not set */
-/* RT_USING_MEMTRACE is not set */
#define RT_USING_HEAP
/* Kernel Device Object */
#define RT_USING_DEVICE
-/* RT_USING_DEVICE_OPS is not set */
#define RT_USING_INTERRUPT_INFO
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart1"
-/* RT_USING_MODULE is not set */
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
#define ARCH_ARM
#define ARCH_ARM_CORTEX_A
#define ARCH_ARM_CORTEX_A9
@@ -66,11 +49,9 @@
/* RT-Thread Components */
#define RT_USING_COMPONENTS_INIT
-/* RT_USING_USER_MAIN is not set */
/* C++ features */
-/* RT_USING_CPLUSPLUS is not set */
/* Command shell */
@@ -80,14 +61,11 @@
#define FINSH_HISTORY_LINES 5
#define FINSH_USING_SYMTAB
#define FINSH_USING_DESCRIPTION
-/* FINSH_ECHO_DISABLE_DEFAULT is not set */
#define FINSH_THREAD_PRIORITY 20
#define FINSH_THREAD_STACK_SIZE 4096
#define FINSH_CMD_SIZE 80
-/* FINSH_USING_AUTH is not set */
#define FINSH_USING_MSH
#define FINSH_USING_MSH_DEFAULT
-/* FINSH_USING_MSH_ONLY is not set */
#define FINSH_ARG_MAX 10
/* Device virtual file system */
@@ -97,14 +75,7 @@
#define DFS_FILESYSTEMS_MAX 2
#define DFS_FILESYSTEM_TYPES_MAX 2
#define DFS_FD_MAX 4
-/* RT_USING_DFS_MNTTABLE is not set */
-/* RT_USING_DFS_ELMFAT is not set */
#define RT_USING_DFS_DEVFS
-/* RT_USING_DFS_ROMFS is not set */
-/* RT_USING_DFS_RAMFS is not set */
-/* RT_USING_DFS_UFFS is not set */
-/* RT_USING_DFS_JFFS2 is not set */
-/* RT_USING_DFS_NFS is not set */
/* Device Drivers */
@@ -112,58 +83,36 @@
#define RT_PIPE_BUFSZ 512
#define RT_USING_SERIAL
#define RT_SERIAL_USING_DMA
-/* RT_USING_CAN is not set */
-/* RT_USING_HWTIMER is not set */
-/* RT_USING_CPUTIME is not set */
-/* RT_USING_I2C is not set */
+#define RT_SERIAL_RB_BUFSZ 64
#define RT_USING_PIN
-/* RT_USING_PWM is not set */
-/* RT_USING_MTD_NOR is not set */
-/* RT_USING_MTD_NAND is not set */
-/* RT_USING_RTC is not set */
-/* RT_USING_SDIO is not set */
-/* RT_USING_SPI is not set */
-/* RT_USING_WDT is not set */
-/* RT_USING_WIFI is not set */
-/* RT_USING_AUDIO is not set */
/* Using USB */
-/* RT_USING_USB_HOST is not set */
-/* RT_USING_USB_DEVICE is not set */
/* POSIX layer and C standard library */
#define RT_USING_LIBC
#define RT_USING_PTHREADS
+#define PTHREAD_NUM_MAX 8
#define RT_USING_POSIX
-/* RT_USING_POSIX_MMAP is not set */
-/* RT_USING_POSIX_TERMIOS is not set */
-/* RT_USING_POSIX_AIO is not set */
/* Network */
/* Socket abstraction layer */
-/* RT_USING_SAL is not set */
-/* light weight TCP/IP stack */
+/* Network interface device */
-/* RT_USING_LWIP is not set */
-/* Modbus master and slave stack */
+/* light weight TCP/IP stack */
-/* RT_USING_MODBUS is not set */
/* AT commands */
-/* RT_USING_AT is not set */
/* VBUS(Virtual Software BUS) */
#define RT_USING_VBUS
-/* RT_USING_VBUS_RFS is not set */
-/* RT_USING_VBUS_RSHELL is not set */
#define RT_VBUS_USING_TESTS
#define _RT_VBUS_RING_BASE 0x6f800000
#define _RT_VBUS_RING_SZ 2097152
@@ -174,117 +123,53 @@
/* Utilities */
-#define LOG_TRACE_MAX_SESSION 16
-/* LOG_TRACE_USING_LEVEL_NOTRACE is not set */
-/* LOG_TRACE_USING_LEVEL_ERROR is not set */
-/* LOG_TRACE_USING_LEVEL_WARNING is not set */
-#define LOG_TRACE_USING_LEVEL_INFO
-/* LOG_TRACE_USING_LEVEL_VERBOSE is not set */
-/* LOG_TRACE_USING_LEVEL_DEBUG is not set */
-/* LOG_TRACE_USING_MEMLOG is not set */
-/* RT_USING_RYM is not set */
/* RT-Thread online packages */
/* IoT - internet of things */
-/* PKG_USING_PAHOMQTT is not set */
-/* PKG_USING_WEBCLIENT is not set */
-/* PKG_USING_MONGOOSE is not set */
-/* PKG_USING_WEBTERMINAL is not set */
-/* PKG_USING_CJSON is not set */
-/* PKG_USING_JSMN is not set */
-/* PKG_USING_LJSON is not set */
-/* PKG_USING_EZXML is not set */
-/* PKG_USING_NANOPB is not set */
/* Wi-Fi */
/* Marvell WiFi */
-/* PKG_USING_WLANMARVELL is not set */
/* Wiced WiFi */
-/* PKG_USING_WLAN_WICED is not set */
-/* PKG_USING_COAP is not set */
-/* PKG_USING_NOPOLL is not set */
-/* PKG_USING_NETUTILS is not set */
-/* PKG_USING_AT_DEVICE is not set */
/* IoT Cloud */
-/* PKG_USING_ONENET is not set */
-/* PKG_USING_GAGENT_CLOUD is not set */
-/* PKG_USING_ALI_IOTKIT is not set */
-/* PKG_USING_AZURE is not set */
/* security packages */
-/* PKG_USING_MBEDTLS is not set */
-/* PKG_USING_libsodium is not set */
-/* PKG_USING_TINYCRYPT is not set */
/* language packages */
-/* PKG_USING_LUA is not set */
-/* PKG_USING_JERRYSCRIPT is not set */
-/* PKG_USING_MICROPYTHON is not set */
/* multimedia packages */
-/* PKG_USING_OPENMV is not set */
-/* PKG_USING_MUPDF is not set */
/* tools packages */
-/* PKG_USING_CMBACKTRACE is not set */
-/* PKG_USING_EASYFLASH is not set */
-/* PKG_USING_EASYLOGGER is not set */
-/* PKG_USING_SYSTEMVIEW is not set */
/* system packages */
-/* PKG_USING_GUIENGINE is not set */
-/* PKG_USING_PERSIMMON is not set */
-/* PKG_USING_CAIRO is not set */
-/* PKG_USING_PIXMAN is not set */
-/* PKG_USING_LWEXT4 is not set */
-/* PKG_USING_PARTITION is not set */
-/* PKG_USING_FAL is not set */
-/* PKG_USING_SQLITE is not set */
-/* PKG_USING_RTI is not set */
-/* PKG_USING_LITTLEVGL2RTT is not set */
/* peripheral libraries and drivers */
-/* PKG_USING_STM32F4_HAL is not set */
-/* PKG_USING_STM32F4_DRIVERS is not set */
-/* PKG_USING_REALTEK_AMEBA is not set */
-/* PKG_USING_SHT2X is not set */
-/* PKG_USING_AHT10 is not set */
/* miscellaneous packages */
-/* PKG_USING_LIBCSV is not set */
-/* PKG_USING_OPTPARSE is not set */
-/* PKG_USING_FASTLZ is not set */
-/* PKG_USING_MINILZO is not set */
-/* PKG_USING_QUICKLZ is not set */
-/* PKG_USING_MULTIBUTTON is not set */
-/* PKG_USING_CANFESTIVAL is not set */
-/* PKG_USING_ZLIB is not set */
-/* PKG_USING_DSTR is not set */
-/* sample package */
+/* samples: kernel and components samples */
+
+
+/* Privated Packages of RealThread */
-/* PKG_USING_SAMPLES is not set */
-/* example package: hello */
+/* Network Utilities */
-/* PKG_USING_HELLO is not set */
-#define SOC_VEXPRESS_GEMINI
-/* RT_USING_UART0 is not set */
+#define SOC_VEXPRESS_A9
#define RT_USING_UART1
#endif
diff --git a/bsp/raspberry-pi/raspi3-32/.config b/bsp/raspberry-pi/raspi3-32/.config
index 78d7e6fbafa2a76ad1b194e9aa72db27b3a37ad5..29190154f7bb9f8637039fb6cf4fd6d4569b363c 100644
--- a/bsp/raspberry-pi/raspi3-32/.config
+++ b/bsp/raspberry-pi/raspi3-32/.config
@@ -8,6 +8,7 @@
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
CONFIG_RT_USING_SMP=y
CONFIG_RT_CPUS_NR=4
CONFIG_RT_ALIGN_SIZE=4
@@ -66,12 +67,15 @@ CONFIG_RT_USING_DEVICE_OPS=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
-CONFIG_RT_VER_NUM=0x40002
-CONFIG_ARCH_ARM=y
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
# CONFIG_RT_USING_CPU_FFS is not set
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+# CONFIG_RT_IOREMAP_LATE is not set
CONFIG_ARCH_ARM_CORTEX_A=y
CONFIG_ARCH_ARM_CORTEX_A7=y
-# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+# CONFIG_RT_BACKTRACE_FUNCTION_NAME is not set
#
# RT-Thread Components
@@ -133,6 +137,7 @@ CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=512
CONFIG_RT_DFS_ELM_REENTRANT=y
CONFIG_RT_USING_DFS_DEVFS=y
# CONFIG_RT_USING_DFS_ROMFS is not set
+# CONFIG_RT_USING_DFS_CROMFS is not set
# CONFIG_RT_USING_DFS_RAMFS is not set
# CONFIG_RT_USING_DFS_UFFS is not set
# CONFIG_RT_USING_DFS_JFFS2 is not set
@@ -150,9 +155,12 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
CONFIG_RT_USING_HWTIMER=y
# CONFIG_RT_USING_CPUTIME is not set
CONFIG_RT_USING_I2C=y
+# CONFIG_RT_I2C_DEBUG is not set
# CONFIG_RT_USING_I2C_BITOPS is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
@@ -178,6 +186,8 @@ CONFIG_RT_USING_WDT=y
# CONFIG_RT_USING_SENSOR is not set
# CONFIG_RT_USING_TOUCH is not set
# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
# CONFIG_RT_USING_WIFI is not set
#
@@ -194,6 +204,7 @@ CONFIG_RT_USING_LIBC=y
CONFIG_RT_USING_POSIX=y
# CONFIG_RT_USING_POSIX_MMAP is not set
# CONFIG_RT_USING_POSIX_TERMIOS is not set
+# CONFIG_RT_USING_POSIX_GETLINE is not set
# CONFIG_RT_USING_POSIX_AIO is not set
# CONFIG_RT_USING_MODULE is not set
@@ -241,10 +252,15 @@ CONFIG_RT_USING_POSIX=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
@@ -271,6 +287,8 @@ CONFIG_RT_USING_POSIX=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
@@ -282,7 +300,10 @@ CONFIG_RT_USING_POSIX=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
@@ -290,6 +311,21 @@ CONFIG_RT_USING_POSIX=y
# 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
@@ -297,6 +333,8 @@ CONFIG_RT_USING_POSIX=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
@@ -311,6 +349,9 @@ CONFIG_RT_USING_POSIX=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
@@ -323,6 +364,15 @@ CONFIG_RT_USING_POSIX=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
@@ -334,6 +384,7 @@ CONFIG_RT_USING_POSIX=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
@@ -341,6 +392,16 @@ CONFIG_RT_USING_POSIX=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
@@ -348,6 +409,7 @@ CONFIG_RT_USING_POSIX=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
@@ -356,10 +418,16 @@ CONFIG_RT_USING_POSIX=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
@@ -367,7 +435,27 @@ CONFIG_RT_USING_POSIX=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_LCD_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
@@ -378,12 +466,15 @@ CONFIG_RT_USING_POSIX=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
@@ -396,6 +487,52 @@ CONFIG_RT_USING_POSIX=y
# 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_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_BCM2836_SOC=y
#
diff --git a/bsp/raspberry-pi/raspi3-32/Kconfig b/bsp/raspberry-pi/raspi3-32/Kconfig
index f7693c837813f47b0315f2305537b4922259e3c8..25c2022babb2afd6fca5e37e2fa5142688dacab2 100644
--- a/bsp/raspberry-pi/raspi3-32/Kconfig
+++ b/bsp/raspberry-pi/raspi3-32/Kconfig
@@ -23,6 +23,7 @@ config BCM2836_SOC
select ARCH_ARM_CORTEX_A7
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
source "driver/Kconfig"
diff --git a/bsp/raspberry-pi/raspi3-32/rtconfig.h b/bsp/raspberry-pi/raspi3-32/rtconfig.h
index b861bf8827bd157c85906f5e5ac49a1520a03cf8..ad8d9de89c39b060c274cb6d83725a0eeee4b69d 100644
--- a/bsp/raspberry-pi/raspi3-32/rtconfig.h
+++ b/bsp/raspberry-pi/raspi3-32/rtconfig.h
@@ -7,13 +7,10 @@
/* RT-Thread Kernel */
#define RT_NAME_MAX 8
-/* RT_USING_ARCH_DATA_TYPE is not set */
#define RT_USING_SMP
#define RT_CPUS_NR 4
#define RT_ALIGN_SIZE 4
-/* RT_THREAD_PRIORITY_8 is not set */
#define RT_THREAD_PRIORITY_32
-/* RT_THREAD_PRIORITY_256 is not set */
#define RT_THREAD_PRIORITY_MAX 32
#define RT_TICK_PER_SECOND 100
#define RT_USING_OVERFLOW_CHECK
@@ -21,19 +18,8 @@
#define RT_USING_IDLE_HOOK
#define RT_IDLE_HOOK_LIST_SIZE 4
#define IDLE_THREAD_STACK_SIZE 256
-/* RT_USING_TIMER_SOFT is not set */
#define RT_DEBUG
#define RT_DEBUG_COLOR
-/* RT_DEBUG_INIT_CONFIG is not set */
-/* RT_DEBUG_THREAD_CONFIG is not set */
-/* RT_DEBUG_SCHEDULER_CONFIG is not set */
-/* RT_DEBUG_IPC_CONFIG is not set */
-/* RT_DEBUG_TIMER_CONFIG is not set */
-/* RT_DEBUG_IRQ_CONFIG is not set */
-/* RT_DEBUG_MEM_CONFIG is not set */
-/* RT_DEBUG_SLAB_CONFIG is not set */
-/* RT_DEBUG_MEMHEAP_CONFIG is not set */
-/* RT_DEBUG_MODULE_CONFIG is not set */
/* Inter-Thread communication */
@@ -42,16 +28,12 @@
#define RT_USING_EVENT
#define RT_USING_MAILBOX
#define RT_USING_MESSAGEQUEUE
-/* RT_USING_SIGNALS is not set */
/* Memory Management */
#define RT_USING_MEMPOOL
#define RT_USING_MEMHEAP
-/* RT_USING_NOHEAP is not set */
#define RT_USING_SMALL_MEM
-/* RT_USING_SLAB is not set */
-/* RT_USING_MEMHEAP_AS_HEAP is not set */
#define RT_USING_MEMTRACE
#define RT_USING_HEAP
@@ -59,16 +41,14 @@
#define RT_USING_DEVICE
#define RT_USING_DEVICE_OPS
-/* RT_USING_INTERRUPT_INFO is not set */
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart1"
-#define RT_VER_NUM 0x40002
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
#define ARCH_ARM
-/* RT_USING_CPU_FFS is not set */
#define ARCH_ARM_CORTEX_A
#define ARCH_ARM_CORTEX_A7
-/* ARCH_CPU_STACK_GROWS_UPWARD is not set */
/* RT-Thread Components */
@@ -79,7 +59,6 @@
/* C++ features */
-/* RT_USING_CPLUSPLUS is not set */
/* Command shell */
@@ -89,11 +68,9 @@
#define FINSH_HISTORY_LINES 5
#define FINSH_USING_SYMTAB
#define FINSH_USING_DESCRIPTION
-/* FINSH_ECHO_DISABLE_DEFAULT is not set */
#define FINSH_THREAD_PRIORITY 20
#define FINSH_THREAD_STACK_SIZE 4096
#define FINSH_CMD_SIZE 80
-/* FINSH_USING_AUTH is not set */
#define FINSH_USING_MSH
#define FINSH_USING_MSH_DEFAULT
#define FINSH_USING_MSH_ONLY
@@ -106,261 +83,112 @@
#define DFS_FILESYSTEMS_MAX 2
#define DFS_FILESYSTEM_TYPES_MAX 2
#define DFS_FD_MAX 16
-/* RT_USING_DFS_MNTTABLE is not set */
#define RT_USING_DFS_ELMFAT
/* elm-chan's FatFs, Generic FAT Filesystem Module */
#define RT_DFS_ELM_CODE_PAGE 437
#define RT_DFS_ELM_WORD_ACCESS
-/* RT_DFS_ELM_USE_LFN_0 is not set */
-/* RT_DFS_ELM_USE_LFN_1 is not set */
-/* RT_DFS_ELM_USE_LFN_2 is not set */
#define RT_DFS_ELM_USE_LFN_3
#define RT_DFS_ELM_USE_LFN 3
#define RT_DFS_ELM_MAX_LFN 255
#define RT_DFS_ELM_DRIVES 2
#define RT_DFS_ELM_MAX_SECTOR_SIZE 512
-/* RT_DFS_ELM_USE_ERASE is not set */
#define RT_DFS_ELM_REENTRANT
#define RT_USING_DFS_DEVFS
-/* RT_USING_DFS_ROMFS is not set */
-/* RT_USING_DFS_RAMFS is not set */
-/* RT_USING_DFS_UFFS is not set */
-/* RT_USING_DFS_JFFS2 is not set */
/* Device Drivers */
#define RT_USING_DEVICE_IPC
#define RT_PIPE_BUFSZ 512
-/* RT_USING_SYSTEM_WORKQUEUE is not set */
#define RT_USING_SERIAL
-/* RT_SERIAL_USING_DMA is not set */
#define RT_SERIAL_RB_BUFSZ 64
-/* RT_USING_CAN is not set */
#define RT_USING_HWTIMER
-/* RT_USING_CPUTIME is not set */
#define RT_USING_I2C
-/* RT_USING_I2C_BITOPS is not set */
#define RT_USING_PIN
-/* RT_USING_ADC is not set */
-/* RT_USING_PWM is not set */
-/* RT_USING_MTD_NOR is not set */
-/* RT_USING_MTD_NAND is not set */
-/* RT_USING_PM is not set */
#define RT_USING_RTC
-/* RT_USING_ALARM is not set */
-/* RT_USING_SOFT_RTC is not set */
#define RT_USING_SDIO
#define RT_SDIO_STACK_SIZE 512
#define RT_SDIO_THREAD_PRIORITY 15
#define RT_MMCSD_STACK_SIZE 1024
#define RT_MMCSD_THREAD_PREORITY 22
#define RT_MMCSD_MAX_PARTITION 16
-/* RT_SDIO_DEBUG is not set */
#define RT_USING_SPI
-/* RT_USING_QSPI is not set */
-/* RT_USING_SPI_MSD is not set */
-/* RT_USING_SFUD is not set */
-/* RT_USING_ENC28J60 is not set */
-/* RT_USING_SPI_WIFI is not set */
#define RT_USING_WDT
-/* RT_USING_AUDIO is not set */
-/* RT_USING_SENSOR is not set */
-/* RT_USING_TOUCH is not set */
-/* RT_USING_HWCRYPTO is not set */
-/* RT_USING_WIFI is not set */
/* Using USB */
-/* RT_USING_USB_HOST is not set */
-/* RT_USING_USB_DEVICE is not set */
/* POSIX layer and C standard library */
#define RT_USING_LIBC
-/* RT_USING_PTHREADS is not set */
#define RT_USING_POSIX
-/* RT_USING_POSIX_MMAP is not set */
-/* RT_USING_POSIX_TERMIOS is not set */
-/* RT_USING_POSIX_AIO is not set */
-/* RT_USING_MODULE is not set */
/* Network */
/* Socket abstraction layer */
-/* RT_USING_SAL is not set */
/* Network interface device */
-/* RT_USING_NETDEV is not set */
/* light weight TCP/IP stack */
-/* RT_USING_LWIP is not set */
/* AT commands */
-/* RT_USING_AT is not set */
/* VBUS(Virtual Software BUS) */
-/* RT_USING_VBUS is not set */
/* Utilities */
-/* RT_USING_RYM is not set */
-/* RT_USING_ULOG is not set */
-/* RT_USING_UTEST is not set */
-/* RT_USING_LWP is not set */
/* RT-Thread online packages */
/* IoT - internet of things */
-/* PKG_USING_PAHOMQTT is not set */
-/* PKG_USING_WEBCLIENT is not set */
-/* PKG_USING_WEBNET is not set */
-/* PKG_USING_MONGOOSE is not set */
-/* PKG_USING_WEBTERMINAL is not set */
-/* PKG_USING_CJSON is not set */
-/* PKG_USING_JSMN is not set */
-/* PKG_USING_LIBMODBUS is not set */
-/* PKG_USING_FREEMODBUS is not set */
-/* PKG_USING_LJSON is not set */
-/* PKG_USING_EZXML is not set */
-/* PKG_USING_NANOPB is not set */
/* Wi-Fi */
/* Marvell WiFi */
-/* PKG_USING_WLANMARVELL is not set */
/* Wiced WiFi */
-/* PKG_USING_WLAN_WICED is not set */
-/* PKG_USING_RW007 is not set */
-/* PKG_USING_COAP is not set */
-/* PKG_USING_NOPOLL is not set */
-/* PKG_USING_NETUTILS is not set */
-/* PKG_USING_AT_DEVICE is not set */
-/* PKG_USING_ATSRV_SOCKET is not set */
-/* PKG_USING_WIZNET is not set */
/* IoT Cloud */
-/* PKG_USING_ONENET is not set */
-/* PKG_USING_GAGENT_CLOUD is not set */
-/* PKG_USING_ALI_IOTKIT is not set */
-/* PKG_USING_AZURE is not set */
-/* PKG_USING_TENCENT_IOTHUB is not set */
-/* PKG_USING_NIMBLE is not set */
-/* PKG_USING_OTA_DOWNLOADER is not set */
-/* PKG_USING_IPMSG is not set */
-/* PKG_USING_LSSDP is not set */
-/* PKG_USING_AIRKISS_OPEN is not set */
-/* PKG_USING_LIBRWS is not set */
-/* PKG_USING_TCPSERVER is not set */
/* security packages */
-/* PKG_USING_MBEDTLS is not set */
-/* PKG_USING_libsodium is not set */
-/* PKG_USING_TINYCRYPT is not set */
/* language packages */
-/* PKG_USING_LUA is not set */
-/* PKG_USING_JERRYSCRIPT is not set */
-/* PKG_USING_MICROPYTHON is not set */
/* multimedia packages */
-/* PKG_USING_OPENMV is not set */
-/* PKG_USING_MUPDF is not set */
-/* PKG_USING_STEMWIN is not set */
/* tools packages */
-/* PKG_USING_CMBACKTRACE is not set */
-/* PKG_USING_EASYFLASH is not set */
-/* PKG_USING_EASYLOGGER is not set */
-/* PKG_USING_SYSTEMVIEW is not set */
-/* PKG_USING_RDB is not set */
-/* PKG_USING_QRCODE is not set */
-/* PKG_USING_ULOG_EASYFLASH is not set */
-/* PKG_USING_ADBD is not set */
/* system packages */
-/* PKG_USING_GUIENGINE is not set */
-/* PKG_USING_PERSIMMON is not set */
-/* PKG_USING_CAIRO is not set */
-/* PKG_USING_PIXMAN is not set */
-/* PKG_USING_LWEXT4 is not set */
-/* PKG_USING_PARTITION is not set */
-/* PKG_USING_FAL is not set */
-/* PKG_USING_SQLITE is not set */
-/* PKG_USING_RTI is not set */
-/* PKG_USING_LITTLEVGL2RTT is not set */
-/* PKG_USING_CMSIS is not set */
-/* PKG_USING_DFS_YAFFS is not set */
-/* PKG_USING_LITTLEFS is not set */
-/* PKG_USING_THREAD_POOL is not set */
/* peripheral libraries and drivers */
-/* PKG_USING_SENSORS_DRIVERS is not set */
-/* PKG_USING_REALTEK_AMEBA is not set */
-/* PKG_USING_SHT2X is not set */
-/* PKG_USING_STM32_SDIO is not set */
-/* PKG_USING_ICM20608 is not set */
-/* PKG_USING_U8G2 is not set */
-/* PKG_USING_BUTTON is not set */
-/* PKG_USING_PCF8574 is not set */
-/* PKG_USING_SX12XX is not set */
-/* PKG_USING_SIGNAL_LED is not set */
-/* PKG_USING_LEDBLINK is not set */
-/* PKG_USING_WM_LIBRARIES is not set */
-/* PKG_USING_KENDRYTE_SDK is not set */
-/* PKG_USING_INFRARED is not set */
-/* PKG_USING_ROSSERIAL is not set */
-/* PKG_USING_AT24CXX is not set */
-/* PKG_USING_MOTIONDRIVER2RTT is not set */
-/* PKG_USING_AD7746 is not set */
-/* PKG_USING_PCA9685 is not set */
-/* PKG_USING_I2C_TOOLS is not set */
-/* PKG_USING_NRF24L01 is not set */
-/* PKG_USING_TOUCH_DRIVERS is not set */
-/* PKG_USING_LCD_DRIVERS is not set */
/* miscellaneous packages */
-/* PKG_USING_LIBCSV is not set */
-/* PKG_USING_OPTPARSE is not set */
-/* PKG_USING_FASTLZ is not set */
-/* PKG_USING_MINILZO is not set */
-/* PKG_USING_QUICKLZ is not set */
-/* PKG_USING_MULTIBUTTON is not set */
-/* PKG_USING_CANFESTIVAL is not set */
-/* PKG_USING_ZLIB is not set */
-/* PKG_USING_DSTR is not set */
-/* PKG_USING_TINYFRAME is not set */
-/* PKG_USING_KENDRYTE_DEMO is not set */
-/* PKG_USING_DIGITALCTRL is not set */
/* samples: kernel and components samples */
-/* PKG_USING_KERNEL_SAMPLES is not set */
-/* PKG_USING_FILESYSTEM_SAMPLES is not set */
-/* PKG_USING_NETWORK_SAMPLES is not set */
-/* PKG_USING_PERIPHERAL_SAMPLES is not set */
-/* PKG_USING_HELLO is not set */
-/* PKG_USING_VI is not set */
-/* PKG_USING_NNOM is not set */
-/* PKG_USING_LIBANN is not set */
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
#define BCM2836_SOC
/* Hardware Drivers Config */
@@ -368,7 +196,6 @@
/* BCM Peripheral Drivers */
#define BSP_USING_UART
-/* RT_USING_UART0 is not set */
#define RT_USING_UART1
#define BSP_USING_PIN
#define BSP_USING_SYSTIMER
@@ -383,7 +210,6 @@
#define BSP_USING_SPI0_DEVICE1
#define BSP_USING_WDT
#define BSP_USING_RTC
-/* BSP_USING_ALARM is not set */
#define BSP_USING_SDIO
#define BSP_USING_SDIO0
#define BSP_USING_HDMI
diff --git a/bsp/raspberry-pi/raspi4-32/.config b/bsp/raspberry-pi/raspi4-32/.config
index 60727061a2ccd75bd7c53391f644af92d120b261..c7fa97fc477f53f61dc2c290cc66caa04d27017c 100644
--- a/bsp/raspberry-pi/raspi4-32/.config
+++ b/bsp/raspberry-pi/raspi4-32/.config
@@ -8,23 +8,24 @@
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+CONFIG_RT_USING_SMART=y
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
CONFIG_RT_THREAD_PRIORITY_32=y
# CONFIG_RT_THREAD_PRIORITY_256 is not set
CONFIG_RT_THREAD_PRIORITY_MAX=32
-CONFIG_RT_TICK_PER_SECOND=100
+CONFIG_RT_TICK_PER_SECOND=1000
CONFIG_RT_USING_OVERFLOW_CHECK=y
CONFIG_RT_USING_HOOK=y
CONFIG_RT_USING_IDLE_HOOK=y
CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
-CONFIG_IDLE_THREAD_STACK_SIZE=2048
+CONFIG_IDLE_THREAD_STACK_SIZE=4096
CONFIG_RT_USING_TIMER_SOFT=y
CONFIG_RT_TIMER_THREAD_PRIO=4
-CONFIG_RT_TIMER_THREAD_STACK_SIZE=2048
+CONFIG_RT_TIMER_THREAD_STACK_SIZE=512
CONFIG_RT_DEBUG=y
-# CONFIG_RT_DEBUG_COLOR is not set
+CONFIG_RT_DEBUG_COLOR=y
# CONFIG_RT_DEBUG_INIT_CONFIG is not set
# CONFIG_RT_DEBUG_THREAD_CONFIG is not set
# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set
@@ -50,10 +51,11 @@ CONFIG_RT_USING_MESSAGEQUEUE=y
# Memory Management
#
CONFIG_RT_USING_MEMPOOL=y
-# CONFIG_RT_USING_MEMHEAP is not set
+CONFIG_RT_USING_MEMHEAP=y
# CONFIG_RT_USING_NOHEAP is not set
CONFIG_RT_USING_SMALL_MEM=y
# CONFIG_RT_USING_SLAB is not set
+# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set
# CONFIG_RT_USING_MEMTRACE is not set
CONFIG_RT_USING_HEAP=y
@@ -62,14 +64,23 @@ CONFIG_RT_USING_HEAP=y
#
CONFIG_RT_USING_DEVICE=y
# CONFIG_RT_USING_DEVICE_OPS is not set
-# CONFIG_RT_USING_INTERRUPT_INFO is not set
+CONFIG_RT_USING_INTERRUPT_INFO=y
CONFIG_RT_USING_CONSOLE=y
-CONFIG_RT_CONSOLEBUF_SIZE=128
+CONFIG_RT_CONSOLEBUF_SIZE=512
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
# CONFIG_RT_USING_CPU_FFS is not set
-CONFIG_ARCH_ARMV8=y
# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+CONFIG_ARCH_ARM_MMU=y
+CONFIG_RT_USING_USERSPACE=y
+CONFIG_KERNEL_VADDR_START=0xc0000000
+CONFIG_PV_OFFSET=0x40100000
+CONFIG_RT_IOREMAP_LATE=y
+CONFIG_ARCH_ARM_CORTEX_A=y
+# CONFIG_RT_BACKTRACE_FUNCTION_NAME is not set
+CONFIG_ARCH_ARMV8=y
#
# RT-Thread Components
@@ -100,7 +111,7 @@ CONFIG_FINSH_CMD_SIZE=80
# CONFIG_FINSH_USING_AUTH is not set
CONFIG_FINSH_USING_MSH=y
CONFIG_FINSH_USING_MSH_DEFAULT=y
-# CONFIG_FINSH_USING_MSH_ONLY is not set
+CONFIG_FINSH_USING_MSH_ONLY=y
CONFIG_FINSH_ARG_MAX=10
#
@@ -108,8 +119,8 @@ CONFIG_FINSH_ARG_MAX=10
#
CONFIG_RT_USING_DFS=y
CONFIG_DFS_USING_WORKDIR=y
-CONFIG_DFS_FILESYSTEMS_MAX=2
-CONFIG_DFS_FILESYSTEM_TYPES_MAX=2
+CONFIG_DFS_FILESYSTEMS_MAX=4
+CONFIG_DFS_FILESYSTEM_TYPES_MAX=4
CONFIG_DFS_FD_MAX=16
# CONFIG_RT_USING_DFS_MNTTABLE is not set
CONFIG_RT_USING_DFS_ELMFAT=y
@@ -130,7 +141,8 @@ CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=512
# CONFIG_RT_DFS_ELM_USE_ERASE is not set
CONFIG_RT_DFS_ELM_REENTRANT=y
CONFIG_RT_USING_DFS_DEVFS=y
-# CONFIG_RT_USING_DFS_ROMFS is not set
+CONFIG_RT_USING_DFS_ROMFS=y
+# CONFIG_RT_USING_DFS_CROMFS is not set
# CONFIG_RT_USING_DFS_RAMFS is not set
# CONFIG_RT_USING_DFS_UFFS is not set
# CONFIG_RT_USING_DFS_JFFS2 is not set
@@ -141,22 +153,30 @@ CONFIG_RT_USING_DFS_DEVFS=y
#
CONFIG_RT_USING_DEVICE_IPC=y
CONFIG_RT_PIPE_BUFSZ=512
-# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
+CONFIG_RT_USING_SYSTEM_WORKQUEUE=y
+CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048
+CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23
CONFIG_RT_USING_SERIAL=y
-CONFIG_RT_SERIAL_USING_DMA=y
+# CONFIG_RT_SERIAL_USING_DMA is not set
CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_CAN is not set
-# CONFIG_RT_USING_HWTIMER is not set
+CONFIG_RT_USING_HWTIMER=y
# CONFIG_RT_USING_CPUTIME is not set
-# CONFIG_RT_USING_I2C 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_PHY 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_PWM=y
# CONFIG_RT_USING_MTD_NOR is not set
# CONFIG_RT_USING_MTD_NAND is not set
# CONFIG_RT_USING_PM is not set
-# CONFIG_RT_USING_RTC is not set
+CONFIG_RT_USING_RTC=y
+# CONFIG_RT_USING_ALARM is not set
+CONFIG_RT_USING_SOFT_RTC=y
CONFIG_RT_USING_SDIO=y
CONFIG_RT_SDIO_STACK_SIZE=512
CONFIG_RT_SDIO_THREAD_PRIORITY=15
@@ -189,12 +209,14 @@ CONFIG_RT_USING_WDT=y
# POSIX layer and C standard library
#
CONFIG_RT_USING_LIBC=y
+# CONFIG_RT_USING_NEWLIB is not set
+CONFIG_RT_USING_MUSL=y
# CONFIG_RT_USING_PTHREADS is not set
CONFIG_RT_USING_POSIX=y
-# CONFIG_RT_USING_POSIX_MMAP is not set
-# CONFIG_RT_USING_POSIX_TERMIOS is not set
+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 is not set
+CONFIG_RT_USING_POSIX_AIO=y
# CONFIG_RT_USING_MODULE is not set
#
@@ -204,7 +226,13 @@ CONFIG_RT_USING_POSIX=y
#
# Socket abstraction layer
#
-# CONFIG_RT_USING_SAL is not set
+CONFIG_RT_USING_SAL=y
+
+#
+# protocol stack implement
+#
+CONFIG_SAL_USING_LWIP=y
+CONFIG_SAL_USING_POSIX=y
#
# Network interface device
@@ -239,8 +267,8 @@ CONFIG_IP_SOF_BROADCAST_RECV=1
#
# Static IPv4 Address
#
-CONFIG_RT_LWIP_IPADDR="192.168.1.30"
-CONFIG_RT_LWIP_GWADDR="192.168.1.1"
+CONFIG_RT_LWIP_IPADDR="192.168.137.100"
+CONFIG_RT_LWIP_GWADDR="192.168.137.1"
CONFIG_RT_LWIP_MSKADDR="255.255.255.0"
CONFIG_RT_LWIP_UDP=y
CONFIG_RT_LWIP_TCP=y
@@ -256,11 +284,11 @@ 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=4096
# CONFIG_LWIP_NO_RX_THREAD is not set
# CONFIG_LWIP_NO_TX_THREAD is not set
CONFIG_RT_LWIP_ETHTHREAD_PRIORITY=12
-CONFIG_RT_LWIP_ETHTHREAD_STACKSIZE=1024
+CONFIG_RT_LWIP_ETHTHREAD_STACKSIZE=4096
CONFIG_RT_LWIP_ETHTHREAD_MBOX_SIZE=8
# CONFIG_RT_LWIP_REASSEMBLY_FRAG is not set
CONFIG_LWIP_NETIF_STATUS_CALLBACK=1
@@ -294,6 +322,12 @@ 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_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
#
# RT-Thread online packages
@@ -376,6 +410,7 @@ CONFIG_RT_LWIP_USING_PING=y
# CONFIG_PKG_USING_AGILE_JSMN is not set
# CONFIG_PKG_USING_PDULIB is not set
# CONFIG_PKG_USING_BTSTACK is not set
+# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set
#
# security packages
@@ -402,6 +437,7 @@ CONFIG_RT_LWIP_USING_PING=y
# CONFIG_PKG_USING_WAVPLAYER is not set
# CONFIG_PKG_USING_TJPGD is not set
# CONFIG_PKG_USING_HELIX is not set
+# CONFIG_PKG_USING_AZUREGUIX is not set
#
# tools packages
@@ -428,6 +464,7 @@ CONFIG_RT_LWIP_USING_PING=y
# system packages
#
# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON is not set
# CONFIG_PKG_USING_CAIRO is not set
# CONFIG_PKG_USING_PIXMAN is not set
# CONFIG_PKG_USING_LWEXT4 is not set
@@ -449,7 +486,15 @@ CONFIG_RT_LWIP_USING_PING=y
# 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_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
#
@@ -505,6 +550,7 @@ CONFIG_RT_LWIP_USING_PING=y
# CONFIG_PKG_USING_WK2124 is not set
# CONFIG_PKG_USING_LY68L6400 is not set
# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_SSD1306 is not set
#
# miscellaneous packages
@@ -534,11 +580,13 @@ CONFIG_RT_LWIP_USING_PING=y
# 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_TETRIS is not set
# CONFIG_PKG_USING_ULAPACK is not set
# CONFIG_PKG_USING_UKAL is not set
# CONFIG_PKG_USING_CRCLIB is not set
@@ -584,6 +632,8 @@ CONFIG_RT_LWIP_USING_PING=y
# 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_VIRTUAL_DEVICE is not set
CONFIG_BCM2711_SOC=y
# CONFIG_BSP_SUPPORT_FPU is not set
@@ -604,10 +654,7 @@ CONFIG_BSP_USING_GIC=y
CONFIG_BSP_USING_GIC400=y
# CONFIG_BSP_USING_GIC500 is not set
CONFIG_BSP_USING_PIN=y
-CONFIG_BSP_USING_SPI=y
-CONFIG_BSP_USING_SPI0_BUS=y
-CONFIG_BSP_USING_SPI0_DEVICE0=y
-# CONFIG_BSP_USING_SPI0_DEVICE1 is not set
+# CONFIG_BSP_USING_SPI is not set
CONFIG_BSP_USING_CORETIMER=y
# CONFIG_BSP_USING_SYSTIMER is not set
CONFIG_BSP_USING_WDT=y
@@ -619,4 +666,4 @@ CONFIG_BSP_USING_SDIO0=y
# Board Peripheral Drivers
#
CONFIG_BSP_USING_HDMI=y
-CONFIG_BSP_USING_HDMI_DISPLAY=y
+# CONFIG_BSP_USING_HDMI_DISPLAY is not set
diff --git a/bsp/raspberry-pi/raspi4-32/Kconfig b/bsp/raspberry-pi/raspi4-32/Kconfig
index 1e49c4768057b5c709aa6388681959b4e6f8537f..0be620567316d6cb3601d139b0ba5f675eba5c89 100644
--- a/bsp/raspberry-pi/raspi4-32/Kconfig
+++ b/bsp/raspberry-pi/raspi4-32/Kconfig
@@ -21,6 +21,9 @@ source "$PKGS_DIR/Kconfig"
config BCM2711_SOC
bool
select ARCH_ARMV8
+ select ARCH_ARM_CORTEX_A
+ select RT_USING_CACHE
+ select ARCH_ARM_MMU
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
diff --git a/bsp/raspberry-pi/raspi4-32/SConstruct b/bsp/raspberry-pi/raspi4-32/SConstruct
index 93f349aab8045ad3c742e72664514a7c240b2b6e..1e5eae0d35bab98fb21d3a49a48c4e57e15e45e4 100644
--- a/bsp/raspberry-pi/raspi4-32/SConstruct
+++ b/bsp/raspberry-pi/raspi4-32/SConstruct
@@ -2,7 +2,10 @@ import os
import sys
import rtconfig
-from rtconfig import RTT_ROOT
+if os.getenv('RTT_ROOT'):
+ RTT_ROOT = os.getenv('RTT_ROOT')
+else:
+ RTT_ROOT = os.path.join(os.getcwd(), '..', '..', '..')
sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
from building import *
@@ -11,20 +14,20 @@ TARGET = 'rtthread.' + rtconfig.TARGET_EXT
DefaultEnvironment(tools=[])
env = Environment(tools = ['mingw'],
- AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
- CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
- CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
- AR = rtconfig.AR, ARFLAGS = '-rc',
+ AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
+ 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')
# prepare building environment
-objs = PrepareBuilding(env, RTT_ROOT, has_libcpu = False)
+objs = PrepareBuilding(env, RTT_ROOT)
# make a building
DoBuilding(TARGET, objs)
-
diff --git a/bsp/raspberry-pi/raspi4-32/applications/main.c b/bsp/raspberry-pi/raspi4-32/applications/main.c
index 15dc74dc582601d00de51258784e529e14195c9e..6a1321235e7e6231f0c3dc443d127c15e13094d6 100644
--- a/bsp/raspberry-pi/raspi4-32/applications/main.c
+++ b/bsp/raspberry-pi/raspi4-32/applications/main.c
@@ -4,28 +4,15 @@
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
- * Date Author Notes
- * 2020-04-16 bigmagic first version
+ * Date Author Notes
+ * 2017-5-30 bernard the first version
*/
-
#include
-#include
-#include
-
-#define ACTLED (42)
+#include
int main(int argc, char** argv)
-{
- rt_kprintf("Hi, this is RT-Thread!!\n");
-
- rt_pin_mode(ACTLED, PIN_MODE_OUTPUT);
+{
+ rt_kprintf("hello rt-thread!\n");
- while(1)
- {
- rt_pin_write(ACTLED, PIN_HIGH);
- rt_thread_mdelay(1000);
- rt_pin_write(ACTLED, PIN_LOW);
- rt_thread_mdelay(1000);
- }
- return RT_EOK;
+ return 0;
}
diff --git a/bsp/raspberry-pi/raspi4-32/driver/board.c b/bsp/raspberry-pi/raspi4-32/driver/board.c
index ed25fa4176cc1e37aa797bebbbb96de7a10044ba..a06cddb215911abdd50c6cc4543259a9352b5d59 100644
--- a/bsp/raspberry-pi/raspi4-32/driver/board.c
+++ b/bsp/raspberry-pi/raspi4-32/driver/board.c
@@ -16,15 +16,52 @@
#include "cp15.h"
#include "mmu.h"
+#include "mbox.h"
+#ifdef RT_USING_USERSPACE
+#include
+#include
+#endif
+
+rt_mmu_info mmu_info;
+extern size_t MMUTable[];
+
+size_t gpio_base_addr = GPIO_BASE_ADDR;
+
+size_t uart_base_addr = UART_BASE;
+
+size_t gic_base_addr = GIC_V2_BASE;
+
+size_t arm_timer_base = ARM_TIMER_BASE;
+
+size_t pactl_cs_base = PACTL_CS_ADDR;
+
+size_t stimer_base_addr = STIMER_BASE;
+
+size_t mmc2_base_addr = MMC2_BASE_ADDR;
+
+size_t videocore_mbox = VIDEOCORE_MBOX;
+
+size_t mbox_addr = MBOX_ADDR;
+
+size_t wdt_base_addr = WDT_BASE;
+
+void* mac_reg_base_addr = (void *)MAC_REG;
+
+void* eth_send_no_cache = (void *)SEND_DATA_NO_CACHE;
+void* eth_recv_no_cache = (void *)RECV_DATA_NO_CACHE;
+
+#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[] = {
{0x0, 0x6400000, 0x0, NORMAL_MEM},
- {0x8000000, 0x8800000, 0x8000000, DEVICE_MEM}, //mbox msg
- {0x0EA00000, 0x0EE00000, 0x0EA00000, DEVICE_MEM}, //framebuffer
- {0xFD500000, 0xFDA00000, 0xFD500000, DEVICE_MEM}, //gmac
- {0xFE000000, 0xFE400000, 0xFE000000, DEVICE_MEM}, //peripheral
- {0xFF800000, 0xFFA00000, 0xFF800000, DEVICE_MEM} //gic
+ {0xFE000000, 0xFE400000, 0xFE000000, DEVICE_MEM},//uart gpio
+ {0xFF800000, 0xFFA00000, 0xFF800000, DEVICE_MEM} //gic
};
+#endif
const rt_uint32_t platform_mem_desc_size = sizeof(platform_mem_desc)/sizeof(platform_mem_desc[0]);
@@ -36,21 +73,26 @@ void rt_hw_timer_isr(int vector, void *parameter)
void rt_hw_timer_init(void)
{
- rt_hw_interrupt_install(ARM_TIMER_IRQ, rt_hw_timer_isr, RT_NULL, "tick");
- rt_hw_interrupt_umask(ARM_TIMER_IRQ);
+ rt_uint32_t apb_clock = 0;
+ rt_uint32_t timer_clock = 1000000;
/* timer_clock = apb_clock/(pre_divider + 1) */
- ARM_TIMER_PREDIV = (250 - 1);
+ apb_clock = bcm271x_mbox_clock_get_rate(CORE_CLK_ID);
+ ARM_TIMER_PREDIV = (apb_clock/timer_clock - 1);
ARM_TIMER_RELOAD = 0;
ARM_TIMER_LOAD = 0;
ARM_TIMER_IRQCLR = 0;
ARM_TIMER_CTRL = 0;
- ARM_TIMER_RELOAD = 10000;
- ARM_TIMER_LOAD = 10000;
+ ARM_TIMER_RELOAD = 1000000/RT_TICK_PER_SECOND;
+ ARM_TIMER_LOAD = 1000000/RT_TICK_PER_SECOND;
/* 23-bit counter, enable interrupt, enable timer */
ARM_TIMER_CTRL = (1 << 1) | (1 << 5) | (1 << 7);
+
+ rt_hw_interrupt_install(ARM_TIMER_IRQ, rt_hw_timer_isr, RT_NULL, "tick");
+ rt_hw_interrupt_umask(ARM_TIMER_IRQ);
+
}
void idle_wfi(void)
@@ -58,31 +100,119 @@ void idle_wfi(void)
asm volatile ("wfi");
}
+#ifdef RT_USING_USERSPACE
+rt_region_t init_page_region = {
+ (uint32_t)(KERNEL_VADDR_START + 32 * 1024 * 1024),
+ (uint32_t)(KERNEL_VADDR_START + 64 * 1024 * 1024),
+};
+#endif
+
/**
* Initialize the Hardware related stuffs. Called from rtthread_startup()
* after interrupt disabled.
*/
void rt_hw_board_init(void)
{
+ /* io device remap */
+#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*)GPIO_BASE_ADDR, 0x10000000, MMUTable, 0);
+#endif
+
+ //gpio
+ gpio_base_addr = (size_t)rt_hw_kernel_phys_to_virt((void*)GPIO_BASE_ADDR, 0x1000);
+ //uart
+ //uart_base_addr = (size_t)rt_hw_kernel_phys_to_virt((void*)UART_BASE, 0x1000);
+ //aux
+ //aux_addr = (size_t)rt_hw_kernel_phys_to_virt((void*)AUX_BASE_ADDR, 0x1000);
+ //timer
+ arm_timer_base = (size_t)rt_hw_kernel_phys_to_virt((void*)ARM_TIMER_BASE, 0x1000);
+ //gic
+ //gic_base_addr = (size_t)rt_hw_kernel_phys_to_virt((void*)GIC_V2_BASE, 0x10000);
+ //pactl
+ pactl_cs_base = (size_t)rt_hw_kernel_phys_to_virt((void*)PACTL_CS_ADDR, 0x1000);
+
+ //stimer
+ stimer_base_addr = (size_t)rt_hw_kernel_phys_to_virt((void*)STIMER_BASE, 0x1000);
+
+ //mmc2_base_addr
+ mmc2_base_addr = (size_t)rt_hw_kernel_phys_to_virt((void*)MMC2_BASE_ADDR, 0x1000);
+
+ //mbox
+ videocore_mbox = (size_t)rt_hw_kernel_phys_to_virt((void*)VIDEOCORE_MBOX, 0x1000);
+
+ //mbox msg
+ mbox_addr = (size_t)rt_hw_kernel_phys_to_virt((void*)MBOX_ADDR, 0x1000);
+ mbox = (volatile unsigned int *)mbox_addr;
+
+ //wdt
+ wdt_base_addr = (size_t)rt_hw_kernel_phys_to_virt((void*)WDT_BASE, 0x1000);
+
+ //mac
+ mac_reg_base_addr = (void *)rt_hw_kernel_phys_to_virt((void*)MAC_REG, 0x80000);
+
+ //eth data
+ eth_send_no_cache = (void *)rt_hw_kernel_phys_to_virt((void*)SEND_DATA_NO_CACHE, 0x200000);
+ eth_recv_no_cache = (void *)rt_hw_kernel_phys_to_virt((void*)RECV_DATA_NO_CACHE, 0x200000);
+
/* initialize hardware interrupt */
rt_hw_interrupt_init();
+
+#ifdef RT_USING_HEAP
+ /* initialize memory system */
+ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
+#endif
/* initialize uart */
- rt_hw_uart_init(); // driver/drv_uart.c
+ rt_hw_uart_init();
+
#ifdef RT_USING_CONSOLE
/* set console device */
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif /* RT_USING_CONSOLE */
-#ifdef RT_USING_HEAP
- /* initialize memory system */
- rt_kprintf("heap: 0x%08x - 0x%08x\n", RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
- rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
-#endif
- /* initialize timer for os tick */
+ /* initialize timer for os tick */
rt_hw_timer_init();
rt_thread_idle_sethook(idle_wfi);
+ rt_kprintf("heap: 0x%08x - 0x%08x\n", RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
+
#ifdef RT_USING_COMPONENTS_INIT
rt_components_board_init();
#endif
+
}
+
+#ifdef RT_USING_GDBSERVER
+
+#include
+
+#define GDB_CONNECT_DEVICE "/dev/uart4"
+
+/* for gdb */
+int gdb_com_open(void)
+{
+ return open(GDB_CONNECT_DEVICE, O_RDWR);
+}
+
+void gdb_com_close(int fd)
+{
+ close(fd);
+}
+
+ssize_t gdb_com_read(int fd, void *buff, size_t len)
+{
+ return read(fd, buff, len);
+}
+
+ssize_t gdb_com_write(int fd, void *buff, size_t len)
+{
+ return write(fd, buff, len);
+}
+
+#endif
diff --git a/bsp/raspberry-pi/raspi4-32/driver/board.h b/bsp/raspberry-pi/raspi4-32/driver/board.h
index d675cc658e06c599df8007db4e67e608afa7a45a..72be9bcc6f6775c5d3a3c3c1d81bd0844f8172be 100644
--- a/bsp/raspberry-pi/raspi4-32/driver/board.h
+++ b/bsp/raspberry-pi/raspi4-32/driver/board.h
@@ -13,6 +13,7 @@
#include
#include "raspi4.h"
+#include "mmu.h"
extern unsigned char __bss_start;
extern unsigned char __bss_end;
@@ -22,4 +23,6 @@ extern unsigned char __bss_end;
void rt_hw_board_init(void);
+extern rt_mmu_info mmu_info;
+
#endif
diff --git a/bsp/raspberry-pi/raspi4-32/driver/drv_eth.c b/bsp/raspberry-pi/raspi4-32/driver/drv_eth.c
index a26c3c8519a60cb18eaf0f4b9593bf548303727e..20ae855b6cc4145806779876ee47c9efaec163cf 100644
--- a/bsp/raspberry-pi/raspi4-32/driver/drv_eth.c
+++ b/bsp/raspberry-pi/raspi4-32/driver/drv_eth.c
@@ -19,13 +19,20 @@
#include "raspi4.h"
#include "drv_eth.h"
+//#define ETH_RX_POLL
+
+#define DBG_LEVEL DBG_LOG
+#include
+#define LOG_TAG "drv.eth"
+
+static int link_speed = 0;
+static int link_flag = 0;
+
#define RECV_CACHE_BUF (1024)
-#define SEND_DATA_NO_CACHE (0x08200000)
-#define RECV_DATA_NO_CACHE (0x08400000)
#define DMA_DISC_ADDR_SIZE (4 * 1024 *1024)
-#define RX_DESC_BASE (MAC_REG + GENET_RX_OFF)
-#define TX_DESC_BASE (MAC_REG + GENET_TX_OFF)
+#define RX_DESC_BASE (mac_reg_base_addr + GENET_RX_OFF)
+#define TX_DESC_BASE (mac_reg_base_addr + GENET_TX_OFF)
#define MAX_ADDR_LEN (6)
@@ -34,6 +41,11 @@
#define BIT(nr) (1UL << (nr))
+static rt_thread_t link_thread_tid = RT_NULL;
+#define LINK_THREAD_STACK_SIZE (1024)
+#define LINK_THREAD_PRIORITY (20)
+#define LINK_THREAD_TIMESLICE (10)
+
static rt_uint32_t tx_index = 0;
static rt_uint32_t rx_index = 0;
static rt_uint32_t index_flag = 0;
@@ -54,6 +66,7 @@ struct rt_eth_dev
};
static struct rt_eth_dev eth_dev;
static struct rt_semaphore sem_lock;
+static struct rt_semaphore link_ack;
static inline rt_uint32_t read32(void *addr)
{
@@ -65,22 +78,39 @@ static inline void write32(void *addr, rt_uint32_t value)
(*((volatile unsigned int*)(addr))) = value;
}
-void eth_rx_irq(void *param)
+static void eth_rx_irq(int irq, void *param)
{
+#ifndef ETH_RX_POLL
+ rt_uint32_t val = 0;
+ val = read32(mac_reg_base_addr + GENET_INTRL2_CPU_STAT);
+ val &= ~read32(mac_reg_base_addr + GENET_INTRL2_CPU_STAT_MASK);
+ write32(mac_reg_base_addr + GENET_INTRL2_CPU_CLEAR, val);
+ if (val & GENET_IRQ_RXDMA_DONE)
+ {
+ eth_device_ready(ð_dev.parent);
+ }
+
+ if (val & GENET_IRQ_TXDMA_DONE)
+ {
+ //todo
+ }
+#else
eth_device_ready(ð_dev.parent);
+#endif
}
/* We only support RGMII (as used on the RPi4). */
static int bcmgenet_interface_set(void)
{
int phy_mode = PHY_INTERFACE_MODE_RGMII;
- switch (phy_mode) {
+ switch (phy_mode)
+ {
case PHY_INTERFACE_MODE_RGMII:
case PHY_INTERFACE_MODE_RGMII_RXID:
- write32(MAC_REG + SYS_PORT_CTRL,PORT_MODE_EXT_GPHY);
+ write32(mac_reg_base_addr + SYS_PORT_CTRL, PORT_MODE_EXT_GPHY);
break;
default:
- rt_kprintf("unknown phy mode: %d\n", MAC_REG);
+ rt_kprintf("unknown phy mode: %d\n", mac_reg_base_addr);
return -1;
}
return 0;
@@ -89,44 +119,44 @@ static int bcmgenet_interface_set(void)
static void bcmgenet_umac_reset(void)
{
rt_uint32_t reg;
- reg = read32(MAC_REG + SYS_RBUF_FLUSH_CTRL);
+ reg = read32(mac_reg_base_addr + SYS_RBUF_FLUSH_CTRL);
reg |= BIT(1);
- write32((MAC_REG + SYS_RBUF_FLUSH_CTRL), reg);
+ write32((mac_reg_base_addr + SYS_RBUF_FLUSH_CTRL), reg);
reg &= ~BIT(1);
- write32((MAC_REG + SYS_RBUF_FLUSH_CTRL),reg);
+ write32((mac_reg_base_addr + SYS_RBUF_FLUSH_CTRL), reg);
DELAY_MICROS(10);
- write32((MAC_REG + SYS_RBUF_FLUSH_CTRL),0);
+ write32((mac_reg_base_addr + SYS_RBUF_FLUSH_CTRL), 0);
DELAY_MICROS(10);
- write32(MAC_REG + UMAC_CMD, 0);
- write32(MAC_REG + UMAC_CMD, (CMD_SW_RESET | CMD_LCL_LOOP_EN));
+ write32(mac_reg_base_addr + UMAC_CMD, 0);
+ write32(mac_reg_base_addr + UMAC_CMD, (CMD_SW_RESET | CMD_LCL_LOOP_EN));
DELAY_MICROS(2);
- write32(MAC_REG + UMAC_CMD, 0);
+ write32(mac_reg_base_addr + UMAC_CMD, 0);
/* clear tx/rx counter */
- write32(MAC_REG + UMAC_MIB_CTRL, MIB_RESET_RX | MIB_RESET_TX | MIB_RESET_RUNT);
- write32(MAC_REG + UMAC_MIB_CTRL, 0);
- write32(MAC_REG + UMAC_MAX_FRAME_LEN, ENET_MAX_MTU_SIZE);
+ write32(mac_reg_base_addr + UMAC_MIB_CTRL, MIB_RESET_RX | MIB_RESET_TX | MIB_RESET_RUNT);
+ write32(mac_reg_base_addr + UMAC_MIB_CTRL, 0);
+ write32(mac_reg_base_addr + UMAC_MAX_FRAME_LEN, ENET_MAX_MTU_SIZE);
/* init rx registers, enable ip header optimization */
- reg = read32(MAC_REG + RBUF_CTRL);
+ reg = read32(mac_reg_base_addr + RBUF_CTRL);
reg |= RBUF_ALIGN_2B;
- write32(MAC_REG + RBUF_CTRL, reg);
- write32(MAC_REG + RBUF_TBUF_SIZE_CTRL, 1);
+ write32(mac_reg_base_addr + RBUF_CTRL, reg);
+ write32(mac_reg_base_addr + RBUF_TBUF_SIZE_CTRL, 1);
}
static void bcmgenet_disable_dma(void)
{
rt_uint32_t tdma_reg = 0, rdma_reg = 0;
- tdma_reg = read32(MAC_REG + TDMA_REG_BASE + DMA_CTRL);
+ tdma_reg = read32(mac_reg_base_addr + TDMA_REG_BASE + DMA_CTRL);
tdma_reg &= ~(1UL << DMA_EN);
- write32(MAC_REG + TDMA_REG_BASE + DMA_CTRL, tdma_reg);
- rdma_reg = read32(MAC_REG + RDMA_REG_BASE + DMA_CTRL);
+ write32(mac_reg_base_addr + TDMA_REG_BASE + DMA_CTRL, tdma_reg);
+ rdma_reg = read32(mac_reg_base_addr + RDMA_REG_BASE + DMA_CTRL);
rdma_reg &= ~(1UL << DMA_EN);
- write32(MAC_REG + RDMA_REG_BASE + DMA_CTRL, rdma_reg);
- write32(MAC_REG + UMAC_TX_FLUSH, 1);
+ write32(mac_reg_base_addr + RDMA_REG_BASE + DMA_CTRL, rdma_reg);
+ write32(mac_reg_base_addr + UMAC_TX_FLUSH, 1);
DELAY_MICROS(100);
- write32(MAC_REG + UMAC_TX_FLUSH, 0);
+ write32(mac_reg_base_addr + UMAC_TX_FLUSH, 0);
}
static void bcmgenet_enable_dma(void)
@@ -135,30 +165,29 @@ static void bcmgenet_enable_dma(void)
rt_uint32_t dma_ctrl = 0;
dma_ctrl = (1 << (DEFAULT_Q + DMA_RING_BUF_EN_SHIFT)) | DMA_EN;
- write32(MAC_REG + TDMA_REG_BASE + DMA_CTRL, dma_ctrl);
+ write32(mac_reg_base_addr + TDMA_REG_BASE + DMA_CTRL, dma_ctrl);
- reg = read32(MAC_REG + RDMA_REG_BASE + DMA_CTRL);
- write32(MAC_REG + RDMA_REG_BASE + DMA_CTRL, dma_ctrl | reg);
+ reg = read32(mac_reg_base_addr + RDMA_REG_BASE + DMA_CTRL);
+ write32(mac_reg_base_addr + RDMA_REG_BASE + DMA_CTRL, dma_ctrl | reg);
}
static int bcmgenet_mdio_write(rt_uint32_t addr, rt_uint32_t reg, rt_uint32_t value)
{
int count = 10000;
rt_uint32_t val;
- val = MDIO_WR | (addr << MDIO_PMD_SHIFT) |(reg << MDIO_REG_SHIFT) | (0xffff & value);
- write32(MAC_REG + MDIO_CMD, val);
+ val = MDIO_WR | (addr << MDIO_PMD_SHIFT) | (reg << MDIO_REG_SHIFT) | (0xffff & value);
+ write32(mac_reg_base_addr + MDIO_CMD, val);
- rt_uint32_t reg_val = read32(MAC_REG + MDIO_CMD);
+ rt_uint32_t reg_val = read32(mac_reg_base_addr + MDIO_CMD);
reg_val = reg_val | MDIO_START_BUSY;
- write32(MAC_REG + MDIO_CMD, reg_val);
+ write32(mac_reg_base_addr + MDIO_CMD, reg_val);
- while ((read32(MAC_REG + MDIO_CMD) & MDIO_START_BUSY) && (--count))
+ while ((read32(mac_reg_base_addr + MDIO_CMD) & MDIO_START_BUSY) && (--count))
DELAY_MICROS(1);
- reg_val = read32(MAC_REG + MDIO_CMD);
+ reg_val = read32(mac_reg_base_addr + MDIO_CMD);
return reg_val & 0xffff;
-
}
static int bcmgenet_mdio_read(rt_uint32_t addr, rt_uint32_t reg)
@@ -168,18 +197,18 @@ static int bcmgenet_mdio_read(rt_uint32_t addr, rt_uint32_t reg)
rt_uint32_t reg_val = 0;
val = MDIO_RD | (addr << MDIO_PMD_SHIFT) | (reg << MDIO_REG_SHIFT);
- write32(MAC_REG + MDIO_CMD, val);
+ write32(mac_reg_base_addr + MDIO_CMD, val);
- reg_val = read32(MAC_REG + MDIO_CMD);
+ reg_val = read32(mac_reg_base_addr + MDIO_CMD);
reg_val = reg_val | MDIO_START_BUSY;
- write32(MAC_REG + MDIO_CMD, reg_val);
+ write32(mac_reg_base_addr + MDIO_CMD, reg_val);
- while ((read32(MAC_REG + MDIO_CMD) & MDIO_START_BUSY) && (--count))
+ while ((read32(mac_reg_base_addr + MDIO_CMD) & MDIO_START_BUSY) && (--count))
DELAY_MICROS(1);
- reg_val = read32(MAC_REG + MDIO_CMD);
+ reg_val = read32(mac_reg_base_addr + MDIO_CMD);
- return reg_val & 0xffff;
+ return reg_val & 0xffff;
}
static int bcmgenet_gmac_write_hwaddr(void)
@@ -190,10 +219,10 @@ static int bcmgenet_gmac_write_hwaddr(void)
bcm271x_mbox_hardware_get_mac_address(&addr[0]);
reg = addr[0] << 24 | addr[1] << 16 | addr[2] << 8 | addr[3];
- write32(MAC_REG + UMAC_MAC0, reg);
+ write32(mac_reg_base_addr + UMAC_MAC0, reg);
reg = addr[4] << 8 | addr[5];
- write32(MAC_REG + UMAC_MAC1, reg);
+ write32(mac_reg_base_addr + UMAC_MAC1, reg);
return 0;
}
@@ -207,9 +236,9 @@ static int get_ethernet_uid(void)
uid_low = bcmgenet_mdio_read(1, BCM54213PE_PHY_IDENTIFIER_LOW);
uid = (uid_high << 16 | uid_low);
- if(BCM54213PE_VERSION_B1 == uid)
+ if (BCM54213PE_VERSION_B1 == uid)
{
- rt_kprintf("version is B1\n");
+ LOG_I("version is B1\n");
}
return uid;
}
@@ -219,7 +248,7 @@ static void bcmgenet_mdio_init(void)
rt_uint32_t ret = 0;
/*get ethernet uid*/
ret = get_ethernet_uid();
- if(ret == 0)
+ if (ret == 0)
{
return;
}
@@ -236,45 +265,47 @@ static void bcmgenet_mdio_init(void)
/* read status reg */
bcmgenet_mdio_read(1, BCM54213PE_IEEE_EXTENDED_STATUS);
bcmgenet_mdio_read(1, BCM54213PE_AUTO_NEGOTIATION_ADV);
+
bcmgenet_mdio_read(1, BCM54213PE_MII_STATUS);
bcmgenet_mdio_read(1, BCM54213PE_CONTROL);
/* half full duplex capability */
bcmgenet_mdio_write(1, BCM54213PE_CONTROL, (CONTROL_HALF_DUPLEX_CAPABILITY | CONTROL_FULL_DUPLEX_CAPABILITY));
bcmgenet_mdio_read(1, BCM54213PE_MII_CONTROL);
+
/* set mii control */
- bcmgenet_mdio_write(1,BCM54213PE_MII_CONTROL,(MII_CONTROL_AUTO_NEGOTIATION_ENABLED | MII_CONTROL_AUTO_NEGOTIATION_RESTART| MII_CONTROL_PHY_FULL_DUPLEX| MII_CONTROL_SPEED_SELECTION));
+ bcmgenet_mdio_write(1, BCM54213PE_MII_CONTROL, (MII_CONTROL_AUTO_NEGOTIATION_ENABLED | MII_CONTROL_AUTO_NEGOTIATION_RESTART | MII_CONTROL_PHY_FULL_DUPLEX | MII_CONTROL_SPEED_SELECTION));
}
static void rx_ring_init(void)
{
- write32(MAC_REG + RDMA_REG_BASE + DMA_SCB_BURST_SIZE, DMA_MAX_BURST_LENGTH);
- write32(MAC_REG + RDMA_RING_REG_BASE + DMA_START_ADDR,0x0 );
- write32(MAC_REG + RDMA_READ_PTR, 0x0);
- write32(MAC_REG + RDMA_WRITE_PTR, 0x0);
- write32(MAC_REG + RDMA_RING_REG_BASE + DMA_END_ADDR, RX_DESCS * DMA_DESC_SIZE / 4 - 1);
-
- write32(MAC_REG + RDMA_PROD_INDEX, 0x0);
- write32(MAC_REG + RDMA_CONS_INDEX, 0x0);
- write32(MAC_REG + RDMA_RING_REG_BASE + DMA_RING_BUF_SIZE, (RX_DESCS << DMA_RING_SIZE_SHIFT) | RX_BUF_LENGTH);
- write32(MAC_REG + RDMA_XON_XOFF_THRESH, DMA_FC_THRESH_VALUE);
- write32(MAC_REG + RDMA_REG_BASE + DMA_RING_CFG,1 << DEFAULT_Q);
+ write32(mac_reg_base_addr + RDMA_REG_BASE + DMA_SCB_BURST_SIZE, DMA_MAX_BURST_LENGTH);
+ write32(mac_reg_base_addr + RDMA_RING_REG_BASE + DMA_START_ADDR, 0x0);
+ write32(mac_reg_base_addr + RDMA_READ_PTR, 0x0);
+ write32(mac_reg_base_addr + RDMA_WRITE_PTR, 0x0);
+ write32(mac_reg_base_addr + RDMA_RING_REG_BASE + DMA_END_ADDR, RX_DESCS * DMA_DESC_SIZE / 4 - 1);
+
+ write32(mac_reg_base_addr + RDMA_PROD_INDEX, 0x0);
+ write32(mac_reg_base_addr + RDMA_CONS_INDEX, 0x0);
+ write32(mac_reg_base_addr + RDMA_RING_REG_BASE + DMA_RING_BUF_SIZE, (RX_DESCS << DMA_RING_SIZE_SHIFT) | RX_BUF_LENGTH);
+ write32(mac_reg_base_addr + RDMA_XON_XOFF_THRESH, DMA_FC_THRESH_VALUE);
+ write32(mac_reg_base_addr + RDMA_REG_BASE + DMA_RING_CFG, 1 << DEFAULT_Q);
}
static void tx_ring_init(void)
{
- write32(MAC_REG + TDMA_REG_BASE + DMA_SCB_BURST_SIZE, DMA_MAX_BURST_LENGTH);
- write32(MAC_REG + TDMA_RING_REG_BASE + DMA_START_ADDR, 0x0);
- write32(MAC_REG + TDMA_READ_PTR, 0x0);
- write32(MAC_REG + TDMA_READ_PTR, 0x0);
- write32(MAC_REG + TDMA_READ_PTR, 0x0);
- write32(MAC_REG + TDMA_WRITE_PTR, 0x0);
- write32(MAC_REG + TDMA_RING_REG_BASE + DMA_END_ADDR,TX_DESCS * DMA_DESC_SIZE / 4 - 1);
- write32(MAC_REG + TDMA_PROD_INDEX, 0x0);
- write32(MAC_REG + TDMA_CONS_INDEX, 0x0);
- write32(MAC_REG + TDMA_RING_REG_BASE + DMA_MBUF_DONE_THRESH,0x1);
- write32(MAC_REG + TDMA_FLOW_PERIOD,0x0);
- write32(MAC_REG + TDMA_RING_REG_BASE + DMA_RING_BUF_SIZE, (TX_DESCS << DMA_RING_SIZE_SHIFT) | RX_BUF_LENGTH);
- write32(MAC_REG + TDMA_REG_BASE + DMA_RING_CFG,1 << DEFAULT_Q);
+ write32(mac_reg_base_addr + TDMA_REG_BASE + DMA_SCB_BURST_SIZE, DMA_MAX_BURST_LENGTH);
+ write32(mac_reg_base_addr + TDMA_RING_REG_BASE + DMA_START_ADDR, 0x0);
+ write32(mac_reg_base_addr + TDMA_READ_PTR, 0x0);
+ write32(mac_reg_base_addr + TDMA_READ_PTR, 0x0);
+ write32(mac_reg_base_addr + TDMA_READ_PTR, 0x0);
+ write32(mac_reg_base_addr + TDMA_WRITE_PTR, 0x0);
+ write32(mac_reg_base_addr + TDMA_RING_REG_BASE + DMA_END_ADDR, TX_DESCS * DMA_DESC_SIZE / 4 - 1);
+ write32(mac_reg_base_addr + TDMA_PROD_INDEX, 0x0);
+ write32(mac_reg_base_addr + TDMA_CONS_INDEX, 0x0);
+ write32(mac_reg_base_addr + TDMA_RING_REG_BASE + DMA_MBUF_DONE_THRESH, 0x1);
+ write32(mac_reg_base_addr + TDMA_FLOW_PERIOD, 0x0);
+ write32(mac_reg_base_addr + TDMA_RING_REG_BASE + DMA_RING_BUF_SIZE, (TX_DESCS << DMA_RING_SIZE_SHIFT) | RX_BUF_LENGTH);
+ write32(mac_reg_base_addr + TDMA_REG_BASE + DMA_RING_CFG, 1 << DEFAULT_Q);
}
static void rx_descs_init(void)
@@ -284,55 +315,21 @@ static void rx_descs_init(void)
void *desc_base = (void *)RX_DESC_BASE;
len_stat = (RX_BUF_LENGTH << DMA_BUFLENGTH_SHIFT) | DMA_OWN;
- for (i = 0; i < RX_DESCS; i++) {
- write32((desc_base + i * DMA_DESC_SIZE + DMA_DESC_ADDRESS_LO), lower_32_bits((uintptr_t)&rxbuffs[i * RX_BUF_LENGTH]));
- write32((desc_base + i * DMA_DESC_SIZE + DMA_DESC_ADDRESS_HI),upper_32_bits((uintptr_t)&rxbuffs[i * RX_BUF_LENGTH]));
- write32((desc_base + i * DMA_DESC_SIZE + DMA_DESC_LENGTH_STATUS),len_stat);
- }
-}
-
-static int phy_startup(void)
-{
- int count = 1000000;
- while ((bcmgenet_mdio_read(1, BCM54213PE_MII_STATUS) & MII_STATUS_LINK_UP) && (--count))
- DELAY_MICROS(1);
- if(count > 0)
- {
- rt_kprintf("bcmgenet: PHY startup ok!\n");
- }
- else
- {
- rt_kprintf("bcmgenet: PHY startup err!\n");
- return 1;
- }
-
- if(bcmgenet_mdio_read(1, BCM54213PE_STATUS) == 0)
- {
- //todo
- }
- else
- {
- rt_kprintf("bcmgenet: BCM54213PE_STATUS err!\n");
- }
-
- if(bcmgenet_mdio_read(1, BCM54213PE_CONTROL) == (CONTROL_FULL_DUPLEX_CAPABILITY| CONTROL_HALF_DUPLEX_CAPABILITY))
- {
- //todo
- }
- else
+ for (i = 0; i < RX_DESCS; i++)
{
- rt_kprintf("bcmgenet: BCM54213PE_CONTROL err!\n");
+ write32((desc_base + i * DMA_DESC_SIZE + DMA_DESC_ADDRESS_LO), lower_32_bits((uintptr_t)&rxbuffs[i * RX_BUF_LENGTH]));
+ write32((desc_base + i * DMA_DESC_SIZE + DMA_DESC_ADDRESS_HI), upper_32_bits((uintptr_t)&rxbuffs[i * RX_BUF_LENGTH]));
+ write32((desc_base + i * DMA_DESC_SIZE + DMA_DESC_LENGTH_STATUS), len_stat);
}
-
- return 0;
}
static int bcmgenet_adjust_link(void)
{
rt_uint32_t speed;
- rt_uint32_t phy_dev_speed = SPEED_100;
-
- switch (phy_dev_speed) {
+ rt_uint32_t phy_dev_speed = link_speed;
+
+ switch (phy_dev_speed)
+ {
case SPEED_1000:
speed = UMAC_SPEED_1000;
break;
@@ -347,17 +344,25 @@ static int bcmgenet_adjust_link(void)
return -1;
}
- rt_uint32_t reg1 = read32(MAC_REG + EXT_RGMII_OOB_CTRL);
+ rt_uint32_t reg1 = read32(mac_reg_base_addr + EXT_RGMII_OOB_CTRL);
//reg1 &= ~(1UL << OOB_DISABLE);
//rt_kprintf("OOB_DISABLE is %d\n", OOB_DISABLE);
reg1 |= (RGMII_LINK | RGMII_MODE_EN | ID_MODE_DIS);
- write32(MAC_REG + EXT_RGMII_OOB_CTRL, reg1);
+ write32(mac_reg_base_addr + EXT_RGMII_OOB_CTRL, reg1);
DELAY_MICROS(1000);
- write32(MAC_REG + UMAC_CMD, speed << CMD_SPEED_SHIFT);
+ write32(mac_reg_base_addr + UMAC_CMD, speed << CMD_SPEED_SHIFT);
return 0;
}
+void link_irq(void *param)
+{
+ if ((bcmgenet_mdio_read(1, BCM54213PE_MII_STATUS) & MII_STATUS_LINK_UP) != 0)
+ {
+ rt_sem_release(&link_ack);
+ }
+}
+
static int bcmgenet_gmac_eth_start(void)
{
rt_uint32_t ret;
@@ -375,41 +380,37 @@ static int bcmgenet_gmac_eth_start(void)
/* Enable RX/TX DMA */
bcmgenet_enable_dma();
- /* read PHY properties over the wire from generic PHY set-up */
- ret = phy_startup();
- if (ret) {
- rt_kprintf("bcmgenet: PHY startup failed: %d\n", ret);
- return ret;
- }
-
/* Update MAC registers based on PHY property */
ret = bcmgenet_adjust_link();
- if (ret) {
+ if(ret)
+ {
rt_kprintf("bcmgenet: adjust PHY link failed: %d\n", ret);
return ret;
}
/* wait tx index clear */
- while ((read32(MAC_REG + TDMA_CONS_INDEX) != 0) && (--count))
- DELAY_MICROS(1);
+ while ((read32(mac_reg_base_addr + TDMA_CONS_INDEX) != 0) && (--count))
+ DELAY_MICROS(1);
- tx_index = read32(MAC_REG + TDMA_CONS_INDEX);
- write32(MAC_REG + TDMA_PROD_INDEX, tx_index);
+ tx_index = read32(mac_reg_base_addr + TDMA_CONS_INDEX);
+ write32(mac_reg_base_addr + TDMA_PROD_INDEX, tx_index);
- index_flag = read32(MAC_REG + RDMA_PROD_INDEX);
+ index_flag = read32(mac_reg_base_addr + RDMA_PROD_INDEX);
rx_index = index_flag % 256;
- write32(MAC_REG + RDMA_CONS_INDEX, index_flag);
- write32(MAC_REG + RDMA_PROD_INDEX, index_flag);
+ write32(mac_reg_base_addr + RDMA_CONS_INDEX, index_flag);
+ write32(mac_reg_base_addr + RDMA_PROD_INDEX, index_flag);
/* Enable Rx/Tx */
rt_uint32_t rx_tx_en;
- rx_tx_en = read32(MAC_REG + UMAC_CMD);
+ rx_tx_en = read32(mac_reg_base_addr + UMAC_CMD);
rx_tx_en |= (CMD_TX_EN | CMD_RX_EN);
- write32(MAC_REG + UMAC_CMD, rx_tx_en);
+ write32(mac_reg_base_addr + UMAC_CMD, rx_tx_en);
+ //IRQ
+ write32(mac_reg_base_addr + GENET_INTRL2_CPU_CLEAR_MASK, GENET_IRQ_TXDMA_DONE | GENET_IRQ_RXDMA_DONE);
return 0;
}
@@ -419,11 +420,12 @@ static rt_uint32_t bcmgenet_gmac_eth_recv(rt_uint8_t **packetp)
{
void* desc_base;
rt_uint32_t length = 0, addr = 0;
- rt_uint32_t prod_index = read32(MAC_REG + RDMA_PROD_INDEX);
+ rt_uint32_t prod_index = read32(mac_reg_base_addr + RDMA_PROD_INDEX);
//get next
if(prod_index == index_flag)
{
cur_recv_cnt = index_flag;
+ index_flag = 0x7fffffff;
//no buff
return 0;
}
@@ -433,7 +435,7 @@ static rt_uint32_t bcmgenet_gmac_eth_recv(rt_uint8_t **packetp)
{
return 0;
}
-
+
desc_base = RX_DESC_BASE + rx_index * DMA_DESC_SIZE;
length = read32(desc_base + DMA_DESC_LENGTH_STATUS);
length = (length >> DMA_BUFLENGTH_SHIFT) & DMA_BUFLENGTH_MASK;
@@ -449,9 +451,14 @@ static rt_uint32_t bcmgenet_gmac_eth_recv(rt_uint8_t **packetp)
{
rx_index = 0;
}
- write32(MAC_REG + RDMA_CONS_INDEX, cur_recv_cnt);
+ write32(mac_reg_base_addr + RDMA_CONS_INDEX, cur_recv_cnt);
cur_recv_cnt = cur_recv_cnt + 1;
+
+ if(cur_recv_cnt > 0xffff)
+ {
+ cur_recv_cnt = 0;
+ }
prev_recv_cnt = cur_recv_cnt;
return length;
@@ -460,52 +467,120 @@ static rt_uint32_t bcmgenet_gmac_eth_recv(rt_uint8_t **packetp)
static int bcmgenet_gmac_eth_send(void *packet, int length)
{
- void* desc_base = (TX_DESC_BASE + tx_index * DMA_DESC_SIZE);
+ void *desc_base = (TX_DESC_BASE + tx_index * DMA_DESC_SIZE);
rt_uint32_t len_stat = length << DMA_BUFLENGTH_SHIFT;
rt_uint32_t prod_index, cons;
rt_uint32_t tries = 100;
-
- prod_index = read32(MAC_REG + TDMA_PROD_INDEX);
+
+ prod_index = read32(mac_reg_base_addr + TDMA_PROD_INDEX);
len_stat |= 0x3F << DMA_TX_QTAG_SHIFT;
len_stat |= DMA_TX_APPEND_CRC | DMA_SOP | DMA_EOP;
- write32((desc_base + DMA_DESC_ADDRESS_LO),SEND_DATA_NO_CACHE);
- write32((desc_base + DMA_DESC_ADDRESS_HI),0);
- write32((desc_base + DMA_DESC_LENGTH_STATUS),len_stat);
+ write32((desc_base + DMA_DESC_ADDRESS_LO), SEND_DATA_NO_CACHE);
+ write32((desc_base + DMA_DESC_ADDRESS_HI), 0);
+ write32((desc_base + DMA_DESC_LENGTH_STATUS), len_stat);
+
+ tx_index = tx_index + 1;
+ prod_index = prod_index + 1;
+
+ if (prod_index == 0xe000)
+ {
+ write32(mac_reg_base_addr + TDMA_PROD_INDEX, 0);
+ prod_index = 0;
+ }
- if(++tx_index>= TX_DESCS)
+ if (tx_index == 256)
{
tx_index = 0;
}
- prod_index++;
+
/* Start Transmisson */
- write32(MAC_REG + TDMA_PROD_INDEX,prod_index);
+ write32(mac_reg_base_addr + TDMA_PROD_INDEX, prod_index);
- do {
- cons = read32(MAC_REG + TDMA_CONS_INDEX);
+ do
+ {
+ cons = read32(mac_reg_base_addr + TDMA_CONS_INDEX);
} while ((cons & 0xffff) < prod_index && --tries);
+
if (!tries)
{
+ rt_kprintf("send err! tries is %d\n", tries);
return -1;
}
return 0;
}
-static rt_err_t bcmgenet_eth_init(rt_device_t device)
+static void link_task_entry(void *param)
{
- struct eth_device *eth_device = (struct eth_device *)device;
+ struct eth_device *eth_device = (struct eth_device *)param;
RT_ASSERT(eth_device != RT_NULL);
+ struct rt_eth_dev *dev = ð_dev;
+ //start mdio
+ bcmgenet_mdio_init();
+ //start timer link
+ rt_timer_init(&dev->link_timer, "link_timer",
+ link_irq,
+ NULL,
+ 100,
+ RT_TIMER_FLAG_PERIODIC);
+ rt_timer_start(&dev->link_timer);
+
+ //link wait forever
+ rt_sem_take(&link_ack, RT_WAITING_FOREVER);
+ eth_device_linkchange(ð_dev.parent, RT_TRUE); //link up
+ rt_timer_stop(&dev->link_timer);
+
+ //set mac
+ bcmgenet_gmac_write_hwaddr();
+ bcmgenet_gmac_write_hwaddr();
+
+ //check link speed
+ if ((bcmgenet_mdio_read(1, BCM54213PE_STATUS) & (1 << 10)) || (bcmgenet_mdio_read(1, BCM54213PE_STATUS) & (1 << 11)))
+ {
+ link_speed = 1000;
+ rt_kprintf("Support link mode Speed 1000M\n");
+ }
+ else if ((bcmgenet_mdio_read(1, 0x05) & (1 << 7)) || (bcmgenet_mdio_read(1, 0x05) & (1 << 8)) || (bcmgenet_mdio_read(1, 0x05) & (1 << 9)))
+ {
+ link_speed = 100;
+ rt_kprintf("Support link mode Speed 100M\n");
+ }
+ else
+ {
+ link_speed = 10;
+ rt_kprintf("Support link mode Speed 10M\n");
+ }
+
+ bcmgenet_gmac_eth_start();
+ //irq or poll
+#ifdef ETH_RX_POLL
+ rt_timer_init(&dev->rx_poll_timer, "rx_poll_timer",
+ eth_rx_irq,
+ NULL,
+ 1,
+ RT_TIMER_FLAG_PERIODIC);
+
+ rt_timer_start(&dev->rx_poll_timer);
+#else
+ rt_hw_interrupt_install(ETH_IRQ, eth_rx_irq, NULL, "eth_irq");
+ rt_hw_interrupt_umask(ETH_IRQ);
+#endif
+ link_flag = 1;
+}
+
+static rt_err_t bcmgenet_eth_init(rt_device_t device)
+{
rt_uint32_t ret = 0;
rt_uint32_t hw_reg = 0;
- struct rt_eth_dev *dev = ð_dev;
-
+
/* Read GENET HW version */
rt_uint8_t major = 0;
- hw_reg = read32(MAC_REG + SYS_REV_CTRL);
+ hw_reg = read32(mac_reg_base_addr + SYS_REV_CTRL);
major = (hw_reg >> 24) & 0x0f;
- if (major != 6) {
+ if (major != 6)
+ {
if (major == 5)
major = 4;
else if (major == 0)
@@ -514,37 +589,26 @@ static rt_err_t bcmgenet_eth_init(rt_device_t device)
rt_kprintf("Uns upported GENETv%d.%d\n", major, (hw_reg >> 16) & 0x0f);
return RT_ERROR;
}
-
/* set interface */
ret = bcmgenet_interface_set();
if (ret)
{
return ret;
- }
+ }
/* rbuf clear */
- write32(MAC_REG + SYS_RBUF_FLUSH_CTRL, 0);
+ write32(mac_reg_base_addr + SYS_RBUF_FLUSH_CTRL, 0);
/* disable MAC while updating its registers */
- write32(MAC_REG + UMAC_CMD, 0);
+ write32(mac_reg_base_addr + UMAC_CMD, 0);
/* issue soft reset with (rg)mii loopback to ensure a stable rxclk */
- write32(MAC_REG + UMAC_CMD, CMD_SW_RESET | CMD_LCL_LOOP_EN);
-
- bcmgenet_mdio_init();
-
- bcmgenet_gmac_write_hwaddr();
- bcmgenet_gmac_write_hwaddr();
-
- bcmgenet_gmac_eth_start();
-
- //irq or poll
- rt_timer_init(&dev->rx_poll_timer, "rx_poll_timer",
- eth_rx_irq,
- NULL,
- 1,
- RT_TIMER_FLAG_PERIODIC);
+ write32(mac_reg_base_addr + UMAC_CMD, CMD_SW_RESET | CMD_LCL_LOOP_EN);
- rt_timer_start(&dev->rx_poll_timer);
+ link_thread_tid = rt_thread_create("link", link_task_entry, (void *)device,
+ LINK_THREAD_STACK_SIZE,
+ LINK_THREAD_PRIORITY, LINK_THREAD_TIMESLICE);
+ if (link_thread_tid != RT_NULL)
+ rt_thread_startup(link_thread_tid);
return RT_EOK;
}
@@ -554,10 +618,12 @@ static rt_err_t bcmgenet_eth_control(rt_device_t dev, int cmd, void *args)
switch (cmd)
{
case NIOCTL_GADDR:
- if (args) rt_memcpy(args, eth_dev.dev_addr, 6);
- else return -RT_ERROR;
+ if (args)
+ rt_memcpy(args, eth_dev.dev_addr, 6);
+ else
+ return -RT_ERROR;
break;
- default :
+ default:
break;
}
return RT_EOK;
@@ -565,15 +631,17 @@ static rt_err_t bcmgenet_eth_control(rt_device_t dev, int cmd, void *args)
rt_err_t rt_eth_tx(rt_device_t device, struct pbuf *p)
{
- rt_uint32_t sendbuf = SEND_DATA_NO_CACHE;
+ rt_uint32_t sendbuf = (rt_uint32_t)eth_send_no_cache;
/* lock eth device */
- rt_sem_take(&sem_lock, RT_WAITING_FOREVER);
- //struct rt_eth_dev *dev = (struct rt_eth_dev *) device;
- pbuf_copy_partial(p, (void *)&send_cache_pbuf[0], p->tot_len, 0);
- rt_memcpy((void *)sendbuf, send_cache_pbuf, p->tot_len);
+ if (link_flag == 1)
+ {
+ rt_sem_take(&sem_lock, RT_WAITING_FOREVER);
+ pbuf_copy_partial(p, (void *)&send_cache_pbuf[0], p->tot_len, 0);
+ rt_memcpy((void *)sendbuf, send_cache_pbuf, p->tot_len);
- bcmgenet_gmac_eth_send((void *)sendbuf, p->tot_len);
- rt_sem_release(&sem_lock);
+ bcmgenet_gmac_eth_send((void *)sendbuf, p->tot_len);
+ rt_sem_release(&sem_lock);
+ }
return RT_EOK;
}
@@ -583,16 +651,19 @@ struct pbuf *rt_eth_rx(rt_device_t device)
int recv_len = 0;
rt_uint32_t addr_point[8];
struct pbuf *pbuf = RT_NULL;
- rt_sem_take(&sem_lock, RT_WAITING_FOREVER);
-
- recv_len = bcmgenet_gmac_eth_recv((rt_uint8_t **)&addr_point[0]);
-
- if(recv_len > 0)
+ if (link_flag == 1)
{
- pbuf = pbuf_alloc(PBUF_LINK, recv_len, PBUF_RAM);
- rt_memcpy(pbuf->payload, (char *)addr_point[0], recv_len);
+ rt_sem_take(&sem_lock, RT_WAITING_FOREVER);
+ recv_len = bcmgenet_gmac_eth_recv((rt_uint8_t **)&addr_point[0]);
+ if (recv_len > 0)
+ {
+ pbuf = pbuf_alloc(PBUF_LINK, recv_len, PBUF_RAM);
+ //calc offset
+ addr_point[0] = (rt_uint32_t)(addr_point[0] + (eth_recv_no_cache - RECV_DATA_NO_CACHE));
+ rt_memcpy(pbuf->payload, (char *)addr_point[0], recv_len);
+ }
+ rt_sem_release(&sem_lock);
}
- rt_sem_release(&sem_lock);
return pbuf;
}
@@ -601,14 +672,14 @@ int rt_hw_eth_init(void)
rt_uint8_t mac_addr[6];
rt_sem_init(&sem_lock, "eth_lock", 1, RT_IPC_FLAG_FIFO);
+ rt_sem_init(&link_ack, "link_ack", 0, RT_IPC_FLAG_FIFO);
memset(ð_dev, 0, sizeof(eth_dev));
- memset((void *)SEND_DATA_NO_CACHE, 0, sizeof(DMA_DISC_ADDR_SIZE));
- memset((void *)RECV_DATA_NO_CACHE, 0, sizeof(DMA_DISC_ADDR_SIZE));
-
+ memset((void *)eth_send_no_cache, 0, sizeof(DMA_DISC_ADDR_SIZE));
+ memset((void *)eth_recv_no_cache, 0, sizeof(DMA_DISC_ADDR_SIZE));
bcm271x_mbox_hardware_get_mac_address(&mac_addr[0]);
- eth_dev.iobase = MAC_REG;
+ eth_dev.iobase = mac_reg_base_addr;
eth_dev.name = "e0";
eth_dev.dev_addr[0] = mac_addr[0];
eth_dev.dev_addr[1] = mac_addr[1];
@@ -629,9 +700,8 @@ int rt_hw_eth_init(void)
eth_dev.parent.eth_tx = rt_eth_tx;
eth_dev.parent.eth_rx = rt_eth_rx;
-
eth_device_init(&(eth_dev.parent), "e0");
- eth_device_linkchange(ð_dev.parent, RT_TRUE); //linkup the e0 for lwip to check
+ eth_device_linkchange(ð_dev.parent, RT_FALSE); //link down
return 0;
}
INIT_COMPONENT_EXPORT(rt_hw_eth_init);
diff --git a/bsp/raspberry-pi/raspi4-32/driver/drv_eth.h b/bsp/raspberry-pi/raspi4-32/driver/drv_eth.h
index 708e626975c36d10307c74f534ce37a28b1af4ee..860674847a4916b0c78e498913caf24836815aa8 100644
--- a/bsp/raspberry-pi/raspi4-32/driver/drv_eth.h
+++ b/bsp/raspberry-pi/raspi4-32/driver/drv_eth.h
@@ -12,7 +12,6 @@
#ifndef __DRV_ETH_H__
#define __DRV_ETH_H__
-#define MAC_REG (void *)(0xfd580000)
//#define BIT(nr) (1UL << (nr))
@@ -53,6 +52,17 @@
#define MDIO_REG_SHIFT (16)
#define MDIO_REG_MASK (0x1f)
+#define GENET_INTRL2_OFF (0x0200)
+#define GENET_INTRL2_CPU_STAT (GENET_INTRL2_OFF + 0x00)
+#define GENET_INTRL2_CPU_CLEAR (GENET_INTRL2_OFF + 0x08)
+#define GENET_INTRL2_CPU_STAT_MASK (GENET_INTRL2_OFF + 0x0c)
+#define GENET_INTRL2_CPU_SET_MASK (GENET_INTRL2_OFF + 0x10)
+#define GENET_INTRL2_CPU_CLEAR_MASK (GENET_INTRL2_OFF + 0x14)
+#define GENET_IRQ_MDIO_ERROR BIT(24)
+#define GENET_IRQ_MDIO_DONE BIT(23)
+#define GENET_IRQ_TXDMA_DONE BIT(16)
+#define GENET_IRQ_RXDMA_DONE BIT(13)
+
#define CMD_TX_EN BIT(0)
#define CMD_RX_EN BIT(1)
#define UMAC_SPEED_10 (0)
diff --git a/bsp/raspberry-pi/raspi4-32/driver/drv_gpio.c b/bsp/raspberry-pi/raspi4-32/driver/drv_gpio.c
index b2d2ed79c49a34198094442da0c8a92d09917c63..b9f6689ae3e38ea8d4e8a9fd7a92f862b3a72248 100644
--- a/bsp/raspberry-pi/raspi4-32/driver/drv_gpio.c
+++ b/bsp/raspberry-pi/raspi4-32/driver/drv_gpio.c
@@ -23,26 +23,26 @@ static struct gpio_irq_def _g_gpio_irq_tbl[GPIO_IRQ_NUM];
uint32_t raspi_get_pin_state(uint32_t fselnum)
{
uint32_t gpfsel = 0;
-
+
switch (fselnum)
{
case 0:
- gpfsel = GPIO_REG_GPFSEL0(GPIO_BASE);
+ gpfsel = GPIO_REG_GPFSEL0(gpio_base_addr);
break;
case 1:
- gpfsel = GPIO_REG_GPFSEL1(GPIO_BASE);
+ gpfsel = GPIO_REG_GPFSEL1(gpio_base_addr);
break;
case 2:
- gpfsel = GPIO_REG_GPFSEL2(GPIO_BASE);
+ gpfsel = GPIO_REG_GPFSEL2(gpio_base_addr);
break;
case 3:
- gpfsel = GPIO_REG_GPFSEL3(GPIO_BASE);
+ gpfsel = GPIO_REG_GPFSEL3(gpio_base_addr);
break;
case 4:
- gpfsel = GPIO_REG_GPFSEL4(GPIO_BASE);
+ gpfsel = GPIO_REG_GPFSEL4(gpio_base_addr);
break;
case 5:
- gpfsel = GPIO_REG_GPFSEL5(GPIO_BASE);
+ gpfsel = GPIO_REG_GPFSEL5(gpio_base_addr);
break;
default:
break;
@@ -55,22 +55,22 @@ void raspi_set_pin_state(uint32_t fselnum, uint32_t gpfsel)
switch (fselnum)
{
case 0:
- GPIO_REG_GPFSEL0(GPIO_BASE) = gpfsel;
+ GPIO_REG_GPFSEL0(gpio_base_addr) = gpfsel;
break;
case 1:
- GPIO_REG_GPFSEL1(GPIO_BASE) = gpfsel;
+ GPIO_REG_GPFSEL1(gpio_base_addr) = gpfsel;
break;
case 2:
- GPIO_REG_GPFSEL2(GPIO_BASE) = gpfsel;
+ GPIO_REG_GPFSEL2(gpio_base_addr) = gpfsel;
break;
case 3:
- GPIO_REG_GPFSEL3(GPIO_BASE) = gpfsel;
+ GPIO_REG_GPFSEL3(gpio_base_addr) = gpfsel;
break;
case 4:
- GPIO_REG_GPFSEL4(GPIO_BASE) = gpfsel;
+ GPIO_REG_GPFSEL4(gpio_base_addr) = gpfsel;
break;
case 5:
- GPIO_REG_GPFSEL5(GPIO_BASE) = gpfsel;
+ GPIO_REG_GPFSEL5(gpio_base_addr) = gpfsel;
break;
default:
break;
@@ -86,22 +86,22 @@ static void gpio_set_pud(GPIO_PIN pin, GPIO_PUPD_FUNC mode)
switch (fselnum)
{
case 0:
- reg_value = GPIO_PUP_PDN_CNTRL_REG0(GPIO_BASE);
- GPIO_PUP_PDN_CNTRL_REG0(GPIO_BASE) = (reg_value | (mode << (fselrest*2)));
+ reg_value = GPIO_PUP_PDN_CNTRL_REG0(gpio_base_addr);
+ GPIO_PUP_PDN_CNTRL_REG0(gpio_base_addr) = (reg_value | (mode << (fselrest*2)));
break;
case 1:
- reg_value = GPIO_PUP_PDN_CNTRL_REG1(GPIO_BASE);
- GPIO_PUP_PDN_CNTRL_REG1(GPIO_BASE) = (reg_value | (mode << (fselrest*2)));
+ reg_value = GPIO_PUP_PDN_CNTRL_REG1(gpio_base_addr);
+ GPIO_PUP_PDN_CNTRL_REG1(gpio_base_addr) = (reg_value | (mode << (fselrest*2)));
break;
case 2:
- reg_value = GPIO_PUP_PDN_CNTRL_REG2(GPIO_BASE);
- GPIO_PUP_PDN_CNTRL_REG2(GPIO_BASE) = (reg_value | (mode << (fselrest*2)));
+ reg_value = GPIO_PUP_PDN_CNTRL_REG2(gpio_base_addr);
+ GPIO_PUP_PDN_CNTRL_REG2(gpio_base_addr) = (reg_value | (mode << (fselrest*2)));
break;
case 3:
- reg_value = GPIO_PUP_PDN_CNTRL_REG3(GPIO_BASE);
- GPIO_PUP_PDN_CNTRL_REG3(GPIO_BASE) = (reg_value | (mode << (fselrest*2)));
+ reg_value = GPIO_PUP_PDN_CNTRL_REG3(gpio_base_addr);
+ GPIO_PUP_PDN_CNTRL_REG3(gpio_base_addr) = (reg_value | (mode << (fselrest*2)));
break;
default:
break;
@@ -128,23 +128,24 @@ void prev_raspi_pin_write(GPIO_PIN pin, int pin_value)
{
if(pin_value == 1)
{
- GPIO_REG_GPSET0(GPIO_BASE) = 1 << (pin % 32);
+ GPIO_REG_GPSET0(gpio_base_addr) = 1 << (pin % 32);
}
else
{
- GPIO_REG_GPCLR0(GPIO_BASE) = 1 << (pin % 32);
+ GPIO_REG_GPCLR0(gpio_base_addr) = 1 << (pin % 32);
}
}
else
{
if(pin_value == 1)
{
- GPIO_REG_GPSET1(GPIO_BASE) = 1 << (pin % 32);
+ GPIO_REG_GPSET1(gpio_base_addr) = 1 << (pin % 32);
}
else
{
- GPIO_REG_GPCLR1(GPIO_BASE) = 1 << (pin % 32);
+ GPIO_REG_GPCLR1(gpio_base_addr) = 1 << (pin % 32);
}
+
}
}
@@ -187,7 +188,7 @@ static int raspi_pin_read(struct rt_device *device, rt_base_t pin)
if(num == 0)
{
- if(GPIO_REG_GPLEV0(GPIO_BASE) & (1 << pin))
+ if(GPIO_REG_GPLEV0(gpio_base_addr) & (1 << pin))
{
pin_level = 1;
}
@@ -199,7 +200,7 @@ static int raspi_pin_read(struct rt_device *device, rt_base_t pin)
}
else
{
- if(GPIO_REG_GPLEV1(GPIO_BASE) & (1 << pin))
+ if(GPIO_REG_GPLEV1(gpio_base_addr) & (1 << pin))
{
pin_level = 1;
}
@@ -235,65 +236,65 @@ static rt_err_t raspi_pin_attach_irq(struct rt_device *device, rt_int32_t pin, r
case PIN_IRQ_MODE_RISING:
if(pin_num == 0)
{
- reg_value = GPIO_REG_GPREN0(GPIO_BASE);
- GPIO_REG_GPREN0(GPIO_BASE) = (reg_value & ~ mask) | (mask);
+ reg_value = GPIO_REG_GPREN0(gpio_base_addr);
+ GPIO_REG_GPREN0(gpio_base_addr) = (reg_value & ~ mask) | (mask);
}
else
{
- reg_value = GPIO_REG_GPREN1(GPIO_BASE);
- GPIO_REG_GPREN1(GPIO_BASE) = (reg_value & ~ mask) | (mask);
+ reg_value = GPIO_REG_GPREN1(gpio_base_addr);
+ GPIO_REG_GPREN1(gpio_base_addr) = (reg_value & ~ mask) | (mask);
}
break;
case PIN_IRQ_MODE_FALLING:
if(pin_num == 0)
{
- reg_value = GPIO_REG_GPFEN0(GPIO_BASE);
- GPIO_REG_GPFEN0(GPIO_BASE) = (reg_value & ~ mask) | (mask);
+ reg_value = GPIO_REG_GPFEN0(gpio_base_addr);
+ GPIO_REG_GPFEN0(gpio_base_addr) = (reg_value & ~ mask) | (mask);
}
else
{
- reg_value = GPIO_REG_GPFEN1(GPIO_BASE);
- GPIO_REG_GPFEN1(GPIO_BASE) = (reg_value & ~ mask) | (mask);
+ reg_value = GPIO_REG_GPFEN1(gpio_base_addr);
+ GPIO_REG_GPFEN1(gpio_base_addr) = (reg_value & ~ mask) | (mask);
}
break;
case PIN_IRQ_MODE_RISING_FALLING:
if(pin_num == 0)
{
- reg_value = GPIO_REG_GPAREN0(GPIO_BASE);
- GPIO_REG_GPAREN0(GPIO_BASE) = (reg_value & ~ mask) | (mask);
- reg_value = GPIO_REG_GPFEN0(GPIO_BASE);
- GPIO_REG_GPFEN0(GPIO_BASE) = (reg_value & ~ mask) | (mask);
+ reg_value = GPIO_REG_GPAREN0(gpio_base_addr);
+ GPIO_REG_GPAREN0(gpio_base_addr) = (reg_value & ~ mask) | (mask);
+ reg_value = GPIO_REG_GPFEN0(gpio_base_addr);
+ GPIO_REG_GPFEN0(gpio_base_addr) = (reg_value & ~ mask) | (mask);
}
else
{
- reg_value = GPIO_REG_GPAREN1(GPIO_BASE);
- GPIO_REG_GPAREN1(GPIO_BASE) = (reg_value & ~ mask) | (mask);
- reg_value = GPIO_REG_GPFEN1(GPIO_BASE);
- GPIO_REG_GPFEN1(GPIO_BASE) = (reg_value & ~ mask) | (mask);
+ reg_value = GPIO_REG_GPAREN1(gpio_base_addr);
+ GPIO_REG_GPAREN1(gpio_base_addr) = (reg_value & ~ mask) | (mask);
+ reg_value = GPIO_REG_GPFEN1(gpio_base_addr);
+ GPIO_REG_GPFEN1(gpio_base_addr) = (reg_value & ~ mask) | (mask);
}
break;
case PIN_IRQ_MODE_HIGH_LEVEL:
if(pin_num == 0)
{
- reg_value = GPIO_REG_GPHEN0(GPIO_BASE);
- GPIO_REG_GPHEN0(GPIO_BASE) = (reg_value & ~ mask) | (mask);
+ reg_value = GPIO_REG_GPHEN0(gpio_base_addr);
+ GPIO_REG_GPHEN0(gpio_base_addr) = (reg_value & ~ mask) | (mask);
}
else
{
- reg_value = GPIO_REG_GPHEN1(GPIO_BASE);
- GPIO_REG_GPHEN1(GPIO_BASE) = (reg_value & ~ mask) | ( mask);
+ reg_value = GPIO_REG_GPHEN1(gpio_base_addr);
+ GPIO_REG_GPHEN1(gpio_base_addr) = (reg_value & ~ mask) | ( mask);
}
break;
case PIN_IRQ_MODE_LOW_LEVEL:
if(pin_num == 0)
{
- reg_value = GPIO_REG_GPLEN0(GPIO_BASE);
- GPIO_REG_GPLEN0(GPIO_BASE) = (reg_value & ~ mask) | (mask);
+ reg_value = GPIO_REG_GPLEN0(gpio_base_addr);
+ GPIO_REG_GPLEN0(gpio_base_addr) = (reg_value & ~ mask) | (mask);
}
else
{
- reg_value = GPIO_REG_GPLEN1(GPIO_BASE);
- GPIO_REG_GPLEN1(GPIO_BASE) = (reg_value & ~ mask) | (mask);
+ reg_value = GPIO_REG_GPLEN1(gpio_base_addr);
+ GPIO_REG_GPLEN1(gpio_base_addr) = (reg_value & ~ mask) | (mask);
}
break;
}
@@ -357,30 +358,30 @@ static void gpio_irq_handler(int irq, void *param)
if(irq == IRQ_GPIO0)
{
/* 0~27 */
- value = GPIO_REG_GPEDS0(GPIO_BASE);
+ value = GPIO_REG_GPEDS0(gpio_base_addr);
value &= 0x0fffffff;
pin = 0;
- GPIO_REG_GPEDS0(GPIO_BASE) = value;
+ GPIO_REG_GPEDS0(gpio_base_addr) = value;
}
else if(irq == IRQ_GPIO1)
{
/* 28-45 */
- tmpvalue = GPIO_REG_GPEDS0(GPIO_BASE);
+ tmpvalue = GPIO_REG_GPEDS0(gpio_base_addr);
tmpvalue &= (~0x0fffffff);
- GPIO_REG_GPEDS0(GPIO_BASE) = tmpvalue;
+ GPIO_REG_GPEDS0(gpio_base_addr) = tmpvalue;
- value = GPIO_REG_GPEDS1(GPIO_BASE);
+ value = GPIO_REG_GPEDS1(gpio_base_addr);
value &= 0x3fff;
- GPIO_REG_GPEDS1(GPIO_BASE) = value;
+ GPIO_REG_GPEDS1(gpio_base_addr) = value;
value = (value) | tmpvalue;
pin = 28;
}
else if (irq == IRQ_GPIO2)
{
/* 46-53 */
- value = GPIO_REG_GPEDS1(GPIO_BASE);
+ value = GPIO_REG_GPEDS1(gpio_base_addr);
value &= (~0x3fff);
- GPIO_REG_GPEDS1(GPIO_BASE) = value;
+ GPIO_REG_GPEDS1(gpio_base_addr) = value;
pin = 46;
}
@@ -405,23 +406,23 @@ int rt_hw_gpio_init(void)
rt_device_pin_register("gpio", &ops, RT_NULL);
//disable all intr
- GPIO_REG_GPEDS0(GPIO_BASE) = 0xffffffff;
- GPIO_REG_GPEDS1(GPIO_BASE) = 0xffffffff;
+ GPIO_REG_GPEDS0(gpio_base_addr) = 0xffffffff;
+ GPIO_REG_GPEDS1(gpio_base_addr) = 0xffffffff;
- GPIO_REG_GPREN0(GPIO_BASE) = 0x0;
- GPIO_REG_GPREN1(GPIO_BASE) = 0x0;
+ GPIO_REG_GPREN0(gpio_base_addr) = 0x0;
+ GPIO_REG_GPREN1(gpio_base_addr) = 0x0;
- GPIO_REG_GPFEN0(GPIO_BASE) = 0x0;
- GPIO_REG_GPFEN1(GPIO_BASE) = 0x0;
+ GPIO_REG_GPFEN0(gpio_base_addr) = 0x0;
+ GPIO_REG_GPFEN1(gpio_base_addr) = 0x0;
- GPIO_REG_GPHEN0(GPIO_BASE) = 0x0;
- GPIO_REG_GPHEN1(GPIO_BASE) = 0x0;
+ GPIO_REG_GPHEN0(gpio_base_addr) = 0x0;
+ GPIO_REG_GPHEN1(gpio_base_addr) = 0x0;
- GPIO_REG_GPAREN0(GPIO_BASE) = 0x0;
- GPIO_REG_GPAREN1(GPIO_BASE) = 0x0;
+ GPIO_REG_GPAREN0(gpio_base_addr) = 0x0;
+ GPIO_REG_GPAREN1(gpio_base_addr) = 0x0;
- GPIO_REG_GPAFEN0(GPIO_BASE) = 0x0;
- GPIO_REG_GPAFEN0(GPIO_BASE) = 0x0;
+ GPIO_REG_GPAFEN0(gpio_base_addr) = 0x0;
+ GPIO_REG_GPAFEN0(gpio_base_addr) = 0x0;
rt_hw_interrupt_install(IRQ_GPIO0, gpio_irq_handler, &_g_gpio_irq_tbl[0], "gpio0_irq");
rt_hw_interrupt_umask(IRQ_GPIO0);
diff --git a/bsp/raspberry-pi/raspi4-32/driver/drv_sdio.c b/bsp/raspberry-pi/raspi4-32/driver/drv_sdio.c
index 8d34f3ab739dda30a3794b78fd8703e45843151f..9d4824e310d9233f3bed3f1e8d5b301bb16b2388 100644
--- a/bsp/raspberry-pi/raspi4-32/driver/drv_sdio.c
+++ b/bsp/raspberry-pi/raspi4-32/driver/drv_sdio.c
@@ -103,8 +103,8 @@ rt_err_t sd_int(struct sdhci_pdata_t * pdat, rt_uint32_t mask)
{
write32(pdat->virt + EMMC_INTERRUPT, r);
//qemu maybe can not use sdcard
- //rt_kprintf("send cmd/data timeout wait for %x int: %x, status: %x\n",mask, r, read32(pdat->virt + EMMC_STATUS));
- //return -RT_ETIMEOUT;
+ rt_kprintf("send cmd/data timeout wait for %x int: %x, status: %x\n",mask, r, read32(pdat->virt + EMMC_STATUS));
+ return -RT_ETIMEOUT;
}
else if (r & INT_ERROR_MASK)
{
@@ -552,9 +552,8 @@ static rt_err_t reset_emmc(struct sdhci_pdata_t * pdat)
// Clear control2
write32(pdat->virt + EMMC_CONTROL2, 0);
-
- // Get the base clock rate
- mmc_base_clock = bcm271x_mbox_clock_get_rate(12);
+ // Get the base clock rate //12
+ mmc_base_clock = bcm271x_mbox_clock_get_rate(EMMC_CLK_ID);
if(mmc_base_clock == 0)
{
rt_kprintf("EMMC: assuming clock rate to be 100MHz\n");
@@ -590,7 +589,6 @@ int raspi_sdmmc_init(void)
struct rt_mmcsd_host * host = RT_NULL;
struct sdhci_pdata_t * pdat = RT_NULL;
struct sdhci_t * sdhci = RT_NULL;
-
#ifdef BSP_USING_SDIO0
host = mmcsd_alloc_host();
if (!host)
@@ -598,7 +596,6 @@ int raspi_sdmmc_init(void)
rt_kprintf("alloc host failed");
goto err;
}
-
sdhci = rt_malloc(sizeof(struct sdhci_t));
if (!sdhci)
{
@@ -607,18 +604,16 @@ int raspi_sdmmc_init(void)
}
rt_memset(sdhci, 0, sizeof(struct sdhci_t));
- virt = MMC2_BASE_ADDR;
-
+ virt = mmc2_base_addr;
pdat = (struct sdhci_pdata_t *)rt_malloc(sizeof(struct sdhci_pdata_t));
RT_ASSERT(pdat != RT_NULL);
pdat->virt = (rt_uint32_t)virt;
reset_emmc(pdat);
-
sdhci->name = "sd0";
sdhci->voltages = VDD_33_34;
sdhci->width = MMCSD_BUSWIDTH_4;
- sdhci->clock = 250 * 1000 * 1000;
+ sdhci->clock = 1000 * 1000 * 1000;
sdhci->removeable = RT_TRUE;
sdhci->detect = sdhci_detect;
@@ -634,10 +629,9 @@ int raspi_sdmmc_init(void)
host->max_seg_size = 2048;
host->max_dma_segs = 10;
host->max_blk_size = 512;
- host->max_blk_count = 4096;
+ host->max_blk_count = 1;
host->private_data = sdhci;
-
write32((pdat->virt + EMMC_IRPT_EN),0xffffffff);
write32((pdat->virt + EMMC_IRPT_MASK),0xffffffff);
#ifdef RT_MMCSD_DBG
diff --git a/bsp/raspberry-pi/raspi4-32/driver/drv_spi.c b/bsp/raspberry-pi/raspi4-32/driver/drv_spi.c
index 90ea26f7ab6715cb589a1337f5955612b0548c78..d072869048fac5dd2d4c874f512e08cb6805b1a3 100644
--- a/bsp/raspberry-pi/raspi4-32/driver/drv_spi.c
+++ b/bsp/raspberry-pi/raspi4-32/driver/drv_spi.c
@@ -14,7 +14,7 @@
#include "raspi4.h"
#include "drv_spi.h"
-#ifdef RT_USING_SPI
+#ifdef BSP_USING_SPI
#define RPI_CORE_CLK_HZ (250000000)
#define BSP_SPI_MAX_HZ (30* 1000 *1000)
diff --git a/bsp/raspberry-pi/raspi4-32/driver/drv_uart.c b/bsp/raspberry-pi/raspi4-32/driver/drv_uart.c
index ae61d8422437f72bc5027b70f6d233c6ca9681f0..c4dad51757ec16e6dd0ad137090b643afab60e46 100644
--- a/bsp/raspberry-pi/raspi4-32/driver/drv_uart.c
+++ b/bsp/raspberry-pi/raspi4-32/driver/drv_uart.c
@@ -16,6 +16,12 @@
#include "board.h"
#include "drv_uart.h"
#include "drv_gpio.h"
+#include
+
+size_t uart0_addr = 0;
+size_t uart3_addr = 0;
+size_t uart4_addr = 0;
+size_t uart5_addr = 0;
#ifdef RT_USING_UART0
static struct rt_serial_device _serial0;
@@ -68,25 +74,25 @@ static rt_err_t uart_configure(struct rt_serial_device *serial, struct serial_co
return RT_EOK;
}
- if(uart->hw_base == UART0_BASE)
+ if(uart->hw_base == uart0_addr)
{
prev_raspi_pin_mode(GPIO_PIN_14, ALT0);
prev_raspi_pin_mode(GPIO_PIN_15, ALT0);
}
- if(uart->hw_base == UART3_BASE)
+ if(uart->hw_base == uart3_addr)
{
prev_raspi_pin_mode(GPIO_PIN_4, ALT4);
prev_raspi_pin_mode(GPIO_PIN_5, ALT4);
}
- if(uart->hw_base == UART4_BASE)
+ if(uart->hw_base == uart4_addr)
{
prev_raspi_pin_mode(GPIO_PIN_8, ALT4);
prev_raspi_pin_mode(GPIO_PIN_9, ALT4);
}
- if(uart->hw_base == UART5_BASE)
+ if(uart->hw_base == uart5_addr)
{
prev_raspi_pin_mode(GPIO_PIN_12, ALT4);
prev_raspi_pin_mode(GPIO_PIN_13, ALT4);
@@ -108,7 +114,6 @@ static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg
RT_ASSERT(serial != RT_NULL);
uart = (struct hw_uart_device *)serial->parent.user_data;
-
switch (cmd)
{
case RT_DEVICE_CTRL_CLR_INT:
@@ -143,7 +148,6 @@ static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg
static int uart_putc(struct rt_serial_device *serial, char c)
{
struct hw_uart_device *uart;
-
RT_ASSERT(serial != RT_NULL);
uart = (struct hw_uart_device *)serial->parent.user_data;
if(uart->hw_base == AUX_BASE)
@@ -208,7 +212,7 @@ static void rt_hw_uart_isr(int irqno, void *param)
{
PACTL_CS &= ~(IRQ_UART0);
rt_hw_serial_isr(&_serial0, RT_SERIAL_EVENT_RX_IND);
- PL011_REG_ICR(UART0_BASE) = PL011_INTERRUPT_RECEIVE;
+ PL011_REG_ICR(uart0_addr) = PL011_INTERRUPT_RECEIVE;
}
#endif
@@ -217,7 +221,7 @@ static void rt_hw_uart_isr(int irqno, void *param)
{
PACTL_CS &= ~(IRQ_UART3);
rt_hw_serial_isr(&_serial3, RT_SERIAL_EVENT_RX_IND);
- PL011_REG_ICR(UART3_BASE) = PL011_INTERRUPT_RECEIVE;
+ PL011_REG_ICR(uart3_addr) = PL011_INTERRUPT_RECEIVE;
}
#endif
@@ -226,7 +230,7 @@ static void rt_hw_uart_isr(int irqno, void *param)
{
PACTL_CS &= ~(IRQ_UART4);
rt_hw_serial_isr(&_serial4, RT_SERIAL_EVENT_RX_IND);
- PL011_REG_ICR(UART4_BASE) = PL011_INTERRUPT_RECEIVE;
+ PL011_REG_ICR(uart4_addr) = PL011_INTERRUPT_RECEIVE;
}
#endif
@@ -235,7 +239,7 @@ static void rt_hw_uart_isr(int irqno, void *param)
{
PACTL_CS &= ~(IRQ_UART5);
rt_hw_serial_isr(&_serial5, RT_SERIAL_EVENT_RX_IND);
- PL011_REG_ICR(UART5_BASE) = PL011_INTERRUPT_RECEIVE;
+ PL011_REG_ICR(uart5_addr) = PL011_INTERRUPT_RECEIVE;
}
#endif
}
@@ -292,11 +296,16 @@ int rt_hw_uart_init(void)
_serial0.ops = &_uart_ops;
_serial0.config = config;
+ uart0_addr = (size_t)rt_hw_kernel_phys_to_virt((void*)UART0_BASE, 0x1000);
+ uart0->hw_base = uart0_addr;
+
+
/* register UART0 device */
rt_hw_serial_register(&_serial0, "uart0",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
uart0);
rt_hw_interrupt_install(uart0->irqno, rt_hw_uart_isr, &_serial0, "uart0");
+
#endif
#ifdef RT_USING_UART1
@@ -305,6 +314,8 @@ int rt_hw_uart_init(void)
_serial1.ops = &_uart_ops;
_serial1.config = config;
+
+ uart1->hw_base = (size_t)rt_hw_kernel_phys_to_virt((void*)AUX_BASE, 0x1000);
/* register UART1 device */
rt_hw_serial_register(&_serial1, "uart1",
@@ -320,6 +331,9 @@ int rt_hw_uart_init(void)
_serial3.ops = &_uart_ops;
_serial3.config = config;
+ uart3_addr = (size_t)rt_hw_kernel_phys_to_virt((void*)UART3_BASE, 0x1000);
+ uart3->hw_base = uart3_addr;
+
/* register UART3 device */
rt_hw_serial_register(&_serial3, "uart3",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
@@ -334,6 +348,9 @@ int rt_hw_uart_init(void)
_serial4.ops = &_uart_ops;
_serial4.config = config;
+ uart4_addr = (size_t)rt_hw_kernel_phys_to_virt((void*)UART4_BASE, 0x1000);
+ uart4->hw_base = uart4_addr;
+
/* register UART4 device */
rt_hw_serial_register(&_serial4, "uart4",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
@@ -348,6 +365,9 @@ int rt_hw_uart_init(void)
_serial5.ops = &_uart_ops;
_serial5.config = config;
+ uart5_addr = (size_t)rt_hw_kernel_phys_to_virt((void*)UART5_BASE, 0x1000);
+ uart5->hw_base = uart5_addr;
+
/* register UART5 device */
rt_hw_serial_register(&_serial5, "uart5",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
@@ -356,3 +376,4 @@ int rt_hw_uart_init(void)
#endif
return 0;
}
+
diff --git a/bsp/raspberry-pi/raspi4-32/driver/mbox.c b/bsp/raspberry-pi/raspi4-32/driver/mbox.c
index b0c79e09bd7e676c073b73738b360a4b4482ade5..177b043a8a22cb8c11c8044e62e9d4adef856f90 100644
--- a/bsp/raspberry-pi/raspi4-32/driver/mbox.c
+++ b/bsp/raspberry-pi/raspi4-32/driver/mbox.c
@@ -11,18 +11,20 @@
*/
/* mailbox message buffer */
+#include
#include "mbox.h"
#include "mmu.h"
//volatile unsigned int __attribute__((aligned(16))) mbox[36];
-volatile unsigned int *mbox = (volatile unsigned int *) MBOX_ADDR;
+
#define BUS_ADDRESS(phys) (((phys) & ~0xC0000000) | 0xC0000000)
+volatile unsigned int *mbox;
/**
* Make a mailbox call. Returns 0 on failure, non-zero on success
*/
int mbox_call(unsigned char ch, int mmu_enable)
{
- unsigned int r = (((MBOX_ADDR)&~0xF) | (ch&0xF));
+ unsigned int r = ((((rt_uint32_t)MBOX_ADDR)&~0xF) | (ch&0xF));
if(mmu_enable)
r = BUS_ADDRESS(r);
/* wait until we can write to the mailbox */
diff --git a/bsp/raspberry-pi/raspi4-32/driver/mbox.h b/bsp/raspberry-pi/raspi4-32/driver/mbox.h
index ec31370f6bb40cd11de0cf8e3481c83d738f2279..eae6572503d6ade713b59dcae09b2d9cf318345b 100644
--- a/bsp/raspberry-pi/raspi4-32/driver/mbox.h
+++ b/bsp/raspberry-pi/raspi4-32/driver/mbox.h
@@ -40,12 +40,13 @@ extern volatile unsigned int* mbox;
#define MMIO_BASE 0xFE000000
#define VIDEOCORE_MBOX (MMIO_BASE+0x0000B880)
-#define MBOX_READ ((volatile unsigned int*)(VIDEOCORE_MBOX+0x0))
-#define MBOX_POLL ((volatile unsigned int*)(VIDEOCORE_MBOX+0x10))
-#define MBOX_SENDER ((volatile unsigned int*)(VIDEOCORE_MBOX+0x14))
-#define MBOX_STATUS ((volatile unsigned int*)(VIDEOCORE_MBOX+0x18))
-#define MBOX_CONFIG ((volatile unsigned int*)(VIDEOCORE_MBOX+0x1C))
-#define MBOX_WRITE ((volatile unsigned int*)(VIDEOCORE_MBOX+0x20))
+extern uint32_t videocore_mbox;
+#define MBOX_READ ((volatile unsigned int*)(videocore_mbox+0x0))
+#define MBOX_POLL ((volatile unsigned int*)(videocore_mbox+0x10))
+#define MBOX_SENDER ((volatile unsigned int*)(videocore_mbox+0x14))
+#define MBOX_STATUS ((volatile unsigned int*)(videocore_mbox+0x18))
+#define MBOX_CONFIG ((volatile unsigned int*)(videocore_mbox+0x1C))
+#define MBOX_WRITE ((volatile unsigned int*)(videocore_mbox+0x20))
#define MBOX_RESPONSE 0x80000000
#define MBOX_FULL 0x80000000
#define MBOX_EMPTY 0x40000000
@@ -133,6 +134,19 @@ enum {
#define MBOX_TAG_NOTIFY_XHCI_RESET 0x00030058
#define MBOX_ADDR 0x08000000
+extern uint32_t mbox_addr;
+
+#define RES_CLK_ID (0x000000000)
+#define EMMC_CLK_ID (0x000000001)
+#define UART_CLK_ID (0x000000002)
+#define ARM_CLK_ID (0x000000003)
+#define CORE_CLK_ID (0x000000004)
+#define V3D_CLK_ID (0x000000005)
+#define H264_CLK_ID (0x000000006)
+#define ISP_CLK_ID (0x000000007)
+#define SDRAM_CLK_ID (0x000000008)
+#define PIXEL_CLK_ID (0x000000009)
+#define PWM_CLK_ID (0x00000000a)
int mbox_call(unsigned char ch, int mmu_enable);
int bcm271x_notify_reboot(void);
diff --git a/bsp/raspberry-pi/raspi4-32/driver/raspi4.h b/bsp/raspberry-pi/raspi4-32/driver/raspi4.h
index 5a91796d403103c5a110410cbdf4bd3e36df6618..db431bf4d4e01b004674a1ab6ca0c08e278e7dcd 100644
--- a/bsp/raspberry-pi/raspi4-32/driver/raspi4.h
+++ b/bsp/raspberry-pi/raspi4-32/driver/raspi4.h
@@ -14,6 +14,8 @@
//gpio offset
#define GPIO_BASE_OFFSET (0x00200000)
+
+#define PL011_UART_BASE_OFFSET (0x00201000)
//pl011 offset
#define PL011_UART0_BASE_OFFSET (0x00201000)
#define PL011_UART2_BASE_OFFSET (0x00201400)
@@ -28,7 +30,9 @@
#define AUX_BASE_OFFSET (0x00215000)
/* GPIO */
-#define GPIO_BASE (PER_BASE + GPIO_BASE_OFFSET)
+#define GPIO_BASE_ADDR (PER_BASE + GPIO_BASE_OFFSET)
+extern uint32_t gpio_base_addr;
+#define GPIO_BASE (gpio_base_addr)
#define GPIO_IRQ_NUM (3) //40 pin mode
#define IRQ_GPIO0 (96 + 49) //bank0 (0 to 27)
#define IRQ_GPIO1 (96 + 50) //bank1 (28 to 45)
@@ -37,44 +41,41 @@
/* Timer (ARM side) */
#define ARM_TIMER_IRQ (64)
+extern uint32_t arm_timer_base;
#define ARM_TIMER_BASE (PER_BASE + 0xB000)
-#define ARM_TIMER_LOAD HWREG32(ARM_TIMER_BASE + 0x400)
-#define ARM_TIMER_VALUE HWREG32(ARM_TIMER_BASE + 0x404)
-#define ARM_TIMER_CTRL HWREG32(ARM_TIMER_BASE + 0x408)
-#define ARM_TIMER_IRQCLR HWREG32(ARM_TIMER_BASE + 0x40C)
-#define ARM_TIMER_RAWIRQ HWREG32(ARM_TIMER_BASE + 0x410)
-#define ARM_TIMER_MASKIRQ HWREG32(ARM_TIMER_BASE + 0x414)
-#define ARM_TIMER_RELOAD HWREG32(ARM_TIMER_BASE + 0x418)
-#define ARM_TIMER_PREDIV HWREG32(ARM_TIMER_BASE + 0x41C)
-#define ARM_TIMER_CNTR HWREG32(ARM_TIMER_BASE + 0x420)
+#define ARM_TIMER_LOAD HWREG32(arm_timer_base + 0x400)
+#define ARM_TIMER_VALUE HWREG32(arm_timer_base + 0x404)
+#define ARM_TIMER_CTRL HWREG32(arm_timer_base + 0x408)
+#define ARM_TIMER_IRQCLR HWREG32(arm_timer_base + 0x40C)
+#define ARM_TIMER_RAWIRQ HWREG32(arm_timer_base + 0x410)
+#define ARM_TIMER_MASKIRQ HWREG32(arm_timer_base + 0x414)
+#define ARM_TIMER_RELOAD HWREG32(arm_timer_base + 0x418)
+#define ARM_TIMER_PREDIV HWREG32(arm_timer_base + 0x41C)
+#define ARM_TIMER_CNTR HWREG32(arm_timer_base + 0x420)
/* UART PL011 */
-#define UART0_BASE (PER_BASE + PL011_UART0_BASE_OFFSET)
-#define UART2_BASE (PER_BASE + PL011_UART2_BASE_OFFSET)
-#define UART3_BASE (PER_BASE + PL011_UART3_BASE_OFFSET)
-#define UART4_BASE (PER_BASE + PL011_UART4_BASE_OFFSET)
-#define UART5_BASE (PER_BASE + PL011_UART5_BASE_OFFSET)
+#define UART_BASE (PER_BASE + PL011_UART_BASE_OFFSET)
+//extern uint32_t uart_base_addr;
+#define UART0_BASE (UART_BASE + 0x0)
+#define UART2_BASE (UART_BASE + 0x400)
+#define UART3_BASE (UART_BASE + 0x600)
+#define UART4_BASE (UART_BASE + 0x800)
+#define UART5_BASE (UART_BASE + 0xA00)
#define IRQ_AUX_UART (96 + 29)
#define UART_REFERENCE_CLOCK (48000000)
/* AUX */
+//#define AUX_BASE_ADDR (PER_BASE + AUX_BASE_OFFSET)
+//extern uint32_t aux_addr;
+//#define AUX_BASE (aux_addr + 0x0)
+
#define AUX_BASE (PER_BASE + AUX_BASE_OFFSET)
#define IRQ_PL011 (96 + 57)
-/* SPI */
-#define SPI_0_BASE_OFFSET (0x00204000)
-#define SPI_3_BASE_OFFSET (0x00204600)
-#define SPI_4_BASE_OFFSET (0x00204800)
-#define SPI_5_BASE_OFFSET (0x00204A00)
-#define SPI_6_BASE_OFFSET (0x00204C00)
-
-#define SPI_0_BASE (PER_BASE + SPI_0_BASE_OFFSET)
-#define SPI_3_BASE (PER_BASE + SPI_3_BASE_OFFSET)
-#define SPI_4_BASE (PER_BASE + SPI_4_BASE_OFFSET)
-#define SPI_5_BASE (PER_BASE + SPI_5_BASE_OFFSET)
-#define SPI_6_BASE (PER_BASE + SPI_6_BASE_OFFSET)
/* Peripheral IRQ OR-ing */
-#define PACTL_CS HWREG32((PER_BASE + PACTL_CS_OFFSET))
+#define PACTL_CS_ADDR (PER_BASE + PACTL_CS_OFFSET)
+extern uint32_t pactl_cs_base;
+#define PACTL_CS HWREG32(pactl_cs_base)
typedef enum {
IRQ_SPI0 = 0x00000000,
IRQ_SPI1 = 0x00000002,
@@ -107,10 +108,12 @@ typedef enum {
#define INTC_BASE (0xff800000)
#define ARM_GIC_NR_IRQS (512)
#define ARM_GIC_MAX_NR (512)
-#define GIC_V2_DISTRIBUTOR_BASE (INTC_BASE + 0x00041000)
-#define GIC_V2_CPU_INTERFACE_BASE (INTC_BASE + 0x00042000)
-#define GIC_V2_HYPERVISOR_BASE (INTC_BASE + 0x00044000)
-#define GIC_V2_VIRTUAL_CPU_BASE (INTC_BASE + 0x00046000)
+#define GIC_V2_BASE (INTC_BASE + 0x00040000)
+extern uint32_t gic_base_addr;
+#define GIC_V2_DISTRIBUTOR_BASE (gic_base_addr + 0x1000)
+#define GIC_V2_CPU_INTERFACE_BASE (gic_base_addr + 0x2000)
+#define GIC_V2_HYPERVISOR_BASE (gic_base_addr + 0x4000)
+#define GIC_V2_VIRTUAL_CPU_BASE (gic_base_addr + 0x6000)
#define GIC_PL400_DISTRIBUTOR_PPTR GIC_V2_DISTRIBUTOR_BASE
#define GIC_PL400_CONTROLLER_PPTR GIC_V2_CPU_INTERFACE_BASE
@@ -119,10 +122,13 @@ typedef enum {
#define GIC_ACK_INTID_MASK 0x000003ff
+
//watchdog
-#define PM_RSTC HWREG32(PER_BASE + 0x0010001c)
-#define PM_RSTS HWREG32(PER_BASE + 0x00100020)
-#define PM_WDOG HWREG32(PER_BASE + 0x00100024)
+#define WDT_BASE (PER_BASE + 0x00100000)
+extern uint32_t wdt_base_addr;
+#define PM_RSTC HWREG32(wdt_base_addr + 0x1c)
+#define PM_RSTS HWREG32(wdt_base_addr + 0x20)
+#define PM_WDOG HWREG32(wdt_base_addr + 0x24)
#define PM_PASSWORD (0x5A000000)
#define PM_WDOG_TIME_SET (0x000fffff)
@@ -134,13 +140,14 @@ typedef enum {
//timer
#define ST_BASE_OFFSET (0x003000)
#define STIMER_BASE (PER_BASE + ST_BASE_OFFSET)
-#define STIMER_CS __REG32(STIMER_BASE + 0x0000)
-#define STIMER_CLO __REG32(STIMER_BASE + 0x0004)
-#define STIMER_CHI __REG32(STIMER_BASE + 0x0008)
-#define STIMER_C0 __REG32(STIMER_BASE + 0x000C)
-#define STIMER_C1 __REG32(STIMER_BASE + 0x0010)
-#define STIMER_C2 __REG32(STIMER_BASE + 0x0014)
-#define STIMER_C3 __REG32(STIMER_BASE + 0x0018)
+extern uint32_t stimer_base_addr;
+#define STIMER_CS __REG32(stimer_base_addr + 0x0000)
+#define STIMER_CLO __REG32(stimer_base_addr + 0x0004)
+#define STIMER_CHI __REG32(stimer_base_addr + 0x0008)
+#define STIMER_C0 __REG32(stimer_base_addr + 0x000C)
+#define STIMER_C1 __REG32(stimer_base_addr + 0x0010)
+#define STIMER_C2 __REG32(stimer_base_addr + 0x0014)
+#define STIMER_C3 __REG32(stimer_base_addr + 0x0018)
#define DELAY_MICROS(micros) \
do{ \
@@ -149,8 +156,22 @@ typedef enum {
} while (0) \
//External Mass Media Controller (SD Card)
-#define MMC0_BASE_ADDR (PER_BASE+0x300000)
-#define MMC2_BASE_ADDR (PER_BASE+0x340000)
+#define MMC0_BASE_ADDR (PER_BASE+0x300000)
+extern uint32_t mmc0_base_addr;
+#define MMC2_BASE_ADDR (PER_BASE+0x340000)
+extern uint32_t mmc2_base_addr;
+
+//mac
+#define MAC_REG (void *)(0xfd580000)
+extern void * mac_reg_base_addr;
+
+#define ETH_IRQ (160+29)
+
+#define SEND_DATA_NO_CACHE (0x08200000)
+extern void * eth_send_no_cache;
+
+#define RECV_DATA_NO_CACHE (0x08400000)
+extern void * eth_recv_no_cache;
/* the basic constants and interfaces needed by gic */
rt_inline rt_uint32_t platform_get_gic_dist_base(void)
@@ -167,5 +188,5 @@ static inline void __DSB(void)
{
__asm__ volatile ("dsb 0xF":::"memory");
}
-
#endif
+
diff --git a/bsp/raspberry-pi/raspi4-32/link.lds b/bsp/raspberry-pi/raspi4-32/link.lds
index 3f2f8ca413034e705b3f44d0629a1e36f0acad30..23b99f0c39019ca189e435baa266605750dd8278 100644
--- a/bsp/raspberry-pi/raspi4-32/link.lds
+++ b/bsp/raspberry-pi/raspi4-32/link.lds
@@ -24,7 +24,7 @@
SECTIONS
{
- . = 0x8000;
+ . = 0xc0000000;
. = ALIGN(4096);
.text :
{
@@ -63,6 +63,12 @@ SECTIONS
_etext = .;
}
+ .ARM.exidx : {
+ __exidx_start = .;
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ __exidx_end = .;
+ }
+
.eh_frame_hdr :
{
*(.eh_frame_hdr)
diff --git a/bsp/raspberry-pi/raspi4-32/rtconfig.h b/bsp/raspberry-pi/raspi4-32/rtconfig.h
index 1edd99a54929a43d464e99ae22a9426f59f8ec2c..f91646ec5192a58e08a7ae469a66eff410b3e652 100644
--- a/bsp/raspberry-pi/raspi4-32/rtconfig.h
+++ b/bsp/raspberry-pi/raspi4-32/rtconfig.h
@@ -7,19 +7,21 @@
/* RT-Thread Kernel */
#define RT_NAME_MAX 8
+#define RT_USING_SMART
#define RT_ALIGN_SIZE 4
#define RT_THREAD_PRIORITY_32
#define RT_THREAD_PRIORITY_MAX 32
-#define RT_TICK_PER_SECOND 100
+#define RT_TICK_PER_SECOND 1000
#define RT_USING_OVERFLOW_CHECK
#define RT_USING_HOOK
#define RT_USING_IDLE_HOOK
#define RT_IDLE_HOOK_LIST_SIZE 4
-#define IDLE_THREAD_STACK_SIZE 2048
+#define IDLE_THREAD_STACK_SIZE 4096
#define RT_USING_TIMER_SOFT
#define RT_TIMER_THREAD_PRIO 4
-#define RT_TIMER_THREAD_STACK_SIZE 2048
+#define RT_TIMER_THREAD_STACK_SIZE 512
#define RT_DEBUG
+#define RT_DEBUG_COLOR
/* Inter-Thread communication */
@@ -32,16 +34,26 @@
/* Memory Management */
#define RT_USING_MEMPOOL
+#define RT_USING_MEMHEAP
#define RT_USING_SMALL_MEM
#define RT_USING_HEAP
/* Kernel Device Object */
#define RT_USING_DEVICE
+#define RT_USING_INTERRUPT_INFO
#define RT_USING_CONSOLE
-#define RT_CONSOLEBUF_SIZE 128
+#define RT_CONSOLEBUF_SIZE 512
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
+#define ARCH_ARM
+#define ARCH_ARM_MMU
+#define RT_USING_USERSPACE
+#define KERNEL_VADDR_START 0xc0000000
+#define PV_OFFSET 0x40100000
+#define RT_IOREMAP_LATE
+#define ARCH_ARM_CORTEX_A
#define ARCH_ARMV8
/* RT-Thread Components */
@@ -67,14 +79,15 @@
#define FINSH_CMD_SIZE 80
#define FINSH_USING_MSH
#define FINSH_USING_MSH_DEFAULT
+#define FINSH_USING_MSH_ONLY
#define FINSH_ARG_MAX 10
/* Device virtual file system */
#define RT_USING_DFS
#define DFS_USING_WORKDIR
-#define DFS_FILESYSTEMS_MAX 2
-#define DFS_FILESYSTEM_TYPES_MAX 2
+#define DFS_FILESYSTEMS_MAX 4
+#define DFS_FILESYSTEM_TYPES_MAX 4
#define DFS_FD_MAX 16
#define RT_USING_DFS_ELMFAT
@@ -89,15 +102,24 @@
#define RT_DFS_ELM_MAX_SECTOR_SIZE 512
#define RT_DFS_ELM_REENTRANT
#define RT_USING_DFS_DEVFS
+#define RT_USING_DFS_ROMFS
/* Device Drivers */
#define RT_USING_DEVICE_IPC
#define RT_PIPE_BUFSZ 512
+#define RT_USING_SYSTEM_WORKQUEUE
+#define RT_SYSTEM_WORKQUEUE_STACKSIZE 2048
+#define RT_SYSTEM_WORKQUEUE_PRIORITY 23
#define RT_USING_SERIAL
-#define RT_SERIAL_USING_DMA
#define RT_SERIAL_RB_BUFSZ 64
+#define RT_USING_HWTIMER
+#define RT_USING_I2C
+#define RT_USING_I2C_BITOPS
#define RT_USING_PIN
+#define RT_USING_PWM
+#define RT_USING_RTC
+#define RT_USING_SOFT_RTC
#define RT_USING_SDIO
#define RT_SDIO_STACK_SIZE 512
#define RT_SDIO_THREAD_PRIORITY 15
@@ -113,12 +135,22 @@
/* POSIX layer and C standard library */
#define RT_USING_LIBC
+#define RT_USING_MUSL
#define RT_USING_POSIX
+#define RT_USING_POSIX_MMAP
+#define RT_USING_POSIX_TERMIOS
+#define RT_USING_POSIX_AIO
/* Network */
/* Socket abstraction layer */
+#define RT_USING_SAL
+
+/* protocol stack implement */
+
+#define SAL_USING_LWIP
+#define SAL_USING_POSIX
/* Network interface device */
@@ -144,8 +176,8 @@
/* Static IPv4 Address */
-#define RT_LWIP_IPADDR "192.168.1.30"
-#define RT_LWIP_GWADDR "192.168.1.1"
+#define RT_LWIP_IPADDR "192.168.137.100"
+#define RT_LWIP_GWADDR "192.168.137.1"
#define RT_LWIP_MSKADDR "255.255.255.0"
#define RT_LWIP_UDP
#define RT_LWIP_TCP
@@ -160,9 +192,9 @@
#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 4096
#define RT_LWIP_ETHTHREAD_PRIORITY 12
-#define RT_LWIP_ETHTHREAD_STACKSIZE 1024
+#define RT_LWIP_ETHTHREAD_STACKSIZE 4096
#define RT_LWIP_ETHTHREAD_MBOX_SIZE 8
#define LWIP_NETIF_STATUS_CALLBACK 1
#define LWIP_NETIF_LINK_CALLBACK 1
@@ -182,6 +214,11 @@
/* 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 */
@@ -214,6 +251,9 @@
/* system packages */
+/* Micrium: Micrium software products porting for RT-Thread */
+
+
/* peripheral libraries and drivers */
@@ -241,9 +281,6 @@
#define BSP_USING_GIC
#define BSP_USING_GIC400
#define BSP_USING_PIN
-#define BSP_USING_SPI
-#define BSP_USING_SPI0_BUS
-#define BSP_USING_SPI0_DEVICE0
#define BSP_USING_CORETIMER
#define BSP_USING_WDT
#define BSP_USING_SDIO
@@ -252,6 +289,5 @@
/* Board Peripheral Drivers */
#define BSP_USING_HDMI
-#define BSP_USING_HDMI_DISPLAY
#endif
diff --git a/bsp/raspberry-pi/raspi4-32/rtconfig.py b/bsp/raspberry-pi/raspi4-32/rtconfig.py
index 681ec91b9e6702014cd0e758322166839f7a63c0..e99c05f65599551c7ad2036f16ea358582e77d48 100644
--- a/bsp/raspberry-pi/raspi4-32/rtconfig.py
+++ b/bsp/raspberry-pi/raspi4-32/rtconfig.py
@@ -14,7 +14,7 @@ if os.getenv('RTT_CC'):
CROSS_TOOL = os.getenv('RTT_CC')
PLATFORM = 'gcc'
-EXEC_PATH = r'/usr/bin'
+EXEC_PATH = r'/opt/gcc-arm-none-eabi-5_4-2016q3/bin/'
BUILD = 'debug'
@@ -24,7 +24,7 @@ if os.getenv('RTT_EXEC_PATH'):
if PLATFORM == 'gcc':
# toolchains
# PREFIX = 'arm-none-eabi-'
- PREFIX = 'arm-none-eabi-'
+ PREFIX = os.getenv('RTT_CC_PREFIX') or 'arm-none-eabi-'
CC = PREFIX + 'gcc'
CXX = PREFIX + 'g++'
AS = PREFIX + 'gcc'
@@ -35,20 +35,22 @@ if PLATFORM == 'gcc':
OBJDUMP = PREFIX + 'objdump'
OBJCPY = PREFIX + 'objcopy'
- DEVICE = ' -march=armv8-a -mtune=cortex-a72'
- CFLAGS = DEVICE + ' -Wall'
+ DEVICE = ' -march=armv8-a -mtune=cortex-a72 -ftree-vectorize -ffast-math -funwind-tables -fno-strict-aliasing'
+ CXXFLAGS= DEVICE + ' -Wall'
+ CFLAGS = DEVICE + ' -Wall -std=gnu99'
AFLAGS = ' -c' + ' -x assembler-with-cpp -D__ASSEMBLY__'
- LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,system_vectors -T link.lds'
+ LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,system_vectors -T link.lds ' + ' -lsupc++ -lgcc '
CPATH = ''
LPATH = ''
if BUILD == 'debug':
- CFLAGS += ' -O0 -gdwarf-2'
- AFLAGS += ' -gdwarf-2'
+ CFLAGS += ' -O0 -gdwarf-2'
+ CXXFLAGS += ' -O0 -gdwarf-2'
+ AFLAGS += ' -gdwarf-2'
else:
- CFLAGS += ' -O2'
-
- CXXFLAGS = CFLAGS
+ CFLAGS += ' -Os'
+ CXXFLAGS += ' -Os'
+ CXXFLAGS += ' -Woverloaded-virtual -fno-exceptions -fno-rtti'
DUMP_ACTION = OBJDUMP + ' -D -S $TARGET > rtt.asm\n'
POST_ACTION = OBJCPY + ' -O binary $TARGET kernel7.img\n' + SIZE + ' $TARGET \n'
diff --git a/bsp/realview-a8/rtconfig.h b/bsp/realview-a8/rtconfig.h
index a83c9e020d11cc84bf94e81b0f0a3abdafa65896..a818feff63c424c3a8d413f8be51a18a3ec1ccc1 100644
--- a/bsp/realview-a8/rtconfig.h
+++ b/bsp/realview-a8/rtconfig.h
@@ -67,6 +67,8 @@
// #define RT_USING_SLAB
//
+#define RT_USING_CACHE
+
//
#define RT_USING_DEVICE
//
diff --git a/bsp/stm32/stm32f401-st-nucleo/.config b/bsp/stm32/stm32f401-st-nucleo/.config
index 00205aa5bf8bdf29544f7240143499c450cb9084..a1d2c659cc83d88984aaec5692f66ebcec35f899 100644
--- a/bsp/stm32/stm32f401-st-nucleo/.config
+++ b/bsp/stm32/stm32f401-st-nucleo/.config
@@ -7,6 +7,8 @@
# RT-Thread Kernel
#
CONFIG_RT_NAME_MAX=8
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -21,6 +23,7 @@ CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
CONFIG_IDLE_THREAD_STACK_SIZE=256
# CONFIG_RT_USING_TIMER_SOFT is not set
CONFIG_RT_DEBUG=y
+# CONFIG_RT_DEBUG_COLOR is not set
# CONFIG_RT_DEBUG_INIT_CONFIG is not set
# CONFIG_RT_DEBUG_THREAD_CONFIG is not set
# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set
@@ -62,11 +65,13 @@ CONFIG_RT_USING_DEVICE=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart2"
-CONFIG_RT_VER_NUM=0x40001
+CONFIG_RT_VER_NUM=0x40003
+# CONFIG_RT_USING_CACHE is not set
+CONFIG_RT_USING_CPU_FFS=y
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
CONFIG_ARCH_ARM=y
CONFIG_ARCH_ARM_CORTEX_M=y
CONFIG_ARCH_ARM_CORTEX_M4=y
-# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
#
# RT-Thread Components
@@ -110,6 +115,7 @@ CONFIG_FINSH_ARG_MAX=10
#
CONFIG_RT_USING_DEVICE_IPC=y
CONFIG_RT_PIPE_BUFSZ=512
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
CONFIG_RT_USING_SERIAL=y
CONFIG_RT_SERIAL_USING_DMA=y
CONFIG_RT_SERIAL_RB_BUFSZ=64
@@ -117,12 +123,13 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
-# CONFIG_RT_USING_MTD is not set
# CONFIG_RT_USING_PM is not set
# CONFIG_RT_USING_RTC is not set
# CONFIG_RT_USING_SDIO is not set
@@ -130,10 +137,10 @@ CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_WDT is not set
# CONFIG_RT_USING_AUDIO is not set
# CONFIG_RT_USING_SENSOR is not set
-
-#
-# Using WiFi
-#
+# CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
# CONFIG_RT_USING_WIFI is not set
#
@@ -147,6 +154,7 @@ CONFIG_RT_USING_PIN=y
#
# CONFIG_RT_USING_LIBC is not set
# CONFIG_RT_USING_PTHREADS is not set
+CONFIG_RT_LIBC_USING_TIME=y
#
# Network
@@ -158,14 +166,14 @@ CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_SAL is not set
#
-# light weight TCP/IP stack
+# Network interface device
#
-# CONFIG_RT_USING_LWIP is not set
+# CONFIG_RT_USING_NETDEV is not set
#
-# Modbus master and slave stack
+# light weight TCP/IP stack
#
-# CONFIG_RT_USING_MODBUS is not set
+# CONFIG_RT_USING_LWIP is not set
#
# AT commands
@@ -180,16 +188,9 @@ CONFIG_RT_USING_PIN=y
#
# Utilities
#
-# CONFIG_RT_USING_LOGTRACE is not set
# CONFIG_RT_USING_RYM is not set
# CONFIG_RT_USING_ULOG is not set
# CONFIG_RT_USING_UTEST is not set
-
-#
-# ARM CMSIS
-#
-# CONFIG_RT_USING_CMSIS_OS is not set
-# CONFIG_RT_USING_RTT_CMSIS is not set
# CONFIG_RT_USING_LWP is not set
#
@@ -199,13 +200,20 @@ CONFIG_RT_USING_PIN=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
@@ -227,7 +235,10 @@ CONFIG_RT_USING_PIN=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
#
@@ -237,9 +248,32 @@ CONFIG_RT_USING_PIN=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_IOTKIT 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
@@ -247,6 +281,8 @@ CONFIG_RT_USING_PIN=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
@@ -260,6 +296,10 @@ CONFIG_RT_USING_PIN=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
@@ -272,6 +312,15 @@ CONFIG_RT_USING_PIN=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
@@ -283,40 +332,78 @@ CONFIG_RT_USING_PIN=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
# 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_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
#
-
-#
-# sensors drivers
-#
-# CONFIG_PKG_USING_LSM6DSL is not set
-# CONFIG_PKG_USING_LPS22HB is not set
-# CONFIG_PKG_USING_HTS221 is not set
-# CONFIG_PKG_USING_LSM303AGR is not set
-# CONFIG_PKG_USING_BME280 is not set
-# CONFIG_PKG_USING_BMA400 is not set
-# CONFIG_PKG_USING_BMI160_BMX160 is not set
-# CONFIG_PKG_USING_SPL0601 is not set
+# 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_AHT10 is not set
-# CONFIG_PKG_USING_AP3216C 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
# CONFIG_PKG_USING_BUTTON is not set
-# CONFIG_PKG_USING_MPU6XXX is not set
# CONFIG_PKG_USING_PCF8574 is not set
# 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
+# CONFIG_PKG_USING_PCA9685 is not set
+# 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
@@ -327,11 +414,15 @@ CONFIG_RT_USING_PIN=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
@@ -342,37 +433,54 @@ CONFIG_RT_USING_PIN=y
# 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_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_WICED is not set
# CONFIG_PKG_USING_CLOUDSDK is not set
-# CONFIG_PKG_USING_COREMARK 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
-
-#
-# rtpkgs online packages
-#
-# CONFIG_PKG_USING_CSTRING is not set
-# CONFIG_PKG_USING_ARGPARSE is not set
-# CONFIG_PKG_USING_LIBBMPREAD is not set
-# CONFIG_PKG_USING_LIBUTILS is not set
-# CONFIG_PKG_USING_SAM is not set
-# CONFIG_PKG_USING_LIBCALLBACK is not set
-# CONFIG_PKG_USING_Z_EVENT is not set
-# CONFIG_PKG_USING_LIBSTM32HAL 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_FAMILY_STM32=y
CONFIG_SOC_SERIES_STM32F4=y
@@ -392,6 +500,10 @@ CONFIG_BSP_USING_GPIO=y
CONFIG_BSP_USING_UART=y
CONFIG_BSP_USING_UART2=y
# CONFIG_BSP_UART2_RX_USING_DMA is not set
+# CONFIG_BSP_USING_SPI is not set
+# CONFIG_BSP_USING_I2C1 is not set
+# CONFIG_BSP_USING_RNG is not set
+# CONFIG_BSP_USING_UDID is not set
#
# Board extended module Drivers
diff --git a/bsp/stm32/stm32f401-st-nucleo/applications/SConscript b/bsp/stm32/stm32f401-st-nucleo/applications/SConscript
index 6f66f7ab7360b02f3561ec14d3f28841190e7e83..80072aa77178b765581f76a1503a85d118fbac78 100644
--- a/bsp/stm32/stm32f401-st-nucleo/applications/SConscript
+++ b/bsp/stm32/stm32f401-st-nucleo/applications/SConscript
@@ -2,10 +2,8 @@ import rtconfig
from building import *
cwd = GetCurrentDir()
-CPPPATH = [cwd, str(Dir('#'))]
-src = Split("""
-main.c
-""")
+CPPPATH = [cwd]
+src = Glob("*.c")
group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
diff --git a/bsp/stm32/stm32f401-st-nucleo/rtconfig.h b/bsp/stm32/stm32f401-st-nucleo/rtconfig.h
index 5aeb7b7cedf90da6d970981d6d6c3ca35027fd1d..91c8ce03b08e2cea88892971611d0b2a6b54a462 100644
--- a/bsp/stm32/stm32f401-st-nucleo/rtconfig.h
+++ b/bsp/stm32/stm32f401-st-nucleo/rtconfig.h
@@ -38,7 +38,8 @@
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart2"
-#define RT_VER_NUM 0x40001
+#define RT_VER_NUM 0x40003
+#define RT_USING_CPU_FFS
#define ARCH_ARM
#define ARCH_ARM_CORTEX_M
#define ARCH_ARM_CORTEX_M4
@@ -81,24 +82,22 @@
#define RT_SERIAL_RB_BUFSZ 64
#define RT_USING_PIN
-/* Using WiFi */
-
-
/* Using USB */
/* POSIX layer and C standard library */
+#define RT_LIBC_USING_TIME
/* Network */
/* Socket abstraction layer */
-/* light weight TCP/IP stack */
+/* Network interface device */
-/* Modbus master and slave stack */
+/* light weight TCP/IP stack */
/* AT commands */
@@ -110,9 +109,6 @@
/* Utilities */
-/* ARM CMSIS */
-
-
/* RT-Thread online packages */
/* IoT - internet of things */
@@ -146,8 +142,6 @@
/* peripheral libraries and drivers */
-/* sensors drivers */
-
/* miscellaneous packages */
@@ -160,9 +154,6 @@
/* Network Utilities */
-
-/* rtpkgs online packages */
-
#define SOC_FAMILY_STM32
#define SOC_SERIES_STM32F4
diff --git a/bsp/stm32/stm32f746-st-disco/.config b/bsp/stm32/stm32f746-st-disco/.config
index f71ec97d68b81ead3c9f3ebdbfd7acbfb409ff02..a394fc8d24b6608821331d73979fabb0235cc94b 100644
--- a/bsp/stm32/stm32f746-st-disco/.config
+++ b/bsp/stm32/stm32f746-st-disco/.config
@@ -8,6 +8,7 @@
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -64,12 +65,13 @@ CONFIG_RT_USING_DEVICE=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
-CONFIG_RT_VER_NUM=0x40002
-CONFIG_ARCH_ARM=y
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
CONFIG_RT_USING_CPU_FFS=y
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
CONFIG_ARCH_ARM_CORTEX_M=y
CONFIG_ARCH_ARM_CORTEX_M7=y
-# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
#
# RT-Thread Components
@@ -121,12 +123,13 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
CONFIG_RT_USING_HWTIMER=y
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
-# CONFIG_RT_USING_MTD is not set
# CONFIG_RT_USING_PM is not set
# CONFIG_RT_USING_RTC is not set
# CONFIG_RT_USING_SDIO is not set
@@ -134,15 +137,10 @@ CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_WDT is not set
# CONFIG_RT_USING_AUDIO is not set
# CONFIG_RT_USING_SENSOR is not set
-
-#
-# Using Hardware Crypto drivers
-#
+# CONFIG_RT_USING_TOUCH is not set
# 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
#
@@ -154,8 +152,9 @@ CONFIG_RT_USING_PIN=y
#
# POSIX layer and C standard library
#
-# CONFIG_RT_USING_LIBC is not set
+CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_PTHREADS is not set
+# CONFIG_RT_USING_MODULE is not set
#
# Network
@@ -176,11 +175,6 @@ CONFIG_RT_USING_PIN=y
#
# CONFIG_RT_USING_LWIP is not set
-#
-# Modbus master and slave stack
-#
-# CONFIG_RT_USING_MODBUS is not set
-
#
# AT commands
#
@@ -206,14 +200,20 @@ CONFIG_RT_USING_PIN=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
@@ -235,6 +235,8 @@ CONFIG_RT_USING_PIN=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
@@ -246,13 +248,32 @@ CONFIG_RT_USING_PIN=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
@@ -260,6 +281,8 @@ CONFIG_RT_USING_PIN=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
@@ -274,6 +297,9 @@ CONFIG_RT_USING_PIN=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
@@ -286,6 +312,15 @@ CONFIG_RT_USING_PIN=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
@@ -297,6 +332,7 @@ CONFIG_RT_USING_PIN=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
@@ -304,6 +340,16 @@ CONFIG_RT_USING_PIN=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
@@ -311,6 +357,7 @@ CONFIG_RT_USING_PIN=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
@@ -319,15 +366,44 @@ CONFIG_RT_USING_PIN=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
# CONFIG_PKG_USING_PCA9685 is not set
# 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
@@ -338,12 +414,15 @@ CONFIG_RT_USING_PIN=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
@@ -355,6 +434,53 @@ CONFIG_RT_USING_PIN=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_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_FAMILY_STM32=y
CONFIG_SOC_SERIES_STM32F7=y
@@ -387,6 +513,9 @@ CONFIG_BSP_USING_UART1=y
# CONFIG_BSP_USING_SDIO is not set
# CONFIG_BSP_USING_FMC is not set
# CONFIG_BSP_USING_LTDC is not set
+# CONFIG_BSP_USING_CRC is not set
+# CONFIG_BSP_USING_RNG is not set
+# CONFIG_BSP_USING_UDID is not set
#
# Board extended module Drivers
diff --git a/bsp/stm32/stm32f746-st-disco/board/Kconfig b/bsp/stm32/stm32f746-st-disco/board/Kconfig
index 378eafb110f7d634f0e2b52de07f8a113dc5a926..2816b47814c8e73b2a65b088d89c50a8b8133e24 100644
--- a/bsp/stm32/stm32f746-st-disco/board/Kconfig
+++ b/bsp/stm32/stm32f746-st-disco/board/Kconfig
@@ -5,6 +5,7 @@ config SOC_STM32F746NG
select SOC_SERIES_STM32F7
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
menu "Onboard Peripheral Drivers"
diff --git a/bsp/stm32/stm32f746-st-disco/rtconfig.h b/bsp/stm32/stm32f746-st-disco/rtconfig.h
index da5b84d4a9020b10faaf90bb3c90e23a71ad7092..0bbc6a243b3cbe3b8c7cc595e398ab495d6f4495 100644
--- a/bsp/stm32/stm32f746-st-disco/rtconfig.h
+++ b/bsp/stm32/stm32f746-st-disco/rtconfig.h
@@ -39,9 +39,10 @@
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart1"
-#define RT_VER_NUM 0x40002
-#define ARCH_ARM
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
#define RT_USING_CPU_FFS
+#define ARCH_ARM
#define ARCH_ARM_CORTEX_M
#define ARCH_ARM_CORTEX_M7
@@ -84,17 +85,12 @@
#define RT_USING_HWTIMER
#define RT_USING_PIN
-/* Using Hardware Crypto drivers */
-
-
-/* Using WiFi */
-
-
/* Using USB */
/* POSIX layer and C standard library */
+#define RT_USING_LIBC
/* Network */
@@ -107,9 +103,6 @@
/* light weight TCP/IP stack */
-/* Modbus master and slave stack */
-
-
/* AT commands */
@@ -158,6 +151,12 @@
/* samples: kernel and components samples */
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
#define SOC_FAMILY_STM32
#define SOC_SERIES_STM32F7
diff --git a/bsp/stm32/stm32f767-atk-apollo/.config b/bsp/stm32/stm32f767-atk-apollo/.config
index 0f1f57a9860318a90342a4cb884170f9eae66969..1335385dc5b575438e4e1d440a8a93b7d30c0143 100644
--- a/bsp/stm32/stm32f767-atk-apollo/.config
+++ b/bsp/stm32/stm32f767-atk-apollo/.config
@@ -8,6 +8,7 @@
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -64,12 +65,13 @@ CONFIG_RT_USING_DEVICE=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
-CONFIG_RT_VER_NUM=0x40002
-CONFIG_ARCH_ARM=y
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
CONFIG_RT_USING_CPU_FFS=y
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
CONFIG_ARCH_ARM_CORTEX_M=y
CONFIG_ARCH_ARM_CORTEX_M7=y
-# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
#
# RT-Thread Components
@@ -121,8 +123,10 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
@@ -148,9 +152,9 @@ CONFIG_RT_USING_PIN=y
#
# POSIX layer and C standard library
#
-# CONFIG_RT_USING_LIBC is not set
+CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_PTHREADS is not set
-CONFIG_RT_LIBC_USING_TIME=y
+# CONFIG_RT_USING_MODULE is not set
#
# Network
@@ -196,10 +200,15 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -226,6 +235,8 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -237,7 +248,10 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -245,6 +259,21 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -252,6 +281,8 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -267,6 +298,8 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -279,6 +312,15 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -290,6 +332,7 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -298,6 +341,15 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -305,6 +357,7 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -313,10 +366,16 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -324,7 +383,27 @@ CONFIG_RT_LIBC_USING_TIME=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_LCD_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
@@ -335,12 +414,15 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -353,6 +435,52 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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_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_FAMILY_STM32=y
CONFIG_SOC_SERIES_STM32F7=y
@@ -393,6 +521,7 @@ CONFIG_BSP_USING_UART1=y
# CONFIG_BSP_USING_I2C2 is not set
# CONFIG_BSP_USING_ONCHIP_RTC is not set
# CONFIG_BSP_USING_WDT is not set
+# CONFIG_BSP_USING_USBH is not set
# CONFIG_BSP_USING_SDIO is not set
CONFIG_BSP_USING_LTDC=y
# CONFIG_BSP_USING_CRC is not set
diff --git a/bsp/stm32/stm32f767-atk-apollo/board/Kconfig b/bsp/stm32/stm32f767-atk-apollo/board/Kconfig
index 82efc63223edaa0a00d6b37f8ddaadf25ad9ea12..b12e02859b7780cae9688edefc2a5c18dbae541d 100644
--- a/bsp/stm32/stm32f767-atk-apollo/board/Kconfig
+++ b/bsp/stm32/stm32f767-atk-apollo/board/Kconfig
@@ -5,6 +5,7 @@ config SOC_STM32F767IG
select SOC_SERIES_STM32F7
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
menu "Onboard Peripheral Drivers"
diff --git a/bsp/stm32/stm32f767-atk-apollo/rtconfig.h b/bsp/stm32/stm32f767-atk-apollo/rtconfig.h
index af5b56592b323826932a2ba6f9ef2990101b3a40..78c896456aa2f046c624391bde73e59f761c4429 100644
--- a/bsp/stm32/stm32f767-atk-apollo/rtconfig.h
+++ b/bsp/stm32/stm32f767-atk-apollo/rtconfig.h
@@ -40,9 +40,10 @@
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart1"
-#define RT_VER_NUM 0x40002
-#define ARCH_ARM
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
#define RT_USING_CPU_FFS
+#define ARCH_ARM
#define ARCH_ARM_CORTEX_M
#define ARCH_ARM_CORTEX_M7
@@ -89,7 +90,7 @@
/* POSIX layer and C standard library */
-#define RT_LIBC_USING_TIME
+#define RT_USING_LIBC
/* Network */
@@ -150,6 +151,12 @@
/* samples: kernel and components samples */
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
#define SOC_FAMILY_STM32
#define SOC_SERIES_STM32F7
diff --git a/bsp/stm32/stm32f767-fire-challenger/.config b/bsp/stm32/stm32f767-fire-challenger/.config
index d9bdefcf566bedff7c8417e8f5c58105280e54ba..de5772b051fcaf92f6e9979ea55453a26b07fc05 100644
--- a/bsp/stm32/stm32f767-fire-challenger/.config
+++ b/bsp/stm32/stm32f767-fire-challenger/.config
@@ -8,6 +8,7 @@
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -64,12 +65,13 @@ CONFIG_RT_USING_DEVICE=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
-CONFIG_RT_VER_NUM=0x40002
-CONFIG_ARCH_ARM=y
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
CONFIG_RT_USING_CPU_FFS=y
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
CONFIG_ARCH_ARM_CORTEX_M=y
CONFIG_ARCH_ARM_CORTEX_M7=y
-# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
#
# RT-Thread Components
@@ -121,12 +123,13 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
-# CONFIG_RT_USING_MTD is not set
# CONFIG_RT_USING_PM is not set
# CONFIG_RT_USING_RTC is not set
# CONFIG_RT_USING_SDIO is not set
@@ -134,15 +137,10 @@ CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_WDT is not set
# CONFIG_RT_USING_AUDIO is not set
# CONFIG_RT_USING_SENSOR is not set
-
-#
-# Using Hardware Crypto drivers
-#
+# CONFIG_RT_USING_TOUCH is not set
# 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
#
@@ -154,8 +152,9 @@ CONFIG_RT_USING_PIN=y
#
# POSIX layer and C standard library
#
-# CONFIG_RT_USING_LIBC is not set
+CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_PTHREADS is not set
+# CONFIG_RT_USING_MODULE is not set
#
# Network
@@ -176,11 +175,6 @@ CONFIG_RT_USING_PIN=y
#
# CONFIG_RT_USING_LWIP is not set
-#
-# Modbus master and slave stack
-#
-# CONFIG_RT_USING_MODBUS is not set
-
#
# AT commands
#
@@ -206,14 +200,20 @@ CONFIG_RT_USING_PIN=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
@@ -235,6 +235,8 @@ CONFIG_RT_USING_PIN=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
@@ -246,12 +248,32 @@ CONFIG_RT_USING_PIN=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_IOTKIT 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
@@ -259,6 +281,8 @@ CONFIG_RT_USING_PIN=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
@@ -273,6 +297,9 @@ CONFIG_RT_USING_PIN=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
@@ -285,6 +312,15 @@ CONFIG_RT_USING_PIN=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
@@ -296,6 +332,7 @@ CONFIG_RT_USING_PIN=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
@@ -303,6 +340,16 @@ CONFIG_RT_USING_PIN=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
@@ -310,7 +357,7 @@ CONFIG_RT_USING_PIN=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_AP3216C 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
@@ -319,15 +366,44 @@ CONFIG_RT_USING_PIN=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
# CONFIG_PKG_USING_PCA9685 is not set
# 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
@@ -338,12 +414,15 @@ CONFIG_RT_USING_PIN=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
@@ -355,6 +434,53 @@ CONFIG_RT_USING_PIN=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_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_FAMILY_STM32=y
CONFIG_SOC_SERIES_STM32F7=y
@@ -393,6 +519,9 @@ CONFIG_BSP_USING_UART1=y
# CONFIG_BSP_USING_SDIO is not set
# CONFIG_BSP_USING_FMC is not set
# CONFIG_BSP_USING_LTDC is not set
+# CONFIG_BSP_USING_CRC is not set
+# CONFIG_BSP_USING_RNG is not set
+# CONFIG_BSP_USING_UDID is not set
#
# Board extended module Drivers
diff --git a/bsp/stm32/stm32f767-fire-challenger/board/Kconfig b/bsp/stm32/stm32f767-fire-challenger/board/Kconfig
index 1769b1cfd717188909d3adc3b57c4d2ed02b4a75..0ec3596030e761fb11e585472ad4cf526c8b809c 100644
--- a/bsp/stm32/stm32f767-fire-challenger/board/Kconfig
+++ b/bsp/stm32/stm32f767-fire-challenger/board/Kconfig
@@ -5,6 +5,7 @@ config SOC_STM32F767IG
select SOC_SERIES_STM32F7
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
menu "Onboard Peripheral Drivers"
diff --git a/bsp/stm32/stm32f767-fire-challenger/rtconfig.h b/bsp/stm32/stm32f767-fire-challenger/rtconfig.h
index 5cdccf196042a3199d6432c5bdc4f6558ce72688..d448b583161195e2d0af8a2a39d41a22ac8af38b 100644
--- a/bsp/stm32/stm32f767-fire-challenger/rtconfig.h
+++ b/bsp/stm32/stm32f767-fire-challenger/rtconfig.h
@@ -40,9 +40,10 @@
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart1"
-#define RT_VER_NUM 0x40002
-#define ARCH_ARM
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
#define RT_USING_CPU_FFS
+#define ARCH_ARM
#define ARCH_ARM_CORTEX_M
#define ARCH_ARM_CORTEX_M7
@@ -83,17 +84,12 @@
#define RT_SERIAL_RB_BUFSZ 64
#define RT_USING_PIN
-/* Using Hardware Crypto drivers */
-
-
-/* Using WiFi */
-
-
/* Using USB */
/* POSIX layer and C standard library */
+#define RT_USING_LIBC
/* Network */
@@ -106,9 +102,6 @@
/* light weight TCP/IP stack */
-/* Modbus master and slave stack */
-
-
/* AT commands */
@@ -157,6 +150,12 @@
/* samples: kernel and components samples */
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
#define SOC_FAMILY_STM32
#define SOC_SERIES_STM32F7
diff --git a/bsp/stm32/stm32f767-st-nucleo/.config b/bsp/stm32/stm32f767-st-nucleo/.config
new file mode 100644
index 0000000000000000000000000000000000000000..9929d6fa1fc3afb3690fa6aae344e3745dbd6281
--- /dev/null
+++ b/bsp/stm32/stm32f767-st-nucleo/.config
@@ -0,0 +1,529 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# RT-Thread Configuration
+#
+
+#
+# RT-Thread Kernel
+#
+CONFIG_RT_NAME_MAX=8
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
+# CONFIG_RT_USING_SMP is not set
+CONFIG_RT_ALIGN_SIZE=4
+# CONFIG_RT_THREAD_PRIORITY_8 is not set
+CONFIG_RT_THREAD_PRIORITY_32=y
+# CONFIG_RT_THREAD_PRIORITY_256 is not set
+CONFIG_RT_THREAD_PRIORITY_MAX=32
+CONFIG_RT_TICK_PER_SECOND=100
+CONFIG_RT_USING_OVERFLOW_CHECK=y
+CONFIG_RT_USING_HOOK=y
+CONFIG_RT_USING_IDLE_HOOK=y
+CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
+CONFIG_IDLE_THREAD_STACK_SIZE=256
+CONFIG_RT_USING_TIMER_SOFT=y
+CONFIG_RT_TIMER_THREAD_PRIO=4
+CONFIG_RT_TIMER_THREAD_STACK_SIZE=512
+CONFIG_RT_DEBUG=y
+# CONFIG_RT_DEBUG_COLOR is not set
+# CONFIG_RT_DEBUG_INIT_CONFIG is not set
+# CONFIG_RT_DEBUG_THREAD_CONFIG is not set
+# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set
+# CONFIG_RT_DEBUG_IPC_CONFIG is not set
+# CONFIG_RT_DEBUG_TIMER_CONFIG is not set
+# CONFIG_RT_DEBUG_IRQ_CONFIG is not set
+# CONFIG_RT_DEBUG_MEM_CONFIG is not set
+# CONFIG_RT_DEBUG_SLAB_CONFIG is not set
+# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set
+# CONFIG_RT_DEBUG_MODULE_CONFIG is not set
+
+#
+# Inter-Thread communication
+#
+CONFIG_RT_USING_SEMAPHORE=y
+CONFIG_RT_USING_MUTEX=y
+CONFIG_RT_USING_EVENT=y
+CONFIG_RT_USING_MAILBOX=y
+CONFIG_RT_USING_MESSAGEQUEUE=y
+# CONFIG_RT_USING_SIGNALS is not set
+
+#
+# Memory Management
+#
+CONFIG_RT_USING_MEMPOOL=y
+# CONFIG_RT_USING_MEMHEAP is not set
+# CONFIG_RT_USING_NOHEAP is not set
+CONFIG_RT_USING_SMALL_MEM=y
+# CONFIG_RT_USING_SLAB is not set
+# CONFIG_RT_USING_MEMTRACE is not set
+CONFIG_RT_USING_HEAP=y
+
+#
+# Kernel Device Object
+#
+CONFIG_RT_USING_DEVICE=y
+# CONFIG_RT_USING_DEVICE_OPS is not set
+# CONFIG_RT_USING_INTERRUPT_INFO is not set
+CONFIG_RT_USING_CONSOLE=y
+CONFIG_RT_CONSOLEBUF_SIZE=128
+CONFIG_RT_CONSOLE_DEVICE_NAME="uart"
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
+CONFIG_RT_USING_CPU_FFS=y
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
+CONFIG_ARCH_ARM_CORTEX_M=y
+CONFIG_ARCH_ARM_CORTEX_M7=y
+
+#
+# RT-Thread Components
+#
+CONFIG_RT_USING_COMPONENTS_INIT=y
+CONFIG_RT_USING_USER_MAIN=y
+CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048
+CONFIG_RT_MAIN_THREAD_PRIORITY=10
+
+#
+# C++ features
+#
+# CONFIG_RT_USING_CPLUSPLUS is not set
+
+#
+# Command shell
+#
+CONFIG_RT_USING_FINSH=y
+CONFIG_FINSH_THREAD_NAME="tshell"
+CONFIG_FINSH_USING_HISTORY=y
+CONFIG_FINSH_HISTORY_LINES=5
+CONFIG_FINSH_USING_SYMTAB=y
+CONFIG_FINSH_USING_DESCRIPTION=y
+# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
+CONFIG_FINSH_THREAD_PRIORITY=20
+CONFIG_FINSH_THREAD_STACK_SIZE=4096
+CONFIG_FINSH_CMD_SIZE=80
+# CONFIG_FINSH_USING_AUTH is not set
+CONFIG_FINSH_USING_MSH=y
+CONFIG_FINSH_USING_MSH_DEFAULT=y
+# CONFIG_FINSH_USING_MSH_ONLY is not set
+CONFIG_FINSH_ARG_MAX=10
+
+#
+# Device virtual file system
+#
+CONFIG_RT_USING_DFS=y
+CONFIG_DFS_USING_WORKDIR=y
+CONFIG_DFS_FILESYSTEMS_MAX=2
+CONFIG_DFS_FILESYSTEM_TYPES_MAX=2
+CONFIG_DFS_FD_MAX=16
+# CONFIG_RT_USING_DFS_MNTTABLE is not set
+# CONFIG_RT_USING_DFS_ELMFAT is not set
+CONFIG_RT_USING_DFS_DEVFS=y
+# CONFIG_RT_USING_DFS_ROMFS is not set
+# CONFIG_RT_USING_DFS_RAMFS is not set
+# CONFIG_RT_USING_DFS_UFFS is not set
+# CONFIG_RT_USING_DFS_JFFS2 is not set
+
+#
+# Device Drivers
+#
+CONFIG_RT_USING_DEVICE_IPC=y
+CONFIG_RT_PIPE_BUFSZ=512
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
+CONFIG_RT_USING_SERIAL=y
+CONFIG_RT_SERIAL_USING_DMA=y
+CONFIG_RT_SERIAL_RB_BUFSZ=64
+# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_HWTIMER is not set
+# CONFIG_RT_USING_CPUTIME is not set
+# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
+# CONFIG_RT_USING_MTD_NAND is not set
+# CONFIG_RT_USING_PM is not set
+# CONFIG_RT_USING_RTC is not set
+# CONFIG_RT_USING_SDIO is not set
+# CONFIG_RT_USING_SPI is not set
+# CONFIG_RT_USING_WDT is not set
+# CONFIG_RT_USING_AUDIO is not set
+# CONFIG_RT_USING_SENSOR is not set
+# CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
+# CONFIG_RT_USING_WIFI is not set
+
+#
+# Using USB
+#
+# CONFIG_RT_USING_USB_HOST is not set
+# CONFIG_RT_USING_USB_DEVICE is not set
+
+#
+# POSIX layer and C standard library
+#
+CONFIG_RT_USING_LIBC=y
+# CONFIG_RT_USING_PTHREADS is not set
+CONFIG_RT_USING_POSIX=y
+# CONFIG_RT_USING_POSIX_MMAP is not set
+# CONFIG_RT_USING_POSIX_TERMIOS is not set
+# CONFIG_RT_USING_POSIX_GETLINE is not set
+# CONFIG_RT_USING_POSIX_AIO is not set
+# CONFIG_RT_USING_MODULE is not set
+
+#
+# Network
+#
+
+#
+# Socket abstraction layer
+#
+# CONFIG_RT_USING_SAL is not set
+
+#
+# Network interface device
+#
+# CONFIG_RT_USING_NETDEV is not set
+
+#
+# light weight TCP/IP stack
+#
+# CONFIG_RT_USING_LWIP is not set
+
+#
+# AT commands
+#
+# CONFIG_RT_USING_AT is not set
+
+#
+# VBUS(Virtual Software BUS)
+#
+# CONFIG_RT_USING_VBUS is not set
+
+#
+# Utilities
+#
+# CONFIG_RT_USING_RYM is not set
+# CONFIG_RT_USING_ULOG is not set
+# CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_LWP is not set
+
+#
+# RT-Thread online packages
+#
+
+#
+# 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
+
+#
+# Wi-Fi
+#
+
+#
+# Marvell WiFi
+#
+# CONFIG_PKG_USING_WLANMARVELL is not set
+
+#
+# Wiced WiFi
+#
+# CONFIG_PKG_USING_WLAN_WICED is not set
+# CONFIG_PKG_USING_RW007 is not set
+# 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
+
+#
+# IoT Cloud
+#
+# CONFIG_PKG_USING_ONENET is not set
+# 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_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
+#
+# 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
+#
+# CONFIG_PKG_USING_LUA is not set
+# CONFIG_PKG_USING_JERRYSCRIPT is not set
+# CONFIG_PKG_USING_MICROPYTHON is not set
+
+#
+# multimedia packages
+#
+# 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
+#
+# CONFIG_PKG_USING_CMBACKTRACE is not set
+# CONFIG_PKG_USING_EASYFLASH is not set
+# CONFIG_PKG_USING_EASYLOGGER is not set
+# CONFIG_PKG_USING_SYSTEMVIEW 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
+# 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
+#
+# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON 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_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
+#
+# 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
+# CONFIG_PKG_USING_BUTTON is not set
+# CONFIG_PKG_USING_PCF8574 is not set
+# 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
+# CONFIG_PKG_USING_PCA9685 is not set
+# 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
+#
+# CONFIG_PKG_USING_LIBCSV is not set
+# CONFIG_PKG_USING_OPTPARSE is not set
+# CONFIG_PKG_USING_FASTLZ is not set
+# 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
+#
+# 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_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_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_FAMILY_STM32=y
+CONFIG_SOC_SERIES_STM32F7=y
+
+#
+# Hardware Drivers Config
+#
+CONFIG_SOC_STM32F767ZI=y
+
+#
+# Onboard Peripheral Drivers
+#
+CONFIG_BSP_USING_USB_TO_USART=y
+# CONFIG_BSP_USING_ETH is not set
+
+#
+# On-chip Peripheral Drivers
+#
+CONFIG_BSP_USING_GPIO=y
+CONFIG_BSP_USING_UART=y
+CONFIG_BSP_USING_UART3=y
+# CONFIG_BSP_UART3_RX_USING_DMA is not set
+# CONFIG_BSP_USING_CRC is not set
+# CONFIG_BSP_USING_RNG is not set
+# CONFIG_BSP_USING_UDID is not set
+
+#
+# Board extended module Drivers
+#
diff --git a/bsp/stm32/stm32f767-st-nucleo/board/Kconfig b/bsp/stm32/stm32f767-st-nucleo/board/Kconfig
index 849b397b3c1dba29991ede180854b5d8eae4ce4b..8e884601478daf598bc9b5be29610a1f5ec5642d 100644
--- a/bsp/stm32/stm32f767-st-nucleo/board/Kconfig
+++ b/bsp/stm32/stm32f767-st-nucleo/board/Kconfig
@@ -5,6 +5,7 @@ config SOC_STM32F767ZI
select SOC_SERIES_STM32F7
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
menu "Onboard Peripheral Drivers"
diff --git a/bsp/stm32/stm32f767-st-nucleo/rtconfig.h b/bsp/stm32/stm32f767-st-nucleo/rtconfig.h
index 93fffb6a8fefe4a1eddec11c9688735fc5389555..e48e0d09451837cc3f7b6a8d15699b1ad37a7c5a 100644
--- a/bsp/stm32/stm32f767-st-nucleo/rtconfig.h
+++ b/bsp/stm32/stm32f767-st-nucleo/rtconfig.h
@@ -16,8 +16,10 @@
#define RT_USING_IDLE_HOOK
#define RT_IDLE_HOOK_LIST_SIZE 4
#define IDLE_THREAD_STACK_SIZE 256
+#define RT_USING_TIMER_SOFT
+#define RT_TIMER_THREAD_PRIO 4
+#define RT_TIMER_THREAD_STACK_SIZE 512
#define RT_DEBUG
-#define RT_DEBUG_COLOR
/* Inter-Thread communication */
@@ -38,8 +40,10 @@
#define RT_USING_DEVICE
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
-#define RT_CONSOLE_DEVICE_NAME "uart3"
-#define RT_VER_NUM 0x40000
+#define RT_CONSOLE_DEVICE_NAME "uart"
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
+#define RT_USING_CPU_FFS
#define ARCH_ARM
#define ARCH_ARM_CORTEX_M
#define ARCH_ARM_CORTEX_M7
@@ -84,11 +88,9 @@
#define RT_PIPE_BUFSZ 512
#define RT_USING_SERIAL
#define RT_SERIAL_USING_DMA
+#define RT_SERIAL_RB_BUFSZ 64
#define RT_USING_PIN
-/* Using WiFi */
-
-
/* Using USB */
@@ -102,10 +104,10 @@
/* Socket abstraction layer */
-/* light weight TCP/IP stack */
+/* Network interface device */
-/* Modbus master and slave stack */
+/* light weight TCP/IP stack */
/* AT commands */
@@ -117,9 +119,6 @@
/* Utilities */
-/* ARM CMSIS */
-
-
/* RT-Thread online packages */
/* IoT - internet of things */
@@ -157,12 +156,13 @@
/* miscellaneous packages */
-/* sample package */
-
/* samples: kernel and components samples */
-/* example package: hello */
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
#define SOC_FAMILY_STM32
#define SOC_SERIES_STM32F7
diff --git a/bsp/stm32/stm32f769-st-disco/.config b/bsp/stm32/stm32f769-st-disco/.config
index 9593efe39dc797a7f85be4bd00f31f3b38b1f7e5..671f310108e5117cc273397ab0c058bf91cc716e 100644
--- a/bsp/stm32/stm32f769-st-disco/.config
+++ b/bsp/stm32/stm32f769-st-disco/.config
@@ -8,6 +8,7 @@
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -65,11 +66,12 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
CONFIG_RT_VER_NUM=0x40003
-CONFIG_ARCH_ARM=y
+CONFIG_RT_USING_CACHE=y
CONFIG_RT_USING_CPU_FFS=y
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
CONFIG_ARCH_ARM_CORTEX_M=y
CONFIG_ARCH_ARM_CORTEX_M7=y
-# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
#
# RT-Thread Components
@@ -121,6 +123,7 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY is not set
CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
@@ -149,9 +152,9 @@ CONFIG_RT_USING_PIN=y
#
# POSIX layer and C standard library
#
-# CONFIG_RT_USING_LIBC is not set
+CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_PTHREADS is not set
-CONFIG_RT_LIBC_USING_TIME=y
+# CONFIG_RT_USING_MODULE is not set
#
# Network
@@ -176,6 +179,7 @@ CONFIG_RT_USING_LWIP=y
CONFIG_RT_USING_LWIP202=y
# 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=y
CONFIG_RT_LWIP_ICMP=y
# CONFIG_RT_LWIP_SNMP is not set
@@ -322,6 +326,9 @@ CONFIG_RT_LWIP_USING_PING=y
# 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
@@ -347,6 +354,7 @@ CONFIG_RT_LWIP_USING_PING=y
# 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
@@ -367,6 +375,7 @@ CONFIG_RT_LWIP_USING_PING=y
# 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
@@ -395,6 +404,7 @@ CONFIG_RT_LWIP_USING_PING=y
# 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
@@ -445,6 +455,10 @@ CONFIG_RT_LWIP_USING_PING=y
# 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
@@ -482,6 +496,48 @@ CONFIG_RT_LWIP_USING_PING=y
# 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_FAMILY_STM32=y
CONFIG_SOC_SERIES_STM32F7=y
diff --git a/bsp/stm32/stm32f769-st-disco/board/Kconfig b/bsp/stm32/stm32f769-st-disco/board/Kconfig
index 03b60cf1c0d7fb4ed79387a1f9eec6f1e2360364..57eb4c81d8b6533403a5440a3aa8749a82340fa1 100644
--- a/bsp/stm32/stm32f769-st-disco/board/Kconfig
+++ b/bsp/stm32/stm32f769-st-disco/board/Kconfig
@@ -5,6 +5,7 @@ config SOC_STM32F769NI
select SOC_SERIES_STM32F7
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
menu "Onboard Peripheral Drivers"
diff --git a/bsp/stm32/stm32f769-st-disco/rtconfig.h b/bsp/stm32/stm32f769-st-disco/rtconfig.h
index 1639b90bd045c478b0600f77c41a60325c4fde15..b500f587f7a4ab7ce82cb119f2687523501a519d 100644
--- a/bsp/stm32/stm32f769-st-disco/rtconfig.h
+++ b/bsp/stm32/stm32f769-st-disco/rtconfig.h
@@ -40,8 +40,9 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart1"
#define RT_VER_NUM 0x40003
-#define ARCH_ARM
+#define RT_USING_CACHE
#define RT_USING_CPU_FFS
+#define ARCH_ARM
#define ARCH_ARM_CORTEX_M
#define ARCH_ARM_CORTEX_M7
@@ -88,7 +89,7 @@
/* POSIX layer and C standard library */
-#define RT_LIBC_USING_TIME
+#define RT_USING_LIBC
/* Network */
@@ -103,6 +104,7 @@
#define RT_USING_LWIP
#define RT_USING_LWIP202
+#define RT_LWIP_MEM_ALIGNMENT 4
#define RT_LWIP_IGMP
#define RT_LWIP_ICMP
#define RT_LWIP_DNS
@@ -190,6 +192,12 @@
/* samples: kernel and components samples */
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
#define SOC_FAMILY_STM32
#define SOC_SERIES_STM32F7
diff --git a/bsp/stm32/stm32h743-atk-apollo/.config b/bsp/stm32/stm32h743-atk-apollo/.config
index 294f481a7e1a81ab817ae562cd6bdd6124ac8992..261be9e1f350617ea7cbf10db21910b14053d94d 100644
--- a/bsp/stm32/stm32h743-atk-apollo/.config
+++ b/bsp/stm32/stm32h743-atk-apollo/.config
@@ -8,6 +8,7 @@
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -65,11 +66,12 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
CONFIG_RT_VER_NUM=0x40003
-CONFIG_ARCH_ARM=y
+CONFIG_RT_USING_CACHE=y
CONFIG_RT_USING_CPU_FFS=y
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
CONFIG_ARCH_ARM_CORTEX_M=y
CONFIG_ARCH_ARM_CORTEX_M7=y
-# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
#
# RT-Thread Components
@@ -107,10 +109,6 @@ CONFIG_FINSH_ARG_MAX=10
# Device virtual file system
#
# CONFIG_RT_USING_DFS is not set
-# CONFIG_RT_DFS_ELM_USE_LFN_0 is not set
-# CONFIG_RT_DFS_ELM_USE_LFN_1 is not set
-# CONFIG_RT_DFS_ELM_USE_LFN_2 is not set
-# CONFIG_RT_DFS_ELM_USE_LFN_3 is not set
#
# Device Drivers
@@ -125,8 +123,10 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
@@ -152,9 +152,9 @@ CONFIG_RT_USING_PIN=y
#
# POSIX layer and C standard library
#
-# CONFIG_RT_USING_LIBC is not set
+CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_PTHREADS is not set
-CONFIG_RT_LIBC_USING_TIME=y
+# CONFIG_RT_USING_MODULE is not set
#
# Network
@@ -200,10 +200,15 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -230,6 +235,8 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -241,7 +248,10 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -252,6 +262,18 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -259,6 +281,8 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -275,6 +299,7 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -287,6 +312,15 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -298,6 +332,7 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -306,6 +341,15 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -313,6 +357,7 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -321,10 +366,16 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -332,8 +383,27 @@ CONFIG_RT_LIBC_USING_TIME=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_LCD_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
@@ -368,6 +438,49 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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_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_FAMILY_STM32=y
CONFIG_SOC_SERIES_STM32H7=y
@@ -397,7 +510,10 @@ CONFIG_BSP_USING_UART1=y
# CONFIG_BSP_USING_SPI is not set
# CONFIG_BSP_USING_QSPI is not set
# CONFIG_BSP_USING_I2C1 is not set
+# CONFIG_BSP_USING_ON_CHIP_FLASH is not set
# CONFIG_BSP_USING_ONCHIP_RTC is not set
+# CONFIG_BSP_USING_ADC is not set
+# CONFIG_BSP_USING_DAC is not set
# CONFIG_BSP_USING_WDT is not set
# CONFIG_BSP_USING_CRC is not set
# CONFIG_BSP_USING_RNG is not set
diff --git a/bsp/stm32/stm32h743-atk-apollo/board/Kconfig b/bsp/stm32/stm32h743-atk-apollo/board/Kconfig
index e2d7618062e28bcd0510fe2a397de26508007f0e..a4344fc47bc92b14e141c4fb4d14269a28afcf8a 100644
--- a/bsp/stm32/stm32h743-atk-apollo/board/Kconfig
+++ b/bsp/stm32/stm32h743-atk-apollo/board/Kconfig
@@ -5,6 +5,7 @@ config SOC_STM32H743II
select SOC_SERIES_STM32H7
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
menu "Onboard Peripheral Drivers"
diff --git a/bsp/stm32/stm32h743-atk-apollo/rtconfig.h b/bsp/stm32/stm32h743-atk-apollo/rtconfig.h
index bc9a31c7ab7a3651107f18047ff8094ece8fc74f..c1cc134a463a0d50b6b014f37008776ce05a01e7 100644
--- a/bsp/stm32/stm32h743-atk-apollo/rtconfig.h
+++ b/bsp/stm32/stm32h743-atk-apollo/rtconfig.h
@@ -39,8 +39,9 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart1"
#define RT_VER_NUM 0x40003
-#define ARCH_ARM
+#define RT_USING_CACHE
#define RT_USING_CPU_FFS
+#define ARCH_ARM
#define ARCH_ARM_CORTEX_M
#define ARCH_ARM_CORTEX_M7
@@ -87,7 +88,7 @@
/* POSIX layer and C standard library */
-#define RT_LIBC_USING_TIME
+#define RT_USING_LIBC
/* Network */
@@ -148,6 +149,12 @@
/* samples: kernel and components samples */
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
#define SOC_FAMILY_STM32
#define SOC_SERIES_STM32H7
diff --git a/bsp/stm32/stm32h743-st-nucleo/.config b/bsp/stm32/stm32h743-st-nucleo/.config
index b8dc6d8f710b36ae170446af4b430d414c7a67cd..7194cecf7ea404c9f7ff3119a48d96a903ebf6b5 100644
--- a/bsp/stm32/stm32h743-st-nucleo/.config
+++ b/bsp/stm32/stm32h743-st-nucleo/.config
@@ -8,6 +8,7 @@
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -64,12 +65,13 @@ CONFIG_RT_USING_DEVICE=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart3"
-CONFIG_RT_VER_NUM=0x40002
-CONFIG_ARCH_ARM=y
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
CONFIG_RT_USING_CPU_FFS=y
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
CONFIG_ARCH_ARM_CORTEX_M=y
CONFIG_ARCH_ARM_CORTEX_M7=y
-# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
#
# RT-Thread Components
@@ -121,8 +123,10 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
@@ -148,9 +152,9 @@ CONFIG_RT_USING_PIN=y
#
# POSIX layer and C standard library
#
-# CONFIG_RT_USING_LIBC is not set
+CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_PTHREADS is not set
-CONFIG_RT_LIBC_USING_TIME=y
+# CONFIG_RT_USING_MODULE is not set
#
# Network
@@ -196,10 +200,15 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -226,6 +235,7 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -238,8 +248,10 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -253,6 +265,15 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -260,6 +281,8 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -276,6 +299,7 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -290,6 +314,13 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -301,6 +332,7 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -309,6 +341,15 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -316,6 +357,7 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -324,6 +366,10 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -337,9 +383,27 @@ CONFIG_RT_LIBC_USING_TIME=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_LCD_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
@@ -376,6 +440,47 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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_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_FAMILY_STM32=y
CONFIG_SOC_SERIES_STM32H7=y
diff --git a/bsp/stm32/stm32h743-st-nucleo/board/Kconfig b/bsp/stm32/stm32h743-st-nucleo/board/Kconfig
index a693c29f5a44b6b2df977d55ce2caa834a00605a..bde3b6ada4fa1cc9584160d7148f0d64184e9d48 100644
--- a/bsp/stm32/stm32h743-st-nucleo/board/Kconfig
+++ b/bsp/stm32/stm32h743-st-nucleo/board/Kconfig
@@ -5,6 +5,7 @@ config SOC_STM32H743ZI
select SOC_SERIES_STM32H7
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
menu "Onboard Peripheral Drivers"
diff --git a/bsp/stm32/stm32h743-st-nucleo/rtconfig.h b/bsp/stm32/stm32h743-st-nucleo/rtconfig.h
index cedb0c06ce3a8b1e2e8bd6796e8464508d74b1a5..90d2ef7e77e51a4df1e4154f030ead7d838b26cb 100644
--- a/bsp/stm32/stm32h743-st-nucleo/rtconfig.h
+++ b/bsp/stm32/stm32h743-st-nucleo/rtconfig.h
@@ -38,9 +38,10 @@
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart3"
-#define RT_VER_NUM 0x40002
-#define ARCH_ARM
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
#define RT_USING_CPU_FFS
+#define ARCH_ARM
#define ARCH_ARM_CORTEX_M
#define ARCH_ARM_CORTEX_M7
@@ -87,7 +88,7 @@
/* POSIX layer and C standard library */
-#define RT_LIBC_USING_TIME
+#define RT_USING_LIBC
/* Network */
@@ -148,6 +149,12 @@
/* samples: kernel and components samples */
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
#define SOC_FAMILY_STM32
#define SOC_SERIES_STM32H7
diff --git a/bsp/stm32/stm32h747-st-discovery/.config b/bsp/stm32/stm32h747-st-discovery/.config
index 79e85b0bf1e3211b4a9527e61747f476edd95bcc..56172a7a83a714ddab0929219a53f6794471fad0 100644
--- a/bsp/stm32/stm32h747-st-discovery/.config
+++ b/bsp/stm32/stm32h747-st-discovery/.config
@@ -8,6 +8,7 @@
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -65,11 +66,12 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
CONFIG_RT_VER_NUM=0x40003
-CONFIG_ARCH_ARM=y
+CONFIG_RT_USING_CACHE=y
CONFIG_RT_USING_CPU_FFS=y
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
CONFIG_ARCH_ARM_CORTEX_M=y
CONFIG_ARCH_ARM_CORTEX_M7=y
-# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
#
# RT-Thread Components
@@ -121,8 +123,10 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
@@ -148,9 +152,9 @@ CONFIG_RT_USING_PIN=y
#
# POSIX layer and C standard library
#
-# CONFIG_RT_USING_LIBC is not set
+CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_PTHREADS is not set
-CONFIG_RT_LIBC_USING_TIME=y
+# CONFIG_RT_USING_MODULE is not set
#
# Network
@@ -196,10 +200,15 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -226,6 +235,8 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -237,8 +248,10 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -249,6 +262,18 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -256,6 +281,8 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -272,6 +299,7 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -284,6 +312,15 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -295,6 +332,7 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -303,6 +341,15 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -310,6 +357,7 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -318,10 +366,16 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -329,8 +383,27 @@ CONFIG_RT_LIBC_USING_TIME=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_LCD_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
@@ -365,6 +438,49 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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_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_FAMILY_STM32=y
CONFIG_SOC_SERIES_STM32H7=y
diff --git a/bsp/stm32/stm32h747-st-discovery/board/Kconfig b/bsp/stm32/stm32h747-st-discovery/board/Kconfig
index e1f1d01abaa8e1b62d3cc805cb4b37bed52e0891..a1baef364baf7d0f31145b499d19e2e263a96134 100644
--- a/bsp/stm32/stm32h747-st-discovery/board/Kconfig
+++ b/bsp/stm32/stm32h747-st-discovery/board/Kconfig
@@ -5,6 +5,7 @@ config SOC_STM32H747XI
select SOC_SERIES_STM32H7
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
menu "Onboard Peripheral Drivers"
diff --git a/bsp/stm32/stm32h747-st-discovery/rtconfig.h b/bsp/stm32/stm32h747-st-discovery/rtconfig.h
index 9838f7ab280272e6f76f2d78b5808710f4652cab..c0ac0199eac6e66e4839c102eb7eac25cd0332fb 100644
--- a/bsp/stm32/stm32h747-st-discovery/rtconfig.h
+++ b/bsp/stm32/stm32h747-st-discovery/rtconfig.h
@@ -39,8 +39,9 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart1"
#define RT_VER_NUM 0x40003
-#define ARCH_ARM
+#define RT_USING_CACHE
#define RT_USING_CPU_FFS
+#define ARCH_ARM
#define ARCH_ARM_CORTEX_M
#define ARCH_ARM_CORTEX_M7
@@ -87,7 +88,7 @@
/* POSIX layer and C standard library */
-#define RT_LIBC_USING_TIME
+#define RT_USING_LIBC
/* Network */
@@ -148,6 +149,12 @@
/* samples: kernel and components samples */
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
#define SOC_FAMILY_STM32
#define SOC_SERIES_STM32H7
diff --git a/bsp/stm32/stm32h750-armfly-h7-tool/.config b/bsp/stm32/stm32h750-armfly-h7-tool/.config
index 23b131643f0c5fe093f35e3403e05ced51a274f1..8c68c7a516bc2a3faf0980064061c10bcf74e177 100644
--- a/bsp/stm32/stm32h750-armfly-h7-tool/.config
+++ b/bsp/stm32/stm32h750-armfly-h7-tool/.config
@@ -8,6 +8,7 @@
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_SMP is not set
CONFIG_RT_ALIGN_SIZE=4
# CONFIG_RT_THREAD_PRIORITY_8 is not set
@@ -64,12 +65,13 @@ CONFIG_RT_USING_DEVICE=y
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
-CONFIG_RT_VER_NUM=0x40002
-CONFIG_ARCH_ARM=y
+CONFIG_RT_VER_NUM=0x40003
+CONFIG_RT_USING_CACHE=y
CONFIG_RT_USING_CPU_FFS=y
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+CONFIG_ARCH_ARM=y
CONFIG_ARCH_ARM_CORTEX_M=y
CONFIG_ARCH_ARM_CORTEX_M7=y
-# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
#
# RT-Thread Components
@@ -121,8 +123,10 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY 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 is not set
# CONFIG_RT_USING_MTD_NAND is not set
@@ -167,9 +171,9 @@ CONFIG_RT_HWCRYPTO_USING_CRC=y
#
# POSIX layer and C standard library
#
-# CONFIG_RT_USING_LIBC is not set
+CONFIG_RT_USING_LIBC=y
# CONFIG_RT_USING_PTHREADS is not set
-CONFIG_RT_LIBC_USING_TIME=y
+# CONFIG_RT_USING_MODULE is not set
#
# Network
@@ -215,10 +219,15 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -245,6 +254,7 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -257,8 +267,10 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -270,6 +282,17 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -277,6 +300,8 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -293,6 +318,7 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -305,6 +331,15 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -316,6 +351,7 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -324,6 +360,15 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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
@@ -331,6 +376,7 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -339,10 +385,16 @@ CONFIG_RT_LIBC_USING_TIME=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
@@ -350,9 +402,27 @@ CONFIG_RT_LIBC_USING_TIME=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_LCD_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
@@ -387,6 +457,49 @@ CONFIG_RT_LIBC_USING_TIME=y
# 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_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_FAMILY_STM32=y
CONFIG_SOC_SERIES_STM32H7=y
@@ -398,6 +511,10 @@ CONFIG_SOC_STM32H750IB=y
#
# Onboard Peripheral Drivers
#
+# CONFIG_BSP_USING_QSPI_FLASH is not set
+# CONFIG_BSP_USING_ETH is not set
+# CONFIG_BSP_USING_LCD is not set
+# CONFIG_BSP_USING_ESP32 is not set
#
# On-chip Peripheral Drivers
@@ -405,6 +522,14 @@ CONFIG_SOC_STM32H750IB=y
CONFIG_BSP_USING_GPIO=y
CONFIG_BSP_USING_UART=y
CONFIG_BSP_USING_UART1=y
+CONFIG_BSP_USING_UART4=y
+# CONFIG_BSP_USING_QSPI is not set
+# CONFIG_BSP_QSPI_USING_DMA is not set
+# CONFIG_BSP_USING_I2C1 is not set
+# CONFIG_BSP_USING_PWM is not set
+# CONFIG_BSP_USING_ADC is not set
+# CONFIG_BSP_USING_SDIO is not set
+# CONFIG_BSP_USING_USBD is not set
CONFIG_BSP_USING_CRC=y
CONFIG_BSP_USING_RNG=y
CONFIG_BSP_USING_UDID=y
diff --git a/bsp/stm32/stm32h750-armfly-h7-tool/board/Kconfig b/bsp/stm32/stm32h750-armfly-h7-tool/board/Kconfig
index 0f3d798f717683a60d337c22fcd134e8702ce509..65b3d92050d332b48959e9ecabe9bd77d3c1c396 100644
--- a/bsp/stm32/stm32h750-armfly-h7-tool/board/Kconfig
+++ b/bsp/stm32/stm32h750-armfly-h7-tool/board/Kconfig
@@ -5,6 +5,7 @@ config SOC_STM32H750IB
select SOC_SERIES_STM32H7
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
+ select RT_USING_CACHE
default y
menu "Onboard Peripheral Drivers"
diff --git a/bsp/stm32/stm32h750-armfly-h7-tool/rtconfig.h b/bsp/stm32/stm32h750-armfly-h7-tool/rtconfig.h
index 4390e994d2d67dceb990a9fe12541cdf5bc93ab8..c2586f44d7642dde3f8118e4cbef434ec2461c8a 100644
--- a/bsp/stm32/stm32h750-armfly-h7-tool/rtconfig.h
+++ b/bsp/stm32/stm32h750-armfly-h7-tool/rtconfig.h
@@ -38,9 +38,10 @@
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart1"
-#define RT_VER_NUM 0x40002
-#define ARCH_ARM
+#define RT_VER_NUM 0x40003
+#define RT_USING_CACHE
#define RT_USING_CPU_FFS
+#define ARCH_ARM
#define ARCH_ARM_CORTEX_M
#define ARCH_ARM_CORTEX_M7
@@ -93,7 +94,7 @@
/* POSIX layer and C standard library */
-#define RT_LIBC_USING_TIME
+#define RT_USING_LIBC
/* Network */
@@ -154,6 +155,12 @@
/* samples: kernel and components samples */
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
#define SOC_FAMILY_STM32
#define SOC_SERIES_STM32H7
@@ -163,11 +170,13 @@
/* Onboard Peripheral Drivers */
+
/* On-chip Peripheral Drivers */
#define BSP_USING_GPIO
#define BSP_USING_UART
#define BSP_USING_UART1
+#define BSP_USING_UART4
#define BSP_USING_CRC
#define BSP_USING_RNG
#define BSP_USING_UDID
diff --git a/bsp/zynq7000/rtconfig.h b/bsp/zynq7000/rtconfig.h
index b09fc1ab26fdcf6dd91095c93016b218621391eb..b5660064105eaef51ba187fbed26d5016e4af5f0 100644
--- a/bsp/zynq7000/rtconfig.h
+++ b/bsp/zynq7000/rtconfig.h
@@ -67,6 +67,8 @@
// #define RT_USING_SLAB
//
+#define RT_USING_CACHE
+
//
#define RT_USING_DEVICE
//
diff --git a/components/dfs/Kconfig b/components/dfs/Kconfig
index c93fd02e66f87b468504bb9363f635d7c54dc8e2..657c8a25c42b24be2efe7588ada2debbf7860966 100644
--- a/components/dfs/Kconfig
+++ b/components/dfs/Kconfig
@@ -108,9 +108,14 @@ if RT_USING_DFS
default y
config RT_USING_DFS_ROMFS
- bool "Enable ReadOnly file system on flash"
+ bool "Enable readonly file system on flash"
default n
+ config RT_USING_DFS_CROMFS
+ bool "Enable readonly compressed file system on flash"
+ default n
+ select PKG_USING_ZLIB
+
config RT_USING_DFS_RAMFS
bool "Enable RAM file system"
select RT_USING_MEMHEAP
diff --git a/components/dfs/filesystems/cromfs/SConscript b/components/dfs/filesystems/cromfs/SConscript
new file mode 100644
index 0000000000000000000000000000000000000000..1bc4d444cebfdc49a9f40f58fb3591b2364011d4
--- /dev/null
+++ b/components/dfs/filesystems/cromfs/SConscript
@@ -0,0 +1,11 @@
+# RT-Thread building script for component
+
+from building import *
+
+cwd = GetCurrentDir()
+src = Glob('*.c')
+CPPPATH = [cwd]
+
+group = DefineGroup('Filesystem', src, depend = ['RT_USING_DFS','RT_USING_DFS_CROMFS'], CPPPATH = CPPPATH)
+
+Return('group')
diff --git a/components/dfs/filesystems/cromfs/dfs_cromfs.c b/components/dfs/filesystems/cromfs/dfs_cromfs.c
new file mode 100644
index 0000000000000000000000000000000000000000..099d5a31dacc76ebbafed2916f0388a462030fe1
--- /dev/null
+++ b/components/dfs/filesystems/cromfs/dfs_cromfs.c
@@ -0,0 +1,1014 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020/08/21 ShaoJinchun first version
+ */
+
+#include
+#include
+#include
+#include
+
+#include "dfs_cromfs.h"
+
+#include
+
+#include "zlib.h"
+
+/**********************************/
+
+#define CROMFS_PATITION_HEAD_SIZE 256
+#define CROMFS_DIRENT_CACHE_SIZE 8
+
+#define CROMFS_MAGIC "CROMFSMG"
+
+#define CROMFS_CT_ASSERT(name, x) \
+ struct assert_##name {char ary[2 * (x) - 1];}
+
+#define CROMFS_POS_ROOT (0x0UL)
+#define CROMFS_POS_ERROR (0x1UL)
+
+typedef struct
+{
+ uint8_t magic[8]; /* CROMFS_MAGIC */
+ uint32_t version;
+ uint32_t partition_attr; /* expand, now reserved 0 */
+ uint32_t partition_size; /* with partition head */
+ uint32_t root_dir_pos; /* root dir pos */
+ uint32_t root_dir_size;
+} partition_head_data;
+
+typedef struct
+{
+ partition_head_data head;
+ uint8_t padding[CROMFS_PATITION_HEAD_SIZE - sizeof(partition_head_data)];
+} partition_head;
+
+#define CROMFS_DIRENT_ATTR_DIR 0x1UL
+#define CROMFS_DIRENT_ATTR_FILE 0x0UL
+
+typedef struct
+{
+ uint16_t attr; /* dir or file add other */
+ uint16_t name_size; /* name real size */
+ uint32_t file_size; /* file data size */
+ uint32_t file_origin_size; /* file size before compress */
+ uint32_t parition_pos; /* offset of data */
+ uint8_t name[0]; /* name data */
+} cromfs_dirent;
+
+#define CROMFS_ALIGN_SIZE_BIT 4
+#define CROMFS_ALIGN_SIZE (1UL << CROMFS_ALIGN_SIZE_BIT) /* must be same as sizeof cromfs_dirent */
+#define CROMFS_ALIGN_SIZE_MASK (CROMFS_ALIGN_SIZE - 1)
+
+CROMFS_CT_ASSERT(align_size, CROMFS_ALIGN_SIZE == sizeof(cromfs_dirent));
+
+typedef union
+{
+ cromfs_dirent dirent;
+ uint8_t name[CROMFS_ALIGN_SIZE];
+} cromfs_dirent_item;
+
+/**********************************/
+
+typedef struct
+{
+ rt_list_t list;
+ uint32_t partition_pos;
+ uint32_t size;
+ uint8_t *buff;
+} cromfs_dirent_cache;
+
+typedef struct st_cromfs_info
+{
+ rt_device_t device;
+ uint32_t partition_size;
+ uint32_t bytes_per_sector;
+ uint32_t (*read_bytes)(struct st_cromfs_info *ci, uint32_t pos, void *buf, uint32_t size);
+ partition_head_data part_info;
+ struct rt_mutex lock;
+ struct cromfs_avl_struct *cromfs_avl_root;
+ rt_list_t cromfs_dirent_cache_head;
+ int cromfs_dirent_cache_nr;
+} cromfs_info;
+
+typedef struct
+{
+ uint32_t ref;
+ uint32_t partition_pos;
+ cromfs_info *ci;
+ uint32_t size;
+ uint8_t *buff;
+ uint32_t partition_size;
+ int data_valid;
+} file_info;
+
+/**********************************/
+
+#define avl_key_t uint32_t
+#define AVL_EMPTY (struct cromfs_avl_struct *)0
+#define avl_maxheight 32
+#define heightof(tree) ((tree) == AVL_EMPTY ? 0 : (tree)->avl_height)
+
+struct cromfs_avl_struct
+{
+ struct cromfs_avl_struct *avl_left;
+ struct cromfs_avl_struct *avl_right;
+ int avl_height;
+ avl_key_t avl_key;
+ file_info *fi;
+};
+
+static void cromfs_avl_remove(struct cromfs_avl_struct * node_to_delete, struct cromfs_avl_struct ** ptree);
+static void cromfs_avl_insert(struct cromfs_avl_struct * new_node, struct cromfs_avl_struct ** ptree);
+static struct cromfs_avl_struct* cromfs_avl_find(avl_key_t key, struct cromfs_avl_struct* ptree);
+
+static void cromfs_avl_rebalance(struct cromfs_avl_struct *** nodeplaces_ptr, int count)
+{
+ for ( ; count > 0 ; count--)
+ {
+ struct cromfs_avl_struct ** nodeplace = *--nodeplaces_ptr;
+ struct cromfs_avl_struct * node = *nodeplace;
+ struct cromfs_avl_struct * nodeleft = node->avl_left;
+ struct cromfs_avl_struct * noderight = node->avl_right;
+ int heightleft = heightof(nodeleft);
+ int heightright = heightof(noderight);
+ if (heightright + 1 < heightleft)
+ {
+ struct cromfs_avl_struct * nodeleftleft = nodeleft->avl_left;
+ struct cromfs_avl_struct * nodeleftright = nodeleft->avl_right;
+ int heightleftright = heightof(nodeleftright);
+ if (heightof(nodeleftleft) >= heightleftright)
+ {
+ node->avl_left = nodeleftright; nodeleft->avl_right = node;
+ nodeleft->avl_height = 1 + (node->avl_height = 1 + heightleftright);
+ *nodeplace = nodeleft;
+ }
+ else
+ {
+ nodeleft->avl_right = nodeleftright->avl_left;
+ node->avl_left = nodeleftright->avl_right;
+ nodeleftright->avl_left = nodeleft;
+ nodeleftright->avl_right = node;
+ nodeleft->avl_height = node->avl_height = heightleftright;
+ nodeleftright->avl_height = heightleft;
+ *nodeplace = nodeleftright;
+ }
+ }
+ else if (heightleft + 1 < heightright)
+ {
+ struct cromfs_avl_struct * noderightright = noderight->avl_right;
+ struct cromfs_avl_struct * noderightleft = noderight->avl_left;
+ int heightrightleft = heightof(noderightleft);
+ if (heightof(noderightright) >= heightrightleft)
+ {
+ node->avl_right = noderightleft; noderight->avl_left = node;
+ noderight->avl_height = 1 + (node->avl_height = 1 + heightrightleft);
+ *nodeplace = noderight;
+ }
+ else
+ {
+ noderight->avl_left = noderightleft->avl_right;
+ node->avl_right = noderightleft->avl_left;
+ noderightleft->avl_right = noderight;
+ noderightleft->avl_left = node;
+ noderight->avl_height = node->avl_height = heightrightleft;
+ noderightleft->avl_height = heightright;
+ *nodeplace = noderightleft;
+ }
+ }
+ else {
+ int height = (heightleftavl_height)
+ break;
+ node->avl_height = height;
+ }
+ }
+}
+
+static void cromfs_avl_remove(struct cromfs_avl_struct * node_to_delete, struct cromfs_avl_struct ** ptree)
+{
+ avl_key_t key = node_to_delete->avl_key;
+ struct cromfs_avl_struct ** nodeplace = ptree;
+ struct cromfs_avl_struct ** stack[avl_maxheight];
+ uint32_t stack_count = 0;
+ struct cromfs_avl_struct *** stack_ptr = &stack[0]; /* = &stack[stackcount] */
+ struct cromfs_avl_struct ** nodeplace_to_delete;
+ for (;;)
+ {
+ struct cromfs_avl_struct * node = *nodeplace;
+ if (node == AVL_EMPTY)
+ return;
+ *stack_ptr++ = nodeplace; stack_count++;
+ if (key == node->avl_key)
+ break;
+ if (key < node->avl_key)
+ nodeplace = &node->avl_left;
+ else
+ nodeplace = &node->avl_right;
+ }
+ nodeplace_to_delete = nodeplace;
+ if (node_to_delete->avl_left == AVL_EMPTY)
+ {
+ *nodeplace_to_delete = node_to_delete->avl_right;
+ stack_ptr--; stack_count--;
+ }
+ else
+ {
+ struct cromfs_avl_struct *** stack_ptr_to_delete = stack_ptr;
+ struct cromfs_avl_struct ** nodeplace = &node_to_delete->avl_left;
+ struct cromfs_avl_struct * node;
+ for (;;)
+ {
+ node = *nodeplace;
+ if (node->avl_right == AVL_EMPTY)
+ break;
+ *stack_ptr++ = nodeplace; stack_count++;
+ nodeplace = &node->avl_right;
+ }
+ *nodeplace = node->avl_left;
+ node->avl_left = node_to_delete->avl_left;
+ node->avl_right = node_to_delete->avl_right;
+ node->avl_height = node_to_delete->avl_height;
+ *nodeplace_to_delete = node;
+ *stack_ptr_to_delete = &node->avl_left;
+ }
+ cromfs_avl_rebalance(stack_ptr,stack_count);
+}
+
+static void cromfs_avl_insert(struct cromfs_avl_struct * new_node, struct cromfs_avl_struct ** ptree)
+{
+ avl_key_t key = new_node->avl_key;
+ struct cromfs_avl_struct ** nodeplace = ptree;
+ struct cromfs_avl_struct ** stack[avl_maxheight];
+ int stack_count = 0;
+ struct cromfs_avl_struct *** stack_ptr = &stack[0]; /* = &stack[stackcount] */
+ for (;;)
+ {
+ struct cromfs_avl_struct * node = *nodeplace;
+ if (node == AVL_EMPTY)
+ break;
+ *stack_ptr++ = nodeplace; stack_count++;
+ if (key < node->avl_key)
+ nodeplace = &node->avl_left;
+ else
+ nodeplace = &node->avl_right;
+ }
+ new_node->avl_left = AVL_EMPTY;
+ new_node->avl_right = AVL_EMPTY;
+ new_node->avl_height = 1;
+ *nodeplace = new_node;
+ cromfs_avl_rebalance(stack_ptr,stack_count);
+}
+
+static struct cromfs_avl_struct* cromfs_avl_find(avl_key_t key, struct cromfs_avl_struct* ptree)
+{
+ for (;;)
+ {
+ if (ptree == AVL_EMPTY)
+ return (struct cromfs_avl_struct *)0;
+ if (key == ptree->avl_key)
+ break;
+ if (key < ptree->avl_key)
+ ptree = ptree->avl_left;
+ else
+ ptree = ptree->avl_right;
+ }
+ return ptree;
+}
+
+/**********************************/
+
+static uint32_t cromfs_read_bytes(cromfs_info *ci, uint32_t pos, void *buf, uint32_t size)
+{
+ if (pos >= ci->partition_size || pos + size > ci->partition_size)
+ return 0;
+ return ci->read_bytes(ci, pos, buf, size);
+}
+
+static uint32_t cromfs_noblk_read_bytes(cromfs_info *ci, uint32_t pos, void *buf, uint32_t size)
+{
+ uint32_t ret;
+
+ ret = rt_device_read(ci->device, pos, buf, size);
+ if (ret != size)
+ return 0;
+ else
+ return ret;
+}
+
+static uint32_t cromfs_blk_read_bytes(cromfs_info *ci, uint32_t pos, void *buf, uint32_t size)
+{
+ uint32_t ret = 0;
+ uint32_t size_bak = size;
+ uint32_t start_blk;
+ uint32_t end_blk;
+ uint32_t off_s;
+ uint32_t sector_nr;
+ uint8_t *block_buff;
+ uint32_t ret_len;
+
+ if (!size || !buf)
+ return 0;
+ block_buff = (uint8_t *)malloc(2 * ci->bytes_per_sector);
+ if (!block_buff)
+ return 0;
+ start_blk = pos / ci->bytes_per_sector;
+ off_s = pos % ci->bytes_per_sector;
+ end_blk = (pos + size - 1) / ci->bytes_per_sector;
+
+ sector_nr = end_blk - start_blk;
+ if (sector_nr < 2)
+ {
+ ret_len = rt_device_read(ci->device, start_blk, block_buff, sector_nr + 1);
+ if (ret_len != sector_nr + 1)
+ goto end;
+ memcpy(buf, block_buff + off_s, size);
+ }
+ else
+ {
+ ret_len = rt_device_read(ci->device, start_blk, block_buff, 1);
+ if (ret_len != 1)
+ goto end;
+ memcpy(buf, block_buff + off_s, ci->bytes_per_sector - off_s);
+ off_s = (ci->bytes_per_sector - off_s);
+ size -= off_s;
+ sector_nr--;
+ start_blk++;
+ if (sector_nr)
+ {
+ ret_len = rt_device_read(ci->device, start_blk, buf + off_s, sector_nr);
+ if (ret_len != sector_nr)
+ goto end;
+ start_blk += sector_nr;
+ off_s += (sector_nr * ci->bytes_per_sector);
+ size -= (sector_nr * ci->bytes_per_sector);
+ }
+ ret_len = rt_device_read(ci->device, start_blk, block_buff, 1);
+ if (ret_len != 1)
+ goto end;
+ memcpy(buf + off_s, block_buff, size);
+ }
+ ret = size_bak;
+end:
+ free(block_buff);
+ return ret;
+}
+
+/**********************************/
+
+static uint8_t *cromfs_dirent_cache_get(cromfs_info *ci, uint32_t pos, uint32_t size)
+{
+ rt_list_t *l;
+ cromfs_dirent_cache *dir;
+ uint32_t len;
+
+ /* find */
+ for (l = ci->cromfs_dirent_cache_head.next; l != &ci->cromfs_dirent_cache_head; l = l->next)
+ {
+ dir = (cromfs_dirent_cache *)l;
+ if (dir->partition_pos == pos)
+ {
+ RT_ASSERT(dir->size == size);
+ rt_list_remove(l);
+ rt_list_insert_after(&ci->cromfs_dirent_cache_head, l);
+ return dir->buff;
+ }
+ }
+ /* not found */
+ if (ci->cromfs_dirent_cache_nr >= CROMFS_DIRENT_CACHE_SIZE)
+ {
+ l = ci->cromfs_dirent_cache_head.prev;
+ dir = (cromfs_dirent_cache *)l;
+ rt_list_remove(l);
+ free(dir->buff);
+ free(dir);
+ ci->cromfs_dirent_cache_nr--;
+ }
+ dir = (cromfs_dirent_cache *)malloc(sizeof *dir);
+ if (!dir)
+ return RT_NULL;
+ dir->buff = (uint8_t *)malloc(size);
+ if (!dir->buff)
+ {
+ free(dir);
+ return RT_NULL;
+ }
+ len = cromfs_read_bytes(ci, pos, dir->buff, size);
+ if (len != size)
+ {
+ free(dir->buff);
+ free(dir);
+ return RT_NULL;
+ }
+ rt_list_insert_after(&ci->cromfs_dirent_cache_head, (rt_list_t *)dir);
+ ci->cromfs_dirent_cache_nr++;
+ dir->partition_pos = pos;
+ dir->size = size;
+ return dir->buff;
+}
+
+static void cromfs_dirent_cache_destroy(cromfs_info *ci)
+{
+ rt_list_t *l;
+ cromfs_dirent_cache *dir;
+
+ while ((l = ci->cromfs_dirent_cache_head.next) != &ci->cromfs_dirent_cache_head)
+ {
+ rt_list_remove(l);
+ dir = (cromfs_dirent_cache *)l;
+ free(dir->buff);
+ free(dir);
+ ci->cromfs_dirent_cache_nr--;
+ }
+}
+
+/**********************************/
+
+static int dfs_cromfs_mount(struct dfs_filesystem *fs, unsigned long rwflag, const void *data)
+{
+ struct rt_device_blk_geometry geometry;
+ uint32_t len;
+ cromfs_info *ci = NULL;
+
+ ci = (cromfs_info *)malloc(sizeof *ci);
+ if (!ci)
+ return -ENOMEM;
+
+ memset(ci, 0, sizeof *ci);
+ ci->device = fs->dev_id;
+ ci->partition_size = UINT32_MAX;
+ if (ci->device->type == RT_Device_Class_Block)
+ {
+ rt_device_control(ci->device, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry);
+ ci->bytes_per_sector = geometry.bytes_per_sector;
+ ci->read_bytes = cromfs_blk_read_bytes;
+ }
+ else
+ {
+ ci->read_bytes = cromfs_noblk_read_bytes;
+ }
+
+ len = cromfs_read_bytes(ci, 0, &ci->part_info, sizeof ci->part_info);
+ if (len != sizeof ci->part_info ||
+ memcmp(ci->part_info.magic, CROMFS_MAGIC, sizeof ci->part_info.magic) != 0)
+ {
+ free(ci);
+ return -RT_ERROR;
+ }
+ ci->partition_size = ci->part_info.partition_size;
+ fs->data = ci;
+
+ rt_mutex_init(&ci->lock, "crom", RT_IPC_FLAG_FIFO);
+ ci->cromfs_avl_root = NULL;
+
+ rt_list_init(&ci->cromfs_dirent_cache_head);
+ ci->cromfs_dirent_cache_nr = 0;
+
+ return RT_EOK;
+}
+
+static int dfs_cromfs_unmount(struct dfs_filesystem *fs)
+{
+ rt_err_t result;
+ cromfs_info *ci;
+
+ ci = (cromfs_info *)fs->data;
+
+ result = rt_mutex_take(&ci->lock, RT_WAITING_FOREVER);
+ if (result != RT_EOK)
+ {
+ return -RT_ERROR;
+ }
+
+ cromfs_dirent_cache_destroy(ci);
+
+ while (ci->cromfs_avl_root)
+ {
+ struct cromfs_avl_struct *node;
+ file_info *fi;
+
+ node = ci->cromfs_avl_root;
+ fi = node->fi;
+ cromfs_avl_remove(node, &ci->cromfs_avl_root);
+ free(node);
+ if (fi->buff)
+ free(fi->buff);
+ free(fi);
+ }
+
+ rt_mutex_detach(&ci->lock);
+
+ free(ci);
+
+ return RT_EOK;
+}
+
+static int dfs_cromfs_ioctl(struct dfs_fd *file, int cmd, void *args)
+{
+ return -EIO;
+}
+
+static uint32_t cromfs_lookup(cromfs_info *ci, const char *path, int* is_dir, uint32_t *size, uint32_t *osize)
+{
+ uint32_t cur_size, cur_pos, cur_osize;
+ const char *subpath, *subpath_end;
+ void *di_mem;
+ int isdir;
+
+ if (path[0] == '\0')
+ return CROMFS_POS_ERROR;
+
+ cur_size = ci->part_info.root_dir_size;
+ cur_osize = 0;
+ cur_pos = ci->part_info.root_dir_pos;
+ isdir = 1;
+
+ subpath_end = path;
+ while (1)
+ {
+ cromfs_dirent_item *di_iter;
+ int found;
+
+ /* skip /// */
+ while (*subpath_end && *subpath_end == '/')
+ subpath_end ++;
+ subpath = subpath_end;
+ while ((*subpath_end != '/') && *subpath_end)
+ subpath_end ++;
+ if (*subpath == '\0')
+ break;
+
+ /* if not dir or empty dir, error */
+ if (!isdir || !cur_size)
+ return CROMFS_POS_ERROR;
+
+ /* find subpath */
+ di_mem = cromfs_dirent_cache_get(ci, cur_pos, cur_size);
+ if (!di_mem)
+ return CROMFS_POS_ERROR;
+
+ found = 0;
+ di_iter = (cromfs_dirent_item *)di_mem;
+ while (1)
+ {
+ uint32_t name_len = subpath_end - subpath;
+ uint32_t name_block;
+
+ if (di_iter->dirent.name_size == name_len)
+ {
+ if (memcmp(di_iter->dirent.name, subpath, name_len) == 0)
+ {
+ found = 1;
+ cur_size = di_iter->dirent.file_size;
+ cur_osize = di_iter->dirent.file_origin_size;
+ cur_pos = di_iter->dirent.parition_pos;
+ if (di_iter->dirent.attr == CROMFS_DIRENT_ATTR_DIR)
+ isdir = 1;
+ else
+ isdir = 0;
+ break;
+ }
+ }
+ name_block = (di_iter->dirent.name_size + CROMFS_ALIGN_SIZE_MASK) >> CROMFS_ALIGN_SIZE_BIT;
+ di_iter += (1 + name_block);
+ if ((uint32_t)di_iter - (uint32_t)di_mem >= cur_size)
+ break;
+ }
+ if (!found)
+ return CROMFS_POS_ERROR;
+ }
+ *size = cur_size;
+ *osize = cur_osize;
+ *is_dir = isdir;
+ return cur_pos;
+}
+
+static uint32_t dfs_cromfs_lookup(cromfs_info *ci, const char *path, int* is_dir, uint32_t *size, uint32_t *osize)
+{
+ rt_err_t result;
+ uint32_t ret;
+
+ result = rt_mutex_take(&ci->lock, RT_WAITING_FOREVER);
+ if (result != RT_EOK)
+ return CROMFS_POS_ERROR;
+ ret = cromfs_lookup(ci, path, is_dir, size, osize);
+ rt_mutex_release(&ci->lock);
+ return ret;
+}
+
+static int fill_file_data(file_info *fi)
+{
+ int ret = -1;
+ cromfs_info *ci;
+ void *compressed_file_buff = NULL;
+ uint32_t size, osize;
+
+ if (!fi->data_valid)
+ {
+ RT_ASSERT(fi->buff != RT_NULL);
+
+ ci = fi->ci;
+ osize = fi->size;
+ size = fi->partition_size;
+
+ compressed_file_buff = (void *)malloc(size);
+ if (!compressed_file_buff)
+ goto end;
+ if (cromfs_read_bytes(ci, fi->partition_pos, compressed_file_buff, size) != size)
+ goto end;
+ if (uncompress((uint8_t *)fi->buff, (uLongf *)&osize, (uint8_t *)compressed_file_buff, size) != Z_OK)
+ goto end;
+ fi->data_valid = 1;
+ }
+ ret = 0;
+end:
+ if (compressed_file_buff)
+ free(compressed_file_buff);
+ return ret;
+}
+
+static int dfs_cromfs_read(struct dfs_fd *file, void *buf, size_t count)
+{
+ rt_err_t result;
+ struct dfs_filesystem *fs;
+ file_info *fi;
+ cromfs_info *ci;
+ uint32_t length;
+
+ fs = (struct dfs_filesystem *)file->fs;
+ ci = (cromfs_info *)fs->data;
+ fi = (file_info *)file->data;
+
+ if (count < file->size - file->pos)
+ length = count;
+ else
+ length = file->size - file->pos;
+
+ if (length > 0)
+ {
+ RT_ASSERT(fi->size != 0);
+
+ if (fi->buff)
+ {
+ int fill_ret;
+
+ result = rt_mutex_take(&ci->lock, RT_WAITING_FOREVER);
+ if (result != RT_EOK)
+ return 0;
+ fill_ret = fill_file_data(fi);
+ rt_mutex_release(&ci->lock);
+ if (fill_ret < 0)
+ return 0;
+
+ memcpy(buf, fi->buff + file->pos, length);
+ }
+ else
+ {
+ void *di_mem;
+
+ result = rt_mutex_take(&ci->lock, RT_WAITING_FOREVER);
+ if (result != RT_EOK)
+ return 0;
+ di_mem = cromfs_dirent_cache_get(ci, fi->partition_pos, fi->size);
+ if (di_mem)
+ memcpy(buf, di_mem + file->pos, length);
+ rt_mutex_release(&ci->lock);
+ if (!di_mem)
+ return 0;
+ }
+ /* update file current position */
+ file->pos += length;
+ }
+
+ return length;
+}
+
+static int dfs_cromfs_lseek(struct dfs_fd *file, rt_off_t offset)
+{
+ if (offset <= file->size)
+ {
+ file->pos = offset;
+ return file->pos;
+ }
+
+ return -EIO;
+}
+
+static file_info *get_file_info(cromfs_info *ci, uint32_t partition_pos, int inc_ref)
+{
+ struct cromfs_avl_struct* node = cromfs_avl_find(partition_pos, ci->cromfs_avl_root);
+
+ if (node)
+ {
+ if (inc_ref)
+ node->fi->ref++;
+ return node->fi;
+ }
+ return NULL;
+}
+
+static file_info *inset_file_info(cromfs_info *ci, uint32_t partition_pos, int is_dir, uint32_t size, uint32_t osize)
+{
+ file_info *fi = NULL;
+ void *file_buff = NULL;
+ struct cromfs_avl_struct* node = NULL;
+
+ fi = (file_info *)malloc(sizeof *fi);
+ if (!fi)
+ goto err;
+ fi->partition_pos = partition_pos;
+ fi->ci = ci;
+ if (is_dir)
+ {
+ fi->size = size;
+ }
+ else
+ {
+ fi->size = osize;
+ fi->partition_size = size;
+ fi->data_valid = 0;
+ if (osize)
+ {
+ file_buff = (void *)malloc(osize);
+ if (!file_buff)
+ goto err;
+ }
+ }
+ fi->buff = file_buff;
+ fi->ref = 1;
+
+ node = (struct cromfs_avl_struct *)malloc(sizeof *node);
+ if (!node)
+ goto err;
+ node->avl_key = partition_pos;
+ node->fi = fi;
+ cromfs_avl_insert(node, &ci->cromfs_avl_root);
+ return fi;
+err:
+ if (file_buff)
+ free(file_buff);
+ if (fi)
+ free(fi);
+ return NULL;
+}
+
+static void deref_file_info(cromfs_info *ci, uint32_t partition_pos)
+{
+ struct cromfs_avl_struct* node = cromfs_avl_find(partition_pos, ci->cromfs_avl_root);
+ file_info *fi;
+
+ if (node)
+ {
+ node->fi->ref--;
+ if (node->fi->ref == 0)
+ {
+ fi = node->fi;
+ cromfs_avl_remove(node, &ci->cromfs_avl_root);
+ free(node);
+ if (fi->buff)
+ free(fi->buff);
+ free(fi);
+ }
+ }
+}
+
+static int dfs_cromfs_close(struct dfs_fd *file)
+{
+ file_info *fi;
+ struct dfs_filesystem *fs;
+ cromfs_info *ci;
+ rt_err_t result;
+
+ fi = (file_info *)file->data;
+ fs = (struct dfs_filesystem *)file->fs;
+ ci = (cromfs_info *)fs->data;
+
+ result = rt_mutex_take(&ci->lock, RT_WAITING_FOREVER);
+ if (result != RT_EOK)
+ return -RT_ERROR;
+ deref_file_info(ci, fi->partition_pos);
+ rt_mutex_release(&ci->lock);
+ file->data = NULL;
+ return RT_EOK;
+}
+
+static int dfs_cromfs_open(struct dfs_fd *file)
+{
+ int ret;
+ struct dfs_filesystem *fs;
+ file_info *fi;
+ cromfs_info *ci;
+ uint32_t file_pos;
+ uint32_t size, osize;
+ int is_dir;
+ rt_err_t result;
+
+ if (file->flags & (O_CREAT | O_WRONLY | O_APPEND | O_TRUNC | O_RDWR))
+ return -EINVAL;
+
+ fs = (struct dfs_filesystem *)file->fs;
+ ci = (cromfs_info *)fs->data;
+
+ file_pos = dfs_cromfs_lookup(ci, file->path, &is_dir, &size, &osize);
+ if (file_pos == CROMFS_POS_ERROR)
+ {
+ ret = -ENOENT;
+ goto end;
+ }
+
+ /* entry is a directory file type */
+ if (is_dir)
+ {
+ if (!(file->flags & O_DIRECTORY))
+ {
+ ret = -ENOENT;
+ goto end;
+ }
+ }
+ else
+ {
+ /* entry is a file, but open it as a directory */
+ if (file->flags & O_DIRECTORY)
+ {
+ ret = -ENOENT;
+ goto end;
+ }
+ }
+
+ result = rt_mutex_take(&ci->lock, RT_WAITING_FOREVER);
+ if (result != RT_EOK)
+ {
+ ret = -EINTR;
+ goto end;
+ }
+
+ fi = get_file_info(ci, file_pos, 1);
+ if (!fi)
+ {
+ fi = inset_file_info(ci, file_pos, is_dir, size, osize);
+ }
+ rt_mutex_release(&ci->lock);
+ if (!fi)
+ {
+ ret = -ENOENT;
+ goto end;
+ }
+
+ file->data = fi;
+ if (is_dir)
+ file->size = size;
+ else
+ file->size = osize;
+ file->pos = 0;
+
+ ret = RT_EOK;
+end:
+ return ret;
+}
+
+static int dfs_cromfs_stat(struct dfs_filesystem *fs, const char *path, struct stat *st)
+{
+ uint32_t size, osize;
+ int is_dir;
+ cromfs_info *ci;
+ uint32_t file_pos;
+
+ ci = (cromfs_info *)fs->data;
+
+ file_pos = dfs_cromfs_lookup(ci, path, &is_dir, &size, &osize);
+ if (file_pos == CROMFS_POS_ERROR)
+ return -ENOENT;
+
+ st->st_dev = 0;
+ st->st_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH |
+ S_IWUSR | S_IWGRP | S_IWOTH;
+
+ if (is_dir)
+ {
+ st->st_mode &= ~S_IFREG;
+ st->st_mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH;
+ st->st_size = size;
+ }
+ else
+ {
+ st->st_size = osize;
+ }
+
+ st->st_mtime = 0;
+
+ return RT_EOK;
+}
+
+static int dfs_cromfs_getdents(struct dfs_fd *file, struct dirent *dirp, uint32_t count)
+{
+ uint32_t index;
+ uint8_t *name;
+ struct dirent *d;
+ file_info *fi;
+ cromfs_info *ci;
+ cromfs_dirent_item *dirent, *sub_dirent;
+ void *di_mem;
+ rt_err_t result;
+
+ fi = (file_info *)file->data;
+ ci = fi->ci;
+
+ RT_ASSERT(fi->buff == NULL);
+
+ if (!fi->size)
+ return -EINVAL;
+
+ dirent = (cromfs_dirent_item *)malloc(fi->size);
+ if (!dirent)
+ return -ENOMEM;
+
+ result = rt_mutex_take(&ci->lock, RT_WAITING_FOREVER);
+ if (result != RT_EOK)
+ return -EINTR;
+ di_mem = cromfs_dirent_cache_get(ci, fi->partition_pos, fi->size);
+ if (di_mem)
+ memcpy(dirent, di_mem, fi->size);
+ rt_mutex_release(&ci->lock);
+ if (!di_mem)
+ {
+ free(dirent);
+ return -ENOMEM;
+ }
+
+ /* make integer count */
+ count = (count / sizeof(struct dirent));
+ if (count == 0)
+ {
+ free(dirent);
+ return -EINVAL;
+ }
+
+ for (index = 0; index < count && file->pos < file->size; index ++)
+ {
+ uint32_t name_size;
+
+ d = dirp + index;
+ sub_dirent = &dirent[file->pos >> CROMFS_ALIGN_SIZE_BIT];
+ name = sub_dirent->dirent.name;
+
+ /* fill dirent */
+ if (sub_dirent->dirent.attr == CROMFS_DIRENT_ATTR_DIR)
+ d->d_type = DT_DIR;
+ else
+ d->d_type = DT_REG;
+
+ d->d_namlen = sub_dirent->dirent.name_size;
+ d->d_reclen = (rt_uint16_t)sizeof(struct dirent);
+ memcpy(d->d_name, (char *)name, sub_dirent->dirent.name_size);
+ d->d_name[sub_dirent->dirent.name_size] = '\0';
+
+ name_size = (sub_dirent->dirent.name_size + CROMFS_ALIGN_SIZE_MASK) & ~CROMFS_ALIGN_SIZE_MASK;
+ /* move to next position */
+ file->pos += (name_size + sizeof *sub_dirent);
+ }
+
+ free(dirent);
+
+ return index * sizeof(struct dirent);
+}
+
+static const struct dfs_file_ops _crom_fops =
+{
+ dfs_cromfs_open,
+ dfs_cromfs_close,
+ dfs_cromfs_ioctl,
+ dfs_cromfs_read,
+ NULL,
+ NULL,
+ dfs_cromfs_lseek,
+ dfs_cromfs_getdents,
+};
+
+static const struct dfs_filesystem_ops _cromfs =
+{
+ "crom",
+ DFS_FS_FLAG_DEFAULT,
+ &_crom_fops,
+
+ dfs_cromfs_mount,
+ dfs_cromfs_unmount,
+ NULL,
+ NULL,
+
+ NULL,
+ dfs_cromfs_stat,
+ NULL,
+};
+
+int dfs_cromfs_init(void)
+{
+ /* register crom file system */
+ dfs_register(&_cromfs);
+ return 0;
+}
+INIT_COMPONENT_EXPORT(dfs_cromfs_init);
diff --git a/components/dfs/filesystems/cromfs/dfs_cromfs.h b/components/dfs/filesystems/cromfs/dfs_cromfs.h
new file mode 100644
index 0000000000000000000000000000000000000000..97339bc510c014c4d26fd98a6d331305fda7ffc7
--- /dev/null
+++ b/components/dfs/filesystems/cromfs/dfs_cromfs.h
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020/08/21 ShaoJinchun firset version
+ */
+
+#ifndef __DFS_CROMFS_H__
+#define __DFS_CROMFS_H__
+
+int dfs_cromfs_init(void);
+
+#endif /*__DFS_CROMFS_H__*/
diff --git a/components/dfs/filesystems/devfs/devfs.c b/components/dfs/filesystems/devfs/devfs.c
index 7637074dbba40e8ac94c74b30414b0cc49273b66..d096f89847be446491e207551c58c5292a4f4e6c 100644
--- a/components/dfs/filesystems/devfs/devfs.c
+++ b/components/dfs/filesystems/devfs/devfs.c
@@ -7,7 +7,7 @@
* Date Author Notes
* 2018-02-11 Bernard Ignore O_CREAT flag in open.
*/
-
+#include
#include
#include
@@ -123,6 +123,7 @@ int dfs_device_fs_open(struct dfs_fd *file)
{
rt_err_t result;
rt_device_t device;
+ rt_base_t level;
/* open root directory */
if ((file->path[0] == '/') && (file->path[1] == '\0') &&
@@ -134,8 +135,8 @@ int dfs_device_fs_open(struct dfs_fd *file)
struct device_dirent *root_dirent;
rt_uint32_t count = 0;
- /* lock scheduler */
- rt_enter_critical();
+ /* disable interrupt */
+ level = rt_hw_interrupt_disable();
/* traverse device object */
information = rt_object_get_information(RT_Object_Class_Device);
@@ -161,7 +162,7 @@ int dfs_device_fs_open(struct dfs_fd *file)
count ++;
}
}
- rt_exit_critical();
+ rt_hw_interrupt_enable(level);
/* set data */
file->data = root_dirent;
diff --git a/components/dfs/filesystems/elmfat/dfs_elm.c b/components/dfs/filesystems/elmfat/dfs_elm.c
index b4c4c627aa3db27455dbb8b2e5f56e520b566da8..182adfd3d6f19b0ddb4fc30017e62697a8397679 100644
--- a/components/dfs/filesystems/elmfat/dfs_elm.c
+++ b/components/dfs/filesystems/elmfat/dfs_elm.c
@@ -191,7 +191,7 @@ int dfs_elm_unmount(struct dfs_filesystem *fs)
return RT_EOK;
}
-int dfs_elm_mkfs(rt_device_t dev_id)
+int dfs_elm_mkfs(rt_device_t dev_id, const char *fs_name)
{
#define FSM_STATUS_INIT 0
#define FSM_STATUS_USE_TEMP_DRIVER 1
@@ -567,7 +567,7 @@ int dfs_elm_flush(struct dfs_fd *file)
return elm_result_to_dfs(result);
}
-int dfs_elm_lseek(struct dfs_fd *file, rt_off_t offset)
+int dfs_elm_lseek(struct dfs_fd *file, off_t offset)
{
FRESULT result = FR_OK;
if (file->type == FT_REGULAR)
diff --git a/components/dfs/filesystems/jffs2/dfs_jffs2.c b/components/dfs/filesystems/jffs2/dfs_jffs2.c
index c082c21d7351ebd61455ffc6fc369f643dfb82cb..82017dd41c1fdd5f658e188ffc2338ceed1e81db 100644
--- a/components/dfs/filesystems/jffs2/dfs_jffs2.c
+++ b/components/dfs/filesystems/jffs2/dfs_jffs2.c
@@ -176,7 +176,7 @@ static int dfs_jffs2_unmount(struct dfs_filesystem* fs)
return -ENOENT;
}
-static int dfs_jffs2_mkfs(rt_device_t dev_id)
+static int dfs_jffs2_mkfs(rt_device_t dev_id, const char *fs_name)
{
/* just erase all blocks on this nand partition */
return -ENOSYS;
diff --git a/components/dfs/filesystems/nfs/rpc/types.h b/components/dfs/filesystems/nfs/rpc/types.h
index 254fcd339c266b8996b628fa3956db7204a5441f..5c02c07e34002843893d75ef6a5af9e017d37564 100644
--- a/components/dfs/filesystems/nfs/rpc/types.h
+++ b/components/dfs/filesystems/nfs/rpc/types.h
@@ -63,11 +63,11 @@ typedef unsigned long long uint64_t;
typedef int bool_t;
typedef int enum_t;
-#ifndef RT_USING_NEWLIB
+#if !defined(RT_USING_NEWLIB) && !defined(RT_USING_MUSL)
typedef unsigned long dev_t;
#endif
-#if !defined(RT_USING_NEWLIB) && !defined(RT_USING_MINILIBC)
+#if !defined(RT_USING_NEWLIB) && !defined(RT_USING_MINILIBC) && !defined(RT_USING_MUSL)
typedef rt_int32_t ssize_t;
#endif
diff --git a/components/dfs/filesystems/uffs/dfs_uffs.c b/components/dfs/filesystems/uffs/dfs_uffs.c
index fb8caf9dd768deb77fa6c05333aca344ec4ad8bc..bc0e79a9a9554acfa2905b96f2bb38dfe3b0987a 100644
--- a/components/dfs/filesystems/uffs/dfs_uffs.c
+++ b/components/dfs/filesystems/uffs/dfs_uffs.c
@@ -206,7 +206,7 @@ static int dfs_uffs_unmount(struct dfs_filesystem *fs)
return -ENOENT;
}
-static int dfs_uffs_mkfs(rt_device_t dev_id)
+static int dfs_uffs_mkfs(rt_device_t dev_id, const char *fs_name)
{
rt_base_t index;
rt_uint32_t block;
diff --git a/components/dfs/include/dfs.h b/components/dfs/include/dfs.h
index 1158df93cbb6253db2845a60620df142a995de53..8f63eec415a3dca88dd398d70be9f501237090d8 100644
--- a/components/dfs/include/dfs.h
+++ b/components/dfs/include/dfs.h
@@ -97,13 +97,20 @@ const char *dfs_subdir(const char *directory, const char *filename);
void dfs_lock(void);
void dfs_unlock(void);
+void dfs_fd_lock(void);
+void dfs_fd_unlock(void);
+
/* FD APIs */
+int fdt_fd_new(struct dfs_fdtable *fdt);
+struct dfs_fd *fdt_fd_get(struct dfs_fdtable* fdt, int fd);
+void fdt_fd_put(struct dfs_fdtable* fdt, struct dfs_fd *fd);
int fd_new(void);
struct dfs_fd *fd_get(int fd);
void fd_put(struct dfs_fd *fd);
int fd_is_open(const char *pathname);
struct dfs_fdtable *dfs_fdtable_get(void);
+struct dfs_fdtable *dfs_fdtable_get_global(void);
#ifdef __cplusplus
}
diff --git a/components/dfs/include/dfs_file.h b/components/dfs/include/dfs_file.h
index 2dfacd653e6791736503ebda72a9c49c58538977..f90fd805e2d452902a6525e8dc3fdecd6816ea92 100644
--- a/components/dfs/include/dfs_file.h
+++ b/components/dfs/include/dfs_file.h
@@ -69,7 +69,8 @@ int dfs_file_rename(const char *oldpath, const char *newpath);
int dfs_file_ftruncate(struct dfs_fd *fd, off_t length);
/* 0x5254 is just a magic number to make these relatively unique ("RT") */
-#define RT_FIOFTRUNCATE 0x52540000U
+#define RT_FIOFTRUNCATE 0x52540000U
+#define RT_FIOGETXIPADDR 0x52540001U
#ifdef __cplusplus
}
diff --git a/components/dfs/include/dfs_fs.h b/components/dfs/include/dfs_fs.h
index a35a513044a2d09ac0295d67a5d9ac480662ff76..8749a793ab1c1ac0eece8115561e7ebba5b72e9a 100644
--- a/components/dfs/include/dfs_fs.h
+++ b/components/dfs/include/dfs_fs.h
@@ -35,7 +35,7 @@ struct dfs_filesystem_ops
int (*unmount) (struct dfs_filesystem *fs);
/* make a file system */
- int (*mkfs) (rt_device_t devid);
+ int (*mkfs) (rt_device_t dev_id, const char *fs_name);
int (*statfs) (struct dfs_filesystem *fs, struct statfs *buf);
int (*unlink) (struct dfs_filesystem *fs, const char *pathname);
diff --git a/components/dfs/src/dfs.c b/components/dfs/src/dfs.c
index 7ace0bc1600ac3b02f1cf59600060ceb2b4ccca3..506d97d2d7ddf51d94986b48e72a349b919b9a90 100644
--- a/components/dfs/src/dfs.c
+++ b/components/dfs/src/dfs.c
@@ -28,6 +28,7 @@ struct dfs_filesystem filesystem_table[DFS_FILESYSTEMS_MAX];
/* device filesystem lock */
static struct rt_mutex fslock;
+static struct rt_mutex fdlock;
#ifdef DFS_USING_WORKDIR
char working_directory[DFS_PATH_MAX] = {"/"};
@@ -64,6 +65,7 @@ int dfs_init(void)
/* create device filesystem lock */
rt_mutex_init(&fslock, "fslock", RT_IPC_FLAG_FIFO);
+ rt_mutex_init(&fdlock, "fdlock", RT_IPC_FLAG_FIFO);
#ifdef DFS_USING_WORKDIR
/* set current working directory */
@@ -108,6 +110,21 @@ void dfs_lock(void)
}
}
+void dfs_fd_lock(void)
+{
+ rt_err_t result = -RT_EBUSY;
+
+ while (result == -RT_EBUSY)
+ {
+ result = rt_mutex_take(&fdlock, RT_WAITING_FOREVER);
+ }
+
+ if (result != RT_EOK)
+ {
+ RT_ASSERT(0);
+ }
+}
+
/**
* this function will lock device file system.
*
@@ -118,6 +135,11 @@ void dfs_unlock(void)
rt_mutex_release(&fslock);
}
+void dfs_fd_unlock(void)
+{
+ rt_mutex_release(&fdlock);
+}
+
static int fd_alloc(struct dfs_fdtable *fdt, int startfd)
{
int idx;
@@ -172,15 +194,13 @@ __exit:
*
* @return -1 on failed or the allocated file descriptor.
*/
-int fd_new(void)
+int fdt_fd_new(struct dfs_fdtable *fdt)
{
struct dfs_fd *d;
int idx;
- struct dfs_fdtable *fdt;
- fdt = dfs_fdtable_get();
/* lock filesystem */
- dfs_lock();
+ dfs_fd_lock();
/* find an empty fd entry */
idx = fd_alloc(fdt, 0);
@@ -198,10 +218,18 @@ int fd_new(void)
d->magic = DFS_FD_MAGIC;
__result:
- dfs_unlock();
+ dfs_fd_unlock();
return idx + DFS_FD_OFFSET;
}
+int fd_new(void)
+{
+ struct dfs_fdtable *fdt;
+
+ fdt = dfs_fdtable_get();
+ return fdt_fd_new(fdt);
+}
+
/**
* @ingroup Fd
*
@@ -211,48 +239,54 @@ __result:
* @return NULL on on this file descriptor or the file descriptor structure
* pointer.
*/
-struct dfs_fd *fd_get(int fd)
+struct dfs_fd *fdt_fd_get(struct dfs_fdtable* fdt, int fd)
{
struct dfs_fd *d;
- struct dfs_fdtable *fdt;
#if defined(RT_USING_DFS_DEVFS) && defined(RT_USING_POSIX)
if ((0 <= fd) && (fd <= 2))
fd = libc_stdio_get_console();
#endif
- fdt = dfs_fdtable_get();
fd = fd - DFS_FD_OFFSET;
if (fd < 0 || fd >= (int)fdt->maxfd)
return NULL;
- dfs_lock();
+ dfs_fd_lock();
d = fdt->fds[fd];
/* check dfs_fd valid or not */
if ((d == NULL) || (d->magic != DFS_FD_MAGIC))
{
- dfs_unlock();
+ dfs_fd_unlock();
return NULL;
}
/* increase the reference count */
d->ref_count ++;
- dfs_unlock();
+ dfs_fd_unlock();
return d;
}
+struct dfs_fd *fd_get(int fd)
+{
+ struct dfs_fdtable *fdt;
+
+ fdt = dfs_fdtable_get();
+ return fdt_fd_get(fdt, fd);
+}
+
/**
* @ingroup Fd
*
* This function will put the file descriptor.
*/
-void fd_put(struct dfs_fd *fd)
+void fdt_fd_put(struct dfs_fdtable* fdt, struct dfs_fd *fd)
{
RT_ASSERT(fd != NULL);
- dfs_lock();
+ dfs_fd_lock();
fd->ref_count --;
@@ -260,9 +294,7 @@ void fd_put(struct dfs_fd *fd)
if (fd->ref_count == 0)
{
int index;
- struct dfs_fdtable *fdt;
- fdt = dfs_fdtable_get();
for (index = 0; index < (int)fdt->maxfd; index ++)
{
if (fdt->fds[index] == fd)
@@ -273,7 +305,15 @@ void fd_put(struct dfs_fd *fd)
}
}
}
- dfs_unlock();
+ dfs_fd_unlock();
+}
+
+void fd_put(struct dfs_fd *fd)
+{
+ struct dfs_fdtable *fdt;
+
+ fdt = dfs_fdtable_get();
+ fdt_fd_put(fdt, fd);
}
/**
@@ -313,7 +353,7 @@ int fd_is_open(const char *pathname)
else
mountpath = fullpath + strlen(fs->path);
- dfs_lock();
+ dfs_fd_lock();
for (index = 0; index < fdt->maxfd; index++)
{
@@ -324,12 +364,12 @@ int fd_is_open(const char *pathname)
{
/* found file in file descriptor table */
rt_free(fullpath);
- dfs_unlock();
+ dfs_fd_unlock();
return 0;
}
}
- dfs_unlock();
+ dfs_fd_unlock();
rt_free(fullpath);
}
@@ -517,6 +557,11 @@ struct dfs_fdtable *dfs_fdtable_get(void)
return fdt;
}
+struct dfs_fdtable *dfs_fdtable_get_global(void)
+{
+ return &_fdtab;
+}
+
#ifdef RT_USING_FINSH
#include
int list_fd(void)
@@ -561,6 +606,82 @@ int list_fd(void)
return 0;
}
MSH_CMD_EXPORT(list_fd, list file descriptor);
+
+/*
+ * If no argument is specified, display the mount history;
+ * If there are 3 arguments, mount the filesystem.
+ * The order of the arguments is:
+ * argv[1]: device name
+ * argv[2]: mountpoint path
+ * argv[3]: filesystem type
+ */
+int mount(int argc, char *argv[])
+{
+ if (argc == 1) /* display the mount history */
+ {
+ struct dfs_filesystem *iter;
+
+ rt_kprintf("filesystem device mountpoint\n");
+ rt_kprintf("---------- ------ ----------\n");
+ for (iter = &filesystem_table[0];
+ iter < &filesystem_table[DFS_FILESYSTEMS_MAX]; iter++)
+ {
+ if ((iter != NULL) && (iter->path != NULL))
+ {
+ rt_kprintf("%-10s %-6s %-s\n",
+ iter->ops->name, iter->dev_id->parent.name, iter->path);
+ }
+ }
+ return 0;
+ }
+ else if (argc == 4)
+ { /* mount a filesystem to the specified directory */
+ char *device = argv[1];
+ char *path = argv[2];
+ char *fstype = argv[3];
+
+ rt_kprintf("mount device %s(%s) onto %s ... ", device, fstype, path);
+ if (dfs_mount(device, path, fstype, 0, 0) == 0)
+ {
+ rt_kprintf("succeed!\n");
+ return 0;
+ }
+ else
+ {
+ rt_kprintf("failed!\n");
+ return -1;
+ }
+ }
+ else
+ {
+ rt_kprintf("Usage: mount .\n");
+ return -1;
+ }
+}
+MSH_CMD_EXPORT(mount, mount);
+
+/* unmount the filesystem from the specified mountpoint */
+int unmount(int argc, char *argv[])
+{
+ if (argc != 2)
+ {
+ rt_kprintf("Usage: unmount .\n");
+ return -1;
+ }
+
+ char *path = argv[1];
+
+ rt_kprintf("unmount %s ... ", path);
+ if (dfs_unmount(path) < 0)
+ {
+ rt_kprintf("failed!\n");
+ return -1;
+ } else {
+ rt_kprintf("succeed!\n");
+ return 0;
+ }
+}
+MSH_CMD_EXPORT(unmount, unmount the mountpoint);
+
#endif
/*@}*/
-
diff --git a/components/dfs/src/dfs_file.c b/components/dfs/src/dfs_file.c
index fd205f2f3a10914d05a138e7fc83d3e0a46df70d..2de0ae488354decdfafcfb699c98750736535856 100644
--- a/components/dfs/src/dfs_file.c
+++ b/components/dfs/src/dfs_file.c
@@ -607,10 +607,10 @@ void cat(const char *filename)
do
{
- memset(buffer, 0, sizeof(buffer));
length = dfs_file_read(&fd, buffer, sizeof(buffer) - 1);
if (length > 0)
{
+ buffer[length] = '\0';
rt_kprintf("%s", buffer);
}
}
diff --git a/components/dfs/src/dfs_fs.c b/components/dfs/src/dfs_fs.c
index c21b914727cda5eb811069225bad2e13d2d0210a..da13c76e3cbec406aaf6a394622dd0a5aa58ca04 100644
--- a/components/dfs/src/dfs_fs.c
+++ b/components/dfs/src/dfs_fs.c
@@ -241,7 +241,7 @@ int dfs_mount(const char *device_name,
for (ops = &filesystem_operation_table[0];
ops < &filesystem_operation_table[DFS_FILESYSTEM_TYPES_MAX]; ops++)
- if ((*ops != NULL) && (strcmp((*ops)->name, filesystemtype) == 0))
+ if ((*ops != NULL) && (strncmp((*ops)->name, filesystemtype, strlen((*ops)->name)) == 0))
break;
dfs_unlock();
@@ -312,6 +312,9 @@ int dfs_mount(const char *device_name,
fs->path = fullpath;
fs->ops = *ops;
fs->dev_id = dev_id;
+ /* For UFS, record the real filesystem name */
+ fs->data = (void *) filesystemtype;
+
/* release filesystem_table lock */
dfs_unlock();
@@ -447,7 +450,8 @@ int dfs_mkfs(const char *fs_name, const char *device_name)
for (index = 0; index < DFS_FILESYSTEM_TYPES_MAX; index ++)
{
if (filesystem_operation_table[index] != NULL &&
- strcmp(filesystem_operation_table[index]->name, fs_name) == 0)
+ strncmp(filesystem_operation_table[index]->name, fs_name,
+ strlen(filesystem_operation_table[index]->name)) == 0)
break;
}
dfs_unlock();
@@ -463,7 +467,7 @@ int dfs_mkfs(const char *fs_name, const char *device_name)
return -1;
}
- return ops->mkfs(dev_id);
+ return ops->mkfs(dev_id, fs_name);
}
LOG_E("File system (%s) was not found.", fs_name);
@@ -490,6 +494,7 @@ int dfs_statfs(const char *path, struct statfs *buffer)
return fs->ops->statfs(fs, buffer);
}
+ rt_set_errno(-ENOSYS);
return -1;
}
@@ -625,7 +630,10 @@ int df(const char *path)
result = dfs_statfs(path ? path : NULL, &buffer);
if (result != 0)
{
- rt_kprintf("dfs_statfs failed.\n");
+ if (rt_get_errno() == -ENOSYS)
+ rt_kprintf("The function is not implemented.\n");
+ else
+ rt_kprintf("statfs failed: errno=%d.\n", rt_get_errno());
return -1;
}
diff --git a/components/dfs/src/poll.c b/components/dfs/src/poll.c
index fc48eca758d9e1c1d34c58d13683582db202398c..2d948a30a3d12130ae4756f9c2a218e4bd237380 100644
--- a/components/dfs/src/poll.c
+++ b/components/dfs/src/poll.c
@@ -95,20 +95,22 @@ static int poll_wait_timeout(struct rt_poll_table *pt, int msec)
if (timeout != 0 && !pt->triggered)
{
- rt_thread_suspend(thread);
- if (timeout > 0)
+ if (rt_thread_suspend_with_flag(thread, RT_INTERRUPTIBLE) == RT_EOK)
{
- rt_timer_control(&(thread->thread_timer),
- RT_TIMER_CTRL_SET_TIME,
- &timeout);
- rt_timer_start(&(thread->thread_timer));
- }
+ if (timeout > 0)
+ {
+ rt_timer_control(&(thread->thread_timer),
+ RT_TIMER_CTRL_SET_TIME,
+ &timeout);
+ rt_timer_start(&(thread->thread_timer));
+ }
- rt_hw_interrupt_enable(level);
+ rt_hw_interrupt_enable(level);
- rt_schedule();
+ rt_schedule();
- level = rt_hw_interrupt_disable();
+ level = rt_hw_interrupt_disable();
+ }
}
ret = !pt->triggered;
@@ -140,7 +142,7 @@ static int do_pollfd(struct pollfd *pollfd, rt_pollreq_t *req)
/* dealwith the device return error -1*/
if (mask < 0)
- {
+ {
fd_put(f);
pollfd->revents = 0;
return mask;
diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig
index db4455160e3633292ffa405f07fe4fb0c58f620d..bfbe5d42f6fab92d54726d5846c6e3aed61a90a3 100755
--- a/components/drivers/Kconfig
+++ b/components/drivers/Kconfig
@@ -8,7 +8,7 @@ if RT_USING_DEVICE_IPC
config RT_PIPE_BUFSZ
int "Set pipe buffer size"
default 512
-
+
config RT_USING_SYSTEM_WORKQUEUE
bool "Using system default workqueue"
default n
@@ -118,7 +118,15 @@ config RT_USING_ADC
config RT_USING_DAC
bool "Using DAC device drivers"
default n
-
+
+config RT_USING_NULL
+ bool "Using NULL device drivers"
+ default n
+
+config RT_USING_RANDOM
+ bool "Using RANDOM device drivers"
+ default n
+
config RT_USING_PWM
bool "Using PWM device drivers"
default n
@@ -202,7 +210,7 @@ config RT_USING_SPI
bool "Using SPI Bus/Device device drivers"
default n
- if RT_USING_SPI
+ if RT_USING_SPI
config RT_USING_QSPI
bool "Enable QSPI mode"
default n
@@ -226,7 +234,7 @@ config RT_USING_SPI
config RT_SFUD_USING_FLASH_INFO_TABLE
bool "Using defined supported flash chip information table"
default y
-
+
config RT_SFUD_USING_QSPI
bool "Using QSPI mode support"
select RT_USING_QSPI
@@ -262,7 +270,7 @@ config RT_USING_WDT
config RT_USING_AUDIO
bool "Using Audio device drivers"
default n
-
+
if RT_USING_AUDIO
config RT_AUDIO_REPLAY_MP_BLOCK_SIZE
int "Replay memory pool block size"
diff --git a/components/drivers/audio/audio_pipe.c b/components/drivers/audio/audio_pipe.c
index d7c37009b6c3005aba1738ddf0f3b4a93d34f100..4fd8b0edfe776af2f3f2e0edc72018f679a6cc35 100644
--- a/components/drivers/audio/audio_pipe.c
+++ b/components/drivers/audio/audio_pipe.c
@@ -72,7 +72,7 @@ static rt_size_t rt_pipe_read(rt_device_t dev,
read_nbytes = rt_ringbuffer_get(&(pipe->ringbuffer), (rt_uint8_t *)buffer, size);
if (read_nbytes == 0)
{
- rt_thread_suspend(thread);
+ rt_thread_suspend_with_flag(thread, RT_UNINTERRUPTIBLE);
/* waiting on suspended read list */
rt_list_insert_before(&(pipe->suspended_read_list),
&(thread->tlist));
@@ -160,7 +160,7 @@ static rt_size_t rt_pipe_write(rt_device_t dev,
if (write_nbytes == 0)
{
/* pipe full, waiting on suspended write list */
- rt_thread_suspend(thread);
+ rt_thread_suspend_with_flag(thread, RT_UNINTERRUPTIBLE);
/* waiting on suspended read list */
rt_list_insert_before(&(pipe->suspended_write_list),
&(thread->tlist));
diff --git a/components/drivers/include/drivers/serial.h b/components/drivers/include/drivers/serial.h
index 45095af63f36f5749154fa1055731975804db884..901a8666e416a3d96368815206d891673c112e1e 100644
--- a/components/drivers/include/drivers/serial.h
+++ b/components/drivers/include/drivers/serial.h
@@ -144,6 +144,8 @@ struct rt_serial_device
void *serial_rx;
void *serial_tx;
+
+ struct rt_device_notify rx_notify;
};
typedef struct rt_serial_device rt_serial_t;
diff --git a/components/drivers/include/ipc/waitqueue.h b/components/drivers/include/ipc/waitqueue.h
index e26ec1e896078620c4f1cf192b1650d035201ba2..a64b973a9e4f7572c578258763d5526a94515ebb 100644
--- a/components/drivers/include/ipc/waitqueue.h
+++ b/components/drivers/include/ipc/waitqueue.h
@@ -43,6 +43,8 @@ rt_inline void rt_wqueue_init(rt_wqueue_t *queue)
void rt_wqueue_add(rt_wqueue_t *queue, struct rt_wqueue_node *node);
void rt_wqueue_remove(struct rt_wqueue_node *node);
int rt_wqueue_wait(rt_wqueue_t *queue, int condition, int timeout);
+int rt_wqueue_wait_killable(rt_wqueue_t *queue, int condition, int timeout);
+int rt_wqueue_wait_interruptible(rt_wqueue_t *queue, int condition, int timeout);
void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key);
#define DEFINE_WAIT_FUNC(name, function) \
diff --git a/components/drivers/misc/SConscript b/components/drivers/misc/SConscript
index 72058eeeca4c26200c3e42e43166fba838162397..76bfaf8946624e6853e07aa21bc493f1eaa43598 100644
--- a/components/drivers/misc/SConscript
+++ b/components/drivers/misc/SConscript
@@ -1,28 +1,34 @@
from building import *
cwd = GetCurrentDir()
-src = []
+src = []
CPPPATH = [cwd + '/../include']
group = []
if GetDepend(['RT_USING_PIN']):
src = src + ['pin.c']
-
+
if GetDepend(['RT_USING_ADC']):
src = src + ['adc.c']
-
+
if GetDepend(['RT_USING_DAC']):
src = src + ['dac.c']
if GetDepend(['RT_USING_PWM']):
src = src + ['rt_drv_pwm.c']
-
+
if GetDepend(['RT_USING_PULSE_ENCODER']):
src = src + ['pulse_encoder.c']
if GetDepend(['RT_USING_INPUT_CAPTURE']):
src = src + ['rt_inputcapture.c']
+if GetDepend(['RT_USING_NULL']):
+ src = src + ['rt_null.c']
+
+if GetDepend(['RT_USING_RANDOM']):
+ src = src + ['rt_random.c']
+
if len(src):
group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH)
diff --git a/components/drivers/misc/rt_null.c b/components/drivers/misc/rt_null.c
new file mode 100644
index 0000000000000000000000000000000000000000..b895c47da4e579a3cd7da7e91bc5c75224e36c3d
--- /dev/null
+++ b/components/drivers/misc/rt_null.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2011-2020, Shanghai Real-Thread Electronic Technology Co.,Ltd
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-12-03 quanzhao the first version
+ */
+
+#include
+#include
+#include
+
+static struct rt_device null_dev;
+
+static rt_size_t null_read (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
+{
+ rt_memset(buffer, 0, size);
+ return size;
+}
+
+static rt_size_t null_write (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
+{
+ return size;
+}
+
+static rt_err_t null_control (rt_device_t dev, int cmd, void *args)
+{
+ return RT_EOK;
+}
+
+#ifdef RT_USING_DEVICE_OPS
+const static struct rt_device_ops null_ops =
+{
+ RT_NULL,
+ RT_NULL,
+ RT_NULL,
+ null_read,
+ null_write,
+ null_control
+};
+#endif
+
+int null_device_init(void)
+{
+ static rt_bool_t init_ok = RT_FALSE;
+
+ if (init_ok)
+ {
+ return 0;
+ }
+ RT_ASSERT(!rt_device_find("null"));
+ null_dev.type = RT_Device_Class_Miscellaneous;
+
+#ifdef RT_USING_DEVICE_OPS
+ null_dev.ops = &null_ops;
+#else
+ null_dev.init = RT_NULL;
+ null_dev.open = RT_NULL;
+ null_dev.close = RT_NULL;
+ null_dev.read = null_read;
+ null_dev.write = null_write;
+ null_dev.control = null_control;
+#endif
+
+ /* no private */
+ null_dev.user_data = RT_NULL;
+
+ rt_device_register(&null_dev, "null", RT_DEVICE_FLAG_RDWR);
+
+ init_ok = RT_TRUE;
+
+ return 0;
+}
+INIT_DEVICE_EXPORT(null_device_init);
+
diff --git a/components/drivers/misc/rt_random.c b/components/drivers/misc/rt_random.c
new file mode 100644
index 0000000000000000000000000000000000000000..5aa7e49a3e687defa08d6e51b197ad28a49785b4
--- /dev/null
+++ b/components/drivers/misc/rt_random.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2011-2020, Shanghai Real-Thread Electronic Technology Co.,Ltd
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-12-18 quanzhao the first version
+ */
+
+#include
+#include
+#include
+
+static struct rt_device random_dev;
+static unsigned long seed;
+
+static rt_uint16_t calc_random(void)
+{
+ seed = 214013L * seed + 2531011L;
+ return (seed >> 16) & 0x7FFF; /* return bits 16~30 */
+}
+
+static rt_size_t random_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
+{
+ rt_uint16_t rand = calc_random();
+ ssize_t ret = sizeof(rand);
+ rt_memcpy(buffer, &rand, ret);
+ return ret;
+}
+
+static rt_size_t random_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
+{
+ ssize_t ret = sizeof(seed);
+ rt_memcpy(&seed, buffer, ret);
+ return ret;
+}
+
+static rt_err_t random_control(rt_device_t dev, int cmd, void *args)
+{
+ return RT_EOK;
+}
+
+#ifdef RT_USING_DEVICE_OPS
+const static struct rt_device_ops random_ops =
+{
+ RT_NULL,
+ RT_NULL,
+ RT_NULL,
+ random_read,
+ random_write,
+ random_control
+};
+#endif
+
+int random_device_init(void)
+{
+ static rt_bool_t init_ok = RT_FALSE;
+
+ if (init_ok)
+ {
+ return 0;
+ }
+ RT_ASSERT(!rt_device_find("random"));
+ random_dev.type = RT_Device_Class_Miscellaneous;
+
+#ifdef RT_USING_DEVICE_OPS
+ random_dev.ops = &random_ops;
+#else
+ random_dev.init = RT_NULL;
+ random_dev.open = RT_NULL;
+ random_dev.close = RT_NULL;
+ random_dev.read = random_read;
+ random_dev.write = random_write;
+ random_dev.control = random_control;
+#endif
+
+ /* no private */
+ random_dev.user_data = RT_NULL;
+
+ rt_device_register(&random_dev, "random", RT_DEVICE_FLAG_RDWR);
+
+ init_ok = RT_TRUE;
+
+ return 0;
+}
+INIT_DEVICE_EXPORT(random_device_init);
+
diff --git a/components/drivers/serial/serial.c b/components/drivers/serial/serial.c
index 2511f18102aaac4d3220e227ab55c2e50219c8b1..dc9c7ac2cf4031cacddafaadf255edc02a04ee76 100644
--- a/components/drivers/serial/serial.c
+++ b/components/drivers/serial/serial.c
@@ -127,6 +127,7 @@ static int serial_fops_read(struct dfs_fd *fd, void *buf, size_t count)
{
int size = 0;
rt_device_t device;
+ int wait_ret;
device = (rt_device_t)fd->data;
@@ -137,14 +138,21 @@ static int serial_fops_read(struct dfs_fd *fd, void *buf, size_t count)
{
if (fd->flags & O_NONBLOCK)
{
- size = -EAGAIN;
break;
}
- rt_wqueue_wait(&(device->wait_queue), 0, RT_WAITING_FOREVER);
+ wait_ret = rt_wqueue_wait_interruptible(&(device->wait_queue), 0, RT_WAITING_FOREVER);
+ if (wait_ret != RT_EOK)
+ {
+ break;
+ }
}
}while (size <= 0);
+ if (size < 0)
+ {
+ size = 0;
+ }
return size;
}
@@ -575,6 +583,8 @@ static rt_err_t rt_serial_init(struct rt_device *dev)
serial->serial_rx = RT_NULL;
serial->serial_tx = RT_NULL;
+ rt_memset(&serial->rx_notify, 0, sizeof(struct rt_device_notify));
+
/* apply configuration */
if (serial->ops->configure)
result = serial->ops->configure(serial, &serial->config);
@@ -1010,6 +1020,20 @@ static rt_err_t rt_serial_control(struct rt_device *dev,
break;
+ case RT_DEVICE_CTRL_NOTIFY_SET:
+ if (args)
+ {
+ rt_memcpy(&serial->rx_notify, args, sizeof(struct rt_device_notify));
+ }
+ break;
+
+ case RT_DEVICE_CTRL_CONSOLE_OFLAG:
+ if (args)
+ {
+ *(rt_uint16_t*)args = RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM;
+ }
+ break;
+
#ifdef RT_USING_POSIX_TERMIOS
case TCGETA:
{
@@ -1236,6 +1260,12 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
serial->parent.rx_indicate(&serial->parent, rx_length);
}
}
+
+ if (serial->rx_notify.notify)
+ {
+ serial->rx_notify.notify(serial->rx_notify.dev);
+ }
+
break;
}
case RT_SERIAL_EVENT_TX_DONE:
@@ -1315,3 +1345,4 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
#endif /* RT_SERIAL_USING_DMA */
}
}
+
diff --git a/components/drivers/src/completion.c b/components/drivers/src/completion.c
index 9e461e49ce51e31f1437f02398076f9e83e590f1..24b85e198e4bd1919509677f99fe22be654efc1c 100644
--- a/components/drivers/src/completion.c
+++ b/components/drivers/src/completion.c
@@ -55,7 +55,7 @@ rt_err_t rt_completion_wait(struct rt_completion *completion,
thread->error = RT_EOK;
/* suspend thread */
- rt_thread_suspend(thread);
+ rt_thread_suspend_with_flag(thread, RT_UNINTERRUPTIBLE);
/* add to suspended list */
rt_list_insert_before(&(completion->suspended_list),
&(thread->tlist));
diff --git a/components/drivers/src/dataqueue.c b/components/drivers/src/dataqueue.c
index bfe8e1257394da38b000e7758ecfc94c30e39f91..3f481a308ec986f85ec08a1de97fbb0470f74c49 100644
--- a/components/drivers/src/dataqueue.c
+++ b/components/drivers/src/dataqueue.c
@@ -62,7 +62,7 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue,
rt_ubase_t level;
rt_thread_t thread;
rt_err_t result;
-
+
RT_ASSERT(queue != RT_NULL);
RT_ASSERT(queue->magic == DATAQUEUE_MAGIC);
@@ -85,9 +85,9 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue,
/* reset thread error number */
thread->error = RT_EOK;
-
+
/* suspend thread on the push list */
- rt_thread_suspend(thread);
+ rt_thread_suspend_with_flag(thread, RT_UNINTERRUPTIBLE);
rt_list_insert_before(&(queue->suspended_push_list), &(thread->tlist));
/* start timer */
if (timeout > 0)
@@ -155,13 +155,13 @@ RTM_EXPORT(rt_data_queue_push);
rt_err_t rt_data_queue_pop(struct rt_data_queue *queue,
const void** data_ptr,
- rt_size_t *size,
+ rt_size_t *size,
rt_int32_t timeout)
{
rt_ubase_t level;
rt_thread_t thread;
rt_err_t result;
-
+
RT_ASSERT(queue != RT_NULL);
RT_ASSERT(queue->magic == DATAQUEUE_MAGIC);
RT_ASSERT(data_ptr != RT_NULL);
@@ -185,9 +185,9 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue,
/* reset thread error number */
thread->error = RT_EOK;
-
+
/* suspend thread on the pop list */
- rt_thread_suspend(thread);
+ rt_thread_suspend_with_flag(thread, RT_UNINTERRUPTIBLE);
rt_list_insert_before(&(queue->suspended_pop_list), &(thread->tlist));
/* start timer */
if (timeout > 0)
@@ -269,11 +269,11 @@ rt_err_t rt_data_queue_peak(struct rt_data_queue *queue,
rt_size_t *size)
{
rt_ubase_t level;
-
+
RT_ASSERT(queue != RT_NULL);
RT_ASSERT(queue->magic == DATAQUEUE_MAGIC);
- if (queue->is_empty)
+ if (queue->is_empty)
{
return -RT_EEMPTY;
}
@@ -293,7 +293,7 @@ void rt_data_queue_reset(struct rt_data_queue *queue)
{
rt_ubase_t level;
struct rt_thread *thread;
-
+
RT_ASSERT(queue != RT_NULL);
RT_ASSERT(queue->magic == DATAQUEUE_MAGIC);
@@ -303,9 +303,9 @@ void rt_data_queue_reset(struct rt_data_queue *queue)
queue->put_index = 0;
queue->is_empty = 1;
queue->is_full = 0;
-
+
rt_hw_interrupt_enable(level);
-
+
rt_enter_critical();
/* wakeup all suspend threads */
@@ -375,7 +375,7 @@ rt_err_t rt_data_queue_deinit(struct rt_data_queue *queue)
level = rt_hw_interrupt_disable();
queue->magic = 0;
rt_hw_interrupt_enable(level);
-
+
rt_free(queue->queue);
return RT_EOK;
@@ -386,7 +386,7 @@ rt_uint16_t rt_data_queue_len(struct rt_data_queue *queue)
{
rt_ubase_t level;
rt_int16_t len;
-
+
RT_ASSERT(queue != RT_NULL);
RT_ASSERT(queue->magic == DATAQUEUE_MAGIC);
@@ -405,7 +405,7 @@ rt_uint16_t rt_data_queue_len(struct rt_data_queue *queue)
{
len = queue->size + queue->put_index - queue->get_index;
}
-
+
rt_hw_interrupt_enable(level);
return len;
diff --git a/components/drivers/src/waitqueue.c b/components/drivers/src/waitqueue.c
index 02240edbdfdfa79ac55c1394cc31991b9597195d..830c5bed9ca5e265336172019d6806af916c9b5d 100644
--- a/components/drivers/src/waitqueue.c
+++ b/components/drivers/src/waitqueue.c
@@ -74,13 +74,14 @@ void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key)
rt_schedule();
}
-int rt_wqueue_wait(rt_wqueue_t *queue, int condition, int msec)
+static int _rt_wqueue_wait(rt_wqueue_t *queue, int condition, int msec, int suspend_flag)
{
int tick;
rt_thread_t tid = rt_thread_self();
rt_timer_t tmr = &(tid->thread_timer);
struct rt_wqueue_node __wait;
rt_base_t level;
+ rt_err_t ret;
/* current context checking */
RT_DEBUG_NOT_IN_INTERRUPT;
@@ -102,8 +103,14 @@ int rt_wqueue_wait(rt_wqueue_t *queue, int condition, int msec)
goto __exit_wakeup;
}
+ ret = rt_thread_suspend_with_flag(tid, RT_INTERRUPTIBLE);
+ if (ret != RT_EOK)
+ {
+ rt_hw_interrupt_enable(level);
+ /* suspend failed */
+ return -RT_EINTR;
+ }
rt_wqueue_add(queue, &__wait);
- rt_thread_suspend(tid);
/* start timer */
if (tick != RT_WAITING_FOREVER)
@@ -128,3 +135,18 @@ __exit_wakeup:
return 0;
}
+
+int rt_wqueue_wait(rt_wqueue_t *queue, int condition, int msec)
+{
+ return _rt_wqueue_wait(queue, condition, msec, RT_UNINTERRUPTIBLE);
+}
+
+int rt_wqueue_wait_killable(rt_wqueue_t *queue, int condition, int msec)
+{
+ return _rt_wqueue_wait(queue, condition, msec, RT_KILLABLE);
+}
+
+int rt_wqueue_wait_interruptible(rt_wqueue_t *queue, int condition, int msec)
+{
+ return _rt_wqueue_wait(queue, condition, msec, RT_INTERRUPTIBLE);
+}
diff --git a/components/drivers/src/workqueue.c b/components/drivers/src/workqueue.c
index 2e0280df3a747ca4c09950676781527dc6f29295..564dde78f29d5d243281512e0642d72b250cb02a 100644
--- a/components/drivers/src/workqueue.c
+++ b/components/drivers/src/workqueue.c
@@ -61,7 +61,7 @@ static void _workqueue_thread_entry(void *parameter)
if (rt_list_isempty(&(queue->work_list)))
{
/* no software timer exist, suspend self. */
- rt_thread_suspend(rt_thread_self());
+ rt_thread_suspend_with_flag(rt_thread_self(), RT_UNINTERRUPTIBLE);
rt_schedule();
}
diff --git a/components/finsh/cmd.c b/components/finsh/cmd.c
index afbda59e908aa320b33a06124ed21d18e22a08ec..3c2a0b74c8eced868bf8609782b47894e2435c11 100644
--- a/components/finsh/cmd.c
+++ b/components/finsh/cmd.c
@@ -27,9 +27,9 @@
* 2012-10-22 Bernard add MS VC++ patch.
* 2016-06-02 armink beautify the list_thread command
* 2018-11-22 Jesven list_thread add smp support
- * 2018-12-27 Jesven Fix the problem that disable interrupt too long in list_thread
+ * 2018-12-27 Jesven Fix the problem that disable interrupt too long in list_thread
* Provide protection for the "first layer of objects" when list_*
- * 2020-04-07 chenhui add clear
+ * 2020-04-07 chenhui add clear
*/
#include
@@ -55,8 +55,8 @@ static long clear(void)
return 0;
}
-FINSH_FUNCTION_EXPORT(clear,clear the terminal screen);
-MSH_CMD_EXPORT(clear,clear the terminal screen);
+FINSH_FUNCTION_EXPORT(clear, clear the terminal screen);
+MSH_CMD_EXPORT(clear, clear the terminal screen);
extern void rt_show_version(void);
long version(void)
@@ -156,7 +156,7 @@ static rt_list_t *list_get_next(rt_list_t *current, list_get_next_t *arg)
break;
}
}
-
+
rt_hw_interrupt_enable(level);
arg->nr_out = nr;
return node;
@@ -221,7 +221,7 @@ long list_thread(void)
#endif /*RT_USING_SMP*/
stat = (thread->stat & RT_THREAD_STAT_MASK);
if (stat == RT_THREAD_READY) rt_kprintf(" ready ");
- else if (stat == RT_THREAD_SUSPEND) rt_kprintf(" suspend");
+ else if ((stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK) rt_kprintf(" suspend");
else if (stat == RT_THREAD_INIT) rt_kprintf(" init ");
else if (stat == RT_THREAD_CLOSE) rt_kprintf(" close ");
else if (stat == RT_THREAD_RUNNING) rt_kprintf(" running");
@@ -1148,5 +1148,191 @@ static int dummy = 0;
FINSH_VAR_EXPORT(dummy, finsh_type_int, dummy variable for finsh)
#endif
+#ifdef RT_USING_LWP
+#include
+#ifdef RT_USING_USERSPACE
+#include
+#endif
+
+#ifdef RT_USING_HEAP
+extern void list_mem(void);
+extern long list_memheap(void);
+#endif
+
+static rt_ubase_t rt_tick_mark = 0;
+static char top_ch;
+
+static void top_tick_hook(void)
+{
+ rt_base_t level;
+ struct rt_thread *thread;
+
+ level = rt_hw_interrupt_disable();
+ thread = rt_thread_self();
+ if (thread)
+ {
+ if (thread->tick_mark != rt_tick_mark)
+ {
+ thread->run_tick = 0;
+ thread->tick_mark = rt_tick_mark;
+ }
+ thread->run_tick++;
+ }
+ rt_hw_interrupt_enable(level);
+}
+
+static void top_getchar_entry(void* parameter)
+{
+ rt_sem_t sem = (rt_sem_t)parameter;
+ while (1)
+ {
+ top_ch = getchar();
+ rt_sem_release(sem);
+ if (top_ch == 'q')
+ {
+ break;
+ }
+ }
+}
+
+long top(void)
+{
+ rt_thread_t tid;
+ list_get_next_t find_arg;
+ rt_list_t *next = (rt_list_t*)RT_NULL;
+ rt_list_t *obj_list[LIST_FIND_OBJ_NR];
+ const char *item_title = "THREAD";
+ int maxlen;
+ rt_sem_t top_char_sem;
+
+ rt_base_t level;
+
+ top_ch = 0;
+ top_char_sem = rt_sem_create("top_char", 0, RT_IPC_FLAG_FIFO);
+ tid = rt_thread_create("top_getchar", top_getchar_entry, top_char_sem,
+ 1024, 2, 10);
+ if (tid)
+ {
+ rt_thread_startup(tid);
+ }
+
+ while (1)
+ {
+ rt_ubase_t tick_diff;
+ rt_ubase_t wait_tick;
+
+ level = rt_hw_interrupt_disable();
+ rt_tick_mark = rt_tick_get();
+ rt_tick_sethook(top_tick_hook);
+ rt_hw_interrupt_enable(level);
+
+ wait_tick = RT_TICK_PER_SECOND + rt_tick_mark;
+
+ while (rt_tick_get() < wait_tick)
+ {
+ rt_sem_take(top_char_sem, wait_tick - rt_tick_get());
+ if (top_ch == 'q')
+ {
+ rt_sem_delete(top_char_sem);
+ level = rt_hw_interrupt_disable();
+ rt_tick_sethook(0);
+ rt_hw_interrupt_enable(level);
+ return 0;
+ }
+ }
+
+ level = rt_hw_interrupt_disable();
+ rt_tick_sethook(0);
+ rt_hw_interrupt_enable(level);
+
+ tick_diff = rt_tick_get() - rt_tick_mark;
+
+ list_find_init(&find_arg, RT_Object_Class_Thread, obj_list, sizeof(obj_list)/sizeof(obj_list[0]));
+ maxlen = RT_NAME_MAX;
+ rt_kprintf("\033[2J");
+
+#ifdef RT_USING_HEAP
+#ifdef RT_USING_MEMHEAP_AS_HEAP
+ list_memheap();
+#else
+ list_mem();
+#endif
+#endif
+ object_split(maxlen);
+ rt_kprintf( "----------------\n");
+ rt_kprintf("%-*.s PID PRI A %%CPU VIRT\n", maxlen, item_title); object_split(maxlen);
+ rt_kprintf( " ----- --- - ---- ----\n");
+ do
+ {
+ next = list_get_next(next, &find_arg);
+ {
+ int i;
+ for (i = 0; i < find_arg.nr_out; i++)
+ {
+ struct rt_object *obj;
+ struct rt_thread thread_info, *thread;
+
+ obj = rt_list_entry(obj_list[i], struct rt_object, list);
+ level = rt_hw_interrupt_disable();
+
+ if ((obj->type & ~RT_Object_Class_Static) != find_arg.type)
+ {
+ rt_hw_interrupt_enable(level);
+ continue;
+ }
+ /* copy info */
+ memcpy(&thread_info, obj, sizeof thread_info);
+ rt_hw_interrupt_enable(level);
+
+ thread = (struct rt_thread*)obj;
+ {
+ if (thread->tick_mark != rt_tick_mark)
+ {
+ thread->run_tick = 0;
+ }
+
+ level = rt_hw_interrupt_disable();
+ if (thread->lwp)
+ {
+ pid_t pid;
+ struct rt_lwp *lwp;
+
+ lwp = (struct rt_lwp*)thread->lwp;
+ lwp_ref_inc(lwp);
+ rt_hw_interrupt_enable(level);
+ pid = lwp_to_pid(lwp);
+ rt_kprintf("%-*.*s %5d %3d ", maxlen, RT_NAME_MAX, thread->name, pid, thread->current_priority);
+#ifdef RT_USING_USERSPACE
+ {
+ size_t virt;
+
+ level = rt_hw_interrupt_disable();
+ virt = lwp_vmem_count(lwp->map_area);
+ rt_hw_interrupt_enable(level);
+ rt_kprintf(" U %3d 0x%08x\n", thread->run_tick * 100/tick_diff, virt);
+ }
+#else
+ rt_kprintf(" U %3d\n", thread->run_tick * 100/tick_diff);
+#endif
+ lwp_ref_dec(lwp);
+ }
+ else
+ {
+ rt_hw_interrupt_enable(level);
+ rt_kprintf("%-*.*s %3d ", maxlen, RT_NAME_MAX, thread->name, thread->current_priority);
+ rt_kprintf(" K %3d\n", thread->run_tick * 100/tick_diff);
+ }
+ }
+ }
+ }
+ }
+ while (next != (rt_list_t*)RT_NULL);
+ }
+ return 0;
+}
+FINSH_FUNCTION_EXPORT(top, display system info);
+MSH_CMD_EXPORT(top, disaplay system info);
+#endif /* end of RT_USING_LWP */
+
#endif /* RT_USING_FINSH */
diff --git a/components/finsh/msh.c b/components/finsh/msh.c
index 79f1e3c87f9d5b0fe7e25368acbd65eb3812e107..4405d9ca74283de341aed93e76ee995ff8dd0ea3 100644
--- a/components/finsh/msh.c
+++ b/components/finsh/msh.c
@@ -232,7 +232,7 @@ int msh_exec_module(const char *cmd_line, int size)
length = cmd_length + 32;
/* allocate program name memory */
- pg_name = (char *) rt_malloc(length);
+ pg_name = (char *) rt_malloc(length + 3);
if (pg_name == RT_NULL)
return -RT_ENOMEM;
@@ -357,14 +357,43 @@ static int _msh_exec_lwp(char *cmd, rt_size_t length)
pg_name = argv[0];
/* try to open program */
fd = open(pg_name, O_RDONLY, 0);
-
if (fd < 0)
- return -1;
+ {
+ /* try to open *.elf file */
+ pg_name = rt_malloc(strlen(argv[0]) + 64);
+ if (pg_name)
+ {
+ strcpy(pg_name, argv[0]);
+ strcat(pg_name, ".elf");
+
+ fd = open(pg_name, O_RDONLY, 0);
+
+ /* try it in /bin */
+ if (fd < 0)
+ {
+ if (strstr(argv[0], "elf") != NULL)
+ snprintf(pg_name, 64, "/bin/%s", argv[0]);
+ else
+ snprintf(pg_name, 64, "/bin/%s.elf", argv[0]);
+ fd = open(pg_name, O_RDONLY, 0);
+ }
+
+ if (fd < 0)
+ {
+ rt_free(pg_name);
+ return -1;
+ }
+ }
+ else return -1; /* out of memory */
+ }
/* found program */
close(fd);
exec(pg_name, argc, argv);
+ if (pg_name != argv[0])
+ rt_free(pg_name);
+
return 0;
}
#endif
@@ -595,7 +624,7 @@ void msh_auto_complete(char *prefix)
ptr --;
}
-#ifdef RT_USING_MODULE
+#if defined(RT_USING_MODULE) || defined(RT_USING_LWP)
/* There is a chance that the user want to run the module directly. So
* try to complete the file names. If the completed path is not a
* module, the system won't crash anyway. */
diff --git a/components/libc/Kconfig b/components/libc/Kconfig
index 65c8d44225ccccf8dabf72f7b3c1cc92a8333276..eac0fa1d595322e5a7c136caa3bd2a54d4e783dc 100644
--- a/components/libc/Kconfig
+++ b/components/libc/Kconfig
@@ -4,6 +4,22 @@ config RT_USING_LIBC
bool "Enable libc APIs from toolchain"
default y
+if RT_USING_LIBC && RT_USING_LWP
+ choice
+ prompt "Select c standard library"
+ default RT_USING_NEWLIB
+ help
+ Select c standard library
+
+ config RT_USING_NEWLIB
+ bool "Use libc: newlib"
+
+ config RT_USING_MUSL
+ bool "Use libc: musl (libc.a/libm.a in RT-Thread)"
+
+ endchoice
+endif
+
config RT_USING_PTHREADS
bool "Enable pthreads APIs"
default n
diff --git a/components/libc/compilers/common/SConscript b/components/libc/compilers/common/SConscript
index 2407301405ed4e719c1e87665d60877473405bcd..96fd5ad9d335a4bdedefe5c266713f63ed02e76a 100644
--- a/components/libc/compilers/common/SConscript
+++ b/components/libc/compilers/common/SConscript
@@ -1,22 +1,25 @@
from building import *
-Import('rtconfig')
-
src = []
cwd = GetCurrentDir()
group = []
CPPPATH = [cwd]
+CPPDEFINES = []
if GetDepend('RT_USING_LIBC'):
- src += Glob('*.c')
+ src += Glob('*.c')
else:
- if GetDepend('RT_LIBC_USING_TIME') and not GetDepend('RT_USING_MINILIBC'):
- src += ['time.c']
+ if GetDepend('RT_LIBC_USING_TIME') and not GetDepend('RT_USING_MINILIBC'):
+ src += ['time.c']
if GetDepend('RT_USING_POSIX') == False:
- SrcRemove(src, ['unistd.c'])
+ SrcRemove(src, ['unistd.c'])
+
+if GetDepend('RT_USING_MUSL'):
+ SrcRemove(src, ['time.c'])
+ CPPDEFINES = ['_TIMEVAL_DEFINED']
-if not GetDepend('RT_USING_MINILIBC') and (GetDepend('RT_USING_LIBC') or GetDepend('RT_LIBC_USING_TIME')):
- group = DefineGroup('libc', src, depend = [''], CPPPATH = CPPPATH)
+if not GetDepend('RT_USING_MINILIBC') and not GetDepend('RT_USING_MUSL') and (GetDepend('RT_USING_LIBC') or GetDepend('RT_LIBC_USING_TIME')):
+ group = DefineGroup('libc', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES)
Return('group')
diff --git a/components/libc/compilers/minilibc/SConscript b/components/libc/compilers/minilibc/SConscript
index dec657028fe2b9795579d72a8c491fcb5d1520d4..9e1ab5860bdfcefd3c17547216df4795a64bab43 100644
--- a/components/libc/compilers/minilibc/SConscript
+++ b/components/libc/compilers/minilibc/SConscript
@@ -1,14 +1,14 @@
from building import *
Import('rtconfig')
-src = Glob('*.c') + Glob('*.cpp')
-cwd = GetCurrentDir()
+src = Glob('*.c') + Glob('*.cpp')
+cwd = GetCurrentDir()
group = []
CPPPATH = [cwd]
CPPDEFINES = ['RT_USING_MINILIBC']
-if rtconfig.PLATFORM == 'gcc' and rtconfig.ARCH != 'sim' and not GetDepend('RT_USING_LIBC') and GetDepend('RT_USING_MINILIBC'):
+if rtconfig.PLATFORM == 'gcc' and not GetDepend('RT_USING_LIBC') and rtconfig.ARCH != 'sim':
group = DefineGroup('libc', src, depend = [''],
CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES)
diff --git a/components/libc/compilers/musl/.gitignore b/components/libc/compilers/musl/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..0a9ce4f3e2c93ab435bf2a27c80d2cbb2a764886
--- /dev/null
+++ b/components/libc/compilers/musl/.gitignore
@@ -0,0 +1 @@
+libc
diff --git a/components/libc/compilers/musl/SConscript b/components/libc/compilers/musl/SConscript
new file mode 100644
index 0000000000000000000000000000000000000000..c6c88edb5a92a4b266f01407d02c7398dec40fb7
--- /dev/null
+++ b/components/libc/compilers/musl/SConscript
@@ -0,0 +1,18 @@
+from building import *
+Import('rtconfig')
+
+src = Glob('*.c')
+cwd = GetCurrentDir()
+group = []
+
+CFLAGS = ' -nostdinc'
+CPPPATH = [cwd, cwd + '/libc/include']
+CPPDEFINES = ['__STDC_ISO_10646__=201206L', '_STDC_PREDEF_H']
+LIBS = ['c', 'gcc']
+LIBPATH = [cwd + '/libc/lib']
+
+if rtconfig.PLATFORM == 'gcc':
+ group = DefineGroup('musl', src, depend = ['RT_USING_LIBC', 'RT_USING_MUSL'], CFLAGS = CFLAGS,
+ CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES, LIBS = LIBS, LIBPATH = LIBPATH)
+
+Return('group')
diff --git a/components/libc/compilers/musl/init.c b/components/libc/compilers/musl/init.c
new file mode 100644
index 0000000000000000000000000000000000000000..eb6cdcfa81b5f8ce588527bcd41ee313a1028bde
--- /dev/null
+++ b/components/libc/compilers/musl/init.c
@@ -0,0 +1,16 @@
+extern char **__environ;
+
+#if 0
+void __init_libc(char **envp, char *pn)
+{
+ __environ = envp;
+}
+#endif
+
+void __libc_exit_fini(void)
+{
+}
+
+void __libc_start_init(void)
+{
+}
diff --git a/components/libc/compilers/musl/libc.c b/components/libc/compilers/musl/libc.c
new file mode 100644
index 0000000000000000000000000000000000000000..502cca50ed8b50a52fdb0f37a84fe1f3999b77d9
--- /dev/null
+++ b/components/libc/compilers/musl/libc.c
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2017/10/15 bernard the first version
+ */
+#include
+#include
+#include
+#include
+#include
+
+#include "libc.h"
+
+#ifdef RT_USING_PTHREADS
+#include
+#endif
+
+int _EXFUN(putenv,(char *__string));
+
+int libc_system_init(void)
+{
+#if defined(RT_USING_DFS) & defined(RT_USING_DFS_DEVFS) & defined(RT_USING_CONSOLE)
+ rt_device_t dev_console;
+
+ dev_console = rt_console_get_device();
+ if (dev_console)
+ {
+ #if defined(RT_USING_POSIX)
+ libc_stdio_set_console(dev_console->parent.name, O_RDWR);
+ #else
+ libc_stdio_set_console(dev_console->parent.name, O_WRONLY);
+ #endif
+ }
+
+ /* set PATH and HOME */
+ putenv("PATH=/bin");
+ putenv("HOME=/home");
+#endif
+
+#if defined RT_USING_PTHREADS && !defined RT_USING_COMPONENTS_INIT
+ pthread_system_init();
+#endif
+
+ return 0;
+}
+INIT_COMPONENT_EXPORT(libc_system_init);
diff --git a/components/libc/compilers/musl/libc.h b/components/libc/compilers/musl/libc.h
new file mode 100644
index 0000000000000000000000000000000000000000..ab9334fe262a39bb508aa0a0980b951a327648f2
--- /dev/null
+++ b/components/libc/compilers/musl/libc.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2017/10/15 bernard the first version
+ */
+#ifndef __RTT_LIBC_H__
+#define __RTT_LIBC_H__
+
+#include
+#include
+#include
+#include
+
+#ifndef _EXFUN
+#define _EXFUN(name, proto) name proto
+#endif
+
+#define MILLISECOND_PER_SECOND 1000UL
+#define MICROSECOND_PER_SECOND 1000000UL
+#define NANOSECOND_PER_SECOND 1000000000UL
+
+#define MILLISECOND_PER_TICK (MILLISECOND_PER_SECOND / RT_TICK_PER_SECOND)
+#define MICROSECOND_PER_TICK (MICROSECOND_PER_SECOND / RT_TICK_PER_SECOND)
+#define NANOSECOND_PER_TICK (NANOSECOND_PER_SECOND / RT_TICK_PER_SECOND)
+
+int libc_system_init(void);
+int libc_stdio_set_console(const char* device_name, int mode);
+int libc_stdio_get_console(void);
+
+/* some time related function */
+int libc_set_time(const struct timespec *time);
+int libc_get_time(struct timespec *time);
+int libc_time_to_tick(const struct timespec *time);
+
+#endif
diff --git a/components/libc/compilers/musl/libc_syms.c b/components/libc/compilers/musl/libc_syms.c
new file mode 100644
index 0000000000000000000000000000000000000000..b150c10fd62d1d5aa33099fb8b9a7f6ce1abec79
--- /dev/null
+++ b/components/libc/compilers/musl/libc_syms.c
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2017/10/15 bernard the first version
+ */
+#include
+#include
+
+#include
+#include
+#include
+
+RTM_EXPORT(strcpy);
+RTM_EXPORT(strncpy);
+RTM_EXPORT(strlen);
+RTM_EXPORT(strcat);
+RTM_EXPORT(strstr);
+RTM_EXPORT(strchr);
+RTM_EXPORT(strcmp);
+RTM_EXPORT(strtol);
+RTM_EXPORT(strtoul);
+RTM_EXPORT(strncmp);
+
+RTM_EXPORT(memcpy);
+RTM_EXPORT(memcmp);
+RTM_EXPORT(memmove);
+RTM_EXPORT(memset);
+RTM_EXPORT(memchr);
+
+RTM_EXPORT(putchar);
+RTM_EXPORT(puts);
+RTM_EXPORT(printf);
+RTM_EXPORT(sprintf);
+RTM_EXPORT(snprintf);
+
+RTM_EXPORT(fwrite);
+
+#include
+RTM_EXPORT(localtime);
+RTM_EXPORT(time);
+
+#include
+RTM_EXPORT(longjmp);
+RTM_EXPORT(setjmp);
+
+RTM_EXPORT(exit);
+RTM_EXPORT(abort);
+
+RTM_EXPORT(rand);
+
+#include
+RTM_EXPORT(__assert_func);
diff --git a/components/lwp/lwp_mem.h b/components/libc/compilers/musl/mem.c
similarity index 31%
rename from components/lwp/lwp_mem.h
rename to components/libc/compilers/musl/mem.c
index 8d333cfe4f71244a5ce17483891d157645d71d0a..abc7a47b7a36ed9f812f14d56bd9de587a586dbe 100644
--- a/components/lwp/lwp_mem.h
+++ b/components/libc/compilers/musl/mem.c
@@ -5,17 +5,26 @@
*
* Change Logs:
* Date Author Notes
- * 2018-06-10 Bernard first version
+ * 2020/10/7 bernard the first version
*/
+#include
-#ifndef __LWP_MEM_H__
-#define __LWP_MEM_H__
+void *malloc(size_t n)
+{
+ return rt_malloc(n);
+}
-extern void rt_lwp_mem_init(struct rt_lwp *lwp);
-extern void rt_lwp_mem_deinit(struct rt_lwp *lwp);
+void *calloc(size_t m, size_t n)
+{
+ return rt_calloc(m, n);
+}
-extern void *rt_lwp_mem_malloc(rt_uint32_t size);
-extern void rt_lwp_mem_free(void *addr);
-extern void *rt_lwp_mem_realloc(void *rmem, rt_size_t newsize);
+void *realloc(void *p, size_t n)
+{
+ return rt_realloc(p, n);
+}
-#endif
+void free(void *p)
+{
+ rt_free(p);
+}
diff --git a/components/libc/compilers/musl/stdio.c b/components/libc/compilers/musl/stdio.c
new file mode 100644
index 0000000000000000000000000000000000000000..4ccd3a4923ed56b6ea43955c6ec4bf712c0a5e6c
--- /dev/null
+++ b/components/libc/compilers/musl/stdio.c
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2017/10/15 bernard the first version
+ */
+#include
+#include
+
+#include
+#include "libc.h"
+
+#define STDIO_DEVICE_NAME_MAX 32
+
+int _EXFUN(fileno, (FILE *));
+
+static FILE* std_console = NULL;
+
+int libc_stdio_set_console(const char* device_name, int mode)
+{
+ FILE *fp;
+ char name[STDIO_DEVICE_NAME_MAX];
+ char *file_mode;
+
+ snprintf(name, sizeof(name) - 1, "/dev/%s", device_name);
+ name[STDIO_DEVICE_NAME_MAX - 1] = '\0';
+
+ if (mode == O_RDWR) file_mode = "r+";
+ else if (mode == O_WRONLY) file_mode = "wb";
+ else file_mode = "rb";
+
+ fp = fopen(name, file_mode);
+ if (fp)
+ {
+ setvbuf(fp, NULL, _IONBF, 0);
+
+ if (std_console)
+ {
+ fclose(std_console);
+ std_console = NULL;
+ }
+ std_console = fp;
+ }
+
+ if (std_console) return fileno(std_console);
+
+ return -1;
+}
+
+int libc_stdio_get_console(void) {
+ if (std_console)
+ return fileno(std_console);
+ else
+ return -1;
+}
diff --git a/components/libc/compilers/musl/time.c b/components/libc/compilers/musl/time.c
new file mode 100644
index 0000000000000000000000000000000000000000..5a4e89f50f6597421b978495d1d6daf3c15c6091
--- /dev/null
+++ b/components/libc/compilers/musl/time.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ */
+#include
+#include
+
+#ifdef RT_USING_DEVICE
+int gettimeofday(struct timeval *tp, void *ignore)
+{
+ time_t time;
+ rt_device_t device;
+
+ device = rt_device_find("rtc");
+ RT_ASSERT(device != RT_NULL);
+
+ rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
+ if (tp != RT_NULL)
+ {
+ tp->tv_sec = time;
+ tp->tv_usec = 0;
+ }
+
+ return time;
+}
+#endif
+
+time_t time(time_t *t)
+{
+ time_t time_now = 0;
+
+#ifdef RT_USING_RTC
+ static rt_device_t device = RT_NULL;
+
+ /* optimization: find rtc device only first. */
+ if (device == RT_NULL)
+ {
+ device = rt_device_find("rtc");
+ }
+
+ /* read timestamp from RTC device. */
+ if (device != RT_NULL)
+ {
+ if (rt_device_open(device, 0) == RT_EOK)
+ {
+ rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time_now);
+ rt_device_close(device);
+ }
+ }
+#endif /* RT_USING_RTC */
+
+ /* if t is not NULL, write timestamp to *t */
+ if (t != RT_NULL)
+ {
+ *t = time_now;
+ }
+
+ return time_now;
+}
+
+RT_WEAK clock_t clock(void)
+{
+ return rt_tick_get();
+}
diff --git a/components/libc/compilers/newlib/SConscript b/components/libc/compilers/newlib/SConscript
index 06e5faad098bbc2fe25a8109b9345ac36ead8172..0ac84e79fa2bc5473288e22550ba3c2b3040a021 100644
--- a/components/libc/compilers/newlib/SConscript
+++ b/components/libc/compilers/newlib/SConscript
@@ -6,7 +6,7 @@ cwd = GetCurrentDir()
group = []
CPPPATH = [cwd]
-CPPDEFINES = ['RT_USING_NEWLIB']
+CPPDEFINES = []
# link with libc and libm:
# libm is a frequently used lib. Newlib is compiled with -ffunction-sections in
@@ -14,7 +14,15 @@ CPPDEFINES = ['RT_USING_NEWLIB']
# been referenced. So setting this won't result in bigger text size.
LIBS = ['c', 'm']
-if rtconfig.PLATFORM == 'gcc':
+if rtconfig.PLATFORM == 'gcc' and GetDepend('RT_USING_LIBC'):
+ if GetDepend('RT_USING_MUSL'):
+ # musl libc is used as a software library.
+ src = []
+ LIBS = []
+ elif not GetDepend('RT_USING_NEWLIB'):
+ # RT_USING_NEWLIB is defined already
+ CPPDEFINES = ['RT_USING_NEWLIB']
+
group = DefineGroup('newlib', src, depend = ['RT_USING_LIBC'],
CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES, LIBS = LIBS)
diff --git a/components/libc/compilers/newlib/syscalls.c b/components/libc/compilers/newlib/syscalls.c
index 228fa0d140e0ce39dbc7968b974123313a11fdc3..aac6ff1d0b8aecc50920786f830ef9a0d98b4092 100644
--- a/components/libc/compilers/newlib/syscalls.c
+++ b/components/libc/compilers/newlib/syscalls.c
@@ -431,7 +431,7 @@ void abort(void)
rt_thread_t self = rt_thread_self();
rt_kprintf("thread:%-8.*s abort!\n", RT_NAME_MAX, self->name);
- rt_thread_suspend(self);
+ rt_thread_suspend_with_flag(self, RT_UNINTERRUPTIBLE);
rt_schedule();
}
diff --git a/components/libc/libdl/dlmodule.c b/components/libc/libdl/dlmodule.c
index 314cf52709f691e68f3d8f83dfab8612e64b36ea..3c513acc277eee58c54d17d7c31047d5d829267d 100644
--- a/components/libc/libdl/dlmodule.c
+++ b/components/libc/libdl/dlmodule.c
@@ -128,7 +128,7 @@ static void _dlmodule_exit(void)
(thread->stat & RT_THREAD_STAT_MASK) != RT_THREAD_INIT)
{
rt_timer_stop(&(thread->thread_timer));
- rt_thread_suspend(thread);
+ rt_thread_suspend_with_flag(thread, RT_UNINTERRUPTIBLE);
}
}
}
diff --git a/components/lwp/Kconfig b/components/lwp/Kconfig
index 1b37829935e70a2d6e3f9ed2019eccefdf7b4a3f..609dabd37e429c285f499f1a198815b7ee4d35e5 100644
--- a/components/lwp/Kconfig
+++ b/components/lwp/Kconfig
@@ -6,3 +6,29 @@ config RT_USING_LWP
default n
help
The lwP is a light weight process running in user mode.
+
+if RT_USING_LWP
+ config RT_LWP_MAX_NR
+ int "The max number of light-weight process"
+ default 30
+endif
+
+config RT_USING_GDBSERVER
+ bool "Using gdbserver"
+ default y
+ depends on RT_USING_USERSPACE
+
+config RT_CH_MSG_MAX_NR
+ int "The maximum number of channel messages"
+ default 1024
+ depends on RT_USING_LWP
+
+config RT_LWP_SHM_MAX_NR
+ int "The maximum number of shared memory"
+ default 64
+ depends on RT_USING_LWP
+
+config LWP_CONSOLE_INPUT_BUFFER_SIZE
+ int "The input buffer size of lwp console device"
+ default 1024
+ depends on RT_USING_LWP
diff --git a/components/lwp/SConscript b/components/lwp/SConscript
index f151f3b92e17146f34b8ce69718ec42f71452fd2..f965c4c8c2009da395dcf5cb6c4f0323c8994343 100644
--- a/components/lwp/SConscript
+++ b/components/lwp/SConscript
@@ -8,12 +8,15 @@ CPPPATH = [cwd]
support_arch = {"arm": ["cortex-m3", "cortex-m4", "cortex-m7", "arm926", "cortex-a"]}
platform_file = {'armcc': 'rvds.S', 'gcc': 'gcc.S', 'iar': 'iar.S'}
-if rtconfig.PLATFORM in platform_file.keys(): # support platforms
+if rtconfig.PLATFORM in platform_file.keys(): # support platforms
if rtconfig.ARCH in support_arch.keys() and rtconfig.CPU in support_arch[rtconfig.ARCH]:
# arch/arm/cortex-m7/lwp_gcc.S
asm_path = 'arch/' + rtconfig.ARCH + '/' + rtconfig.CPU + '/*_' + platform_file[rtconfig.PLATFORM]
- src = Glob('*.c') + Glob(asm_path)
+ arch_common = 'arch/' + rtconfig.ARCH + '/' + 'common/*.c'
+ src = Glob('*.c') + Glob(asm_path) + Glob(arch_common)
+ src += Glob('arch/' + rtconfig.ARCH + '/' + rtconfig.CPU + '/*.c')
CPPPATH = [cwd]
+ CPPPATH += ['arch/' + rtconfig.ARCH + '/' + rtconfig.CPU]
group = DefineGroup('lwP', src, depend = ['RT_USING_LWP'], CPPPATH = CPPPATH)
diff --git a/components/lwp/arch/arm/arm926/lwp_gcc.S b/components/lwp/arch/arm/arm926/lwp_gcc.S
deleted file mode 100644
index 2a8ce492ebe20ccebd84e15b0b25c843c7eb9d67..0000000000000000000000000000000000000000
--- a/components/lwp/arch/arm/arm926/lwp_gcc.S
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2018-12-10 Jesven first version
- */
-
-#define Mode_USR 0x10
-#define Mode_FIQ 0x11
-#define Mode_IRQ 0x12
-#define Mode_SVC 0x13
-#define Mode_MON 0x16
-#define Mode_ABT 0x17
-#define Mode_UDF 0x1B
-#define Mode_SYS 0x1F
-
-#define A_Bit 0x100
-#define I_Bit 0x80 @; when I bit is set, IRQ is disabled
-#define F_Bit 0x40 @; when F bit is set, FIQ is disabled
-#define T_Bit 0x20
-
-.cpu arm9
-.syntax unified
-.text
-
-/*
- * void lwp_user_entry(args, text, data);
- */
-.global lwp_user_entry
-.type lwp_user_entry, % function
-lwp_user_entry:
- mrs r9, cpsr
- mov r8, r9
- bic r9, #0x1f
- orr r9, #Mode_USR
-
- orr r8, #I_Bit
- msr cpsr_c, r8
-
- msr spsr, r9
-
- /* set data address. */
- mov r9, r2
- movs pc, r1
-
-/*
- * void SVC_Handler(void);
- */
-.global SVC_Handler
-.type SVC_Handler, % function
-SVC_Handler:
- push {lr}
- mrs lr, spsr
- push {r4, r5, lr}
-
- mrs r4, cpsr
- bic r4, #I_Bit
- msr cpsr_c, r4
-
- push {r0 - r3, r12}
- and r0, r7, #0xff
- bl lwp_get_sys_api
- cmp r0, #0 /* r0 = api */
- mov r4, r0
- pop {r0 - r3, r12}
- beq svc_exit
- ldr lr, = svc_exit
- bx r4
-
-svc_exit:
- mrs r4, cpsr
- orr r4, #I_Bit
- msr cpsr_c, r4
-
- pop {r4, r5, lr}
- msr spsr_cxsf, lr
- pop {lr}
- movs pc, lr
diff --git a/components/lwp/arch/arm/common/reloc.c b/components/lwp/arch/arm/common/reloc.c
new file mode 100644
index 0000000000000000000000000000000000000000..cab0b76fd793eca96c1a1fefa6feaa0506c81904
--- /dev/null
+++ b/components/lwp/arch/arm/common/reloc.c
@@ -0,0 +1,120 @@
+#include
+#include
+#include
+#include
+#ifdef RT_USING_USERSPACE
+#include
+#include
+#endif
+
+typedef struct
+{
+ Elf32_Word st_name;
+ Elf32_Addr st_value;
+ Elf32_Word st_size;
+ unsigned char st_info;
+ unsigned char st_other;
+ Elf32_Half st_shndx;
+} Elf32_sym;
+
+#ifdef RT_USING_USERSPACE
+void lwp_elf_reloc(rt_mmu_info *m_info, void *text_start, void *rel_dyn_start, size_t rel_dyn_size, void *got_start, size_t got_size, Elf32_sym *dynsym)
+{
+ size_t rel_off;
+ void* addr;
+
+ if (rel_dyn_size && !dynsym)
+ {
+ return;
+ }
+ for (rel_off = 0; rel_off < rel_dyn_size; rel_off += 8)
+ {
+ uint32_t v1, v2;
+
+ /*
+ memcpy(&v1, rel_dyn_start + rel_off, 4);
+ memcpy(&v2, rel_dyn_start + rel_off + 4, 4);
+ */
+
+ addr = rt_hw_mmu_v2p(m_info, (void*)((char*)rel_dyn_start + rel_off));
+ addr = (void*)((char*)addr - PV_OFFSET);
+ memcpy(&v1, addr, 4);
+ addr = rt_hw_mmu_v2p(m_info, (void*)((char*)rel_dyn_start + rel_off + 4));
+ addr = (void*)((char*)addr - PV_OFFSET);
+ memcpy(&v2, addr, 4);
+
+ addr = rt_hw_mmu_v2p(m_info, (void*)((char*)text_start + v1));
+ addr = (void*)((char*)addr - PV_OFFSET);
+ if ((v2 & 0xff) == R_ARM_RELATIVE)
+ {
+ // *(uint32_t*)(text_start + v1) += (uint32_t)text_start;
+ *(uint32_t*)addr += (uint32_t)text_start;
+ }
+ else if ((v2 & 0xff) == R_ARM_ABS32)
+ {
+ uint32_t t;
+ t = (v2 >> 8);
+ if (t) /* 0 is UDF */
+ {
+ // *(uint32_t*)(text_start + v1) = (uint32_t)(text_start + dynsym[t].st_value);
+ *(uint32_t*)addr = (uint32_t)((char*)text_start + dynsym[t].st_value);
+ }
+ }
+ }
+ /* modify got */
+ if (got_size)
+ {
+ uint32_t *got_item = (uint32_t*)got_start;
+
+ for (rel_off = 0; rel_off < got_size; rel_off += 4, got_item++)
+ {
+ //*got_item += (uint32_t)text_start;
+ addr = rt_hw_mmu_v2p(m_info, got_item);
+ addr = (void*)((char*)addr - PV_OFFSET);
+ *(uint32_t *)addr += (uint32_t)text_start;
+ }
+ }
+}
+#else
+
+void lwp_elf_reloc(void *text_start, void *rel_dyn_start, size_t rel_dyn_size, void *got_start, size_t got_size, Elf32_sym *dynsym)
+{
+ size_t rel_off;
+
+ if (rel_dyn_size && !dynsym)
+ {
+ return;
+ }
+ for (rel_off = 0; rel_off < rel_dyn_size; rel_off += 8)
+ {
+ uint32_t v1, v2;
+
+ memcpy(&v1, (void*)((char*)rel_dyn_start + rel_off), 4);
+ memcpy(&v2, (void*)((char*)rel_dyn_start + rel_off + 4), 4);
+
+ if ((v2 & 0xff) == R_ARM_RELATIVE)
+ {
+ *(uint32_t*)((char*)text_start + v1) += (uint32_t)text_start;
+ }
+ else if ((v2 & 0xff) == R_ARM_ABS32)
+ {
+ uint32_t t;
+ t = (v2 >> 8);
+ if (t) /* 0 is UDF */
+ {
+ *(uint32_t*)((char*)text_start + v1) = (uint32_t)((char*)text_start + dynsym[t].st_value);
+ }
+ }
+ }
+ /* modify got */
+ if (got_size)
+ {
+ uint32_t *got_item = (uint32_t*)got_start;
+
+ for (rel_off = 0; rel_off < got_size; rel_off += 4, got_item++)
+ {
+ *got_item += (uint32_t)text_start;
+ }
+ }
+}
+#endif
diff --git a/components/lwp/arch/arm/cortex-a/arch_user_space_init.c b/components/lwp/arch/arm/cortex-a/arch_user_space_init.c
new file mode 100644
index 0000000000000000000000000000000000000000..7a2f612aab3a8b2eb9dbbd41b63178201a6b4d2c
--- /dev/null
+++ b/components/lwp/arch/arm/cortex-a/arch_user_space_init.c
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-10-28 Jesven first version
+ */
+
+#include
+#include
+
+#ifdef RT_USING_USERSPACE
+
+#include
+#include
+#include
+#include
+#include
+
+extern size_t MMUTable[];
+
+int arch_user_space_init(struct rt_lwp *lwp)
+{
+ size_t *mmu_table;
+
+ mmu_table = (size_t*)rt_pages_alloc(2);
+ if (!mmu_table)
+ {
+ return -1;
+ }
+
+ lwp->end_heap = USER_HEAP_VADDR;
+ memcpy(mmu_table + (KERNEL_VADDR_START >> ARCH_SECTION_SHIFT), MMUTable + (KERNEL_VADDR_START >> ARCH_SECTION_SHIFT), ARCH_PAGE_SIZE);
+ memset(mmu_table, 0, 3 * ARCH_PAGE_SIZE);
+ rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, mmu_table, 4 * ARCH_PAGE_SIZE);
+ rt_hw_mmu_map_init(&lwp->mmu_info, (void*)USER_VADDR_START, KERNEL_VADDR_START - USER_VADDR_START, mmu_table, PV_OFFSET);
+
+ return 0;
+}
+
+void *arch_kernel_mmu_table_get(void)
+{
+ return (void*)((char*)MMUTable + PV_OFFSET);
+}
+
+void arch_kuser_init(rt_mmu_info *mmu_info, void *vectors)
+{
+ extern char __kuser_helper_start[], __kuser_helper_end[];
+ int kuser_sz = __kuser_helper_end - __kuser_helper_start;
+
+ rt_hw_mmu_map_auto(mmu_info, vectors, 0x1000, MMU_MAP_U_RO);
+
+ rt_memcpy((void*)((char*)vectors + 0x1000 - kuser_sz), __kuser_helper_start, kuser_sz);
+ /*
+ * vectors + 0xfe0 = __kuser_get_tls
+ * vectors + 0xfe8 = hardware TLS instruction at 0xffff0fe8
+ */
+ rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, (void*)((char*)vectors + 0x1000 - kuser_sz), kuser_sz);
+ rt_hw_cpu_icache_ops(RT_HW_CACHE_INVALIDATE, (void*)((char*)vectors + 0x1000 - kuser_sz), kuser_sz);
+}
+#endif
diff --git a/components/lwp/arch/arm/cortex-a/arch_user_stack.c b/components/lwp/arch/arm/cortex-a/arch_user_stack.c
new file mode 100644
index 0000000000000000000000000000000000000000..8911da82096b81ec8b28459d14bd5b4fdcecf46c
--- /dev/null
+++ b/components/lwp/arch/arm/cortex-a/arch_user_stack.c
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-11-18 Jesven first version
+ */
+
+#include
+#include
+
+#ifdef RT_USING_USERSPACE
+
+#include
+#include
+#include
+#include
+#include
+
+int arch_expand_user_stack(void *addr)
+{
+ int ret = 0;
+ size_t stack_addr = (size_t)addr;
+
+ stack_addr &= ~ARCH_PAGE_MASK;
+ if ((stack_addr >= (size_t)USER_STACK_VSTART) && (stack_addr < (size_t)USER_STACK_VEND))
+ {
+ void *map = lwp_map_user(lwp_self(), (void*)stack_addr, ARCH_PAGE_SIZE);
+
+ if (map || lwp_user_accessable(addr, 1))
+ {
+ ret = 1;
+ }
+ }
+ return ret;
+}
+#endif
diff --git a/components/lwp/arch/arm/cortex-a/lwp_arch.h b/components/lwp/arch/arm/cortex-a/lwp_arch.h
new file mode 100644
index 0000000000000000000000000000000000000000..22a0f1fc6cabb04035e47dc544269faa70c17ce0
--- /dev/null
+++ b/components/lwp/arch/arm/cortex-a/lwp_arch.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ */
+
+#ifndef LWP_ARCH_H__
+#define LWP_ARCH_H__
+
+#include
+
+#ifdef RT_USING_USERSPACE
+
+#define USER_HEAP_VADDR 0x80000000
+#define USER_STACK_VSTART 0x70000000
+#define USER_STACK_VEND USER_HEAP_VADDR
+#define USER_VADDR_START 0x00100000
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int arch_user_space_init(struct rt_lwp *lwp);
+void *arch_kernel_mmu_table_get(void);
+void arch_kuser_init(rt_mmu_info *mmu_info, void *vectors);
+int arch_expand_user_stack(void *addr);
+
+rt_inline unsigned long ffz(unsigned long x)
+{
+ return __builtin_ffs(~x) - 1;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#endif /*LWP_ARCH_H__*/
diff --git a/components/lwp/arch/arm/cortex-a/lwp_gcc.S b/components/lwp/arch/arm/cortex-a/lwp_gcc.S
index 395974a2b72a266341e8bffa387a040a8a87b932..cad967fa04cd5dbdf6f3f22bfe3e3f5b3e88cfea 100644
--- a/components/lwp/arch/arm/cortex-a/lwp_gcc.S
+++ b/components/lwp/arch/arm/cortex-a/lwp_gcc.S
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -8,6 +8,8 @@
* 2018-12-10 Jesven first version
*/
+#include "rtconfig.h"
+
#define Mode_USR 0x10
#define Mode_FIQ 0x11
#define Mode_IRQ 0x12
@@ -38,10 +40,28 @@ lwp_user_entry:
cpsid i
msr spsr, r9
+ ldr r3, =0x80000000 ;/* user stack top */
/* set data address. */
- mov r9, r2
movs pc, r1
+.global set_user_context
+set_user_context:
+ cps #Mode_SYS
+ sub sp, r0, #12
+ ldr r0, =lwp_thread_return
+ ldr r1, [r0]
+ str r1, [sp]
+ ldr r1, [r0, #4]
+ str r1, [sp, #4]
+ ldr r1, [r0, #8]
+ str r1, [sp, #8]
+ mov lr, sp
+ mov r0, #0
+ mcr p15, 0, r0, c7, c5, 0 ;//iciallu
+ dsb
+ cps #Mode_SVC
+ mov pc, lr
+
/*
* void SVC_Handler(void);
*/
@@ -51,10 +71,18 @@ vector_swi:
push {lr}
mrs lr, spsr
push {r4, r5, lr}
+ tst lr, #(1 << 7) /* mask irq ? */
+ bne 1f
cpsie i
-
+1:
push {r0 - r3, r12}
and r0, r7, #0xff
+ cmp r0, #0xfe
+ beq lwp_signal_quit
+#ifdef RT_USING_GDBSERVER
+ cmp r0, #0xff
+ beq ret_from_user
+#endif
bl lwp_get_sys_api
cmp r0, #0 /* r0 = api */
mov lr, r0
@@ -63,8 +91,230 @@ vector_swi:
blx lr
svc_exit:
+ mrs r4, cpsr
cpsid i
+ tst r4, #(1 << 7) /* mask irq ? */
pop {r4, r5, lr}
+ orrne lr, #(1 << 7)
msr spsr_cxsf, lr
pop {lr}
+
+.global ret_to_user
+ret_to_user:
+ push {r0-r3, r12, lr}
+ bl lwp_signal_check
+ cmp r0, #0
+ pop {r0-r3, r12, lr}
+ bne user_do_signal
+
+ movs pc, lr
+
+#ifdef RT_USING_LWP
+.global lwp_check_exit
+lwp_check_exit:
+ push {r0 - r12, lr}
+ bl lwp_check_exit_request
+ cmp r0, #0
+ beq 1f
+ mov r0, #0
+ bl sys_exit
+1:
+ pop {r0 - r12, pc}
+#endif
+
+#ifdef RT_USING_GDBSERVER
+.global lwp_check_debug
+lwp_check_debug:
+ push {r0 - r12, lr}
+ bl lwp_check_debug_suspend
+ cmp r0, #0
+ beq lwp_check_debug_quit
+
+ cps #Mode_SYS
+ sub sp, #8
+ ldr r0, =lwp_debugreturn
+ ldr r1, [r0]
+ str r1, [sp]
+ ldr r1, [r0, #4]
+ str r1, [sp, #4]
+ mov r0, #0
+ mcr p15, 0, r0, c7, c5, 0 ;//iciallu
+ dsb
+ isb
+ mov r0, sp /* lwp_debugreturn */
+ cps #Mode_SVC
+
+ mrs r1, spsr
+ push {r1}
+ mov r1, #Mode_USR
+ msr spsr_cxsf, r1
+ movs pc, r0
+ret_from_user:
+ cps #Mode_SYS
+ add sp, #8
+ cps #Mode_SVC
+ /*
+ pop {r0 - r3, r12}
+ pop {r4 - r6, lr}
+ */
+ add sp, #(4*9)
+ pop {r4}
+ msr spsr_cxsf, r4
+lwp_check_debug_quit:
+ pop {r0 - r12, pc}
+#endif
+
+lwp_signal_quit:
+ cpsid i
+ pop {r0 - r3, r12}
+ pop {r4, r5, lr}
+ pop {lr}
+ bl lwp_signal_restore
+ /* r0 is user_ctx : ori sp, pc, cpsr*/
+ ldr r1, [r0]
+ ldr r2, [r0, #4]
+ ldr r3, [r0, #8]
+ msr spsr_cxsf, r3
+ mov lr, r2
+ cps #Mode_SYS
+ mov sp, r1
+ pop {r0-r12, lr}
+ cps #Mode_SVC
+ b ret_to_user
+
+user_do_signal:
+ mov r0, r0
+ cps #Mode_SYS
+ push {r0-r12, lr}
+
+ sub sp, #8
+ ldr r0, =lwp_sigreturn
+ ldr r1, [r0]
+ str r1, [sp]
+ ldr r1, [r0, #4]
+ str r1, [sp, #4]
+ mov r0, #0
+ mcr p15, 0, r0, c7, c5, 0 ;//iciallu
+ dsb
+
+ mov r5, sp ;//if func is 0
+ mov lr, sp
+
+ add r0, sp, #8 /* lwp_sigreturn */
+ cps #Mode_SVC
+ mov r1, lr
+ mrs r2, spsr
+ bl lwp_signal_backup
+ /* r0 is signal */
+ mov r4, r0
+ bl lwp_sighandler_get
+ mov lr, r0
+ cmp lr, #0
+ moveq lr, r5
+ mov r0, r4
movs pc, lr
+
+lwp_debugreturn:
+ mov r7, #0xff
+ svc #0
+
+lwp_sigreturn:
+ mov r7, #0xfe
+ svc #0
+
+lwp_thread_return:
+ mov r0, #0
+ mov r7, #0x01
+ svc #0
+
+.global check_vfp
+check_vfp:
+#ifdef RT_USING_FPU
+ vmrs r0, fpexc
+ ubfx r0, r0, #30, #1
+#else
+ mov r0, #0
+#endif
+ mov pc, lr
+
+.global get_vfp
+get_vfp:
+#ifdef RT_USING_FPU
+ vstmia r0!, {d0-d15}
+ vstmia r0!, {d16-d31}
+ vmrs r1, fpscr
+ str r1, [r0]
+#endif
+ mov pc, lr
+
+.globl rt_cpu_get_thread_idr
+rt_cpu_get_thread_idr:
+ mrc p15, 0, r0, c13, c0, 3
+ bx lr
+
+.global lwp_set_thread_area
+lwp_set_thread_area:
+.globl rt_cpu_set_thread_idr
+rt_cpu_set_thread_idr:
+ mcr p15, 0, r0, c13, c0, 3
+ bx lr
+
+/* kuser suppurt */
+ .macro kuser_pad, sym, size
+ .if (. - \sym) & 3
+ .rept 4 - (. - \sym) & 3
+ .byte 0
+ .endr
+ .endif
+ .rept (\size - (. - \sym)) / 4
+ .word 0xe7fddef1
+ .endr
+ .endm
+
+.align 5
+.globl __kuser_helper_start
+__kuser_helper_start:
+__kuser_cmpxchg64: @ 0xffff0f60
+ stmfd sp!, {r4, r5, r6, lr}
+ ldmia r0, {r4, r5} @ load old val
+ ldmia r1, {r6, lr} @ load new val
+1: ldmia r2, {r0, r1} @ load current val
+ eors r3, r0, r4 @ compare with oldval (1)
+ eorseq r3, r1, r5 @ compare with oldval (2)
+2: stmiaeq r2, {r6, lr} @ store newval if eq
+ rsbs r0, r3, #0 @ set return val and C flag
+ ldmfd sp!, {r4, r5, r6, pc}
+
+ kuser_pad __kuser_cmpxchg64, 64
+
+__kuser_memory_barrier: @ 0xffff0fa0
+ dmb
+ mov pc, lr
+
+ kuser_pad __kuser_memory_barrier, 32
+
+__kuser_cmpxchg: @ 0xffff0fc0
+1: ldr r3, [r2] @ load current val
+ subs r3, r3, r0 @ compare with oldval
+2: streq r1, [r2] @ store newval if eq
+ rsbs r0, r3, #0 @ set return val and C flag
+ mov pc, lr
+
+kuser_pad __kuser_cmpxchg, 32
+
+__kuser_get_tls: @ 0xffff0fe0
+ mrc p15, 0, r0, c13, c0, 3 @ 0xffff0fe8 hardware TLS code
+ mov pc, lr
+ ldr r0, [pc, #(16 - 8)] @ read TLS, set in kuser_get_tls_init
+
+ kuser_pad __kuser_get_tls, 16
+
+ .rep 3
+ .word 0 @ 0xffff0ff0 software TLS value, then
+ .endr @ pad up to __kuser_helper_version
+
+__kuser_helper_version: @ 0xffff0ffc
+ .word ((__kuser_helper_end - __kuser_helper_start) >> 5)
+
+ .globl __kuser_helper_end
+__kuser_helper_end:
diff --git a/components/lwp/arch/arm/cortex-a9/lwp_gcc.S b/components/lwp/arch/arm/cortex-a9/lwp_gcc.S
deleted file mode 100644
index 93e88f7c97a2f811f6fbf4f0ac8231c6cdfcf8c7..0000000000000000000000000000000000000000
--- a/components/lwp/arch/arm/cortex-a9/lwp_gcc.S
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2018-12-10 Jesven first version
- */
-
-#define Mode_USR 0x10
-#define Mode_FIQ 0x11
-#define Mode_IRQ 0x12
-#define Mode_SVC 0x13
-#define Mode_MON 0x16
-#define Mode_ABT 0x17
-#define Mode_UDF 0x1B
-#define Mode_SYS 0x1F
-
-#define A_Bit 0x100
-#define I_Bit 0x80 @; when I bit is set, IRQ is disabled
-#define F_Bit 0x40 @; when F bit is set, FIQ is disabled
-#define T_Bit 0x20
-
-.cpu cortex-a9
-.syntax unified
-.text
-
-/*
- * void lwp_user_entry(args, text, data);
- */
-.global lwp_user_entry
-.type lwp_user_entry, % function
-lwp_user_entry:
- mrs r9, cpsr
- bic r9, #0x1f
- orr r9, #Mode_USR
- cpsid i
- msr spsr, r9
-
- /* set data address. */
- mov r9, r2
- movs pc, r1
-
-/*
- * void vector_swi(void);
- */
-.global vector_swi
-.type vector_swi, % function
-vector_swi:
- push {lr}
- mrs lr, spsr
- push {r4, r5, lr}
- cpsie i
-
- push {r0 - r3, r12}
- and r0, r7, #0xff
- bl lwp_get_sys_api
- cmp r0, #0 /* r0 = api */
- mov lr, r0
- pop {r0 - r3, r12}
- beq svc_exit
- blx lr
-
-svc_exit:
- cpsid i
- pop {r4, r5, lr}
- msr spsr_cxsf, lr
- pop {lr}
- movs pc, lr
diff --git a/components/lwp/arch/arm/cortex-m3/lwp_gcc.S b/components/lwp/arch/arm/cortex-m3/lwp_gcc.S
deleted file mode 100644
index 846b06bb263fa5cdd9dcb904df3e4e24edafef0a..0000000000000000000000000000000000000000
--- a/components/lwp/arch/arm/cortex-m3/lwp_gcc.S
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2018-10-30 heyuanjie first version
- */
-
-.cpu cortex-m3
-.syntax unified
-.thumb
-.text
-
-/*
- * void* lwp_get_sys_api(rt_uint32_t number);
- */
-.global lwp_get_sys_api
-.global lwp_get_kernel_sp
-.global lwp_set_kernel_sp
-
-
-/*
- * void lwp_user_entry(args, text, data);
- */
-.global lwp_user_entry
-.type lwp_user_entry, % function
-lwp_user_entry:
- PUSH {R0-R3} @; push text&data addr.
-
- MOV R0, SP @; v1 = SP
- BL lwp_set_kernel_sp @; lwp_set_kernel_sp(v1)
-
- @; set CPU to user-thread mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03 @; use PSP, user-thread mode.
- MSR CONTROL, R2
-
- POP {R0-R3} @; pop app address to R1.
- @; set data address.
- MOV R9, R2
-
- @; run app, only Thumb-mode.
- ORR R1, R1, #0x01
- BX R1
-
-/*
- * void SVC_Handler(void);
- */
-.global SVC_Handler
-.type SVC_Handler, % function
-SVC_Handler:
- PUSH {LR}
-
- @; get user SP.
- TST LR, #0x4
- ITE EQ
- MRSEQ R1, MSP
- MRSNE R1, PSP
- PUSH {R1} @; push app SP.
-
- @; get SVC number.
- mov R0, R7
-
- @; get kernel system API
- BL lwp_get_sys_api
-
- PUSH {R0} @; push api
-
- @; get kernel SP to R0.
- BL lwp_get_kernel_sp
-
- POP {R2} @; pop api to R2.
- POP {R1} @; pop app SP to R1.
-
- stmfd r0!, {r1} @; save app SP to kernel SP
-
- @;push app parm5~6 to kernel SP
- STMFD R0!, {R4 - R5}
- @; copy R1(app SP) to R0(kernel SP).
- push {r8-r11}
- LDMFD R1, {R4 - R11} @; pop exception_stack_frame to r4 - r11 register
- STMFD R0!, {R4 - R11} @; push exception_stack_frame to server SP.
- pop {r8-r11}
-
- LDR R3, =svc_exit
- STR R3, [R0, #20] @; update LR
- STR R2, [R0, #24] @; update api to PC
- MSR PSP, R0 @; update SP, API is executed with kernel SP
-
- @; set to thread-privilege mode.
- MRS R3, CONTROL
- BIC R3, R3, #0x01
- ORR R3, R3, #0x02
- MSR CONTROL, R3
-
- POP {LR} @; 0xFFFFFFED
- ORR LR, LR, #0x10
- BX LR
-/*
-* void svc_exit(void);
-*/
-.global svc_exit
-.type svc_exit, % function
-svc_exit:
- @; get user SP.
- PUSH {R0} @; push result to SP.
- BL lwp_get_kernel_sp
- ldr r3, [r0, #-4]
- pop {r0}
-
- ldr lr, [r3, #20]
- ldr r1, [r3, #24] @; load pc
- add r3, #32 @; exception_stack_frame size
- MSR PSP, R3 @; restore app stack pointer
- @; restore to PSP & thread-unprivilege mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03
- MSR CONTROL, R2
-
- @; return to lwp.
- ORR R1, R1, #0x01 @; only Thumb-mode.
- BX R1 @; return to user app.
diff --git a/components/lwp/arch/arm/cortex-m3/lwp_iar.S b/components/lwp/arch/arm/cortex-m3/lwp_iar.S
deleted file mode 100644
index a2185693758ec21051ad5dba267ad518270ff5e6..0000000000000000000000000000000000000000
--- a/components/lwp/arch/arm/cortex-m3/lwp_iar.S
+++ /dev/null
@@ -1,123 +0,0 @@
-;/*
-; * Copyright (c) 2006-2018, RT-Thread Development Team
-; *
-; * SPDX-License-Identifier: Apache-2.0
-; *
-; * Change Logs:
-; * Date Author Notes
-; * 2018-10-30 heyuanjie first version
-; */
-
- SECTION .text:CODE(2)
- THUMB
- REQUIRE8
- PRESERVE8
-
-;/*
-; * void* lwp_get_sys_api(rt_uint32_t number);
-; */
- IMPORT lwp_get_sys_api
- IMPORT lwp_get_kernel_sp
- IMPORT lwp_set_kernel_sp
-
-;/*
-; * void lwp_user_entry(args, text, data);
-; */
- EXPORT lwp_user_entry
-lwp_user_entry:
- PUSH {R0-R3} ; push text&data addr.
-
- MOV R0, SP ; v1 = SP
- BL lwp_set_kernel_sp ; lwp_set_kernel_sp(v1)
-
- ; set CPU to user-thread mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03 ; use PSP, user-thread mode.
- MSR CONTROL, R2
-
- POP {R0-R3} ; pop app address to R1.
- ; set data address.
- MOV R9, R2
-
- ; run app, only Thumb-mode.
- ORR R1, R1, #0x01
- BX R1
-
-;/*
-; * void SVC_Handler(void);
-; */
- EXPORT SVC_Handler
-SVC_Handler:
- PUSH {LR}
-
- ; get user SP.
- TST LR, #0x4
- ITE EQ
- MRSEQ R1, MSP
- MRSNE R1, PSP
- PUSH {R1} ; push app SP.
-
- ; get SVC number.
- mov R0, R7
-
- ; get kernel system API
- BL lwp_get_sys_api
-
- PUSH {R0} ; push api
-
- ; get kernel SP to R0.
- BL lwp_get_kernel_sp
-
- POP {R2} ; pop api to R2.
- POP {R1} ; pop app SP to R1.
-
- stmfd r0!, {r1} ; save app SP to kernel SP
-
- ;push app parm5~6 to kernel SP
- STMFD R0!, {R4 - R5}
- ; copy R1(app SP) to R0(kernel SP).
- push {r8-r11}
- LDMFD R1, {R4 - R11} ; pop exception_stack_frame to r4 - r11 register
- STMFD R0!, {R4 - R11} ; push exception_stack_frame to server SP.
- pop {r8-r11}
-
- LDR R3, =svc_exit
- STR R3, [R0, #20] ; update LR
- STR R2, [R0, #24] ; update api to PC
- MSR PSP, R0 ; update SP, API is executed with kernel SP
-
- ; set to thread-privilege mode.
- MRS R3, CONTROL
- BIC R3, R3, #0x01
- ORR R3, R3, #0x02
- MSR CONTROL, R3
-
- POP {LR} ; 0xFFFFFFED
- ORR LR, LR, #0x10
- BX LR
-
-;/*
-; * void svc_exit(void);
-; */
- EXPORT svc_exit
-svc_exit:
- ; get user SP.
- PUSH {R0} ; push result to SP.
- BL lwp_get_kernel_sp
- ldr r3, [r0, #-4]
- pop {r0}
-
- ldr lr, [r3, #20]
- ldr r1, [r3, #24] ; load pc
- add r3, r3, #32 ; exception_stack_frame size
- MSR PSP, R3 ; restore app stack pointer
- ; restore to PSP & thread-unprivilege mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03
- MSR CONTROL, R2
-
- ; return to lwp.
- ORR R1, R1, #0x01 ; only Thumb-mode.
- BX R1 ; return to user app.
-
- END
diff --git a/components/lwp/arch/arm/cortex-m3/lwp_rvds.S b/components/lwp/arch/arm/cortex-m3/lwp_rvds.S
deleted file mode 100644
index 246751a84729b17f39e3405fb4ea5a02748f0d13..0000000000000000000000000000000000000000
--- a/components/lwp/arch/arm/cortex-m3/lwp_rvds.S
+++ /dev/null
@@ -1,135 +0,0 @@
-;/*
-; * Copyright (c) 2006-2018, RT-Thread Development Team
-; *
-; * SPDX-License-Identifier: Apache-2.0
-; *
-; * Change Logs:
-; * Date Author Notes
-; * 2018-10-30 heyuanjie first version
-; */
-
- AREA |.text|, CODE, READONLY, ALIGN=2
- THUMB
- REQUIRE8
- PRESERVE8
-
-;/*
-; * void* lwp_get_sys_api(rt_uint32_t number);
-; */
- IMPORT lwp_get_sys_api
- IMPORT lwp_get_kernel_sp
- IMPORT lwp_set_kernel_sp
-
-;/*
-; * void lwp_user_entry(args, text, data);
-; */
-lwp_user_entry PROC
- EXPORT lwp_user_entry
-
- PUSH {R0-R3} ; push text&data addr.
-
- MOV R0, SP ; v1 = SP
- BL lwp_set_kernel_sp ; lwp_set_kernel_sp(v1)
-
- ; set CPU to user-thread mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03 ; use PSP, user-thread mode.
- MSR CONTROL, R2
-
- POP {R0-R3} ; pop app address to R1.
- ; set data address.
- MOV R9, R2
-
- ; run app, only Thumb-mode.
- ORR R1, R1, #0x01
- BX R1
-
- ; never reach here!
- ENDP
-
-;/*
-; * void SVC_Handler(void);
-; */
-SVC_Handler PROC
- EXPORT SVC_Handler
-
- PUSH {LR}
-
- ; get user SP.
- TST LR, #0x4
- ITE EQ
- MRSEQ R1, MSP
- MRSNE R1, PSP
- PUSH {R1} ; push app SP.
-
- ; get SVC number.
- mov R0, R7
-
- ; get kernel system API
- BL lwp_get_sys_api
-
- PUSH {R0} ; push api
-
- ; get kernel SP to R0.
- BL lwp_get_kernel_sp
-
- POP {R2} ; pop api to R2.
- POP {R1} ; pop app SP to R1.
-
- stmfd r0!, {r1} ; save app SP to kernel SP
-
- ;push app parm5~6 to kernel SP
- STMFD R0!, {R4 - R5}
- ; copy R1(app SP) to R0(kernel SP).
- push {r8-r11}
- LDMFD R1, {R4 - R11} ; pop exception_stack_frame to r4 - r11 register
- STMFD R0!, {R4 - R11} ; push exception_stack_frame to server SP.
- pop {r8-r11}
-
- LDR R3, =svc_exit
- STR R3, [R0, #20] ; update LR
- STR R2, [R0, #24] ; update api to PC
- MSR PSP, R0 ; update SP, API is executed with kernel SP
-
- ; set to thread-privilege mode.
- MRS R3, CONTROL
- BIC R3, R3, #0x01
- ORR R3, R3, #0x02
- MSR CONTROL, R3
-
- POP {LR} ; 0xFFFFFFED
- ORR LR, LR, #0x10
- BX LR
-
- ENDP
-
-;/*
-; * void svc_exit(void);
-; */
-svc_exit PROC
- EXPORT svc_exit
-
- ; get user SP.
- PUSH {R0} ; push result to SP.
- BL lwp_get_kernel_sp
- ldr r3, [r0, #-4]
- pop {r0}
-
- ldr lr, [r3, #20]
- ldr r1, [r3, #24] ; load pc
- add r3, #32 ; exception_stack_frame size
- MSR PSP, R3 ; restore app stack pointer
- ; restore to PSP & thread-unprivilege mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03
- MSR CONTROL, R2
-
- ; return to lwp.
- ORR R1, R1, #0x01 ; only Thumb-mode.
- BX R1 ; return to user app.
-
- ENDP
-
- ALIGN
-
- END
diff --git a/components/lwp/arch/arm/cortex-m4/lwp_gcc.S b/components/lwp/arch/arm/cortex-m4/lwp_gcc.S
deleted file mode 100644
index e71dbb82c9ea16dc7cc9fef81f1aae50182cfb18..0000000000000000000000000000000000000000
--- a/components/lwp/arch/arm/cortex-m4/lwp_gcc.S
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2018-10-30 heyuanjie first version
- */
-
-.cpu cortex-m4
-.syntax unified
-.thumb
-.text
-
-/*
- * void* lwp_get_sys_api(rt_uint32_t number);
- */
-.global lwp_get_sys_api
-.global lwp_get_kernel_sp
-.global lwp_set_kernel_sp
-
-
-/*
- * void lwp_user_entry(args, text, data);
- */
-.global lwp_user_entry
-.type lwp_user_entry, % function
-lwp_user_entry:
- PUSH {R0-R3} @; push text&data addr.
-
- MOV R0, SP @; v1 = SP
- BL lwp_set_kernel_sp @; lwp_set_kernel_sp(v1)
-
- @; set CPU to user-thread mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03 @; use PSP, user-thread mode.
- MSR CONTROL, R2
-
- POP {R0-R3} @; pop app address to R1.
- @; set data address.
- MOV R9, R2
-
- @; run app, only Thumb-mode.
- ORR R1, R1, #0x01
- BX R1
-
-/*
- * void SVC_Handler(void);
- */
-.global SVC_Handler
-.type SVC_Handler, % function
-SVC_Handler:
- PUSH {LR}
-
- @; get user SP.
- TST LR, #0x4
- ITE EQ
- MRSEQ R1, MSP
- MRSNE R1, PSP
- PUSH {R1} @; push app SP.
-
- @; get SVC number.
- mov R0, R7
-
- @; get kernel system API
- BL lwp_get_sys_api
-
- PUSH {R0} @; push api
-
- @; get kernel SP to R0.
- BL lwp_get_kernel_sp
-
- POP {R2} @; pop api to R2.
- POP {R1} @; pop app SP to R1.
-
- stmfd r0!, {r1} @; save app SP to kernel SP
-
- @;push app parm5~6 to kernel SP
- STMFD R0!, {R4 - R5}
- @; copy R1(app SP) to R0(kernel SP).
- push {r8-r11}
- LDMFD R1, {R4 - R11} @; pop exception_stack_frame to r4 - r11 register
- STMFD R0!, {R4 - R11} @; push exception_stack_frame to server SP.
- pop {r8-r11}
-
- LDR R3, =svc_exit
- STR R3, [R0, #20] @; update LR
- STR R2, [R0, #24] @; update api to PC
- MSR PSP, R0 @; update SP, API is executed with kernel SP
-
- @; set to thread-privilege mode.
- MRS R3, CONTROL
- BIC R3, R3, #0x01
- ORR R3, R3, #0x02
- MSR CONTROL, R3
-
- POP {LR} @; 0xFFFFFFED
- ORR LR, LR, #0x10
- BX LR
-/*
-* void svc_exit(void);
-*/
-.global svc_exit
-.type svc_exit, % function
-svc_exit:
- @; get user SP.
- PUSH {R0} @; push result to SP.
- BL lwp_get_kernel_sp
- ldr r3, [r0, #-4]
- pop {r0}
-
- ldr lr, [r3, #20]
- ldr r1, [r3, #24] @; load pc
- add r3, #32 @; exception_stack_frame size
- MSR PSP, R3 @; restore app stack pointer
- @; restore to PSP & thread-unprivilege mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03
- MSR CONTROL, R2
-
- @; return to lwp.
- ORR R1, R1, #0x01 @; only Thumb-mode.
- BX R1 @; return to user app.
diff --git a/components/lwp/arch/arm/cortex-m4/lwp_iar.S b/components/lwp/arch/arm/cortex-m4/lwp_iar.S
deleted file mode 100644
index a2185693758ec21051ad5dba267ad518270ff5e6..0000000000000000000000000000000000000000
--- a/components/lwp/arch/arm/cortex-m4/lwp_iar.S
+++ /dev/null
@@ -1,123 +0,0 @@
-;/*
-; * Copyright (c) 2006-2018, RT-Thread Development Team
-; *
-; * SPDX-License-Identifier: Apache-2.0
-; *
-; * Change Logs:
-; * Date Author Notes
-; * 2018-10-30 heyuanjie first version
-; */
-
- SECTION .text:CODE(2)
- THUMB
- REQUIRE8
- PRESERVE8
-
-;/*
-; * void* lwp_get_sys_api(rt_uint32_t number);
-; */
- IMPORT lwp_get_sys_api
- IMPORT lwp_get_kernel_sp
- IMPORT lwp_set_kernel_sp
-
-;/*
-; * void lwp_user_entry(args, text, data);
-; */
- EXPORT lwp_user_entry
-lwp_user_entry:
- PUSH {R0-R3} ; push text&data addr.
-
- MOV R0, SP ; v1 = SP
- BL lwp_set_kernel_sp ; lwp_set_kernel_sp(v1)
-
- ; set CPU to user-thread mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03 ; use PSP, user-thread mode.
- MSR CONTROL, R2
-
- POP {R0-R3} ; pop app address to R1.
- ; set data address.
- MOV R9, R2
-
- ; run app, only Thumb-mode.
- ORR R1, R1, #0x01
- BX R1
-
-;/*
-; * void SVC_Handler(void);
-; */
- EXPORT SVC_Handler
-SVC_Handler:
- PUSH {LR}
-
- ; get user SP.
- TST LR, #0x4
- ITE EQ
- MRSEQ R1, MSP
- MRSNE R1, PSP
- PUSH {R1} ; push app SP.
-
- ; get SVC number.
- mov R0, R7
-
- ; get kernel system API
- BL lwp_get_sys_api
-
- PUSH {R0} ; push api
-
- ; get kernel SP to R0.
- BL lwp_get_kernel_sp
-
- POP {R2} ; pop api to R2.
- POP {R1} ; pop app SP to R1.
-
- stmfd r0!, {r1} ; save app SP to kernel SP
-
- ;push app parm5~6 to kernel SP
- STMFD R0!, {R4 - R5}
- ; copy R1(app SP) to R0(kernel SP).
- push {r8-r11}
- LDMFD R1, {R4 - R11} ; pop exception_stack_frame to r4 - r11 register
- STMFD R0!, {R4 - R11} ; push exception_stack_frame to server SP.
- pop {r8-r11}
-
- LDR R3, =svc_exit
- STR R3, [R0, #20] ; update LR
- STR R2, [R0, #24] ; update api to PC
- MSR PSP, R0 ; update SP, API is executed with kernel SP
-
- ; set to thread-privilege mode.
- MRS R3, CONTROL
- BIC R3, R3, #0x01
- ORR R3, R3, #0x02
- MSR CONTROL, R3
-
- POP {LR} ; 0xFFFFFFED
- ORR LR, LR, #0x10
- BX LR
-
-;/*
-; * void svc_exit(void);
-; */
- EXPORT svc_exit
-svc_exit:
- ; get user SP.
- PUSH {R0} ; push result to SP.
- BL lwp_get_kernel_sp
- ldr r3, [r0, #-4]
- pop {r0}
-
- ldr lr, [r3, #20]
- ldr r1, [r3, #24] ; load pc
- add r3, r3, #32 ; exception_stack_frame size
- MSR PSP, R3 ; restore app stack pointer
- ; restore to PSP & thread-unprivilege mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03
- MSR CONTROL, R2
-
- ; return to lwp.
- ORR R1, R1, #0x01 ; only Thumb-mode.
- BX R1 ; return to user app.
-
- END
diff --git a/components/lwp/arch/arm/cortex-m4/lwp_rvds.S b/components/lwp/arch/arm/cortex-m4/lwp_rvds.S
deleted file mode 100644
index 246751a84729b17f39e3405fb4ea5a02748f0d13..0000000000000000000000000000000000000000
--- a/components/lwp/arch/arm/cortex-m4/lwp_rvds.S
+++ /dev/null
@@ -1,135 +0,0 @@
-;/*
-; * Copyright (c) 2006-2018, RT-Thread Development Team
-; *
-; * SPDX-License-Identifier: Apache-2.0
-; *
-; * Change Logs:
-; * Date Author Notes
-; * 2018-10-30 heyuanjie first version
-; */
-
- AREA |.text|, CODE, READONLY, ALIGN=2
- THUMB
- REQUIRE8
- PRESERVE8
-
-;/*
-; * void* lwp_get_sys_api(rt_uint32_t number);
-; */
- IMPORT lwp_get_sys_api
- IMPORT lwp_get_kernel_sp
- IMPORT lwp_set_kernel_sp
-
-;/*
-; * void lwp_user_entry(args, text, data);
-; */
-lwp_user_entry PROC
- EXPORT lwp_user_entry
-
- PUSH {R0-R3} ; push text&data addr.
-
- MOV R0, SP ; v1 = SP
- BL lwp_set_kernel_sp ; lwp_set_kernel_sp(v1)
-
- ; set CPU to user-thread mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03 ; use PSP, user-thread mode.
- MSR CONTROL, R2
-
- POP {R0-R3} ; pop app address to R1.
- ; set data address.
- MOV R9, R2
-
- ; run app, only Thumb-mode.
- ORR R1, R1, #0x01
- BX R1
-
- ; never reach here!
- ENDP
-
-;/*
-; * void SVC_Handler(void);
-; */
-SVC_Handler PROC
- EXPORT SVC_Handler
-
- PUSH {LR}
-
- ; get user SP.
- TST LR, #0x4
- ITE EQ
- MRSEQ R1, MSP
- MRSNE R1, PSP
- PUSH {R1} ; push app SP.
-
- ; get SVC number.
- mov R0, R7
-
- ; get kernel system API
- BL lwp_get_sys_api
-
- PUSH {R0} ; push api
-
- ; get kernel SP to R0.
- BL lwp_get_kernel_sp
-
- POP {R2} ; pop api to R2.
- POP {R1} ; pop app SP to R1.
-
- stmfd r0!, {r1} ; save app SP to kernel SP
-
- ;push app parm5~6 to kernel SP
- STMFD R0!, {R4 - R5}
- ; copy R1(app SP) to R0(kernel SP).
- push {r8-r11}
- LDMFD R1, {R4 - R11} ; pop exception_stack_frame to r4 - r11 register
- STMFD R0!, {R4 - R11} ; push exception_stack_frame to server SP.
- pop {r8-r11}
-
- LDR R3, =svc_exit
- STR R3, [R0, #20] ; update LR
- STR R2, [R0, #24] ; update api to PC
- MSR PSP, R0 ; update SP, API is executed with kernel SP
-
- ; set to thread-privilege mode.
- MRS R3, CONTROL
- BIC R3, R3, #0x01
- ORR R3, R3, #0x02
- MSR CONTROL, R3
-
- POP {LR} ; 0xFFFFFFED
- ORR LR, LR, #0x10
- BX LR
-
- ENDP
-
-;/*
-; * void svc_exit(void);
-; */
-svc_exit PROC
- EXPORT svc_exit
-
- ; get user SP.
- PUSH {R0} ; push result to SP.
- BL lwp_get_kernel_sp
- ldr r3, [r0, #-4]
- pop {r0}
-
- ldr lr, [r3, #20]
- ldr r1, [r3, #24] ; load pc
- add r3, #32 ; exception_stack_frame size
- MSR PSP, R3 ; restore app stack pointer
- ; restore to PSP & thread-unprivilege mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03
- MSR CONTROL, R2
-
- ; return to lwp.
- ORR R1, R1, #0x01 ; only Thumb-mode.
- BX R1 ; return to user app.
-
- ENDP
-
- ALIGN
-
- END
diff --git a/components/lwp/arch/arm/cortex-m7/lwp_gcc.S b/components/lwp/arch/arm/cortex-m7/lwp_gcc.S
deleted file mode 100644
index 848c592919554402f9475903d5f10d58cd651c80..0000000000000000000000000000000000000000
--- a/components/lwp/arch/arm/cortex-m7/lwp_gcc.S
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2018-10-30 heyuanjie first version
- */
-
-.cpu cortex-m7
-.syntax unified
-.thumb
-.text
-
-/*
- * void* lwp_get_sys_api(rt_uint32_t number);
- */
-.global lwp_get_sys_api
-.global lwp_get_kernel_sp
-.global lwp_set_kernel_sp
-
-
-/*
- * void lwp_user_entry(args, text, data);
- */
-.global lwp_user_entry
-.type lwp_user_entry, % function
-lwp_user_entry:
- PUSH {R0-R3} @; push text&data addr.
-
- MOV R0, SP @; v1 = SP
- BL lwp_set_kernel_sp @; lwp_set_kernel_sp(v1)
-
- @; set CPU to user-thread mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03 @; use PSP, user-thread mode.
- MSR CONTROL, R2
-
- POP {R0-R3} @; pop app address to R1.
- @; set data address.
- MOV R9, R2
-
- @; run app, only Thumb-mode.
- ORR R1, R1, #0x01
- BX R1
-
-/*
- * void SVC_Handler(void);
- */
-.global SVC_Handler
-.type SVC_Handler, % function
-SVC_Handler:
- PUSH {LR}
-
- @; get user SP.
- TST LR, #0x4
- ITE EQ
- MRSEQ R1, MSP
- MRSNE R1, PSP
- PUSH {R1} @; push app SP.
-
- @; get SVC number.
- mov R0, R7
-
- @; get kernel system API
- BL lwp_get_sys_api
-
- PUSH {R0} @; push api
-
- @; get kernel SP to R0.
- BL lwp_get_kernel_sp
-
- POP {R2} @; pop api to R2.
- POP {R1} @; pop app SP to R1.
-
- stmfd r0!, {r1} @; save app SP to kernel SP
-
- @;push app parm5~6 to kernel SP
- STMFD R0!, {R4 - R5}
- @; copy R1(app SP) to R0(kernel SP).
- push {r8-r11}
- LDMFD R1, {R4 - R11} @; pop exception_stack_frame to r4 - r11 register
- STMFD R0!, {R4 - R11} @; push exception_stack_frame to server SP.
- pop {r8-r11}
-
- LDR R3, =svc_exit
- STR R3, [R0, #20] @; update LR
- STR R2, [R0, #24] @; update api to PC
- MSR PSP, R0 @; update SP, API is executed with kernel SP
-
- @; set to thread-privilege mode.
- MRS R3, CONTROL
- BIC R3, R3, #0x01
- ORR R3, R3, #0x02
- MSR CONTROL, R3
-
- POP {LR} @; 0xFFFFFFED
- ORR LR, LR, #0x10
- BX LR
-/*
-* void svc_exit(void);
-*/
-.global svc_exit
-.type svc_exit, % function
-svc_exit:
- @; get user SP.
- PUSH {R0} @; push result to SP.
- BL lwp_get_kernel_sp
- ldr r3, [r0, #-4]
- pop {r0}
-
- ldr lr, [r3, #20]
- ldr r1, [r3, #24] @; load pc
- add r3, #32 @; exception_stack_frame size
- MSR PSP, R3 @; restore app stack pointer
- @; restore to PSP & thread-unprivilege mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03
- MSR CONTROL, R2
-
- @; return to lwp.
- ORR R1, R1, #0x01 @; only Thumb-mode.
- BX R1 @; return to user app.
diff --git a/components/lwp/arch/arm/cortex-m7/lwp_iar.S b/components/lwp/arch/arm/cortex-m7/lwp_iar.S
deleted file mode 100644
index a2185693758ec21051ad5dba267ad518270ff5e6..0000000000000000000000000000000000000000
--- a/components/lwp/arch/arm/cortex-m7/lwp_iar.S
+++ /dev/null
@@ -1,123 +0,0 @@
-;/*
-; * Copyright (c) 2006-2018, RT-Thread Development Team
-; *
-; * SPDX-License-Identifier: Apache-2.0
-; *
-; * Change Logs:
-; * Date Author Notes
-; * 2018-10-30 heyuanjie first version
-; */
-
- SECTION .text:CODE(2)
- THUMB
- REQUIRE8
- PRESERVE8
-
-;/*
-; * void* lwp_get_sys_api(rt_uint32_t number);
-; */
- IMPORT lwp_get_sys_api
- IMPORT lwp_get_kernel_sp
- IMPORT lwp_set_kernel_sp
-
-;/*
-; * void lwp_user_entry(args, text, data);
-; */
- EXPORT lwp_user_entry
-lwp_user_entry:
- PUSH {R0-R3} ; push text&data addr.
-
- MOV R0, SP ; v1 = SP
- BL lwp_set_kernel_sp ; lwp_set_kernel_sp(v1)
-
- ; set CPU to user-thread mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03 ; use PSP, user-thread mode.
- MSR CONTROL, R2
-
- POP {R0-R3} ; pop app address to R1.
- ; set data address.
- MOV R9, R2
-
- ; run app, only Thumb-mode.
- ORR R1, R1, #0x01
- BX R1
-
-;/*
-; * void SVC_Handler(void);
-; */
- EXPORT SVC_Handler
-SVC_Handler:
- PUSH {LR}
-
- ; get user SP.
- TST LR, #0x4
- ITE EQ
- MRSEQ R1, MSP
- MRSNE R1, PSP
- PUSH {R1} ; push app SP.
-
- ; get SVC number.
- mov R0, R7
-
- ; get kernel system API
- BL lwp_get_sys_api
-
- PUSH {R0} ; push api
-
- ; get kernel SP to R0.
- BL lwp_get_kernel_sp
-
- POP {R2} ; pop api to R2.
- POP {R1} ; pop app SP to R1.
-
- stmfd r0!, {r1} ; save app SP to kernel SP
-
- ;push app parm5~6 to kernel SP
- STMFD R0!, {R4 - R5}
- ; copy R1(app SP) to R0(kernel SP).
- push {r8-r11}
- LDMFD R1, {R4 - R11} ; pop exception_stack_frame to r4 - r11 register
- STMFD R0!, {R4 - R11} ; push exception_stack_frame to server SP.
- pop {r8-r11}
-
- LDR R3, =svc_exit
- STR R3, [R0, #20] ; update LR
- STR R2, [R0, #24] ; update api to PC
- MSR PSP, R0 ; update SP, API is executed with kernel SP
-
- ; set to thread-privilege mode.
- MRS R3, CONTROL
- BIC R3, R3, #0x01
- ORR R3, R3, #0x02
- MSR CONTROL, R3
-
- POP {LR} ; 0xFFFFFFED
- ORR LR, LR, #0x10
- BX LR
-
-;/*
-; * void svc_exit(void);
-; */
- EXPORT svc_exit
-svc_exit:
- ; get user SP.
- PUSH {R0} ; push result to SP.
- BL lwp_get_kernel_sp
- ldr r3, [r0, #-4]
- pop {r0}
-
- ldr lr, [r3, #20]
- ldr r1, [r3, #24] ; load pc
- add r3, r3, #32 ; exception_stack_frame size
- MSR PSP, R3 ; restore app stack pointer
- ; restore to PSP & thread-unprivilege mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03
- MSR CONTROL, R2
-
- ; return to lwp.
- ORR R1, R1, #0x01 ; only Thumb-mode.
- BX R1 ; return to user app.
-
- END
diff --git a/components/lwp/arch/arm/cortex-m7/lwp_rvds.S b/components/lwp/arch/arm/cortex-m7/lwp_rvds.S
deleted file mode 100644
index 246751a84729b17f39e3405fb4ea5a02748f0d13..0000000000000000000000000000000000000000
--- a/components/lwp/arch/arm/cortex-m7/lwp_rvds.S
+++ /dev/null
@@ -1,135 +0,0 @@
-;/*
-; * Copyright (c) 2006-2018, RT-Thread Development Team
-; *
-; * SPDX-License-Identifier: Apache-2.0
-; *
-; * Change Logs:
-; * Date Author Notes
-; * 2018-10-30 heyuanjie first version
-; */
-
- AREA |.text|, CODE, READONLY, ALIGN=2
- THUMB
- REQUIRE8
- PRESERVE8
-
-;/*
-; * void* lwp_get_sys_api(rt_uint32_t number);
-; */
- IMPORT lwp_get_sys_api
- IMPORT lwp_get_kernel_sp
- IMPORT lwp_set_kernel_sp
-
-;/*
-; * void lwp_user_entry(args, text, data);
-; */
-lwp_user_entry PROC
- EXPORT lwp_user_entry
-
- PUSH {R0-R3} ; push text&data addr.
-
- MOV R0, SP ; v1 = SP
- BL lwp_set_kernel_sp ; lwp_set_kernel_sp(v1)
-
- ; set CPU to user-thread mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03 ; use PSP, user-thread mode.
- MSR CONTROL, R2
-
- POP {R0-R3} ; pop app address to R1.
- ; set data address.
- MOV R9, R2
-
- ; run app, only Thumb-mode.
- ORR R1, R1, #0x01
- BX R1
-
- ; never reach here!
- ENDP
-
-;/*
-; * void SVC_Handler(void);
-; */
-SVC_Handler PROC
- EXPORT SVC_Handler
-
- PUSH {LR}
-
- ; get user SP.
- TST LR, #0x4
- ITE EQ
- MRSEQ R1, MSP
- MRSNE R1, PSP
- PUSH {R1} ; push app SP.
-
- ; get SVC number.
- mov R0, R7
-
- ; get kernel system API
- BL lwp_get_sys_api
-
- PUSH {R0} ; push api
-
- ; get kernel SP to R0.
- BL lwp_get_kernel_sp
-
- POP {R2} ; pop api to R2.
- POP {R1} ; pop app SP to R1.
-
- stmfd r0!, {r1} ; save app SP to kernel SP
-
- ;push app parm5~6 to kernel SP
- STMFD R0!, {R4 - R5}
- ; copy R1(app SP) to R0(kernel SP).
- push {r8-r11}
- LDMFD R1, {R4 - R11} ; pop exception_stack_frame to r4 - r11 register
- STMFD R0!, {R4 - R11} ; push exception_stack_frame to server SP.
- pop {r8-r11}
-
- LDR R3, =svc_exit
- STR R3, [R0, #20] ; update LR
- STR R2, [R0, #24] ; update api to PC
- MSR PSP, R0 ; update SP, API is executed with kernel SP
-
- ; set to thread-privilege mode.
- MRS R3, CONTROL
- BIC R3, R3, #0x01
- ORR R3, R3, #0x02
- MSR CONTROL, R3
-
- POP {LR} ; 0xFFFFFFED
- ORR LR, LR, #0x10
- BX LR
-
- ENDP
-
-;/*
-; * void svc_exit(void);
-; */
-svc_exit PROC
- EXPORT svc_exit
-
- ; get user SP.
- PUSH {R0} ; push result to SP.
- BL lwp_get_kernel_sp
- ldr r3, [r0, #-4]
- pop {r0}
-
- ldr lr, [r3, #20]
- ldr r1, [r3, #24] ; load pc
- add r3, #32 ; exception_stack_frame size
- MSR PSP, R3 ; restore app stack pointer
- ; restore to PSP & thread-unprivilege mode.
- MRS R2, CONTROL
- ORR R2, R2, #0x03
- MSR CONTROL, R2
-
- ; return to lwp.
- ORR R1, R1, #0x01 ; only Thumb-mode.
- BX R1 ; return to user app.
-
- ENDP
-
- ALIGN
-
- END
diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c
index 7881fcc68fa1461bee7aabc561855eb43e093954..7d7cd3db89f01945bdfacb189abb50f2e6dc3ecd 100644
--- a/components/lwp/lwp.c
+++ b/components/lwp/lwp.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -9,370 +9,911 @@
* 2018-11-02 heyuanjie fix complie error in iar
*/
-#include
#include
+#include
+
#include
+#include
+#include
#ifndef RT_USING_DFS
- #error "lwp need file system(RT_USING_DFS)"
+#error "lwp need file system(RT_USING_DFS)"
#endif
#include "lwp.h"
-#define DBG_TAG "LWP"
-#define DBG_LVL DBG_WARNING
+#define DBG_TAG "LWP"
+#define DBG_LVL DBG_WARNING
#include
-extern void lwp_user_entry(void *args, const void *text, void *data);
+#define AUX_ARRAY_ITEMS_NR 6
+
+/* aux key */
+#define AT_NULL 0
+#define AT_IGNORE 1
+#define AT_EXECFD 2
+#define AT_PHDR 3
+#define AT_PHENT 4
+#define AT_PHNUM 5
+#define AT_PAGESZ 6
+#define AT_BASE 7
+#define AT_FLAGS 8
+#define AT_ENTRY 9
+#define AT_NOTELF 10
+#define AT_UID 11
+#define AT_EUID 12
+#define AT_GID 13
+#define AT_EGID 14
+#define AT_CLKTCK 17
+#define AT_PLATFORM 15
+#define AT_HWCAP 16
+#define AT_FPUCW 18
+#define AT_DCACHEBSIZE 19
+#define AT_ICACHEBSIZE 20
+#define AT_UCACHEBSIZE 21
+#define AT_IGNOREPPC 22
+#define AT_SECURE 23
+#define AT_BASE_PLATFORM 24
+#define AT_RANDOM 25
+#define AT_HWCAP2 26
+#define AT_EXECFN 31
+
+struct process_aux_item
+{
+ uint32_t key;
+ uint32_t value;
+};
+
+struct process_aux
+{
+ struct process_aux_item item[AUX_ARRAY_ITEMS_NR];
+};
+
+#ifdef RT_USING_USERSPACE
+#ifdef RT_USING_GDBSERVER
+#include
+#include
+#endif
+
+#include
+#include
+
+#define USER_LOAD_VADDR 0x100000
+#endif
+
+static const char elf_magic[] = {0x7f, 'E', 'L', 'F'};
+
+extern void lwp_user_entry(void *args, const void *text, void *data, void *user_stack);
+extern int libc_stdio_get_console(void);
/**
* RT-Thread light-weight process
*/
void lwp_set_kernel_sp(uint32_t *sp)
{
- struct rt_lwp *user_data;
- user_data = (struct rt_lwp *)rt_thread_self()->lwp;
- user_data->kernel_sp = sp;
+ rt_thread_self()->kernel_sp = (rt_uint32_t *)sp;
}
uint32_t *lwp_get_kernel_sp(void)
{
- struct rt_lwp *user_data;
- user_data = (struct rt_lwp *)rt_thread_self()->lwp;
-
- return user_data->kernel_sp;
+#ifdef RT_USING_USERSPACE
+ return (uint32_t *)rt_thread_self()->sp;
+#else
+ return (uint32_t *)rt_thread_self()->kernel_sp;
+#endif
}
-static int lwp_argscopy(struct rt_lwp *lwp, int argc, char **argv)
+#ifdef RT_USING_USERSPACE
+static struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **argv, char **envp)
{
- int size = sizeof(int)*3; /* store argc, argv, NULL */
+ int size = sizeof(int) * 5; /* store argc, argv, envp, aux, NULL */
int *args;
char *str;
- char **new_argv;
+ char *str_k;
+ char **new_argve;
int i;
int len;
+ int *args_k;
+ struct process_aux *aux;
- for (i = 0; i < argc; i ++)
+ for (i = 0; i < argc; i++)
{
size += (rt_strlen(argv[i]) + 1);
}
- size += (sizeof(int) * argc);
+ size += (sizeof(int) * argc);
+
+ i = 0;
+ if (envp)
+ {
+ while (envp[i] != 0)
+ {
+ size += (rt_strlen(envp[i]) + 1);
+ size += sizeof(int);
+ i++;
+ }
+ }
+
+ /* for aux */
+ size += sizeof(struct process_aux);
+
+ if (size > ARCH_PAGE_SIZE)
+ return RT_NULL;
- args = (int*)rt_malloc(size);
+ /* args = (int*)lwp_map_user(lwp, 0, size); */
+ args = (int *)lwp_map_user(lwp, (void *)(KERNEL_VADDR_START - ARCH_PAGE_SIZE), size);
if (args == RT_NULL)
- return -1;
+ return RT_NULL;
- str = (char*)((int)args + (argc + 3) * sizeof(int));
- new_argv = (char**)&args[2];
- args[0] = argc;
- args[1] = (int)new_argv;
+ args_k = (int *)rt_hw_mmu_v2p(&lwp->mmu_info, args);
+ args_k = (int *)((size_t)args_k - PV_OFFSET);
+
+ /* argc, argv[], 0, envp[], 0 , aux[] */
+ str = (char *)((size_t)args + (argc + 2 + i + 1 + AUX_ARRAY_ITEMS_NR * 2 + 1) * sizeof(int));
+ str_k = (char *)((size_t)args_k + (argc + 2 + i + 1 + AUX_ARRAY_ITEMS_NR * 2 + 1) * sizeof(int));
- for (i = 0; i < argc; i ++)
+ new_argve = (char **)&args_k[1];
+ args_k[0] = argc;
+
+ for (i = 0; i < argc; i++)
{
len = rt_strlen(argv[i]) + 1;
- new_argv[i] = str;
- rt_memcpy(str, argv[i], len);
+ new_argve[i] = str;
+ rt_memcpy(str_k, argv[i], len);
str += len;
+ str_k += len;
}
- new_argv[i] = 0;
+ new_argve[i] = 0;
+ i++;
+
+ new_argve[i] = 0;
+ if (envp)
+ {
+ int j;
+
+ for (j = 0; envp[j] != 0; j++)
+ {
+ len = rt_strlen(envp[j]) + 1;
+ new_argve[i] = str;
+ rt_memcpy(str_k, envp[j], len);
+ str += len;
+ str_k += len;
+ i++;
+ }
+ new_argve[i] = 0;
+ }
+ i++;
+
+ /* aux */
+ aux = (struct process_aux *)(new_argve + i);
+ aux->item[0].key = AT_EXECFN;
+ aux->item[0].value = (uint32_t)(size_t)new_argve[0];
+ i += AUX_ARRAY_ITEMS_NR * 2;
+ new_argve[i] = 0;
+
+ rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, args_k, size);
+
lwp->args = args;
- return 0;
+ return aux;
}
-
-static int lwp_load(const char *filename, struct rt_lwp *lwp, uint8_t *load_addr, size_t addr_size)
+#else
+static struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **argv, char **envp)
{
- int fd;
- uint8_t *ptr;
- int result = RT_EOK;
- int nbytes;
- struct lwp_header header;
- struct lwp_chunk chunk;
-
- /* check file name */
- RT_ASSERT(filename != RT_NULL);
- /* check lwp control block */
- RT_ASSERT(lwp != RT_NULL);
+ int size = sizeof(int) * 5; /* store argc, argv, envp, aux, NULL */
+ int *args;
+ char *str;
+ char **new_argve;
+ int i;
+ int len;
+ struct process_aux *aux;
- if (load_addr != RT_NULL)
+ for (i = 0; i < argc; i++)
{
- lwp->lwp_type = LWP_TYPE_FIX_ADDR;
- ptr = load_addr;
- }
- else
- {
- lwp->lwp_type = LWP_TYPE_DYN_ADDR;
- ptr = RT_NULL;
+ size += (rt_strlen(argv[i]) + 1);
}
+ size += (sizeof(int) * argc);
- /* open lwp */
- fd = open(filename, 0, O_RDONLY);
- if (fd < 0)
+ i = 0;
+ if (envp)
{
- dbg_log(DBG_ERROR, "open file:%s failed!\n", filename);
- result = -RT_ENOSYS;
- goto _exit;
+ while (envp[i] != 0)
+ {
+ size += (rt_strlen(envp[i]) + 1);
+ size += sizeof(int);
+ i++;
+ }
}
- /* read lwp header */
- nbytes = read(fd, &header, sizeof(struct lwp_header));
- if (nbytes != sizeof(struct lwp_header))
- {
- dbg_log(DBG_ERROR, "read lwp header return error size: %d!\n", nbytes);
- result = -RT_EIO;
- goto _exit;
- }
+ /* for aux */
+ size += sizeof(struct process_aux);
+
+ args = (int *)rt_malloc(size);
+ if (args == RT_NULL)
+ return RT_NULL;
+
+ /* argc, argv[], 0, envp[], 0 */
+ str = (char *)((size_t)args + (argc + 2 + i + 1 + AUX_ARRAY_ITEMS_NR * 2 + 1) * sizeof(int));
- /* check file header */
- if (header.magic != LWP_MAGIC)
+ new_argve = (char **)&args[1];
+ args[0] = argc;
+
+ for (i = 0; i < argc; i++)
{
- dbg_log(DBG_ERROR, "erro header magic number: 0x%02X\n", header.magic);
- result = -RT_EINVAL;
- goto _exit;
+ len = rt_strlen(argv[i]) + 1;
+ new_argve[i] = str;
+ rt_memcpy(str, argv[i], len);
+ str += len;
}
+ new_argve[i] = 0;
+ i++;
- /* read text chunk info */
- nbytes = read(fd, &chunk, sizeof(struct lwp_chunk));
- if (nbytes != sizeof(struct lwp_chunk))
+ new_argve[i] = 0;
+ if (envp)
{
- dbg_log(DBG_ERROR, "read text chunk info failed!\n");
- result = -RT_EIO;
- goto _exit;
+ int j;
+ for (j = 0; envp[j] != 0; j++)
+ {
+ len = rt_strlen(envp[j]) + 1;
+ new_argve[i] = str;
+ rt_memcpy(str, envp[j], len);
+ str += len;
+ i++;
+ }
+ new_argve[i] = 0;
}
- dbg_log(DBG_LOG, "chunk name: %s, total len %d, data %d, need space %d!\n",
- "text", /*chunk.name*/ chunk.total_len, chunk.data_len, chunk.data_len_space);
+ /* aux */
+ aux = (struct process_aux *)(new_argve + i);
+ aux->item[0].key = AT_EXECFN;
+ aux->item[0].value = (uint32_t)(size_t)new_argve[0];
+ i += AUX_ARRAY_ITEMS_NR * 2;
+ new_argve[i] = 0;
- /* load text */
- {
- lwp->text_size = RT_ALIGN(chunk.data_len_space, 4);
- if (load_addr)
- lwp->text_entry = ptr;
- else
- {
-#ifdef RT_USING_CACHE
- lwp->text_entry = (rt_uint8_t *)rt_malloc_align(lwp->text_size, RT_CPU_CACHE_LINE_SZ);
-#else
- lwp->text_entry = (rt_uint8_t *)rt_malloc(lwp->text_size);
+ lwp->args = args;
+
+ return aux;
+}
#endif
- if (lwp->text_entry == RT_NULL)
- {
- dbg_log(DBG_ERROR, "alloc text memory faild!\n");
- result = -RT_ENOMEM;
- goto _exit;
- }
- else
- {
- dbg_log(DBG_LOG, "lwp text malloc : %p, size: %d!\n", lwp->text_entry, lwp->text_size);
- }
- }
- dbg_log(DBG_INFO, "load text %d => (0x%08x, 0x%08x)\n", lwp->text_size, (uint32_t)lwp->text_entry, (uint32_t)lwp->text_entry + lwp->text_size);
+#define check_off(voff, vlen) \
+ do \
+ { \
+ if (voff > vlen) \
+ { \
+ result = -RT_ERROR; \
+ goto _exit; \
+ } \
+ } while (0)
+
+#define check_read(vrlen, vrlen_want) \
+ do \
+ { \
+ if (vrlen < vrlen_want) \
+ { \
+ result = -RT_ERROR; \
+ goto _exit; \
+ } \
+ } while (0)
+
+static size_t load_fread(void *ptr, size_t size, size_t nmemb, int fd)
+{
+ size_t read_block = 0;
- nbytes = read(fd, lwp->text_entry, chunk.data_len);
- if (nbytes != chunk.data_len)
- {
- dbg_log(DBG_ERROR, "read text region from file failed!\n");
- result = -RT_EIO;
- goto _exit;
- }
-#ifdef RT_USING_CACHE
- else
+ while (nmemb)
+ {
+ size_t count;
+
+ count = read(fd, ptr, size * nmemb) / size;
+ if (count < nmemb)
{
- rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, lwp->text_entry, lwp->text_size);
- rt_hw_cpu_icache_ops(RT_HW_CACHE_INVALIDATE, lwp->text_entry, lwp->text_size);
+ LOG_E("ERROR: file size error!");
+ break;
}
+
+ ptr = (void *)((uint8_t *)ptr + (count * size));
+ nmemb -= count;
+ read_block += count;
+ }
+
+ return read_block;
+}
+
+typedef struct
+{
+ Elf32_Word st_name;
+ Elf32_Addr st_value;
+ Elf32_Word st_size;
+ unsigned char st_info;
+ unsigned char st_other;
+ Elf32_Half st_shndx;
+} Elf32_sym;
+
+#ifdef RT_USING_USERSPACE
+void lwp_elf_reloc(rt_mmu_info *m_info, void *text_start, void *rel_dyn_start, size_t rel_dyn_size, void *got_start, size_t got_size, Elf32_sym *dynsym);
+#else
+void lwp_elf_reloc(void *text_start, void *rel_dyn_start, size_t rel_dyn_size, void *got_start, size_t got_size, Elf32_sym *dynsym);
#endif
- if (ptr != RT_NULL) ptr += nbytes;
+static int load_elf(int fd, int len, struct rt_lwp *lwp, uint8_t *load_addr, struct process_aux *aux)
+{
+ uint32_t i;
+ uint32_t off = 0;
+ char *p_section_str = 0;
+ Elf32_sym *dynsym = 0;
+ Elf32_Ehdr eheader;
+ Elf32_Phdr pheader;
+ Elf32_Shdr sheader;
+ int result = RT_EOK;
+ uint32_t magic;
+ size_t read_len;
+ void *got_start = 0;
+ size_t got_size = 0;
+ void *rel_dyn_start = 0;
+ size_t rel_dyn_size = 0;
+ size_t dynsym_off = 0;
+ size_t dynsym_size = 0;
+
+#ifdef RT_USING_USERSPACE
+ rt_mmu_info *m_info = &lwp->mmu_info;
+#endif
- /* skip text hole */
- if ((chunk.total_len - sizeof(struct lwp_chunk) - chunk.data_len))
- {
- dbg_log(DBG_LOG, "skip text hole %d!\n", (chunk.total_len - sizeof(struct lwp_chunk) - chunk.data_len));
- lseek(fd, (chunk.total_len - sizeof(struct lwp_chunk) - chunk.data_len), SEEK_CUR);
- }
+ if (len < sizeof eheader)
+ {
+ return -RT_ERROR;
}
- /* load data */
- nbytes = read(fd, &chunk, sizeof(struct lwp_chunk));
- if (nbytes != sizeof(struct lwp_chunk))
+ lseek(fd, 0, SEEK_SET);
+ read_len = load_fread(&magic, 1, sizeof magic, fd);
+ check_read(read_len, sizeof magic);
+
+ if (memcmp(elf_magic, &magic, 4) != 0)
{
- dbg_log(DBG_ERROR, "read data chunk info failed!\n");
- result = -RT_EIO;
- goto _exit;
+ return -RT_ERROR;
}
- dbg_log(DBG_LOG, "chunk name: %s, total len %d, data %d, need space %d!\n",
- chunk.name, chunk.total_len, chunk.data_len, chunk.data_len_space);
+ lseek(fd, off, SEEK_SET);
+ read_len = load_fread(&eheader, 1, sizeof eheader, fd);
+ check_read(read_len, sizeof eheader);
+
+ if (eheader.e_ident[4] != 1)
+ { /* not 32bit */
+ return -RT_ERROR;
+ }
+ if (eheader.e_ident[6] != 1)
+ { /* ver not 1 */
+ return -RT_ERROR;
+ }
+ if ((eheader.e_type != ET_DYN)
+#ifdef RT_USING_USERSPACE
+ && (eheader.e_type != ET_EXEC)
+#endif
+ )
{
- lwp->data_size = RT_ALIGN(chunk.data_len_space, 4);
- if (load_addr)
- lwp->data = ptr;
- else
+ /* not pie or exec elf */
+ return -RT_ERROR;
+ }
+
+ { /* load aux */
+#ifdef RT_USING_USERSPACE
+ void *pa, *va;
+#endif
+ uint8_t *process_header;
+ size_t process_header_size;
+
+ off = eheader.e_phoff;
+ process_header_size = eheader.e_phnum * sizeof pheader;
+ if (process_header_size > ARCH_PAGE_SIZE)
+ return -RT_ERROR;
+#ifdef RT_USING_USERSPACE
+ va = (uint8_t *)lwp_map_user(lwp, (void *)(KERNEL_VADDR_START - ARCH_PAGE_SIZE * 2), process_header_size);
+ if (!va)
+ return -RT_ERROR;
+ pa = rt_hw_mmu_v2p(m_info, va);
+ process_header = (uint8_t*)pa - PV_OFFSET;
+#else
+ process_header = (uint8_t *)rt_malloc(process_header_size);
+ if (!process_header)
+ return -RT_ERROR;
+#endif
+ check_off(off, len);
+ lseek(fd, off, SEEK_SET);
+ read_len = load_fread(process_header, 1, process_header_size, fd);
+ check_read(read_len, process_header_size);
+#ifdef RT_USING_USERSPACE
+ rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, process_header, process_header_size);
+#endif
+
+ aux->item[1].key = AT_PAGESZ;
+ aux->item[1].value = ARCH_PAGE_SIZE;
+ aux->item[2].key = AT_RANDOM;
+ aux->item[2].value = rt_tick_get();
+ aux->item[3].key = AT_PHDR;
+#ifdef RT_USING_USERSPACE
+ aux->item[3].value = (uint32_t)(size_t)va;
+#else
+ aux->item[3].value = (uint32_t)(size_t)process_header;
+#endif
+ aux->item[4].key = AT_PHNUM;
+ aux->item[4].value = eheader.e_phnum;
+ aux->item[5].key = AT_PHENT;
+ aux->item[5].value = sizeof pheader;
+#ifdef RT_USING_USERSPACE
+ rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, aux, sizeof *aux);
+#endif
+ }
+
+ off = eheader.e_phoff;
+ for (i = 0; i < eheader.e_phnum; i++, off += sizeof pheader)
+ {
+ check_off(off, len);
+ lseek(fd, off, SEEK_SET);
+ read_len = load_fread(&pheader, 1, sizeof pheader, fd);
+ check_read(read_len, sizeof pheader);
+
+ if (pheader.p_type == PT_LOAD)
{
- lwp->data = rt_malloc(lwp->data_size);
- if (lwp->data == RT_NULL)
+ if (pheader.p_filesz > pheader.p_memsz)
{
- dbg_log(DBG_ERROR, "alloc data memory faild!\n");
- result = -RT_ENOMEM;
- goto _exit;
+ return -RT_ERROR;
+ }
+ if (load_addr)
+ {
+ if (eheader.e_type == ET_EXEC)
+ {
+ result = -RT_ERROR;
+ goto _exit;
+ }
+ lwp->text_entry = load_addr;
}
else
{
- dbg_log(DBG_LOG, "lwp data malloc : %p, size: %d!\n", lwp->data, lwp->data_size);
- rt_memset(lwp->data, 0, lwp->data_size);
+#ifdef RT_USING_USERSPACE
+ void *va;
+
+ if (eheader.e_type == ET_EXEC)
+ {
+ if (pheader.p_vaddr != USER_LOAD_VADDR)
+ {
+ result = -RT_ERROR;
+ goto _exit;
+ }
+ va = lwp_map_user(lwp, (void *)pheader.p_vaddr, pheader.p_memsz);
+ }
+ else
+ {
+ va = lwp_map_user(lwp, 0, pheader.p_memsz);
+ }
+ if (va)
+ {
+ lwp->text_entry = va;
+ lwp->text_size = pheader.p_memsz;
+ }
+ else
+ {
+ lwp->text_entry = RT_NULL;
+ }
+#else
+#ifdef RT_USING_CACHE
+ lwp->text_entry = (rt_uint8_t *)rt_malloc_align(pheader.p_memsz, RT_CPU_CACHE_LINE_SZ);
+#else
+ lwp->text_entry = (rt_uint8_t *)rt_malloc(pheader.p_memsz);
+#endif
+#endif
+ if (lwp->text_entry == RT_NULL)
+ {
+ LOG_E("alloc text memory faild!");
+ result = -RT_ENOMEM;
+ goto _exit;
+ }
+ else
+ {
+ LOG_D("lwp text malloc : %p, size: %d!", lwp->text_entry, lwp->text_size);
+ }
+ check_off(pheader.p_offset, len);
+ lseek(fd, pheader.p_offset, SEEK_SET);
+#ifdef RT_USING_USERSPACE
+ {
+ uint32_t size = pheader.p_filesz;
+ void *va_self;
+ void *pa;
+ size_t tmp_len = 0;
+
+ read_len = 0;
+ while (size)
+ {
+ pa = rt_hw_mmu_v2p(m_info, va);
+ va_self = (void*)((char*)pa - PV_OFFSET);
+ LOG_D("va_self = %p pa = %p", va_self, pa);
+ tmp_len = (size < ARCH_PAGE_SIZE) ? size : ARCH_PAGE_SIZE;
+ tmp_len = load_fread(va_self, 1, tmp_len, fd);
+ rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, va_self, tmp_len);
+ read_len += tmp_len;
+ size -= tmp_len;
+ va = (void*)((char*)va + ARCH_PAGE_SIZE);
+ }
+ }
+#else
+ read_len = load_fread(lwp->text_entry, 1, pheader.p_filesz, fd);
+#endif
+ check_read(read_len, pheader.p_filesz);
+ }
+ if (pheader.p_filesz < pheader.p_memsz)
+ {
+#ifdef RT_USING_USERSPACE
+ void *va = (void*)((char*)lwp->text_entry + pheader.p_filesz);
+ void *va_self;
+ void *pa;
+ uint32_t size = pheader.p_memsz - pheader.p_filesz;
+ uint32_t size_s;
+ uint32_t off;
+
+ off = pheader.p_filesz & ARCH_PAGE_MASK;
+ va = (void *)(((size_t)lwp->text_entry + pheader.p_filesz) & ~ARCH_PAGE_MASK);
+ while (size)
+ {
+ size_s = (size < ARCH_PAGE_SIZE - off) ? size : ARCH_PAGE_SIZE - off;
+ pa = rt_hw_mmu_v2p(m_info, va);
+ va_self = (void*)((char*)pa - PV_OFFSET);
+ memset((void*)((char*)va_self + off), 0, size_s);
+ rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, (void*)((char*)va_self + off), size_s);
+ off = 0;
+ size -= size_s;
+ va = (void*)((char*)va + ARCH_PAGE_SIZE);
+ }
+#else
+ memset((uint8_t *)lwp->text_entry + pheader.p_filesz, 0, (size_t)(pheader.p_memsz - pheader.p_filesz));
+#endif
}
+ break;
}
+ }
- dbg_log(DBG_INFO, "load data %d => (0x%08x, 0x%08x)\n", lwp->data_size, (uint32_t)lwp->data, (uint32_t)lwp->data + lwp->data_size);
- nbytes = read(fd, lwp->data, chunk.data_len);
- if (nbytes != chunk.data_len)
+ if (eheader.e_type == ET_DYN)
+ {
+ /* section info */
+ off = eheader.e_shoff;
+ /* find section string table */
+ check_off(off, len);
+ lseek(fd, off + (sizeof sheader) * eheader.e_shstrndx, SEEK_SET);
+ read_len = load_fread(&sheader, 1, sizeof sheader, fd);
+ check_read(read_len, sizeof sheader);
+
+ p_section_str = (char *)rt_malloc(sheader.sh_size);
+ if (!p_section_str)
{
- dbg_log(DBG_ERROR, "read data region from file failed!\n");
- result = -RT_ERROR;
+ LOG_E("out of memory!");
+ result = -ENOMEM;
goto _exit;
}
- }
-_exit:
- if (fd >= 0)
- close(fd);
+ check_off(sheader.sh_offset, len);
+ lseek(fd, sheader.sh_offset, SEEK_SET);
+ read_len = load_fread(p_section_str, 1, sheader.sh_size, fd);
+ check_read(read_len, sheader.sh_size);
- if (result != RT_EOK)
- {
- if (lwp->lwp_type == LWP_TYPE_DYN_ADDR)
+ check_off(off, len);
+ lseek(fd, off, SEEK_SET);
+ for (i = 0; i < eheader.e_shnum; i++, off += sizeof sheader)
{
- dbg_log(DBG_ERROR, "lwp dynamic load faild, %d\n", result);
- if (lwp->text_entry)
+ read_len = load_fread(&sheader, 1, sizeof sheader, fd);
+ check_read(read_len, sizeof sheader);
+
+ if (strcmp(p_section_str + sheader.sh_name, "text") == 0)
{
- dbg_log(DBG_LOG, "lwp text free: %p\n", lwp->text_entry);
-#ifdef RT_USING_CACHE
- rt_free_align(lwp->text_entry);
-#else
- rt_free(lwp->text_entry);
-#endif
+ lwp->text_size = sheader.sh_size;
+ }
+ else if (strcmp(p_section_str + sheader.sh_name, ".got") == 0)
+ {
+ got_start = (void *)((uint8_t *)lwp->text_entry + sheader.sh_addr);
+ got_size = (size_t)sheader.sh_size;
}
- if (lwp->data)
+ else if (strcmp(p_section_str + sheader.sh_name, ".rel.dyn") == 0)
{
- dbg_log(DBG_LOG, "lwp data free: %p\n", lwp->data);
- rt_free(lwp->data);
+ rel_dyn_start = (void *)((uint8_t *)lwp->text_entry + sheader.sh_addr);
+ rel_dyn_size = (size_t)sheader.sh_size;
+ }
+ else if (strcmp(p_section_str + sheader.sh_name, ".dynsym") == 0)
+ {
+ dynsym_off = (size_t)sheader.sh_offset;
+ dynsym_size = (size_t)sheader.sh_size;
}
}
+ /* reloc */
+ if (dynsym_size)
+ {
+ dynsym = rt_malloc(dynsym_size);
+ if (!dynsym)
+ {
+ LOG_E("ERROR: Malloc error!");
+ result = -ENOMEM;
+ goto _exit;
+ }
+ check_off(dynsym_off, len);
+ lseek(fd, dynsym_off, SEEK_SET);
+ read_len = load_fread(dynsym, 1, dynsym_size, fd);
+ check_read(read_len, dynsym_size);
+ }
+#ifdef RT_USING_USERSPACE
+ lwp_elf_reloc(m_info, (void *)lwp->text_entry, rel_dyn_start, rel_dyn_size, got_start, got_size, dynsym);
+#else
+ lwp_elf_reloc((void *)lwp->text_entry, rel_dyn_start, rel_dyn_size, got_start, got_size, dynsym);
+
+ rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, lwp->text_entry, lwp->text_size);
+ rt_hw_cpu_icache_ops(RT_HW_CACHE_INVALIDATE, lwp->text_entry, lwp->text_size);
+#endif
}
+ LOG_D("lwp->text_entry = 0x%p", lwp->text_entry);
+ LOG_D("lwp->text_size = 0x%p", lwp->text_size);
+_exit:
+ if (dynsym)
+ {
+ rt_free(dynsym);
+ }
+ if (p_section_str)
+ {
+ rt_free(p_section_str);
+ }
+ if (result != RT_EOK)
+ {
+ LOG_E("lwp dynamic load faild, %d", result);
+ lwp_ref_dec(lwp);
+ }
return result;
}
-static void lwp_cleanup(struct rt_thread *tid)
+int lwp_load(const char *filename, struct rt_lwp *lwp, uint8_t *load_addr, size_t addr_size, struct process_aux *aux);
+
+RT_WEAK int lwp_load(const char *filename, struct rt_lwp *lwp, uint8_t *load_addr, size_t addr_size, struct process_aux *aux)
{
+ uint8_t *ptr;
+ int ret = -1;
+ int len;
+ int fd = -1;
+
+ /* check file name */
+ RT_ASSERT(filename != RT_NULL);
+ /* check lwp control block */
+ RT_ASSERT(lwp != RT_NULL);
+
+ /* copy file name to process name */
+ rt_strncpy(lwp->cmd, filename, RT_NAME_MAX);
+
+ if (load_addr != RT_NULL)
+ {
+ lwp->lwp_type = LWP_TYPE_FIX_ADDR;
+ ptr = load_addr;
+ }
+ else
+ {
+ lwp->lwp_type = LWP_TYPE_DYN_ADDR;
+ ptr = RT_NULL;
+ }
+
+ fd = open(filename, O_BINARY | O_RDONLY, 0);
+ if (fd < 0)
+ {
+ LOG_E("ERROR: Can't open elf file %s!", filename);
+ goto out;
+ }
+ len = lseek(fd, 0, SEEK_END);
+ if (len < 0)
+ {
+ LOG_E("ERROR: File %s size error!", filename);
+ goto out;
+ }
+
+ lseek(fd, 0, SEEK_SET);
+
+ ret = load_elf(fd, len, lwp, ptr, aux);
+ if (ret != RT_EOK)
+ {
+ LOG_E("lwp load ret = %d", ret);
+ }
+
+out:
+ if (fd > 0)
+ {
+ close(fd);
+ }
+ return ret;
+}
+
+void lwp_cleanup(struct rt_thread *tid)
+{
+ rt_base_t level;
struct rt_lwp *lwp;
- dbg_log(DBG_INFO, "thread: %s, stack_addr: %08X\n", tid->name, tid->stack_addr);
+ if (tid == NULL) return;
- lwp = (struct rt_lwp *)tid->lwp;
+ LOG_I("cleanup thread: %s, stack_addr: %08X", tid->name, tid->stack_addr);
- if (lwp->lwp_type == LWP_TYPE_DYN_ADDR)
+#ifndef RT_USING_USERSPACE
+ if (tid->user_stack != RT_NULL)
{
- dbg_log(DBG_INFO, "dynamic lwp\n");
- if (lwp->text_entry)
- {
- dbg_log(DBG_LOG, "lwp text free: %p\n", lwp->text_entry);
-#ifdef RT_USING_CACHE
- rt_free_align(lwp->text_entry);
-#else
- rt_free(lwp->text_entry);
-#endif
- }
- if (lwp->data)
- {
- dbg_log(DBG_LOG, "lwp data free: %p\n", lwp->data);
- rt_free(lwp->data);
- }
+ rt_free(tid->user_stack);
}
+#endif
- dbg_log(DBG_LOG, "lwp free memory pages\n");
- rt_lwp_mem_deinit(lwp);
+ level = rt_hw_interrupt_disable();
+ lwp = (struct rt_lwp *)tid->lwp;
- /* cleanup fd table */
- rt_free(lwp->fdt.fds);
- rt_free(lwp->args);
+ rt_list_remove(&tid->sibling);
+ lwp_ref_dec(lwp);
+ rt_hw_interrupt_enable(level);
- dbg_log(DBG_LOG, "lwp free: %p\n", lwp);
- rt_free(lwp);
+ return;
+}
- /* TODO: cleanup fd table */
+static void lwp_copy_stdio_fdt(struct rt_lwp *lwp)
+{
+ int fd;
+ struct dfs_fd *d;
+ struct dfs_fdtable *lwp_fdt;
+
+ fd = libc_stdio_get_console();
+ d = fd_get(fd);
+ fd_put(d);
+
+ fd = fd - DFS_FD_OFFSET;
+ if (d == NULL)
+ {
+ return;
+ }
+
+ lwp_fdt = &lwp->fdt;
+ lwp_fdt->fds = rt_malloc(sizeof(void *) * (fd + 1));
+ rt_memset(lwp_fdt->fds, 0, sizeof(void *) * (fd + 1));
+ lwp_fdt->fds[fd] = d;
+ lwp_fdt->maxfd = fd + 1;
+
+ return;
}
-static void lwp_thread(void *parameter)
+static void lwp_thread_entry(void *parameter)
{
rt_thread_t tid;
struct rt_lwp *lwp;
- lwp = (struct rt_lwp *)parameter;
- rt_lwp_mem_init(lwp);
tid = rt_thread_self();
- tid->lwp = lwp;
+ lwp = (struct rt_lwp *)tid->lwp;
tid->cleanup = lwp_cleanup;
+ tid->user_stack = RT_NULL;
- lwp_user_entry(lwp->args, lwp->text_entry, lwp->data);
+#ifdef RT_USING_GDBSERVER
+ if (lwp->debug)
+ {
+ lwp->bak_first_ins = *(uint32_t *)lwp->text_entry;
+ *(uint32_t *)lwp->text_entry = INS_BREAK_CONNECT;
+ rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, lwp->text_entry, sizeof(uint32_t));
+ icache_invalid_all();
+ }
+#endif
+
+ lwp_user_entry(lwp->args, lwp->text_entry, lwp->data_entry, RT_NULL);
}
-struct rt_lwp *rt_lwp_self(void)
+struct rt_lwp *lwp_self(void)
{
- return (struct rt_lwp *)rt_thread_self()->lwp;
+ rt_thread_t tid;
+
+ tid = rt_thread_self();
+ if (tid)
+ {
+ return (struct rt_lwp *)tid->lwp;
+ }
+
+ return RT_NULL;
}
-int exec(char *filename, int argc, char **argv)
+#ifdef RT_USING_GDBSERVER
+pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp)
+#else
+pid_t lwp_execve(char *filename, int argc, char **argv, char **envp)
+#endif
{
- struct rt_lwp *lwp;
int result;
+ rt_base_t level;
+ struct rt_lwp *lwp;
+ char *thread_name;
+ char *argv_last = argv[argc - 1];
+ int bg = 0;
+ struct process_aux *aux;
if (filename == RT_NULL)
return -RT_ERROR;
- lwp = (struct rt_lwp *)rt_malloc(sizeof(struct rt_lwp));
+ lwp = lwp_new();
+
if (lwp == RT_NULL)
{
dbg_log(DBG_ERROR, "lwp struct out of memory!\n");
return -RT_ENOMEM;
}
- dbg_log(DBG_INFO, "lwp malloc : %p, size: %d!\n", lwp, sizeof(struct rt_lwp));
+ LOG_D("lwp malloc : %p, size: %d!", lwp, sizeof(struct rt_lwp));
+
+#ifdef RT_USING_USERSPACE
+ if (lwp_user_space_init(lwp) != 0)
+ {
+ lwp_ref_dec(lwp);
+ return -ENOMEM;
+ }
+#endif
+
+ if (argv_last[0] == '&' && argv_last[1] == '\0')
+ {
+ argc--;
+ bg = 1;
+ }
- rt_memset(lwp, 0, sizeof(*lwp));
- if (lwp_argscopy(lwp, argc, argv) != 0)
+ if ((aux = lwp_argscopy(lwp, argc, argv, envp)) == RT_NULL)
{
- rt_free(lwp);
+ lwp_ref_dec(lwp);
return -ENOMEM;
}
- result = lwp_load(filename, lwp, RT_NULL, 0);
+ result = lwp_load(filename, lwp, RT_NULL, 0, aux);
if (result == RT_EOK)
{
rt_thread_t tid;
- tid = rt_thread_create("user", lwp_thread, (void *)lwp,
- 1024 * 4, 2, 200);
+ lwp_copy_stdio_fdt(lwp);
+
+ /* obtain the base name */
+ thread_name = strrchr(filename, '/');
+ thread_name = thread_name ? thread_name + 1 : filename;
+
+ tid = rt_thread_create(thread_name, lwp_thread_entry, RT_NULL,
+ 1024 * 4, 25, 200);
if (tid != RT_NULL)
{
- dbg_log(DBG_LOG, "lwp kernel => (0x%08x, 0x%08x)\n", (rt_uint32_t)tid->stack_addr, (rt_uint32_t)tid->stack_addr + tid->stack_size);
- rt_thread_startup(tid);
- return RT_EOK;
- }
- else
- {
-#ifdef RT_USING_CACHE
- rt_free_align(lwp->text_entry);
-#else
- rt_free(lwp->text_entry);
+ struct rt_lwp *lwp_self;
+
+ LOG_D("lwp kernel => (0x%08x, 0x%08x)\n", (rt_uint32_t)tid->stack_addr, (rt_uint32_t)tid->stack_addr + tid->stack_size);
+ level = rt_hw_interrupt_disable();
+ lwp_self = (struct rt_lwp *)rt_thread_self()->lwp;
+ if (lwp_self)
+ {
+ /* lwp add to children link */
+ lwp->sibling = lwp_self->first_child;
+ lwp_self->first_child = lwp;
+ lwp->parent = lwp_self;
+ }
+ tid->lwp = lwp;
+ rt_list_insert_after(&lwp->t_grp, &tid->sibling);
+
+#ifdef RT_USING_GDBSERVER
+ if (debug)
+ {
+ lwp->debug = debug;
+ }
#endif
- rt_free(lwp->data);
+
+ if ((rt_console_get_foreground() == lwp_self) && !bg)
+ {
+ rt_console_set_foreground(lwp);
+ }
+ rt_hw_interrupt_enable(level);
+
+ rt_thread_startup(tid);
+ return lwp_to_pid(lwp);
}
}
- rt_free(lwp->args);
- rt_free(lwp);
+ lwp_ref_dec(lwp);
return -RT_ERROR;
}
+
+#ifdef RT_USING_GDBSERVER
+pid_t exec(char *filename, int debug, int argc, char **argv)
+{
+ return lwp_execve(filename, debug, argc, argv, 0);
+}
+#else
+pid_t exec(char *filename, int argc, char **argv)
+{
+ return lwp_execve(filename, argc, argv, 0);
+}
+#endif
diff --git a/components/lwp/lwp.h b/components/lwp/lwp.h
index f013f36768ad1f9eacab27358ec0d8731a5f2dab..c4a279673d72534a7712b0985103809a1ac6d5a4 100644
--- a/components/lwp/lwp.h
+++ b/components/lwp/lwp.h
@@ -1,16 +1,45 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2018-06-29 heyuanjie first version
+ * 2019-10-12 Jesven Add MMU and userspace support
+ * 2020-10-08 Bernard Architecture and code cleanup
*/
+/*
+ * RT-Thread light-weight process
+ */
#ifndef __LWP_H__
#define __LWP_H__
+#include
+
+#include
+#include
+#include
+
+#include "arch.h"
+
+#include "lwp_pid.h"
+#include "lwp_ipc.h"
+#include "lwp_signal.h"
+#include "lwp_syscall.h"
+
+#ifdef RT_USING_USERSPACE
+#include "lwp_shm.h"
+
+#include "mmu.h"
+#include "page.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#define LWP_MAGIC 0x5A
#define LWP_TYPE_FIX_ADDR 0x01
@@ -18,54 +47,81 @@
#define LWP_ARG_MAX 8
-#include
-#include
-#include
-#include
+typedef int32_t pid_t;
struct rt_lwp
{
+#ifdef RT_USING_USERSPACE
+ rt_mmu_info mmu_info;
+ struct lwp_avl_struct *map_area;
+ size_t end_heap;
+#endif
+
uint8_t lwp_type;
uint8_t heap_cnt;
uint8_t reserv[2];
- rt_list_t hlist; /**< headp list */
+ struct rt_lwp *parent;
+ struct rt_lwp *first_child;
+ struct rt_lwp *sibling;
- uint8_t *text_entry;
- uint32_t text_size;
+ rt_list_t wait_list;
+ int32_t finish;
+ int lwp_ret;
- uint8_t *data;
- uint32_t data_size;
+ void *text_entry;
+ uint32_t text_size;
+ void *data_entry;
+ uint32_t *data_size;
- uint32_t *kernel_sp; /**< kernel stack point */
- struct dfs_fdtable fdt;
+ int ref;
void *args;
-};
+ pid_t pid;
+ rt_list_t t_grp;
+ struct dfs_fdtable fdt;
+ char cmd[RT_NAME_MAX];
-struct lwp_header
-{
- uint8_t magic;
- uint8_t compress_encrypt_algo;
- uint16_t reserved;
+ lwp_sigset_t signal;
+ lwp_sigset_t signal_mask;
+ int signal_mask_bak;
+ rt_uint32_t signal_in_process;
+ lwp_sighandler_t signal_handler[_LWP_NSIG];
+
+ rt_list_t object_list;
+ struct rt_user_context user_ctx;
- uint32_t crc32;
+ struct rt_wqueue wait_queue; /*for console */
+
+#ifdef RT_USING_GDBSERVER
+ int debug;
+ uint32_t bak_first_ins;
+#endif
};
-struct lwp_chunk
-{
- uint32_t total_len;
+struct rt_lwp *lwp_self(void);
- char name[4];
- uint32_t data_len;
- uint32_t data_len_space;
+enum lwp_exit_request_type
+{
+ LWP_EXIT_REQUEST_NONE = 0,
+ LWP_EXIT_REQUEST_TRIGGERED,
+ LWP_EXIT_REQUEST_IN_PROCESS,
};
-extern struct rt_lwp *rt_lwp_self(void);
+void lwp_request_thread_exit(rt_thread_t thread_to_exit);
+int lwp_check_exit_request(void);
+void lwp_terminate(struct rt_lwp *lwp);
+void lwp_wait_subthread_exit(void);
-extern void rt_lwp_mem_init(struct rt_lwp *lwp);
-extern void rt_lwp_mem_deinit(struct rt_lwp *lwp);
-extern void *rt_lwp_mem_malloc(rt_uint32_t size);
-extern void rt_lwp_mem_free(void *addr);
-extern void *rt_lwp_mem_realloc(void *rmem, rt_size_t newsize);
+void lwp_set_thread_area(void *p);
+void* rt_cpu_get_thread_idr(void);
+void rt_cpu_set_thread_idr(void *p);
+
+#ifdef RT_USING_USERSPACE
+void lwp_mmu_switch(struct rt_thread *thread);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
#endif
diff --git a/components/lwp/lwp_avl.c b/components/lwp/lwp_avl.c
new file mode 100644
index 0000000000000000000000000000000000000000..82d315aa194cca20f4d9c7a940a5e0c4b4324d1d
--- /dev/null
+++ b/components/lwp/lwp_avl.c
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-10-12 Jesven first version
+ */
+#include
+#include
+
+static void lwp_avl_rebalance(struct lwp_avl_struct ***nodeplaces_ptr, int count)
+{
+ for (; count > 0; count--)
+ {
+ struct lwp_avl_struct **nodeplace = *--nodeplaces_ptr;
+ struct lwp_avl_struct *node = *nodeplace;
+ struct lwp_avl_struct *nodeleft = node->avl_left;
+ struct lwp_avl_struct *noderight = node->avl_right;
+ int heightleft = heightof(nodeleft);
+ int heightright = heightof(noderight);
+ if (heightright + 1 < heightleft)
+ {
+ struct lwp_avl_struct *nodeleftleft = nodeleft->avl_left;
+ struct lwp_avl_struct *nodeleftright = nodeleft->avl_right;
+ int heightleftright = heightof(nodeleftright);
+ if (heightof(nodeleftleft) >= heightleftright)
+ {
+ node->avl_left = nodeleftright;
+ nodeleft->avl_right = node;
+ nodeleft->avl_height = 1 + (node->avl_height = 1 + heightleftright);
+ *nodeplace = nodeleft;
+ }
+ else
+ {
+ nodeleft->avl_right = nodeleftright->avl_left;
+ node->avl_left = nodeleftright->avl_right;
+ nodeleftright->avl_left = nodeleft;
+ nodeleftright->avl_right = node;
+ nodeleft->avl_height = node->avl_height = heightleftright;
+ nodeleftright->avl_height = heightleft;
+ *nodeplace = nodeleftright;
+ }
+ }
+ else if (heightleft + 1 < heightright)
+ {
+ struct lwp_avl_struct *noderightright = noderight->avl_right;
+ struct lwp_avl_struct *noderightleft = noderight->avl_left;
+ int heightrightleft = heightof(noderightleft);
+ if (heightof(noderightright) >= heightrightleft)
+ {
+ node->avl_right = noderightleft;
+ noderight->avl_left = node;
+ noderight->avl_height = 1 + (node->avl_height = 1 + heightrightleft);
+ *nodeplace = noderight;
+ }
+ else
+ {
+ noderight->avl_left = noderightleft->avl_right;
+ node->avl_right = noderightleft->avl_left;
+ noderightleft->avl_right = noderight;
+ noderightleft->avl_left = node;
+ noderight->avl_height = node->avl_height = heightrightleft;
+ noderightleft->avl_height = heightright;
+ *nodeplace = noderightleft;
+ }
+ }
+ else
+ {
+ int height = (heightleft < heightright ? heightright : heightleft) + 1;
+ if (height == node->avl_height)
+ break;
+ node->avl_height = height;
+ }
+ }
+}
+
+void lwp_avl_remove(struct lwp_avl_struct *node_to_delete, struct lwp_avl_struct **ptree)
+{
+ avl_key_t key = node_to_delete->avl_key;
+ struct lwp_avl_struct **nodeplace = ptree;
+ struct lwp_avl_struct **stack[avl_maxheight];
+ uint32_t stack_count = 0;
+ struct lwp_avl_struct ***stack_ptr = &stack[0]; /* = &stack[stackcount] */
+ struct lwp_avl_struct **nodeplace_to_delete;
+ for (;;)
+ {
+ struct lwp_avl_struct *node = *nodeplace;
+ if (node == AVL_EMPTY)
+ {
+ return;
+ }
+
+ *stack_ptr++ = nodeplace;
+ stack_count++;
+ if (key == node->avl_key)
+ break;
+ if (key < node->avl_key)
+ nodeplace = &node->avl_left;
+ else
+ nodeplace = &node->avl_right;
+ }
+ nodeplace_to_delete = nodeplace;
+ if (node_to_delete->avl_left == AVL_EMPTY)
+ {
+ *nodeplace_to_delete = node_to_delete->avl_right;
+ stack_ptr--;
+ stack_count--;
+ }
+ else
+ {
+ struct lwp_avl_struct ***stack_ptr_to_delete = stack_ptr;
+ struct lwp_avl_struct **nodeplace = &node_to_delete->avl_left;
+ struct lwp_avl_struct *node;
+ for (;;)
+ {
+ node = *nodeplace;
+ if (node->avl_right == AVL_EMPTY)
+ break;
+ *stack_ptr++ = nodeplace;
+ stack_count++;
+ nodeplace = &node->avl_right;
+ }
+ *nodeplace = node->avl_left;
+ node->avl_left = node_to_delete->avl_left;
+ node->avl_right = node_to_delete->avl_right;
+ node->avl_height = node_to_delete->avl_height;
+ *nodeplace_to_delete = node;
+ *stack_ptr_to_delete = &node->avl_left;
+ }
+ lwp_avl_rebalance(stack_ptr, stack_count);
+}
+
+void lwp_avl_insert(struct lwp_avl_struct *new_node, struct lwp_avl_struct **ptree)
+{
+ avl_key_t key = new_node->avl_key;
+ struct lwp_avl_struct **nodeplace = ptree;
+ struct lwp_avl_struct **stack[avl_maxheight];
+ int stack_count = 0;
+ struct lwp_avl_struct ***stack_ptr = &stack[0]; /* = &stack[stackcount] */
+ for (;;)
+ {
+ struct lwp_avl_struct *node = *nodeplace;
+ if (node == AVL_EMPTY)
+ break;
+ *stack_ptr++ = nodeplace;
+ stack_count++;
+ if (key < node->avl_key)
+ nodeplace = &node->avl_left;
+ else
+ nodeplace = &node->avl_right;
+ }
+ new_node->avl_left = AVL_EMPTY;
+ new_node->avl_right = AVL_EMPTY;
+ new_node->avl_height = 1;
+ *nodeplace = new_node;
+ lwp_avl_rebalance(stack_ptr, stack_count);
+}
+
+struct lwp_avl_struct *lwp_avl_find(avl_key_t key, struct lwp_avl_struct *ptree)
+{
+ for (;;)
+ {
+ if (ptree == AVL_EMPTY)
+ {
+ return (struct lwp_avl_struct *)0;
+ }
+ if (key == ptree->avl_key)
+ break;
+ if (key < ptree->avl_key)
+ ptree = ptree->avl_left;
+ else
+ ptree = ptree->avl_right;
+ }
+ return ptree;
+}
+
+void lwp_avl_traversal(struct lwp_avl_struct *ptree, void (*fun)(struct lwp_avl_struct *, void *), void *arg)
+{
+ if (!ptree)
+ {
+ return;
+ }
+ if (ptree->avl_left)
+ {
+ lwp_avl_traversal(ptree->avl_left, fun, arg);
+ }
+ (*fun)(ptree, arg);
+ if (ptree->avl_right)
+ {
+ lwp_avl_traversal(ptree->avl_right, fun, arg);
+ }
+}
diff --git a/components/lwp/lwp_avl.h b/components/lwp/lwp_avl.h
new file mode 100644
index 0000000000000000000000000000000000000000..e6070ceb2f278d292eecfd41ef284e1cf1833f91
--- /dev/null
+++ b/components/lwp/lwp_avl.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-10-12 Jesven first version
+ */
+#ifndef LWP_AVL_H__
+#define LWP_AVL_H__
+
+#include
+
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define avl_key_t size_t
+#define AVL_EMPTY (struct lwp_avl_struct *)0
+#define avl_maxheight 32
+#define heightof(tree) ((tree) == AVL_EMPTY ? 0 : (tree)->avl_height)
+
+struct lwp_avl_struct
+{
+ struct lwp_avl_struct *avl_left;
+ struct lwp_avl_struct *avl_right;
+ int avl_height;
+ avl_key_t avl_key;
+ void *data;
+};
+
+void lwp_avl_remove(struct lwp_avl_struct * node_to_delete, struct lwp_avl_struct ** ptree);
+void lwp_avl_insert (struct lwp_avl_struct * new_node, struct lwp_avl_struct ** ptree);
+struct lwp_avl_struct* lwp_avl_find(avl_key_t key, struct lwp_avl_struct* ptree);
+void lwp_avl_traversal(struct lwp_avl_struct* ptree, void (*fun)(struct lwp_avl_struct*, void *), void *arg);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWP_AVL_H__ */
diff --git a/components/lwp/lwp_console.c b/components/lwp/lwp_console.c
new file mode 100644
index 0000000000000000000000000000000000000000..f964d6a0559fb6bdda82900b949abf4b9f8f69a2
--- /dev/null
+++ b/components/lwp/lwp_console.c
@@ -0,0 +1,513 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-02-23 Jesven first version
+ */
+
+#include
+#include
+
+#include "lwp_console.h"
+
+#define DBG_TAG "CONSOLE"
+#define DBG_LVL DBG_INFO
+#include
+
+#define CHAR_CTRL_D 0x4
+#define CHAR_CTRL_C 0x3
+
+enum
+{
+ CONSOLE_INIT_FLAG_NONE = 0,
+ CONSOLE_INIT_FLAG_REGED,
+ CONSOLE_INIT_FLAG_INITED,
+};
+
+static struct rt_console_device _console;
+
+rt_inline struct rt_wqueue *wait_queue_get(struct rt_lwp * lwp)
+{
+ if (lwp == RT_PROCESS_KERNEL)
+ {
+ return &_console.wait_queue;
+ }
+ return &lwp->wait_queue;
+}
+
+rt_inline struct rt_wqueue *wait_queue_current_get(void)
+{
+ return wait_queue_get(_console.foreground);
+}
+
+static void console_wakeup_check(struct rt_console_device *console)
+{
+ rt_size_t len;
+ struct rt_wqueue *wq;
+
+ len = rt_ringbuffer_data_len(&console->input_rb);
+ if (len)
+ {
+ wq = wait_queue_current_get();
+ rt_wqueue_wakeup(wq, (void*)POLLIN);
+ }
+}
+
+static void console_rx_notify(struct rt_device *dev)
+{
+ struct rt_console_device *console;
+ rt_size_t len;
+ rt_uint8_t ch;
+
+ console = (struct rt_console_device *)dev;
+ RT_ASSERT(console != RT_NULL);
+
+ while (1)
+ {
+ len = rt_device_read(console->iodev, -1, &ch, 1);
+ if (len == 0)
+ {
+ break;
+ }
+ if (ch == CHAR_CTRL_D) /* ctrl-d */
+ {
+ console->foreground = RT_PROCESS_KERNEL;
+ }
+ else if (ch == CHAR_CTRL_C) /* ctrl-c */
+ {
+ struct rt_lwp *lwp = console->foreground;
+
+ if (lwp)
+ {
+ lwp_kill(lwp_to_pid(lwp), SIGINT);
+ }
+ }
+ else
+ {
+ rt_ringbuffer_put_force(&console->input_rb, &ch, 1);
+ }
+ }
+ console_wakeup_check(console);
+}
+
+void rt_console_set_foreground(struct rt_lwp *lwp)
+{
+ rt_base_t level;
+
+ level = rt_hw_interrupt_disable();
+ if (_console.init_flag != CONSOLE_INIT_FLAG_INITED)
+ {
+ goto exit;
+ }
+ _console.foreground = lwp;
+ console_wakeup_check(&_console);
+
+exit:
+ rt_hw_interrupt_enable(level);
+}
+
+struct rt_lwp * rt_console_get_foreground(void)
+{
+ struct rt_lwp *lwp;
+ rt_base_t level;
+
+ level = rt_hw_interrupt_disable();
+ lwp = _console.foreground;
+ rt_hw_interrupt_enable(level);
+
+ return lwp;
+}
+
+static void iodev_close(struct rt_console_device *console)
+{
+ struct rt_device_notify rx_notify;
+
+ rx_notify.notify = RT_NULL;
+ rx_notify.dev = RT_NULL;
+
+ /* clear notify */
+ rt_device_control(console->iodev, RT_DEVICE_CTRL_NOTIFY_SET, &rx_notify);
+ rt_device_close(console->iodev);
+}
+
+static rt_err_t iodev_open(struct rt_console_device *console)
+{
+ rt_err_t ret;
+ struct rt_device_notify rx_notify;
+ rt_uint16_t oflags;
+
+ rt_device_control(console->iodev, RT_DEVICE_CTRL_CONSOLE_OFLAG, &oflags);
+
+ ret = rt_device_open(console->iodev, oflags);
+ if (ret != RT_EOK)
+ {
+ return RT_ERROR;
+ }
+
+ rx_notify.notify = console_rx_notify;
+ rx_notify.dev = (struct rt_device *)console;
+ rt_device_control(console->iodev, RT_DEVICE_CTRL_NOTIFY_SET, &rx_notify);
+ return RT_EOK;
+}
+
+struct rt_device *rt_console_get_iodev(void)
+{
+ rt_base_t level;
+ struct rt_device *iodev;
+
+ level = rt_hw_interrupt_disable();
+ iodev = _console.iodev;
+ rt_hw_interrupt_enable(level);
+ return iodev;
+}
+
+struct rt_device *rt_console_set_iodev(struct rt_device *iodev)
+{
+ rt_base_t level;
+ struct rt_device *io_before;
+ struct rt_console_device *console;
+
+ RT_ASSERT(iodev != RT_NULL);
+
+ console = &_console;
+
+ level = rt_hw_interrupt_disable();
+
+ RT_ASSERT(console->init_flag >= CONSOLE_INIT_FLAG_REGED);
+
+ io_before = console->iodev;
+
+ if (iodev == io_before)
+ {
+ goto exit;
+ }
+
+ if (console->init_flag >= CONSOLE_INIT_FLAG_INITED)
+ {
+ /* close old device */
+ iodev_close(console);
+ }
+
+ console->iodev = iodev;
+
+ if (console->init_flag >= CONSOLE_INIT_FLAG_INITED)
+ {
+ rt_err_t ret;
+ /* open new device */
+ ret = iodev_open(console);
+ RT_ASSERT(ret == RT_EOK);
+ }
+
+exit:
+ rt_hw_interrupt_enable(level);
+ return io_before;
+}
+
+#ifdef RT_USING_POSIX
+
+/* fops for console */
+static int console_fops_open(struct dfs_fd *fd)
+{
+ int ret;
+ struct rt_device * device;
+
+ device = (struct rt_device *)fd->data;
+ RT_ASSERT(device != RT_NULL);
+
+ ret = rt_device_open(device, fd->flags);
+ return ret;
+}
+
+static int console_fops_close(struct dfs_fd *fd)
+{
+ int ret;
+ struct rt_device * device;
+
+ device = (struct rt_device *)fd->data;
+ RT_ASSERT(device != RT_NULL);
+
+ ret = rt_device_close(device);
+ return ret;
+}
+
+static int console_fops_read(struct dfs_fd *fd, void *buf, size_t count)
+{
+ rt_base_t level;
+ int size = 0;
+ struct rt_console_device *console;
+ struct rt_lwp *lwp;
+ struct rt_wqueue *wq;
+ int wait_ret;
+
+ console = (struct rt_console_device *)fd->data;
+ RT_ASSERT(console != RT_NULL);
+ RT_ASSERT(console->init_flag == CONSOLE_INIT_FLAG_INITED);
+
+ lwp = (struct rt_lwp *)(rt_thread_self()->lwp);
+
+ wq = wait_queue_get(lwp);
+
+ level = rt_hw_interrupt_disable();
+ while (count)
+ {
+ size = rt_device_read((struct rt_device *)console, -1, buf, count);
+ if (size > 0)
+ {
+ break;
+ }
+ if (fd->flags & O_NONBLOCK)
+ {
+ break;
+ }
+ wait_ret = rt_wqueue_wait_interruptible(wq, 0, RT_WAITING_FOREVER);
+ if (wait_ret != 0)
+ {
+ break;
+ }
+ }
+ rt_hw_interrupt_enable(level);
+ if (size < 0)
+ {
+ size = 0;
+ }
+ return size;
+}
+
+static int console_fops_write(struct dfs_fd *fd, const void *buf, size_t count)
+{
+ int size;
+ struct rt_device * device;
+
+ device = (struct rt_device *)fd->data;
+ RT_ASSERT(device != RT_NULL);
+ size = rt_device_write(device, -1, buf, count);
+ return size;
+}
+
+static int console_fops_poll(struct dfs_fd *fd, struct rt_pollreq *req)
+{
+ rt_base_t level;
+ int mask = POLLOUT;
+ struct rt_device * device;
+ struct rt_console_device *console;
+ struct rt_wqueue *wq;
+ struct rt_lwp *lwp;
+
+ device = (struct rt_device *)fd->data;
+ RT_ASSERT(device != RT_NULL);
+
+ console = (struct rt_console_device *)device;
+ RT_ASSERT(console->init_flag == CONSOLE_INIT_FLAG_INITED);
+
+ lwp = (struct rt_lwp *)(rt_thread_self()->lwp);
+ wq = wait_queue_get(lwp);
+ rt_poll_add(wq, req);
+
+ level = rt_hw_interrupt_disable();
+ if (lwp == console->foreground)
+ {
+ rt_size_t len;
+
+ len = rt_ringbuffer_data_len(&console->input_rb);
+ if (len)
+ {
+ mask |= POLLIN;
+ }
+ }
+ rt_hw_interrupt_enable(level);
+
+ return mask;
+}
+
+const static struct dfs_file_ops _console_fops =
+{
+ console_fops_open,
+ console_fops_close,
+ RT_NULL,
+ console_fops_read,
+ console_fops_write,
+ RT_NULL, /* flush */
+ RT_NULL, /* lseek */
+ RT_NULL, /* getdents */
+ console_fops_poll,
+};
+
+#endif
+
+/* RT-Thread Device Interface */
+/*
+ * This function initializes console device.
+ */
+static rt_err_t rt_console_init(struct rt_device *dev)
+{
+ rt_base_t level;
+ rt_err_t result;
+ struct rt_console_device *console;
+
+ RT_ASSERT(dev != RT_NULL);
+
+ console = (struct rt_console_device *)dev;
+
+ level = rt_hw_interrupt_disable();
+
+ RT_ASSERT(console->init_flag == CONSOLE_INIT_FLAG_REGED);
+
+ result = iodev_open(console);
+ if (result != RT_EOK)
+ {
+ goto exit;
+ }
+
+ console->init_flag = CONSOLE_INIT_FLAG_INITED;
+exit:
+ rt_hw_interrupt_enable(level);
+ return result;
+}
+
+static rt_err_t rt_console_open(struct rt_device *dev, rt_uint16_t oflag)
+{
+ rt_err_t result = RT_EOK;
+ struct rt_console_device *console;
+
+ RT_ASSERT(dev != RT_NULL);
+ console = (struct rt_console_device *)dev;
+ RT_ASSERT(console != RT_NULL);
+ RT_ASSERT(console->init_flag == CONSOLE_INIT_FLAG_INITED);
+ return result;
+}
+
+static rt_err_t rt_console_close(struct rt_device *dev)
+{
+ rt_err_t result = RT_EOK;
+ struct rt_console_device *console;
+
+ console = (struct rt_console_device *)dev;
+ RT_ASSERT(console != RT_NULL);
+ RT_ASSERT(console->init_flag == CONSOLE_INIT_FLAG_INITED);
+ return result;
+}
+
+static rt_size_t rt_console_read(struct rt_device *dev,
+ rt_off_t pos,
+ void *buffer,
+ rt_size_t size)
+{
+ rt_base_t level;
+ rt_size_t len = 0;
+ struct rt_lwp *lwp;
+ struct rt_console_device *console;
+
+ console = (struct rt_console_device *)dev;
+ RT_ASSERT(console != RT_NULL);
+ RT_ASSERT(console->init_flag == CONSOLE_INIT_FLAG_INITED);
+
+ level = rt_hw_interrupt_disable();
+ if (size)
+ {
+ lwp = lwp_self();
+ if (lwp == console->foreground)
+ {
+ len = rt_ringbuffer_data_len(&console->input_rb);
+ if (len > size)
+ {
+ len = size;
+ }
+ if (len)
+ {
+ len = rt_ringbuffer_get(&console->input_rb, buffer, len);
+ }
+ }
+ }
+ rt_hw_interrupt_enable(level);
+
+ return len;
+}
+
+static rt_size_t rt_console_write(struct rt_device *dev,
+ rt_off_t pos,
+ const void *buffer,
+ rt_size_t size)
+{
+ rt_base_t level;
+ rt_size_t len = 0;
+ struct rt_console_device *console;
+
+ console = (struct rt_console_device *)dev;
+ RT_ASSERT(console != RT_NULL);
+ RT_ASSERT(console->init_flag == CONSOLE_INIT_FLAG_INITED);
+
+ level = rt_hw_interrupt_disable();
+ len = rt_device_write((struct rt_device *)console->iodev, -1, buffer, size);
+ rt_hw_interrupt_enable(level);
+
+ return len;
+}
+
+#ifdef RT_USING_DEVICE_OPS
+const static struct rt_device_ops console_ops =
+{
+ rt_console_init,
+ rt_console_open,
+ rt_console_close,
+ rt_console_read,
+ rt_console_write,
+ RT_NULL,
+};
+#endif
+
+/*
+ * console register
+ */
+rt_err_t rt_console_register(const char *name, struct rt_device *iodev)
+{
+ rt_base_t level;
+ rt_err_t ret;
+ struct rt_device *device;
+ struct rt_console_device *console = &_console;
+
+ level = rt_hw_interrupt_disable();
+ RT_ASSERT(console->init_flag == CONSOLE_INIT_FLAG_NONE);
+ RT_ASSERT(iodev != RT_NULL);
+
+ device = &(console->parent);
+
+ device->type = RT_Device_Class_Char;
+
+#ifdef RT_USING_DEVICE_OPS
+ device->ops = &console_ops;
+#else
+ device->init = rt_console_init;
+ device->open = rt_console_open;
+ device->close = rt_console_close;
+ device->read = rt_console_read;
+ device->write = rt_console_write;
+ device->control = RT_NULL;
+#endif
+
+ /* register a character device */
+ ret = rt_device_register(device, name, 0);
+ if (ret != RT_EOK)
+ {
+ goto exit;
+ }
+
+#ifdef RT_USING_POSIX
+ /* set fops */
+ device->fops = &_console_fops;
+#endif
+
+ console->iodev = iodev;
+ console->foreground = RT_PROCESS_KERNEL;
+ rt_wqueue_init(&(console->wait_queue));
+
+ RT_ASSERT(LWP_CONSOLE_INPUT_BUFFER_SIZE > 0);
+ rt_ringbuffer_init(&console->input_rb, console->input_buf, LWP_CONSOLE_INPUT_BUFFER_SIZE);
+
+ console->init_flag = CONSOLE_INIT_FLAG_REGED;
+exit:
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
diff --git a/components/lwp/lwp_console.h b/components/lwp/lwp_console.h
new file mode 100644
index 0000000000000000000000000000000000000000..5b1702650769ffb313440d09be4109a269224ae9
--- /dev/null
+++ b/components/lwp/lwp_console.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-02-23 Jesven first version.
+ */
+#ifndef LWP_CONSOLE_H__
+#define LWP_CONSOLE_H__
+
+#include
+#include
+#include
+
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define RT_PROCESS_KERNEL RT_NULL
+
+struct rt_console_device
+{
+ struct rt_device parent;
+ int init_flag;
+ struct rt_device *iodev;
+ struct rt_lwp *foreground;
+ struct rt_wqueue wait_queue; /* for kernel when current == 0 */
+ struct rt_ringbuffer input_rb;
+ rt_uint8_t input_buf[LWP_CONSOLE_INPUT_BUFFER_SIZE];
+};
+
+rt_err_t rt_console_register(const char *name, struct rt_device *iodev);
+
+struct rt_device *rt_console_set_iodev(struct rt_device *iodev);
+struct rt_device *rt_console_get_iodev(void);
+
+void rt_console_set_foreground(struct rt_lwp *lwp);
+struct rt_lwp* rt_console_get_foreground(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWP_CONSOLE_H__*/
diff --git a/components/lwp/lwp_elf.h b/components/lwp/lwp_elf.h
new file mode 100644
index 0000000000000000000000000000000000000000..aae6c79d2eb9d1279575f9c43b6126e0fc94b289
--- /dev/null
+++ b/components/lwp/lwp_elf.h
@@ -0,0 +1,3500 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-10-28 Jesven first version
+ */
+#ifndef LWP_ELF_H__
+#define LWP_ELF_H__
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define elfhdr elf32_hdr
+#define elf_phdr elf32_phdr
+#define elf_shdr elf32_shdr
+#define elf_note elf32_note
+#define elf_addr_t Elf32_Off
+#define Elf_Half Elf32_Half
+
+/* Type for a 16-bit quantity. */
+typedef uint16_t Elf32_Half;
+typedef uint16_t Elf64_Half;
+
+/* Types for signed and unsigned 32-bit quantities. */
+typedef uint32_t Elf32_Word;
+typedef int32_t Elf32_Sword;
+typedef uint32_t Elf64_Word;
+typedef int32_t Elf64_Sword;
+
+/* Types for signed and unsigned 64-bit quantities. */
+typedef uint64_t Elf32_Xword;
+typedef int64_t Elf32_Sxword;
+typedef uint64_t Elf64_Xword;
+typedef int64_t Elf64_Sxword;
+
+/* Type of addresses. */
+typedef uint32_t Elf32_Addr;
+typedef uint64_t Elf64_Addr;
+
+/* Type of file offsets. */
+typedef uint32_t Elf32_Off;
+typedef uint64_t Elf64_Off;
+
+/* Type for section indices, which are 16-bit quantities. */
+typedef uint16_t Elf32_Section;
+typedef uint16_t Elf64_Section;
+
+/* Type for version symbol information. */
+typedef Elf32_Half Elf32_Versym;
+typedef Elf64_Half Elf64_Versym;
+
+
+/* The ELF file header. This appears at the start of every ELF file. */
+
+#define EI_NIDENT (16)
+
+typedef struct elfhdr
+{
+ unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
+ Elf32_Half e_type; /* Object file type */
+ Elf32_Half e_machine; /* Architecture */
+ Elf32_Word e_version; /* Object file version */
+ Elf32_Addr e_entry; /* Entry point virtual address */
+ Elf32_Off e_phoff; /* Program header table file offset */
+ Elf32_Off e_shoff; /* Section header table file offset */
+ Elf32_Word e_flags; /* Processor-specific flags */
+ Elf32_Half e_ehsize; /* ELF header size in bytes */
+ Elf32_Half e_phentsize; /* Program header table entry size */
+ Elf32_Half e_phnum; /* Program header table entry count */
+ Elf32_Half e_shentsize; /* Section header table entry size */
+ Elf32_Half e_shnum; /* Section header table entry count */
+ Elf32_Half e_shstrndx; /* Section header string table index */
+} Elf32_Ehdr;
+
+typedef struct
+{
+ unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
+ Elf64_Half e_type; /* Object file type */
+ Elf64_Half e_machine; /* Architecture */
+ Elf64_Word e_version; /* Object file version */
+ Elf64_Addr e_entry; /* Entry point virtual address */
+ Elf64_Off e_phoff; /* Program header table file offset */
+ Elf64_Off e_shoff; /* Section header table file offset */
+ Elf64_Word e_flags; /* Processor-specific flags */
+ Elf64_Half e_ehsize; /* ELF header size in bytes */
+ Elf64_Half e_phentsize; /* Program header table entry size */
+ Elf64_Half e_phnum; /* Program header table entry count */
+ Elf64_Half e_shentsize; /* Section header table entry size */
+ Elf64_Half e_shnum; /* Section header table entry count */
+ Elf64_Half e_shstrndx; /* Section header string table index */
+} Elf64_Ehdr;
+
+/* Fields in the e_ident array. The EI_* macros are indices into the
+ array. The macros under each EI_* macro are the values the byte
+ may have. */
+
+#define EI_MAG0 0 /* File identification byte 0 index */
+#define ELFMAG0 0x7f /* Magic number byte 0 */
+
+#define EI_MAG1 1 /* File identification byte 1 index */
+#define ELFMAG1 'E' /* Magic number byte 1 */
+
+#define EI_MAG2 2 /* File identification byte 2 index */
+#define ELFMAG2 'L' /* Magic number byte 2 */
+
+#define EI_MAG3 3 /* File identification byte 3 index */
+#define ELFMAG3 'F' /* Magic number byte 3 */
+
+/* Conglomeration of the identification bytes, for easy testing as a word. */
+#define ELFMAG "\177ELF"
+#define SELFMAG 4
+
+#define EI_CLASS 4 /* File class byte index */
+#define ELFCLASSNONE 0 /* Invalid class */
+#define ELFCLASS32 1 /* 32-bit objects */
+#define ELFCLASS64 2 /* 64-bit objects */
+#define ELFCLASSNUM 3
+
+#define EI_DATA 5 /* Data encoding byte index */
+#define ELFDATANONE 0 /* Invalid data encoding */
+#define ELFDATA2LSB 1 /* 2's complement, little endian */
+#define ELFDATA2MSB 2 /* 2's complement, big endian */
+#define ELFDATANUM 3
+
+#define EI_VERSION 6 /* File version byte index */
+ /* Value must be EV_CURRENT */
+
+#define EI_OSABI 7 /* OS ABI identification */
+#define ELFOSABI_NONE 0 /* UNIX System V ABI */
+#define ELFOSABI_SYSV 0 /* Alias. */
+#define ELFOSABI_HPUX 1 /* HP-UX */
+#define ELFOSABI_NETBSD 2 /* NetBSD. */
+#define ELFOSABI_GNU 3 /* Object uses GNU ELF extensions. */
+#define ELFOSABI_LINUX ELFOSABI_GNU /* Compatibility alias. */
+#define ELFOSABI_SOLARIS 6 /* Sun Solaris. */
+#define ELFOSABI_AIX 7 /* IBM AIX. */
+#define ELFOSABI_IRIX 8 /* SGI Irix. */
+#define ELFOSABI_FREEBSD 9 /* FreeBSD. */
+#define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX. */
+#define ELFOSABI_MODESTO 11 /* Novell Modesto. */
+#define ELFOSABI_OPENBSD 12 /* OpenBSD. */
+#define ELFOSABI_ARM_AEABI 64 /* ARM EABI */
+#define ELFOSABI_ARM 97 /* ARM */
+#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */
+
+#define EI_ABIVERSION 8 /* ABI version */
+
+#define EI_PAD 9 /* Byte index of padding bytes */
+
+/* Legal values for e_type (object file type). */
+
+#define ET_NONE 0 /* No file type */
+#define ET_REL 1 /* Relocatable file */
+#define ET_EXEC 2 /* Executable file */
+#define ET_DYN 3 /* Shared object file */
+#define ET_CORE 4 /* Core file */
+#define ET_NUM 5 /* Number of defined types */
+#define ET_LOOS 0xfe00 /* OS-specific range start */
+#define ET_HIOS 0xfeff /* OS-specific range end */
+#define ET_LOPROC 0xff00 /* Processor-specific range start */
+#define ET_HIPROC 0xffff /* Processor-specific range end */
+
+/* Legal values for e_machine (architecture). */
+
+#define EM_NONE 0 /* No machine */
+#define EM_M32 1 /* AT&T WE 32100 */
+#define EM_SPARC 2 /* SUN SPARC */
+#define EM_386 3 /* Intel 80386 */
+#define EM_68K 4 /* Motorola m68k family */
+#define EM_88K 5 /* Motorola m88k family */
+#define EM_860 7 /* Intel 80860 */
+#define EM_MIPS 8 /* MIPS R3000 big-endian */
+#define EM_S370 9 /* IBM System/370 */
+#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */
+
+#define EM_PARISC 15 /* HPPA */
+#define EM_VPP500 17 /* Fujitsu VPP500 */
+#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
+#define EM_960 19 /* Intel 80960 */
+#define EM_PPC 20 /* PowerPC */
+#define EM_PPC64 21 /* PowerPC 64-bit */
+#define EM_S390 22 /* IBM S390 */
+
+#define EM_V800 36 /* NEC V800 series */
+#define EM_FR20 37 /* Fujitsu FR20 */
+#define EM_RH32 38 /* TRW RH-32 */
+#define EM_RCE 39 /* Motorola RCE */
+#define EM_ARM 40 /* ARM */
+#define EM_FAKE_ALPHA 41 /* Digital Alpha */
+#define EM_SH 42 /* Hitachi SH */
+#define EM_SPARCV9 43 /* SPARC v9 64-bit */
+#define EM_TRICORE 44 /* Siemens Tricore */
+#define EM_ARC 45 /* Argonaut RISC Core */
+#define EM_H8_300 46 /* Hitachi H8/300 */
+#define EM_H8_300H 47 /* Hitachi H8/300H */
+#define EM_H8S 48 /* Hitachi H8S */
+#define EM_H8_500 49 /* Hitachi H8/500 */
+#define EM_IA_64 50 /* Intel Merced */
+#define EM_MIPS_X 51 /* Stanford MIPS-X */
+#define EM_COLDFIRE 52 /* Motorola Coldfire */
+#define EM_68HC12 53 /* Motorola M68HC12 */
+#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator*/
+#define EM_PCP 55 /* Siemens PCP */
+#define EM_NCPU 56 /* Sony nCPU embeeded RISC */
+#define EM_NDR1 57 /* Denso NDR1 microprocessor */
+#define EM_STARCORE 58 /* Motorola Start*Core processor */
+#define EM_ME16 59 /* Toyota ME16 processor */
+#define EM_ST100 60 /* STMicroelectronic ST100 processor */
+#define EM_TINYJ 61 /* Advanced Logic Corp. Tinyj emb.fam*/
+#define EM_X86_64 62 /* AMD x86-64 architecture */
+#define EM_PDSP 63 /* Sony DSP Processor */
+
+#define EM_FX66 66 /* Siemens FX66 microcontroller */
+#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 mc */
+#define EM_ST7 68 /* STmicroelectronics ST7 8 bit mc */
+#define EM_68HC16 69 /* Motorola MC68HC16 microcontroller */
+#define EM_68HC11 70 /* Motorola MC68HC11 microcontroller */
+#define EM_68HC08 71 /* Motorola MC68HC08 microcontroller */
+#define EM_68HC05 72 /* Motorola MC68HC05 microcontroller */
+#define EM_SVX 73 /* Silicon Graphics SVx */
+#define EM_ST19 74 /* STMicroelectronics ST19 8 bit mc */
+#define EM_VAX 75 /* Digital VAX */
+#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */
+#define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded processor */
+#define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor */
+#define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor */
+#define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */
+#define EM_HUANY 81 /* Harvard University machine-independent object files */
+#define EM_PRISM 82 /* SiTera Prism */
+#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */
+#define EM_FR30 84 /* Fujitsu FR30 */
+#define EM_D10V 85 /* Mitsubishi D10V */
+#define EM_D30V 86 /* Mitsubishi D30V */
+#define EM_V850 87 /* NEC v850 */
+#define EM_M32R 88 /* Mitsubishi M32R */
+#define EM_MN10300 89 /* Matsushita MN10300 */
+#define EM_MN10200 90 /* Matsushita MN10200 */
+#define EM_PJ 91 /* picoJava */
+#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */
+#define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */
+#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */
+#define EM_ALTERA_NIOS2 113 /* Altera Nios II */
+#define EM_AARCH64 183 /* ARM AARCH64 */
+#define EM_TILEPRO 188 /* Tilera TILEPro */
+#define EM_MICROBLAZE 189 /* Xilinx MicroBlaze */
+#define EM_TILEGX 191 /* Tilera TILE-Gx */
+#define EM_NUM 192
+
+/* If it is necessary to assign new unofficial EM_* values, please
+ pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
+ chances of collision with official or non-GNU unofficial values. */
+
+#define EM_ALPHA 0x9026
+
+/* Legal values for e_version (version). */
+
+#define EV_NONE 0 /* Invalid ELF version */
+#define EV_CURRENT 1 /* Current version */
+#define EV_NUM 2
+
+/* Section header. */
+
+typedef struct
+{
+ Elf32_Word sh_name; /* Section name (string tbl index) */
+ Elf32_Word sh_type; /* Section type */
+ Elf32_Word sh_flags; /* Section flags */
+ Elf32_Addr sh_addr; /* Section virtual addr at execution */
+ Elf32_Off sh_offset; /* Section file offset */
+ Elf32_Word sh_size; /* Section size in bytes */
+ Elf32_Word sh_link; /* Link to another section */
+ Elf32_Word sh_info; /* Additional section information */
+ Elf32_Word sh_addralign; /* Section alignment */
+ Elf32_Word sh_entsize; /* Entry size if section holds table */
+} Elf32_Shdr;
+
+typedef struct
+{
+ Elf64_Word sh_name; /* Section name (string tbl index) */
+ Elf64_Word sh_type; /* Section type */
+ Elf64_Xword sh_flags; /* Section flags */
+ Elf64_Addr sh_addr; /* Section virtual addr at execution */
+ Elf64_Off sh_offset; /* Section file offset */
+ Elf64_Xword sh_size; /* Section size in bytes */
+ Elf64_Word sh_link; /* Link to another section */
+ Elf64_Word sh_info; /* Additional section information */
+ Elf64_Xword sh_addralign; /* Section alignment */
+ Elf64_Xword sh_entsize; /* Entry size if section holds table */
+} Elf64_Shdr;
+
+/* Special section indices. */
+
+#define SHN_UNDEF 0 /* Undefined section */
+#define SHN_LORESERVE 0xff00 /* Start of reserved indices */
+#define SHN_LOPROC 0xff00 /* Start of processor-specific */
+#define SHN_BEFORE 0xff00 /* Order section before all others
+ (Solaris). */
+#define SHN_AFTER 0xff01 /* Order section after all others
+ (Solaris). */
+#define SHN_HIPROC 0xff1f /* End of processor-specific */
+#define SHN_LOOS 0xff20 /* Start of OS-specific */
+#define SHN_HIOS 0xff3f /* End of OS-specific */
+#define SHN_ABS 0xfff1 /* Associated symbol is absolute */
+#define SHN_COMMON 0xfff2 /* Associated symbol is common */
+#define SHN_XINDEX 0xffff /* Index is in extra table. */
+#define SHN_HIRESERVE 0xffff /* End of reserved indices */
+
+/* Legal values for sh_type (section type). */
+
+#define SHT_NULL 0 /* Section header table entry unused */
+#define SHT_PROGBITS 1 /* Program data */
+#define SHT_SYMTAB 2 /* Symbol table */
+#define SHT_STRTAB 3 /* String table */
+#define SHT_RELA 4 /* Relocation entries with addends */
+#define SHT_HASH 5 /* Symbol hash table */
+#define SHT_DYNAMIC 6 /* Dynamic linking information */
+#define SHT_NOTE 7 /* Notes */
+#define SHT_NOBITS 8 /* Program space with no data (bss) */
+#define SHT_REL 9 /* Relocation entries, no addends */
+#define SHT_SHLIB 10 /* Reserved */
+#define SHT_DYNSYM 11 /* Dynamic linker symbol table */
+#define SHT_INIT_ARRAY 14 /* Array of constructors */
+#define SHT_FINI_ARRAY 15 /* Array of destructors */
+#define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */
+#define SHT_GROUP 17 /* Section group */
+#define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */
+#define SHT_NUM 19 /* Number of defined types. */
+#define SHT_LOOS 0x60000000 /* Start OS-specific. */
+#define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes. */
+#define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */
+#define SHT_GNU_LIBLIST 0x6ffffff7 /* Prelink library list */
+#define SHT_CHECKSUM 0x6ffffff8 /* Checksum for DSO content. */
+#define SHT_LOSUNW 0x6ffffffa /* Sun-specific low bound. */
+#define SHT_SUNW_move 0x6ffffffa
+#define SHT_SUNW_COMDAT 0x6ffffffb
+#define SHT_SUNW_syminfo 0x6ffffffc
+#define SHT_GNU_verdef 0x6ffffffd /* Version definition section. */
+#define SHT_GNU_verneed 0x6ffffffe /* Version needs section. */
+#define SHT_GNU_versym 0x6fffffff /* Version symbol table. */
+#define SHT_HISUNW 0x6fffffff /* Sun-specific high bound. */
+#define SHT_HIOS 0x6fffffff /* End OS-specific type */
+#define SHT_LOPROC 0x70000000 /* Start of processor-specific */
+#define SHT_HIPROC 0x7fffffff /* End of processor-specific */
+#define SHT_LOUSER 0x80000000 /* Start of application-specific */
+#define SHT_HIUSER 0x8fffffff /* End of application-specific */
+
+/* Legal values for sh_flags (section flags). */
+
+#define SHF_WRITE (1 << 0) /* Writable */
+#define SHF_ALLOC (1 << 1) /* Occupies memory during execution */
+#define SHF_EXECINSTR (1 << 2) /* Executable */
+#define SHF_MERGE (1 << 4) /* Might be merged */
+#define SHF_STRINGS (1 << 5) /* Contains nul-terminated strings */
+#define SHF_INFO_LINK (1 << 6) /* `sh_info' contains SHT index */
+#define SHF_LINK_ORDER (1 << 7) /* Preserve order after combining */
+#define SHF_OS_NONCONFORMING (1 << 8) /* Non-standard OS specific handling
+ required */
+#define SHF_GROUP (1 << 9) /* Section is member of a group. */
+#define SHF_TLS (1 << 10) /* Section hold thread-local data. */
+#define SHF_COMPRESSED (1 << 11) /* Section with compressed data. */
+#define SHF_MASKOS 0x0ff00000 /* OS-specific. */
+#define SHF_MASKPROC 0xf0000000 /* Processor-specific */
+#define SHF_ORDERED (1 << 30) /* Special ordering requirement
+ (Solaris). */
+#define SHF_EXCLUDE (1U << 31) /* Section is excluded unless
+ referenced or allocated (Solaris).*/
+
+/* Section compression header. Used when SHF_COMPRESSED is set. */
+
+typedef struct
+{
+ Elf32_Word ch_type; /* Compression format. */
+ Elf32_Word ch_size; /* Uncompressed data size. */
+ Elf32_Word ch_addralign; /* Uncompressed data alignment. */
+} Elf32_Chdr;
+
+typedef struct
+{
+ Elf64_Word ch_type; /* Compression format. */
+ Elf64_Word ch_reserved;
+ Elf64_Xword ch_size; /* Uncompressed data size. */
+ Elf64_Xword ch_addralign; /* Uncompressed data alignment. */
+} Elf64_Chdr;
+
+/* Legal values for ch_type (compression algorithm). */
+#define ELFCOMPRESS_ZLIB 1 /* ZLIB/DEFLATE algorithm. */
+#define ELFCOMPRESS_LOOS 0x60000000 /* Start of OS-specific. */
+#define ELFCOMPRESS_HIOS 0x6fffffff /* End of OS-specific. */
+#define ELFCOMPRESS_LOPROC 0x70000000 /* Start of processor-specific. */
+#define ELFCOMPRESS_HIPROC 0x7fffffff /* End of processor-specific. */
+
+/* Section group handling. */
+#define GRP_COMDAT 0x1 /* Mark group as COMDAT. */
+
+/* Symbol table entry. */
+
+typedef struct
+{
+ Elf32_Word st_name; /* Symbol name (string tbl index) */
+ Elf32_Addr st_value; /* Symbol value */
+ Elf32_Word st_size; /* Symbol size */
+ unsigned char st_info; /* Symbol type and binding */
+ unsigned char st_other; /* Symbol visibility */
+ Elf32_Section st_shndx; /* Section index */
+} Elf32_Sym;
+
+typedef struct
+{
+ Elf64_Word st_name; /* Symbol name (string tbl index) */
+ unsigned char st_info; /* Symbol type and binding */
+ unsigned char st_other; /* Symbol visibility */
+ Elf64_Section st_shndx; /* Section index */
+ Elf64_Addr st_value; /* Symbol value */
+ Elf64_Xword st_size; /* Symbol size */
+} Elf64_Sym;
+
+/* The syminfo section if available contains additional information about
+ every dynamic symbol. */
+
+typedef struct
+{
+ Elf32_Half si_boundto; /* Direct bindings, symbol bound to */
+ Elf32_Half si_flags; /* Per symbol flags */
+} Elf32_Syminfo;
+
+typedef struct
+{
+ Elf64_Half si_boundto; /* Direct bindings, symbol bound to */
+ Elf64_Half si_flags; /* Per symbol flags */
+} Elf64_Syminfo;
+
+/* Possible values for si_boundto. */
+#define SYMINFO_BT_SELF 0xffff /* Symbol bound to self */
+#define SYMINFO_BT_PARENT 0xfffe /* Symbol bound to parent */
+#define SYMINFO_BT_LOWRESERVE 0xff00 /* Beginning of reserved entries */
+
+/* Possible bitmasks for si_flags. */
+#define SYMINFO_FLG_DIRECT 0x0001 /* Direct bound symbol */
+#define SYMINFO_FLG_PASSTHRU 0x0002 /* Pass-thru symbol for translator */
+#define SYMINFO_FLG_COPY 0x0004 /* Symbol is a copy-reloc */
+#define SYMINFO_FLG_LAZYLOAD 0x0008 /* Symbol bound to object to be lazy
+ loaded */
+/* Syminfo version values. */
+#define SYMINFO_NONE 0
+#define SYMINFO_CURRENT 1
+#define SYMINFO_NUM 2
+
+
+/* How to extract and insert information held in the st_info field. */
+
+#define ELF32_ST_BIND(val) (((unsigned char) (val)) >> 4)
+#define ELF32_ST_TYPE(val) ((val) & 0xf)
+#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
+
+/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field. */
+#define ELF64_ST_BIND(val) ELF32_ST_BIND (val)
+#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val)
+#define ELF64_ST_INFO(bind, type) ELF32_ST_INFO ((bind), (type))
+
+/* Legal values for ST_BIND subfield of st_info (symbol binding). */
+
+#define STB_LOCAL 0 /* Local symbol */
+#define STB_GLOBAL 1 /* Global symbol */
+#define STB_WEAK 2 /* Weak symbol */
+#define STB_NUM 3 /* Number of defined types. */
+#define STB_LOOS 10 /* Start of OS-specific */
+#define STB_GNU_UNIQUE 10 /* Unique symbol. */
+#define STB_HIOS 12 /* End of OS-specific */
+#define STB_LOPROC 13 /* Start of processor-specific */
+#define STB_HIPROC 15 /* End of processor-specific */
+
+/* Legal values for ST_TYPE subfield of st_info (symbol type). */
+
+#define STT_NOTYPE 0 /* Symbol type is unspecified */
+#define STT_OBJECT 1 /* Symbol is a data object */
+#define STT_FUNC 2 /* Symbol is a code object */
+#define STT_SECTION 3 /* Symbol associated with a section */
+#define STT_FILE 4 /* Symbol's name is file name */
+#define STT_COMMON 5 /* Symbol is a common data object */
+#define STT_TLS 6 /* Symbol is thread-local data object*/
+#define STT_NUM 7 /* Number of defined types. */
+#define STT_LOOS 10 /* Start of OS-specific */
+#define STT_GNU_IFUNC 10 /* Symbol is indirect code object */
+#define STT_HIOS 12 /* End of OS-specific */
+#define STT_LOPROC 13 /* Start of processor-specific */
+#define STT_HIPROC 15 /* End of processor-specific */
+
+
+/* Symbol table indices are found in the hash buckets and chain table
+ of a symbol hash table section. This special index value indicates
+ the end of a chain, meaning no further symbols are found in that bucket. */
+
+#define STN_UNDEF 0 /* End of a chain. */
+
+
+/* How to extract and insert information held in the st_other field. */
+
+#define ELF32_ST_VISIBILITY(o) ((o) & 0x03)
+
+/* For ELF64 the definitions are the same. */
+#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o)
+
+/* Symbol visibility specification encoded in the st_other field. */
+#define STV_DEFAULT 0 /* Default symbol visibility rules */
+#define STV_INTERNAL 1 /* Processor specific hidden class */
+#define STV_HIDDEN 2 /* Sym unavailable in other modules */
+#define STV_PROTECTED 3 /* Not preemptible, not exported */
+
+
+/* Relocation table entry without addend (in section of type SHT_REL). */
+
+typedef struct
+{
+ Elf32_Addr r_offset; /* Address */
+ Elf32_Word r_info; /* Relocation type and symbol index */
+} Elf32_Rel;
+
+/* I have seen two different definitions of the Elf64_Rel and
+ Elf64_Rela structures, so we'll leave them out until Novell (or
+ whoever) gets their act together. */
+/* The following, at least, is used on Sparc v9, MIPS, and Alpha. */
+
+typedef struct
+{
+ Elf64_Addr r_offset; /* Address */
+ Elf64_Xword r_info; /* Relocation type and symbol index */
+} Elf64_Rel;
+
+/* Relocation table entry with addend (in section of type SHT_RELA). */
+
+typedef struct
+{
+ Elf32_Addr r_offset; /* Address */
+ Elf32_Word r_info; /* Relocation type and symbol index */
+ Elf32_Sword r_addend; /* Addend */
+} Elf32_Rela;
+
+typedef struct
+{
+ Elf64_Addr r_offset; /* Address */
+ Elf64_Xword r_info; /* Relocation type and symbol index */
+ Elf64_Sxword r_addend; /* Addend */
+} Elf64_Rela;
+
+/* How to extract and insert information held in the r_info field. */
+
+#define ELF32_R_SYM(val) ((val) >> 8)
+#define ELF32_R_TYPE(val) ((val) & 0xff)
+#define ELF32_R_INFO(sym, type) (((sym) << 8) + ((type) & 0xff))
+
+#define ELF64_R_SYM(i) ((i) >> 32)
+#define ELF64_R_TYPE(i) ((i) & 0xffffffff)
+#define ELF64_R_INFO(sym,type) ((((Elf64_Xword) (sym)) << 32) + (type))
+
+/* Program segment header. */
+
+typedef struct elf_phdr
+{
+ Elf32_Word p_type; /* Segment type */
+ Elf32_Off p_offset; /* Segment file offset */
+ Elf32_Addr p_vaddr; /* Segment virtual address */
+ Elf32_Addr p_paddr; /* Segment physical address */
+ Elf32_Word p_filesz; /* Segment size in file */
+ Elf32_Word p_memsz; /* Segment size in memory */
+ Elf32_Word p_flags; /* Segment flags */
+ Elf32_Word p_align; /* Segment alignment */
+} Elf32_Phdr;
+
+typedef struct
+{
+ Elf64_Word p_type; /* Segment type */
+ Elf64_Word p_flags; /* Segment flags */
+ Elf64_Off p_offset; /* Segment file offset */
+ Elf64_Addr p_vaddr; /* Segment virtual address */
+ Elf64_Addr p_paddr; /* Segment physical address */
+ Elf64_Xword p_filesz; /* Segment size in file */
+ Elf64_Xword p_memsz; /* Segment size in memory */
+ Elf64_Xword p_align; /* Segment alignment */
+} Elf64_Phdr;
+
+/* Special value for e_phnum. This indicates that the real number of
+ program headers is too large to fit into e_phnum. Instead the real
+ value is in the field sh_info of section 0. */
+
+#define PN_XNUM 0xffff
+
+/* Legal values for p_type (segment type). */
+
+#define PT_NULL 0 /* Program header table entry unused */
+#define PT_LOAD 1 /* Loadable program segment */
+#define PT_DYNAMIC 2 /* Dynamic linking information */
+#define PT_INTERP 3 /* Program interpreter */
+#define PT_NOTE 4 /* Auxiliary information */
+#define PT_SHLIB 5 /* Reserved */
+#define PT_PHDR 6 /* Entry for header table itself */
+#define PT_TLS 7 /* Thread-local storage segment */
+#define PT_NUM 8 /* Number of defined types */
+#define PT_LOOS 0x60000000 /* Start of OS-specific */
+#define PT_GNU_EH_FRAME 0x6474e550 /* GCC .eh_frame_hdr segment */
+#define PT_GNU_STACK 0x6474e551 /* Indicates stack executability */
+#define PT_GNU_RELRO 0x6474e552 /* Read-only after relocation */
+#define PT_LOSUNW 0x6ffffffa
+#define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */
+#define PT_SUNWSTACK 0x6ffffffb /* Stack segment */
+#define PT_HISUNW 0x6fffffff
+#define PT_HIOS 0x6fffffff /* End of OS-specific */
+#define PT_LOPROC 0x70000000 /* Start of processor-specific */
+#define PT_HIPROC 0x7fffffff /* End of processor-specific */
+
+/* Legal values for p_flags (segment flags). */
+
+#define PF_X (1 << 0) /* Segment is executable */
+#define PF_W (1 << 1) /* Segment is writable */
+#define PF_R (1 << 2) /* Segment is readable */
+#define PF_MASKOS 0x0ff00000 /* OS-specific */
+#define PF_MASKPROC 0xf0000000 /* Processor-specific */
+
+/* Legal values for note segment descriptor types for core files. */
+
+#define NT_PRSTATUS 1 /* Contains copy of prstatus struct */
+#define NT_FPREGSET 2 /* Contains copy of fpregset struct */
+#define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */
+#define NT_PRXREG 4 /* Contains copy of prxregset struct */
+#define NT_TASKSTRUCT 4 /* Contains copy of task structure */
+#define NT_PLATFORM 5 /* String from sysinfo(SI_PLATFORM) */
+#define NT_AUXV 6 /* Contains copy of auxv array */
+#define NT_GWINDOWS 7 /* Contains copy of gwindows struct */
+#define NT_ASRS 8 /* Contains copy of asrset struct */
+#define NT_PSTATUS 10 /* Contains copy of pstatus struct */
+#define NT_PSINFO 13 /* Contains copy of psinfo struct */
+#define NT_PRCRED 14 /* Contains copy of prcred struct */
+#define NT_UTSNAME 15 /* Contains copy of utsname struct */
+#define NT_LWPSTATUS 16 /* Contains copy of lwpstatus struct */
+#define NT_LWPSINFO 17 /* Contains copy of lwpinfo struct */
+#define NT_PRFPXREG 20 /* Contains copy of fprxregset struct */
+#define NT_SIGINFO 0x53494749 /* Contains copy of siginfo_t,
+ size might increase */
+#define NT_FILE 0x46494c45 /* Contains information about mapped
+ files */
+#define NT_PRXFPREG 0x46e62b7f /* Contains copy of user_fxsr_struct */
+#define NT_PPC_VMX 0x100 /* PowerPC Altivec/VMX registers */
+#define NT_PPC_SPE 0x101 /* PowerPC SPE/EVR registers */
+#define NT_PPC_VSX 0x102 /* PowerPC VSX registers */
+#define NT_386_TLS 0x200 /* i386 TLS slots (struct user_desc) */
+#define NT_386_IOPERM 0x201 /* x86 io permission bitmap (1=deny) */
+#define NT_X86_XSTATE 0x202 /* x86 extended state using xsave */
+#define NT_S390_HIGH_GPRS 0x300 /* s390 upper register halves */
+#define NT_S390_TIMER 0x301 /* s390 timer register */
+#define NT_S390_TODCMP 0x302 /* s390 TOD clock comparator register */
+#define NT_S390_TODPREG 0x303 /* s390 TOD programmable register */
+#define NT_S390_CTRS 0x304 /* s390 control registers */
+#define NT_S390_PREFIX 0x305 /* s390 prefix register */
+#define NT_S390_LAST_BREAK 0x306 /* s390 breaking event address */
+#define NT_S390_SYSTEM_CALL 0x307 /* s390 system call restart data */
+#define NT_S390_TDB 0x308 /* s390 transaction diagnostic block */
+#define NT_ARM_VFP 0x400 /* ARM VFP/NEON registers */
+#define NT_ARM_TLS 0x401 /* ARM TLS register */
+#define NT_ARM_HW_BREAK 0x402 /* ARM hardware breakpoint registers */
+#define NT_ARM_HW_WATCH 0x403 /* ARM hardware watchpoint registers */
+
+/* Legal values for the note segment descriptor types for object files. */
+
+#define NT_VERSION 1 /* Contains a version string. */
+
+
+/* Dynamic section entry. */
+
+typedef struct
+{
+ Elf32_Sword d_tag; /* Dynamic entry type */
+ union
+ {
+ Elf32_Word d_val; /* Integer value */
+ Elf32_Addr d_ptr; /* Address value */
+ } d_un;
+} Elf32_Dyn;
+
+typedef struct
+{
+ Elf64_Sxword d_tag; /* Dynamic entry type */
+ union
+ {
+ Elf64_Xword d_val; /* Integer value */
+ Elf64_Addr d_ptr; /* Address value */
+ } d_un;
+} Elf64_Dyn;
+
+/* Legal values for d_tag (dynamic entry type). */
+
+#define DT_NULL 0 /* Marks end of dynamic section */
+#define DT_NEEDED 1 /* Name of needed library */
+#define DT_PLTRELSZ 2 /* Size in bytes of PLT relocs */
+#define DT_PLTGOT 3 /* Processor defined value */
+#define DT_HASH 4 /* Address of symbol hash table */
+#define DT_STRTAB 5 /* Address of string table */
+#define DT_SYMTAB 6 /* Address of symbol table */
+#define DT_RELA 7 /* Address of Rela relocs */
+#define DT_RELASZ 8 /* Total size of Rela relocs */
+#define DT_RELAENT 9 /* Size of one Rela reloc */
+#define DT_STRSZ 10 /* Size of string table */
+#define DT_SYMENT 11 /* Size of one symbol table entry */
+#define DT_INIT 12 /* Address of init function */
+#define DT_FINI 13 /* Address of termination function */
+#define DT_SONAME 14 /* Name of shared object */
+#define DT_RPATH 15 /* Library search path (deprecated) */
+#define DT_SYMBOLIC 16 /* Start symbol search here */
+#define DT_REL 17 /* Address of Rel relocs */
+#define DT_RELSZ 18 /* Total size of Rel relocs */
+#define DT_RELENT 19 /* Size of one Rel reloc */
+#define DT_PLTREL 20 /* Type of reloc in PLT */
+#define DT_DEBUG 21 /* For debugging; unspecified */
+#define DT_TEXTREL 22 /* Reloc might modify .text */
+#define DT_JMPREL 23 /* Address of PLT relocs */
+#define DT_BIND_NOW 24 /* Process relocations of object */
+#define DT_INIT_ARRAY 25 /* Array with addresses of init fct */
+#define DT_FINI_ARRAY 26 /* Array with addresses of fini fct */
+#define DT_INIT_ARRAYSZ 27 /* Size in bytes of DT_INIT_ARRAY */
+#define DT_FINI_ARRAYSZ 28 /* Size in bytes of DT_FINI_ARRAY */
+#define DT_RUNPATH 29 /* Library search path */
+#define DT_FLAGS 30 /* Flags for the object being loaded */
+#define DT_ENCODING 32 /* Start of encoded range */
+#define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/
+#define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */
+#define DT_NUM 34 /* Number used */
+#define DT_LOOS 0x6000000d /* Start of OS-specific */
+#define DT_HIOS 0x6ffff000 /* End of OS-specific */
+#define DT_LOPROC 0x70000000 /* Start of processor-specific */
+#define DT_HIPROC 0x7fffffff /* End of processor-specific */
+#define DT_PROCNUM DT_MIPS_NUM /* Most used by any processor */
+
+/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
+ Dyn.d_un.d_val field of the Elf*_Dyn structure. This follows Sun's
+ approach. */
+#define DT_VALRNGLO 0x6ffffd00
+#define DT_GNU_PRELINKED 0x6ffffdf5 /* Prelinking timestamp */
+#define DT_GNU_CONFLICTSZ 0x6ffffdf6 /* Size of conflict section */
+#define DT_GNU_LIBLISTSZ 0x6ffffdf7 /* Size of library list */
+#define DT_CHECKSUM 0x6ffffdf8
+#define DT_PLTPADSZ 0x6ffffdf9
+#define DT_MOVEENT 0x6ffffdfa
+#define DT_MOVESZ 0x6ffffdfb
+#define DT_FEATURE_1 0x6ffffdfc /* Feature selection (DTF_*). */
+#define DT_POSFLAG_1 0x6ffffdfd /* Flags for DT_* entries, effecting
+ the following DT_* entry. */
+#define DT_SYMINSZ 0x6ffffdfe /* Size of syminfo table (in bytes) */
+#define DT_SYMINENT 0x6ffffdff /* Entry size of syminfo */
+#define DT_VALRNGHI 0x6ffffdff
+#define DT_VALTAGIDX(tag) (DT_VALRNGHI - (tag)) /* Reverse order! */
+#define DT_VALNUM 12
+
+/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
+ Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
+
+ If any adjustment is made to the ELF object after it has been
+ built these entries will need to be adjusted. */
+#define DT_ADDRRNGLO 0x6ffffe00
+#define DT_GNU_HASH 0x6ffffef5 /* GNU-style hash table. */
+#define DT_TLSDESC_PLT 0x6ffffef6
+#define DT_TLSDESC_GOT 0x6ffffef7
+#define DT_GNU_CONFLICT 0x6ffffef8 /* Start of conflict section */
+#define DT_GNU_LIBLIST 0x6ffffef9 /* Library list */
+#define DT_CONFIG 0x6ffffefa /* Configuration information. */
+#define DT_DEPAUDIT 0x6ffffefb /* Dependency auditing. */
+#define DT_AUDIT 0x6ffffefc /* Object auditing. */
+#define DT_PLTPAD 0x6ffffefd /* PLT padding. */
+#define DT_MOVETAB 0x6ffffefe /* Move table. */
+#define DT_SYMINFO 0x6ffffeff /* Syminfo table. */
+#define DT_ADDRRNGHI 0x6ffffeff
+#define DT_ADDRTAGIDX(tag) (DT_ADDRRNGHI - (tag)) /* Reverse order! */
+#define DT_ADDRNUM 11
+
+/* The versioning entry types. The next are defined as part of the
+ GNU extension. */
+#define DT_VERSYM 0x6ffffff0
+
+#define DT_RELACOUNT 0x6ffffff9
+#define DT_RELCOUNT 0x6ffffffa
+
+/* These were chosen by Sun. */
+#define DT_FLAGS_1 0x6ffffffb /* State flags, see DF_1_* below. */
+#define DT_VERDEF 0x6ffffffc /* Address of version definition
+ table */
+#define DT_VERDEFNUM 0x6ffffffd /* Number of version definitions */
+#define DT_VERNEED 0x6ffffffe /* Address of table with needed
+ versions */
+#define DT_VERNEEDNUM 0x6fffffff /* Number of needed versions */
+#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
+#define DT_VERSIONTAGNUM 16
+
+/* Sun added these machine-independent extensions in the "processor-specific"
+ range. Be compatible. */
+#define DT_AUXILIARY 0x7ffffffd /* Shared object to load before self */
+#define DT_FILTER 0x7fffffff /* Shared object to get values from */
+#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
+#define DT_EXTRANUM 3
+
+/* Values of `d_un.d_val' in the DT_FLAGS entry. */
+#define DF_ORIGIN 0x00000001 /* Object may use DF_ORIGIN */
+#define DF_SYMBOLIC 0x00000002 /* Symbol resolutions starts here */
+#define DF_TEXTREL 0x00000004 /* Object contains text relocations */
+#define DF_BIND_NOW 0x00000008 /* No lazy binding for this object */
+#define DF_STATIC_TLS 0x00000010 /* Module uses the static TLS model */
+
+/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1
+ entry in the dynamic section. */
+#define DF_1_NOW 0x00000001 /* Set RTLD_NOW for this object. */
+#define DF_1_GLOBAL 0x00000002 /* Set RTLD_GLOBAL for this object. */
+#define DF_1_GROUP 0x00000004 /* Set RTLD_GROUP for this object. */
+#define DF_1_NODELETE 0x00000008 /* Set RTLD_NODELETE for this object.*/
+#define DF_1_LOADFLTR 0x00000010 /* Trigger filtee loading at runtime.*/
+#define DF_1_INITFIRST 0x00000020 /* Set RTLD_INITFIRST for this object*/
+#define DF_1_NOOPEN 0x00000040 /* Set RTLD_NOOPEN for this object. */
+#define DF_1_ORIGIN 0x00000080 /* $ORIGIN must be handled. */
+#define DF_1_DIRECT 0x00000100 /* Direct binding enabled. */
+#define DF_1_TRANS 0x00000200
+#define DF_1_INTERPOSE 0x00000400 /* Object is used to interpose. */
+#define DF_1_NODEFLIB 0x00000800 /* Ignore default lib search path. */
+#define DF_1_NODUMP 0x00001000 /* Object can't be dldump'ed. */
+#define DF_1_CONFALT 0x00002000 /* Configuration alternative created.*/
+#define DF_1_ENDFILTEE 0x00004000 /* Filtee terminates filters search. */
+#define DF_1_DISPRELDNE 0x00008000 /* Disp reloc applied at build time. */
+#define DF_1_DISPRELPND 0x00010000 /* Disp reloc applied at run-time. */
+#define DF_1_NODIRECT 0x00020000 /* Object has no-direct binding. */
+#define DF_1_IGNMULDEF 0x00040000
+#define DF_1_NOKSYMS 0x00080000
+#define DF_1_NOHDR 0x00100000
+#define DF_1_EDITED 0x00200000 /* Object is modified after built. */
+#define DF_1_NORELOC 0x00400000
+#define DF_1_SYMINTPOSE 0x00800000 /* Object has individual interposers. */
+#define DF_1_GLOBAUDIT 0x01000000 /* Global auditing required. */
+#define DF_1_SINGLETON 0x02000000 /* Singleton symbols are used. */
+
+/* Flags for the feature selection in DT_FEATURE_1. */
+#define DTF_1_PARINIT 0x00000001
+#define DTF_1_CONFEXP 0x00000002
+
+/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry. */
+#define DF_P1_LAZYLOAD 0x00000001 /* Lazyload following object. */
+#define DF_P1_GROUPPERM 0x00000002 /* Symbols from next object are not
+ generally available. */
+
+/* Version definition sections. */
+
+typedef struct
+{
+ Elf32_Half vd_version; /* Version revision */
+ Elf32_Half vd_flags; /* Version information */
+ Elf32_Half vd_ndx; /* Version Index */
+ Elf32_Half vd_cnt; /* Number of associated aux entries */
+ Elf32_Word vd_hash; /* Version name hash value */
+ Elf32_Word vd_aux; /* Offset in bytes to verdaux array */
+ Elf32_Word vd_next; /* Offset in bytes to next verdef
+ entry */
+} Elf32_Verdef;
+
+typedef struct
+{
+ Elf64_Half vd_version; /* Version revision */
+ Elf64_Half vd_flags; /* Version information */
+ Elf64_Half vd_ndx; /* Version Index */
+ Elf64_Half vd_cnt; /* Number of associated aux entries */
+ Elf64_Word vd_hash; /* Version name hash value */
+ Elf64_Word vd_aux; /* Offset in bytes to verdaux array */
+ Elf64_Word vd_next; /* Offset in bytes to next verdef
+ entry */
+} Elf64_Verdef;
+
+
+/* Legal values for vd_version (version revision). */
+#define VER_DEF_NONE 0 /* No version */
+#define VER_DEF_CURRENT 1 /* Current version */
+#define VER_DEF_NUM 2 /* Given version number */
+
+/* Legal values for vd_flags (version information flags). */
+#define VER_FLG_BASE 0x1 /* Version definition of file itself */
+#define VER_FLG_WEAK 0x2 /* Weak version identifier */
+
+/* Versym symbol index values. */
+#define VER_NDX_LOCAL 0 /* Symbol is local. */
+#define VER_NDX_GLOBAL 1 /* Symbol is global. */
+#define VER_NDX_LORESERVE 0xff00 /* Beginning of reserved entries. */
+#define VER_NDX_ELIMINATE 0xff01 /* Symbol is to be eliminated. */
+
+/* Auxialiary version information. */
+
+typedef struct
+{
+ Elf32_Word vda_name; /* Version or dependency names */
+ Elf32_Word vda_next; /* Offset in bytes to next verdaux
+ entry */
+} Elf32_Verdaux;
+
+typedef struct
+{
+ Elf64_Word vda_name; /* Version or dependency names */
+ Elf64_Word vda_next; /* Offset in bytes to next verdaux
+ entry */
+} Elf64_Verdaux;
+
+
+/* Version dependency section. */
+
+typedef struct
+{
+ Elf32_Half vn_version; /* Version of structure */
+ Elf32_Half vn_cnt; /* Number of associated aux entries */
+ Elf32_Word vn_file; /* Offset of filename for this
+ dependency */
+ Elf32_Word vn_aux; /* Offset in bytes to vernaux array */
+ Elf32_Word vn_next; /* Offset in bytes to next verneed
+ entry */
+} Elf32_Verneed;
+
+typedef struct
+{
+ Elf64_Half vn_version; /* Version of structure */
+ Elf64_Half vn_cnt; /* Number of associated aux entries */
+ Elf64_Word vn_file; /* Offset of filename for this
+ dependency */
+ Elf64_Word vn_aux; /* Offset in bytes to vernaux array */
+ Elf64_Word vn_next; /* Offset in bytes to next verneed
+ entry */
+} Elf64_Verneed;
+
+
+/* Legal values for vn_version (version revision). */
+#define VER_NEED_NONE 0 /* No version */
+#define VER_NEED_CURRENT 1 /* Current version */
+#define VER_NEED_NUM 2 /* Given version number */
+
+/* Auxiliary needed version information. */
+
+typedef struct
+{
+ Elf32_Word vna_hash; /* Hash value of dependency name */
+ Elf32_Half vna_flags; /* Dependency specific information */
+ Elf32_Half vna_other; /* Unused */
+ Elf32_Word vna_name; /* Dependency name string offset */
+ Elf32_Word vna_next; /* Offset in bytes to next vernaux
+ entry */
+} Elf32_Vernaux;
+
+typedef struct
+{
+ Elf64_Word vna_hash; /* Hash value of dependency name */
+ Elf64_Half vna_flags; /* Dependency specific information */
+ Elf64_Half vna_other; /* Unused */
+ Elf64_Word vna_name; /* Dependency name string offset */
+ Elf64_Word vna_next; /* Offset in bytes to next vernaux
+ entry */
+} Elf64_Vernaux;
+
+
+/* Legal values for vna_flags. */
+#define VER_FLG_WEAK 0x2 /* Weak version identifier */
+
+
+/* Auxiliary vector. */
+
+/* This vector is normally only used by the program interpreter. The
+ usual definition in an ABI supplement uses the name auxv_t. The
+ vector is not usually defined in a standard file, but it
+ can't hurt. We rename it to avoid conflicts. The sizes of these
+ types are an arrangement between the exec server and the program
+ interpreter, so we don't fully specify them here. */
+
+typedef struct
+{
+ uint32_t a_type; /* Entry type */
+ union
+ {
+ uint32_t a_val; /* Integer value */
+ /* We use to have pointer elements added here. We cannot do that,
+ though, since it does not work when using 32-bit definitions
+ on 64-bit platforms and vice versa. */
+ } a_un;
+} Elf32_auxv_t;
+
+typedef struct
+{
+ uint64_t a_type; /* Entry type */
+ union
+ {
+ uint64_t a_val; /* Integer value */
+ /* We use to have pointer elements added here. We cannot do that,
+ though, since it does not work when using 32-bit definitions
+ on 64-bit platforms and vice versa. */
+ } a_un;
+} Elf64_auxv_t;
+
+//#include
+/* Note section contents. Each entry in the note section begins with
+ a header of a fixed form. */
+
+typedef struct
+{
+ Elf32_Word n_namesz; /* Length of the note's name. */
+ Elf32_Word n_descsz; /* Length of the note's descriptor. */
+ Elf32_Word n_type; /* Type of the note. */
+} Elf32_Nhdr;
+
+typedef struct
+{
+ Elf64_Word n_namesz; /* Length of the note's name. */
+ Elf64_Word n_descsz; /* Length of the note's descriptor. */
+ Elf64_Word n_type; /* Type of the note. */
+} Elf64_Nhdr;
+
+/* Known names of notes. */
+
+/* Solaris entries in the note section have this name. */
+#define ELF_NOTE_SOLARIS "SUNW Solaris"
+
+/* Note entries for GNU systems have this name. */
+#define ELF_NOTE_GNU "GNU"
+
+
+/* Defined types of notes for Solaris. */
+
+/* Value of descriptor (one word) is desired pagesize for the binary. */
+#define ELF_NOTE_PAGESIZE_HINT 1
+
+
+/* Defined note types for GNU systems. */
+
+/* ABI information. The descriptor consists of words:
+ word 0: OS descriptor
+ word 1: major version of the ABI
+ word 2: minor version of the ABI
+ word 3: subminor version of the ABI
+*/
+#define NT_GNU_ABI_TAG 1
+#define ELF_NOTE_ABI NT_GNU_ABI_TAG /* Old name. */
+
+/* Known OSes. These values can appear in word 0 of an
+ NT_GNU_ABI_TAG note section entry. */
+#define ELF_NOTE_OS_LINUX 0
+#define ELF_NOTE_OS_GNU 1
+#define ELF_NOTE_OS_SOLARIS2 2
+#define ELF_NOTE_OS_FREEBSD 3
+
+/* Synthetic hwcap information. The descriptor begins with two words:
+ word 0: number of entries
+ word 1: bitmask of enabled entries
+ Then follow variable-length entries, one byte followed by a
+ '\0'-terminated hwcap name string. The byte gives the bit
+ number to test if enabled, (1U << bit) & bitmask. */
+#define NT_GNU_HWCAP 2
+
+/* Build ID bits as generated by ld --build-id.
+ The descriptor consists of any nonzero number of bytes. */
+#define NT_GNU_BUILD_ID 3
+
+/* Version note generated by GNU gold containing a version string. */
+#define NT_GNU_GOLD_VERSION 4
+
+
+/* Move records. */
+typedef struct
+{
+ Elf32_Xword m_value; /* Symbol value. */
+ Elf32_Word m_info; /* Size and index. */
+ Elf32_Word m_poffset; /* Symbol offset. */
+ Elf32_Half m_repeat; /* Repeat count. */
+ Elf32_Half m_stride; /* Stride info. */
+} Elf32_Move;
+
+typedef struct
+{
+ Elf64_Xword m_value; /* Symbol value. */
+ Elf64_Xword m_info; /* Size and index. */
+ Elf64_Xword m_poffset; /* Symbol offset. */
+ Elf64_Half m_repeat; /* Repeat count. */
+ Elf64_Half m_stride; /* Stride info. */
+} Elf64_Move;
+
+/* Macro to construct move records. */
+#define ELF32_M_SYM(info) ((info) >> 8)
+#define ELF32_M_SIZE(info) ((unsigned char) (info))
+#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char) (size))
+
+#define ELF64_M_SYM(info) ELF32_M_SYM (info)
+#define ELF64_M_SIZE(info) ELF32_M_SIZE (info)
+#define ELF64_M_INFO(sym, size) ELF32_M_INFO (sym, size)
+
+
+/* Motorola 68k specific definitions. */
+
+/* Values for Elf32_Ehdr.e_flags. */
+#define EF_CPU32 0x00810000
+
+/* m68k relocs. */
+
+#define R_68K_NONE 0 /* No reloc */
+#define R_68K_32 1 /* Direct 32 bit */
+#define R_68K_16 2 /* Direct 16 bit */
+#define R_68K_8 3 /* Direct 8 bit */
+#define R_68K_PC32 4 /* PC relative 32 bit */
+#define R_68K_PC16 5 /* PC relative 16 bit */
+#define R_68K_PC8 6 /* PC relative 8 bit */
+#define R_68K_GOT32 7 /* 32 bit PC relative GOT entry */
+#define R_68K_GOT16 8 /* 16 bit PC relative GOT entry */
+#define R_68K_GOT8 9 /* 8 bit PC relative GOT entry */
+#define R_68K_GOT32O 10 /* 32 bit GOT offset */
+#define R_68K_GOT16O 11 /* 16 bit GOT offset */
+#define R_68K_GOT8O 12 /* 8 bit GOT offset */
+#define R_68K_PLT32 13 /* 32 bit PC relative PLT address */
+#define R_68K_PLT16 14 /* 16 bit PC relative PLT address */
+#define R_68K_PLT8 15 /* 8 bit PC relative PLT address */
+#define R_68K_PLT32O 16 /* 32 bit PLT offset */
+#define R_68K_PLT16O 17 /* 16 bit PLT offset */
+#define R_68K_PLT8O 18 /* 8 bit PLT offset */
+#define R_68K_COPY 19 /* Copy symbol at runtime */
+#define R_68K_GLOB_DAT 20 /* Create GOT entry */
+#define R_68K_JMP_SLOT 21 /* Create PLT entry */
+#define R_68K_RELATIVE 22 /* Adjust by program base */
+#define R_68K_TLS_GD32 25 /* 32 bit GOT offset for GD */
+#define R_68K_TLS_GD16 26 /* 16 bit GOT offset for GD */
+#define R_68K_TLS_GD8 27 /* 8 bit GOT offset for GD */
+#define R_68K_TLS_LDM32 28 /* 32 bit GOT offset for LDM */
+#define R_68K_TLS_LDM16 29 /* 16 bit GOT offset for LDM */
+#define R_68K_TLS_LDM8 30 /* 8 bit GOT offset for LDM */
+#define R_68K_TLS_LDO32 31 /* 32 bit module-relative offset */
+#define R_68K_TLS_LDO16 32 /* 16 bit module-relative offset */
+#define R_68K_TLS_LDO8 33 /* 8 bit module-relative offset */
+#define R_68K_TLS_IE32 34 /* 32 bit GOT offset for IE */
+#define R_68K_TLS_IE16 35 /* 16 bit GOT offset for IE */
+#define R_68K_TLS_IE8 36 /* 8 bit GOT offset for IE */
+#define R_68K_TLS_LE32 37 /* 32 bit offset relative to
+ static TLS block */
+#define R_68K_TLS_LE16 38 /* 16 bit offset relative to
+ static TLS block */
+#define R_68K_TLS_LE8 39 /* 8 bit offset relative to
+ static TLS block */
+#define R_68K_TLS_DTPMOD32 40 /* 32 bit module number */
+#define R_68K_TLS_DTPREL32 41 /* 32 bit module-relative offset */
+#define R_68K_TLS_TPREL32 42 /* 32 bit TP-relative offset */
+/* Keep this the last entry. */
+#define R_68K_NUM 43
+
+/* Intel 80386 specific definitions. */
+
+/* i386 relocs. */
+
+#define R_386_NONE 0 /* No reloc */
+#define R_386_32 1 /* Direct 32 bit */
+#define R_386_PC32 2 /* PC relative 32 bit */
+#define R_386_GOT32 3 /* 32 bit GOT entry */
+#define R_386_PLT32 4 /* 32 bit PLT address */
+#define R_386_COPY 5 /* Copy symbol at runtime */
+#define R_386_GLOB_DAT 6 /* Create GOT entry */
+#define R_386_JMP_SLOT 7 /* Create PLT entry */
+#define R_386_RELATIVE 8 /* Adjust by program base */
+#define R_386_GOTOFF 9 /* 32 bit offset to GOT */
+#define R_386_GOTPC 10 /* 32 bit PC relative offset to GOT */
+#define R_386_32PLT 11
+#define R_386_TLS_TPOFF 14 /* Offset in static TLS block */
+#define R_386_TLS_IE 15 /* Address of GOT entry for static TLS
+ block offset */
+#define R_386_TLS_GOTIE 16 /* GOT entry for static TLS block
+ offset */
+#define R_386_TLS_LE 17 /* Offset relative to static TLS
+ block */
+#define R_386_TLS_GD 18 /* Direct 32 bit for GNU version of
+ general dynamic thread local data */
+#define R_386_TLS_LDM 19 /* Direct 32 bit for GNU version of
+ local dynamic thread local data
+ in LE code */
+#define R_386_16 20
+#define R_386_PC16 21
+#define R_386_8 22
+#define R_386_PC8 23
+#define R_386_TLS_GD_32 24 /* Direct 32 bit for general dynamic
+ thread local data */
+#define R_386_TLS_GD_PUSH 25 /* Tag for pushl in GD TLS code */
+#define R_386_TLS_GD_CALL 26 /* Relocation for call to
+ __tls_get_addr() */
+#define R_386_TLS_GD_POP 27 /* Tag for popl in GD TLS code */
+#define R_386_TLS_LDM_32 28 /* Direct 32 bit for local dynamic
+ thread local data in LE code */
+#define R_386_TLS_LDM_PUSH 29 /* Tag for pushl in LDM TLS code */
+#define R_386_TLS_LDM_CALL 30 /* Relocation for call to
+ __tls_get_addr() in LDM code */
+#define R_386_TLS_LDM_POP 31 /* Tag for popl in LDM TLS code */
+#define R_386_TLS_LDO_32 32 /* Offset relative to TLS block */
+#define R_386_TLS_IE_32 33 /* GOT entry for negated static TLS
+ block offset */
+#define R_386_TLS_LE_32 34 /* Negated offset relative to static
+ TLS block */
+#define R_386_TLS_DTPMOD32 35 /* ID of module containing symbol */
+#define R_386_TLS_DTPOFF32 36 /* Offset in TLS block */
+#define R_386_TLS_TPOFF32 37 /* Negated offset in static TLS block */
+#define R_386_SIZE32 38 /* 32-bit symbol size */
+#define R_386_TLS_GOTDESC 39 /* GOT offset for TLS descriptor. */
+#define R_386_TLS_DESC_CALL 40 /* Marker of call through TLS
+ descriptor for
+ relaxation. */
+#define R_386_TLS_DESC 41 /* TLS descriptor containing
+ pointer to code and to
+ argument, returning the TLS
+ offset for the symbol. */
+#define R_386_IRELATIVE 42 /* Adjust indirectly by program base */
+/* Keep this the last entry. */
+#define R_386_NUM 43
+
+/* SUN SPARC specific definitions. */
+
+/* Legal values for ST_TYPE subfield of st_info (symbol type). */
+
+#define STT_SPARC_REGISTER 13 /* Global register reserved to app. */
+
+/* Values for Elf64_Ehdr.e_flags. */
+
+#define EF_SPARCV9_MM 3
+#define EF_SPARCV9_TSO 0
+#define EF_SPARCV9_PSO 1
+#define EF_SPARCV9_RMO 2
+#define EF_SPARC_LEDATA 0x800000 /* little endian data */
+#define EF_SPARC_EXT_MASK 0xFFFF00
+#define EF_SPARC_32PLUS 0x000100 /* generic V8+ features */
+#define EF_SPARC_SUN_US1 0x000200 /* Sun UltraSPARC1 extensions */
+#define EF_SPARC_HAL_R1 0x000400 /* HAL R1 extensions */
+#define EF_SPARC_SUN_US3 0x000800 /* Sun UltraSPARCIII extensions */
+
+/* SPARC relocs. */
+
+#define R_SPARC_NONE 0 /* No reloc */
+#define R_SPARC_8 1 /* Direct 8 bit */
+#define R_SPARC_16 2 /* Direct 16 bit */
+#define R_SPARC_32 3 /* Direct 32 bit */
+#define R_SPARC_DISP8 4 /* PC relative 8 bit */
+#define R_SPARC_DISP16 5 /* PC relative 16 bit */
+#define R_SPARC_DISP32 6 /* PC relative 32 bit */
+#define R_SPARC_WDISP30 7 /* PC relative 30 bit shifted */
+#define R_SPARC_WDISP22 8 /* PC relative 22 bit shifted */
+#define R_SPARC_HI22 9 /* High 22 bit */
+#define R_SPARC_22 10 /* Direct 22 bit */
+#define R_SPARC_13 11 /* Direct 13 bit */
+#define R_SPARC_LO10 12 /* Truncated 10 bit */
+#define R_SPARC_GOT10 13 /* Truncated 10 bit GOT entry */
+#define R_SPARC_GOT13 14 /* 13 bit GOT entry */
+#define R_SPARC_GOT22 15 /* 22 bit GOT entry shifted */
+#define R_SPARC_PC10 16 /* PC relative 10 bit truncated */
+#define R_SPARC_PC22 17 /* PC relative 22 bit shifted */
+#define R_SPARC_WPLT30 18 /* 30 bit PC relative PLT address */
+#define R_SPARC_COPY 19 /* Copy symbol at runtime */
+#define R_SPARC_GLOB_DAT 20 /* Create GOT entry */
+#define R_SPARC_JMP_SLOT 21 /* Create PLT entry */
+#define R_SPARC_RELATIVE 22 /* Adjust by program base */
+#define R_SPARC_UA32 23 /* Direct 32 bit unaligned */
+
+/* Additional Sparc64 relocs. */
+
+#define R_SPARC_PLT32 24 /* Direct 32 bit ref to PLT entry */
+#define R_SPARC_HIPLT22 25 /* High 22 bit PLT entry */
+#define R_SPARC_LOPLT10 26 /* Truncated 10 bit PLT entry */
+#define R_SPARC_PCPLT32 27 /* PC rel 32 bit ref to PLT entry */
+#define R_SPARC_PCPLT22 28 /* PC rel high 22 bit PLT entry */
+#define R_SPARC_PCPLT10 29 /* PC rel trunc 10 bit PLT entry */
+#define R_SPARC_10 30 /* Direct 10 bit */
+#define R_SPARC_11 31 /* Direct 11 bit */
+#define R_SPARC_64 32 /* Direct 64 bit */
+#define R_SPARC_OLO10 33 /* 10bit with secondary 13bit addend */
+#define R_SPARC_HH22 34 /* Top 22 bits of direct 64 bit */
+#define R_SPARC_HM10 35 /* High middle 10 bits of ... */
+#define R_SPARC_LM22 36 /* Low middle 22 bits of ... */
+#define R_SPARC_PC_HH22 37 /* Top 22 bits of pc rel 64 bit */
+#define R_SPARC_PC_HM10 38 /* High middle 10 bit of ... */
+#define R_SPARC_PC_LM22 39 /* Low miggle 22 bits of ... */
+#define R_SPARC_WDISP16 40 /* PC relative 16 bit shifted */
+#define R_SPARC_WDISP19 41 /* PC relative 19 bit shifted */
+#define R_SPARC_GLOB_JMP 42 /* was part of v9 ABI but was removed */
+#define R_SPARC_7 43 /* Direct 7 bit */
+#define R_SPARC_5 44 /* Direct 5 bit */
+#define R_SPARC_6 45 /* Direct 6 bit */
+#define R_SPARC_DISP64 46 /* PC relative 64 bit */
+#define R_SPARC_PLT64 47 /* Direct 64 bit ref to PLT entry */
+#define R_SPARC_HIX22 48 /* High 22 bit complemented */
+#define R_SPARC_LOX10 49 /* Truncated 11 bit complemented */
+#define R_SPARC_H44 50 /* Direct high 12 of 44 bit */
+#define R_SPARC_M44 51 /* Direct mid 22 of 44 bit */
+#define R_SPARC_L44 52 /* Direct low 10 of 44 bit */
+#define R_SPARC_REGISTER 53 /* Global register usage */
+#define R_SPARC_UA64 54 /* Direct 64 bit unaligned */
+#define R_SPARC_UA16 55 /* Direct 16 bit unaligned */
+#define R_SPARC_TLS_GD_HI22 56
+#define R_SPARC_TLS_GD_LO10 57
+#define R_SPARC_TLS_GD_ADD 58
+#define R_SPARC_TLS_GD_CALL 59
+#define R_SPARC_TLS_LDM_HI22 60
+#define R_SPARC_TLS_LDM_LO10 61
+#define R_SPARC_TLS_LDM_ADD 62
+#define R_SPARC_TLS_LDM_CALL 63
+#define R_SPARC_TLS_LDO_HIX22 64
+#define R_SPARC_TLS_LDO_LOX10 65
+#define R_SPARC_TLS_LDO_ADD 66
+#define R_SPARC_TLS_IE_HI22 67
+#define R_SPARC_TLS_IE_LO10 68
+#define R_SPARC_TLS_IE_LD 69
+#define R_SPARC_TLS_IE_LDX 70
+#define R_SPARC_TLS_IE_ADD 71
+#define R_SPARC_TLS_LE_HIX22 72
+#define R_SPARC_TLS_LE_LOX10 73
+#define R_SPARC_TLS_DTPMOD32 74
+#define R_SPARC_TLS_DTPMOD64 75
+#define R_SPARC_TLS_DTPOFF32 76
+#define R_SPARC_TLS_DTPOFF64 77
+#define R_SPARC_TLS_TPOFF32 78
+#define R_SPARC_TLS_TPOFF64 79
+#define R_SPARC_GOTDATA_HIX22 80
+#define R_SPARC_GOTDATA_LOX10 81
+#define R_SPARC_GOTDATA_OP_HIX22 82
+#define R_SPARC_GOTDATA_OP_LOX10 83
+#define R_SPARC_GOTDATA_OP 84
+#define R_SPARC_H34 85
+#define R_SPARC_SIZE32 86
+#define R_SPARC_SIZE64 87
+#define R_SPARC_WDISP10 88
+#define R_SPARC_JMP_IREL 248
+#define R_SPARC_IRELATIVE 249
+#define R_SPARC_GNU_VTINHERIT 250
+#define R_SPARC_GNU_VTENTRY 251
+#define R_SPARC_REV32 252
+/* Keep this the last entry. */
+#define R_SPARC_NUM 253
+
+/* For Sparc64, legal values for d_tag of Elf64_Dyn. */
+
+#define DT_SPARC_REGISTER 0x70000001
+#define DT_SPARC_NUM 2
+
+/* MIPS R3000 specific definitions. */
+
+/* Legal values for e_flags field of Elf32_Ehdr. */
+
+#define EF_MIPS_NOREORDER 1 /* A .noreorder directive was used. */
+#define EF_MIPS_PIC 2 /* Contains PIC code. */
+#define EF_MIPS_CPIC 4 /* Uses PIC calling sequence. */
+#define EF_MIPS_XGOT 8
+#define EF_MIPS_64BIT_WHIRL 16
+#define EF_MIPS_ABI2 32
+#define EF_MIPS_ABI_ON32 64
+#define EF_MIPS_FP64 512 /* Uses FP64 (12 callee-saved). */
+#define EF_MIPS_NAN2008 1024 /* Uses IEEE 754-2008 NaN encoding. */
+#define EF_MIPS_ARCH 0xf0000000 /* MIPS architecture level. */
+
+/* Legal values for MIPS architecture level. */
+
+#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */
+#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */
+#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */
+#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */
+#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */
+#define EF_MIPS_ARCH_32 0x50000000 /* MIPS32 code. */
+#define EF_MIPS_ARCH_64 0x60000000 /* MIPS64 code. */
+#define EF_MIPS_ARCH_32R2 0x70000000 /* MIPS32r2 code. */
+#define EF_MIPS_ARCH_64R2 0x80000000 /* MIPS64r2 code. */
+
+/* The following are unofficial names and should not be used. */
+
+#define E_MIPS_ARCH_1 EF_MIPS_ARCH_1
+#define E_MIPS_ARCH_2 EF_MIPS_ARCH_2
+#define E_MIPS_ARCH_3 EF_MIPS_ARCH_3
+#define E_MIPS_ARCH_4 EF_MIPS_ARCH_4
+#define E_MIPS_ARCH_5 EF_MIPS_ARCH_5
+#define E_MIPS_ARCH_32 EF_MIPS_ARCH_32
+#define E_MIPS_ARCH_64 EF_MIPS_ARCH_64
+
+/* Special section indices. */
+
+#define SHN_MIPS_ACOMMON 0xff00 /* Allocated common symbols. */
+#define SHN_MIPS_TEXT 0xff01 /* Allocated test symbols. */
+#define SHN_MIPS_DATA 0xff02 /* Allocated data symbols. */
+#define SHN_MIPS_SCOMMON 0xff03 /* Small common symbols. */
+#define SHN_MIPS_SUNDEFINED 0xff04 /* Small undefined symbols. */
+
+/* Legal values for sh_type field of Elf32_Shdr. */
+
+#define SHT_MIPS_LIBLIST 0x70000000 /* Shared objects used in link. */
+#define SHT_MIPS_MSYM 0x70000001
+#define SHT_MIPS_CONFLICT 0x70000002 /* Conflicting symbols. */
+#define SHT_MIPS_GPTAB 0x70000003 /* Global data area sizes. */
+#define SHT_MIPS_UCODE 0x70000004 /* Reserved for SGI/MIPS compilers */
+#define SHT_MIPS_DEBUG 0x70000005 /* MIPS ECOFF debugging info. */
+#define SHT_MIPS_REGINFO 0x70000006 /* Register usage information. */
+#define SHT_MIPS_PACKAGE 0x70000007
+#define SHT_MIPS_PACKSYM 0x70000008
+#define SHT_MIPS_RELD 0x70000009
+#define SHT_MIPS_IFACE 0x7000000b
+#define SHT_MIPS_CONTENT 0x7000000c
+#define SHT_MIPS_OPTIONS 0x7000000d /* Miscellaneous options. */
+#define SHT_MIPS_SHDR 0x70000010
+#define SHT_MIPS_FDESC 0x70000011
+#define SHT_MIPS_EXTSYM 0x70000012
+#define SHT_MIPS_DENSE 0x70000013
+#define SHT_MIPS_PDESC 0x70000014
+#define SHT_MIPS_LOCSYM 0x70000015
+#define SHT_MIPS_AUXSYM 0x70000016
+#define SHT_MIPS_OPTSYM 0x70000017
+#define SHT_MIPS_LOCSTR 0x70000018
+#define SHT_MIPS_LINE 0x70000019
+#define SHT_MIPS_RFDESC 0x7000001a
+#define SHT_MIPS_DELTASYM 0x7000001b
+#define SHT_MIPS_DELTAINST 0x7000001c
+#define SHT_MIPS_DELTACLASS 0x7000001d
+#define SHT_MIPS_DWARF 0x7000001e /* DWARF debugging information. */
+#define SHT_MIPS_DELTADECL 0x7000001f
+#define SHT_MIPS_SYMBOL_LIB 0x70000020
+#define SHT_MIPS_EVENTS 0x70000021 /* Event section. */
+#define SHT_MIPS_TRANSLATE 0x70000022
+#define SHT_MIPS_PIXIE 0x70000023
+#define SHT_MIPS_XLATE 0x70000024
+#define SHT_MIPS_XLATE_DEBUG 0x70000025
+#define SHT_MIPS_WHIRL 0x70000026
+#define SHT_MIPS_EH_REGION 0x70000027
+#define SHT_MIPS_XLATE_OLD 0x70000028
+#define SHT_MIPS_PDR_EXCEPTION 0x70000029
+
+/* Legal values for sh_flags field of Elf32_Shdr. */
+
+#define SHF_MIPS_GPREL 0x10000000 /* Must be in global data area. */
+#define SHF_MIPS_MERGE 0x20000000
+#define SHF_MIPS_ADDR 0x40000000
+#define SHF_MIPS_STRINGS 0x80000000
+#define SHF_MIPS_NOSTRIP 0x08000000
+#define SHF_MIPS_LOCAL 0x04000000
+#define SHF_MIPS_NAMES 0x02000000
+#define SHF_MIPS_NODUPE 0x01000000
+
+
+/* Symbol tables. */
+
+/* MIPS specific values for `st_other'. */
+#define STO_MIPS_DEFAULT 0x0
+#define STO_MIPS_INTERNAL 0x1
+#define STO_MIPS_HIDDEN 0x2
+#define STO_MIPS_PROTECTED 0x3
+#define STO_MIPS_PLT 0x8
+#define STO_MIPS_SC_ALIGN_UNUSED 0xff
+
+/* MIPS specific values for `st_info'. */
+#define STB_MIPS_SPLIT_COMMON 13
+
+/* Entries found in sections of type SHT_MIPS_GPTAB. */
+
+typedef union
+{
+ struct
+ {
+ Elf32_Word gt_current_g_value; /* -G value used for compilation. */
+ Elf32_Word gt_unused; /* Not used. */
+ } gt_header; /* First entry in section. */
+ struct
+ {
+ Elf32_Word gt_g_value; /* If this value were used for -G. */
+ Elf32_Word gt_bytes; /* This many bytes would be used. */
+ } gt_entry; /* Subsequent entries in section. */
+} Elf32_gptab;
+
+/* Entry found in sections of type SHT_MIPS_REGINFO. */
+
+typedef struct
+{
+ Elf32_Word ri_gprmask; /* General registers used. */
+ Elf32_Word ri_cprmask[4]; /* Coprocessor registers used. */
+ Elf32_Sword ri_gp_value; /* $gp register value. */
+} Elf32_RegInfo;
+
+/* Entries found in sections of type SHT_MIPS_OPTIONS. */
+
+typedef struct
+{
+ unsigned char kind; /* Determines interpretation of the
+ variable part of descriptor. */
+ unsigned char size; /* Size of descriptor, including header. */
+ Elf32_Section section; /* Section header index of section affected,
+ 0 for global options. */
+ Elf32_Word info; /* Kind-specific information. */
+} Elf_Options;
+
+/* Values for `kind' field in Elf_Options. */
+
+#define ODK_NULL 0 /* Undefined. */
+#define ODK_REGINFO 1 /* Register usage information. */
+#define ODK_EXCEPTIONS 2 /* Exception processing options. */
+#define ODK_PAD 3 /* Section padding options. */
+#define ODK_HWPATCH 4 /* Hardware workarounds performed */
+#define ODK_FILL 5 /* record the fill value used by the linker. */
+#define ODK_TAGS 6 /* reserve space for desktop tools to write. */
+#define ODK_HWAND 7 /* HW workarounds. 'AND' bits when merging. */
+#define ODK_HWOR 8 /* HW workarounds. 'OR' bits when merging. */
+
+/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries. */
+
+#define OEX_FPU_MIN 0x1f /* FPE's which MUST be enabled. */
+#define OEX_FPU_MAX 0x1f00 /* FPE's which MAY be enabled. */
+#define OEX_PAGE0 0x10000 /* page zero must be mapped. */
+#define OEX_SMM 0x20000 /* Force sequential memory mode? */
+#define OEX_FPDBUG 0x40000 /* Force floating point debug mode? */
+#define OEX_PRECISEFP OEX_FPDBUG
+#define OEX_DISMISS 0x80000 /* Dismiss invalid address faults? */
+
+#define OEX_FPU_INVAL 0x10
+#define OEX_FPU_DIV0 0x08
+#define OEX_FPU_OFLO 0x04
+#define OEX_FPU_UFLO 0x02
+#define OEX_FPU_INEX 0x01
+
+/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry. */
+
+#define OHW_R4KEOP 0x1 /* R4000 end-of-page patch. */
+#define OHW_R8KPFETCH 0x2 /* may need R8000 prefetch patch. */
+#define OHW_R5KEOP 0x4 /* R5000 end-of-page patch. */
+#define OHW_R5KCVTL 0x8 /* R5000 cvt.[ds].l bug. clean=1. */
+
+#define OPAD_PREFIX 0x1
+#define OPAD_POSTFIX 0x2
+#define OPAD_SYMBOL 0x4
+
+/* Entry found in `.options' section. */
+
+typedef struct
+{
+ Elf32_Word hwp_flags1; /* Extra flags. */
+ Elf32_Word hwp_flags2; /* Extra flags. */
+} Elf_Options_Hw;
+
+/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries. */
+
+#define OHWA0_R4KEOP_CHECKED 0x00000001
+#define OHWA1_R4KEOP_CLEAN 0x00000002
+
+/* MIPS relocs. */
+
+#define R_MIPS_NONE 0 /* No reloc */
+#define R_MIPS_16 1 /* Direct 16 bit */
+#define R_MIPS_32 2 /* Direct 32 bit */
+#define R_MIPS_REL32 3 /* PC relative 32 bit */
+#define R_MIPS_26 4 /* Direct 26 bit shifted */
+#define R_MIPS_HI16 5 /* High 16 bit */
+#define R_MIPS_LO16 6 /* Low 16 bit */
+#define R_MIPS_GPREL16 7 /* GP relative 16 bit */
+#define R_MIPS_LITERAL 8 /* 16 bit literal entry */
+#define R_MIPS_GOT16 9 /* 16 bit GOT entry */
+#define R_MIPS_PC16 10 /* PC relative 16 bit */
+#define R_MIPS_CALL16 11 /* 16 bit GOT entry for function */
+#define R_MIPS_GPREL32 12 /* GP relative 32 bit */
+
+#define R_MIPS_SHIFT5 16
+#define R_MIPS_SHIFT6 17
+#define R_MIPS_64 18
+#define R_MIPS_GOT_DISP 19
+#define R_MIPS_GOT_PAGE 20
+#define R_MIPS_GOT_OFST 21
+#define R_MIPS_GOT_HI16 22
+#define R_MIPS_GOT_LO16 23
+#define R_MIPS_SUB 24
+#define R_MIPS_INSERT_A 25
+#define R_MIPS_INSERT_B 26
+#define R_MIPS_DELETE 27
+#define R_MIPS_HIGHER 28
+#define R_MIPS_HIGHEST 29
+#define R_MIPS_CALL_HI16 30
+#define R_MIPS_CALL_LO16 31
+#define R_MIPS_SCN_DISP 32
+#define R_MIPS_REL16 33
+#define R_MIPS_ADD_IMMEDIATE 34
+#define R_MIPS_PJUMP 35
+#define R_MIPS_RELGOT 36
+#define R_MIPS_JALR 37
+#define R_MIPS_TLS_DTPMOD32 38 /* Module number 32 bit */
+#define R_MIPS_TLS_DTPREL32 39 /* Module-relative offset 32 bit */
+#define R_MIPS_TLS_DTPMOD64 40 /* Module number 64 bit */
+#define R_MIPS_TLS_DTPREL64 41 /* Module-relative offset 64 bit */
+#define R_MIPS_TLS_GD 42 /* 16 bit GOT offset for GD */
+#define R_MIPS_TLS_LDM 43 /* 16 bit GOT offset for LDM */
+#define R_MIPS_TLS_DTPREL_HI16 44 /* Module-relative offset, high 16 bits */
+#define R_MIPS_TLS_DTPREL_LO16 45 /* Module-relative offset, low 16 bits */
+#define R_MIPS_TLS_GOTTPREL 46 /* 16 bit GOT offset for IE */
+#define R_MIPS_TLS_TPREL32 47 /* TP-relative offset, 32 bit */
+#define R_MIPS_TLS_TPREL64 48 /* TP-relative offset, 64 bit */
+#define R_MIPS_TLS_TPREL_HI16 49 /* TP-relative offset, high 16 bits */
+#define R_MIPS_TLS_TPREL_LO16 50 /* TP-relative offset, low 16 bits */
+#define R_MIPS_GLOB_DAT 51
+#define R_MIPS_COPY 126
+#define R_MIPS_JUMP_SLOT 127
+/* Keep this the last entry. */
+#define R_MIPS_NUM 128
+
+/* Legal values for p_type field of Elf32_Phdr. */
+
+#define PT_MIPS_REGINFO 0x70000000 /* Register usage information. */
+#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */
+#define PT_MIPS_OPTIONS 0x70000002
+#define PT_MIPS_ABIFLAGS 0x70000003 /* FP mode requirement. */
+
+/* Special program header types. */
+
+#define PF_MIPS_LOCAL 0x10000000
+
+/* Legal values for d_tag field of Elf32_Dyn. */
+
+#define DT_MIPS_RLD_VERSION 0x70000001 /* Runtime linker interface version */
+#define DT_MIPS_TIME_STAMP 0x70000002 /* Timestamp */
+#define DT_MIPS_ICHECKSUM 0x70000003 /* Checksum */
+#define DT_MIPS_IVERSION 0x70000004 /* Version string (string tbl index) */
+#define DT_MIPS_FLAGS 0x70000005 /* Flags */
+#define DT_MIPS_BASE_ADDRESS 0x70000006 /* Base address */
+#define DT_MIPS_MSYM 0x70000007
+#define DT_MIPS_CONFLICT 0x70000008 /* Address of CONFLICT section */
+#define DT_MIPS_LIBLIST 0x70000009 /* Address of LIBLIST section */
+#define DT_MIPS_LOCAL_GOTNO 0x7000000a /* Number of local GOT entries */
+#define DT_MIPS_CONFLICTNO 0x7000000b /* Number of CONFLICT entries */
+#define DT_MIPS_LIBLISTNO 0x70000010 /* Number of LIBLIST entries */
+#define DT_MIPS_SYMTABNO 0x70000011 /* Number of DYNSYM entries */
+#define DT_MIPS_UNREFEXTNO 0x70000012 /* First external DYNSYM */
+#define DT_MIPS_GOTSYM 0x70000013 /* First GOT entry in DYNSYM */
+#define DT_MIPS_HIPAGENO 0x70000014 /* Number of GOT page table entries */
+#define DT_MIPS_RLD_MAP 0x70000016 /* Address of run time loader map. */
+#define DT_MIPS_DELTA_CLASS 0x70000017 /* Delta C++ class definition. */
+#define DT_MIPS_DELTA_CLASS_NO 0x70000018 /* Number of entries in
+ DT_MIPS_DELTA_CLASS. */
+#define DT_MIPS_DELTA_INSTANCE 0x70000019 /* Delta C++ class instances. */
+#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in
+ DT_MIPS_DELTA_INSTANCE. */
+#define DT_MIPS_DELTA_RELOC 0x7000001b /* Delta relocations. */
+#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in
+ DT_MIPS_DELTA_RELOC. */
+#define DT_MIPS_DELTA_SYM 0x7000001d /* Delta symbols that Delta
+ relocations refer to. */
+#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in
+ DT_MIPS_DELTA_SYM. */
+#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the
+ class declaration. */
+#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in
+ DT_MIPS_DELTA_CLASSSYM. */
+#define DT_MIPS_CXX_FLAGS 0x70000022 /* Flags indicating for C++ flavor. */
+#define DT_MIPS_PIXIE_INIT 0x70000023
+#define DT_MIPS_SYMBOL_LIB 0x70000024
+#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025
+#define DT_MIPS_LOCAL_GOTIDX 0x70000026
+#define DT_MIPS_HIDDEN_GOTIDX 0x70000027
+#define DT_MIPS_PROTECTED_GOTIDX 0x70000028
+#define DT_MIPS_OPTIONS 0x70000029 /* Address of .options. */
+#define DT_MIPS_INTERFACE 0x7000002a /* Address of .interface. */
+#define DT_MIPS_DYNSTR_ALIGN 0x7000002b
+#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */
+#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve
+ function stored in GOT. */
+#define DT_MIPS_PERF_SUFFIX 0x7000002e /* Default suffix of dso to be added
+ by rld on dlopen() calls. */
+#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */
+#define DT_MIPS_GP_VALUE 0x70000030 /* GP value for aux GOTs. */
+#define DT_MIPS_AUX_DYNAMIC 0x70000031 /* Address of aux .dynamic. */
+/* The address of .got.plt in an executable using the new non-PIC ABI. */
+#define DT_MIPS_PLTGOT 0x70000032
+/* The base of the PLT in an executable using the new non-PIC ABI if that
+ PLT is writable. For a non-writable PLT, this is omitted or has a zero
+ value. */
+#define DT_MIPS_RWPLT 0x70000034
+/* An alternative description of the classic MIPS RLD_MAP that is usable
+ in a PIE as it stores a relative offset from the address of the tag
+ rather than an absolute address. */
+#define DT_MIPS_RLD_MAP_REL 0x70000035
+#define DT_MIPS_NUM 0x36
+
+/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */
+
+#define RHF_NONE 0 /* No flags */
+#define RHF_QUICKSTART (1 << 0) /* Use quickstart */
+#define RHF_NOTPOT (1 << 1) /* Hash size not power of 2 */
+#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2) /* Ignore LD_LIBRARY_PATH */
+#define RHF_NO_MOVE (1 << 3)
+#define RHF_SGI_ONLY (1 << 4)
+#define RHF_GUARANTEE_INIT (1 << 5)
+#define RHF_DELTA_C_PLUS_PLUS (1 << 6)
+#define RHF_GUARANTEE_START_INIT (1 << 7)
+#define RHF_PIXIE (1 << 8)
+#define RHF_DEFAULT_DELAY_LOAD (1 << 9)
+#define RHF_REQUICKSTART (1 << 10)
+#define RHF_REQUICKSTARTED (1 << 11)
+#define RHF_CORD (1 << 12)
+#define RHF_NO_UNRES_UNDEF (1 << 13)
+#define RHF_RLD_ORDER_SAFE (1 << 14)
+
+/* Entries found in sections of type SHT_MIPS_LIBLIST. */
+
+typedef struct
+{
+ Elf32_Word l_name; /* Name (string table index) */
+ Elf32_Word l_time_stamp; /* Timestamp */
+ Elf32_Word l_checksum; /* Checksum */
+ Elf32_Word l_version; /* Interface version */
+ Elf32_Word l_flags; /* Flags */
+} Elf32_Lib;
+
+typedef struct
+{
+ Elf64_Word l_name; /* Name (string table index) */
+ Elf64_Word l_time_stamp; /* Timestamp */
+ Elf64_Word l_checksum; /* Checksum */
+ Elf64_Word l_version; /* Interface version */
+ Elf64_Word l_flags; /* Flags */
+} Elf64_Lib;
+
+
+/* Legal values for l_flags. */
+
+#define LL_NONE 0
+#define LL_EXACT_MATCH (1 << 0) /* Require exact match */
+#define LL_IGNORE_INT_VER (1 << 1) /* Ignore interface version */
+#define LL_REQUIRE_MINOR (1 << 2)
+#define LL_EXPORTS (1 << 3)
+#define LL_DELAY_LOAD (1 << 4)
+#define LL_DELTA (1 << 5)
+
+/* Entries found in sections of type SHT_MIPS_CONFLICT. */
+
+typedef Elf32_Addr Elf32_Conflict;
+
+typedef struct
+{
+ /* Version of flags structure. */
+ Elf32_Half version;
+ /* The level of the ISA: 1-5, 32, 64. */
+ unsigned char isa_level;
+ /* The revision of ISA: 0 for MIPS V and below, 1-n otherwise. */
+ unsigned char isa_rev;
+ /* The size of general purpose registers. */
+ unsigned char gpr_size;
+ /* The size of co-processor 1 registers. */
+ unsigned char cpr1_size;
+ /* The size of co-processor 2 registers. */
+ unsigned char cpr2_size;
+ /* The floating-point ABI. */
+ unsigned char fp_abi;
+ /* Processor-specific extension. */
+ Elf32_Word isa_ext;
+ /* Mask of ASEs used. */
+ Elf32_Word ases;
+ /* Mask of general flags. */
+ Elf32_Word flags1;
+ Elf32_Word flags2;
+} Elf_MIPS_ABIFlags_v0;
+
+/* Values for the register size bytes of an abi flags structure. */
+
+#define MIPS_AFL_REG_NONE 0x00 /* No registers. */
+#define MIPS_AFL_REG_32 0x01 /* 32-bit registers. */
+#define MIPS_AFL_REG_64 0x02 /* 64-bit registers. */
+#define MIPS_AFL_REG_128 0x03 /* 128-bit registers. */
+
+/* Masks for the ases word of an ABI flags structure. */
+
+#define MIPS_AFL_ASE_DSP 0x00000001 /* DSP ASE. */
+#define MIPS_AFL_ASE_DSPR2 0x00000002 /* DSP R2 ASE. */
+#define MIPS_AFL_ASE_EVA 0x00000004 /* Enhanced VA Scheme. */
+#define MIPS_AFL_ASE_MCU 0x00000008 /* MCU (MicroController) ASE. */
+#define MIPS_AFL_ASE_MDMX 0x00000010 /* MDMX ASE. */
+#define MIPS_AFL_ASE_MIPS3D 0x00000020 /* MIPS-3D ASE. */
+#define MIPS_AFL_ASE_MT 0x00000040 /* MT ASE. */
+#define MIPS_AFL_ASE_SMARTMIPS 0x00000080 /* SmartMIPS ASE. */
+#define MIPS_AFL_ASE_VIRT 0x00000100 /* VZ ASE. */
+#define MIPS_AFL_ASE_MSA 0x00000200 /* MSA ASE. */
+#define MIPS_AFL_ASE_MIPS16 0x00000400 /* MIPS16 ASE. */
+#define MIPS_AFL_ASE_MICROMIPS 0x00000800 /* MICROMIPS ASE. */
+#define MIPS_AFL_ASE_XPA 0x00001000 /* XPA ASE. */
+#define MIPS_AFL_ASE_MASK 0x00001fff /* All ASEs. */
+
+/* Values for the isa_ext word of an ABI flags structure. */
+
+#define MIPS_AFL_EXT_XLR 1 /* RMI Xlr instruction. */
+#define MIPS_AFL_EXT_OCTEON2 2 /* Cavium Networks Octeon2. */
+#define MIPS_AFL_EXT_OCTEONP 3 /* Cavium Networks OcteonP. */
+#define MIPS_AFL_EXT_LOONGSON_3A 4 /* Loongson 3A. */
+#define MIPS_AFL_EXT_OCTEON 5 /* Cavium Networks Octeon. */
+#define MIPS_AFL_EXT_5900 6 /* MIPS R5900 instruction. */
+#define MIPS_AFL_EXT_4650 7 /* MIPS R4650 instruction. */
+#define MIPS_AFL_EXT_4010 8 /* LSI R4010 instruction. */
+#define MIPS_AFL_EXT_4100 9 /* NEC VR4100 instruction. */
+#define MIPS_AFL_EXT_3900 10 /* Toshiba R3900 instruction. */
+#define MIPS_AFL_EXT_10000 11 /* MIPS R10000 instruction. */
+#define MIPS_AFL_EXT_SB1 12 /* Broadcom SB-1 instruction. */
+#define MIPS_AFL_EXT_4111 13 /* NEC VR4111/VR4181 instruction. */
+#define MIPS_AFL_EXT_4120 14 /* NEC VR4120 instruction. */
+#define MIPS_AFL_EXT_5400 15 /* NEC VR5400 instruction. */
+#define MIPS_AFL_EXT_5500 16 /* NEC VR5500 instruction. */
+#define MIPS_AFL_EXT_LOONGSON_2E 17 /* ST Microelectronics Loongson 2E. */
+#define MIPS_AFL_EXT_LOONGSON_2F 18 /* ST Microelectronics Loongson 2F. */
+
+/* Masks for the flags1 word of an ABI flags structure. */
+#define MIPS_AFL_FLAGS1_ODDSPREG 1 /* Uses odd single-precision registers. */
+
+/* Object attribute values. */
+enum
+{
+ /* Not tagged or not using any ABIs affected by the differences. */
+ Val_GNU_MIPS_ABI_FP_ANY = 0,
+ /* Using hard-float -mdouble-float. */
+ Val_GNU_MIPS_ABI_FP_DOUBLE = 1,
+ /* Using hard-float -msingle-float. */
+ Val_GNU_MIPS_ABI_FP_SINGLE = 2,
+ /* Using soft-float. */
+ Val_GNU_MIPS_ABI_FP_SOFT = 3,
+ /* Using -mips32r2 -mfp64. */
+ Val_GNU_MIPS_ABI_FP_OLD_64 = 4,
+ /* Using -mfpxx. */
+ Val_GNU_MIPS_ABI_FP_XX = 5,
+ /* Using -mips32r2 -mfp64. */
+ Val_GNU_MIPS_ABI_FP_64 = 6,
+ /* Using -mips32r2 -mfp64 -mno-odd-spreg. */
+ Val_GNU_MIPS_ABI_FP_64A = 7,
+ /* Maximum allocated FP ABI value. */
+ Val_GNU_MIPS_ABI_FP_MAX = 7
+};
+
+/* HPPA specific definitions. */
+
+/* Legal values for e_flags field of Elf32_Ehdr. */
+
+#define EF_PARISC_TRAPNIL 0x00010000 /* Trap nil pointer dereference. */
+#define EF_PARISC_EXT 0x00020000 /* Program uses arch. extensions. */
+#define EF_PARISC_LSB 0x00040000 /* Program expects little endian. */
+#define EF_PARISC_WIDE 0x00080000 /* Program expects wide mode. */
+#define EF_PARISC_NO_KABP 0x00100000 /* No kernel assisted branch
+ prediction. */
+#define EF_PARISC_LAZYSWAP 0x00400000 /* Allow lazy swapping. */
+#define EF_PARISC_ARCH 0x0000ffff /* Architecture version. */
+
+/* Defined values for `e_flags & EF_PARISC_ARCH' are: */
+
+#define EFA_PARISC_1_0 0x020b /* PA-RISC 1.0 big-endian. */
+#define EFA_PARISC_1_1 0x0210 /* PA-RISC 1.1 big-endian. */
+#define EFA_PARISC_2_0 0x0214 /* PA-RISC 2.0 big-endian. */
+
+/* Additional section indeces. */
+
+#define SHN_PARISC_ANSI_COMMON 0xff00 /* Section for tenatively declared
+ symbols in ANSI C. */
+#define SHN_PARISC_HUGE_COMMON 0xff01 /* Common blocks in huge model. */
+
+/* Legal values for sh_type field of Elf32_Shdr. */
+
+#define SHT_PARISC_EXT 0x70000000 /* Contains product specific ext. */
+#define SHT_PARISC_UNWIND 0x70000001 /* Unwind information. */
+#define SHT_PARISC_DOC 0x70000002 /* Debug info for optimized code. */
+
+/* Legal values for sh_flags field of Elf32_Shdr. */
+
+#define SHF_PARISC_SHORT 0x20000000 /* Section with short addressing. */
+#define SHF_PARISC_HUGE 0x40000000 /* Section far from gp. */
+#define SHF_PARISC_SBP 0x80000000 /* Static branch prediction code. */
+
+/* Legal values for ST_TYPE subfield of st_info (symbol type). */
+
+#define STT_PARISC_MILLICODE 13 /* Millicode function entry point. */
+
+#define STT_HP_OPAQUE (STT_LOOS + 0x1)
+#define STT_HP_STUB (STT_LOOS + 0x2)
+
+/* HPPA relocs. */
+
+#define R_PARISC_NONE 0 /* No reloc. */
+#define R_PARISC_DIR32 1 /* Direct 32-bit reference. */
+#define R_PARISC_DIR21L 2 /* Left 21 bits of eff. address. */
+#define R_PARISC_DIR17R 3 /* Right 17 bits of eff. address. */
+#define R_PARISC_DIR17F 4 /* 17 bits of eff. address. */
+#define R_PARISC_DIR14R 6 /* Right 14 bits of eff. address. */
+#define R_PARISC_PCREL32 9 /* 32-bit rel. address. */
+#define R_PARISC_PCREL21L 10 /* Left 21 bits of rel. address. */
+#define R_PARISC_PCREL17R 11 /* Right 17 bits of rel. address. */
+#define R_PARISC_PCREL17F 12 /* 17 bits of rel. address. */
+#define R_PARISC_PCREL14R 14 /* Right 14 bits of rel. address. */
+#define R_PARISC_DPREL21L 18 /* Left 21 bits of rel. address. */
+#define R_PARISC_DPREL14R 22 /* Right 14 bits of rel. address. */
+#define R_PARISC_GPREL21L 26 /* GP-relative, left 21 bits. */
+#define R_PARISC_GPREL14R 30 /* GP-relative, right 14 bits. */
+#define R_PARISC_LTOFF21L 34 /* LT-relative, left 21 bits. */
+#define R_PARISC_LTOFF14R 38 /* LT-relative, right 14 bits. */
+#define R_PARISC_SECREL32 41 /* 32 bits section rel. address. */
+#define R_PARISC_SEGBASE 48 /* No relocation, set segment base. */
+#define R_PARISC_SEGREL32 49 /* 32 bits segment rel. address. */
+#define R_PARISC_PLTOFF21L 50 /* PLT rel. address, left 21 bits. */
+#define R_PARISC_PLTOFF14R 54 /* PLT rel. address, right 14 bits. */
+#define R_PARISC_LTOFF_FPTR32 57 /* 32 bits LT-rel. function pointer. */
+#define R_PARISC_LTOFF_FPTR21L 58 /* LT-rel. fct ptr, left 21 bits. */
+#define R_PARISC_LTOFF_FPTR14R 62 /* LT-rel. fct ptr, right 14 bits. */
+#define R_PARISC_FPTR64 64 /* 64 bits function address. */
+#define R_PARISC_PLABEL32 65 /* 32 bits function address. */
+#define R_PARISC_PLABEL21L 66 /* Left 21 bits of fdesc address. */
+#define R_PARISC_PLABEL14R 70 /* Right 14 bits of fdesc address. */
+#define R_PARISC_PCREL64 72 /* 64 bits PC-rel. address. */
+#define R_PARISC_PCREL22F 74 /* 22 bits PC-rel. address. */
+#define R_PARISC_PCREL14WR 75 /* PC-rel. address, right 14 bits. */
+#define R_PARISC_PCREL14DR 76 /* PC rel. address, right 14 bits. */
+#define R_PARISC_PCREL16F 77 /* 16 bits PC-rel. address. */
+#define R_PARISC_PCREL16WF 78 /* 16 bits PC-rel. address. */
+#define R_PARISC_PCREL16DF 79 /* 16 bits PC-rel. address. */
+#define R_PARISC_DIR64 80 /* 64 bits of eff. address. */
+#define R_PARISC_DIR14WR 83 /* 14 bits of eff. address. */
+#define R_PARISC_DIR14DR 84 /* 14 bits of eff. address. */
+#define R_PARISC_DIR16F 85 /* 16 bits of eff. address. */
+#define R_PARISC_DIR16WF 86 /* 16 bits of eff. address. */
+#define R_PARISC_DIR16DF 87 /* 16 bits of eff. address. */
+#define R_PARISC_GPREL64 88 /* 64 bits of GP-rel. address. */
+#define R_PARISC_GPREL14WR 91 /* GP-rel. address, right 14 bits. */
+#define R_PARISC_GPREL14DR 92 /* GP-rel. address, right 14 bits. */
+#define R_PARISC_GPREL16F 93 /* 16 bits GP-rel. address. */
+#define R_PARISC_GPREL16WF 94 /* 16 bits GP-rel. address. */
+#define R_PARISC_GPREL16DF 95 /* 16 bits GP-rel. address. */
+#define R_PARISC_LTOFF64 96 /* 64 bits LT-rel. address. */
+#define R_PARISC_LTOFF14WR 99 /* LT-rel. address, right 14 bits. */
+#define R_PARISC_LTOFF14DR 100 /* LT-rel. address, right 14 bits. */
+#define R_PARISC_LTOFF16F 101 /* 16 bits LT-rel. address. */
+#define R_PARISC_LTOFF16WF 102 /* 16 bits LT-rel. address. */
+#define R_PARISC_LTOFF16DF 103 /* 16 bits LT-rel. address. */
+#define R_PARISC_SECREL64 104 /* 64 bits section rel. address. */
+#define R_PARISC_SEGREL64 112 /* 64 bits segment rel. address. */
+#define R_PARISC_PLTOFF14WR 115 /* PLT-rel. address, right 14 bits. */
+#define R_PARISC_PLTOFF14DR 116 /* PLT-rel. address, right 14 bits. */
+#define R_PARISC_PLTOFF16F 117 /* 16 bits LT-rel. address. */
+#define R_PARISC_PLTOFF16WF 118 /* 16 bits PLT-rel. address. */
+#define R_PARISC_PLTOFF16DF 119 /* 16 bits PLT-rel. address. */
+#define R_PARISC_LTOFF_FPTR64 120 /* 64 bits LT-rel. function ptr. */
+#define R_PARISC_LTOFF_FPTR14WR 123 /* LT-rel. fct. ptr., right 14 bits. */
+#define R_PARISC_LTOFF_FPTR14DR 124 /* LT-rel. fct. ptr., right 14 bits. */
+#define R_PARISC_LTOFF_FPTR16F 125 /* 16 bits LT-rel. function ptr. */
+#define R_PARISC_LTOFF_FPTR16WF 126 /* 16 bits LT-rel. function ptr. */
+#define R_PARISC_LTOFF_FPTR16DF 127 /* 16 bits LT-rel. function ptr. */
+#define R_PARISC_LORESERVE 128
+#define R_PARISC_COPY 128 /* Copy relocation. */
+#define R_PARISC_IPLT 129 /* Dynamic reloc, imported PLT */
+#define R_PARISC_EPLT 130 /* Dynamic reloc, exported PLT */
+#define R_PARISC_TPREL32 153 /* 32 bits TP-rel. address. */
+#define R_PARISC_TPREL21L 154 /* TP-rel. address, left 21 bits. */
+#define R_PARISC_TPREL14R 158 /* TP-rel. address, right 14 bits. */
+#define R_PARISC_LTOFF_TP21L 162 /* LT-TP-rel. address, left 21 bits. */
+#define R_PARISC_LTOFF_TP14R 166 /* LT-TP-rel. address, right 14 bits.*/
+#define R_PARISC_LTOFF_TP14F 167 /* 14 bits LT-TP-rel. address. */
+#define R_PARISC_TPREL64 216 /* 64 bits TP-rel. address. */
+#define R_PARISC_TPREL14WR 219 /* TP-rel. address, right 14 bits. */
+#define R_PARISC_TPREL14DR 220 /* TP-rel. address, right 14 bits. */
+#define R_PARISC_TPREL16F 221 /* 16 bits TP-rel. address. */
+#define R_PARISC_TPREL16WF 222 /* 16 bits TP-rel. address. */
+#define R_PARISC_TPREL16DF 223 /* 16 bits TP-rel. address. */
+#define R_PARISC_LTOFF_TP64 224 /* 64 bits LT-TP-rel. address. */
+#define R_PARISC_LTOFF_TP14WR 227 /* LT-TP-rel. address, right 14 bits.*/
+#define R_PARISC_LTOFF_TP14DR 228 /* LT-TP-rel. address, right 14 bits.*/
+#define R_PARISC_LTOFF_TP16F 229 /* 16 bits LT-TP-rel. address. */
+#define R_PARISC_LTOFF_TP16WF 230 /* 16 bits LT-TP-rel. address. */
+#define R_PARISC_LTOFF_TP16DF 231 /* 16 bits LT-TP-rel. address. */
+#define R_PARISC_GNU_VTENTRY 232
+#define R_PARISC_GNU_VTINHERIT 233
+#define R_PARISC_TLS_GD21L 234 /* GD 21-bit left. */
+#define R_PARISC_TLS_GD14R 235 /* GD 14-bit right. */
+#define R_PARISC_TLS_GDCALL 236 /* GD call to __t_g_a. */
+#define R_PARISC_TLS_LDM21L 237 /* LD module 21-bit left. */
+#define R_PARISC_TLS_LDM14R 238 /* LD module 14-bit right. */
+#define R_PARISC_TLS_LDMCALL 239 /* LD module call to __t_g_a. */
+#define R_PARISC_TLS_LDO21L 240 /* LD offset 21-bit left. */
+#define R_PARISC_TLS_LDO14R 241 /* LD offset 14-bit right. */
+#define R_PARISC_TLS_DTPMOD32 242 /* DTP module 32-bit. */
+#define R_PARISC_TLS_DTPMOD64 243 /* DTP module 64-bit. */
+#define R_PARISC_TLS_DTPOFF32 244 /* DTP offset 32-bit. */
+#define R_PARISC_TLS_DTPOFF64 245 /* DTP offset 32-bit. */
+#define R_PARISC_TLS_LE21L R_PARISC_TPREL21L
+#define R_PARISC_TLS_LE14R R_PARISC_TPREL14R
+#define R_PARISC_TLS_IE21L R_PARISC_LTOFF_TP21L
+#define R_PARISC_TLS_IE14R R_PARISC_LTOFF_TP14R
+#define R_PARISC_TLS_TPREL32 R_PARISC_TPREL32
+#define R_PARISC_TLS_TPREL64 R_PARISC_TPREL64
+#define R_PARISC_HIRESERVE 255
+
+/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */
+
+#define PT_HP_TLS (PT_LOOS + 0x0)
+#define PT_HP_CORE_NONE (PT_LOOS + 0x1)
+#define PT_HP_CORE_VERSION (PT_LOOS + 0x2)
+#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3)
+#define PT_HP_CORE_COMM (PT_LOOS + 0x4)
+#define PT_HP_CORE_PROC (PT_LOOS + 0x5)
+#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6)
+#define PT_HP_CORE_STACK (PT_LOOS + 0x7)
+#define PT_HP_CORE_SHM (PT_LOOS + 0x8)
+#define PT_HP_CORE_MMF (PT_LOOS + 0x9)
+#define PT_HP_PARALLEL (PT_LOOS + 0x10)
+#define PT_HP_FASTBIND (PT_LOOS + 0x11)
+#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12)
+#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13)
+#define PT_HP_STACK (PT_LOOS + 0x14)
+
+#define PT_PARISC_ARCHEXT 0x70000000
+#define PT_PARISC_UNWIND 0x70000001
+
+/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr. */
+
+#define PF_PARISC_SBP 0x08000000
+
+#define PF_HP_PAGE_SIZE 0x00100000
+#define PF_HP_FAR_SHARED 0x00200000
+#define PF_HP_NEAR_SHARED 0x00400000
+#define PF_HP_CODE 0x01000000
+#define PF_HP_MODIFY 0x02000000
+#define PF_HP_LAZYSWAP 0x04000000
+#define PF_HP_SBP 0x08000000
+
+
+/* Alpha specific definitions. */
+
+/* Legal values for e_flags field of Elf64_Ehdr. */
+
+#define EF_ALPHA_32BIT 1 /* All addresses must be < 2GB. */
+#define EF_ALPHA_CANRELAX 2 /* Relocations for relaxing exist. */
+
+/* Legal values for sh_type field of Elf64_Shdr. */
+
+/* These two are primerily concerned with ECOFF debugging info. */
+#define SHT_ALPHA_DEBUG 0x70000001
+#define SHT_ALPHA_REGINFO 0x70000002
+
+/* Legal values for sh_flags field of Elf64_Shdr. */
+
+#define SHF_ALPHA_GPREL 0x10000000
+
+/* Legal values for st_other field of Elf64_Sym. */
+#define STO_ALPHA_NOPV 0x80 /* No PV required. */
+#define STO_ALPHA_STD_GPLOAD 0x88 /* PV only used for initial ldgp. */
+
+/* Alpha relocs. */
+
+#define R_ALPHA_NONE 0 /* No reloc */
+#define R_ALPHA_REFLONG 1 /* Direct 32 bit */
+#define R_ALPHA_REFQUAD 2 /* Direct 64 bit */
+#define R_ALPHA_GPREL32 3 /* GP relative 32 bit */
+#define R_ALPHA_LITERAL 4 /* GP relative 16 bit w/optimization */
+#define R_ALPHA_LITUSE 5 /* Optimization hint for LITERAL */
+#define R_ALPHA_GPDISP 6 /* Add displacement to GP */
+#define R_ALPHA_BRADDR 7 /* PC+4 relative 23 bit shifted */
+#define R_ALPHA_HINT 8 /* PC+4 relative 16 bit shifted */
+#define R_ALPHA_SREL16 9 /* PC relative 16 bit */
+#define R_ALPHA_SREL32 10 /* PC relative 32 bit */
+#define R_ALPHA_SREL64 11 /* PC relative 64 bit */
+#define R_ALPHA_GPRELHIGH 17 /* GP relative 32 bit, high 16 bits */
+#define R_ALPHA_GPRELLOW 18 /* GP relative 32 bit, low 16 bits */
+#define R_ALPHA_GPREL16 19 /* GP relative 16 bit */
+#define R_ALPHA_COPY 24 /* Copy symbol at runtime */
+#define R_ALPHA_GLOB_DAT 25 /* Create GOT entry */
+#define R_ALPHA_JMP_SLOT 26 /* Create PLT entry */
+#define R_ALPHA_RELATIVE 27 /* Adjust by program base */
+#define R_ALPHA_TLS_GD_HI 28
+#define R_ALPHA_TLSGD 29
+#define R_ALPHA_TLS_LDM 30
+#define R_ALPHA_DTPMOD64 31
+#define R_ALPHA_GOTDTPREL 32
+#define R_ALPHA_DTPREL64 33
+#define R_ALPHA_DTPRELHI 34
+#define R_ALPHA_DTPRELLO 35
+#define R_ALPHA_DTPREL16 36
+#define R_ALPHA_GOTTPREL 37
+#define R_ALPHA_TPREL64 38
+#define R_ALPHA_TPRELHI 39
+#define R_ALPHA_TPRELLO 40
+#define R_ALPHA_TPREL16 41
+/* Keep this the last entry. */
+#define R_ALPHA_NUM 46
+
+/* Magic values of the LITUSE relocation addend. */
+#define LITUSE_ALPHA_ADDR 0
+#define LITUSE_ALPHA_BASE 1
+#define LITUSE_ALPHA_BYTOFF 2
+#define LITUSE_ALPHA_JSR 3
+#define LITUSE_ALPHA_TLS_GD 4
+#define LITUSE_ALPHA_TLS_LDM 5
+
+/* Legal values for d_tag of Elf64_Dyn. */
+#define DT_ALPHA_PLTRO (DT_LOPROC + 0)
+#define DT_ALPHA_NUM 1
+
+/* PowerPC specific declarations */
+
+/* Values for Elf32/64_Ehdr.e_flags. */
+#define EF_PPC_EMB 0x80000000 /* PowerPC embedded flag */
+
+/* Cygnus local bits below */
+#define EF_PPC_RELOCATABLE 0x00010000 /* PowerPC -mrelocatable flag*/
+#define EF_PPC_RELOCATABLE_LIB 0x00008000 /* PowerPC -mrelocatable-lib
+ flag */
+
+/* PowerPC relocations defined by the ABIs */
+#define R_PPC_NONE 0
+#define R_PPC_ADDR32 1 /* 32bit absolute address */
+#define R_PPC_ADDR24 2 /* 26bit address, 2 bits ignored. */
+#define R_PPC_ADDR16 3 /* 16bit absolute address */
+#define R_PPC_ADDR16_LO 4 /* lower 16bit of absolute address */
+#define R_PPC_ADDR16_HI 5 /* high 16bit of absolute address */
+#define R_PPC_ADDR16_HA 6 /* adjusted high 16bit */
+#define R_PPC_ADDR14 7 /* 16bit address, 2 bits ignored */
+#define R_PPC_ADDR14_BRTAKEN 8
+#define R_PPC_ADDR14_BRNTAKEN 9
+#define R_PPC_REL24 10 /* PC relative 26 bit */
+#define R_PPC_REL14 11 /* PC relative 16 bit */
+#define R_PPC_REL14_BRTAKEN 12
+#define R_PPC_REL14_BRNTAKEN 13
+#define R_PPC_GOT16 14
+#define R_PPC_GOT16_LO 15
+#define R_PPC_GOT16_HI 16
+#define R_PPC_GOT16_HA 17
+#define R_PPC_PLTREL24 18
+#define R_PPC_COPY 19
+#define R_PPC_GLOB_DAT 20
+#define R_PPC_JMP_SLOT 21
+#define R_PPC_RELATIVE 22
+#define R_PPC_LOCAL24PC 23
+#define R_PPC_UADDR32 24
+#define R_PPC_UADDR16 25
+#define R_PPC_REL32 26
+#define R_PPC_PLT32 27
+#define R_PPC_PLTREL32 28
+#define R_PPC_PLT16_LO 29
+#define R_PPC_PLT16_HI 30
+#define R_PPC_PLT16_HA 31
+#define R_PPC_SDAREL16 32
+#define R_PPC_SECTOFF 33
+#define R_PPC_SECTOFF_LO 34
+#define R_PPC_SECTOFF_HI 35
+#define R_PPC_SECTOFF_HA 36
+
+/* PowerPC relocations defined for the TLS access ABI. */
+#define R_PPC_TLS 67 /* none (sym+add)@tls */
+#define R_PPC_DTPMOD32 68 /* word32 (sym+add)@dtpmod */
+#define R_PPC_TPREL16 69 /* half16* (sym+add)@tprel */
+#define R_PPC_TPREL16_LO 70 /* half16 (sym+add)@tprel@l */
+#define R_PPC_TPREL16_HI 71 /* half16 (sym+add)@tprel@h */
+#define R_PPC_TPREL16_HA 72 /* half16 (sym+add)@tprel@ha */
+#define R_PPC_TPREL32 73 /* word32 (sym+add)@tprel */
+#define R_PPC_DTPREL16 74 /* half16* (sym+add)@dtprel */
+#define R_PPC_DTPREL16_LO 75 /* half16 (sym+add)@dtprel@l */
+#define R_PPC_DTPREL16_HI 76 /* half16 (sym+add)@dtprel@h */
+#define R_PPC_DTPREL16_HA 77 /* half16 (sym+add)@dtprel@ha */
+#define R_PPC_DTPREL32 78 /* word32 (sym+add)@dtprel */
+#define R_PPC_GOT_TLSGD16 79 /* half16* (sym+add)@got@tlsgd */
+#define R_PPC_GOT_TLSGD16_LO 80 /* half16 (sym+add)@got@tlsgd@l */
+#define R_PPC_GOT_TLSGD16_HI 81 /* half16 (sym+add)@got@tlsgd@h */
+#define R_PPC_GOT_TLSGD16_HA 82 /* half16 (sym+add)@got@tlsgd@ha */
+#define R_PPC_GOT_TLSLD16 83 /* half16* (sym+add)@got@tlsld */
+#define R_PPC_GOT_TLSLD16_LO 84 /* half16 (sym+add)@got@tlsld@l */
+#define R_PPC_GOT_TLSLD16_HI 85 /* half16 (sym+add)@got@tlsld@h */
+#define R_PPC_GOT_TLSLD16_HA 86 /* half16 (sym+add)@got@tlsld@ha */
+#define R_PPC_GOT_TPREL16 87 /* half16* (sym+add)@got@tprel */
+#define R_PPC_GOT_TPREL16_LO 88 /* half16 (sym+add)@got@tprel@l */
+#define R_PPC_GOT_TPREL16_HI 89 /* half16 (sym+add)@got@tprel@h */
+#define R_PPC_GOT_TPREL16_HA 90 /* half16 (sym+add)@got@tprel@ha */
+#define R_PPC_GOT_DTPREL16 91 /* half16* (sym+add)@got@dtprel */
+#define R_PPC_GOT_DTPREL16_LO 92 /* half16* (sym+add)@got@dtprel@l */
+#define R_PPC_GOT_DTPREL16_HI 93 /* half16* (sym+add)@got@dtprel@h */
+#define R_PPC_GOT_DTPREL16_HA 94 /* half16* (sym+add)@got@dtprel@ha */
+#define R_PPC_TLSGD 95 /* none (sym+add)@tlsgd */
+#define R_PPC_TLSLD 96 /* none (sym+add)@tlsld */
+
+/* The remaining relocs are from the Embedded ELF ABI, and are not
+ in the SVR4 ELF ABI. */
+#define R_PPC_EMB_NADDR32 101
+#define R_PPC_EMB_NADDR16 102
+#define R_PPC_EMB_NADDR16_LO 103
+#define R_PPC_EMB_NADDR16_HI 104
+#define R_PPC_EMB_NADDR16_HA 105
+#define R_PPC_EMB_SDAI16 106
+#define R_PPC_EMB_SDA2I16 107
+#define R_PPC_EMB_SDA2REL 108
+#define R_PPC_EMB_SDA21 109 /* 16 bit offset in SDA */
+#define R_PPC_EMB_MRKREF 110
+#define R_PPC_EMB_RELSEC16 111
+#define R_PPC_EMB_RELST_LO 112
+#define R_PPC_EMB_RELST_HI 113
+#define R_PPC_EMB_RELST_HA 114
+#define R_PPC_EMB_BIT_FLD 115
+#define R_PPC_EMB_RELSDA 116 /* 16 bit relative offset in SDA */
+
+/* Diab tool relocations. */
+#define R_PPC_DIAB_SDA21_LO 180 /* like EMB_SDA21, but lower 16 bit */
+#define R_PPC_DIAB_SDA21_HI 181 /* like EMB_SDA21, but high 16 bit */
+#define R_PPC_DIAB_SDA21_HA 182 /* like EMB_SDA21, adjusted high 16 */
+#define R_PPC_DIAB_RELSDA_LO 183 /* like EMB_RELSDA, but lower 16 bit */
+#define R_PPC_DIAB_RELSDA_HI 184 /* like EMB_RELSDA, but high 16 bit */
+#define R_PPC_DIAB_RELSDA_HA 185 /* like EMB_RELSDA, adjusted high 16 */
+
+/* GNU extension to support local ifunc. */
+#define R_PPC_IRELATIVE 248
+
+/* GNU relocs used in PIC code sequences. */
+#define R_PPC_REL16 249 /* half16 (sym+add-.) */
+#define R_PPC_REL16_LO 250 /* half16 (sym+add-.)@l */
+#define R_PPC_REL16_HI 251 /* half16 (sym+add-.)@h */
+#define R_PPC_REL16_HA 252 /* half16 (sym+add-.)@ha */
+
+/* This is a phony reloc to handle any old fashioned TOC16 references
+ that may still be in object files. */
+#define R_PPC_TOC16 255
+
+/* PowerPC specific values for the Dyn d_tag field. */
+#define DT_PPC_GOT (DT_LOPROC + 0)
+#define DT_PPC_OPT (DT_LOPROC + 1)
+#define DT_PPC_NUM 2
+
+/* PowerPC specific values for the DT_PPC_OPT Dyn entry. */
+#define PPC_OPT_TLS 1
+
+/* PowerPC64 relocations defined by the ABIs */
+#define R_PPC64_NONE R_PPC_NONE
+#define R_PPC64_ADDR32 R_PPC_ADDR32 /* 32bit absolute address */
+#define R_PPC64_ADDR24 R_PPC_ADDR24 /* 26bit address, word aligned */
+#define R_PPC64_ADDR16 R_PPC_ADDR16 /* 16bit absolute address */
+#define R_PPC64_ADDR16_LO R_PPC_ADDR16_LO /* lower 16bits of address */
+#define R_PPC64_ADDR16_HI R_PPC_ADDR16_HI /* high 16bits of address. */
+#define R_PPC64_ADDR16_HA R_PPC_ADDR16_HA /* adjusted high 16bits. */
+#define R_PPC64_ADDR14 R_PPC_ADDR14 /* 16bit address, word aligned */
+#define R_PPC64_ADDR14_BRTAKEN R_PPC_ADDR14_BRTAKEN
+#define R_PPC64_ADDR14_BRNTAKEN R_PPC_ADDR14_BRNTAKEN
+#define R_PPC64_REL24 R_PPC_REL24 /* PC-rel. 26 bit, word aligned */
+#define R_PPC64_REL14 R_PPC_REL14 /* PC relative 16 bit */
+#define R_PPC64_REL14_BRTAKEN R_PPC_REL14_BRTAKEN
+#define R_PPC64_REL14_BRNTAKEN R_PPC_REL14_BRNTAKEN
+#define R_PPC64_GOT16 R_PPC_GOT16
+#define R_PPC64_GOT16_LO R_PPC_GOT16_LO
+#define R_PPC64_GOT16_HI R_PPC_GOT16_HI
+#define R_PPC64_GOT16_HA R_PPC_GOT16_HA
+
+#define R_PPC64_COPY R_PPC_COPY
+#define R_PPC64_GLOB_DAT R_PPC_GLOB_DAT
+#define R_PPC64_JMP_SLOT R_PPC_JMP_SLOT
+#define R_PPC64_RELATIVE R_PPC_RELATIVE
+
+#define R_PPC64_UADDR32 R_PPC_UADDR32
+#define R_PPC64_UADDR16 R_PPC_UADDR16
+#define R_PPC64_REL32 R_PPC_REL32
+#define R_PPC64_PLT32 R_PPC_PLT32
+#define R_PPC64_PLTREL32 R_PPC_PLTREL32
+#define R_PPC64_PLT16_LO R_PPC_PLT16_LO
+#define R_PPC64_PLT16_HI R_PPC_PLT16_HI
+#define R_PPC64_PLT16_HA R_PPC_PLT16_HA
+
+#define R_PPC64_SECTOFF R_PPC_SECTOFF
+#define R_PPC64_SECTOFF_LO R_PPC_SECTOFF_LO
+#define R_PPC64_SECTOFF_HI R_PPC_SECTOFF_HI
+#define R_PPC64_SECTOFF_HA R_PPC_SECTOFF_HA
+#define R_PPC64_ADDR30 37 /* word30 (S + A - P) >> 2 */
+#define R_PPC64_ADDR64 38 /* doubleword64 S + A */
+#define R_PPC64_ADDR16_HIGHER 39 /* half16 #higher(S + A) */
+#define R_PPC64_ADDR16_HIGHERA 40 /* half16 #highera(S + A) */
+#define R_PPC64_ADDR16_HIGHEST 41 /* half16 #highest(S + A) */
+#define R_PPC64_ADDR16_HIGHESTA 42 /* half16 #highesta(S + A) */
+#define R_PPC64_UADDR64 43 /* doubleword64 S + A */
+#define R_PPC64_REL64 44 /* doubleword64 S + A - P */
+#define R_PPC64_PLT64 45 /* doubleword64 L + A */
+#define R_PPC64_PLTREL64 46 /* doubleword64 L + A - P */
+#define R_PPC64_TOC16 47 /* half16* S + A - .TOC */
+#define R_PPC64_TOC16_LO 48 /* half16 #lo(S + A - .TOC.) */
+#define R_PPC64_TOC16_HI 49 /* half16 #hi(S + A - .TOC.) */
+#define R_PPC64_TOC16_HA 50 /* half16 #ha(S + A - .TOC.) */
+#define R_PPC64_TOC 51 /* doubleword64 .TOC */
+#define R_PPC64_PLTGOT16 52 /* half16* M + A */
+#define R_PPC64_PLTGOT16_LO 53 /* half16 #lo(M + A) */
+#define R_PPC64_PLTGOT16_HI 54 /* half16 #hi(M + A) */
+#define R_PPC64_PLTGOT16_HA 55 /* half16 #ha(M + A) */
+
+#define R_PPC64_ADDR16_DS 56 /* half16ds* (S + A) >> 2 */
+#define R_PPC64_ADDR16_LO_DS 57 /* half16ds #lo(S + A) >> 2 */
+#define R_PPC64_GOT16_DS 58 /* half16ds* (G + A) >> 2 */
+#define R_PPC64_GOT16_LO_DS 59 /* half16ds #lo(G + A) >> 2 */
+#define R_PPC64_PLT16_LO_DS 60 /* half16ds #lo(L + A) >> 2 */
+#define R_PPC64_SECTOFF_DS 61 /* half16ds* (R + A) >> 2 */
+#define R_PPC64_SECTOFF_LO_DS 62 /* half16ds #lo(R + A) >> 2 */
+#define R_PPC64_TOC16_DS 63 /* half16ds* (S + A - .TOC.) >> 2 */
+#define R_PPC64_TOC16_LO_DS 64 /* half16ds #lo(S + A - .TOC.) >> 2 */
+#define R_PPC64_PLTGOT16_DS 65 /* half16ds* (M + A) >> 2 */
+#define R_PPC64_PLTGOT16_LO_DS 66 /* half16ds #lo(M + A) >> 2 */
+
+/* PowerPC64 relocations defined for the TLS access ABI. */
+#define R_PPC64_TLS 67 /* none (sym+add)@tls */
+#define R_PPC64_DTPMOD64 68 /* doubleword64 (sym+add)@dtpmod */
+#define R_PPC64_TPREL16 69 /* half16* (sym+add)@tprel */
+#define R_PPC64_TPREL16_LO 70 /* half16 (sym+add)@tprel@l */
+#define R_PPC64_TPREL16_HI 71 /* half16 (sym+add)@tprel@h */
+#define R_PPC64_TPREL16_HA 72 /* half16 (sym+add)@tprel@ha */
+#define R_PPC64_TPREL64 73 /* doubleword64 (sym+add)@tprel */
+#define R_PPC64_DTPREL16 74 /* half16* (sym+add)@dtprel */
+#define R_PPC64_DTPREL16_LO 75 /* half16 (sym+add)@dtprel@l */
+#define R_PPC64_DTPREL16_HI 76 /* half16 (sym+add)@dtprel@h */
+#define R_PPC64_DTPREL16_HA 77 /* half16 (sym+add)@dtprel@ha */
+#define R_PPC64_DTPREL64 78 /* doubleword64 (sym+add)@dtprel */
+#define R_PPC64_GOT_TLSGD16 79 /* half16* (sym+add)@got@tlsgd */
+#define R_PPC64_GOT_TLSGD16_LO 80 /* half16 (sym+add)@got@tlsgd@l */
+#define R_PPC64_GOT_TLSGD16_HI 81 /* half16 (sym+add)@got@tlsgd@h */
+#define R_PPC64_GOT_TLSGD16_HA 82 /* half16 (sym+add)@got@tlsgd@ha */
+#define R_PPC64_GOT_TLSLD16 83 /* half16* (sym+add)@got@tlsld */
+#define R_PPC64_GOT_TLSLD16_LO 84 /* half16 (sym+add)@got@tlsld@l */
+#define R_PPC64_GOT_TLSLD16_HI 85 /* half16 (sym+add)@got@tlsld@h */
+#define R_PPC64_GOT_TLSLD16_HA 86 /* half16 (sym+add)@got@tlsld@ha */
+#define R_PPC64_GOT_TPREL16_DS 87 /* half16ds* (sym+add)@got@tprel */
+#define R_PPC64_GOT_TPREL16_LO_DS 88 /* half16ds (sym+add)@got@tprel@l */
+#define R_PPC64_GOT_TPREL16_HI 89 /* half16 (sym+add)@got@tprel@h */
+#define R_PPC64_GOT_TPREL16_HA 90 /* half16 (sym+add)@got@tprel@ha */
+#define R_PPC64_GOT_DTPREL16_DS 91 /* half16ds* (sym+add)@got@dtprel */
+#define R_PPC64_GOT_DTPREL16_LO_DS 92 /* half16ds (sym+add)@got@dtprel@l */
+#define R_PPC64_GOT_DTPREL16_HI 93 /* half16 (sym+add)@got@dtprel@h */
+#define R_PPC64_GOT_DTPREL16_HA 94 /* half16 (sym+add)@got@dtprel@ha */
+#define R_PPC64_TPREL16_DS 95 /* half16ds* (sym+add)@tprel */
+#define R_PPC64_TPREL16_LO_DS 96 /* half16ds (sym+add)@tprel@l */
+#define R_PPC64_TPREL16_HIGHER 97 /* half16 (sym+add)@tprel@higher */
+#define R_PPC64_TPREL16_HIGHERA 98 /* half16 (sym+add)@tprel@highera */
+#define R_PPC64_TPREL16_HIGHEST 99 /* half16 (sym+add)@tprel@highest */
+#define R_PPC64_TPREL16_HIGHESTA 100 /* half16 (sym+add)@tprel@highesta */
+#define R_PPC64_DTPREL16_DS 101 /* half16ds* (sym+add)@dtprel */
+#define R_PPC64_DTPREL16_LO_DS 102 /* half16ds (sym+add)@dtprel@l */
+#define R_PPC64_DTPREL16_HIGHER 103 /* half16 (sym+add)@dtprel@higher */
+#define R_PPC64_DTPREL16_HIGHERA 104 /* half16 (sym+add)@dtprel@highera */
+#define R_PPC64_DTPREL16_HIGHEST 105 /* half16 (sym+add)@dtprel@highest */
+#define R_PPC64_DTPREL16_HIGHESTA 106 /* half16 (sym+add)@dtprel@highesta */
+#define R_PPC64_TLSGD 107 /* none (sym+add)@tlsgd */
+#define R_PPC64_TLSLD 108 /* none (sym+add)@tlsld */
+#define R_PPC64_TOCSAVE 109 /* none */
+
+/* Added when HA and HI relocs were changed to report overflows. */
+#define R_PPC64_ADDR16_HIGH 110
+#define R_PPC64_ADDR16_HIGHA 111
+#define R_PPC64_TPREL16_HIGH 112
+#define R_PPC64_TPREL16_HIGHA 113
+#define R_PPC64_DTPREL16_HIGH 114
+#define R_PPC64_DTPREL16_HIGHA 115
+
+/* GNU extension to support local ifunc. */
+#define R_PPC64_JMP_IREL 247
+#define R_PPC64_IRELATIVE 248
+#define R_PPC64_REL16 249 /* half16 (sym+add-.) */
+#define R_PPC64_REL16_LO 250 /* half16 (sym+add-.)@l */
+#define R_PPC64_REL16_HI 251 /* half16 (sym+add-.)@h */
+#define R_PPC64_REL16_HA 252 /* half16 (sym+add-.)@ha */
+
+/* e_flags bits specifying ABI.
+ 1 for original function descriptor using ABI,
+ 2 for revised ABI without function descriptors,
+ 0 for unspecified or not using any features affected by the differences. */
+#define EF_PPC64_ABI 3
+
+/* PowerPC64 specific values for the Dyn d_tag field. */
+#define DT_PPC64_GLINK (DT_LOPROC + 0)
+#define DT_PPC64_OPD (DT_LOPROC + 1)
+#define DT_PPC64_OPDSZ (DT_LOPROC + 2)
+#define DT_PPC64_OPT (DT_LOPROC + 3)
+#define DT_PPC64_NUM 4
+
+/* PowerPC64 specific values for the DT_PPC64_OPT Dyn entry. */
+#define PPC64_OPT_TLS 1
+#define PPC64_OPT_MULTI_TOC 2
+
+/* PowerPC64 specific values for the Elf64_Sym st_other field. */
+#define STO_PPC64_LOCAL_BIT 5
+#define STO_PPC64_LOCAL_MASK (7 << STO_PPC64_LOCAL_BIT)
+#define PPC64_LOCAL_ENTRY_OFFSET(other) \
+ (((1 << (((other) & STO_PPC64_LOCAL_MASK) >> STO_PPC64_LOCAL_BIT)) >> 2) << 2)
+
+
+/* ARM specific declarations */
+
+/* Processor specific flags for the ELF header e_flags field. */
+#define EF_ARM_RELEXEC 0x01
+#define EF_ARM_HASENTRY 0x02
+#define EF_ARM_INTERWORK 0x04
+#define EF_ARM_APCS_26 0x08
+#define EF_ARM_APCS_FLOAT 0x10
+#define EF_ARM_PIC 0x20
+#define EF_ARM_ALIGN8 0x40 /* 8-bit structure alignment is in use */
+#define EF_ARM_NEW_ABI 0x80
+#define EF_ARM_OLD_ABI 0x100
+#define EF_ARM_SOFT_FLOAT 0x200
+#define EF_ARM_VFP_FLOAT 0x400
+#define EF_ARM_MAVERICK_FLOAT 0x800
+
+#define EF_ARM_ABI_FLOAT_SOFT 0x200 /* NB conflicts with EF_ARM_SOFT_FLOAT */
+#define EF_ARM_ABI_FLOAT_HARD 0x400 /* NB conflicts with EF_ARM_VFP_FLOAT */
+
+
+/* Other constants defined in the ARM ELF spec. version B-01. */
+/* NB. These conflict with values defined above. */
+#define EF_ARM_SYMSARESORTED 0x04
+#define EF_ARM_DYNSYMSUSESEGIDX 0x08
+#define EF_ARM_MAPSYMSFIRST 0x10
+#define EF_ARM_EABIMASK 0XFF000000
+
+/* Constants defined in AAELF. */
+#define EF_ARM_BE8 0x00800000
+#define EF_ARM_LE8 0x00400000
+
+#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK)
+#define EF_ARM_EABI_UNKNOWN 0x00000000
+#define EF_ARM_EABI_VER1 0x01000000
+#define EF_ARM_EABI_VER2 0x02000000
+#define EF_ARM_EABI_VER3 0x03000000
+#define EF_ARM_EABI_VER4 0x04000000
+#define EF_ARM_EABI_VER5 0x05000000
+
+/* Additional symbol types for Thumb. */
+#define STT_ARM_TFUNC STT_LOPROC /* A Thumb function. */
+#define STT_ARM_16BIT STT_HIPROC /* A Thumb label. */
+
+/* ARM-specific values for sh_flags */
+#define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */
+#define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined
+ in the input to a link step. */
+
+/* ARM-specific program header flags */
+#define PF_ARM_SB 0x10000000 /* Segment contains the location
+ addressed by the static base. */
+#define PF_ARM_PI 0x20000000 /* Position-independent segment. */
+#define PF_ARM_ABS 0x40000000 /* Absolute segment. */
+
+/* Processor specific values for the Phdr p_type field. */
+#define PT_ARM_EXIDX (PT_LOPROC + 1) /* ARM unwind segment. */
+
+/* Processor specific values for the Shdr sh_type field. */
+#define SHT_ARM_EXIDX (SHT_LOPROC + 1) /* ARM unwind section. */
+#define SHT_ARM_PREEMPTMAP (SHT_LOPROC + 2) /* Preemption details. */
+#define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3) /* ARM attributes section. */
+
+
+/* AArch64 relocs. */
+
+#define R_AARCH64_NONE 0 /* No relocation. */
+
+/* ILP32 AArch64 relocs. */
+#define R_AARCH64_P32_ABS32 1 /* Direct 32 bit. */
+#define R_AARCH64_P32_COPY 180 /* Copy symbol at runtime. */
+#define R_AARCH64_P32_GLOB_DAT 181 /* Create GOT entry. */
+#define R_AARCH64_P32_JUMP_SLOT 182 /* Create PLT entry. */
+#define R_AARCH64_P32_RELATIVE 183 /* Adjust by program base. */
+#define R_AARCH64_P32_TLS_DTPMOD 184 /* Module number, 32 bit. */
+#define R_AARCH64_P32_TLS_DTPREL 185 /* Module-relative offset, 32 bit. */
+#define R_AARCH64_P32_TLS_TPREL 186 /* TP-relative offset, 32 bit. */
+#define R_AARCH64_P32_TLSDESC 187 /* TLS Descriptor. */
+#define R_AARCH64_P32_IRELATIVE 188 /* STT_GNU_IFUNC relocation. */
+
+/* LP64 AArch64 relocs. */
+#define R_AARCH64_ABS64 257 /* Direct 64 bit. */
+#define R_AARCH64_ABS32 258 /* Direct 32 bit. */
+#define R_AARCH64_ABS16 259 /* Direct 16-bit. */
+#define R_AARCH64_PREL64 260 /* PC-relative 64-bit. */
+#define R_AARCH64_PREL32 261 /* PC-relative 32-bit. */
+#define R_AARCH64_PREL16 262 /* PC-relative 16-bit. */
+#define R_AARCH64_MOVW_UABS_G0 263 /* Dir. MOVZ imm. from bits 15:0. */
+#define R_AARCH64_MOVW_UABS_G0_NC 264 /* Likewise for MOVK; no check. */
+#define R_AARCH64_MOVW_UABS_G1 265 /* Dir. MOVZ imm. from bits 31:16. */
+#define R_AARCH64_MOVW_UABS_G1_NC 266 /* Likewise for MOVK; no check. */
+#define R_AARCH64_MOVW_UABS_G2 267 /* Dir. MOVZ imm. from bits 47:32. */
+#define R_AARCH64_MOVW_UABS_G2_NC 268 /* Likewise for MOVK; no check. */
+#define R_AARCH64_MOVW_UABS_G3 269 /* Dir. MOV{K,Z} imm. from 63:48. */
+#define R_AARCH64_MOVW_SABS_G0 270 /* Dir. MOV{N,Z} imm. from 15:0. */
+#define R_AARCH64_MOVW_SABS_G1 271 /* Dir. MOV{N,Z} imm. from 31:16. */
+#define R_AARCH64_MOVW_SABS_G2 272 /* Dir. MOV{N,Z} imm. from 47:32. */
+#define R_AARCH64_LD_PREL_LO19 273 /* PC-rel. LD imm. from bits 20:2. */
+#define R_AARCH64_ADR_PREL_LO21 274 /* PC-rel. ADR imm. from bits 20:0. */
+#define R_AARCH64_ADR_PREL_PG_HI21 275 /* Page-rel. ADRP imm. from 32:12. */
+#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 /* Likewise; no overflow check. */
+#define R_AARCH64_ADD_ABS_LO12_NC 277 /* Dir. ADD imm. from bits 11:0. */
+#define R_AARCH64_LDST8_ABS_LO12_NC 278 /* Likewise for LD/ST; no check. */
+#define R_AARCH64_TSTBR14 279 /* PC-rel. TBZ/TBNZ imm. from 15:2. */
+#define R_AARCH64_CONDBR19 280 /* PC-rel. cond. br. imm. from 20:2. */
+#define R_AARCH64_JUMP26 282 /* PC-rel. B imm. from bits 27:2. */
+#define R_AARCH64_CALL26 283 /* Likewise for CALL. */
+#define R_AARCH64_LDST16_ABS_LO12_NC 284 /* Dir. ADD imm. from bits 11:1. */
+#define R_AARCH64_LDST32_ABS_LO12_NC 285 /* Likewise for bits 11:2. */
+#define R_AARCH64_LDST64_ABS_LO12_NC 286 /* Likewise for bits 11:3. */
+#define R_AARCH64_MOVW_PREL_G0 287 /* PC-rel. MOV{N,Z} imm. from 15:0. */
+#define R_AARCH64_MOVW_PREL_G0_NC 288 /* Likewise for MOVK; no check. */
+#define R_AARCH64_MOVW_PREL_G1 289 /* PC-rel. MOV{N,Z} imm. from 31:16. */
+#define R_AARCH64_MOVW_PREL_G1_NC 290 /* Likewise for MOVK; no check. */
+#define R_AARCH64_MOVW_PREL_G2 291 /* PC-rel. MOV{N,Z} imm. from 47:32. */
+#define R_AARCH64_MOVW_PREL_G2_NC 292 /* Likewise for MOVK; no check. */
+#define R_AARCH64_MOVW_PREL_G3 293 /* PC-rel. MOV{N,Z} imm. from 63:48. */
+#define R_AARCH64_LDST128_ABS_LO12_NC 299 /* Dir. ADD imm. from bits 11:4. */
+#define R_AARCH64_MOVW_GOTOFF_G0 300 /* GOT-rel. off. MOV{N,Z} imm. 15:0. */
+#define R_AARCH64_MOVW_GOTOFF_G0_NC 301 /* Likewise for MOVK; no check. */
+#define R_AARCH64_MOVW_GOTOFF_G1 302 /* GOT-rel. o. MOV{N,Z} imm. 31:16. */
+#define R_AARCH64_MOVW_GOTOFF_G1_NC 303 /* Likewise for MOVK; no check. */
+#define R_AARCH64_MOVW_GOTOFF_G2 304 /* GOT-rel. o. MOV{N,Z} imm. 47:32. */
+#define R_AARCH64_MOVW_GOTOFF_G2_NC 305 /* Likewise for MOVK; no check. */
+#define R_AARCH64_MOVW_GOTOFF_G3 306 /* GOT-rel. o. MOV{N,Z} imm. 63:48. */
+#define R_AARCH64_GOTREL64 307 /* GOT-relative 64-bit. */
+#define R_AARCH64_GOTREL32 308 /* GOT-relative 32-bit. */
+#define R_AARCH64_GOT_LD_PREL19 309 /* PC-rel. GOT off. load imm. 20:2. */
+#define R_AARCH64_LD64_GOTOFF_LO15 310 /* GOT-rel. off. LD/ST imm. 14:3. */
+#define R_AARCH64_ADR_GOT_PAGE 311 /* P-page-rel. GOT off. ADRP 32:12. */
+#define R_AARCH64_LD64_GOT_LO12_NC 312 /* Dir. GOT off. LD/ST imm. 11:3. */
+#define R_AARCH64_LD64_GOTPAGE_LO15 313 /* GOT-page-rel. GOT off. LD/ST 14:3 */
+#define R_AARCH64_TLSGD_ADR_PREL21 512 /* PC-relative ADR imm. 20:0. */
+#define R_AARCH64_TLSGD_ADR_PAGE21 513 /* page-rel. ADRP imm. 32:12. */
+#define R_AARCH64_TLSGD_ADD_LO12_NC 514 /* direct ADD imm. from 11:0. */
+#define R_AARCH64_TLSGD_MOVW_G1 515 /* GOT-rel. MOV{N,Z} 31:16. */
+#define R_AARCH64_TLSGD_MOVW_G0_NC 516 /* GOT-rel. MOVK imm. 15:0. */
+#define R_AARCH64_TLSLD_ADR_PREL21 517 /* Like 512; local dynamic model. */
+#define R_AARCH64_TLSLD_ADR_PAGE21 518 /* Like 513; local dynamic model. */
+#define R_AARCH64_TLSLD_ADD_LO12_NC 519 /* Like 514; local dynamic model. */
+#define R_AARCH64_TLSLD_MOVW_G1 520 /* Like 515; local dynamic model. */
+#define R_AARCH64_TLSLD_MOVW_G0_NC 521 /* Like 516; local dynamic model. */
+#define R_AARCH64_TLSLD_LD_PREL19 522 /* TLS PC-rel. load imm. 20:2. */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 /* TLS DTP-rel. MOV{N,Z} 47:32. */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 /* TLS DTP-rel. MOV{N,Z} 31:16. */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 /* Likewise; MOVK; no check. */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 /* TLS DTP-rel. MOV{N,Z} 15:0. */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 /* Likewise; MOVK; no check. */
+#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 /* DTP-rel. ADD imm. from 23:12. */
+#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 /* DTP-rel. ADD imm. from 11:0. */
+#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 /* Likewise; no ovfl. check. */
+#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 /* DTP-rel. LD/ST imm. 11:0. */
+#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 /* Likewise; no check. */
+#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 /* DTP-rel. LD/ST imm. 11:1. */
+#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 /* Likewise; no check. */
+#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 /* DTP-rel. LD/ST imm. 11:2. */
+#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 /* Likewise; no check. */
+#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 /* DTP-rel. LD/ST imm. 11:3. */
+#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 /* Likewise; no check. */
+#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 /* GOT-rel. MOV{N,Z} 31:16. */
+#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 /* GOT-rel. MOVK 15:0. */
+#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 /* Page-rel. ADRP 32:12. */
+#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 /* Direct LD off. 11:3. */
+#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 /* PC-rel. load imm. 20:2. */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 /* TLS TP-rel. MOV{N,Z} 47:32. */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 /* TLS TP-rel. MOV{N,Z} 31:16. */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 /* Likewise; MOVK; no check. */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 /* TLS TP-rel. MOV{N,Z} 15:0. */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 /* Likewise; MOVK; no check. */
+#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 /* TP-rel. ADD imm. 23:12. */
+#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 /* TP-rel. ADD imm. 11:0. */
+#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 /* Likewise; no ovfl. check. */
+#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 /* TP-rel. LD/ST off. 11:0. */
+#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 /* Likewise; no ovfl. check. */
+#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 /* TP-rel. LD/ST off. 11:1. */
+#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 /* Likewise; no check. */
+#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 /* TP-rel. LD/ST off. 11:2. */
+#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 /* Likewise; no check. */
+#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 /* TP-rel. LD/ST off. 11:3. */
+#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 /* Likewise; no check. */
+#define R_AARCH64_TLSDESC_LD_PREL19 560 /* PC-rel. load immediate 20:2. */
+#define R_AARCH64_TLSDESC_ADR_PREL21 561 /* PC-rel. ADR immediate 20:0. */
+#define R_AARCH64_TLSDESC_ADR_PAGE21 562 /* Page-rel. ADRP imm. 32:12. */
+#define R_AARCH64_TLSDESC_LD64_LO12 563 /* Direct LD off. from 11:3. */
+#define R_AARCH64_TLSDESC_ADD_LO12 564 /* Direct ADD imm. from 11:0. */
+#define R_AARCH64_TLSDESC_OFF_G1 565 /* GOT-rel. MOV{N,Z} imm. 31:16. */
+#define R_AARCH64_TLSDESC_OFF_G0_NC 566 /* GOT-rel. MOVK imm. 15:0; no ck. */
+#define R_AARCH64_TLSDESC_LDR 567 /* Relax LDR. */
+#define R_AARCH64_TLSDESC_ADD 568 /* Relax ADD. */
+#define R_AARCH64_TLSDESC_CALL 569 /* Relax BLR. */
+#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570 /* TP-rel. LD/ST off. 11:4. */
+#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571 /* Likewise; no check. */
+#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 /* DTP-rel. LD/ST imm. 11:4. */
+#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 573 /* Likewise; no check. */
+#define R_AARCH64_COPY 1024 /* Copy symbol at runtime. */
+#define R_AARCH64_GLOB_DAT 1025 /* Create GOT entry. */
+#define R_AARCH64_JUMP_SLOT 1026 /* Create PLT entry. */
+#define R_AARCH64_RELATIVE 1027 /* Adjust by program base. */
+#define R_AARCH64_TLS_DTPMOD 1028 /* Module number, 64 bit. */
+#define R_AARCH64_TLS_DTPREL 1029 /* Module-relative offset, 64 bit. */
+#define R_AARCH64_TLS_TPREL 1030 /* TP-relative offset, 64 bit. */
+#define R_AARCH64_TLSDESC 1031 /* TLS Descriptor. */
+#define R_AARCH64_IRELATIVE 1032 /* STT_GNU_IFUNC relocation. */
+
+/* ARM relocs. */
+
+#define R_ARM_NONE 0 /* No reloc */
+#define R_ARM_PC24 1 /* Deprecated PC relative 26
+ bit branch. */
+#define R_ARM_ABS32 2 /* Direct 32 bit */
+#define R_ARM_REL32 3 /* PC relative 32 bit */
+#define R_ARM_PC13 4
+#define R_ARM_ABS16 5 /* Direct 16 bit */
+#define R_ARM_ABS12 6 /* Direct 12 bit */
+#define R_ARM_THM_ABS5 7 /* Direct & 0x7C (LDR, STR). */
+#define R_ARM_ABS8 8 /* Direct 8 bit */
+#define R_ARM_SBREL32 9
+#define R_ARM_THM_PC22 10 /* PC relative 24 bit (Thumb32 BL). */
+#define R_ARM_THM_PC8 11 /* PC relative & 0x3FC
+ (Thumb16 LDR, ADD, ADR). */
+#define R_ARM_AMP_VCALL9 12
+#define R_ARM_SWI24 13 /* Obsolete static relocation. */
+#define R_ARM_TLS_DESC 13 /* Dynamic relocation. */
+#define R_ARM_THM_SWI8 14 /* Reserved. */
+#define R_ARM_XPC25 15 /* Reserved. */
+#define R_ARM_THM_XPC22 16 /* Reserved. */
+#define R_ARM_TLS_DTPMOD32 17 /* ID of module containing symbol */
+#define R_ARM_TLS_DTPOFF32 18 /* Offset in TLS block */
+#define R_ARM_TLS_TPOFF32 19 /* Offset in static TLS block */
+#define R_ARM_COPY 20 /* Copy symbol at runtime */
+#define R_ARM_GLOB_DAT 21 /* Create GOT entry */
+#define R_ARM_JUMP_SLOT 22 /* Create PLT entry */
+#define R_ARM_RELATIVE 23 /* Adjust by program base */
+#define R_ARM_GOTOFF 24 /* 32 bit offset to GOT */
+#define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */
+#define R_ARM_GOT32 26 /* 32 bit GOT entry */
+#define R_ARM_PLT32 27 /* Deprecated, 32 bit PLT address. */
+#define R_ARM_CALL 28 /* PC relative 24 bit (BL, BLX). */
+#define R_ARM_JUMP24 29 /* PC relative 24 bit
+ (B, BL). */
+#define R_ARM_THM_JUMP24 30 /* PC relative 24 bit (Thumb32 B.W). */
+#define R_ARM_BASE_ABS 31 /* Adjust by program base. */
+#define R_ARM_ALU_PCREL_7_0 32 /* Obsolete. */
+#define R_ARM_ALU_PCREL_15_8 33 /* Obsolete. */
+#define R_ARM_ALU_PCREL_23_15 34 /* Obsolete. */
+#define R_ARM_LDR_SBREL_11_0 35 /* Deprecated, prog. base relative. */
+#define R_ARM_ALU_SBREL_19_12 36 /* Deprecated, prog. base relative. */
+#define R_ARM_ALU_SBREL_27_20 37 /* Deprecated, prog. base relative. */
+#define R_ARM_TARGET1 38
+#define R_ARM_SBREL31 39 /* Program base relative. */
+#define R_ARM_V4BX 40
+#define R_ARM_TARGET2 41
+#define R_ARM_PREL31 42 /* 32 bit PC relative. */
+#define R_ARM_MOVW_ABS_NC 43 /* Direct 16-bit (MOVW). */
+#define R_ARM_MOVT_ABS 44 /* Direct high 16-bit (MOVT). */
+#define R_ARM_MOVW_PREL_NC 45 /* PC relative 16-bit (MOVW). */
+#define R_ARM_MOVT_PREL 46 /* PC relative (MOVT). */
+#define R_ARM_THM_MOVW_ABS_NC 47 /* Direct 16 bit (Thumb32 MOVW). */
+#define R_ARM_THM_MOVT_ABS 48 /* Direct high 16 bit
+ (Thumb32 MOVT). */
+#define R_ARM_THM_MOVW_PREL_NC 49 /* PC relative 16 bit
+ (Thumb32 MOVW). */
+#define R_ARM_THM_MOVT_PREL 50 /* PC relative high 16 bit
+ (Thumb32 MOVT). */
+#define R_ARM_THM_JUMP19 51 /* PC relative 20 bit
+ (Thumb32 B.W). */
+#define R_ARM_THM_JUMP6 52 /* PC relative X & 0x7E
+ (Thumb16 CBZ, CBNZ). */
+#define R_ARM_THM_ALU_PREL_11_0 53 /* PC relative 12 bit
+ (Thumb32 ADR.W). */
+#define R_ARM_THM_PC12 54 /* PC relative 12 bit
+ (Thumb32 LDR{D,SB,H,SH}). */
+#define R_ARM_ABS32_NOI 55 /* Direct 32-bit. */
+#define R_ARM_REL32_NOI 56 /* PC relative 32-bit. */
+#define R_ARM_ALU_PC_G0_NC 57 /* PC relative (ADD, SUB). */
+#define R_ARM_ALU_PC_G0 58 /* PC relative (ADD, SUB). */
+#define R_ARM_ALU_PC_G1_NC 59 /* PC relative (ADD, SUB). */
+#define R_ARM_ALU_PC_G1 60 /* PC relative (ADD, SUB). */
+#define R_ARM_ALU_PC_G2 61 /* PC relative (ADD, SUB). */
+#define R_ARM_LDR_PC_G1 62 /* PC relative (LDR,STR,LDRB,STRB). */
+#define R_ARM_LDR_PC_G2 63 /* PC relative (LDR,STR,LDRB,STRB). */
+#define R_ARM_LDRS_PC_G0 64 /* PC relative (STR{D,H},
+ LDR{D,SB,H,SH}). */
+#define R_ARM_LDRS_PC_G1 65 /* PC relative (STR{D,H},
+ LDR{D,SB,H,SH}). */
+#define R_ARM_LDRS_PC_G2 66 /* PC relative (STR{D,H},
+ LDR{D,SB,H,SH}). */
+#define R_ARM_LDC_PC_G0 67 /* PC relative (LDC, STC). */
+#define R_ARM_LDC_PC_G1 68 /* PC relative (LDC, STC). */
+#define R_ARM_LDC_PC_G2 69 /* PC relative (LDC, STC). */
+#define R_ARM_ALU_SB_G0_NC 70 /* Program base relative (ADD,SUB). */
+#define R_ARM_ALU_SB_G0 71 /* Program base relative (ADD,SUB). */
+#define R_ARM_ALU_SB_G1_NC 72 /* Program base relative (ADD,SUB). */
+#define R_ARM_ALU_SB_G1 73 /* Program base relative (ADD,SUB). */
+#define R_ARM_ALU_SB_G2 74 /* Program base relative (ADD,SUB). */
+#define R_ARM_LDR_SB_G0 75 /* Program base relative (LDR,
+ STR, LDRB, STRB). */
+#define R_ARM_LDR_SB_G1 76 /* Program base relative
+ (LDR, STR, LDRB, STRB). */
+#define R_ARM_LDR_SB_G2 77 /* Program base relative
+ (LDR, STR, LDRB, STRB). */
+#define R_ARM_LDRS_SB_G0 78 /* Program base relative
+ (LDR, STR, LDRB, STRB). */
+#define R_ARM_LDRS_SB_G1 79 /* Program base relative
+ (LDR, STR, LDRB, STRB). */
+#define R_ARM_LDRS_SB_G2 80 /* Program base relative
+ (LDR, STR, LDRB, STRB). */
+#define R_ARM_LDC_SB_G0 81 /* Program base relative (LDC,STC). */
+#define R_ARM_LDC_SB_G1 82 /* Program base relative (LDC,STC). */
+#define R_ARM_LDC_SB_G2 83 /* Program base relative (LDC,STC). */
+#define R_ARM_MOVW_BREL_NC 84 /* Program base relative 16
+ bit (MOVW). */
+#define R_ARM_MOVT_BREL 85 /* Program base relative high
+ 16 bit (MOVT). */
+#define R_ARM_MOVW_BREL 86 /* Program base relative 16
+ bit (MOVW). */
+#define R_ARM_THM_MOVW_BREL_NC 87 /* Program base relative 16
+ bit (Thumb32 MOVW). */
+#define R_ARM_THM_MOVT_BREL 88 /* Program base relative high
+ 16 bit (Thumb32 MOVT). */
+#define R_ARM_THM_MOVW_BREL 89 /* Program base relative 16
+ bit (Thumb32 MOVW). */
+#define R_ARM_TLS_GOTDESC 90
+#define R_ARM_TLS_CALL 91
+#define R_ARM_TLS_DESCSEQ 92 /* TLS relaxation. */
+#define R_ARM_THM_TLS_CALL 93
+#define R_ARM_PLT32_ABS 94
+#define R_ARM_GOT_ABS 95 /* GOT entry. */
+#define R_ARM_GOT_PREL 96 /* PC relative GOT entry. */
+#define R_ARM_GOT_BREL12 97 /* GOT entry relative to GOT
+ origin (LDR). */
+#define R_ARM_GOTOFF12 98 /* 12 bit, GOT entry relative
+ to GOT origin (LDR, STR). */
+#define R_ARM_GOTRELAX 99
+#define R_ARM_GNU_VTENTRY 100
+#define R_ARM_GNU_VTINHERIT 101
+#define R_ARM_THM_PC11 102 /* PC relative & 0xFFE (Thumb16 B). */
+#define R_ARM_THM_PC9 103 /* PC relative & 0x1FE
+ (Thumb16 B/B). */
+#define R_ARM_TLS_GD32 104 /* PC-rel 32 bit for global dynamic
+ thread local data */
+#define R_ARM_TLS_LDM32 105 /* PC-rel 32 bit for local dynamic
+ thread local data */
+#define R_ARM_TLS_LDO32 106 /* 32 bit offset relative to TLS
+ block */
+#define R_ARM_TLS_IE32 107 /* PC-rel 32 bit for GOT entry of
+ static TLS block offset */
+#define R_ARM_TLS_LE32 108 /* 32 bit offset relative to static
+ TLS block */
+#define R_ARM_TLS_LDO12 109 /* 12 bit relative to TLS
+ block (LDR, STR). */
+#define R_ARM_TLS_LE12 110 /* 12 bit relative to static
+ TLS block (LDR, STR). */
+#define R_ARM_TLS_IE12GP 111 /* 12 bit GOT entry relative
+ to GOT origin (LDR). */
+#define R_ARM_ME_TOO 128 /* Obsolete. */
+#define R_ARM_THM_TLS_DESCSEQ 129
+#define R_ARM_THM_TLS_DESCSEQ16 129
+#define R_ARM_THM_TLS_DESCSEQ32 130
+#define R_ARM_THM_GOT_BREL12 131 /* GOT entry relative to GOT
+ origin, 12 bit (Thumb32 LDR). */
+#define R_ARM_IRELATIVE 160
+#define R_ARM_RXPC25 249
+#define R_ARM_RSBREL32 250
+#define R_ARM_THM_RPC22 251
+#define R_ARM_RREL32 252
+#define R_ARM_RABS22 253
+#define R_ARM_RPC24 254
+#define R_ARM_RBASE 255
+/* Keep this the last entry. */
+#define R_ARM_NUM 256
+
+/* IA-64 specific declarations. */
+
+/* Processor specific flags for the Ehdr e_flags field. */
+#define EF_IA_64_MASKOS 0x0000000f /* os-specific flags */
+#define EF_IA_64_ABI64 0x00000010 /* 64-bit ABI */
+#define EF_IA_64_ARCH 0xff000000 /* arch. version mask */
+
+/* Processor specific values for the Phdr p_type field. */
+#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) /* arch extension bits */
+#define PT_IA_64_UNWIND (PT_LOPROC + 1) /* ia64 unwind bits */
+#define PT_IA_64_HP_OPT_ANOT (PT_LOOS + 0x12)
+#define PT_IA_64_HP_HSL_ANOT (PT_LOOS + 0x13)
+#define PT_IA_64_HP_STACK (PT_LOOS + 0x14)
+
+/* Processor specific flags for the Phdr p_flags field. */
+#define PF_IA_64_NORECOV 0x80000000 /* spec insns w/o recovery */
+
+/* Processor specific values for the Shdr sh_type field. */
+#define SHT_IA_64_EXT (SHT_LOPROC + 0) /* extension bits */
+#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) /* unwind bits */
+
+/* Processor specific flags for the Shdr sh_flags field. */
+#define SHF_IA_64_SHORT 0x10000000 /* section near gp */
+#define SHF_IA_64_NORECOV 0x20000000 /* spec insns w/o recovery */
+
+/* Processor specific values for the Dyn d_tag field. */
+#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0)
+#define DT_IA_64_NUM 1
+
+/* IA-64 relocations. */
+#define R_IA64_NONE 0x00 /* none */
+#define R_IA64_IMM14 0x21 /* symbol + addend, add imm14 */
+#define R_IA64_IMM22 0x22 /* symbol + addend, add imm22 */
+#define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */
+#define R_IA64_DIR32MSB 0x24 /* symbol + addend, data4 MSB */
+#define R_IA64_DIR32LSB 0x25 /* symbol + addend, data4 LSB */
+#define R_IA64_DIR64MSB 0x26 /* symbol + addend, data8 MSB */
+#define R_IA64_DIR64LSB 0x27 /* symbol + addend, data8 LSB */
+#define R_IA64_GPREL22 0x2a /* @gprel(sym + add), add imm22 */
+#define R_IA64_GPREL64I 0x2b /* @gprel(sym + add), mov imm64 */
+#define R_IA64_GPREL32MSB 0x2c /* @gprel(sym + add), data4 MSB */
+#define R_IA64_GPREL32LSB 0x2d /* @gprel(sym + add), data4 LSB */
+#define R_IA64_GPREL64MSB 0x2e /* @gprel(sym + add), data8 MSB */
+#define R_IA64_GPREL64LSB 0x2f /* @gprel(sym + add), data8 LSB */
+#define R_IA64_LTOFF22 0x32 /* @ltoff(sym + add), add imm22 */
+#define R_IA64_LTOFF64I 0x33 /* @ltoff(sym + add), mov imm64 */
+#define R_IA64_PLTOFF22 0x3a /* @pltoff(sym + add), add imm22 */
+#define R_IA64_PLTOFF64I 0x3b /* @pltoff(sym + add), mov imm64 */
+#define R_IA64_PLTOFF64MSB 0x3e /* @pltoff(sym + add), data8 MSB */
+#define R_IA64_PLTOFF64LSB 0x3f /* @pltoff(sym + add), data8 LSB */
+#define R_IA64_FPTR64I 0x43 /* @fptr(sym + add), mov imm64 */
+#define R_IA64_FPTR32MSB 0x44 /* @fptr(sym + add), data4 MSB */
+#define R_IA64_FPTR32LSB 0x45 /* @fptr(sym + add), data4 LSB */
+#define R_IA64_FPTR64MSB 0x46 /* @fptr(sym + add), data8 MSB */
+#define R_IA64_FPTR64LSB 0x47 /* @fptr(sym + add), data8 LSB */
+#define R_IA64_PCREL60B 0x48 /* @pcrel(sym + add), brl */
+#define R_IA64_PCREL21B 0x49 /* @pcrel(sym + add), ptb, call */
+#define R_IA64_PCREL21M 0x4a /* @pcrel(sym + add), chk.s */
+#define R_IA64_PCREL21F 0x4b /* @pcrel(sym + add), fchkf */
+#define R_IA64_PCREL32MSB 0x4c /* @pcrel(sym + add), data4 MSB */
+#define R_IA64_PCREL32LSB 0x4d /* @pcrel(sym + add), data4 LSB */
+#define R_IA64_PCREL64MSB 0x4e /* @pcrel(sym + add), data8 MSB */
+#define R_IA64_PCREL64LSB 0x4f /* @pcrel(sym + add), data8 LSB */
+#define R_IA64_LTOFF_FPTR22 0x52 /* @ltoff(@fptr(s+a)), imm22 */
+#define R_IA64_LTOFF_FPTR64I 0x53 /* @ltoff(@fptr(s+a)), imm64 */
+#define R_IA64_LTOFF_FPTR32MSB 0x54 /* @ltoff(@fptr(s+a)), data4 MSB */
+#define R_IA64_LTOFF_FPTR32LSB 0x55 /* @ltoff(@fptr(s+a)), data4 LSB */
+#define R_IA64_LTOFF_FPTR64MSB 0x56 /* @ltoff(@fptr(s+a)), data8 MSB */
+#define R_IA64_LTOFF_FPTR64LSB 0x57 /* @ltoff(@fptr(s+a)), data8 LSB */
+#define R_IA64_SEGREL32MSB 0x5c /* @segrel(sym + add), data4 MSB */
+#define R_IA64_SEGREL32LSB 0x5d /* @segrel(sym + add), data4 LSB */
+#define R_IA64_SEGREL64MSB 0x5e /* @segrel(sym + add), data8 MSB */
+#define R_IA64_SEGREL64LSB 0x5f /* @segrel(sym + add), data8 LSB */
+#define R_IA64_SECREL32MSB 0x64 /* @secrel(sym + add), data4 MSB */
+#define R_IA64_SECREL32LSB 0x65 /* @secrel(sym + add), data4 LSB */
+#define R_IA64_SECREL64MSB 0x66 /* @secrel(sym + add), data8 MSB */
+#define R_IA64_SECREL64LSB 0x67 /* @secrel(sym + add), data8 LSB */
+#define R_IA64_REL32MSB 0x6c /* data 4 + REL */
+#define R_IA64_REL32LSB 0x6d /* data 4 + REL */
+#define R_IA64_REL64MSB 0x6e /* data 8 + REL */
+#define R_IA64_REL64LSB 0x6f /* data 8 + REL */
+#define R_IA64_LTV32MSB 0x74 /* symbol + addend, data4 MSB */
+#define R_IA64_LTV32LSB 0x75 /* symbol + addend, data4 LSB */
+#define R_IA64_LTV64MSB 0x76 /* symbol + addend, data8 MSB */
+#define R_IA64_LTV64LSB 0x77 /* symbol + addend, data8 LSB */
+#define R_IA64_PCREL21BI 0x79 /* @pcrel(sym + add), 21bit inst */
+#define R_IA64_PCREL22 0x7a /* @pcrel(sym + add), 22bit inst */
+#define R_IA64_PCREL64I 0x7b /* @pcrel(sym + add), 64bit inst */
+#define R_IA64_IPLTMSB 0x80 /* dynamic reloc, imported PLT, MSB */
+#define R_IA64_IPLTLSB 0x81 /* dynamic reloc, imported PLT, LSB */
+#define R_IA64_COPY 0x84 /* copy relocation */
+#define R_IA64_SUB 0x85 /* Addend and symbol difference */
+#define R_IA64_LTOFF22X 0x86 /* LTOFF22, relaxable. */
+#define R_IA64_LDXMOV 0x87 /* Use of LTOFF22X. */
+#define R_IA64_TPREL14 0x91 /* @tprel(sym + add), imm14 */
+#define R_IA64_TPREL22 0x92 /* @tprel(sym + add), imm22 */
+#define R_IA64_TPREL64I 0x93 /* @tprel(sym + add), imm64 */
+#define R_IA64_TPREL64MSB 0x96 /* @tprel(sym + add), data8 MSB */
+#define R_IA64_TPREL64LSB 0x97 /* @tprel(sym + add), data8 LSB */
+#define R_IA64_LTOFF_TPREL22 0x9a /* @ltoff(@tprel(s+a)), imm2 */
+#define R_IA64_DTPMOD64MSB 0xa6 /* @dtpmod(sym + add), data8 MSB */
+#define R_IA64_DTPMOD64LSB 0xa7 /* @dtpmod(sym + add), data8 LSB */
+#define R_IA64_LTOFF_DTPMOD22 0xaa /* @ltoff(@dtpmod(sym + add)), imm22 */
+#define R_IA64_DTPREL14 0xb1 /* @dtprel(sym + add), imm14 */
+#define R_IA64_DTPREL22 0xb2 /* @dtprel(sym + add), imm22 */
+#define R_IA64_DTPREL64I 0xb3 /* @dtprel(sym + add), imm64 */
+#define R_IA64_DTPREL32MSB 0xb4 /* @dtprel(sym + add), data4 MSB */
+#define R_IA64_DTPREL32LSB 0xb5 /* @dtprel(sym + add), data4 LSB */
+#define R_IA64_DTPREL64MSB 0xb6 /* @dtprel(sym + add), data8 MSB */
+#define R_IA64_DTPREL64LSB 0xb7 /* @dtprel(sym + add), data8 LSB */
+#define R_IA64_LTOFF_DTPREL22 0xba /* @ltoff(@dtprel(s+a)), imm22 */
+
+/* SH specific declarations */
+
+/* Processor specific flags for the ELF header e_flags field. */
+#define EF_SH_MACH_MASK 0x1f
+#define EF_SH_UNKNOWN 0x0
+#define EF_SH1 0x1
+#define EF_SH2 0x2
+#define EF_SH3 0x3
+#define EF_SH_DSP 0x4
+#define EF_SH3_DSP 0x5
+#define EF_SH4AL_DSP 0x6
+#define EF_SH3E 0x8
+#define EF_SH4 0x9
+#define EF_SH2E 0xb
+#define EF_SH4A 0xc
+#define EF_SH2A 0xd
+#define EF_SH4_NOFPU 0x10
+#define EF_SH4A_NOFPU 0x11
+#define EF_SH4_NOMMU_NOFPU 0x12
+#define EF_SH2A_NOFPU 0x13
+#define EF_SH3_NOMMU 0x14
+#define EF_SH2A_SH4_NOFPU 0x15
+#define EF_SH2A_SH3_NOFPU 0x16
+#define EF_SH2A_SH4 0x17
+#define EF_SH2A_SH3E 0x18
+
+/* SH relocs. */
+#define R_SH_NONE 0
+#define R_SH_DIR32 1
+#define R_SH_REL32 2
+#define R_SH_DIR8WPN 3
+#define R_SH_IND12W 4
+#define R_SH_DIR8WPL 5
+#define R_SH_DIR8WPZ 6
+#define R_SH_DIR8BP 7
+#define R_SH_DIR8W 8
+#define R_SH_DIR8L 9
+#define R_SH_SWITCH16 25
+#define R_SH_SWITCH32 26
+#define R_SH_USES 27
+#define R_SH_COUNT 28
+#define R_SH_ALIGN 29
+#define R_SH_CODE 30
+#define R_SH_DATA 31
+#define R_SH_LABEL 32
+#define R_SH_SWITCH8 33
+#define R_SH_GNU_VTINHERIT 34
+#define R_SH_GNU_VTENTRY 35
+#define R_SH_TLS_GD_32 144
+#define R_SH_TLS_LD_32 145
+#define R_SH_TLS_LDO_32 146
+#define R_SH_TLS_IE_32 147
+#define R_SH_TLS_LE_32 148
+#define R_SH_TLS_DTPMOD32 149
+#define R_SH_TLS_DTPOFF32 150
+#define R_SH_TLS_TPOFF32 151
+#define R_SH_GOT32 160
+#define R_SH_PLT32 161
+#define R_SH_COPY 162
+#define R_SH_GLOB_DAT 163
+#define R_SH_JMP_SLOT 164
+#define R_SH_RELATIVE 165
+#define R_SH_GOTOFF 166
+#define R_SH_GOTPC 167
+/* Keep this the last entry. */
+#define R_SH_NUM 256
+
+/* S/390 specific definitions. */
+
+/* Valid values for the e_flags field. */
+
+#define EF_S390_HIGH_GPRS 0x00000001 /* High GPRs kernel facility needed. */
+
+/* Additional s390 relocs */
+
+#define R_390_NONE 0 /* No reloc. */
+#define R_390_8 1 /* Direct 8 bit. */
+#define R_390_12 2 /* Direct 12 bit. */
+#define R_390_16 3 /* Direct 16 bit. */
+#define R_390_32 4 /* Direct 32 bit. */
+#define R_390_PC32 5 /* PC relative 32 bit. */
+#define R_390_GOT12 6 /* 12 bit GOT offset. */
+#define R_390_GOT32 7 /* 32 bit GOT offset. */
+#define R_390_PLT32 8 /* 32 bit PC relative PLT address. */
+#define R_390_COPY 9 /* Copy symbol at runtime. */
+#define R_390_GLOB_DAT 10 /* Create GOT entry. */
+#define R_390_JMP_SLOT 11 /* Create PLT entry. */
+#define R_390_RELATIVE 12 /* Adjust by program base. */
+#define R_390_GOTOFF32 13 /* 32 bit offset to GOT. */
+#define R_390_GOTPC 14 /* 32 bit PC relative offset to GOT. */
+#define R_390_GOT16 15 /* 16 bit GOT offset. */
+#define R_390_PC16 16 /* PC relative 16 bit. */
+#define R_390_PC16DBL 17 /* PC relative 16 bit shifted by 1. */
+#define R_390_PLT16DBL 18 /* 16 bit PC rel. PLT shifted by 1. */
+#define R_390_PC32DBL 19 /* PC relative 32 bit shifted by 1. */
+#define R_390_PLT32DBL 20 /* 32 bit PC rel. PLT shifted by 1. */
+#define R_390_GOTPCDBL 21 /* 32 bit PC rel. GOT shifted by 1. */
+#define R_390_64 22 /* Direct 64 bit. */
+#define R_390_PC64 23 /* PC relative 64 bit. */
+#define R_390_GOT64 24 /* 64 bit GOT offset. */
+#define R_390_PLT64 25 /* 64 bit PC relative PLT address. */
+#define R_390_GOTENT 26 /* 32 bit PC rel. to GOT entry >> 1. */
+#define R_390_GOTOFF16 27 /* 16 bit offset to GOT. */
+#define R_390_GOTOFF64 28 /* 64 bit offset to GOT. */
+#define R_390_GOTPLT12 29 /* 12 bit offset to jump slot. */
+#define R_390_GOTPLT16 30 /* 16 bit offset to jump slot. */
+#define R_390_GOTPLT32 31 /* 32 bit offset to jump slot. */
+#define R_390_GOTPLT64 32 /* 64 bit offset to jump slot. */
+#define R_390_GOTPLTENT 33 /* 32 bit rel. offset to jump slot. */
+#define R_390_PLTOFF16 34 /* 16 bit offset from GOT to PLT. */
+#define R_390_PLTOFF32 35 /* 32 bit offset from GOT to PLT. */
+#define R_390_PLTOFF64 36 /* 16 bit offset from GOT to PLT. */
+#define R_390_TLS_LOAD 37 /* Tag for load insn in TLS code. */
+#define R_390_TLS_GDCALL 38 /* Tag for function call in general
+ dynamic TLS code. */
+#define R_390_TLS_LDCALL 39 /* Tag for function call in local
+ dynamic TLS code. */
+#define R_390_TLS_GD32 40 /* Direct 32 bit for general dynamic
+ thread local data. */
+#define R_390_TLS_GD64 41 /* Direct 64 bit for general dynamic
+ thread local data. */
+#define R_390_TLS_GOTIE12 42 /* 12 bit GOT offset for static TLS
+ block offset. */
+#define R_390_TLS_GOTIE32 43 /* 32 bit GOT offset for static TLS
+ block offset. */
+#define R_390_TLS_GOTIE64 44 /* 64 bit GOT offset for static TLS
+ block offset. */
+#define R_390_TLS_LDM32 45 /* Direct 32 bit for local dynamic
+ thread local data in LE code. */
+#define R_390_TLS_LDM64 46 /* Direct 64 bit for local dynamic
+ thread local data in LE code. */
+#define R_390_TLS_IE32 47 /* 32 bit address of GOT entry for
+ negated static TLS block offset. */
+#define R_390_TLS_IE64 48 /* 64 bit address of GOT entry for
+ negated static TLS block offset. */
+#define R_390_TLS_IEENT 49 /* 32 bit rel. offset to GOT entry for
+ negated static TLS block offset. */
+#define R_390_TLS_LE32 50 /* 32 bit negated offset relative to
+ static TLS block. */
+#define R_390_TLS_LE64 51 /* 64 bit negated offset relative to
+ static TLS block. */
+#define R_390_TLS_LDO32 52 /* 32 bit offset relative to TLS
+ block. */
+#define R_390_TLS_LDO64 53 /* 64 bit offset relative to TLS
+ block. */
+#define R_390_TLS_DTPMOD 54 /* ID of module containing symbol. */
+#define R_390_TLS_DTPOFF 55 /* Offset in TLS block. */
+#define R_390_TLS_TPOFF 56 /* Negated offset in static TLS
+ block. */
+#define R_390_20 57 /* Direct 20 bit. */
+#define R_390_GOT20 58 /* 20 bit GOT offset. */
+#define R_390_GOTPLT20 59 /* 20 bit offset to jump slot. */
+#define R_390_TLS_GOTIE20 60 /* 20 bit GOT offset for static TLS
+ block offset. */
+#define R_390_IRELATIVE 61 /* STT_GNU_IFUNC relocation. */
+/* Keep this the last entry. */
+#define R_390_NUM 62
+
+
+/* CRIS relocations. */
+#define R_CRIS_NONE 0
+#define R_CRIS_8 1
+#define R_CRIS_16 2
+#define R_CRIS_32 3
+#define R_CRIS_8_PCREL 4
+#define R_CRIS_16_PCREL 5
+#define R_CRIS_32_PCREL 6
+#define R_CRIS_GNU_VTINHERIT 7
+#define R_CRIS_GNU_VTENTRY 8
+#define R_CRIS_COPY 9
+#define R_CRIS_GLOB_DAT 10
+#define R_CRIS_JUMP_SLOT 11
+#define R_CRIS_RELATIVE 12
+#define R_CRIS_16_GOT 13
+#define R_CRIS_32_GOT 14
+#define R_CRIS_16_GOTPLT 15
+#define R_CRIS_32_GOTPLT 16
+#define R_CRIS_32_GOTREL 17
+#define R_CRIS_32_PLT_GOTREL 18
+#define R_CRIS_32_PLT_PCREL 19
+
+#define R_CRIS_NUM 20
+
+
+/* AMD x86-64 relocations. */
+#define R_X86_64_NONE 0 /* No reloc */
+#define R_X86_64_64 1 /* Direct 64 bit */
+#define R_X86_64_PC32 2 /* PC relative 32 bit signed */
+#define R_X86_64_GOT32 3 /* 32 bit GOT entry */
+#define R_X86_64_PLT32 4 /* 32 bit PLT address */
+#define R_X86_64_COPY 5 /* Copy symbol at runtime */
+#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */
+#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */
+#define R_X86_64_RELATIVE 8 /* Adjust by program base */
+#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative
+ offset to GOT */
+#define R_X86_64_32 10 /* Direct 32 bit zero extended */
+#define R_X86_64_32S 11 /* Direct 32 bit sign extended */
+#define R_X86_64_16 12 /* Direct 16 bit zero extended */
+#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */
+#define R_X86_64_8 14 /* Direct 8 bit sign extended */
+#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */
+#define R_X86_64_DTPMOD64 16 /* ID of module containing symbol */
+#define R_X86_64_DTPOFF64 17 /* Offset in module's TLS block */
+#define R_X86_64_TPOFF64 18 /* Offset in initial TLS block */
+#define R_X86_64_TLSGD 19 /* 32 bit signed PC relative offset
+ to two GOT entries for GD symbol */
+#define R_X86_64_TLSLD 20 /* 32 bit signed PC relative offset
+ to two GOT entries for LD symbol */
+#define R_X86_64_DTPOFF32 21 /* Offset in TLS block */
+#define R_X86_64_GOTTPOFF 22 /* 32 bit signed PC relative offset
+ to GOT entry for IE symbol */
+#define R_X86_64_TPOFF32 23 /* Offset in initial TLS block */
+#define R_X86_64_PC64 24 /* PC relative 64 bit */
+#define R_X86_64_GOTOFF64 25 /* 64 bit offset to GOT */
+#define R_X86_64_GOTPC32 26 /* 32 bit signed pc relative
+ offset to GOT */
+#define R_X86_64_GOT64 27 /* 64-bit GOT entry offset */
+#define R_X86_64_GOTPCREL64 28 /* 64-bit PC relative offset
+ to GOT entry */
+#define R_X86_64_GOTPC64 29 /* 64-bit PC relative offset to GOT */
+#define R_X86_64_GOTPLT64 30 /* like GOT64, says PLT entry needed */
+#define R_X86_64_PLTOFF64 31 /* 64-bit GOT relative offset
+ to PLT entry */
+#define R_X86_64_SIZE32 32 /* Size of symbol plus 32-bit addend */
+#define R_X86_64_SIZE64 33 /* Size of symbol plus 64-bit addend */
+#define R_X86_64_GOTPC32_TLSDESC 34 /* GOT offset for TLS descriptor. */
+#define R_X86_64_TLSDESC_CALL 35 /* Marker for call through TLS
+ descriptor. */
+#define R_X86_64_TLSDESC 36 /* TLS descriptor. */
+#define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base */
+#define R_X86_64_RELATIVE64 38 /* 64-bit adjust by program base */
+
+#define R_X86_64_NUM 39
+
+
+/* AM33 relocations. */
+#define R_MN10300_NONE 0 /* No reloc. */
+#define R_MN10300_32 1 /* Direct 32 bit. */
+#define R_MN10300_16 2 /* Direct 16 bit. */
+#define R_MN10300_8 3 /* Direct 8 bit. */
+#define R_MN10300_PCREL32 4 /* PC-relative 32-bit. */
+#define R_MN10300_PCREL16 5 /* PC-relative 16-bit signed. */
+#define R_MN10300_PCREL8 6 /* PC-relative 8-bit signed. */
+#define R_MN10300_GNU_VTINHERIT 7 /* Ancient C++ vtable garbage... */
+#define R_MN10300_GNU_VTENTRY 8 /* ... collection annotation. */
+#define R_MN10300_24 9 /* Direct 24 bit. */
+#define R_MN10300_GOTPC32 10 /* 32-bit PCrel offset to GOT. */
+#define R_MN10300_GOTPC16 11 /* 16-bit PCrel offset to GOT. */
+#define R_MN10300_GOTOFF32 12 /* 32-bit offset from GOT. */
+#define R_MN10300_GOTOFF24 13 /* 24-bit offset from GOT. */
+#define R_MN10300_GOTOFF16 14 /* 16-bit offset from GOT. */
+#define R_MN10300_PLT32 15 /* 32-bit PCrel to PLT entry. */
+#define R_MN10300_PLT16 16 /* 16-bit PCrel to PLT entry. */
+#define R_MN10300_GOT32 17 /* 32-bit offset to GOT entry. */
+#define R_MN10300_GOT24 18 /* 24-bit offset to GOT entry. */
+#define R_MN10300_GOT16 19 /* 16-bit offset to GOT entry. */
+#define R_MN10300_COPY 20 /* Copy symbol at runtime. */
+#define R_MN10300_GLOB_DAT 21 /* Create GOT entry. */
+#define R_MN10300_JMP_SLOT 22 /* Create PLT entry. */
+#define R_MN10300_RELATIVE 23 /* Adjust by program base. */
+#define R_MN10300_TLS_GD 24 /* 32-bit offset for global dynamic. */
+#define R_MN10300_TLS_LD 25 /* 32-bit offset for local dynamic. */
+#define R_MN10300_TLS_LDO 26 /* Module-relative offset. */
+#define R_MN10300_TLS_GOTIE 27 /* GOT offset for static TLS block
+ offset. */
+#define R_MN10300_TLS_IE 28 /* GOT address for static TLS block
+ offset. */
+#define R_MN10300_TLS_LE 29 /* Offset relative to static TLS
+ block. */
+#define R_MN10300_TLS_DTPMOD 30 /* ID of module containing symbol. */
+#define R_MN10300_TLS_DTPOFF 31 /* Offset in module TLS block. */
+#define R_MN10300_TLS_TPOFF 32 /* Offset in static TLS block. */
+#define R_MN10300_SYM_DIFF 33 /* Adjustment for next reloc as needed
+ by linker relaxation. */
+#define R_MN10300_ALIGN 34 /* Alignment requirement for linker
+ relaxation. */
+#define R_MN10300_NUM 35
+
+
+/* M32R relocs. */
+#define R_M32R_NONE 0 /* No reloc. */
+#define R_M32R_16 1 /* Direct 16 bit. */
+#define R_M32R_32 2 /* Direct 32 bit. */
+#define R_M32R_24 3 /* Direct 24 bit. */
+#define R_M32R_10_PCREL 4 /* PC relative 10 bit shifted. */
+#define R_M32R_18_PCREL 5 /* PC relative 18 bit shifted. */
+#define R_M32R_26_PCREL 6 /* PC relative 26 bit shifted. */
+#define R_M32R_HI16_ULO 7 /* High 16 bit with unsigned low. */
+#define R_M32R_HI16_SLO 8 /* High 16 bit with signed low. */
+#define R_M32R_LO16 9 /* Low 16 bit. */
+#define R_M32R_SDA16 10 /* 16 bit offset in SDA. */
+#define R_M32R_GNU_VTINHERIT 11
+#define R_M32R_GNU_VTENTRY 12
+/* M32R relocs use SHT_RELA. */
+#define R_M32R_16_RELA 33 /* Direct 16 bit. */
+#define R_M32R_32_RELA 34 /* Direct 32 bit. */
+#define R_M32R_24_RELA 35 /* Direct 24 bit. */
+#define R_M32R_10_PCREL_RELA 36 /* PC relative 10 bit shifted. */
+#define R_M32R_18_PCREL_RELA 37 /* PC relative 18 bit shifted. */
+#define R_M32R_26_PCREL_RELA 38 /* PC relative 26 bit shifted. */
+#define R_M32R_HI16_ULO_RELA 39 /* High 16 bit with unsigned low */
+#define R_M32R_HI16_SLO_RELA 40 /* High 16 bit with signed low */
+#define R_M32R_LO16_RELA 41 /* Low 16 bit */
+#define R_M32R_SDA16_RELA 42 /* 16 bit offset in SDA */
+#define R_M32R_RELA_GNU_VTINHERIT 43
+#define R_M32R_RELA_GNU_VTENTRY 44
+#define R_M32R_REL32 45 /* PC relative 32 bit. */
+
+#define R_M32R_GOT24 48 /* 24 bit GOT entry */
+#define R_M32R_26_PLTREL 49 /* 26 bit PC relative to PLT shifted */
+#define R_M32R_COPY 50 /* Copy symbol at runtime */
+#define R_M32R_GLOB_DAT 51 /* Create GOT entry */
+#define R_M32R_JMP_SLOT 52 /* Create PLT entry */
+#define R_M32R_RELATIVE 53 /* Adjust by program base */
+#define R_M32R_GOTOFF 54 /* 24 bit offset to GOT */
+#define R_M32R_GOTPC24 55 /* 24 bit PC relative offset to GOT */
+#define R_M32R_GOT16_HI_ULO 56 /* High 16 bit GOT entry with unsigned
+ low */
+#define R_M32R_GOT16_HI_SLO 57 /* High 16 bit GOT entry with signed
+ low */
+#define R_M32R_GOT16_LO 58 /* Low 16 bit GOT entry */
+#define R_M32R_GOTPC_HI_ULO 59 /* High 16 bit PC relative offset to
+ GOT with unsigned low */
+#define R_M32R_GOTPC_HI_SLO 60 /* High 16 bit PC relative offset to
+ GOT with signed low */
+#define R_M32R_GOTPC_LO 61 /* Low 16 bit PC relative offset to
+ GOT */
+#define R_M32R_GOTOFF_HI_ULO 62 /* High 16 bit offset to GOT
+ with unsigned low */
+#define R_M32R_GOTOFF_HI_SLO 63 /* High 16 bit offset to GOT
+ with signed low */
+#define R_M32R_GOTOFF_LO 64 /* Low 16 bit offset to GOT */
+#define R_M32R_NUM 256 /* Keep this the last entry. */
+
+/* MicroBlaze relocations */
+#define R_MICROBLAZE_NONE 0 /* No reloc. */
+#define R_MICROBLAZE_32 1 /* Direct 32 bit. */
+#define R_MICROBLAZE_32_PCREL 2 /* PC relative 32 bit. */
+#define R_MICROBLAZE_64_PCREL 3 /* PC relative 64 bit. */
+#define R_MICROBLAZE_32_PCREL_LO 4 /* Low 16 bits of PCREL32. */
+#define R_MICROBLAZE_64 5 /* Direct 64 bit. */
+#define R_MICROBLAZE_32_LO 6 /* Low 16 bit. */
+#define R_MICROBLAZE_SRO32 7 /* Read-only small data area. */
+#define R_MICROBLAZE_SRW32 8 /* Read-write small data area. */
+#define R_MICROBLAZE_64_NONE 9 /* No reloc. */
+#define R_MICROBLAZE_32_SYM_OP_SYM 10 /* Symbol Op Symbol relocation. */
+#define R_MICROBLAZE_GNU_VTINHERIT 11 /* GNU C++ vtable hierarchy. */
+#define R_MICROBLAZE_GNU_VTENTRY 12 /* GNU C++ vtable member usage. */
+#define R_MICROBLAZE_GOTPC_64 13 /* PC-relative GOT offset. */
+#define R_MICROBLAZE_GOT_64 14 /* GOT entry offset. */
+#define R_MICROBLAZE_PLT_64 15 /* PLT offset (PC-relative). */
+#define R_MICROBLAZE_REL 16 /* Adjust by program base. */
+#define R_MICROBLAZE_JUMP_SLOT 17 /* Create PLT entry. */
+#define R_MICROBLAZE_GLOB_DAT 18 /* Create GOT entry. */
+#define R_MICROBLAZE_GOTOFF_64 19 /* 64 bit offset to GOT. */
+#define R_MICROBLAZE_GOTOFF_32 20 /* 32 bit offset to GOT. */
+#define R_MICROBLAZE_COPY 21 /* Runtime copy. */
+#define R_MICROBLAZE_TLS 22 /* TLS Reloc. */
+#define R_MICROBLAZE_TLSGD 23 /* TLS General Dynamic. */
+#define R_MICROBLAZE_TLSLD 24 /* TLS Local Dynamic. */
+#define R_MICROBLAZE_TLSDTPMOD32 25 /* TLS Module ID. */
+#define R_MICROBLAZE_TLSDTPREL32 26 /* TLS Offset Within TLS Block. */
+#define R_MICROBLAZE_TLSDTPREL64 27 /* TLS Offset Within TLS Block. */
+#define R_MICROBLAZE_TLSGOTTPREL32 28 /* TLS Offset From Thread Pointer. */
+#define R_MICROBLAZE_TLSTPREL32 29 /* TLS Offset From Thread Pointer. */
+
+/* Legal values for d_tag (dynamic entry type). */
+#define DT_NIOS2_GP 0x70000002 /* Address of _gp. */
+
+/* Nios II relocations. */
+#define R_NIOS2_NONE 0 /* No reloc. */
+#define R_NIOS2_S16 1 /* Direct signed 16 bit. */
+#define R_NIOS2_U16 2 /* Direct unsigned 16 bit. */
+#define R_NIOS2_PCREL16 3 /* PC relative 16 bit. */
+#define R_NIOS2_CALL26 4 /* Direct call. */
+#define R_NIOS2_IMM5 5 /* 5 bit constant expression. */
+#define R_NIOS2_CACHE_OPX 6 /* 5 bit expression, shift 22. */
+#define R_NIOS2_IMM6 7 /* 6 bit constant expression. */
+#define R_NIOS2_IMM8 8 /* 8 bit constant expression. */
+#define R_NIOS2_HI16 9 /* High 16 bit. */
+#define R_NIOS2_LO16 10 /* Low 16 bit. */
+#define R_NIOS2_HIADJ16 11 /* High 16 bit, adjusted. */
+#define R_NIOS2_BFD_RELOC_32 12 /* 32 bit symbol value + addend. */
+#define R_NIOS2_BFD_RELOC_16 13 /* 16 bit symbol value + addend. */
+#define R_NIOS2_BFD_RELOC_8 14 /* 8 bit symbol value + addend. */
+#define R_NIOS2_GPREL 15 /* 16 bit GP pointer offset. */
+#define R_NIOS2_GNU_VTINHERIT 16 /* GNU C++ vtable hierarchy. */
+#define R_NIOS2_GNU_VTENTRY 17 /* GNU C++ vtable member usage. */
+#define R_NIOS2_UJMP 18 /* Unconditional branch. */
+#define R_NIOS2_CJMP 19 /* Conditional branch. */
+#define R_NIOS2_CALLR 20 /* Indirect call through register. */
+#define R_NIOS2_ALIGN 21 /* Alignment requirement for
+ linker relaxation. */
+#define R_NIOS2_GOT16 22 /* 16 bit GOT entry. */
+#define R_NIOS2_CALL16 23 /* 16 bit GOT entry for function. */
+#define R_NIOS2_GOTOFF_LO 24 /* %lo of offset to GOT pointer. */
+#define R_NIOS2_GOTOFF_HA 25 /* %hiadj of offset to GOT pointer. */
+#define R_NIOS2_PCREL_LO 26 /* %lo of PC relative offset. */
+#define R_NIOS2_PCREL_HA 27 /* %hiadj of PC relative offset. */
+#define R_NIOS2_TLS_GD16 28 /* 16 bit GOT offset for TLS GD. */
+#define R_NIOS2_TLS_LDM16 29 /* 16 bit GOT offset for TLS LDM. */
+#define R_NIOS2_TLS_LDO16 30 /* 16 bit module relative offset. */
+#define R_NIOS2_TLS_IE16 31 /* 16 bit GOT offset for TLS IE. */
+#define R_NIOS2_TLS_LE16 32 /* 16 bit LE TP-relative offset. */
+#define R_NIOS2_TLS_DTPMOD 33 /* Module number. */
+#define R_NIOS2_TLS_DTPREL 34 /* Module-relative offset. */
+#define R_NIOS2_TLS_TPREL 35 /* TP-relative offset. */
+#define R_NIOS2_COPY 36 /* Copy symbol at runtime. */
+#define R_NIOS2_GLOB_DAT 37 /* Create GOT entry. */
+#define R_NIOS2_JUMP_SLOT 38 /* Create PLT entry. */
+#define R_NIOS2_RELATIVE 39 /* Adjust by program base. */
+#define R_NIOS2_GOTOFF 40 /* 16 bit offset to GOT pointer. */
+#define R_NIOS2_CALL26_NOAT 41 /* Direct call in .noat section. */
+#define R_NIOS2_GOT_LO 42 /* %lo() of GOT entry. */
+#define R_NIOS2_GOT_HA 43 /* %hiadj() of GOT entry. */
+#define R_NIOS2_CALL_LO 44 /* %lo() of function GOT entry. */
+#define R_NIOS2_CALL_HA 45 /* %hiadj() of function GOT entry. */
+
+/* TILEPro relocations. */
+#define R_TILEPRO_NONE 0 /* No reloc */
+#define R_TILEPRO_32 1 /* Direct 32 bit */
+#define R_TILEPRO_16 2 /* Direct 16 bit */
+#define R_TILEPRO_8 3 /* Direct 8 bit */
+#define R_TILEPRO_32_PCREL 4 /* PC relative 32 bit */
+#define R_TILEPRO_16_PCREL 5 /* PC relative 16 bit */
+#define R_TILEPRO_8_PCREL 6 /* PC relative 8 bit */
+#define R_TILEPRO_LO16 7 /* Low 16 bit */
+#define R_TILEPRO_HI16 8 /* High 16 bit */
+#define R_TILEPRO_HA16 9 /* High 16 bit, adjusted */
+#define R_TILEPRO_COPY 10 /* Copy relocation */
+#define R_TILEPRO_GLOB_DAT 11 /* Create GOT entry */
+#define R_TILEPRO_JMP_SLOT 12 /* Create PLT entry */
+#define R_TILEPRO_RELATIVE 13 /* Adjust by program base */
+#define R_TILEPRO_BROFF_X1 14 /* X1 pipe branch offset */
+#define R_TILEPRO_JOFFLONG_X1 15 /* X1 pipe jump offset */
+#define R_TILEPRO_JOFFLONG_X1_PLT 16 /* X1 pipe jump offset to PLT */
+#define R_TILEPRO_IMM8_X0 17 /* X0 pipe 8-bit */
+#define R_TILEPRO_IMM8_Y0 18 /* Y0 pipe 8-bit */
+#define R_TILEPRO_IMM8_X1 19 /* X1 pipe 8-bit */
+#define R_TILEPRO_IMM8_Y1 20 /* Y1 pipe 8-bit */
+#define R_TILEPRO_MT_IMM15_X1 21 /* X1 pipe mtspr */
+#define R_TILEPRO_MF_IMM15_X1 22 /* X1 pipe mfspr */
+#define R_TILEPRO_IMM16_X0 23 /* X0 pipe 16-bit */
+#define R_TILEPRO_IMM16_X1 24 /* X1 pipe 16-bit */
+#define R_TILEPRO_IMM16_X0_LO 25 /* X0 pipe low 16-bit */
+#define R_TILEPRO_IMM16_X1_LO 26 /* X1 pipe low 16-bit */
+#define R_TILEPRO_IMM16_X0_HI 27 /* X0 pipe high 16-bit */
+#define R_TILEPRO_IMM16_X1_HI 28 /* X1 pipe high 16-bit */
+#define R_TILEPRO_IMM16_X0_HA 29 /* X0 pipe high 16-bit, adjusted */
+#define R_TILEPRO_IMM16_X1_HA 30 /* X1 pipe high 16-bit, adjusted */
+#define R_TILEPRO_IMM16_X0_PCREL 31 /* X0 pipe PC relative 16 bit */
+#define R_TILEPRO_IMM16_X1_PCREL 32 /* X1 pipe PC relative 16 bit */
+#define R_TILEPRO_IMM16_X0_LO_PCREL 33 /* X0 pipe PC relative low 16 bit */
+#define R_TILEPRO_IMM16_X1_LO_PCREL 34 /* X1 pipe PC relative low 16 bit */
+#define R_TILEPRO_IMM16_X0_HI_PCREL 35 /* X0 pipe PC relative high 16 bit */
+#define R_TILEPRO_IMM16_X1_HI_PCREL 36 /* X1 pipe PC relative high 16 bit */
+#define R_TILEPRO_IMM16_X0_HA_PCREL 37 /* X0 pipe PC relative ha() 16 bit */
+#define R_TILEPRO_IMM16_X1_HA_PCREL 38 /* X1 pipe PC relative ha() 16 bit */
+#define R_TILEPRO_IMM16_X0_GOT 39 /* X0 pipe 16-bit GOT offset */
+#define R_TILEPRO_IMM16_X1_GOT 40 /* X1 pipe 16-bit GOT offset */
+#define R_TILEPRO_IMM16_X0_GOT_LO 41 /* X0 pipe low 16-bit GOT offset */
+#define R_TILEPRO_IMM16_X1_GOT_LO 42 /* X1 pipe low 16-bit GOT offset */
+#define R_TILEPRO_IMM16_X0_GOT_HI 43 /* X0 pipe high 16-bit GOT offset */
+#define R_TILEPRO_IMM16_X1_GOT_HI 44 /* X1 pipe high 16-bit GOT offset */
+#define R_TILEPRO_IMM16_X0_GOT_HA 45 /* X0 pipe ha() 16-bit GOT offset */
+#define R_TILEPRO_IMM16_X1_GOT_HA 46 /* X1 pipe ha() 16-bit GOT offset */
+#define R_TILEPRO_MMSTART_X0 47 /* X0 pipe mm "start" */
+#define R_TILEPRO_MMEND_X0 48 /* X0 pipe mm "end" */
+#define R_TILEPRO_MMSTART_X1 49 /* X1 pipe mm "start" */
+#define R_TILEPRO_MMEND_X1 50 /* X1 pipe mm "end" */
+#define R_TILEPRO_SHAMT_X0 51 /* X0 pipe shift amount */
+#define R_TILEPRO_SHAMT_X1 52 /* X1 pipe shift amount */
+#define R_TILEPRO_SHAMT_Y0 53 /* Y0 pipe shift amount */
+#define R_TILEPRO_SHAMT_Y1 54 /* Y1 pipe shift amount */
+#define R_TILEPRO_DEST_IMM8_X1 55 /* X1 pipe destination 8-bit */
+/* Relocs 56-59 are currently not defined. */
+#define R_TILEPRO_TLS_GD_CALL 60 /* "jal" for TLS GD */
+#define R_TILEPRO_IMM8_X0_TLS_GD_ADD 61 /* X0 pipe "addi" for TLS GD */
+#define R_TILEPRO_IMM8_X1_TLS_GD_ADD 62 /* X1 pipe "addi" for TLS GD */
+#define R_TILEPRO_IMM8_Y0_TLS_GD_ADD 63 /* Y0 pipe "addi" for TLS GD */
+#define R_TILEPRO_IMM8_Y1_TLS_GD_ADD 64 /* Y1 pipe "addi" for TLS GD */
+#define R_TILEPRO_TLS_IE_LOAD 65 /* "lw_tls" for TLS IE */
+#define R_TILEPRO_IMM16_X0_TLS_GD 66 /* X0 pipe 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X1_TLS_GD 67 /* X1 pipe 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X0_TLS_GD_LO 68 /* X0 pipe low 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X1_TLS_GD_LO 69 /* X1 pipe low 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X0_TLS_GD_HI 70 /* X0 pipe high 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X1_TLS_GD_HI 71 /* X1 pipe high 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X0_TLS_GD_HA 72 /* X0 pipe ha() 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X1_TLS_GD_HA 73 /* X1 pipe ha() 16-bit TLS GD offset */
+#define R_TILEPRO_IMM16_X0_TLS_IE 74 /* X0 pipe 16-bit TLS IE offset */
+#define R_TILEPRO_IMM16_X1_TLS_IE 75 /* X1 pipe 16-bit TLS IE offset */
+#define R_TILEPRO_IMM16_X0_TLS_IE_LO 76 /* X0 pipe low 16-bit TLS IE offset */
+#define R_TILEPRO_IMM16_X1_TLS_IE_LO 77 /* X1 pipe low 16-bit TLS IE offset */
+#define R_TILEPRO_IMM16_X0_TLS_IE_HI 78 /* X0 pipe high 16-bit TLS IE offset */
+#define R_TILEPRO_IMM16_X1_TLS_IE_HI 79 /* X1 pipe high 16-bit TLS IE offset */
+#define R_TILEPRO_IMM16_X0_TLS_IE_HA 80 /* X0 pipe ha() 16-bit TLS IE offset */
+#define R_TILEPRO_IMM16_X1_TLS_IE_HA 81 /* X1 pipe ha() 16-bit TLS IE offset */
+#define R_TILEPRO_TLS_DTPMOD32 82 /* ID of module containing symbol */
+#define R_TILEPRO_TLS_DTPOFF32 83 /* Offset in TLS block */
+#define R_TILEPRO_TLS_TPOFF32 84 /* Offset in static TLS block */
+#define R_TILEPRO_IMM16_X0_TLS_LE 85 /* X0 pipe 16-bit TLS LE offset */
+#define R_TILEPRO_IMM16_X1_TLS_LE 86 /* X1 pipe 16-bit TLS LE offset */
+#define R_TILEPRO_IMM16_X0_TLS_LE_LO 87 /* X0 pipe low 16-bit TLS LE offset */
+#define R_TILEPRO_IMM16_X1_TLS_LE_LO 88 /* X1 pipe low 16-bit TLS LE offset */
+#define R_TILEPRO_IMM16_X0_TLS_LE_HI 89 /* X0 pipe high 16-bit TLS LE offset */
+#define R_TILEPRO_IMM16_X1_TLS_LE_HI 90 /* X1 pipe high 16-bit TLS LE offset */
+#define R_TILEPRO_IMM16_X0_TLS_LE_HA 91 /* X0 pipe ha() 16-bit TLS LE offset */
+#define R_TILEPRO_IMM16_X1_TLS_LE_HA 92 /* X1 pipe ha() 16-bit TLS LE offset */
+
+#define R_TILEPRO_GNU_VTINHERIT 128 /* GNU C++ vtable hierarchy */
+#define R_TILEPRO_GNU_VTENTRY 129 /* GNU C++ vtable member usage */
+
+#define R_TILEPRO_NUM 130
+
+
+/* TILE-Gx relocations. */
+#define R_TILEGX_NONE 0 /* No reloc */
+#define R_TILEGX_64 1 /* Direct 64 bit */
+#define R_TILEGX_32 2 /* Direct 32 bit */
+#define R_TILEGX_16 3 /* Direct 16 bit */
+#define R_TILEGX_8 4 /* Direct 8 bit */
+#define R_TILEGX_64_PCREL 5 /* PC relative 64 bit */
+#define R_TILEGX_32_PCREL 6 /* PC relative 32 bit */
+#define R_TILEGX_16_PCREL 7 /* PC relative 16 bit */
+#define R_TILEGX_8_PCREL 8 /* PC relative 8 bit */
+#define R_TILEGX_HW0 9 /* hword 0 16-bit */
+#define R_TILEGX_HW1 10 /* hword 1 16-bit */
+#define R_TILEGX_HW2 11 /* hword 2 16-bit */
+#define R_TILEGX_HW3 12 /* hword 3 16-bit */
+#define R_TILEGX_HW0_LAST 13 /* last hword 0 16-bit */
+#define R_TILEGX_HW1_LAST 14 /* last hword 1 16-bit */
+#define R_TILEGX_HW2_LAST 15 /* last hword 2 16-bit */
+#define R_TILEGX_COPY 16 /* Copy relocation */
+#define R_TILEGX_GLOB_DAT 17 /* Create GOT entry */
+#define R_TILEGX_JMP_SLOT 18 /* Create PLT entry */
+#define R_TILEGX_RELATIVE 19 /* Adjust by program base */
+#define R_TILEGX_BROFF_X1 20 /* X1 pipe branch offset */
+#define R_TILEGX_JUMPOFF_X1 21 /* X1 pipe jump offset */
+#define R_TILEGX_JUMPOFF_X1_PLT 22 /* X1 pipe jump offset to PLT */
+#define R_TILEGX_IMM8_X0 23 /* X0 pipe 8-bit */
+#define R_TILEGX_IMM8_Y0 24 /* Y0 pipe 8-bit */
+#define R_TILEGX_IMM8_X1 25 /* X1 pipe 8-bit */
+#define R_TILEGX_IMM8_Y1 26 /* Y1 pipe 8-bit */
+#define R_TILEGX_DEST_IMM8_X1 27 /* X1 pipe destination 8-bit */
+#define R_TILEGX_MT_IMM14_X1 28 /* X1 pipe mtspr */
+#define R_TILEGX_MF_IMM14_X1 29 /* X1 pipe mfspr */
+#define R_TILEGX_MMSTART_X0 30 /* X0 pipe mm "start" */
+#define R_TILEGX_MMEND_X0 31 /* X0 pipe mm "end" */
+#define R_TILEGX_SHAMT_X0 32 /* X0 pipe shift amount */
+#define R_TILEGX_SHAMT_X1 33 /* X1 pipe shift amount */
+#define R_TILEGX_SHAMT_Y0 34 /* Y0 pipe shift amount */
+#define R_TILEGX_SHAMT_Y1 35 /* Y1 pipe shift amount */
+#define R_TILEGX_IMM16_X0_HW0 36 /* X0 pipe hword 0 */
+#define R_TILEGX_IMM16_X1_HW0 37 /* X1 pipe hword 0 */
+#define R_TILEGX_IMM16_X0_HW1 38 /* X0 pipe hword 1 */
+#define R_TILEGX_IMM16_X1_HW1 39 /* X1 pipe hword 1 */
+#define R_TILEGX_IMM16_X0_HW2 40 /* X0 pipe hword 2 */
+#define R_TILEGX_IMM16_X1_HW2 41 /* X1 pipe hword 2 */
+#define R_TILEGX_IMM16_X0_HW3 42 /* X0 pipe hword 3 */
+#define R_TILEGX_IMM16_X1_HW3 43 /* X1 pipe hword 3 */
+#define R_TILEGX_IMM16_X0_HW0_LAST 44 /* X0 pipe last hword 0 */
+#define R_TILEGX_IMM16_X1_HW0_LAST 45 /* X1 pipe last hword 0 */
+#define R_TILEGX_IMM16_X0_HW1_LAST 46 /* X0 pipe last hword 1 */
+#define R_TILEGX_IMM16_X1_HW1_LAST 47 /* X1 pipe last hword 1 */
+#define R_TILEGX_IMM16_X0_HW2_LAST 48 /* X0 pipe last hword 2 */
+#define R_TILEGX_IMM16_X1_HW2_LAST 49 /* X1 pipe last hword 2 */
+#define R_TILEGX_IMM16_X0_HW0_PCREL 50 /* X0 pipe PC relative hword 0 */
+#define R_TILEGX_IMM16_X1_HW0_PCREL 51 /* X1 pipe PC relative hword 0 */
+#define R_TILEGX_IMM16_X0_HW1_PCREL 52 /* X0 pipe PC relative hword 1 */
+#define R_TILEGX_IMM16_X1_HW1_PCREL 53 /* X1 pipe PC relative hword 1 */
+#define R_TILEGX_IMM16_X0_HW2_PCREL 54 /* X0 pipe PC relative hword 2 */
+#define R_TILEGX_IMM16_X1_HW2_PCREL 55 /* X1 pipe PC relative hword 2 */
+#define R_TILEGX_IMM16_X0_HW3_PCREL 56 /* X0 pipe PC relative hword 3 */
+#define R_TILEGX_IMM16_X1_HW3_PCREL 57 /* X1 pipe PC relative hword 3 */
+#define R_TILEGX_IMM16_X0_HW0_LAST_PCREL 58 /* X0 pipe PC-rel last hword 0 */
+#define R_TILEGX_IMM16_X1_HW0_LAST_PCREL 59 /* X1 pipe PC-rel last hword 0 */
+#define R_TILEGX_IMM16_X0_HW1_LAST_PCREL 60 /* X0 pipe PC-rel last hword 1 */
+#define R_TILEGX_IMM16_X1_HW1_LAST_PCREL 61 /* X1 pipe PC-rel last hword 1 */
+#define R_TILEGX_IMM16_X0_HW2_LAST_PCREL 62 /* X0 pipe PC-rel last hword 2 */
+#define R_TILEGX_IMM16_X1_HW2_LAST_PCREL 63 /* X1 pipe PC-rel last hword 2 */
+#define R_TILEGX_IMM16_X0_HW0_GOT 64 /* X0 pipe hword 0 GOT offset */
+#define R_TILEGX_IMM16_X1_HW0_GOT 65 /* X1 pipe hword 0 GOT offset */
+#define R_TILEGX_IMM16_X0_HW0_PLT_PCREL 66 /* X0 pipe PC-rel PLT hword 0 */
+#define R_TILEGX_IMM16_X1_HW0_PLT_PCREL 67 /* X1 pipe PC-rel PLT hword 0 */
+#define R_TILEGX_IMM16_X0_HW1_PLT_PCREL 68 /* X0 pipe PC-rel PLT hword 1 */
+#define R_TILEGX_IMM16_X1_HW1_PLT_PCREL 69 /* X1 pipe PC-rel PLT hword 1 */
+#define R_TILEGX_IMM16_X0_HW2_PLT_PCREL 70 /* X0 pipe PC-rel PLT hword 2 */
+#define R_TILEGX_IMM16_X1_HW2_PLT_PCREL 71 /* X1 pipe PC-rel PLT hword 2 */
+#define R_TILEGX_IMM16_X0_HW0_LAST_GOT 72 /* X0 pipe last hword 0 GOT offset */
+#define R_TILEGX_IMM16_X1_HW0_LAST_GOT 73 /* X1 pipe last hword 0 GOT offset */
+#define R_TILEGX_IMM16_X0_HW1_LAST_GOT 74 /* X0 pipe last hword 1 GOT offset */
+#define R_TILEGX_IMM16_X1_HW1_LAST_GOT 75 /* X1 pipe last hword 1 GOT offset */
+#define R_TILEGX_IMM16_X0_HW3_PLT_PCREL 76 /* X0 pipe PC-rel PLT hword 3 */
+#define R_TILEGX_IMM16_X1_HW3_PLT_PCREL 77 /* X1 pipe PC-rel PLT hword 3 */
+#define R_TILEGX_IMM16_X0_HW0_TLS_GD 78 /* X0 pipe hword 0 TLS GD offset */
+#define R_TILEGX_IMM16_X1_HW0_TLS_GD 79 /* X1 pipe hword 0 TLS GD offset */
+#define R_TILEGX_IMM16_X0_HW0_TLS_LE 80 /* X0 pipe hword 0 TLS LE offset */
+#define R_TILEGX_IMM16_X1_HW0_TLS_LE 81 /* X1 pipe hword 0 TLS LE offset */
+#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE 82 /* X0 pipe last hword 0 LE off */
+#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE 83 /* X1 pipe last hword 0 LE off */
+#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE 84 /* X0 pipe last hword 1 LE off */
+#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE 85 /* X1 pipe last hword 1 LE off */
+#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD 86 /* X0 pipe last hword 0 GD off */
+#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD 87 /* X1 pipe last hword 0 GD off */
+#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD 88 /* X0 pipe last hword 1 GD off */
+#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD 89 /* X1 pipe last hword 1 GD off */
+/* Relocs 90-91 are currently not defined. */
+#define R_TILEGX_IMM16_X0_HW0_TLS_IE 92 /* X0 pipe hword 0 TLS IE offset */
+#define R_TILEGX_IMM16_X1_HW0_TLS_IE 93 /* X1 pipe hword 0 TLS IE offset */
+#define R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL 94 /* X0 pipe PC-rel PLT last hword 0 */
+#define R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL 95 /* X1 pipe PC-rel PLT last hword 0 */
+#define R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL 96 /* X0 pipe PC-rel PLT last hword 1 */
+#define R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL 97 /* X1 pipe PC-rel PLT last hword 1 */
+#define R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL 98 /* X0 pipe PC-rel PLT last hword 2 */
+#define R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL 99 /* X1 pipe PC-rel PLT last hword 2 */
+#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE 100 /* X0 pipe last hword 0 IE off */
+#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE 101 /* X1 pipe last hword 0 IE off */
+#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE 102 /* X0 pipe last hword 1 IE off */
+#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE 103 /* X1 pipe last hword 1 IE off */
+/* Relocs 104-105 are currently not defined. */
+#define R_TILEGX_TLS_DTPMOD64 106 /* 64-bit ID of symbol's module */
+#define R_TILEGX_TLS_DTPOFF64 107 /* 64-bit offset in TLS block */
+#define R_TILEGX_TLS_TPOFF64 108 /* 64-bit offset in static TLS block */
+#define R_TILEGX_TLS_DTPMOD32 109 /* 32-bit ID of symbol's module */
+#define R_TILEGX_TLS_DTPOFF32 110 /* 32-bit offset in TLS block */
+#define R_TILEGX_TLS_TPOFF32 111 /* 32-bit offset in static TLS block */
+#define R_TILEGX_TLS_GD_CALL 112 /* "jal" for TLS GD */
+#define R_TILEGX_IMM8_X0_TLS_GD_ADD 113 /* X0 pipe "addi" for TLS GD */
+#define R_TILEGX_IMM8_X1_TLS_GD_ADD 114 /* X1 pipe "addi" for TLS GD */
+#define R_TILEGX_IMM8_Y0_TLS_GD_ADD 115 /* Y0 pipe "addi" for TLS GD */
+#define R_TILEGX_IMM8_Y1_TLS_GD_ADD 116 /* Y1 pipe "addi" for TLS GD */
+#define R_TILEGX_TLS_IE_LOAD 117 /* "ld_tls" for TLS IE */
+#define R_TILEGX_IMM8_X0_TLS_ADD 118 /* X0 pipe "addi" for TLS GD/IE */
+#define R_TILEGX_IMM8_X1_TLS_ADD 119 /* X1 pipe "addi" for TLS GD/IE */
+#define R_TILEGX_IMM8_Y0_TLS_ADD 120 /* Y0 pipe "addi" for TLS GD/IE */
+#define R_TILEGX_IMM8_Y1_TLS_ADD 121 /* Y1 pipe "addi" for TLS GD/IE */
+
+#define R_TILEGX_GNU_VTINHERIT 128 /* GNU C++ vtable hierarchy */
+#define R_TILEGX_GNU_VTENTRY 129 /* GNU C++ vtable member usage */
+
+#define R_TILEGX_NUM 130
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__LWP_ELF_H__*/
diff --git a/components/lwp/lwp_ipc.c b/components/lwp/lwp_ipc.c
new file mode 100644
index 0000000000000000000000000000000000000000..40126229bc3ff9fc2e79f7ad9aa0f9eeac40d959
--- /dev/null
+++ b/components/lwp/lwp_ipc.c
@@ -0,0 +1,1122 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-10-12 Jesven first version
+ */
+#include
+#include
+#include
+
+#include "lwp_ipc.h"
+#include "lwp_ipc_internal.h"
+
+#include
+#include
+
+/**
+ * the IPC channel states
+ */
+enum
+{
+ RT_IPC_STAT_IDLE, /* no suspended threads */
+ RT_IPC_STAT_WAIT, /* suspended receivers exist */
+ RT_IPC_STAT_ACTIVE, /* suspended senders exist */
+};
+
+/**
+ * IPC message structure.
+ *
+ * They are allocated and released in the similar way like 'rt_chfd'.
+ */
+struct rt_ipc_msg
+{
+ struct rt_channel_msg msg; /**< the payload of msg */
+ rt_list_t mlist; /**< the msg list */
+ rt_uint8_t need_reply; /**< whether msg wait reply*/
+};
+typedef struct rt_ipc_msg *rt_ipc_msg_t;
+
+static rt_ipc_msg_t _ipc_msg_free_list = (rt_ipc_msg_t)RT_NULL; /* released chain */
+static int rt_ipc_msg_used = 0; /* first unallocated entry */
+static struct rt_ipc_msg ipc_msg_pool[RT_CH_MSG_MAX_NR]; /* initial message array */
+
+/**
+ * Allocate an IPC message from the statically-allocated array.
+ */
+static rt_ipc_msg_t _ipc_msg_alloc(void)
+{
+ rt_ipc_msg_t p = (rt_ipc_msg_t)RT_NULL;
+
+ if (_ipc_msg_free_list) /* use the released chain first */
+ {
+ p = _ipc_msg_free_list;
+ _ipc_msg_free_list = (rt_ipc_msg_t)p->msg.sender; /* emtry payload as a pointer */
+ }
+ else if (rt_ipc_msg_used < RT_CH_MSG_MAX_NR)
+ {
+ p = &ipc_msg_pool[rt_ipc_msg_used];
+ rt_ipc_msg_used++;
+ }
+ return p;
+}
+
+/**
+ * Put a released IPC message back to the released chain.
+ */
+static void _ipc_msg_free(rt_ipc_msg_t p_msg)
+{
+ p_msg->msg.sender = (void*)_ipc_msg_free_list;
+ _ipc_msg_free_list = p_msg;
+}
+
+/**
+ * Initialized the IPC message.
+ */
+static void rt_ipc_msg_init(rt_ipc_msg_t msg, struct rt_channel_msg *data, rt_uint8_t need_reply)
+{
+ RT_ASSERT(msg != RT_NULL);
+
+ msg->need_reply = need_reply;
+ msg->msg = *data;
+ msg->msg.sender = (void*)rt_thread_self();
+ rt_list_init(&msg->mlist);
+}
+
+/**
+ * Initialized the list of the waiting receivers on the IPC channel.
+ */
+rt_inline rt_err_t rt_channel_object_init(struct rt_ipc_object *ipc)
+{
+ rt_list_init(&(ipc->suspend_thread)); /* receiver list */
+
+ return RT_EOK;
+}
+
+/**
+ * Wakeup the first suspened thread in the list.
+ */
+rt_inline rt_err_t rt_channel_list_resume(rt_list_t *list)
+{
+ struct rt_thread *thread;
+
+ /* get the first thread entry waiting for sending */
+ thread = rt_list_entry(list->next, struct rt_thread, tlist);
+
+ rt_thread_resume(thread);
+
+ return RT_EOK;
+}
+
+/**
+ * Wakeup all the suspended threads in the list.
+ */
+rt_inline rt_err_t rt_channel_list_resume_all(rt_list_t *list)
+{
+ struct rt_thread *thread;
+ register rt_ubase_t temp;
+
+ /* wakeup all suspended threads for sending */
+ while (!rt_list_isempty(list))
+ {
+ temp = rt_hw_interrupt_disable();
+ thread = rt_list_entry(list->next, struct rt_thread, tlist);
+ thread->error = -RT_ERROR;
+ rt_thread_resume(thread);
+ rt_hw_interrupt_enable(temp);
+ }
+
+ return RT_EOK;
+}
+
+/**
+ * Suspend the thread and chain it into the end of the list.
+ */
+rt_inline rt_err_t rt_channel_list_suspend(rt_list_t *list, struct rt_thread *thread)
+{
+ /* suspend thread */
+ rt_err_t ret = rt_thread_suspend_with_flag(thread, RT_INTERRUPTIBLE);
+
+ if (ret == RT_EOK)
+ {
+ rt_list_insert_before(list, &(thread->tlist)); /* list end */
+ }
+
+ return ret;
+}
+
+
+static void _rt_channel_check_wq_wakup(rt_channel_t ch)
+{
+ rt_base_t level;
+
+ level = rt_hw_interrupt_disable();
+ if (rt_list_isempty(&ch->wait_msg))
+ {
+ rt_hw_interrupt_enable(level);
+ return;
+ }
+
+ rt_wqueue_wakeup(&ch->reader_queue, 0);
+ rt_hw_interrupt_enable(level);
+}
+
+/**
+ * Create a new or open an existing IPC channel.
+ */
+rt_channel_t rt_raw_channel_open(const char *name, int flags)
+{
+ register rt_ubase_t temp = 0;
+ rt_channel_t ch = RT_NULL;
+
+ struct rt_object *object;
+ struct rt_list_node *node;
+ struct rt_object_information *information;
+
+ temp = rt_hw_interrupt_disable();
+ information = rt_object_get_information(RT_Object_Class_Channel);
+ RT_ASSERT(information != RT_NULL);
+
+ /* retrieve the existing IPC channels */
+ for (node = information->object_list.next;
+ node != &(information->object_list);
+ node = node->next)
+ {
+ object = rt_list_entry(node, struct rt_object, list);
+ if (rt_strncmp(object->name, name, RT_NAME_MAX) == 0)
+ {
+ if ((flags & O_CREAT) && (flags & O_EXCL))
+ {
+ goto quit;
+ }
+ /* find the IPC channel with the specific name */
+ ch = (rt_channel_t)object;
+ ch->ref++; /* increase the reference count */
+ break;
+ }
+ }
+ if (!ch) /* create a new IPC channel */
+ {
+ if (flags & O_CREAT)
+ {
+ RT_DEBUG_NOT_IN_INTERRUPT;
+
+ /* allocate a real IPC channel structure */
+ ch = (rt_channel_t)rt_object_allocate(RT_Object_Class_Channel, name);
+ }
+
+ if (!ch)
+ {
+ goto quit;
+ }
+
+ rt_channel_object_init(&ch->parent); /* suspended receivers */
+ rt_list_init(&ch->wait_msg); /* unhandled messages */
+ rt_list_init(&ch->wait_thread); /* suspended senders */
+ rt_wqueue_init(&ch->reader_queue); /* reader poll queue */
+ ch->reply = RT_NULL;
+ ch->stat = RT_IPC_STAT_IDLE; /* no suspended threads */
+ ch->ref = 1;
+ }
+quit:
+ rt_hw_interrupt_enable(temp);
+ return ch;
+}
+
+/**
+ * Close an existiong IPC channel, release the resources.
+ */
+rt_err_t rt_raw_channel_close(rt_channel_t ch)
+{
+ register rt_ubase_t temp;
+
+ RT_DEBUG_NOT_IN_INTERRUPT;
+
+ if (ch == RT_NULL)
+ {
+ return -RT_EIO;
+ }
+
+ temp = rt_hw_interrupt_disable();
+ if (rt_object_get_type(&ch->parent.parent) != RT_Object_Class_Channel)
+ {
+ rt_hw_interrupt_enable(temp);
+ return -RT_EIO;
+ }
+ if (rt_object_is_systemobject(&ch->parent.parent) != RT_FALSE)
+ {
+ rt_hw_interrupt_enable(temp);
+ return -RT_EIO;
+ }
+
+ if (ch->ref == 0)
+ {
+ rt_hw_interrupt_enable(temp);
+ return -RT_EIO;
+ }
+ ch->ref--;
+ if (ch->ref == 0)
+ {
+ /* wakeup all the suspended receivers and senders */
+ rt_channel_list_resume_all(&ch->parent.suspend_thread);
+ rt_channel_list_resume_all(&ch->wait_thread);
+
+ /* all ipc msg will lost */
+ rt_list_init(&ch->wait_msg);
+
+ rt_object_delete(&ch->parent.parent); /* release the IPC channel structure */
+ }
+ rt_hw_interrupt_enable(temp);
+ return RT_EOK;
+}
+
+static rt_err_t wakeup_sender_wait_recv(void *object, struct rt_thread *thread)
+{
+ rt_channel_t ch;
+
+ ch = (rt_channel_t)object;
+ if (ch->stat == RT_IPC_STAT_ACTIVE && ch->reply == thread)
+ {
+ ch->stat = RT_IPC_STAT_IDLE;
+ ch->reply = RT_NULL;
+ }
+ else
+ {
+ rt_ipc_msg_t msg;
+ rt_list_t *l;
+
+ l = ch->wait_msg.next;
+ while (l != &ch->wait_msg)
+ {
+ msg = rt_list_entry(l, struct rt_ipc_msg, mlist);
+ if (msg->need_reply && msg->msg.sender == thread)
+ {
+ rt_list_remove(&msg->mlist); /* remove the msg from the channel */
+ _ipc_msg_free(msg);
+ break;
+ }
+ l = l->next;
+ }
+ }
+ thread->error = -RT_EINTR;
+ return rt_thread_resume(thread); /* wake up the sender */
+}
+
+static rt_err_t wakeup_sender_wait_reply(void *object, struct rt_thread *thread)
+{
+ rt_channel_t ch;
+
+ ch = (rt_channel_t)object;
+ RT_ASSERT(ch->stat == RT_IPC_STAT_ACTIVE && ch->reply == thread);
+ ch->stat = RT_IPC_STAT_IDLE;
+ ch->reply = RT_NULL;
+ thread->error = -RT_EINTR;
+ return rt_thread_resume(thread); /* wake up the sender */
+}
+
+static void sender_timeout(void *parameter)
+{
+ struct rt_thread *thread = (struct rt_thread*)parameter;
+ rt_channel_t ch;
+
+ ch = (rt_channel_t)(thread->wakeup.user_data);
+ if (ch->stat == RT_IPC_STAT_ACTIVE && ch->reply == thread)
+ {
+ ch->stat = RT_IPC_STAT_IDLE;
+ ch->reply = RT_NULL;
+ }
+ else
+ {
+ rt_ipc_msg_t msg;
+ rt_list_t *l;
+
+ l = ch->wait_msg.next;
+ while (l != &ch->wait_msg)
+ {
+ msg = rt_list_entry(l, struct rt_ipc_msg, mlist);
+ if (msg->need_reply && msg->msg.sender == thread)
+ {
+ rt_list_remove(&msg->mlist); /* remove the msg from the channel */
+ _ipc_msg_free(msg);
+ break;
+ }
+ l = l->next;
+ }
+ }
+ thread->error = -RT_ETIMEOUT;
+ thread->wakeup.func = RT_NULL;
+
+ rt_list_remove(&(thread->tlist));
+ /* insert to schedule ready list */
+ rt_schedule_insert_thread(thread);
+ /* do schedule */
+ rt_schedule();
+}
+
+/**
+ * Send data through an IPC channel, wait for the reply or not.
+ */
+static rt_err_t _rt_raw_channel_send_recv_timeout(rt_channel_t ch, rt_channel_msg_t data, int need_reply, rt_channel_msg_t data_ret, rt_int32_t time)
+{
+ rt_ipc_msg_t msg;
+ struct rt_thread *thread_recv, *thread_send = 0;
+ register rt_base_t temp;
+ rt_err_t ret;
+ void (*old_timeout_func)(void *) = 0;
+
+ if (need_reply)
+ {
+ RT_DEBUG_NOT_IN_INTERRUPT;
+ }
+
+ if (ch == RT_NULL)
+ {
+ return -RT_EIO;
+ }
+
+ temp = rt_hw_interrupt_disable();
+
+ if (rt_object_get_type(&ch->parent.parent) != RT_Object_Class_Channel)
+ {
+ rt_hw_interrupt_enable(temp);
+ return -RT_EIO;
+ }
+ if (need_reply && time == 0)
+ {
+ rt_hw_interrupt_enable(temp);
+ return -RT_ETIMEOUT;
+ }
+
+ /* allocate an IPC message */
+ msg = _ipc_msg_alloc();
+ if (!msg)
+ {
+ rt_hw_interrupt_enable(temp);
+ return -RT_ENOMEM;
+ }
+
+ rt_ipc_msg_init(msg, data, need_reply);
+
+ if (need_reply)
+ {
+ thread_send = rt_thread_self();
+ thread_send->error = RT_EOK;
+ }
+
+ switch (ch->stat)
+ {
+ case RT_IPC_STAT_IDLE:
+ case RT_IPC_STAT_ACTIVE:
+ if (need_reply)
+ {
+ ret = rt_channel_list_suspend(&ch->wait_thread, thread_send);
+ if (ret != RT_EOK)
+ {
+ _ipc_msg_free(msg);
+ rt_hw_interrupt_enable(temp);
+ return ret;
+ }
+ rt_thread_wakeup_set(thread_send, wakeup_sender_wait_recv, (void*)ch);
+ if (time > 0)
+ {
+ rt_timer_control(&(thread_send->thread_timer),
+ RT_TIMER_CTRL_GET_FUNC,
+ &old_timeout_func);
+ rt_timer_control(&(thread_send->thread_timer),
+ RT_TIMER_CTRL_SET_FUNC,
+ sender_timeout);
+ /* reset the timeout of thread timer and start it */
+ rt_timer_control(&(thread_send->thread_timer),
+ RT_TIMER_CTRL_SET_TIME,
+ &time);
+ rt_timer_start(&(thread_send->thread_timer));
+ }
+ }
+ /*
+ * If there is no thread waiting for messages, chain the message
+ * into the list.
+ */
+ rt_list_insert_before(&ch->wait_msg, &msg->mlist);
+ break;
+ case RT_IPC_STAT_WAIT:
+ /*
+ * If there are suspended receivers on the IPC channel, transfer the
+ * pointer of the message to the first receiver directly and wake it
+ * up.
+ */
+ RT_ASSERT(ch->parent.suspend_thread.next != &ch->parent.suspend_thread);
+
+ if (need_reply)
+ {
+ ret = rt_channel_list_suspend(&ch->wait_thread, thread_send);
+ if (ret != RT_EOK)
+ {
+ _ipc_msg_free(msg);
+ rt_hw_interrupt_enable(temp);
+ return ret;
+ }
+ ch->reply = thread_send; /* record the current waiting sender */
+ ch->stat = RT_IPC_STAT_ACTIVE;
+ rt_thread_wakeup_set(thread_send, wakeup_sender_wait_reply, (void*)ch);
+ if (time > 0)
+ {
+ rt_timer_control(&(thread_send->thread_timer),
+ RT_TIMER_CTRL_GET_FUNC,
+ &old_timeout_func);
+ rt_timer_control(&(thread_send->thread_timer),
+ RT_TIMER_CTRL_SET_FUNC,
+ sender_timeout);
+ /* reset the timeout of thread timer and start it */
+ rt_timer_control(&(thread_send->thread_timer),
+ RT_TIMER_CTRL_SET_TIME,
+ &time);
+ rt_timer_start(&(thread_send->thread_timer));
+ }
+ }
+ else
+ {
+ ch->stat = RT_IPC_STAT_IDLE;
+ }
+ thread_recv = rt_list_entry(ch->parent.suspend_thread.next, struct rt_thread, tlist);
+ thread_recv->msg_ret = msg; /* to the first suspended receiver */
+ thread_recv->error = RT_EOK;
+ rt_channel_list_resume(&ch->parent.suspend_thread);
+ break;
+ default:
+ break;
+ }
+
+ if ( ch->stat == RT_IPC_STAT_IDLE)
+ {
+ _rt_channel_check_wq_wakup(ch);
+ }
+ rt_hw_interrupt_enable(temp);
+
+ /* reschedule in order to let the potential receivers run */
+ rt_schedule();
+
+ if (need_reply)
+ {
+ temp = rt_hw_interrupt_disable();
+ if (old_timeout_func)
+ {
+ rt_timer_control(&(thread_send->thread_timer),
+ RT_TIMER_CTRL_SET_FUNC,
+ old_timeout_func);
+ }
+ ret = thread_send->error;
+ rt_hw_interrupt_enable(temp);
+
+ if (ret != RT_EOK)
+ {
+ return ret;
+ }
+
+ /* If the sender gets the chance to run, the requested reply must be valid. */
+ RT_ASSERT(data_ret != RT_NULL);
+ *data_ret = ((rt_ipc_msg_t)(thread_send->msg_ret))->msg; /* extract data */
+ temp = rt_hw_interrupt_disable();
+ _ipc_msg_free(thread_send->msg_ret); /* put back the message to kernel */
+ rt_hw_interrupt_enable(temp);
+ thread_send->msg_ret = RT_NULL;
+ }
+
+ return RT_EOK;
+}
+
+/**
+ * Send data through an IPC channel with no reply.
+ */
+rt_err_t rt_raw_channel_send(rt_channel_t ch, rt_channel_msg_t data)
+{
+ return _rt_raw_channel_send_recv_timeout(ch, data, 0, 0, RT_WAITING_FOREVER);
+}
+
+/**
+ * Send data through an IPC channel and wait for the relpy.
+ */
+rt_err_t rt_raw_channel_send_recv(rt_channel_t ch, rt_channel_msg_t data, rt_channel_msg_t data_ret)
+{
+ return _rt_raw_channel_send_recv_timeout(ch, data, 1, data_ret, RT_WAITING_FOREVER);
+}
+
+/**
+ * Send data through an IPC channel and wait for the relpy.
+ */
+rt_err_t rt_raw_channel_send_recv_timeout(rt_channel_t ch, rt_channel_msg_t data, rt_channel_msg_t data_ret, rt_int32_t time)
+{
+ return _rt_raw_channel_send_recv_timeout(ch, data, 1, data_ret, time);
+}
+
+/**
+ * Reply to the waiting sender and wake it up.
+ */
+rt_err_t rt_raw_channel_reply(rt_channel_t ch, rt_channel_msg_t data)
+{
+ rt_ipc_msg_t msg;
+ struct rt_thread *thread;
+ register rt_base_t temp;
+
+ if (ch == RT_NULL)
+ {
+ return -RT_EIO;
+ }
+
+ temp = rt_hw_interrupt_disable();
+
+ if (rt_object_get_type(&ch->parent.parent) != RT_Object_Class_Channel)
+ {
+ rt_hw_interrupt_enable(temp);
+ return -RT_EIO;
+ }
+
+ if (ch->stat != RT_IPC_STAT_ACTIVE)
+ {
+ rt_hw_interrupt_enable(temp);
+ return -RT_ERROR;
+ }
+
+ if (ch->reply == RT_NULL)
+ {
+ rt_hw_interrupt_enable(temp);
+ return -RT_ERROR;
+ }
+
+ /* allocate an IPC message */
+ msg = _ipc_msg_alloc();
+ if (!msg)
+ {
+ rt_hw_interrupt_enable(temp);
+ return -RT_ENOMEM;
+ }
+
+ rt_ipc_msg_init(msg, data, 0);
+
+ thread = ch->reply;
+ thread->msg_ret = msg; /* transfer the reply to the sender */
+ rt_thread_resume(thread); /* wake up the sender */
+ ch->stat = RT_IPC_STAT_IDLE;
+ ch->reply = RT_NULL;
+
+ _rt_channel_check_wq_wakup(ch);
+ rt_hw_interrupt_enable(temp);
+ rt_schedule();
+
+ return RT_EOK;
+}
+
+static rt_err_t wakeup_receiver(void *object, struct rt_thread *thread)
+{
+ rt_channel_t ch;
+ rt_err_t ret;
+
+ ch = (rt_channel_t)object;
+ ch->stat = RT_IPC_STAT_IDLE;
+ thread->error = -RT_EINTR;
+ ret = rt_channel_list_resume(&ch->parent.suspend_thread);
+ _rt_channel_check_wq_wakup(ch);
+ return ret;
+}
+
+static void receiver_timeout(void *parameter)
+{
+ struct rt_thread *thread = (struct rt_thread*)parameter;
+ rt_channel_t ch;
+
+ ch = (rt_channel_t)(thread->wakeup.user_data);
+
+ ch->stat = RT_IPC_STAT_IDLE;
+ thread->error = -RT_ETIMEOUT;
+ thread->wakeup.func = RT_NULL;
+
+ rt_list_remove(&(thread->tlist));
+ /* insert to schedule ready list */
+ rt_schedule_insert_thread(thread);
+
+ _rt_channel_check_wq_wakup(ch);
+ /* do schedule */
+ rt_schedule();
+}
+
+/**
+ * Fetch a message from the specified IPC channel.
+ */
+static rt_err_t _rt_raw_channel_recv_timeout(rt_channel_t ch, rt_channel_msg_t data, rt_int32_t time)
+{
+ struct rt_thread *thread;
+ rt_ipc_msg_t msg_ret;
+ register rt_base_t temp;
+ rt_err_t ret;
+ void (*old_timeout_func)(void *) = 0;
+
+ RT_DEBUG_NOT_IN_INTERRUPT;
+
+ if (ch == RT_NULL)
+ {
+ return -RT_EIO;
+ }
+
+ temp = rt_hw_interrupt_disable();
+
+ if (rt_object_get_type(&ch->parent.parent) != RT_Object_Class_Channel)
+ {
+ rt_hw_interrupt_enable(temp);
+ return -RT_EIO;
+ }
+ if (ch->stat != RT_IPC_STAT_IDLE)
+ {
+ rt_hw_interrupt_enable(temp);
+ return -RT_ERROR;
+ }
+
+ if (ch->wait_msg.next != &ch->wait_msg) /* there exist unhandled messages */
+ {
+ msg_ret = rt_list_entry(ch->wait_msg.next, struct rt_ipc_msg, mlist);
+ rt_list_remove(ch->wait_msg.next); /* remove the message from the channel */
+ if (msg_ret->need_reply)
+ {
+ RT_ASSERT(ch->wait_thread.next != &ch->wait_thread);
+
+ thread = rt_list_entry(ch->wait_thread.next, struct rt_thread, tlist);
+ rt_list_remove(ch->wait_thread.next);
+ ch->reply = thread; /* record the waiting sender */
+ ch->stat = RT_IPC_STAT_ACTIVE; /* no valid suspened receivers */
+ }
+ *data = msg_ret->msg; /* extract the transferred data */
+ _ipc_msg_free(msg_ret); /* put back the message to kernel */
+ }
+ else
+ {
+ if (time == 0)
+ {
+ rt_hw_interrupt_enable(temp);
+ return -RT_ETIMEOUT;
+ }
+ /* no valid message, we must wait */
+ thread = rt_thread_self();
+
+ ret = rt_channel_list_suspend(&ch->parent.suspend_thread, thread);
+ if (ret != RT_EOK)
+ {
+ rt_hw_interrupt_enable(temp);
+ return ret;
+ }
+ rt_thread_wakeup_set(thread, wakeup_receiver, (void*)ch);
+ ch->stat = RT_IPC_STAT_WAIT;/* no valid suspended senders */
+ thread->error = RT_EOK;
+ if (time > 0)
+ {
+ rt_timer_control(&(thread->thread_timer),
+ RT_TIMER_CTRL_GET_FUNC,
+ &old_timeout_func);
+ rt_timer_control(&(thread->thread_timer),
+ RT_TIMER_CTRL_SET_FUNC,
+ receiver_timeout);
+ /* reset the timeout of thread timer and start it */
+ rt_timer_control(&(thread->thread_timer),
+ RT_TIMER_CTRL_SET_TIME,
+ &time);
+ rt_timer_start(&(thread->thread_timer));
+ }
+ rt_hw_interrupt_enable(temp);
+
+ rt_schedule(); /* let the senders run */
+
+ temp = rt_hw_interrupt_disable();
+ if (old_timeout_func)
+ {
+ rt_timer_control(&(thread->thread_timer),
+ RT_TIMER_CTRL_SET_FUNC,
+ old_timeout_func);
+ }
+ ret = thread->error;
+ if ( ret != RT_EOK)
+ {
+ rt_hw_interrupt_enable(temp);
+ return ret;
+ }
+ /* If waked up, the received message has been store into the thread. */
+ *data = ((rt_ipc_msg_t)(thread->msg_ret))->msg; /* extract data */
+ _ipc_msg_free(thread->msg_ret); /* put back the message to kernel */
+ thread->msg_ret = RT_NULL;
+ }
+
+ rt_hw_interrupt_enable(temp);
+
+ return RT_EOK;
+}
+
+rt_err_t rt_raw_channel_recv(rt_channel_t ch, rt_channel_msg_t data)
+{
+ return _rt_raw_channel_recv_timeout(ch, data, RT_WAITING_FOREVER);
+}
+
+rt_err_t rt_raw_channel_recv_timeout(rt_channel_t ch, rt_channel_msg_t data, rt_int32_t time)
+{
+ return _rt_raw_channel_recv_timeout(ch, data, time);
+}
+/**
+ * Peek a message from the specified IPC channel.
+ */
+rt_err_t rt_raw_channel_peek(rt_channel_t ch, rt_channel_msg_t data)
+{
+ return _rt_raw_channel_recv_timeout(ch, data, 0);
+}
+
+/* for API */
+
+static int lwp_fd_new(int fdt_type)
+{
+ struct dfs_fdtable *fdt;
+
+ if (fdt_type)
+ {
+ fdt = dfs_fdtable_get_global();
+ }
+ else
+ {
+ fdt = dfs_fdtable_get();
+ }
+ return fdt_fd_new(fdt);
+}
+
+static struct dfs_fd *lwp_fd_get(int fdt_type, int fd)
+{
+ struct dfs_fdtable *fdt;
+
+ if (fdt_type)
+ {
+ fdt = dfs_fdtable_get_global();
+ }
+ else
+ {
+ fdt = dfs_fdtable_get();
+ }
+ return fdt_fd_get(fdt, fd);
+}
+
+static void lwp_fd_put(int fdt_type, struct dfs_fd *fd)
+{
+ struct dfs_fdtable *fdt;
+
+ if (fdt_type)
+ {
+ fdt = dfs_fdtable_get_global();
+ }
+ else
+ {
+ fdt = dfs_fdtable_get();
+ }
+ fdt_fd_put(fdt, fd);
+}
+
+static int _chfd_alloc(int fdt_type)
+{
+ /* create a BSD socket */
+ int fd;
+
+ /* allocate a fd */
+ fd = lwp_fd_new(fdt_type);
+
+ if (fd < 0)
+ {
+ return -1;
+ }
+ return fd;
+}
+
+static void _chfd_free(int fd, int fdt_type)
+{
+ struct dfs_fd *d;
+
+ d = lwp_fd_get(fdt_type, fd);
+ if (d == RT_NULL)
+ {
+ return;
+ }
+ lwp_fd_put(fdt_type, d);
+ lwp_fd_put(fdt_type, d);
+}
+
+/* for fops */
+static int channel_fops_poll(struct dfs_fd *file, struct rt_pollreq *req)
+{
+ int mask = POLLOUT;
+ rt_channel_t ch;
+
+ ch = (rt_channel_t)file->data;
+ rt_poll_add(&(ch->reader_queue), req);
+ if (ch->stat != RT_IPC_STAT_IDLE)
+ {
+ return mask;
+ }
+ if (!rt_list_isempty(&ch->wait_msg))
+ {
+ mask |= POLLIN;
+ }
+ return mask;
+}
+
+static int channel_fops_close(struct dfs_fd *file)
+{
+ rt_channel_t ch;
+ rt_base_t level;
+
+ level = rt_hw_interrupt_disable();
+ ch = (rt_channel_t)file->data;
+ ch->ref--;
+ if (ch->ref == 0)
+ {
+ /* wakeup all the suspended receivers and senders */
+ rt_channel_list_resume_all(&ch->parent.suspend_thread);
+ rt_channel_list_resume_all(&ch->wait_thread);
+
+ /* all ipc msg will lost */
+ rt_list_init(&ch->wait_msg);
+
+ rt_object_delete(&ch->parent.parent); /* release the IPC channel structure */
+ }
+ rt_hw_interrupt_enable(level);
+ return 0;
+}
+
+static const struct dfs_file_ops channel_fops =
+{
+ NULL, /* open */
+ channel_fops_close,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL, /* lseek */
+ NULL, /* getdents */
+ channel_fops_poll,
+};
+
+int lwp_channel_open(int fdt_type, const char *name, int flags)
+{
+ int fd;
+ rt_channel_t ch = RT_NULL;
+
+ fd = _chfd_alloc(fdt_type); /* allocate an IPC channel descriptor */
+ if (fd == -1)
+ {
+ goto quit;
+ }
+ ch = rt_raw_channel_open(name, flags);
+ if (ch)
+ {
+ struct dfs_fd *d;
+
+ d = lwp_fd_get(fdt_type, fd);
+
+ d->type = FT_USER;
+ d->path = NULL;
+
+ d->fops = &channel_fops;
+
+ d->flags = O_RDWR; /* set flags as read and write */
+ d->size = 0;
+ d->pos = 0;
+
+ /* set socket to the data of dfs_fd */
+ d->data = (void *)ch;
+ lwp_fd_put(fdt_type, d);
+ }
+ else
+ {
+ _chfd_free(fd, fdt_type);
+ fd = -1;
+ }
+quit:
+ return fd;
+}
+
+static rt_channel_t fd_2_channel(int fdt_type, int fd)
+{
+ struct dfs_fd *d;
+
+ d = lwp_fd_get(fdt_type, fd);
+ if (d)
+ {
+ rt_channel_t ch;
+
+ ch = (rt_channel_t)d->data;
+ lwp_fd_put(fdt_type, d);
+ if (ch)
+ {
+ return ch;
+ }
+ }
+ return RT_NULL;
+}
+
+rt_err_t lwp_channel_close(int fdt_type, int fd)
+{
+ rt_channel_t ch;
+
+ ch = fd_2_channel(fdt_type, fd);
+ if (ch)
+ {
+ _chfd_free(fd, fdt_type);
+ return rt_raw_channel_close(ch);
+ }
+ return -RT_EIO;
+}
+
+rt_err_t lwp_channel_send(int fdt_type, int fd, rt_channel_msg_t data)
+{
+ rt_channel_t ch;
+ ch = fd_2_channel(fdt_type, fd);
+ if (ch)
+ {
+ return rt_raw_channel_send(ch, data);
+ }
+ return -RT_EIO;
+}
+
+rt_err_t lwp_channel_send_recv_timeout(int fdt_type, int fd, rt_channel_msg_t data, rt_channel_msg_t data_ret, rt_int32_t time)
+{
+ rt_channel_t ch;
+ ch = fd_2_channel(fdt_type, fd);
+ if (ch)
+ {
+ return rt_raw_channel_send_recv_timeout(ch, data, data_ret, time);
+ }
+ return -RT_EIO;
+}
+
+rt_err_t lwp_channel_reply(int fdt_type, int fd, rt_channel_msg_t data)
+{
+ rt_channel_t ch;
+ ch = fd_2_channel(fdt_type, fd);
+ if (ch)
+ {
+ return rt_raw_channel_reply(ch, data);
+ }
+ return -RT_EIO;
+}
+
+rt_err_t lwp_channel_recv_timeout(int fdt_type, int fd, rt_channel_msg_t data, rt_int32_t time)
+{
+ rt_channel_t ch;
+ ch = fd_2_channel(fdt_type, fd);
+ if (ch)
+ {
+ return rt_raw_channel_recv_timeout(ch, data, time);
+ }
+ return -RT_EIO;
+}
+
+int rt_channel_open(const char *name, int flags)
+{
+ return lwp_channel_open(FDT_TYPE_KERNEL, name, flags);
+}
+
+rt_err_t rt_channel_close(int fd)
+{
+ return lwp_channel_close(FDT_TYPE_KERNEL, fd);
+}
+
+rt_err_t rt_channel_send(int fd, rt_channel_msg_t data)
+{
+ return lwp_channel_send(FDT_TYPE_KERNEL, fd, data);
+}
+
+rt_err_t rt_channel_send_recv_timeout(int fd, rt_channel_msg_t data, rt_channel_msg_t data_ret, rt_int32_t time)
+{
+ return lwp_channel_send_recv_timeout(FDT_TYPE_KERNEL, fd, data, data_ret, time);
+}
+
+rt_err_t rt_channel_send_recv(int fd, rt_channel_msg_t data, rt_channel_msg_t data_ret)
+{
+ return lwp_channel_send_recv_timeout(FDT_TYPE_KERNEL, fd, data, data_ret, RT_WAITING_FOREVER);
+}
+
+rt_err_t rt_channel_reply(int fd, rt_channel_msg_t data)
+{
+ return lwp_channel_reply(FDT_TYPE_KERNEL, fd, data);
+}
+
+rt_err_t rt_channel_recv_timeout(int fd, rt_channel_msg_t data, rt_int32_t time)
+{
+ return lwp_channel_recv_timeout(FDT_TYPE_KERNEL, fd, data, time);
+}
+
+rt_err_t rt_channel_recv(int fd, rt_channel_msg_t data)
+{
+ return lwp_channel_recv_timeout(FDT_TYPE_KERNEL, fd, data, RT_WAITING_FOREVER);
+}
+
+rt_err_t rt_channel_peek(int fd, rt_channel_msg_t data)
+{
+ return lwp_channel_recv_timeout(FDT_TYPE_KERNEL, fd, data, 0);
+}
+
+#ifdef RT_USING_FINSH
+static int list_channel(void)
+{
+ rt_base_t level;
+ rt_channel_t *channels;
+ rt_ubase_t index, count;
+ struct rt_object *object;
+ struct rt_list_node *node;
+ struct rt_object_information *information;
+
+ const char* stat_strs[] = {"idle", "wait", "active"};
+
+ information = rt_object_get_information(RT_Object_Class_Channel);
+ RT_ASSERT(information != RT_NULL);
+
+ count = 0;
+ level = rt_hw_interrupt_disable();
+ /* get the count of IPC channels */
+ for (node = information->object_list.next;
+ node != &(information->object_list);
+ node = node->next)
+ {
+ count ++;
+ }
+ rt_hw_interrupt_enable(level);
+
+ if (count == 0) return 0;
+
+ channels = (rt_channel_t *) rt_calloc(count, sizeof(rt_channel_t));
+ if (channels == RT_NULL) return 0; /* out of memory */
+
+ index = 0;
+ level = rt_hw_interrupt_disable();
+ /* retrieve pointer of IPC channels */
+ for (node = information->object_list.next;
+ node != &(information->object_list);
+ node = node->next)
+ {
+ object = rt_list_entry(node, struct rt_object, list);
+
+ channels[index] = (rt_channel_t)object;
+ index ++;
+ }
+ rt_hw_interrupt_enable(level);
+
+ rt_kprintf(" channel state\n");
+ rt_kprintf("-------- -------\n");
+ for (index = 0; index < count; index ++)
+ {
+ if (channels[index] != RT_NULL)
+ {
+ rt_kprintf("%-*.s", RT_NAME_MAX, channels[index]->parent.parent.name);
+ if (channels[index]->stat < 3)
+ rt_kprintf(" %s\n", stat_strs[channels[index]->stat]);
+ }
+ }
+
+ rt_free(channels);
+
+ return 0;
+}
+MSH_CMD_EXPORT(list_channel, list IPC channel information);
+#endif
+
diff --git a/components/lwp/lwp_ipc.h b/components/lwp/lwp_ipc.h
new file mode 100644
index 0000000000000000000000000000000000000000..adfe906914823c82d5e788a2490495d0d7455737
--- /dev/null
+++ b/components/lwp/lwp_ipc.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-10-12 Jesven first version
+ */
+
+#ifndef LWP_IPC_H__
+#define LWP_IPC_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum
+{
+ RT_CHANNEL_RAW,
+ RT_CHANNEL_BUFFER
+};
+
+struct rt_channel_msg
+{
+ void *sender;
+ int type;
+ union
+ {
+ struct chbuf
+ {
+ void *buf;
+ size_t length;
+ } b;
+ void* d;
+ } u;
+};
+typedef struct rt_channel_msg *rt_channel_msg_t;
+
+int rt_channel_open(const char *name, int flags);
+rt_err_t rt_channel_close(int fd);
+rt_err_t rt_channel_send(int fd, rt_channel_msg_t data);
+rt_err_t rt_channel_send_recv(int fd, rt_channel_msg_t data, rt_channel_msg_t data_ret);
+rt_err_t rt_channel_send_recv_timeout(int fd, rt_channel_msg_t data, rt_channel_msg_t data_ret, rt_int32_t time);
+rt_err_t rt_channel_reply(int fd, rt_channel_msg_t data);
+rt_err_t rt_channel_recv(int fd, rt_channel_msg_t data);
+rt_err_t rt_channel_recv_timeout(int fd, rt_channel_msg_t data, rt_int32_t time);
+rt_err_t rt_channel_peek(int fd, rt_channel_msg_t data);
+
+rt_channel_t rt_raw_channel_open(const char *name, int flags);
+rt_err_t rt_raw_channel_close(rt_channel_t ch);
+rt_err_t rt_raw_channel_send(rt_channel_t ch, rt_channel_msg_t data);
+rt_err_t rt_raw_channel_send_recv(rt_channel_t ch, rt_channel_msg_t data, rt_channel_msg_t data_ret);
+rt_err_t rt_raw_channel_send_recv_timeout(rt_channel_t ch, rt_channel_msg_t data, rt_channel_msg_t data_ret, rt_int32_t time);
+rt_err_t rt_raw_channel_reply(rt_channel_t ch, rt_channel_msg_t data);
+rt_err_t rt_raw_channel_recv(rt_channel_t ch, rt_channel_msg_t data);
+rt_err_t rt_raw_channel_recv_timeout(rt_channel_t ch, rt_channel_msg_t data, rt_int32_t time);
+rt_err_t rt_raw_channel_peek(rt_channel_t ch, rt_channel_msg_t data);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/lwp/lwp_ipc_internal.h b/components/lwp/lwp_ipc_internal.h
new file mode 100644
index 0000000000000000000000000000000000000000..1efa7a1c0284fd489a2540a244937063680b81d3
--- /dev/null
+++ b/components/lwp/lwp_ipc_internal.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-10-16 Jesven first version
+ */
+#ifndef LWP_IPC_INTERNAL_H__
+#define LWP_IPC_INTERNAL_H__
+
+#include
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum
+{
+ FDT_TYPE_LWP,
+ FDT_TYPE_KERNEL
+};
+
+int lwp_channel_open(int fdt_type, const char *name, int flags);
+rt_err_t lwp_channel_close(int fdt_type, int fd);
+rt_err_t lwp_channel_send(int fdt_type, int fd, rt_channel_msg_t data);
+rt_err_t lwp_channel_send_recv_timeout(int fdt_type, int fd, rt_channel_msg_t data, rt_channel_msg_t data_ret, rt_int32_t time);
+rt_err_t lwp_channel_reply(int fdt_type, int fd, rt_channel_msg_t data);
+rt_err_t lwp_channel_recv_timeout(int fdt_type, int fd, rt_channel_msg_t data, rt_int32_t time);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWP_IPC_INTERNAL_H__*/
diff --git a/components/lwp/lwp_mem.c b/components/lwp/lwp_mem.c
deleted file mode 100644
index 63fd5c89e1893ef32808c58c7e400fe8baab58c4..0000000000000000000000000000000000000000
--- a/components/lwp/lwp_mem.c
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2018-06-10 Bernard first version
- */
-
-#include
-#include
-
-#define DBG_TAG "LWPMEM"
-#define DBG_LVL DBG_WARNING
-#include
-
-// todo: remove repleat code
-#define RT_MEMHEAP_SIZE RT_ALIGN(sizeof(struct rt_lwp_memheap_item), RT_ALIGN_SIZE)
-#define MEMITEM_SIZE(item) ((rt_uint32_t)item->next - (rt_uint32_t)item - RT_MEMHEAP_SIZE)
-
-#ifndef LWP_MEM_PAGE_SIZE
- #define LWP_MEM_PAGE_SIZE (4 * 1024)
-#endif
-
-#ifndef LWP_MEM_MAX_PAGE_COUNT
- #define LWP_MEM_MAX_PAGE_COUNT (256 * 4)
-#endif
-
-static void *rt_lwp_malloc_page(struct rt_lwp *lwp, rt_size_t npages)
-{
- void *chunk;
- char name[6];
- struct rt_lwp_memheap *lwp_heap;
- rt_size_t page_cnt;
-
- RT_ASSERT(lwp != RT_NULL);
-
- page_cnt = lwp->heap_cnt + npages;
- if (page_cnt > LWP_MEM_MAX_PAGE_COUNT)
- {
- dbg_log(DBG_ERROR, "alloc new page failed, lwp memory size out of limited: %d\n", page_cnt);
- return RT_NULL;
- }
-
- lwp_heap = rt_malloc(sizeof(struct rt_lwp_memheap));
- if (lwp_heap == RT_NULL)
- {
- dbg_log(DBG_ERROR, "alloc new page head failed, out of memory : %d\n", page_cnt);
- return RT_NULL;
- }
-
- chunk = rt_malloc(npages * LWP_MEM_PAGE_SIZE);
- if (chunk == RT_NULL)
- {
- dbg_log(DBG_ERROR, "alloc new page buffer failed, out of memory : %d\n", page_cnt);
- rt_free(lwp_heap);
- return RT_NULL;
- }
-
- dbg_log(DBG_LOG, "lwp alloc page: %d\n", npages);
-
- rt_sprintf(name, "lwp%02x", lwp->heap_cnt);
- rt_lwp_memheap_init(lwp_heap, name, chunk, npages * LWP_MEM_PAGE_SIZE);
-
- rt_list_insert_before(&lwp->hlist, &lwp_heap->mlist);
-
- lwp->heap_cnt += npages;
-
- return chunk;
-}
-
-static void rt_lwp_free_page(struct rt_lwp *lwp, struct rt_lwp_memheap *lwp_heap)
-{
- rt_size_t npages;
-
- RT_ASSERT(lwp != RT_NULL);
- RT_ASSERT(lwp_heap != RT_NULL);
- RT_ASSERT(lwp_heap->start_addr != RT_NULL);
-
- npages = lwp_heap->pool_size / LWP_MEM_PAGE_SIZE;
- lwp->heap_cnt -= npages;
-
- dbg_log(DBG_LOG, "lwp free page: %d\n", npages);
-
- rt_list_remove(&lwp_heap->mlist);
-
- rt_free(lwp_heap->start_addr);
- rt_free(lwp_heap);
-}
-
-void rt_lwp_mem_init(struct rt_lwp *lwp)
-{
- RT_ASSERT(lwp != RT_NULL);
- rt_list_init(&lwp->hlist);
-}
-
-void rt_lwp_mem_deinit(struct rt_lwp *lwp)
-{
- struct rt_list_node *node;
-
- RT_ASSERT(lwp != RT_NULL);
-
- node = lwp->hlist.next;
-
- while (node != &(lwp->hlist))
- {
- struct rt_lwp_memheap *lwp_heap;
-
- lwp_heap = rt_list_entry(node, struct rt_lwp_memheap, mlist);
- RT_ASSERT(lwp_heap != RT_NULL);
-
- /* update note before free page*/
- node = node->next;
-
- rt_lwp_free_page(lwp, lwp_heap);
- }
-}
-
-void *rt_lwp_mem_malloc(rt_uint32_t size)
-{
- struct rt_lwp *lwp;
- struct rt_list_node *node;
- void *addr = RT_NULL;
- rt_uint32_t npages;
-
- if (size == 0)
- return RT_NULL;
-
- lwp = rt_lwp_self();
- RT_ASSERT(lwp != RT_NULL);
-
- for (node = lwp->hlist.next; node != &(lwp->hlist); node = node->next)
- {
- struct rt_lwp_memheap *lwp_heap;
- lwp_heap = rt_list_entry(node, struct rt_lwp_memheap, mlist);
-
- addr = rt_lwp_memheap_alloc(lwp_heap, size);
- if (addr != RT_NULL)
- {
- dbg_log(DBG_LOG, "lwp alloc 0x%x/%d\n", addr, size);
- return addr;
- }
- }
-
- npages = (size + rt_lwp_memheap_unavailable_size_get() + LWP_MEM_PAGE_SIZE) / LWP_MEM_PAGE_SIZE;
- if (RT_NULL != rt_lwp_malloc_page(lwp, npages))
- return rt_lwp_mem_malloc(size);
- else
- return RT_NULL;
-}
-
-void rt_lwp_mem_free(void *addr)
-{
- struct rt_lwp_memheap_item *header_ptr;
- struct rt_lwp_memheap *lwp_heap;
-
- if (addr == RT_NULL)
- return ;
-
- /* get memory item */
- header_ptr = (struct rt_lwp_memheap_item *)((rt_uint8_t *)addr - RT_MEMHEAP_SIZE);
- RT_ASSERT(header_ptr);
-
- lwp_heap = header_ptr->pool_ptr;
- RT_ASSERT(lwp_heap);
-
- dbg_log(DBG_LOG, "lwp free 0x%x\n", addr);
- rt_lwp_memheap_free((void *)addr);
-
- if (rt_lwp_memheap_is_empty(lwp_heap))
- {
- rt_lwp_free_page(rt_lwp_self(), lwp_heap);
- }
-}
-
-void *rt_lwp_mem_realloc(void *rmem, rt_size_t newsize)
-{
- void *new_ptr;
- struct rt_lwp_memheap_item *header_ptr;
-
- if (rmem == RT_NULL)
- return rt_lwp_mem_malloc(newsize);
-
- if (newsize == 0)
- {
- rt_lwp_mem_free(rmem);
- return RT_NULL;
- }
-
- /* get old memory item */
- header_ptr = (struct rt_lwp_memheap_item *)
- ((rt_uint8_t *)rmem - RT_MEMHEAP_SIZE);
-
- new_ptr = rt_lwp_memheap_realloc(header_ptr->pool_ptr, rmem, newsize);
- if (new_ptr == RT_NULL)
- {
- /* allocate memory block from other memheap */
- new_ptr = rt_lwp_mem_malloc(newsize);
- if (new_ptr != RT_NULL && rmem != RT_NULL)
- {
- rt_size_t oldsize;
-
- /* get the size of old memory block */
- oldsize = MEMITEM_SIZE(header_ptr);
- if (newsize > oldsize)
- rt_memcpy(new_ptr, rmem, oldsize);
- else
- rt_memcpy(new_ptr, rmem, newsize);
-
- dbg_log(DBG_LOG, "lwp realloc with memcpy 0x%x -> 0x%x/%d\n", rmem, new_ptr, newsize);
- rt_lwp_mem_free(rmem);
-
- }
- }
-
- dbg_log(DBG_LOG, "lwp realloc in same address 0x%x/%d\n", rmem, newsize);
-
- return new_ptr;
-}
diff --git a/components/lwp/lwp_memheap.c b/components/lwp/lwp_memheap.c
deleted file mode 100644
index 7d512a503f2bc471e7948653c3bb0eea8a987c3c..0000000000000000000000000000000000000000
--- a/components/lwp/lwp_memheap.c
+++ /dev/null
@@ -1,576 +0,0 @@
-/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2012-04-10 Bernard first implementation
- * 2012-10-16 Bernard add the mutex lock for heap object.
- * 2012-12-29 Bernard memheap can be used as system heap.
- * change mutex lock to semaphore lock.
- * 2013-04-10 Bernard add rt_lwp_memheap_realloc function.
- * 2013-05-24 Bernard fix the rt_lwp_memheap_realloc issue.
- * 2013-07-11 Grissiom fix the memory block splitting issue.
- * 2013-07-15 Grissiom optimize rt_lwp_memheap_realloc
- */
-
-#include
-#include
-#include
-
-/* dynamic pool magic and mask */
-#define RT_MEMHEAP_MAGIC 0x1ea01ea0
-#define RT_MEMHEAP_MASK 0xfffffffe
-#define RT_MEMHEAP_USED 0x01
-#define RT_MEMHEAP_FREED 0x00
-
-#define RT_MEMHEAP_IS_USED(i) ((i)->magic & RT_MEMHEAP_USED)
-#define RT_MEMHEAP_MINIALLOC 12
-
-#define RT_MEMHEAP_SIZE RT_ALIGN(sizeof(struct rt_lwp_memheap_item), RT_ALIGN_SIZE)
-#define MEMITEM_SIZE(item) ((rt_uint32_t)item->next - (rt_uint32_t)item - RT_MEMHEAP_SIZE)
-
-/*
- * The initialized memory pool will be:
- * +-----------------------------------+--------------------------+
- * | whole freed memory block | Used Memory Block Tailer |
- * +-----------------------------------+--------------------------+
- *
- * block_list --> whole freed memory block
- *
- * The length of Used Memory Block Tailer is 0,
- * which is prevents block merging across list
- */
-rt_err_t rt_lwp_memheap_init(struct rt_lwp_memheap *memheap,
- const char *name,
- void *start_addr,
- rt_uint32_t size)
-{
- struct rt_lwp_memheap_item *item;
-
- RT_ASSERT(memheap != RT_NULL);
-
- /* initialize pool object */
- memheap->start_addr = start_addr;
- memheap->pool_size = RT_ALIGN_DOWN(size, RT_ALIGN_SIZE);
- memheap->available_size = memheap->pool_size - (2 * RT_MEMHEAP_SIZE);
- memheap->max_used_size = memheap->pool_size - memheap->available_size;
-
- /* initialize the free list header */
- item = &(memheap->free_header);
- item->magic = RT_MEMHEAP_MAGIC;
- item->pool_ptr = memheap;
- item->next = RT_NULL;
- item->prev = RT_NULL;
- item->next_free = item;
- item->prev_free = item;
-
- /* set the free list to free list header */
- memheap->free_list = item;
-
- /* initialize the first big memory block */
- item = (struct rt_lwp_memheap_item *)start_addr;
- item->magic = RT_MEMHEAP_MAGIC;
- item->pool_ptr = memheap;
- item->next = RT_NULL;
- item->prev = RT_NULL;
- item->next_free = item;
- item->prev_free = item;
-
- item->next = (struct rt_lwp_memheap_item *)
- ((rt_uint8_t *)item + memheap->available_size + RT_MEMHEAP_SIZE);
- item->prev = item->next;
-
- /* block list header */
- memheap->block_list = item;
-
- /* place the big memory block to free list */
- item->next_free = memheap->free_list->next_free;
- item->prev_free = memheap->free_list;
- memheap->free_list->next_free->prev_free = item;
- memheap->free_list->next_free = item;
-
- /* move to the end of memory pool to build a small tailer block,
- * which prevents block merging
- */
- item = item->next;
- /* it's a used memory block */
- item->magic = RT_MEMHEAP_MAGIC | RT_MEMHEAP_USED;
- item->pool_ptr = memheap;
- item->next = (struct rt_lwp_memheap_item *)start_addr;
- item->prev = (struct rt_lwp_memheap_item *)start_addr;
- /* not in free list */
- item->next_free = item->prev_free = RT_NULL;
-
- /* initialize semaphore lock */
- rt_sem_init(&(memheap->lock), name, 1, RT_IPC_FLAG_FIFO);
-
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP,
- ("memory heap: start addr 0x%08x, size %d, free list header 0x%08x\n",
- start_addr, size, &(memheap->free_header)));
-
- return RT_EOK;
-}
-
-void *rt_lwp_memheap_alloc(struct rt_lwp_memheap *heap, rt_uint32_t size)
-{
- rt_err_t result;
- rt_uint32_t free_size;
- struct rt_lwp_memheap_item *header_ptr;
-
- RT_ASSERT(heap != RT_NULL);
-
- /* align allocated size */
- size = RT_ALIGN(size, RT_ALIGN_SIZE);
- if (size < RT_MEMHEAP_MINIALLOC)
- size = RT_MEMHEAP_MINIALLOC;
-
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP, ("allocate %d on heap:%8.*s",
- size, RT_NAME_MAX, heap->parent.name));
-
- if (size < heap->available_size)
- {
- /* search on free list */
- free_size = 0;
-
- /* lock memheap */
- result = rt_sem_take(&(heap->lock), RT_WAITING_FOREVER);
- if (result != RT_EOK)
- {
- rt_set_errno(result);
-
- return RT_NULL;
- }
-
- /* get the first free memory block */
- header_ptr = heap->free_list->next_free;
- while (header_ptr != heap->free_list && free_size < size)
- {
- /* get current freed memory block size */
- free_size = MEMITEM_SIZE(header_ptr);
- if (free_size < size)
- {
- /* move to next free memory block */
- header_ptr = header_ptr->next_free;
- }
- }
-
- /* determine if the memory is available. */
- if (free_size >= size)
- {
- /* a block that satisfies the request has been found. */
-
- /* determine if the block needs to be split. */
- if (free_size >= (size + RT_MEMHEAP_SIZE + RT_MEMHEAP_MINIALLOC))
- {
- struct rt_lwp_memheap_item *new_ptr;
-
- /* split the block. */
- new_ptr = (struct rt_lwp_memheap_item *)
- (((rt_uint8_t *)header_ptr) + size + RT_MEMHEAP_SIZE);
-
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP,
- ("split: block[0x%08x] nextm[0x%08x] prevm[0x%08x] to new[0x%08x]\n",
- header_ptr,
- header_ptr->next,
- header_ptr->prev,
- new_ptr));
-
- /* mark the new block as a memory block and freed. */
- new_ptr->magic = RT_MEMHEAP_MAGIC;
-
- /* put the pool pointer into the new block. */
- new_ptr->pool_ptr = heap;
-
- /* break down the block list */
- new_ptr->prev = header_ptr;
- new_ptr->next = header_ptr->next;
- header_ptr->next->prev = new_ptr;
- header_ptr->next = new_ptr;
-
- /* remove header ptr from free list */
- header_ptr->next_free->prev_free = header_ptr->prev_free;
- header_ptr->prev_free->next_free = header_ptr->next_free;
- header_ptr->next_free = RT_NULL;
- header_ptr->prev_free = RT_NULL;
-
- /* insert new_ptr to free list */
- new_ptr->next_free = heap->free_list->next_free;
- new_ptr->prev_free = heap->free_list;
- heap->free_list->next_free->prev_free = new_ptr;
- heap->free_list->next_free = new_ptr;
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP, ("new ptr: next_free 0x%08x, prev_free 0x%08x\n",
- new_ptr->next_free,
- new_ptr->prev_free));
-
- /* decrement the available byte count. */
- heap->available_size = heap->available_size -
- size -
- RT_MEMHEAP_SIZE;
- if (heap->pool_size - heap->available_size > heap->max_used_size)
- heap->max_used_size = heap->pool_size - heap->available_size;
- }
- else
- {
- /* decrement the entire free size from the available bytes count. */
- heap->available_size = heap->available_size - free_size;
- if (heap->pool_size - heap->available_size > heap->max_used_size)
- heap->max_used_size = heap->pool_size - heap->available_size;
-
- /* remove header_ptr from free list */
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP,
- ("one block: block[0x%08x], next_free 0x%08x, prev_free 0x%08x\n",
- header_ptr,
- header_ptr->next_free,
- header_ptr->prev_free));
-
- header_ptr->next_free->prev_free = header_ptr->prev_free;
- header_ptr->prev_free->next_free = header_ptr->next_free;
- header_ptr->next_free = RT_NULL;
- header_ptr->prev_free = RT_NULL;
- }
-
- /* Mark the allocated block as not available. */
- header_ptr->magic |= RT_MEMHEAP_USED;
-
- /* release lock */
- rt_sem_release(&(heap->lock));
-
- /* Return a memory address to the caller. */
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP,
- ("alloc mem: memory[0x%08x], heap[0x%08x], size: %d\n",
- (void *)((rt_uint8_t *)header_ptr + RT_MEMHEAP_SIZE),
- header_ptr,
- size));
-
- return (void *)((rt_uint8_t *)header_ptr + RT_MEMHEAP_SIZE);
- }
-
- /* release lock */
- rt_sem_release(&(heap->lock));
- }
-
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP, ("allocate memory: failed\n"));
-
- /* Return the completion status. */
- return RT_NULL;
-}
-
-void *rt_lwp_memheap_realloc(struct rt_lwp_memheap *heap, void *ptr, rt_size_t newsize)
-{
- rt_err_t result;
- rt_size_t oldsize;
- struct rt_lwp_memheap_item *header_ptr;
- struct rt_lwp_memheap_item *new_ptr;
-
- if (newsize == 0)
- {
- rt_lwp_memheap_free(ptr);
-
- return RT_NULL;
- }
- /* align allocated size */
- newsize = RT_ALIGN(newsize, RT_ALIGN_SIZE);
- if (newsize < RT_MEMHEAP_MINIALLOC)
- newsize = RT_MEMHEAP_MINIALLOC;
-
- if (ptr == RT_NULL)
- {
- return rt_lwp_memheap_alloc(heap, newsize);
- }
-
- /* get memory block header and get the size of memory block */
- header_ptr = (struct rt_lwp_memheap_item *)
- ((rt_uint8_t *)ptr - RT_MEMHEAP_SIZE);
- oldsize = MEMITEM_SIZE(header_ptr);
- /* re-allocate memory */
- if (newsize > oldsize)
- {
- void *new_ptr;
- struct rt_lwp_memheap_item *next_ptr;
-
- /* lock memheap */
- result = rt_sem_take(&(heap->lock), RT_WAITING_FOREVER);
- if (result != RT_EOK)
- {
- rt_set_errno(result);
- return RT_NULL;
- }
-
- next_ptr = header_ptr->next;
-
- /* header_ptr should not be the tail */
- RT_ASSERT(next_ptr > header_ptr);
-
- /* check whether the following free space is enough to expand */
- if (!RT_MEMHEAP_IS_USED(next_ptr))
- {
- rt_int32_t nextsize;
-
- nextsize = MEMITEM_SIZE(next_ptr);
- RT_ASSERT(next_ptr > 0);
-
- /* Here is the ASCII art of the situation that we can make use of
- * the next free node without alloc/memcpy, |*| is the control
- * block:
- *
- * oldsize free node
- * |*|-----------|*|----------------------|*|
- * newsize >= minialloc
- * |*|----------------|*|-----------------|*|
- */
- if (nextsize + oldsize > newsize + RT_MEMHEAP_MINIALLOC)
- {
- /* decrement the entire free size from the available bytes count. */
- heap->available_size = heap->available_size - (newsize - oldsize);
- if (heap->pool_size - heap->available_size > heap->max_used_size)
- heap->max_used_size = heap->pool_size - heap->available_size;
-
- /* remove next_ptr from free list */
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP,
- ("remove block: block[0x%08x], next_free 0x%08x, prev_free 0x%08x",
- next_ptr,
- next_ptr->next_free,
- next_ptr->prev_free));
-
- next_ptr->next_free->prev_free = next_ptr->prev_free;
- next_ptr->prev_free->next_free = next_ptr->next_free;
- next_ptr->next->prev = next_ptr->prev;
- next_ptr->prev->next = next_ptr->next;
-
- /* build a new one on the right place */
- next_ptr = (struct rt_lwp_memheap_item *)((char *)ptr + newsize);
-
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP,
- ("new free block: block[0x%08x] nextm[0x%08x] prevm[0x%08x]",
- next_ptr,
- next_ptr->next,
- next_ptr->prev));
-
- /* mark the new block as a memory block and freed. */
- next_ptr->magic = RT_MEMHEAP_MAGIC;
-
- /* put the pool pointer into the new block. */
- next_ptr->pool_ptr = heap;
-
- next_ptr->prev = header_ptr;
- next_ptr->next = header_ptr->next;
- header_ptr->next->prev = next_ptr;
- header_ptr->next = next_ptr;
-
- /* insert next_ptr to free list */
- next_ptr->next_free = heap->free_list->next_free;
- next_ptr->prev_free = heap->free_list;
- heap->free_list->next_free->prev_free = next_ptr;
- heap->free_list->next_free = next_ptr;
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP, ("new ptr: next_free 0x%08x, prev_free 0x%08x",
- next_ptr->next_free,
- next_ptr->prev_free));
-
- /* release lock */
- rt_sem_release(&(heap->lock));
-
- return ptr;
- }
- }
-
- /* release lock */
- rt_sem_release(&(heap->lock));
-
- /* re-allocate a memory block */
- new_ptr = (void *)rt_lwp_memheap_alloc(heap, newsize);
- if (new_ptr != RT_NULL)
- {
- rt_memcpy(new_ptr, ptr, oldsize < newsize ? oldsize : newsize);
- rt_lwp_memheap_free(ptr);
- }
-
- return new_ptr;
- }
-
- /* don't split when there is less than one node space left */
- if (newsize + RT_MEMHEAP_SIZE + RT_MEMHEAP_MINIALLOC >= oldsize)
- return ptr;
-
- /* lock memheap */
- result = rt_sem_take(&(heap->lock), RT_WAITING_FOREVER);
- if (result != RT_EOK)
- {
- rt_set_errno(result);
-
- return RT_NULL;
- }
-
- /* split the block. */
- new_ptr = (struct rt_lwp_memheap_item *)
- (((rt_uint8_t *)header_ptr) + newsize + RT_MEMHEAP_SIZE);
-
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP,
- ("split: block[0x%08x] nextm[0x%08x] prevm[0x%08x] to new[0x%08x]\n",
- header_ptr,
- header_ptr->next,
- header_ptr->prev,
- new_ptr));
-
- /* mark the new block as a memory block and freed. */
- new_ptr->magic = RT_MEMHEAP_MAGIC;
- /* put the pool pointer into the new block. */
- new_ptr->pool_ptr = heap;
-
- /* break down the block list */
- new_ptr->prev = header_ptr;
- new_ptr->next = header_ptr->next;
- header_ptr->next->prev = new_ptr;
- header_ptr->next = new_ptr;
-
- /* determine if the block can be merged with the next neighbor. */
- if (!RT_MEMHEAP_IS_USED(new_ptr->next))
- {
- struct rt_lwp_memheap_item *free_ptr;
-
- /* merge block with next neighbor. */
- free_ptr = new_ptr->next;
- heap->available_size = heap->available_size - MEMITEM_SIZE(free_ptr);
-
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP,
- ("merge: right node 0x%08x, next_free 0x%08x, prev_free 0x%08x\n",
- header_ptr, header_ptr->next_free, header_ptr->prev_free));
-
- free_ptr->next->prev = new_ptr;
- new_ptr->next = free_ptr->next;
-
- /* remove free ptr from free list */
- free_ptr->next_free->prev_free = free_ptr->prev_free;
- free_ptr->prev_free->next_free = free_ptr->next_free;
- }
-
- /* insert the split block to free list */
- new_ptr->next_free = heap->free_list->next_free;
- new_ptr->prev_free = heap->free_list;
- heap->free_list->next_free->prev_free = new_ptr;
- heap->free_list->next_free = new_ptr;
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP, ("new free ptr: next_free 0x%08x, prev_free 0x%08x\n",
- new_ptr->next_free,
- new_ptr->prev_free));
-
- /* increment the available byte count. */
- heap->available_size = heap->available_size + MEMITEM_SIZE(new_ptr);
-
- /* release lock */
- rt_sem_release(&(heap->lock));
-
- /* return the old memory block */
- return ptr;
-}
-
-void rt_lwp_memheap_free(void *ptr)
-{
- rt_err_t result;
- struct rt_lwp_memheap *heap;
- struct rt_lwp_memheap_item *header_ptr, *new_ptr;
- rt_uint32_t insert_header;
-
- /* NULL check */
- if (ptr == RT_NULL) return;
-
- /* set initial status as OK */
- insert_header = 1;
- new_ptr = RT_NULL;
- header_ptr = (struct rt_lwp_memheap_item *)
- ((rt_uint8_t *)ptr - RT_MEMHEAP_SIZE);
-
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP, ("free memory: memory[0x%08x], block[0x%08x]\n",
- ptr, header_ptr));
-
- /* check magic */
- RT_ASSERT((header_ptr->magic & RT_MEMHEAP_MASK) == RT_MEMHEAP_MAGIC);
- RT_ASSERT(header_ptr->magic & RT_MEMHEAP_USED);
- /* check whether this block of memory has been over-written. */
- RT_ASSERT((header_ptr->next->magic & RT_MEMHEAP_MASK) == RT_MEMHEAP_MAGIC);
-
- /* get pool ptr */
- heap = header_ptr->pool_ptr;
-
- /* lock memheap */
- result = rt_sem_take(&(heap->lock), RT_WAITING_FOREVER);
- if (result != RT_EOK)
- {
- rt_set_errno(result);
-
- return ;
- }
-
- /* Mark the memory as available. */
- header_ptr->magic &= ~RT_MEMHEAP_USED;
- /* Adjust the available number of bytes. */
- heap->available_size = heap->available_size + MEMITEM_SIZE(header_ptr);
-
- /* Determine if the block can be merged with the previous neighbor. */
- if (!RT_MEMHEAP_IS_USED(header_ptr->prev))
- {
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP, ("merge: left node 0x%08x\n",
- header_ptr->prev));
-
- /* adjust the available number of bytes. */
- heap->available_size = heap->available_size + RT_MEMHEAP_SIZE;
-
- /* yes, merge block with previous neighbor. */
- (header_ptr->prev)->next = header_ptr->next;
- (header_ptr->next)->prev = header_ptr->prev;
-
- /* move header pointer to previous. */
- header_ptr = header_ptr->prev;
- /* don't insert header to free list */
- insert_header = 0;
- }
-
- /* determine if the block can be merged with the next neighbor. */
- if (!RT_MEMHEAP_IS_USED(header_ptr->next))
- {
- /* adjust the available number of bytes. */
- heap->available_size = heap->available_size + RT_MEMHEAP_SIZE;
-
- /* merge block with next neighbor. */
- new_ptr = header_ptr->next;
-
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP,
- ("merge: right node 0x%08x, next_free 0x%08x, prev_free 0x%08x\n",
- new_ptr, new_ptr->next_free, new_ptr->prev_free));
-
- new_ptr->next->prev = header_ptr;
- header_ptr->next = new_ptr->next;
-
- /* remove new ptr from free list */
- new_ptr->next_free->prev_free = new_ptr->prev_free;
- new_ptr->prev_free->next_free = new_ptr->next_free;
- }
-
- if (insert_header)
- {
- /* no left merge, insert to free list */
- header_ptr->next_free = heap->free_list->next_free;
- header_ptr->prev_free = heap->free_list;
- heap->free_list->next_free->prev_free = header_ptr;
- heap->free_list->next_free = header_ptr;
-
- RT_DEBUG_LOG(RT_DEBUG_MEMHEAP,
- ("insert to free list: next_free 0x%08x, prev_free 0x%08x\n",
- header_ptr->next_free, header_ptr->prev_free));
- }
-
- /* release lock */
- rt_sem_release(&(heap->lock));
-}
-
-rt_bool_t rt_lwp_memheap_is_empty(struct rt_lwp_memheap *memheap)
-{
- RT_ASSERT(memheap != RT_NULL);
-
- return (memheap->available_size + 2 * sizeof(struct rt_lwp_memheap_item)) == memheap->pool_size;
-}
-
-rt_bool_t rt_lwp_memheap_unavailable_size_get(void)
-{
- return 2 * RT_MEMHEAP_SIZE + 3;
-}
diff --git a/components/lwp/lwp_memheap.h b/components/lwp/lwp_memheap.h
deleted file mode 100644
index d0c09dfd01740abd1a48130fecaf6a1ca3e1f683..0000000000000000000000000000000000000000
--- a/components/lwp/lwp_memheap.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2018-06-10 Bernard first version
- */
-
-#ifndef __LWP_MEMHEAP_H__
-#define __LWP_MEMHEAP_H__
-
-#include
-#include
-
-/**
- * memory item on the heap
- */
-struct rt_lwp_memheap_item
-{
- rt_uint32_t magic; /**< magic number for memheap */
- struct rt_lwp_memheap *pool_ptr; /**< point of pool */
-
- struct rt_lwp_memheap_item *next; /**< next memheap item */
- struct rt_lwp_memheap_item *prev; /**< prev memheap item */
-
- struct rt_lwp_memheap_item *next_free; /**< next free memheap item */
- struct rt_lwp_memheap_item *prev_free; /**< prev free memheap item */
-};
-
-/**
- * Base structure of memory heap object
- */
-struct rt_lwp_memheap
-{
- struct rt_object parent; /**< inherit from rt_object */
-
- void *start_addr; /**< pool start address and size */
-
- rt_uint32_t pool_size; /**< pool size */
- rt_uint32_t available_size; /**< available size */
- rt_uint32_t max_used_size; /**< maximum allocated size */
-
- struct rt_lwp_memheap_item *block_list; /**< used block list */
- struct rt_lwp_memheap_item *free_list; /**< free block list */
- struct rt_lwp_memheap_item free_header; /**< free block list header */
-
- struct rt_semaphore lock; /**< semaphore lock */
-
- rt_list_t mlist;
-};
-
-extern rt_err_t rt_lwp_memheap_init(struct rt_lwp_memheap *memheap, const char *name, void *start_addr, rt_uint32_t size);
-extern void *rt_lwp_memheap_alloc(struct rt_lwp_memheap *heap, rt_uint32_t size);
-extern void rt_lwp_memheap_free(void *ptr);
-extern void *rt_lwp_memheap_realloc(struct rt_lwp_memheap *heap, void *ptr, rt_size_t newsize);
-extern rt_bool_t rt_lwp_memheap_is_empty(struct rt_lwp_memheap *memheap);
-extern rt_bool_t rt_lwp_memheap_unavailable_size_get(void);
-
-#endif
diff --git a/components/lwp/lwp_mm_area.c b/components/lwp/lwp_mm_area.c
new file mode 100644
index 0000000000000000000000000000000000000000..5c2526631662c94e15af568f59578d285b645274
--- /dev/null
+++ b/components/lwp/lwp_mm_area.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-10-28 Jesven first version
+ */
+#include
+
+#ifdef RT_USING_USERSPACE
+#include
+
+int lwp_map_area_insert(struct lwp_avl_struct **avl_tree, size_t addr, size_t size, int auto_free)
+{
+ struct lwp_avl_struct *node;
+ struct rt_mm_area_struct *ma;
+
+ if (!size)
+ {
+ return -1;
+ }
+ ma = (struct rt_mm_area_struct *)rt_malloc(sizeof(struct rt_mm_area_struct));
+ if (!ma)
+ {
+ return -1;
+ }
+ ma->addr = addr;
+ ma->size = size;
+ ma->auto_free = auto_free;
+
+ node = (struct lwp_avl_struct *)rt_malloc(sizeof(struct lwp_avl_struct));
+ if (!node)
+ {
+ rt_free(ma);
+ return -1;
+ }
+ memset(node, 0, sizeof(struct lwp_avl_struct));
+
+ node->avl_key = ma->addr;
+ node->data = (void*)ma;
+ lwp_avl_insert(node, avl_tree);
+ return 0;
+}
+
+void lwp_map_area_remove(struct lwp_avl_struct **avl_tree, size_t addr)
+{
+ struct lwp_avl_struct *node;
+
+ node = lwp_avl_find(addr, *avl_tree);
+ if (!node)
+ {
+ return;
+ }
+ lwp_avl_remove(node, avl_tree);
+ rt_free(node->data);
+ rt_free(node);
+}
+
+struct lwp_avl_struct* lwp_map_find(struct lwp_avl_struct* ptree, size_t addr)
+{
+ struct lwp_avl_struct *node;
+
+ node = lwp_avl_find(addr, ptree);
+ return node;
+}
+
+struct lwp_avl_struct* lwp_map_find_first(struct lwp_avl_struct* ptree)
+{
+ if (ptree == AVL_EMPTY)
+ {
+ return (struct lwp_avl_struct *)0;
+ }
+ while (1)
+ {
+ if (!ptree->avl_left)
+ break;
+ ptree = ptree->avl_left;
+ }
+ return ptree;
+}
+
+static void top_mem_fun(struct lwp_avl_struct* ptree, void *arg)
+{
+ size_t *vs = (size_t*)arg;
+ struct rt_mm_area_struct *ma;
+
+ ma = (struct rt_mm_area_struct*)ptree->data;
+ *vs += ma->size;
+}
+
+size_t lwp_vmem_count(struct lwp_avl_struct *ptree)
+{
+ size_t vsize = 0;
+ lwp_avl_traversal(ptree, top_mem_fun, &vsize);
+ return vsize;
+}
+#endif
diff --git a/components/lwp/lwp_mm_area.h b/components/lwp/lwp_mm_area.h
new file mode 100644
index 0000000000000000000000000000000000000000..3b150534c3a746266998db57d228afb0a951d395
--- /dev/null
+++ b/components/lwp/lwp_mm_area.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-10-28 Jesven first version
+ */
+#ifndef __LWP_MM_AREA_H__
+#define __LWP_MM_AREA_H__
+
+#include
+#include
+
+#include
+
+#ifdef RT_USING_USERSPACE
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct rt_mm_area_struct
+{
+ size_t addr;
+ size_t size;
+ int auto_free;
+};
+
+int lwp_map_area_insert(struct lwp_avl_struct **avl_tree, size_t addr, size_t size, int auto_free);
+void lwp_map_area_remove(struct lwp_avl_struct **avl_tree, size_t addr);
+struct lwp_avl_struct* lwp_map_find(struct lwp_avl_struct* ptree, size_t addr);
+struct lwp_avl_struct* lwp_map_find_first(struct lwp_avl_struct* ptree);
+size_t lwp_vmem_count(struct lwp_avl_struct *ptree);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#endif /*__LWP_MM_AREA_H__*/
diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c
new file mode 100644
index 0000000000000000000000000000000000000000..e13c6f33aa651ba0f013952b85eebb7b95eecfc3
--- /dev/null
+++ b/components/lwp/lwp_pid.c
@@ -0,0 +1,807 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-10-16 zhangjun first version
+ */
+
+#include
+#include
+#include
+
+#include "lwp.h"
+#include "lwp_pid.h"
+#include "lwp_console.h"
+
+#ifdef RT_USING_USERSPACE
+#include "lwp_user_mm.h"
+
+#ifdef RT_USING_GDBSERVER
+#include
+#include
+#endif
+
+#endif
+
+#define DBG_TAG "LWP_PID"
+#define DBG_LVL DBG_INFO
+#include
+
+struct rt_pid_struct
+{
+ struct rt_lwp* pidmap[RT_LWP_MAX_NR];
+ pid_t last_pid;
+};
+static struct rt_pid_struct pid_struct = {0};
+
+int libc_stdio_get_console(void);
+
+static void __exit_files(struct rt_lwp *lwp)
+{
+ int consolefd; /* the console fd, which must not be closed */
+
+ consolefd = libc_stdio_get_console();
+ consolefd = consolefd - DFS_FD_OFFSET;
+
+ while (lwp->fdt.maxfd > 0)
+ {
+ if (consolefd != lwp->fdt.maxfd - 1) /* skip the console fd */
+ {
+ struct dfs_fd *d;
+
+ d = lwp->fdt.fds[lwp->fdt.maxfd - 1];
+ if (d)
+ {
+ dfs_file_close(d);
+ rt_free(d);
+ }
+ }
+ lwp->fdt.maxfd --;
+ }
+}
+
+struct rt_lwp* lwp_new(void)
+{
+ uint32_t i;
+ rt_base_t level;
+ struct rt_lwp* lwp = RT_NULL;
+
+ level = rt_hw_interrupt_disable();
+ /* first scan */
+ for (i=pid_struct.last_pid; i= RT_LWP_MAX_NR)
+ {
+ for (i=0; i= RT_LWP_MAX_NR)
+ {
+ /* if second scan also failed */
+ LOG_W("pidmap fulled\n");
+ pid_struct.last_pid = 0;
+ goto out;
+ }
+ pid_struct.last_pid = (i + 1)%RT_LWP_MAX_NR;
+ lwp = (struct rt_lwp *)rt_malloc(sizeof(struct rt_lwp));
+ if (lwp == RT_NULL)
+ {
+ LOG_E("no memory for lwp struct!\n");
+ goto out;
+ }
+ rt_memset(lwp, 0, sizeof(*lwp));
+ rt_list_init(&lwp->wait_list);
+ lwp->pid = i;
+ pid_struct.pidmap[i] = lwp;
+ rt_list_init(&lwp->t_grp);
+ rt_list_init(&lwp->object_list);
+ rt_wqueue_init(&lwp->wait_queue);
+
+ lwp->ref = 1;
+out:
+ rt_hw_interrupt_enable(level);
+ return lwp;
+}
+
+static void lwp_user_obj_free(struct rt_lwp *lwp)
+{
+ rt_base_t level = 0;
+ struct rt_list_node *list = RT_NULL, *node = RT_NULL;
+ struct rt_object *object = RT_NULL;
+
+ list = &(lwp->object_list), node = list->next;
+
+ level = rt_hw_interrupt_disable();
+ while (list != node)
+ {
+ object = rt_list_entry(node, struct rt_object, lwp_obj_list);
+ node = node->next;
+
+ /* remove from kernel object list */
+ switch (object->type)
+ {
+ case RT_Object_Class_Thread:
+ {
+ rt_thread_t tid = (rt_thread_t)object;
+ if (tid->stat != RT_THREAD_CLOSE)
+ {
+ rt_thread_delete(tid);
+ }
+ break;
+ }
+ case RT_Object_Class_Semaphore:
+ rt_sem_delete((rt_sem_t)object);
+ break;
+ case RT_Object_Class_Mutex:
+ rt_mutex_delete((rt_mutex_t)object);
+ break;
+ case RT_Object_Class_Event:
+ rt_event_delete((rt_event_t)object);
+ break;
+ case RT_Object_Class_MailBox:
+ rt_mb_delete((rt_mailbox_t)object);
+ break;
+ case RT_Object_Class_MessageQueue:
+ rt_mq_delete((rt_mq_t)object);
+ break;
+ case RT_Object_Class_Device:
+ rt_device_close((rt_device_t)object);
+ break;
+ case RT_Object_Class_Timer:
+ rt_timer_delete((rt_timer_t)object);
+ break;
+ case RT_Object_Class_Channel:
+ break;
+ default:
+ LOG_E("input object type(%d) error", object->type);
+ break;
+ }
+ }
+ rt_hw_interrupt_enable(level);
+}
+
+void lwp_free(struct rt_lwp* lwp)
+{
+ rt_base_t level;
+
+ if (lwp == NULL) return ;
+
+ LOG_D("lwp free: %p\n", lwp);
+
+ level = rt_hw_interrupt_disable();
+
+ lwp->finish = 1;
+ if (lwp->args != RT_NULL)
+ {
+#ifndef RT_USING_USERSPACE
+ rt_free(lwp->args);
+#endif
+ lwp->args = RT_NULL;
+ }
+
+ if (lwp->fdt.fds != RT_NULL)
+ {
+ /* auto clean fds */
+ __exit_files(lwp);
+ lwp_user_obj_free(lwp);
+ rt_free(lwp->fdt.fds);
+ lwp->fdt.fds = RT_NULL;
+ }
+
+ /* free data section */
+ if (lwp->data_entry != RT_NULL)
+ {
+ rt_free_align(lwp->data_entry);
+ lwp->data_entry = RT_NULL;
+ }
+
+ /* free text section */
+ if (lwp->lwp_type == LWP_TYPE_DYN_ADDR)
+ {
+ if (lwp->text_entry)
+ {
+ LOG_D("lwp text free: %p", lwp->text_entry);
+#ifndef RT_USING_USERSPACE
+#ifdef RT_USING_CACHE
+ rt_free_align(lwp->text_entry);
+#else
+ rt_free(lwp->text_entry);
+#endif
+#endif
+ lwp->text_entry = RT_NULL;
+ }
+ }
+
+#ifdef RT_USING_USERSPACE
+ lwp_unmap_user_space(lwp);
+#endif
+
+ /* for children */
+ while (lwp->first_child)
+ {
+ struct rt_lwp *child;
+
+ child = lwp->first_child;
+ lwp->first_child = child->sibling;
+ if (child->finish)
+ {
+ pid_struct.pidmap[lwp_to_pid(child)] = RT_NULL;
+ rt_free(child);
+ }
+ else
+ {
+ child->sibling = RT_NULL;
+ child->parent = RT_NULL;
+ }
+ }
+
+ /* for parent */
+ {
+ struct rt_lwp *console_lwp;
+
+ console_lwp = rt_console_get_foreground();
+ if (lwp == console_lwp)
+ {
+ rt_console_set_foreground(lwp->parent);
+ }
+
+ if (lwp->parent)
+ {
+ struct rt_thread *thread;
+ if (!rt_list_isempty(&lwp->wait_list))
+ {
+ thread = rt_list_entry(lwp->wait_list.next, struct rt_thread, tlist);
+ thread->error = RT_EOK;
+ thread->msg_ret = (void*)lwp->lwp_ret;
+ rt_thread_resume(thread);
+ }
+ }
+ else
+ {
+ pid_struct.pidmap[lwp_to_pid(lwp)] = RT_NULL;
+ rt_free(lwp);
+ }
+ }
+
+ rt_hw_interrupt_enable(level);
+}
+
+void lwp_ref_inc(struct rt_lwp *lwp)
+{
+ rt_base_t level;
+
+ level = rt_hw_interrupt_disable();
+ lwp->ref++;
+ rt_hw_interrupt_enable(level);
+}
+
+void lwp_ref_dec(struct rt_lwp *lwp)
+{
+ rt_base_t level;
+ int ref;
+
+ level = rt_hw_interrupt_disable();
+ if (lwp->ref)
+ {
+ lwp->ref--;
+ ref = lwp->ref;
+ if (!ref)
+ {
+#ifdef RT_USING_GDBSERVER
+ struct rt_channel_msg msg;
+
+ if (lwp->debug)
+ {
+ memset(&msg, 0, sizeof msg);
+ rt_raw_channel_send(gdb_get_server_channel(), &msg);
+ }
+#endif
+ lwp_free(lwp);
+ }
+ }
+ rt_hw_interrupt_enable(level);
+}
+
+struct rt_lwp* lwp_from_pid(pid_t pid)
+{
+ return pid_struct.pidmap[pid];
+}
+
+pid_t lwp_to_pid(struct rt_lwp* lwp)
+{
+ return lwp->pid;
+}
+
+char* lwp_pid2name(int32_t pid)
+{
+ struct rt_lwp* lwp;
+ char* process_name = RT_NULL;
+
+ lwp = pid_struct.pidmap[pid];
+ if (lwp)
+ {
+ process_name = strrchr(lwp->cmd, '/');
+ process_name = process_name? process_name + 1: lwp->cmd;
+ }
+ return process_name;
+}
+
+int32_t lwp_name2pid(const char* name)
+{
+ uint32_t pid;
+ rt_thread_t main_thread;
+ char* process_name = RT_NULL;
+ struct rt_lwp* lwp = RT_NULL;
+
+ for (pid=0; pidcmd, '/');
+ process_name = process_name? process_name + 1: lwp->cmd;
+ if (!rt_strncmp(name, process_name, RT_NAME_MAX))
+ {
+ main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling);
+ if (!(main_thread->stat & RT_THREAD_CLOSE))
+ {
+ return pid;
+ }
+ }
+ }
+ }
+ return -1;
+}
+
+int lwp_getpid(void)
+{
+ return ((struct rt_lwp *)rt_thread_self()->lwp)->pid;
+}
+
+pid_t waitpid(pid_t pid, int *status, int options)
+{
+ pid_t ret = -1;
+ rt_base_t level;
+ struct rt_thread *thread;
+ struct rt_lwp *lwp;
+ struct rt_lwp *lwp_self;
+
+ level = rt_hw_interrupt_disable();
+ lwp = lwp_from_pid(pid);
+ if (!lwp)
+ {
+ goto quit;
+ }
+
+ lwp_self = (struct rt_lwp*)rt_thread_self()->lwp;
+ if (!lwp_self)
+ {
+ goto quit;
+ }
+ if (lwp->parent != lwp_self)
+ {
+ goto quit;
+ }
+
+ if (lwp->finish)
+ {
+ ret = pid;
+ }
+ else
+ {
+ if (!rt_list_isempty(&lwp->wait_list))
+ {
+ goto quit;
+ }
+ thread = rt_thread_self();
+ rt_thread_suspend_with_flag(thread, RT_UNINTERRUPTIBLE);
+ rt_list_insert_before(&lwp->wait_list, &(thread->tlist));
+ rt_schedule();
+ if (thread->error == RT_EOK)
+ {
+ ret = pid;
+ }
+ }
+
+ if (ret != -1)
+ {
+ struct rt_lwp **lwp_node;
+
+ *status = lwp->lwp_ret;
+ lwp_node = &lwp_self->first_child;
+ while (*lwp_node != lwp)
+ {
+ RT_ASSERT(*lwp_node != RT_NULL);
+ lwp_node = &(*lwp_node)->sibling;
+ }
+ (*lwp_node) = lwp->sibling;
+
+ pid_struct.pidmap[pid] = RT_NULL;
+ rt_free(lwp);
+ }
+
+quit:
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
+
+#ifdef RT_USING_FINSH
+/* copy from components/finsh/cmd.c */
+static void object_split(int len)
+{
+ while (len--) rt_kprintf("-");
+}
+
+static void print_thread_info(struct rt_thread* thread, int maxlen)
+{
+ rt_uint8_t *ptr;
+ rt_uint8_t stat;
+
+#ifdef RT_USING_SMP
+ if (thread->oncpu != RT_CPU_DETACHED)
+ rt_kprintf("%-*.*s %3d %3d ", maxlen, RT_NAME_MAX, thread->name, thread->oncpu, thread->current_priority);
+ else
+ rt_kprintf("%-*.*s N/A %3d ", maxlen, RT_NAME_MAX, thread->name, thread->current_priority);
+#else
+ rt_kprintf("%-*.*s %3d ", maxlen, RT_NAME_MAX, thread->name, thread->current_priority);
+#endif /*RT_USING_SMP*/
+
+ stat = (thread->stat & RT_THREAD_STAT_MASK);
+ if (stat == RT_THREAD_READY) rt_kprintf(" ready ");
+ else if ((stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK) rt_kprintf(" suspend");
+ else if (stat == RT_THREAD_INIT) rt_kprintf(" init ");
+ else if (stat == RT_THREAD_CLOSE) rt_kprintf(" close ");
+ else if (stat == RT_THREAD_RUNNING) rt_kprintf(" running");
+
+#if defined(ARCH_CPU_STACK_GROWS_UPWARD)
+ ptr = (rt_uint8_t *)thread->stack_addr + thread->stack_size;
+ while (*ptr == '#')ptr --;
+
+ rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n",
+ ((rt_uint32_t)thread->sp - (rt_uint32_t)thread->stack_addr),
+ thread->stack_size,
+ ((rt_uint32_t)ptr - (rt_uint32_t)thread->stack_addr) * 100 / thread->stack_size,
+ thread->remaining_tick,
+ thread->error);
+#else
+ ptr = (rt_uint8_t *)thread->stack_addr;
+ while (*ptr == '#')ptr ++;
+
+ rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n",
+ (thread->stack_size + (rt_uint32_t)thread->stack_addr - (rt_uint32_t)thread->sp),
+ thread->stack_size,
+ (thread->stack_size + (rt_uint32_t)thread->stack_addr - (rt_uint32_t) ptr) * 100
+ / thread->stack_size,
+ thread->remaining_tick,
+ thread->error);
+#endif
+}
+
+long list_process(void)
+{
+ int index;
+ int maxlen;
+ rt_ubase_t level;
+ struct rt_lwp* lwp = RT_NULL;
+ struct rt_thread *thread;
+ struct rt_list_node *node, *list;
+ const char *item_title = "thread";
+
+ int count = 0;
+ struct rt_thread **threads;
+
+ maxlen = RT_NAME_MAX;
+#ifdef RT_USING_SMP
+ rt_kprintf("%-*.s %-*.s %-*.s cpu pri status sp stack size max used left tick error\n", 4, "PID", maxlen, "CMD", maxlen, item_title);
+ object_split(4);rt_kprintf(" ");object_split(maxlen);rt_kprintf(" ");object_split(maxlen);rt_kprintf(" ");
+ rt_kprintf( "--- --- ------- ---------- ---------- ------ ---------- ---\n");
+#else
+ rt_kprintf("%-*.s %-*.s %-*.s pri status sp stack size max used left tick error\n", 4, "PID", maxlen, "CMD", maxlen, item_title);
+ object_split(4);rt_kprintf(" ");object_split(maxlen);rt_kprintf(" ");object_split(maxlen);rt_kprintf(" ");
+ rt_kprintf( "--- ------- ---------- ---------- ------ ---------- ---\n");
+#endif /*RT_USING_SMP*/
+
+ count = rt_object_get_length(RT_Object_Class_Thread);
+ if (count > 0)
+ {
+ /* get thread pointers */
+ threads = (struct rt_thread **)rt_calloc(count, sizeof(struct rt_thread*));
+ if (threads)
+ {
+ index = rt_object_get_pointers(RT_Object_Class_Thread, (rt_object_t *)threads, count);
+
+ if (index > 0)
+ {
+ for (index = 0; index type & ~RT_Object_Class_Static) != RT_Object_Class_Thread)
+ {
+ rt_hw_interrupt_enable(level);
+ continue;
+ }
+
+ rt_memcpy(&th, thread, sizeof(struct rt_thread));
+ rt_hw_interrupt_enable(level);
+
+
+ if (th.lwp == RT_NULL)
+ {
+ rt_kprintf(" %-*.*s ", maxlen, RT_NAME_MAX, "kernel");
+ print_thread_info(&th, maxlen);
+ }
+ }
+ }
+ rt_free(threads);
+ }
+ }
+
+ for (index=0; indext_grp;
+ for (node = list->next; node != list; node = node->next)
+ {
+ thread = rt_list_entry(node, struct rt_thread, sibling);
+ rt_kprintf("%4d %-*.*s ", lwp_to_pid(lwp), maxlen, RT_NAME_MAX, lwp->cmd);
+ print_thread_info(thread, maxlen);
+ }
+ }
+ }
+ return 0;
+}
+MSH_CMD_EXPORT(list_process, list process);
+
+static void cmd_kill(int argc, char** argv)
+{
+ int pid;
+ int sig = 0;
+
+ if (argc < 2)
+ {
+ rt_kprintf("kill pid or kill pid -s signal\n");
+ return;
+ }
+
+ pid = atoi(argv[1]);
+ if (argc >= 4)
+ {
+ if (argv[2][0] == '-' && argv[2][1] == 's')
+ {
+ sig = atoi(argv[3]);
+ }
+ }
+ lwp_kill(pid, sig);
+}
+MSH_CMD_EXPORT_ALIAS(cmd_kill, kill, send a signal to a process);
+
+static void cmd_killall(int argc, char** argv)
+{
+ int pid;
+ if (argc < 2)
+ {
+ rt_kprintf("killall processes_name\n");
+ return;
+ }
+
+ while((pid = lwp_name2pid(argv[1])) >= 0)
+ {
+ lwp_kill(pid, 0);
+ rt_thread_mdelay(100);
+ }
+}
+MSH_CMD_EXPORT_ALIAS(cmd_killall, killall, kill processes by name);
+
+#endif
+
+int lwp_check_exit_request(void)
+{
+ rt_thread_t thread = rt_thread_self();
+ if (!thread->lwp)
+ {
+ return 0;
+ }
+
+ if (thread->exit_request == LWP_EXIT_REQUEST_TRIGGERED)
+ {
+ thread->exit_request = LWP_EXIT_REQUEST_IN_PROCESS;
+ return 1;
+ }
+ return 0;
+}
+
+static int found_thread(struct rt_lwp* lwp, rt_thread_t thread)
+{
+ int found = 0;
+ rt_base_t level;
+ rt_list_t *list;
+
+ level = rt_hw_interrupt_disable();
+ list = lwp->t_grp.next;
+ while (list != &lwp->t_grp)
+ {
+ rt_thread_t iter_thread;
+
+ iter_thread = rt_list_entry(list, struct rt_thread, sibling);
+ if (thread == iter_thread)
+ {
+ found = 1;
+ break;
+ }
+ list = list->next;
+ }
+ rt_hw_interrupt_enable(level);
+ return found;
+}
+
+void lwp_request_thread_exit(rt_thread_t thread_to_exit)
+{
+ rt_thread_t main_thread;
+ rt_base_t level;
+ rt_list_t *list;
+ struct rt_lwp *lwp;
+
+ lwp = lwp_self();
+
+ if ((!thread_to_exit) || (!lwp))
+ {
+ return;
+ }
+
+ level = rt_hw_interrupt_disable();
+
+ main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling);
+ if (thread_to_exit == main_thread)
+ {
+ goto finish;
+ }
+ if ((struct rt_lwp*)thread_to_exit->lwp != lwp)
+ {
+ goto finish;
+ }
+
+ for (list = lwp->t_grp.next; list != &lwp->t_grp; list = list->next)
+ {
+ rt_thread_t thread;
+
+ thread = rt_list_entry(list, struct rt_thread, sibling);
+ if (thread != thread_to_exit)
+ {
+ continue;
+ }
+ if (thread->exit_request == LWP_EXIT_REQUEST_NONE)
+ {
+ thread->exit_request = LWP_EXIT_REQUEST_TRIGGERED;
+ }
+ if ((thread->stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK)
+ {
+ thread->error = RT_EINTR;
+ dsb();
+ rt_thread_wakeup(thread);
+ }
+ break;
+ }
+
+ while (found_thread(lwp, thread_to_exit))
+ {
+ rt_thread_mdelay(10);
+ }
+
+finish:
+ rt_hw_interrupt_enable(level);
+ return;
+}
+
+void lwp_terminate(struct rt_lwp *lwp)
+{
+ rt_base_t level;
+ rt_list_t *list;
+
+ if (!lwp)
+ {
+ /* kernel thread not support */
+ return;
+ }
+
+ level = rt_hw_interrupt_disable();
+ for (list = lwp->t_grp.next; list != &lwp->t_grp; list = list->next)
+ {
+ rt_thread_t thread;
+
+ thread = rt_list_entry(list, struct rt_thread, sibling);
+ if (thread->exit_request == LWP_EXIT_REQUEST_NONE)
+ {
+ thread->exit_request = LWP_EXIT_REQUEST_TRIGGERED;
+ }
+ if ((thread->stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK)
+ {
+ thread->error = RT_EINTR;
+ dsb();
+ rt_thread_wakeup(thread);
+ }
+ }
+ rt_hw_interrupt_enable(level);
+}
+
+void lwp_wait_subthread_exit(void)
+{
+ rt_base_t level;
+ struct rt_lwp *lwp;
+ rt_thread_t thread;
+ rt_thread_t main_thread;
+
+ lwp = lwp_self();
+ if (!lwp) return;
+
+ thread = rt_thread_self();
+ main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling);
+ if (thread != main_thread)
+ {
+ return;
+ }
+
+ while (1)
+ {
+ int subthread_is_terminated;
+
+ level = rt_hw_interrupt_disable();
+ subthread_is_terminated = (int)(thread->sibling.prev == &lwp->t_grp);
+ if (!subthread_is_terminated)
+ {
+ rt_thread_t sub_thread;
+ rt_list_t *list;
+ int all_subthread_in_init = 1;
+
+ /* check all subthread is in init state */
+ for (list = thread->sibling.prev; list != &lwp->t_grp; list = list->prev)
+ {
+
+ sub_thread = rt_list_entry(list, struct rt_thread, sibling);
+ if ((sub_thread->stat & RT_THREAD_STAT_MASK) != RT_THREAD_INIT)
+ {
+ all_subthread_in_init = 0;
+ break;
+ }
+ }
+ if (all_subthread_in_init)
+ {
+ /* delete all subthread */
+ while ((list = thread->sibling.prev) != &lwp->t_grp)
+ {
+ sub_thread = rt_list_entry(list, struct rt_thread, sibling);
+ rt_list_remove(&sub_thread->sibling);
+ rt_thread_delete(sub_thread);
+ }
+ subthread_is_terminated = 1;
+ }
+ }
+ rt_hw_interrupt_enable(level);
+
+ if (subthread_is_terminated)
+ {
+ break;
+ }
+ rt_thread_mdelay(10);
+ }
+}
diff --git a/components/lwp/lwp_pid.h b/components/lwp/lwp_pid.h
new file mode 100644
index 0000000000000000000000000000000000000000..d0161c76da443253e9f0906f323aea0d26bd8036
--- /dev/null
+++ b/components/lwp/lwp_pid.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-02-23 Jesven first version.
+ */
+
+#ifndef LWP_PID_H__
+#define LWP_PID_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct rt_lwp;
+
+struct rt_lwp* lwp_new(void);
+void lwp_free(struct rt_lwp* lwp);
+
+void lwp_ref_inc(struct rt_lwp *lwp);
+void lwp_ref_dec(struct rt_lwp *lwp);
+
+struct rt_lwp* lwp_from_pid(pid_t pid);
+pid_t lwp_to_pid(struct rt_lwp* lwp);
+
+int32_t lwp_name2pid(const char* name);
+char* lwp_pid2name(int32_t pid);
+
+int lwp_getpid(void);
+
+pid_t waitpid(pid_t pid, int *status, int options);
+long list_process(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/lwp/lwp_shm.c b/components/lwp/lwp_shm.c
new file mode 100644
index 0000000000000000000000000000000000000000..022b665877ca92e0e3848a73c60203d96caefd32
--- /dev/null
+++ b/components/lwp/lwp_shm.c
@@ -0,0 +1,368 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-10-12 Jesven first version
+ */
+#include
+#include
+
+#ifdef RT_USING_USERSPACE
+#include
+#include
+
+#include
+#include
+
+/* the kernel structure to represent a share-memory */
+struct lwp_shm_struct
+{
+ size_t addr; /* point to the next item in the free list when not used */
+ size_t size;
+ int ref;
+ size_t key;
+};
+
+static struct lwp_avl_struct *shm_tree_key;
+static struct lwp_avl_struct *shm_tree_pa;
+
+static int shm_free_list = -1; /* the single-direct list of freed items */
+static int shm_id_used = 0; /* the latest allocated item in the array */
+static struct lwp_shm_struct _shm_ary[RT_LWP_SHM_MAX_NR];
+
+/*
+ * Try to allocate an structure 'lwp_shm_struct' from the freed list or the
+ * static array.
+ */
+static int _shm_id_alloc(void)
+{
+ int id = -1;
+
+ if (shm_free_list != -1) /* first try the freed list */
+ {
+ id = shm_free_list;
+ shm_free_list = (int)_shm_ary[shm_free_list].addr; /* single-direction */
+ }
+ else if (shm_id_used < RT_LWP_SHM_MAX_NR) /* then try the array */
+ {
+ id = shm_id_used;
+ shm_id_used++;
+ }
+ return id;
+}
+
+/* Release the item in the static array to the freed list. */
+static void shm_id_free(int id)
+{
+ /* link the freed itme to the single-direction list */
+ _shm_ary[id].addr = (size_t)shm_free_list;
+ shm_free_list = id;
+}
+
+/* Locate the shared memory through 'key' or create a new one. */
+static int _lwp_shmget(size_t key, size_t size, int create)
+{
+ int id = -1;
+ struct lwp_avl_struct *node_key = 0;
+ struct lwp_avl_struct *node_pa = 0;
+ void *page_addr = 0, *page_addr_p;
+ uint32_t bit;
+
+ /* try to locate the item with the key in the binary tree */
+ node_key = lwp_avl_find(key, shm_tree_key);
+ if (node_key)
+ {
+ return (struct lwp_shm_struct*)node_key->data - _shm_ary; /* the index */
+ }
+
+ /* If there doesn't exist such an item and we're allowed to create one ... */
+ if (create)
+ {
+ struct lwp_shm_struct* p;
+
+ if (!size)
+ {
+ goto err;
+ }
+
+ id = _shm_id_alloc();
+ if (id == -1)
+ {
+ goto err;
+ }
+
+ /* allocate pages up to 2's exponent to cover the required size */
+ bit = rt_page_bits(size);
+ page_addr = rt_pages_alloc(bit); /* virtual address */
+ if (!page_addr)
+ {
+ goto err;
+ }
+ page_addr_p = (void*)((char*)page_addr + PV_OFFSET); /* physical address */
+
+ /* initialize the shared memory structure */
+ p = _shm_ary + id;
+ p->addr = (size_t)page_addr_p;
+ p->size = (1UL << (bit + ARCH_PAGE_SHIFT));
+ p->ref = 0;
+ p->key = key;
+
+ /* then insert it into the balancing binary tree */
+ node_key = (struct lwp_avl_struct *)rt_malloc(sizeof(struct lwp_avl_struct) * 2);
+ if (!node_key)
+ {
+ goto err;
+ }
+ node_key->avl_key = p->key;
+ node_key->data = (void*)p;
+ lwp_avl_insert(node_key, &shm_tree_key);
+ node_pa = node_key + 1;
+ node_pa->avl_key = p->addr;
+ node_pa->data = (void*)p;
+ lwp_avl_insert(node_pa, &shm_tree_pa);
+ }
+ return id;
+
+err:
+ if (id != -1)
+ {
+ shm_id_free(id);
+ }
+ if (page_addr)
+ {
+ rt_pages_free(page_addr, bit);
+ }
+ if (node_key)
+ {
+ rt_free(node_key);
+ }
+ return -1;
+}
+
+/* A wrapping function, get the shared memory with interrupts disabled. */
+int lwp_shmget(size_t key, size_t size, int create)
+{
+ int ret;
+ rt_base_t level;
+
+ level= rt_hw_interrupt_disable();
+ ret = _lwp_shmget(key, size, create);
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
+
+/* Locate the binary tree node_key corresponding to the shared-memory id. */
+static struct lwp_avl_struct *shm_id_to_node(int id)
+{
+ struct lwp_avl_struct *node_key = 0;
+ struct lwp_shm_struct *p;
+
+ /* check id */
+ if (id < 0 || id >= RT_LWP_SHM_MAX_NR)
+ {
+ return RT_NULL;
+ }
+
+ p = _shm_ary + id; /* the address of the shared-memory structure */
+ node_key = lwp_avl_find(p->key, shm_tree_key);
+ if (!node_key)
+ {
+ return RT_NULL;
+ }
+ if (node_key->data != (void*)p)
+ {
+ return RT_NULL;
+ }
+ return node_key;
+}
+
+/* Free the shared pages, the shared-memory structure and its binary tree node_key. */
+static int _lwp_shmrm(int id)
+{
+ struct lwp_avl_struct *node_key;
+ struct lwp_avl_struct *node_pa;
+ struct lwp_shm_struct* p;
+ uint32_t bit;
+
+ node_key = shm_id_to_node(id);
+ if (!node_key)
+ {
+ return -1;
+ }
+ p = (struct lwp_shm_struct*)node_key->data;
+ if (p->ref)
+ {
+ return 0;
+ }
+ bit = rt_page_bits(p->size);
+ rt_pages_free((void*)((char*)p->addr - PV_OFFSET), bit);
+ lwp_avl_remove(node_key, &shm_tree_key);
+ node_pa = node_key + 1;
+ lwp_avl_remove(node_pa, &shm_tree_pa);
+ rt_free(node_key);
+ shm_id_free(id);
+ return 0;
+}
+
+/* A wrapping function, free the shared memory with interrupt disabled. */
+int lwp_shmrm(int id)
+{
+ int ret;
+ rt_base_t level;
+
+ level= rt_hw_interrupt_disable();
+ ret = _lwp_shmrm(id);
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
+
+/* Map the shared memory specified by 'id' to the specified virtual address. */
+static void *_lwp_shmat(int id, void *shm_vaddr)
+{
+ struct rt_lwp *lwp;
+ struct lwp_avl_struct *node_key;
+ struct lwp_shm_struct *p;
+ void *va;
+
+ /* The id is used to locate the node_key in the binary tree, and then get the
+ * shared-memory structure linked to the node_key. We don't use the id to refer
+ * to the shared-memory structure directly, because the binary tree is used
+ * to verify the structure is really in use.
+ */
+ node_key = shm_id_to_node(id);
+ if (!node_key)
+ {
+ return RT_NULL;
+ }
+ p = (struct lwp_shm_struct*)node_key->data; /* p = _shm_ary[id]; */
+
+ /* map the shared memory into the address space of the current thread */
+ lwp = (struct rt_lwp *)rt_thread_self()->lwp;
+ if (!lwp)
+ {
+ return RT_NULL;
+ }
+ va = lwp_map_user_phy(lwp, shm_vaddr, (void*)p->addr, p->size, 1);
+ if (va)
+ {
+ p->ref++;
+ }
+ return va;
+}
+
+/* A wrapping function: attach the shared memory to the specified address. */
+void *lwp_shmat(int id, void *shm_vaddr)
+{
+ void *ret;
+ rt_base_t level;
+
+ if (((size_t)shm_vaddr & ARCH_PAGE_MASK) != 0)
+ {
+ return RT_NULL;
+ }
+ level= rt_hw_interrupt_disable();
+ ret = _lwp_shmat(id, shm_vaddr);
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
+
+/* Unmap the shared memory from the address space of the current thread. */
+int _lwp_shmdt(void *shm_vaddr)
+{
+ struct rt_lwp *lwp;
+ void *pa;
+ struct lwp_avl_struct *node_pa;
+ struct lwp_shm_struct* p;
+
+ lwp = (struct rt_lwp*)rt_thread_self()->lwp;
+ if (!lwp)
+ {
+ return -1;
+ }
+ pa = rt_hw_mmu_v2p(&lwp->mmu_info, shm_vaddr); /* physical memory */
+
+ node_pa = lwp_avl_find((size_t)pa, shm_tree_pa);
+ if (!node_pa)
+ {
+ return -1;
+ }
+ p = (struct lwp_shm_struct*)node_pa->data;
+ if (!p->ref)
+ {
+ return -1;
+ }
+ p->ref--;
+
+ lwp_unmap_user_phy(lwp, shm_vaddr, p->size);
+ return 0;
+}
+
+/* A wrapping function: detach the mapped shared memory. */
+int lwp_shmdt(void *shm_vaddr)
+{
+ int ret;
+ rt_base_t level;
+
+ level = rt_hw_interrupt_disable();
+ ret = _lwp_shmdt(shm_vaddr);
+ rt_hw_interrupt_enable(level);
+
+ return ret;
+}
+
+/* Get the virtual address of a shared memory in kernel. */
+void *_lwp_shminfo(int id)
+{
+ struct lwp_avl_struct *node_key;
+ struct lwp_shm_struct *p;
+
+ /* the share memory is in use only if it exsits in the binary tree */
+ node_key = shm_id_to_node(id);
+ if (!node_key)
+ {
+ return RT_NULL;
+ }
+ p = (struct lwp_shm_struct*)node_key->data; /* p = _shm_ary[id]; */
+
+ return (void*)((char*)p->addr - PV_OFFSET); /* get the virtual address */
+}
+
+/* A wrapping function: get the virtual address of a shared memory. */
+void *lwp_shminfo(int id)
+{
+ void *vaddr;
+ rt_base_t level;
+
+ level = rt_hw_interrupt_disable();
+ vaddr = _lwp_shminfo(id);
+ rt_hw_interrupt_enable(level);
+ return vaddr;
+}
+
+#ifdef RT_USING_FINSH
+static void _shm_info(struct lwp_avl_struct* node_key, void *data)
+{
+ int id;
+ struct lwp_shm_struct* p = (struct lwp_shm_struct*)node_key->data;
+
+ id = p - _shm_ary;
+ rt_kprintf("0x%08x 0x%08x 0x%08x %8d\n", p->key, p->addr, p->size, id);
+}
+
+void list_shm(void)
+{
+ rt_base_t level;
+
+ rt_kprintf(" key paddr size id\n");
+ rt_kprintf("---------- ---------- ---------- --------\n");
+ level = rt_hw_interrupt_disable();
+ lwp_avl_traversal(shm_tree_key, _shm_info, NULL);
+ rt_hw_interrupt_enable(level);
+}
+MSH_CMD_EXPORT(list_shm, show share memory info);
+#endif
+
+#endif
diff --git a/components/lwp/lwp_shm.h b/components/lwp/lwp_shm.h
new file mode 100644
index 0000000000000000000000000000000000000000..9789681e474ddbeb07216633532399843dfd2434
--- /dev/null
+++ b/components/lwp/lwp_shm.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-10-12 Jesven first version
+ */
+#ifndef __LWP_SHM_H__
+#define __LWP_SHM_H__
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int lwp_shmget(size_t key, size_t size, int create);
+int lwp_shmrm(int id);
+void* lwp_shmat(int id, void* shm_vaddr);
+int lwp_shmdt(void* shm_vaddr);
+void *lwp_shminfo(int id);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__LWP_SHM_H__*/
diff --git a/components/lwp/lwp_signal.c b/components/lwp/lwp_signal.c
new file mode 100644
index 0000000000000000000000000000000000000000..6b62f48bfa277370996239b72802b925ee7b13e8
--- /dev/null
+++ b/components/lwp/lwp_signal.c
@@ -0,0 +1,593 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-11-12 Jesven first version
+ */
+
+#include
+#include
+
+#include "lwp.h"
+#include "lwp_arch.h"
+#include "signal.h"
+
+rt_inline void lwp_sigaddset(lwp_sigset_t *set, int _sig)
+{
+ unsigned long sig = _sig - 1;
+
+ if (_LWP_NSIG_WORDS == 1)
+ {
+ set->sig[0] |= 1UL << sig;
+ }
+ else
+ {
+ set->sig[sig / _LWP_NSIG_BPW] |= 1UL << (sig % _LWP_NSIG_BPW);
+ }
+}
+
+rt_inline void lwp_sigdelset(lwp_sigset_t *set, int _sig)
+{
+ unsigned long sig = _sig - 1;
+
+ if (_LWP_NSIG_WORDS == 1)
+ {
+ set->sig[0] &= ~(1UL << sig);
+ }
+ else
+ {
+ set->sig[sig / _LWP_NSIG_BPW] &= ~(1UL << (sig % _LWP_NSIG_BPW));
+ }
+}
+
+rt_inline int lwp_sigisemptyset(lwp_sigset_t *set)
+{
+ switch (_LWP_NSIG_WORDS)
+ {
+ case 4:
+ return (set->sig[3] | set->sig[2] |
+ set->sig[1] | set->sig[0]) == 0;
+ case 2:
+ return (set->sig[1] | set->sig[0]) == 0;
+ case 1:
+ return set->sig[0] == 0;
+ default:
+ return 1;
+ }
+}
+
+rt_inline int lwp_sigismember(lwp_sigset_t *set, int _sig)
+{
+ unsigned long sig = _sig - 1;
+
+ if (_LWP_NSIG_WORDS == 1)
+ {
+ return 1 & (set->sig[0] >> sig);
+ }
+ else
+ {
+ return 1 & (set->sig[sig / _LWP_NSIG_BPW] >> (sig % _LWP_NSIG_BPW));
+ }
+}
+
+rt_inline int next_signal(lwp_sigset_t *pending, lwp_sigset_t *mask)
+{
+ unsigned long i, *s, *m, x;
+ int sig = 0;
+
+ s = pending->sig;
+ m = mask->sig;
+
+ x = *s & ~*m;
+ if (x)
+ {
+ sig = ffz(~x) + 1;
+ return sig;
+ }
+
+ switch (_LWP_NSIG_WORDS)
+ {
+ default:
+ for (i = 1; i < _LWP_NSIG_WORDS; ++i)
+ {
+ x = *++s &~ *++m;
+ if (!x)
+ continue;
+ sig = ffz(~x) + i*_LWP_NSIG_BPW + 1;
+ break;
+ }
+ break;
+
+ case 2:
+ x = s[1] &~ m[1];
+ if (!x)
+ break;
+ sig = ffz(~x) + _LWP_NSIG_BPW + 1;
+ break;
+
+ case 1:
+ /* Nothing to do */
+ break;
+ }
+
+ return sig;
+}
+
+int lwp_suspend_sigcheck(rt_thread_t thread, int suspend_flag)
+{
+ struct rt_lwp *lwp = (struct rt_lwp*)thread->lwp;
+ int ret = 0;
+
+ switch (suspend_flag)
+ {
+ case RT_INTERRUPTIBLE:
+ if (!lwp_sigisemptyset(&thread->signal))
+ {
+ break;
+ }
+ if (thread->lwp && !lwp_sigisemptyset(&lwp->signal))
+ {
+ break;
+ }
+ ret = 1;
+ break;
+ case RT_KILLABLE:
+ if (lwp_sigismember(&thread->signal, SIGKILL))
+ {
+ break;
+ }
+ if (thread->lwp && lwp_sigismember(&thread->signal, SIGKILL))
+ {
+ break;
+ }
+ ret = 1;
+ break;
+ case RT_UNINTERRUPTIBLE:
+ ret = 1;
+ break;
+ default:
+ RT_ASSERT(0);
+ break;
+ }
+ return ret;
+}
+
+int lwp_signal_check(void)
+{
+ rt_base_t level;
+ struct rt_thread *thread;
+ struct rt_lwp *lwp;
+ uint32_t have_signal = 0;
+
+ level = rt_hw_interrupt_disable();
+
+ thread = rt_thread_self();
+
+ if (thread->signal_in_process)
+ {
+ goto out;
+ }
+
+ lwp = (struct rt_lwp*)thread->lwp;
+
+ if (lwp->signal_in_process)
+ {
+ goto out;
+ }
+
+ have_signal = !lwp_sigisemptyset(&thread->signal);
+ if (have_signal)
+ {
+ thread->signal_in_process = 1;
+ goto out;
+ }
+ have_signal = !lwp_sigisemptyset(&lwp->signal);
+ if (have_signal)
+ {
+ lwp->signal_in_process = 1;
+ }
+out:
+ rt_hw_interrupt_enable(level);
+ return have_signal;
+}
+
+int lwp_signal_backup(void *user_sp, void *user_pc, void* user_flag)
+{
+ rt_base_t level;
+ struct rt_thread *thread;
+ struct rt_lwp *lwp;
+ int signal;
+
+ level = rt_hw_interrupt_disable();
+ thread = rt_thread_self();
+ if (thread->signal_in_process)
+ {
+ thread->user_ctx.sp = user_sp;
+ thread->user_ctx.pc = user_pc;
+ thread->user_ctx.flag = user_flag;
+
+ signal = next_signal(&thread->signal, &thread->signal_mask);
+ RT_ASSERT(signal != 0);
+ lwp_sigaddset(&thread->signal_mask, signal);
+ thread->signal_mask_bak = signal;
+ lwp_sigdelset(&thread->signal, signal);
+ }
+ else
+ {
+ lwp = (struct rt_lwp*)thread->lwp;
+ lwp->user_ctx.sp = user_sp;
+ lwp->user_ctx.pc = user_pc;
+ lwp->user_ctx.flag = user_flag;
+
+ signal = next_signal(&lwp->signal, &lwp->signal_mask);
+ RT_ASSERT(signal != 0);
+ lwp_sigaddset(&lwp->signal_mask, signal);
+ lwp->signal_mask_bak = signal;
+ lwp_sigdelset(&lwp->signal, signal);
+ }
+ rt_hw_interrupt_enable(level);
+ return signal;
+}
+
+struct rt_user_context *lwp_signal_restore(void)
+{
+ rt_base_t level;
+ struct rt_thread *thread;
+ struct rt_lwp *lwp;
+ struct rt_user_context *ctx;
+
+ level = rt_hw_interrupt_disable();
+ thread = rt_thread_self();
+ if (thread->signal_in_process)
+ {
+ ctx = &thread->user_ctx;
+ thread->signal_in_process = 0;
+
+ lwp_sigdelset(&thread->signal_mask, thread->signal_mask_bak);
+ thread->signal_mask_bak = 0;
+ }
+ else
+ {
+ lwp = (struct rt_lwp*)thread->lwp;
+ ctx = &lwp->user_ctx;
+ RT_ASSERT(lwp->signal_in_process != 0);
+ lwp->signal_in_process = 0;
+
+ lwp_sigdelset(&lwp->signal_mask, lwp->signal_mask_bak);
+ lwp->signal_mask_bak = 0;
+ }
+ rt_hw_interrupt_enable(level);
+ return ctx;
+}
+
+rt_inline int _lwp_check_ignore(int sig)
+{
+ if (sig == SIGCHLD || sig == SIGCONT)
+ {
+ return 1;
+ }
+ return 0;
+}
+
+void sys_exit(int value);
+lwp_sighandler_t lwp_sighandler_get(int sig)
+{
+ lwp_sighandler_t func = RT_NULL;
+ struct rt_lwp *lwp;
+ rt_thread_t thread;
+ rt_base_t level;
+
+ if (sig == 0 || sig > _LWP_NSIG)
+ return func;
+ level = rt_hw_interrupt_disable();
+ thread = rt_thread_self();
+ if (thread->signal_in_process)
+ {
+ func = rt_thread_self()->signal_handler[sig - 1];
+ if (!func)
+ {
+ if (_lwp_check_ignore(sig))
+ {
+ goto out;
+ }
+ sys_exit(0);
+ }
+ }
+ else
+ {
+ lwp = (struct rt_lwp*)thread->lwp;
+ func = lwp->signal_handler[sig - 1];
+ if (!func)
+ {
+ if (_lwp_check_ignore(sig))
+ {
+ goto out;
+ }
+ lwp_terminate(lwp);
+ sys_exit(0);
+ }
+ }
+out:
+ rt_hw_interrupt_enable(level);
+ return func;
+}
+
+void lwp_sighandler_set(int sig, lwp_sighandler_t func)
+{
+ rt_base_t level;
+
+ if (sig == 0 || sig > _LWP_NSIG)
+ return;
+ if (sig == SIGKILL || sig == SIGSTOP)
+ return;
+ level = rt_hw_interrupt_disable();
+ ((struct rt_lwp*)rt_thread_self()->lwp)->signal_handler[sig - 1] = func;
+ rt_hw_interrupt_enable(level);
+}
+
+void lwp_thread_sighandler_set(int sig, lwp_sighandler_t func)
+{
+ rt_base_t level;
+
+ if (sig == 0 || sig > _LWP_NSIG)
+ return;
+ if (sig == SIGKILL || sig == SIGSTOP)
+ return;
+ level = rt_hw_interrupt_disable();
+ rt_thread_self()->signal_handler[sig - 1] = func;
+ rt_hw_interrupt_enable(level);
+}
+
+int lwp_sigaction(int sig, const struct lwp_sigaction *act,
+ struct lwp_sigaction *oact, size_t sigsetsize)
+{
+ rt_base_t level;
+ struct rt_lwp *lwp;
+ int ret = -RT_EINVAL;
+ lwp_sigset_t newset;
+
+ level = rt_hw_interrupt_disable();
+ lwp = (struct rt_lwp*)rt_thread_self()->lwp;
+ if (!lwp)
+ {
+ goto out;
+ }
+ if (sigsetsize != sizeof(lwp_sigset_t))
+ {
+ goto out;
+ }
+ if (!act && !oact)
+ {
+ goto out;
+ }
+ if (oact)
+ {
+ oact->sa_mask = lwp->signal_mask;
+ oact->sa_flags = 0;
+ oact->sa_restorer = RT_NULL;
+ oact->__sa_handler._sa_handler = lwp->signal_handler[sig - 1];
+ }
+ if (act)
+ {
+ newset = act->sa_mask;
+ lwp_sigdelset(&newset, SIGKILL);
+ lwp_sigdelset(&newset, SIGSTOP);
+ lwp->signal_mask = newset;
+ lwp_sighandler_set(sig, act->__sa_handler._sa_handler);
+ }
+ ret = 0;
+out:
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
+
+rt_inline void sigorsets(lwp_sigset_t *dset, const lwp_sigset_t *set0, const lwp_sigset_t *set1)
+{
+ switch (_LWP_NSIG_WORDS)
+ {
+ case 4:
+ dset->sig[3] = set0->sig[3] | set1->sig[3];
+ dset->sig[2] = set0->sig[2] | set1->sig[2];
+ case 2:
+ dset->sig[1] = set0->sig[1] | set1->sig[1];
+ case 1:
+ dset->sig[0] = set0->sig[0] | set1->sig[0];
+ default:
+ return;
+ }
+}
+
+rt_inline void sigandsets(lwp_sigset_t *dset, const lwp_sigset_t *set0, const lwp_sigset_t *set1)
+{
+ switch (_LWP_NSIG_WORDS)
+ {
+ case 4:
+ dset->sig[3] = set0->sig[3] & set1->sig[3];
+ dset->sig[2] = set0->sig[2] & set1->sig[2];
+ case 2:
+ dset->sig[1] = set0->sig[1] & set1->sig[1];
+ case 1:
+ dset->sig[0] = set0->sig[0] & set1->sig[0];
+ default:
+ return;
+ }
+}
+
+int lwp_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset)
+{
+ int ret = -1;
+ rt_base_t level;
+ struct rt_lwp *lwp;
+ struct rt_thread *thread;
+ lwp_sigset_t newset;
+
+ level = rt_hw_interrupt_disable();
+
+ thread = rt_thread_self();
+ lwp = (struct rt_lwp*)thread->lwp;
+ if (!lwp)
+ {
+ goto out;
+ }
+ if (oset)
+ {
+ rt_memcpy(oset, &lwp->signal_mask, sizeof(lwp_sigset_t));
+ }
+
+ if (sigset)
+ {
+ switch (how)
+ {
+ case SIG_BLOCK:
+ sigorsets(&newset, &lwp->signal_mask, sigset);
+ break;
+ case SIG_UNBLOCK:
+ sigandsets(&newset, &lwp->signal_mask, sigset);
+ break;
+ case SIG_SETMASK:
+ newset = *sigset;
+ break;
+ default:
+ ret = RT_EINVAL;
+ goto out;
+ }
+
+ lwp_sigdelset(&newset, SIGKILL);
+ lwp_sigdelset(&newset, SIGSTOP);
+
+ lwp->signal_mask = newset;
+ }
+ ret = 0;
+out:
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
+
+int lwp_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset)
+{
+ rt_base_t level;
+ struct rt_thread *thread;
+ lwp_sigset_t newset;
+
+ level = rt_hw_interrupt_disable();
+ thread = rt_thread_self();
+
+ if (oset)
+ {
+ rt_memcpy(oset, &thread->signal_mask, sizeof(lwp_sigset_t));
+ }
+
+ if (sigset)
+ {
+ switch (how)
+ {
+ case SIG_BLOCK:
+ sigorsets(&newset, &thread->signal_mask, sigset);
+ break;
+ case SIG_UNBLOCK:
+ sigandsets(&newset, &thread->signal_mask, sigset);
+ break;
+ case SIG_SETMASK:
+ newset = *sigset;
+ break;
+ default:
+ goto out;
+ }
+
+ lwp_sigdelset(&newset, SIGKILL);
+ lwp_sigdelset(&newset, SIGSTOP);
+
+ thread->signal_mask = newset;
+ }
+out:
+ rt_hw_interrupt_enable(level);
+ return 0;
+}
+
+static void _do_signal_wakeup(rt_thread_t thread, int sig)
+{
+ if ((thread->stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK)
+ {
+ int need_schedule = 1;
+
+ if ((thread->stat & RT_SIGNAL_COMMON_WAKEUP_MASK) != RT_SIGNAL_COMMON_WAKEUP_MASK)
+ {
+ rt_thread_wakeup(thread);
+ }
+ else if ((sig == SIGKILL) && ((thread->stat & RT_SIGNAL_KILL_WAKEUP_MASK) != RT_SIGNAL_KILL_WAKEUP_MASK))
+ {
+ rt_thread_wakeup(thread);
+ }
+ else
+ {
+ need_schedule = 0;
+ }
+
+ /* do schedule */
+ if (need_schedule)
+ {
+ rt_schedule();
+ }
+ }
+}
+
+int lwp_kill(pid_t pid, int sig)
+{
+ rt_base_t level;
+ struct rt_lwp *lwp;
+ int ret = -RT_EINVAL;
+ rt_thread_t thread;
+
+ if (sig == 0 || sig > _LWP_NSIG)
+ return ret;
+ level = rt_hw_interrupt_disable();
+ lwp = lwp_from_pid(pid);
+ if (!lwp)
+ {
+ goto out;
+ }
+
+ /* check main thread */
+ thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling);
+ if (lwp_sigismember(&lwp->signal_mask, sig)) /* if signal masked */
+ {
+ goto out;
+ }
+
+ lwp_sigaddset(&lwp->signal, sig);
+ _do_signal_wakeup(thread, sig);
+ ret = 0;
+out:
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
+
+int lwp_thread_kill(rt_thread_t thread, int sig)
+{
+ rt_base_t level;
+ int ret = -RT_EINVAL;
+
+ if (!thread) return ret;
+
+ if (sig == 0 || sig > _LWP_NSIG)
+ return ret;
+ level = rt_hw_interrupt_disable();
+ if (!thread->lwp)
+ {
+ goto out;
+ }
+ if (lwp_sigismember(&thread->signal_mask, sig)) /* if signal masked */
+ {
+ goto out;
+ }
+
+ lwp_sigaddset(&thread->signal, sig);
+ _do_signal_wakeup(thread, sig);
+ ret = 0;
+out:
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
diff --git a/components/lwp/lwp_signal.h b/components/lwp/lwp_signal.h
new file mode 100644
index 0000000000000000000000000000000000000000..27e24adbf3a5016de9a44f29875a001079339e32
--- /dev/null
+++ b/components/lwp/lwp_signal.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-02-23 Jesven first version.
+ */
+
+#ifndef LWP_SIGNAL_H__
+#define LWP_SIGNAL_H__
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int lwp_signal_check(void);
+int lwp_signal_backup(void *user_sp, void *user_pc, void* user_flag);
+struct rt_user_context *lwp_signal_restore(void);
+lwp_sighandler_t lwp_sighandler_get(int sig);
+void lwp_sighandler_set(int sig, lwp_sighandler_t func);
+int lwp_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset);
+void lwp_thread_sighandler_set(int sig, lwp_sighandler_t func);
+int lwp_sigaction(int sig, const struct lwp_sigaction *act, struct lwp_sigaction * oact, size_t sigsetsize);
+int lwp_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset);
+
+int lwp_kill(pid_t pid, int sig);
+int lwp_thread_kill(rt_thread_t thread, int sig);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c
index be95c5fb896f000505614b05beb0788023ee6bfe..b16bff284ba4dd616dfaaab31c24019d97cdaa49 100644
--- a/components/lwp/lwp_syscall.c
+++ b/components/lwp/lwp_syscall.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -9,63 +9,430 @@
*/
/* RT-Thread System call */
+#include
+#include
+
#include
-#include
-#include
+#ifdef RT_USING_USERSPACE
+#include
+#endif
+#ifdef RT_USING_DFS
#include
+#include
#include
+#endif
#if (defined(RT_USING_SAL) && defined(SAL_USING_POSIX))
#include
-#define SYSCALL_NET(f) ((void*)(f))
+#define SYSCALL_NET(f) ((void*)(f))
+#else
+#define SYSCALL_NET(f) ((void*)sys_notimpl)
+#endif
+
+#if defined(RT_USING_DFS) && defined(RT_USING_USERSPACE)
+#define SYSCALL_USPACE(f) ((void*)(f))
#else
-#define SYSCALL_NET(f) ((void*)sys_notimpl)
+#define SYSCALL_USPACE(f) ((void*)sys_notimpl)
#endif
-#define DBG_TAG "LWP_CALL"
-#define DBG_LVL DBG_WARNING
+#define DBG_TAG "SYSCALL"
+#define DBG_LVL DBG_INFO
#include
-static void __exit_files(rt_thread_t tid)
+#ifdef RT_USING_SAL
+#include
+#include
+
+#include
+#include
+#endif /* RT_USING_SAL */
+
+#include "lwp_ipc_internal.h"
+
+#define ALLOC_KERNEL_STACK_SIZE 5120
+
+struct musl_sockaddr
{
- struct rt_lwp *lwp;
+ uint16_t sa_family;
+ char sa_data[14];
+};
+
+extern void lwp_user_entry(void *args, const void *text, void *data, void *user_stack);
+extern void set_user_context(void *stack);
+
+void lwp_cleanup(struct rt_thread *tid);
+
+#ifdef RT_USING_USERSPACE
+static void *kmem_get(size_t size)
+{
+ return rt_malloc(size);
+}
+
+static void kmem_put(void *kptr)
+{
+ rt_free(kptr);
+}
+#endif
+
+/* The same socket option is defined differently in the user interfaces and the
+ * implementation. The options should be converted in the kernel. */
+
+/* socket levels */
+#define INTF_SOL_SOCKET 1
+#define IMPL_SOL_SOCKET 0xFFF
+
+#define INTF_IPPROTO_IP 0
+#define IMPL_IPPROTO_IP 0
+
+#define INTF_IPPROTO_TCP 6
+#define IMPL_IPPROTO_TCP 6
+
+#define INTF_IPPROTO_IPV6 41
+#define IMPL_IPPROTO_IPV6 41
+
+/* SOL_SOCKET option names */
+#define INTF_SO_BROADCAST 6
+#define INTF_SO_KEEPALIVE 9
+#define INTF_SO_REUSEADDR 2
+#define INTF_SO_TYPE 3
+#define INTF_SO_ERROR 4
+#define INTF_SO_SNDTIMEO 21
+#define INTF_SO_RCVTIMEO 20
+#define INTF_SO_RCVBUF 8
+#define INTF_SO_LINGER 13
+#define INTF_SO_NO_CHECK 11
+#define INTF_SO_ACCEPTCONN 30
+#define INTF_SO_DONTROUTE 5
+#define INTF_SO_OOBINLINE 10
+#define INTF_SO_REUSEPORT 15
+#define INTF_SO_SNDBUF 7
+#define INTF_SO_SNDLOWAT 19
+#define INTF_SO_RCVLOWAT 18
+
+#define IMPL_SO_BROADCAST 0x0020
+#define IMPL_SO_KEEPALIVE 0x0008
+#define IMPL_SO_REUSEADDR 0x0004
+#define IMPL_SO_TYPE 0x1008
+#define IMPL_SO_ERROR 0x1007
+#define IMPL_SO_SNDTIMEO 0x1005
+#define IMPL_SO_RCVTIMEO 0x1006
+#define IMPL_SO_RCVBUF 0x1002
+#define IMPL_SO_LINGER 0x0080
+#define IMPL_SO_NO_CHECK 0x100a
+#define IMPL_SO_ACCEPTCONN 0x0002
+#define IMPL_SO_DONTROUTE 0x0010
+#define IMPL_SO_OOBINLINE 0x0100
+#define IMPL_SO_REUSEPORT 0x0200
+#define IMPL_SO_SNDBUF 0x1001
+#define IMPL_SO_SNDLOWAT 0x1003
+#define IMPL_SO_RCVLOWAT 0x1004
+
+/* IPPROTO_IP option names */
+#define INTF_IP_TTL 2
+#define INTF_IP_TOS 1
+#define INTF_IP_MULTICAST_TTL 33
+#define INTF_IP_MULTICAST_IF 32
+#define INTF_IP_MULTICAST_LOOP 34
+#define INTF_IP_ADD_MEMBERSHIP 35
+#define INTF_IP_DROP_MEMBERSHIP 36
+
+#define IMPL_IP_TTL 2
+#define IMPL_IP_TOS 1
+#define IMPL_IP_MULTICAST_TTL 5
+#define IMPL_IP_MULTICAST_IF 6
+#define IMPL_IP_MULTICAST_LOOP 7
+#define IMPL_IP_ADD_MEMBERSHIP 3
+#define IMPL_IP_DROP_MEMBERSHIP 4
+
+/* IPPROTO_TCP option names */
+#define INTF_TCP_NODELAY 1
+#define INTF_TCP_KEEPALIVE 9
+#define INTF_TCP_KEEPIDLE 4
+#define INTF_TCP_KEEPINTVL 5
+#define INTF_TCP_KEEPCNT 6
+
+#define IMPL_TCP_NODELAY 0x01
+#define IMPL_TCP_KEEPALIVE 0x02
+#define IMPL_TCP_KEEPIDLE 0x03
+#define IMPL_TCP_KEEPINTVL 0x04
+#define IMPL_TCP_KEEPCNT 0x05
+
+/* IPPROTO_IPV6 option names */
+#define INTF_IPV6_V6ONLY 26
+#define IMPL_IPV6_V6ONLY 27
+
+static void convert_sockopt(int *level, int *optname)
+{
+ if (*level == INTF_SOL_SOCKET)
+ {
+ *level = IMPL_SOL_SOCKET;
+
+ switch (*optname)
+ {
+ case INTF_SO_REUSEADDR:
+ *optname = IMPL_SO_REUSEADDR;
+ break;
+ case INTF_SO_KEEPALIVE:
+ *optname = IMPL_SO_KEEPALIVE;
+ break;
+ case INTF_SO_BROADCAST:
+ *optname = IMPL_SO_BROADCAST;
+ break;
+ case INTF_SO_ACCEPTCONN:
+ *optname = IMPL_SO_ACCEPTCONN;
+ break;
+ case INTF_SO_DONTROUTE:
+ *optname = IMPL_SO_DONTROUTE;
+ break;
+ case INTF_SO_LINGER:
+ *optname = IMPL_SO_LINGER;
+ break;
+ case INTF_SO_OOBINLINE:
+ *optname = IMPL_SO_OOBINLINE;
+ break;
+ case INTF_SO_REUSEPORT:
+ *optname = IMPL_SO_REUSEPORT;
+ break;
+ case INTF_SO_SNDBUF:
+ *optname = IMPL_SO_SNDBUF;
+ break;
+ case INTF_SO_RCVBUF:
+ *optname = IMPL_SO_RCVBUF;
+ break;
+ case INTF_SO_SNDLOWAT:
+ *optname = IMPL_SO_SNDLOWAT;
+ break;
+ case INTF_SO_RCVLOWAT:
+ *optname = IMPL_SO_RCVLOWAT;
+ break;
+ case INTF_SO_SNDTIMEO:
+ *optname = IMPL_SO_SNDTIMEO;
+ break;
+ case INTF_SO_RCVTIMEO:
+ *optname = IMPL_SO_RCVTIMEO;
+ break;
+ case INTF_SO_ERROR:
+ *optname = IMPL_SO_ERROR;
+ break;
+ case INTF_SO_TYPE:
+ *optname = IMPL_SO_TYPE;
+ break;
+ case INTF_SO_NO_CHECK:
+ *optname = IMPL_SO_NO_CHECK;
+ break;
+
+ /*
+ * SO_DONTLINGER (*level = ((int)(~SO_LINGER))),
+ * SO_USELOOPBACK (*level = 0x0040) and
+ * SO_CONTIMEO (*level = 0x1009) are not supported for now.
+ */
+ default:
+ *optname = 0;
+ break;
+ }
+ return;
+ }
+
+ if (*level == INTF_IPPROTO_IP)
+ {
+ *level = IMPL_IPPROTO_IP;
+
+ switch (*optname)
+ {
+ case INTF_IP_TTL:
+ *optname = IMPL_IP_TTL;
+ break;
+ case INTF_IP_TOS:
+ *optname = IMPL_IP_TOS;
+ break;
+ case INTF_IP_MULTICAST_TTL:
+ *optname = IMPL_IP_MULTICAST_TTL;
+ break;
+ case INTF_IP_MULTICAST_IF:
+ *optname = IMPL_IP_MULTICAST_IF;
+ break;
+ case INTF_IP_MULTICAST_LOOP:
+ *optname = IMPL_IP_MULTICAST_LOOP;
+ break;
+ case INTF_IP_ADD_MEMBERSHIP:
+ *optname = IMPL_IP_ADD_MEMBERSHIP;
+ break;
+ case INTF_IP_DROP_MEMBERSHIP:
+ *optname = IMPL_IP_DROP_MEMBERSHIP;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (*level == INTF_IPPROTO_TCP)
+ {
+ *level = IMPL_IPPROTO_TCP;
+
+ switch (*optname)
+ {
+ case INTF_TCP_NODELAY:
+ *optname = IMPL_TCP_NODELAY;
+ break;
+ case INTF_TCP_KEEPALIVE:
+ *optname = IMPL_TCP_KEEPALIVE;
+ break;
+ case INTF_TCP_KEEPIDLE:
+ *optname = IMPL_TCP_KEEPIDLE;
+ break;
+ case INTF_TCP_KEEPINTVL:
+ *optname = IMPL_TCP_KEEPINTVL;
+ break;
+ case INTF_TCP_KEEPCNT:
+ *optname = IMPL_TCP_KEEPCNT;
+ break;
+ default:
+ break;
+ }
+ return;
+ }
+
+ if (*level == INTF_IPPROTO_IPV6)
+ {
+ *level = IMPL_IPPROTO_IPV6;
+
+ switch (*optname)
+ {
+ case INTF_IPV6_V6ONLY:
+ *optname = IMPL_IPV6_V6ONLY;
+ break;
+ default:
+ break;
+ }
+ return;
+ }
+
+}
+
+static void sockaddr_tolwip(const struct musl_sockaddr *std, struct sockaddr *lwip)
+{
+ if (std && lwip)
+ {
+ lwip->sa_len = sizeof(*lwip);
+ lwip->sa_family = (sa_family_t) std->sa_family;
+ memcpy(lwip->sa_data, std->sa_data, sizeof(lwip->sa_data));
+ }
+}
- lwp = (struct rt_lwp *)tid->lwp;
- while (lwp->fdt.maxfd > 0)
+static void sockaddr_tomusl(const struct sockaddr *lwip, struct musl_sockaddr *std)
+{
+ if (std && lwip)
{
- lwp->fdt.maxfd --;
- close(lwp->fdt.maxfd);
+ std->sa_family = (uint16_t) lwip->sa_family;
+ memcpy(std->sa_data, lwip->sa_data, sizeof(std->sa_data));
}
}
+static void lwp_user_thread(void *parameter)
+{
+ rt_thread_t tid;
+ uint32_t user_stack;
+ struct rt_lwp *lwp;
+
+ tid = rt_thread_self();
+ lwp = lwp_self();
+
+ user_stack = (uint32_t)tid->user_stack + tid->user_stack_size;
+ user_stack &= ~7; //align 8
+ set_user_context((void*)user_stack);
+
+ lwp_user_entry(parameter, tid->user_entry, lwp->data_entry, (void*)user_stack);
+}
+
/* thread/process */
void sys_exit(int value)
{
- rt_thread_t tid;
+ rt_base_t level;
+ rt_thread_t tid, main_thread;
+ struct rt_lwp *lwp;
+
+ LOG_D("thread/process exit.");
- /* TODO: handle the return_value */
- dbg_log(DBG_LOG, "enter sys_exit\n");
tid = rt_thread_self();
- __exit_files(tid);
- rt_thread_delete(tid);
+ lwp = (struct rt_lwp*)tid->lwp;
+ level = rt_hw_interrupt_disable();
+ main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling);
+ if (main_thread == tid)
+ {
+ lwp_terminate(lwp);
+ lwp_wait_subthread_exit();
+ lwp->lwp_ret = value;
+ }
+
+ rt_thread_delete(tid);
rt_schedule();
+ rt_hw_interrupt_enable(level);
return;
}
+/* exit group */
+void sys_exit_group(int status)
+{
+ return;
+}
+
/* syscall: "read" ret: "ssize_t" args: "int" "void *" "size_t" */
ssize_t sys_read(int fd, void *buf, size_t nbyte)
{
+#ifdef RT_USING_USERSPACE
+ void *kmem;
+ ssize_t ret;
+
+ if (!nbyte)
+ return 0;
+
+ if (!lwp_user_accessable((void*)buf, nbyte))
+ return 0;
+
+ kmem = kmem_get(nbyte);
+ if (!kmem)
+ return 0;
+
+ ret = read(fd, kmem, nbyte);
+ if (ret)
+ lwp_put_to_user(buf, kmem, ret);
+
+ kmem_put(kmem);
+ return ret;
+#else
return read(fd, buf, nbyte);
+#endif
}
/* syscall: "write" ret: "ssize_t" args: "int" "const void *" "size_t" */
ssize_t sys_write(int fd, const void *buf, size_t nbyte)
{
+#ifdef RT_USING_USERSPACE
+ void *kmem;
+ ssize_t ret;
+
+ if (!nbyte)
+ return 0;
+
+ if (!lwp_user_accessable((void*)buf, nbyte))
+ return 0;
+
+ kmem = kmem_get(nbyte);
+ if (!kmem)
+ return 0;
+
+ lwp_get_from_user(kmem, (void *)buf, nbyte);
+ ret = write(fd, kmem, nbyte);
+
+ kmem_put(kmem);
+ return ret;
+#else
return write(fd, buf, nbyte);
+#endif
}
/* syscall: "lseek" ret: "off_t" args: "int" "off_t" "int" */
@@ -75,14 +442,41 @@ off_t sys_lseek(int fd, off_t offset, int whence)
}
/* syscall: "open" ret: "int" args: "const char *" "int" "..." */
-int sys_open(const char *name, int mode, ...)
+int sys_open(const char *name, int flag, ...)
{
- return open(name, mode, 0);
+#ifdef RT_USING_USERSPACE
+ int ret;
+ rt_size_t len;
+ char *kname;
+
+ if (!lwp_user_accessable((void*)name, 1))
+ return -1;
+
+ len = rt_strlen(name);
+ if (!len)
+ return -1;
+
+ kname = (char *)kmem_get(len + 1);
+ if (!kname)
+ return -1;
+
+ lwp_get_from_user(kname, (void *)name, len + 1);
+ ret = open(kname, flag, 0);
+
+ kmem_put(kname);
+ return ret;
+#else
+ return open(name, flag, 0);
+#endif
}
/* syscall: "close" ret: "int" args: "int" */
int sys_close(int fd)
{
+ if ((0 <= fd) && (fd <= 2))
+ {
+ return 0;
+ }
return close(fd);
}
@@ -92,14 +486,184 @@ int sys_ioctl(int fd, unsigned long cmd, void* data)
return ioctl(fd, cmd, data);
}
+int sys_fstat(int file, struct stat *buf)
+{
+#ifdef RT_USING_USERSPACE
+ int ret;
+ struct stat statbuff;
+
+ ret = fstat(file, &statbuff);
+ lwp_put_to_user(buf, &statbuff, sizeof statbuff);
+ return ret;
+#else
+ return fstat(file, buf);
+#endif
+}
+
+int sys_poll(struct pollfd *fds, nfds_t nfds, int timeout)
+{
+#ifdef RT_USING_USERSPACE
+ int ret;
+ struct pollfd *kfds;
+
+ if (!lwp_user_accessable((void*)fds, nfds * sizeof *fds))
+ return -1;
+
+ kfds = (struct pollfd *)kmem_get(nfds * sizeof *kfds);
+ if (!kfds)
+ return -1;
+
+ lwp_get_from_user(kfds, fds, nfds * sizeof *kfds);
+ ret = poll(kfds, nfds, timeout);
+ lwp_put_to_user(fds, kfds, nfds * sizeof *kfds);
+
+ kmem_put(kfds);
+ return ret;
+#else
+ return poll(fds, nfds, timeout);
+#endif
+}
+
+int sys_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
+{
+#ifdef RT_USING_USERSPACE
+ int ret = -1;
+ fd_set *kreadfds = RT_NULL, *kwritefds = RT_NULL, *kexceptfds = RT_NULL;
+
+ if (readfds)
+ {
+ if (!lwp_user_accessable((void*)readfds, sizeof *readfds))
+ {
+ return -1;
+ }
+ kreadfds = (fd_set *)kmem_get(sizeof *kreadfds);
+ if (!kreadfds)
+ {
+ goto quit;
+ }
+ lwp_get_from_user(kreadfds, readfds, sizeof *kreadfds);
+ }
+ if (writefds)
+ {
+ if (!lwp_user_accessable((void*)writefds, sizeof *writefds))
+ {
+ return -1;
+ }
+ kwritefds = (fd_set *)kmem_get(sizeof *kwritefds);
+ if (!kwritefds)
+ {
+ goto quit;
+ }
+ lwp_get_from_user(kwritefds, writefds, sizeof *kwritefds);
+ }
+ if (exceptfds)
+ {
+ if (!lwp_user_accessable((void*)exceptfds, sizeof *exceptfds))
+ {
+ return -1;
+ }
+ kexceptfds = (fd_set *)kmem_get(sizeof *kexceptfds);
+ if (!kexceptfds)
+ {
+ goto quit;
+ }
+ lwp_get_from_user(kexceptfds, exceptfds, sizeof *kexceptfds);
+ }
+
+ ret = select(nfds, kreadfds, kwritefds, kexceptfds, timeout);
+ if (kreadfds)
+ {
+ lwp_put_to_user(readfds, kreadfds, sizeof *kreadfds);
+ }
+ if (kwritefds)
+ {
+ lwp_put_to_user(writefds, kwritefds, sizeof *kwritefds);
+ }
+ if (kexceptfds)
+ {
+ lwp_put_to_user(exceptfds, kexceptfds, sizeof *kexceptfds);
+ }
+quit:
+ if (kreadfds)
+ {
+ kmem_put(kreadfds);
+ }
+ if (kwritefds)
+ {
+ kmem_put(kwritefds);
+ }
+ if (kexceptfds)
+ {
+ kmem_put(kexceptfds);
+ }
+ return ret;
+#else
+ return select(nfds, readfds, writefds, exceptfds, timeout);
+#endif
+}
+
+int sys_unlink(const char *pathname)
+{
+#ifdef RT_USING_USERSPACE
+ int ret;
+ rt_size_t len;
+ char *kname;
+
+ if (!lwp_user_accessable((void*)pathname, 1))
+ return -1;
+
+ len = rt_strlen(pathname);
+ if (!len)
+ return -1;
+
+ kname = (char *)kmem_get(len + 1);
+ if (!kname)
+ return -1;
+
+ lwp_get_from_user(kname, (void *)pathname, len + 1);
+ ret = unlink(kname);
+
+ kmem_put(kname);
+ return ret;
+#else
+ return unlink(pathname);
+#endif
+}
+
/* syscall: "nanosleep" ret: "int" args: "const struct timespec *" "struct timespec *" */
int sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
{
rt_tick_t tick;
+#ifdef RT_USING_USERSPACE
+ struct timespec rqtp_k;
+ struct timespec rmtp_k;
+
+ dbg_log(DBG_LOG, "sys_nanosleep\n");
+
+ if (!lwp_user_accessable((void*)rqtp, sizeof *rqtp))
+ return -1;
+
+ lwp_get_from_user(&rqtp_k, (void *)rqtp, sizeof rqtp_k);
+
+ tick = rqtp_k.tv_sec * RT_TICK_PER_SECOND + ((uint64_t)rqtp_k.tv_nsec * RT_TICK_PER_SECOND)/ 1000000000;
+ rt_thread_delay(tick);
+
+ if (rmtp)
+ {
+ if (!lwp_user_accessable((void*)rmtp, sizeof *rmtp))
+ return -1;
+ tick = rt_tick_get() - tick;
+ /* get the passed time */
+ rmtp_k.tv_sec = tick/RT_TICK_PER_SECOND;
+ rmtp_k.tv_nsec = (tick%RT_TICK_PER_SECOND) * (1000000000/RT_TICK_PER_SECOND);
+
+ lwp_put_to_user(rmtp, (void *)&rmtp_k, sizeof rmtp_k);
+ }
+#else
dbg_log(DBG_LOG, "sys_nanosleep\n");
- tick = rqtp->tv_sec * RT_TICK_PER_SECOND + (rqtp->tv_nsec * RT_TICK_PER_SECOND)/ 1000000000;
+ tick = rqtp->tv_sec * RT_TICK_PER_SECOND + ((uint64_t)rqtp->tv_nsec * RT_TICK_PER_SECOND)/ 1000000000;
rt_thread_delay(tick);
if (rmtp)
@@ -109,10 +673,68 @@ int sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
rmtp->tv_sec = tick/RT_TICK_PER_SECOND;
rmtp->tv_nsec = (tick%RT_TICK_PER_SECOND) * (1000000000/RT_TICK_PER_SECOND);
}
+#endif
+
+ return 0;
+}
+
+/* syscall: "gettimeofday" ret: "int" args: "struct timeval *" "struct timezone *" */
+int sys_gettimeofday(struct timeval *tp, struct timezone *tzp)
+{
+ struct timeval t_k;
+
+#ifdef RT_USING_USERSPACE
+ if (tp)
+ {
+ if (!lwp_user_accessable((void*)tp, sizeof *tp))
+ return -1;
+
+ t_k.tv_sec = rt_tick_get() / RT_TICK_PER_SECOND;
+ t_k.tv_usec = (rt_tick_get() % RT_TICK_PER_SECOND) * (1000000 / RT_TICK_PER_SECOND);
+
+ lwp_put_to_user(tp, (void *)&t_k, sizeof t_k);
+ }
+#else
+ if (tp)
+ {
+ tp->tv_sec = rt_tick_get() / RT_TICK_PER_SECOND;
+ tp->tv_usec = (rt_tick_get() % RT_TICK_PER_SECOND) * (1000000 / RT_TICK_PER_SECOND);
+ }
+#endif
+
+ return 0;
+}
+int sys_settimeofday(const struct timeval *tv, const struct timezone *tzp)
+{
return 0;
}
+#ifdef RT_USING_GDBSERVER
+int lwp_execve(char *filename, int debug, int argc, char **argv, char **envp);
+#else
+int lwp_execve(char *filename, int argc, char **argv, char **envp);
+#endif
+
+int sys_exec(char *filename, int argc, char **argv, char **envp)
+{
+#ifdef RT_USING_GDBSERVER
+ return lwp_execve(filename, 0, argc, argv, envp);
+#else
+ return lwp_execve(filename, argc, argv, envp);
+#endif
+}
+
+int sys_kill(int pid, int sig)
+{
+ return lwp_kill(pid, sig);
+}
+
+int sys_getpid(void)
+{
+ return lwp_getpid();
+}
+
/* syscall: "getpriority" ret: "int" args: "int" "id_t" */
int sys_getpriority(int which, id_t who)
{
@@ -148,117 +770,1379 @@ int sys_setpriority(int which, id_t who, int prio)
return -1;
}
-/* syscall: "gettimeofday" ret: "int" args: "struct timeval *" "struct timezone *" */
-int sys_gettimeofday(struct timeval *tp, struct timezone *tzp)
+rt_sem_t sys_sem_create(const char *name, rt_uint32_t value, rt_uint8_t flag)
{
- if (tp)
- {
- tp->tv_sec = rt_tick_get() / RT_TICK_PER_SECOND;
- tp->tv_usec = (rt_tick_get() % RT_TICK_PER_SECOND) * (1000000 / RT_TICK_PER_SECOND);
- }
-
- return 0;
+ return rt_sem_create(name, value, flag);
}
-/* syscall: "settimeofday" ret: "int" args: "const struct timeval *" "const struct timezone *" */
-int sys_settimeofday(const struct timeval *tv, const struct timezone *tzp)
+rt_err_t sys_sem_delete(rt_sem_t sem)
{
- return 0;
+ return rt_sem_delete(sem);
}
-/* syscall: "msgget" ret: "int" args: "key_t" "int" */
-int sys_msgget(key_t key, int msgflg)
+rt_err_t sys_sem_take(rt_sem_t sem, rt_int32_t time)
{
- return -1;
+ return rt_sem_take_interruptible(sem, time);
}
-/* syscall: "msgsnd" ret: "int" args: "int" "const void *" "size_t" "int" */
-int sys_msgsend(int msqid, const void *msgp, size_t msgsz, int msgflg)
+rt_err_t sys_sem_release(rt_sem_t sem)
{
- return -1;
+ return rt_sem_release(sem);
}
-/* syscall: "msgrcv" ret: "int" args: "int" "void *" "size_t" "long" "int" */
-int sys_msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)
+rt_mutex_t sys_mutex_create(const char *name, rt_uint8_t flag)
{
- return -1;
+ return rt_mutex_create(name, flag);
}
-/* syscall: "sys_log" ret: "int" args: "const char*" "size" */
-int sys_log(const char* log, int size)
+rt_err_t sys_mutex_delete(rt_mutex_t mutex)
{
- rt_device_t console = rt_console_get_device();
-
- if (console) rt_device_write(console, -1, log, size);
+ return rt_mutex_delete(mutex);
+}
- return 0;
+rt_err_t sys_mutex_take(rt_mutex_t mutex, rt_int32_t time)
+{
+ return rt_mutex_take_interruptible(mutex, time);
}
-void *sys_malloc(size_t size)
+rt_err_t sys_mutex_release(rt_mutex_t mutex)
{
- return rt_lwp_mem_malloc(size);
+ return rt_mutex_release(mutex);
}
-void sys_free(void *addr)
+#ifdef RT_USING_USERSPACE
+/* memory allocation */
+extern int lwp_brk(void *addr);
+int sys_brk(void *addr)
{
- rt_lwp_mem_free(addr);
+ return lwp_brk(addr);
}
-void *sys_realloc(void *rmem, size_t newsize)
+extern void *lwp_mmap2(void *addr, size_t length, int prot,
+ int flags, int fd, off_t pgoffset);
+void *sys_mmap2(void *addr, size_t length, int prot,
+ int flags, int fd, off_t pgoffset)
{
- return rt_lwp_mem_realloc(rmem, newsize);
+ return lwp_mmap2(addr, length, prot, flags, fd, pgoffset);
}
-int sys_fstat(int file, struct stat *buf)
+extern int lwp_munmap(void *addr, size_t length);
+int sys_munmap(void *addr, size_t length)
{
- return fstat(file, buf);
+ return lwp_munmap(addr, length);
}
+#endif
-int sys_notimpl(void)
+rt_event_t sys_event_create(const char *name, rt_uint8_t flag)
{
- return -ENOSYS;
+ return rt_event_create(name, flag);
}
-const static void* func_table[] =
+rt_err_t sys_event_delete(rt_event_t event)
{
- (void *)sys_exit, // 0x01
- (void *)sys_read, // 0x02
- (void *)sys_write, // 0x03
- (void *)sys_lseek, // 0x04
- (void *)sys_open, // 0x05
- (void *)sys_close, // 0x06
- (void *)sys_ioctl, // 0x07
-
- (void *)sys_nanosleep, // 0x08
-
- (void *)sys_getpriority, // 0x09
- (void *)sys_setpriority, // 0x0a
-
- (void *)sys_gettimeofday, // 0x0b
- (void *)sys_settimeofday, // 0x0c
-
- (void *)sys_malloc, // 0x0d
- (void *)sys_free, // 0x0e
- (void *)sys_realloc, //0x0f
- (void *)sys_fstat, // 0x10
- (void *)poll, // 0x11
-
- SYSCALL_NET(accept), // 0x12
- SYSCALL_NET(bind), // 0x13
- SYSCALL_NET(shutdown), // 0x14
- SYSCALL_NET(getpeername),// 0x15
- SYSCALL_NET(getsockname),// 0x16
- SYSCALL_NET(getsockopt), // 0x17
- SYSCALL_NET(setsockopt), // 0x18
- SYSCALL_NET(connect), // 0x19
- SYSCALL_NET(listen), // 0x1a
- SYSCALL_NET(recv), // 0x1b
- SYSCALL_NET(recvfrom), // 0x1c
- SYSCALL_NET(send), // 0x1d
- SYSCALL_NET(sendto), // 0x1e
- SYSCALL_NET(socket), // 0x1f
-
- (void *)select, // 0x20
+ return rt_event_delete(event);
+}
+
+rt_err_t sys_event_send(rt_event_t event, rt_uint32_t set)
+{
+ return rt_event_send(event, set);
+}
+
+rt_err_t sys_event_recv(rt_event_t event,
+ rt_uint32_t set,
+ rt_uint8_t opt,
+ rt_int32_t timeout,
+ rt_uint32_t *recved)
+{
+ return rt_event_recv(event, set, opt, timeout, recved);
+}
+
+rt_mailbox_t sys_mb_create(const char *name, rt_size_t size, rt_uint8_t flag)
+{
+ return rt_mb_create(name, size, flag);
+}
+
+rt_err_t sys_mb_delete(rt_mailbox_t mb)
+{
+ return rt_mb_delete(mb);
+}
+
+rt_err_t sys_mb_send(rt_mailbox_t mb, rt_uint32_t value)
+{
+ return rt_mb_send(mb, value);
+}
+
+rt_err_t sys_mb_send_wait(rt_mailbox_t mb,
+ rt_uint32_t value,
+ rt_int32_t timeout)
+{
+ return rt_mb_send_wait(mb, value, timeout);
+}
+
+rt_err_t sys_mb_recv(rt_mailbox_t mb, rt_uint32_t *value, rt_int32_t timeout)
+{
+ return rt_mb_recv(mb, (rt_ubase_t*)value, timeout);
+}
+
+rt_mq_t sys_mq_create(const char *name,
+ rt_size_t msg_size,
+ rt_size_t max_msgs,
+ rt_uint8_t flag)
+{
+ return rt_mq_create(name, msg_size, max_msgs, flag);
+}
+
+rt_err_t sys_mq_delete(rt_mq_t mq)
+{
+ return rt_mq_delete(mq);
+}
+
+rt_err_t sys_mq_send(rt_mq_t mq, void *buffer, rt_size_t size)
+{
+ return rt_mq_send(mq, buffer, size);
+}
+
+rt_err_t sys_mq_urgent(rt_mq_t mq, void *buffer, rt_size_t size)
+{
+ return rt_mq_urgent(mq, buffer, size);
+}
+
+rt_err_t sys_mq_recv(rt_mq_t mq,
+ void *buffer,
+ rt_size_t size,
+ rt_int32_t timeout)
+{
+ return rt_mq_recv(mq, buffer, size, timeout);
+}
+
+static void timer_timeout_callback(void *parameter)
+{
+ rt_sem_t sem = (rt_sem_t)parameter;
+ rt_sem_release(sem);
+}
+
+rt_timer_t sys_timer_create(const char *name,
+ void *data,
+ rt_tick_t time,
+ rt_uint8_t flag)
+{
+ return rt_timer_create(name, timer_timeout_callback, (void*)data, time, flag);
+}
+
+rt_err_t sys_timer_delete(rt_timer_t timer)
+{
+ return rt_timer_delete(timer);
+}
+
+rt_err_t sys_timer_start(rt_timer_t timer)
+{
+ return rt_timer_start(timer);
+}
+
+rt_err_t sys_timer_stop(rt_timer_t timer)
+{
+ return rt_timer_stop(timer);
+}
+
+rt_err_t sys_timer_control(rt_timer_t timer, int cmd, void *arg)
+{
+ return rt_timer_control(timer, cmd, arg);
+}
+
+#ifdef RT_USING_USERSPACE
+void *lwp_map_user(struct rt_lwp *lwp, void *map_va, size_t map_size);
+#endif
+
+rt_thread_t sys_thread_create(void *arg[])
+{
+ rt_base_t level;
+ void *user_stack = 0;
+ struct rt_lwp *lwp = 0;
+ rt_thread_t tid;
+
+ lwp = rt_thread_self()->lwp;
+ lwp_ref_inc(lwp);
+#ifdef RT_USING_USERSPACE
+ user_stack = lwp_map_user(lwp, 0, (size_t)arg[3]);
+#else
+ user_stack = (void *)RT_KERNEL_MALLOC((uint32_t)arg[3]);
+#endif
+ if (!user_stack)
+ {
+ return RT_NULL;
+ }
+ tid = rt_thread_create((const char*)arg[0], lwp_user_thread, (void*)arg[2], ALLOC_KERNEL_STACK_SIZE, (rt_uint8_t)(size_t)arg[4], (rt_uint32_t)arg[5]);
+ if (!tid)
+ {
+ goto fail;
+ }
+
+ tid->cleanup = lwp_cleanup;
+ tid->user_entry = (void (*)(void *))arg[1];
+ tid->user_stack = (void *)user_stack;
+ tid->user_stack_size = (uint32_t)arg[3];
+ tid->lwp = (void*)lwp;
+
+ level = rt_hw_interrupt_disable();
+ rt_list_insert_after(&lwp->t_grp, &tid->sibling);
+ rt_hw_interrupt_enable(level);
+
+ return tid;
+
+fail:
+#ifndef RT_USING_USERSPACE
+ if (user_stack)
+ {
+ RT_KERNEL_FREE(user_stack);
+ }
+#endif
+ if (lwp)
+ {
+ lwp_ref_dec(lwp);
+ }
+ return RT_NULL;
+}
+
+rt_err_t sys_thread_delete(rt_thread_t thread)
+{
+ return rt_thread_delete(thread);
+}
+
+rt_err_t sys_thread_startup(rt_thread_t thread)
+{
+ return rt_thread_startup(thread);
+}
+
+rt_thread_t sys_thread_self(void)
+{
+ return rt_thread_self();
+}
+
+/* sys channel */
+
+int sys_channel_open(const char *name, int flags)
+{
+ return lwp_channel_open(FDT_TYPE_LWP, name, flags);
+}
+
+rt_err_t sys_channel_close(int fd)
+{
+ return lwp_channel_close(FDT_TYPE_LWP, fd);
+}
+
+rt_err_t sys_channel_send(int fd, rt_channel_msg_t data)
+{
+ return lwp_channel_send(FDT_TYPE_LWP, fd, data);
+}
+
+rt_err_t sys_channel_send_recv_timeout(int fd, rt_channel_msg_t data, rt_channel_msg_t data_ret, rt_int32_t time)
+{
+ return lwp_channel_send_recv_timeout(FDT_TYPE_LWP, fd, data, data_ret, time);
+}
+
+rt_err_t sys_channel_reply(int fd, rt_channel_msg_t data)
+{
+ return lwp_channel_reply(FDT_TYPE_LWP, fd, data);
+}
+
+rt_err_t sys_channel_recv_timeout(int fd, rt_channel_msg_t data, rt_int32_t time)
+{
+ return lwp_channel_recv_timeout(FDT_TYPE_LWP, fd, data, time);
+}
+
+/*****/
+
+static struct rt_semaphore critical_lock;
+
+static int critical_init(void)
+{
+ rt_sem_init(&critical_lock, "ct_lock", 1, RT_IPC_FLAG_FIFO);
+ return 0;
+}
+INIT_DEVICE_EXPORT(critical_init);
+
+void sys_enter_critical(void)
+{
+ rt_sem_take(&critical_lock, RT_WAITING_FOREVER);
+}
+
+void sys_exit_critical(void)
+{
+ rt_sem_release(&critical_lock);
+}
+
+/* syscall: "sys_log" ret: "int" args: "const char*" "size" */
+static int __sys_log_enable = 0;
+static int sys_log_enable(int argc, char** argv)
+{
+ if (argc == 1)
+ {
+ rt_kprintf("sys_log = %d\n", __sys_log_enable);
+ return 0;
+ }
+ else
+ {
+ __sys_log_enable = atoi(argv[1]);
+ }
+
+ return 0;
+}
+MSH_CMD_EXPORT_ALIAS(sys_log_enable, sys_log, sys_log 1(enable)/0(disable));
+
+int sys_log(const char* log, int size)
+{
+ rt_device_t console = rt_console_get_device();
+
+ if (console && __sys_log_enable) rt_device_write(console, -1, log, size);
+
+ return 0;
+}
+
+int sys_stat(const char *file, struct stat *buf)
+{
+ return stat(file, buf);
+}
+
+int sys_notimpl(void)
+{
+ return -ENOSYS;
+}
+
+uint32_t sys_hw_interrupt_disable(void)
+{
+ return rt_hw_interrupt_disable();
+}
+
+void sys_hw_interrupt_enable(uint32_t level)
+{
+ rt_hw_interrupt_enable(level);
+}
+
+#ifdef RT_USING_USERSPACE
+int sys_shmget(size_t key, size_t size, int create)
+{
+ return lwp_shmget(key, size, create);
+}
+
+int sys_shmrm(int id)
+{
+ return lwp_shmrm(id);
+}
+
+void* sys_shmat(int id, void* shm_vaddr)
+{
+ return lwp_shmat(id, shm_vaddr);
+}
+
+int sys_shmdt(void* shm_vaddr)
+{
+ return lwp_shmdt(shm_vaddr);
+}
+#endif
+
+/* device interfaces */
+rt_err_t sys_device_init(rt_device_t dev)
+{
+ return rt_device_init(dev);
+}
+
+rt_err_t sys_device_register(rt_device_t dev, const char *name, rt_uint16_t flags)
+{
+ return rt_device_register(dev, name, flags);
+}
+
+rt_err_t sys_device_control(rt_device_t dev, int cmd, void *arg)
+{
+ return rt_device_control(dev, cmd, arg);
+}
+
+rt_device_t sys_device_find(const char* name)
+{
+ return rt_device_find(name);
+}
+
+rt_err_t sys_device_open(rt_device_t dev, rt_uint16_t oflag)
+{
+ return rt_device_open(dev, oflag);
+}
+
+rt_err_t sys_device_close(rt_device_t dev)
+{
+ return rt_device_close(dev);
+}
+
+rt_size_t sys_device_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
+{
+ return rt_device_read(dev, pos, buffer, size);
+}
+
+rt_size_t sys_device_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
+{
+ return rt_device_write(dev, pos, buffer, size);
+}
+
+/* network interfaces */
+int sys_accept(int socket, struct musl_sockaddr *addr, socklen_t *addrlen)
+{
+ int ret;
+ struct sockaddr ksa;
+ struct musl_sockaddr kmusladdr;
+ socklen_t uaddrlen;
+ socklen_t kaddrlen;
+
+ if (!lwp_user_accessable(addrlen, sizeof (socklen_t *)))
+ {
+ return -1;
+ }
+ lwp_get_from_user(&uaddrlen, addrlen, sizeof (socklen_t *));
+ if (!uaddrlen)
+ {
+ return -1;
+ }
+
+ if (!lwp_user_accessable(addr, uaddrlen))
+ {
+ return -1;
+ }
+
+ kaddrlen = sizeof(struct sockaddr);
+ ret = accept(socket, &ksa, &kaddrlen);
+ if (ret >= 0)
+ {
+ sockaddr_tomusl(&ksa, &kmusladdr);
+ if (uaddrlen > sizeof(struct musl_sockaddr))
+ {
+ uaddrlen = sizeof(struct musl_sockaddr);
+ }
+ lwp_put_to_user(addr, &kmusladdr, uaddrlen);
+ lwp_put_to_user(addrlen, &uaddrlen, sizeof (socklen_t *));
+ }
+ return ret;
+}
+
+int sys_bind(int socket, const struct musl_sockaddr *name, socklen_t namelen)
+{
+ struct sockaddr sa;
+ struct musl_sockaddr kname;
+
+ if (!lwp_user_accessable((void*)name, namelen))
+ {
+ return -1;
+ }
+ lwp_get_from_user(&kname, (void*)name, namelen);
+
+ sockaddr_tolwip(&kname, &sa);
+
+ return bind(socket, &sa, namelen);
+}
+
+int sys_shutdown(int socket, int how)
+{
+ return shutdown(socket, how);
+}
+
+int sys_getpeername (int socket, struct musl_sockaddr *name, socklen_t *namelen)
+{
+ int ret;
+ struct sockaddr sa;
+ struct musl_sockaddr kname;
+ socklen_t unamelen;
+ socklen_t knamelen;
+
+ if (!lwp_user_accessable(namelen, sizeof (socklen_t *)))
+ {
+ return -1;
+ }
+ lwp_get_from_user(&unamelen, namelen, sizeof (socklen_t *));
+ if (!unamelen)
+ {
+ return -1;
+ }
+
+ if (!lwp_user_accessable(name, unamelen))
+ {
+ return -1;
+ }
+
+ knamelen = sizeof(struct sockaddr);
+ ret = getpeername (socket, &sa, &knamelen);
+
+ if (ret == 0)
+ {
+ sockaddr_tomusl(&sa, &kname);
+ if (unamelen > sizeof(struct musl_sockaddr))
+ {
+ unamelen = sizeof(struct musl_sockaddr);
+ }
+ lwp_put_to_user(name, &kname, unamelen);
+ lwp_put_to_user(namelen, &unamelen, sizeof (socklen_t *));
+ }
+
+ return ret;
+}
+
+int sys_getsockname (int socket, struct musl_sockaddr *name, socklen_t *namelen)
+{
+ int ret;
+ struct sockaddr sa;
+ struct musl_sockaddr kname;
+ socklen_t unamelen;
+ socklen_t knamelen;
+
+ if (!lwp_user_accessable(namelen, sizeof (socklen_t *)))
+ {
+ return -1;
+ }
+ lwp_get_from_user(&unamelen, namelen, sizeof (socklen_t *));
+ if (!unamelen)
+ {
+ return -1;
+ }
+
+ if (!lwp_user_accessable(name, unamelen))
+ {
+ return -1;
+ }
+
+ knamelen = sizeof(struct sockaddr);
+ ret = getsockname (socket, &sa, &knamelen);
+ if (ret == 0)
+ {
+ sockaddr_tomusl(&sa, &kname);
+ if (unamelen > sizeof(struct musl_sockaddr))
+ {
+ unamelen = sizeof(struct musl_sockaddr);
+ }
+ lwp_put_to_user(name, &kname, unamelen);
+ lwp_put_to_user(namelen, &unamelen, sizeof (socklen_t *));
+ }
+ return ret;
+}
+
+int sys_getsockopt (int socket, int level, int optname, void *optval, socklen_t *optlen)
+{
+ LOG_I("syscall: getsockopt");
+
+ convert_sockopt(&level, &optname);
+ return getsockopt (socket, level, optname, optval, optlen);
+}
+
+int sys_setsockopt (int socket, int level, int optname, const void *optval, socklen_t optlen)
+{
+ LOG_I("syscall: setsockopt");
+
+ convert_sockopt(&level, &optname);
+ return setsockopt (socket, level, optname, optval, optlen);
+}
+
+int sys_connect(int socket, const struct musl_sockaddr *name, socklen_t namelen)
+{
+ struct sockaddr sa;
+ struct musl_sockaddr kname;
+
+ if (!lwp_user_accessable((void*)name, namelen))
+ {
+ return -1;
+ }
+ lwp_get_from_user(&kname, (void*)name, namelen);
+
+ sockaddr_tolwip(&kname, &sa);
+
+ return connect(socket, &sa, namelen);
+}
+
+int sys_listen(int socket, int backlog)
+{
+ return listen(socket, backlog);
+}
+
+#define MUSLC_MSG_OOB 0x0001
+#define MUSLC_MSG_PEEK 0x0002
+#define MUSLC_MSG_DONTWAIT 0x0040
+#define MUSLC_MSG_WAITALL 0x0100
+#define MUSLC_MSG_MORE 0x8000
+
+static int netflags_muslc_2_lwip(int flags)
+{
+ int flgs = 0;
+
+ if (flags & MUSLC_MSG_PEEK)
+ flgs |= MSG_PEEK;
+ if (flags & MUSLC_MSG_WAITALL)
+ flgs |= MSG_WAITALL;
+ if (flags & MUSLC_MSG_OOB)
+ flgs |= MSG_OOB;
+ if (flags & MUSLC_MSG_DONTWAIT)
+ flgs |= MSG_DONTWAIT;
+ if (flags & MUSLC_MSG_MORE)
+ flgs |= MSG_MORE;
+ return flgs;
+}
+
+int sys_recvfrom(int socket, void *mem, size_t len, int flags,
+ struct musl_sockaddr *from, socklen_t *fromlen)
+{
+ int flgs = 0;
+#ifdef RT_USING_USERSPACE
+ int ret = -1;
+ void *kmem = RT_NULL;
+#endif
+
+ flgs = netflags_muslc_2_lwip(flags);
+#ifdef RT_USING_USERSPACE
+ if (!len)
+ return -1;
+
+ if (!lwp_user_accessable((void*)mem, len))
+ return -1;
+
+ kmem = kmem_get(len);
+ if (!kmem)
+ return -1;
+
+ if (flags == 0x2) {
+ flags = 0x1;
+ }
+
+ if (from)
+ {
+ struct sockaddr sa;
+
+ ret = recvfrom(socket, kmem, len, flgs, &sa, fromlen);
+ sockaddr_tomusl(&sa, from);
+ } else
+ ret = recvfrom(socket, kmem, len, flgs, NULL, NULL);
+
+ if (ret > 0)
+ lwp_put_to_user(mem, kmem, len);
+
+ kmem_put(kmem);
+ return ret;
+#else
+ if (from)
+ {
+ int ret = -1;
+ struct sockaddr sa = {0};
+
+ ret = recvfrom(socket, mem, len, flgs, &sa, fromlen);
+ sockaddr_tomusl(&sa, from);
+ return ret;
+ }
+
+ return recvfrom(socket, mem, len, flags, NULL, NULL);
+#endif
+}
+
+int sys_recv(int socket, void *mem, size_t len, int flags)
+{
+ int flgs = 0;
+
+ flgs = netflags_muslc_2_lwip(flags);
+ return recvfrom(socket, mem, len, flgs, NULL, NULL);
+}
+
+int sys_sendto(int socket, const void *dataptr, size_t size, int flags,
+ const struct musl_sockaddr *to, socklen_t tolen)
+{
+ int flgs = 0;
+#ifdef RT_USING_USERSPACE
+ int ret = -1;
+ void *kmem = RT_NULL;
+#endif
+
+ flgs = netflags_muslc_2_lwip(flags);
+#ifdef RT_USING_USERSPACE
+ if (!size)
+ return -1;
+
+ if (!lwp_user_accessable((void*)dataptr, size))
+ return -1;
+
+ kmem = kmem_get(size);
+ if (!kmem)
+ return -1;
+
+ lwp_get_from_user(kmem, (void *)dataptr, size);
+
+ if (to)
+ {
+ struct sockaddr sa;
+ sockaddr_tolwip(to, &sa);
+
+ ret = sendto(socket, kmem, size, flgs, &sa, tolen);
+ }
+ else
+ ret = sendto(socket, kmem, size, flgs, NULL, tolen);
+
+ kmem_put(kmem);
+ return ret;
+#else
+ if (to)
+ {
+ struct sockaddr sa;
+ sockaddr_tolwip(to, &sa);
+
+ return sendto(socket, dataptr, size, flgs, &sa, tolen);
+ }
+ return sendto(socket, dataptr, size, flgs, NULL, tolen);
+#endif
+}
+
+int sys_send(int socket, const void *dataptr, size_t size, int flags)
+{
+ int flgs = 0;
+
+ flgs = netflags_muslc_2_lwip(flags);
+ return sendto(socket, dataptr, size, flgs, NULL, 0);
+}
+
+int sys_socket(int domain, int type, int protocol)
+{
+ int fd = -1;
+ int nonblock = 0;
+ /* not support SOCK_CLOEXEC type */
+ if (type & SOCK_CLOEXEC) type &= ~SOCK_CLOEXEC;
+ if (type & SOCK_NONBLOCK)
+ {
+ nonblock = 1;
+ type &= ~SOCK_NONBLOCK;
+ }
+
+ fd = socket(domain, type, protocol);
+ if (fd < 0)
+ {
+ goto out;
+ }
+ if (nonblock)
+ {
+ fcntl(fd, F_SETFL, O_NONBLOCK);
+ }
+
+out:
+ return fd;
+}
+
+int sys_closesocket(int socket)
+{
+ return closesocket(socket);
+}
+
+rt_thread_t sys_thread_find(char *name)
+{
+ return rt_thread_find(name);
+}
+
+rt_tick_t sys_tick_get(void)
+{
+ return rt_tick_get();
+}
+
+rt_err_t sys_thread_mdelay(rt_int32_t ms)
+{
+ return rt_thread_mdelay(ms);
+}
+
+int sys_sigaction(int sig, const struct sigaction *act,
+ struct sigaction *oact, size_t sigsetsize)
+{
+ int ret = -RT_EINVAL;
+ struct lwp_sigaction kact, *pkact = RT_NULL;
+ struct lwp_sigaction koact, *pkoact = RT_NULL;
+
+ if (!sigsetsize)
+ {
+ goto out;
+ }
+ if (sigsetsize > sizeof(lwp_sigset_t))
+ {
+ sigsetsize = sizeof(lwp_sigset_t);
+ goto out;
+ }
+ if (!act && !oact)
+ {
+ goto out;
+ }
+ if (oact)
+ {
+ if (!lwp_user_accessable((void*)oact, sigsetsize))
+ {
+ goto out;
+ }
+ pkoact = &koact;
+ }
+ if (act)
+ {
+ if (!lwp_user_accessable((void*)act, sigsetsize))
+ {
+ goto out;
+ }
+ kact.__sa_handler._sa_handler = act->sa_handler;
+ memcpy(&kact.sa_mask, &act->sa_mask, sigsetsize);
+ pkact = &kact;
+ }
+
+ ret = lwp_sigaction(sig, pkact, pkoact, sigsetsize);
+ if (ret == 0)
+ {
+ lwp_put_to_user(&oact->sa_handler, &pkoact->__sa_handler._sa_handler, sizeof(void (*)(int)));
+ lwp_put_to_user(&oact->sa_mask, &pkoact->sa_mask, sigsetsize);
+ lwp_put_to_user(&oact->sa_flags, &pkoact->sa_flags, sizeof(int));
+ lwp_put_to_user(&oact->sa_restorer, &pkoact->sa_restorer, sizeof(void (*)(void)));
+ }
+out:
+ return ret;
+}
+
+int sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size)
+{
+ int ret = -1;
+ lwp_sigset_t newset, *pnewset = RT_NULL;
+ lwp_sigset_t oldset, *poldset = RT_NULL;
+
+ if (!size)
+ {
+ return ret;
+ }
+ if (!oset && !sigset)
+ {
+ return ret;
+ }
+ if (size > sizeof(lwp_sigset_t))
+ {
+ size = sizeof(lwp_sigset_t);
+ return ret;
+ }
+ if (oset)
+ {
+ if (!lwp_user_accessable((void*)oset, size))
+ {
+ return ret;
+ }
+ poldset = &oldset;
+ }
+ if (sigset)
+ {
+ if (!lwp_user_accessable((void*)oset, size))
+ {
+ return ret;
+ }
+ lwp_get_from_user(&newset, (void*)sigset, size);
+ pnewset = &newset;
+ }
+ ret = lwp_sigprocmask(how, pnewset, poldset);
+ if (ret < 0)
+ {
+ return ret;
+ }
+ if (oset)
+ {
+ lwp_put_to_user(oset, poldset, size);
+ }
+ return ret;
+}
+
+int sys_thread_kill(rt_thread_t thread, int sig)
+{
+ return lwp_thread_kill(thread, sig);
+}
+
+void sys_thread_sighandler_set(int sig, lwp_sighandler_t func)
+{
+ lwp_thread_sighandler_set(sig, func);
+}
+
+int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset, size_t size)
+{
+ int ret = -1;
+ lwp_sigset_t newset, *pnewset = RT_NULL;
+ lwp_sigset_t oldset, *poldset = RT_NULL;
+
+ if (!size)
+ {
+ return ret;
+ }
+ if (!oset && !sigset)
+ {
+ return ret;
+ }
+ if (size != sizeof(lwp_sigset_t))
+ {
+ return ret;
+ }
+ if (oset)
+ {
+ if (!lwp_user_accessable((void*)oset, size))
+ {
+ return ret;
+ }
+ poldset = &oldset;
+ }
+ if (sigset)
+ {
+ if (!lwp_user_accessable((void*)oset, size))
+ {
+ return ret;
+ }
+ lwp_get_from_user(&newset, (void*)sigset, sizeof(lwp_sigset_t));
+ pnewset = &newset;
+ }
+ ret = lwp_thread_sigprocmask(how, pnewset, poldset);
+ if (ret < 0)
+ {
+ return ret;
+ }
+ if (oset)
+ {
+ lwp_put_to_user(oset, poldset, sizeof(lwp_sigset_t));
+ }
+ return ret;
+}
+
+int32_t sys_waitpid(int32_t pid, int *status, int options)
+{
+ return waitpid(pid, status, options);
+}
+
+#if defined(RT_USING_SAL) && defined(SAL_USING_POSIX)
+struct musl_addrinfo
+{
+ int ai_flags;
+ int ai_family;
+ int ai_socktype;
+ int ai_protocol;
+ socklen_t ai_addrlen;
+
+ struct musl_sockaddr *ai_addr;
+ char *ai_canonname;
+
+ struct musl_addrinfo *ai_next;
+};
+
+int sys_getaddrinfo(const char *nodename, const char *servname, const struct musl_addrinfo *hints, struct musl_addrinfo *res)
+{
+ int ret = -1;
+ struct addrinfo *k_res = NULL;
+ char *k_nodename = NULL;
+ char *k_servname = NULL;
+ struct addrinfo *k_hints = NULL;
+
+ LOG_I("syscall: getaddrinfo");
+
+ if (nodename)
+ {
+ k_nodename = rt_strdup(nodename);
+ if (!k_nodename) goto exit;
+ }
+ if (servname)
+ {
+ k_servname = rt_strdup(servname);
+ if (!k_servname)
+ {
+ goto exit;
+ }
+ }
+
+ if (hints)
+ {
+ k_hints = (struct addrinfo*) rt_malloc(sizeof *hints);
+ if (!k_hints)
+ {
+ goto exit;
+ }
+
+ rt_memset(k_hints, 0x0, sizeof(struct addrinfo));
+ k_hints->ai_flags = hints->ai_flags;
+ k_hints->ai_family = hints->ai_family;
+ k_hints->ai_socktype = hints->ai_socktype;
+ k_hints->ai_protocol = hints->ai_protocol;
+ k_hints->ai_addrlen = hints->ai_addrlen;
+ }
+
+ ret = sal_getaddrinfo(k_nodename, k_servname, k_hints, &k_res);
+ if (ret == 0)
+ {
+ /* set sockaddr */
+ sockaddr_tomusl(k_res->ai_addr, res->ai_addr);
+ res->ai_addrlen = k_res->ai_addrlen;
+
+ /* set up addrinfo */
+ res->ai_family = k_res->ai_family;
+ res->ai_flags = k_res->ai_flags;
+ res->ai_next = NULL;
+
+ if (hints != NULL)
+ {
+ /* copy socktype & protocol from hints if specified */
+ res->ai_socktype = hints->ai_socktype;
+ res->ai_protocol = hints->ai_protocol;
+ }
+
+ sal_freeaddrinfo(k_res);
+ k_res = NULL;
+ }
+
+exit:
+ if (k_nodename)
+ {
+ rt_free(k_nodename);
+ }
+ if (k_servname)
+ {
+ rt_free(k_servname);
+ }
+ if (k_hints)
+ {
+ rt_free(k_hints);
+ }
+
+ return ret;
+}
+
+#define HOSTENT_BUFSZ 512
+int sys_gethostbyname2_r(const char *name, int af, struct hostent *ret,
+ char *buf, size_t buflen,
+ struct hostent **result, int *err)
+{
+ int sal_ret, sal_err;
+ struct hostent sal_he;
+ struct hostent *sal_result = NULL;
+ char *sal_buf = NULL;
+ char *k_name = NULL;
+
+ if (result == NULL)
+ {
+ /* not all arguments given */
+ *err = EINVAL;
+ return -1;
+ }
+ if ((name == NULL) || (ret == NULL) || (buf == NULL))
+ {
+ /* not all arguments given */
+ *err = EINVAL;
+ return -1;
+ }
+
+ *result = ret;
+ sal_buf = (char *)malloc (HOSTENT_BUFSZ);
+ if (sal_buf == NULL)
+ {
+ goto __exit;
+ }
+
+ k_name = rt_strdup(name);
+ if (k_name == NULL)
+ {
+ goto __exit;
+ }
+
+ /* get host by name in SAL */
+ sal_ret = sal_gethostbyname_r(k_name, &sal_he, sal_buf, HOSTENT_BUFSZ, &sal_result, &sal_err);
+ if (sal_ret == 0)
+ {
+ int index, cnt;
+ char *ptr = buf;
+
+ /* get counter */
+ index = 0;
+ while (sal_he.h_addr_list[index] != NULL) index ++;
+ cnt = index + 1;
+
+ /* update user space hostent */
+ ret->h_addrtype = sal_he.h_addrtype;
+ ret->h_length = sal_he.h_length;
+
+ rt_strncpy(ptr, k_name, buflen - (ptr - buf));
+ ret->h_name = ptr;
+ ptr += rt_strlen(k_name);
+
+ ret->h_addr_list = (char**)ptr;
+ ptr += cnt * sizeof(char*);
+
+ index = 0;
+ while (sal_he.h_addr_list[index] != NULL)
+ {
+ ret->h_addr_list[index] = ptr;
+ rt_memcpy(ptr, sal_he.h_addr_list[index], sal_he.h_length);
+
+ ptr += sal_he.h_length;
+ index ++;
+ }
+ ret->h_addr_list[index] = NULL;
+ }
+
+__exit:
+ /* release buffer */
+ if (sal_buf) free(sal_buf);
+ if (k_name) free(k_name);
+
+ return 0;
+}
+#endif
+
+char *sys_getcwd(char *buf, size_t size)
+{
+ return getcwd(buf, size);
+}
+
+int sys_chdir(const char *path)
+{
+ return chdir(path);
+}
+
+int sys_mkdir(const char *path, mode_t mode)
+{
+ return mkdir(path, mode);
+}
+
+int sys_rmdir(const char *path)
+{
+ return unlink(path);
+}
+
+typedef uint64_t ino_t;
+struct libc_dirent {
+ ino_t d_ino;
+ off_t d_off;
+ unsigned short d_reclen;
+ unsigned char d_type;
+ char d_name[256];
+};
+int sys_getdents(int fd, struct libc_dirent *dirp, size_t nbytes)
+{
+ int ret;
+ struct dfs_fd *dfs_fd;
+ size_t cnt = (nbytes / sizeof(struct libc_dirent));
+ size_t rtt_nbytes;
+ struct dirent *rtt_dirp;
+
+ if (cnt == 0)
+ {
+ return 0;
+ }
+ rtt_nbytes = cnt * sizeof(struct dirent);
+ rtt_dirp = (struct dirent*)rt_malloc(rtt_nbytes);
+ if (!rtt_dirp)
+ {
+ return 0;
+ }
+ dfs_fd = fd_get(fd);
+ ret = dfs_file_getdents(dfs_fd, rtt_dirp, nbytes);
+ fd_put(dfs_fd);
+ if (ret)
+ {
+ size_t i;
+ cnt = ret / sizeof(struct dirent);
+ for (i = 0; i < cnt; i++)
+ {
+ dirp[i].d_ino = 0;
+ dirp[i].d_off = 0;
+ dirp[i].d_type = rtt_dirp[i].d_type;
+ dirp[i].d_reclen = sizeof(struct libc_dirent);
+ strcpy(dirp[i].d_name, rtt_dirp[i].d_name);
+ }
+ ret = cnt * sizeof(struct libc_dirent);
+ }
+ rt_free(rtt_dirp);
+ return ret;
+}
+
+rt_err_t sys_get_errno(void)
+{
+ return rt_get_errno();
+}
+
+void sys_set_thread_area(void *p)
+{
+ lwp_set_thread_area(p);
+}
+
+long sys_set_tid_address(int *tidptr)
+{
+ return 0;
+}
+
+int sys_access(const char *filename, int mode)
+{
+ int ret;
+#ifdef RT_USING_USERSPACE
+ rt_size_t len;
+ char *kname;
+
+ if (!lwp_user_accessable((void*)filename, 1))
+ return -1;
+
+ len = rt_strlen(filename);
+ if (!len)
+ return -1;
+
+ kname = (char *)kmem_get(len + 1);
+ if (!kname)
+ return -1;
+
+ lwp_get_from_user(kname, (void *)filename, len + 1);
+ ret = open(kname, mode, 0);
+ kmem_put(kname);
+#else
+ ret = open(filename, mode, 0);
+#endif
+ if (ret >= 0)
+ {
+ close(ret);
+ }
+
+ return (ret >= 0)? 0: ret;
+}
+
+int sys_pipe(int fd[2])
+{
+ /* not implemented */
+ return -1;
+}
+
+const static void* func_table[] =
+{
+ (void*)sys_exit, /* 01 */
+ (void*)sys_read,
+ (void*)sys_write,
+ (void*)sys_lseek,
+ (void*)sys_open, /* 05 */
+ (void*)sys_close,
+ (void*)sys_ioctl,
+ (void*)sys_fstat,
+ (void*)sys_poll,
+ (void*)sys_nanosleep, /* 10 */
+ (void*)sys_gettimeofday,
+ (void*)sys_settimeofday,
+ (void*)sys_exec,
+ (void*)sys_kill,
+ (void*)sys_getpid, /* 15 */
+ (void*)sys_getpriority,
+ (void*)sys_setpriority,
+ (void*)sys_sem_create,
+ (void*)sys_sem_delete,
+ (void*)sys_sem_take, /* 20 */
+ (void*)sys_sem_release,
+ (void*)sys_mutex_create,
+ (void*)sys_mutex_delete,
+ (void*)sys_mutex_take,
+ (void*)sys_mutex_release, /* 25 */
+ (void*)sys_event_create,
+ (void*)sys_event_delete,
+ (void*)sys_event_send,
+ (void*)sys_event_recv,
+ (void*)sys_mb_create, /* 30 */
+ (void*)sys_mb_delete,
+ (void*)sys_mb_send,
+ (void*)sys_mb_send_wait,
+ (void*)sys_mb_recv,
+ (void*)sys_mq_create, /* 35 */
+ (void*)sys_mq_delete,
+ (void*)sys_mq_send,
+ (void*)sys_mq_urgent,
+ (void*)sys_mq_recv,
+ (void*)sys_thread_create, /* 40 */
+ (void*)sys_thread_delete,
+ (void*)sys_thread_startup,
+ (void*)sys_thread_self,
+ (void*)sys_channel_open,
+ (void*)sys_channel_close, /* 45 */
+ (void*)sys_channel_send,
+ (void*)sys_channel_send_recv_timeout,
+ (void*)sys_channel_reply,
+ (void*)sys_channel_recv_timeout,
+ (void*)sys_enter_critical, /* 50 */
+ (void*)sys_exit_critical,
+
+ SYSCALL_USPACE(sys_brk),
+ SYSCALL_USPACE(sys_mmap2),
+ SYSCALL_USPACE(sys_munmap),
+
+ SYSCALL_USPACE(sys_shmget),
+ SYSCALL_USPACE(sys_shmrm),
+ SYSCALL_USPACE(sys_shmat),
+ SYSCALL_USPACE(sys_shmdt),
+
+ (void *)sys_device_init,
+ (void *)sys_device_register,
+ (void *)sys_device_control,
+ (void *)sys_device_find,
+ (void *)sys_device_open,
+ (void *)sys_device_close,
+ (void *)sys_device_read,
+ (void *)sys_device_write,
+
+ (void *)sys_stat,
+ (void *)sys_thread_find,
+
+ SYSCALL_NET(sys_accept),
+ SYSCALL_NET(sys_bind),
+ SYSCALL_NET(sys_shutdown),
+ SYSCALL_NET(sys_getpeername),
+ SYSCALL_NET(sys_getsockname),
+ SYSCALL_NET(sys_getsockopt),
+ SYSCALL_NET(sys_setsockopt),
+ SYSCALL_NET(sys_connect),
+ SYSCALL_NET(sys_listen),
+ SYSCALL_NET(sys_recv),
+ SYSCALL_NET(sys_recvfrom),
+ SYSCALL_NET(sys_send),
+ SYSCALL_NET(sys_sendto),
+ SYSCALL_NET(sys_socket),
+
+ SYSCALL_NET(sys_closesocket),
+ SYSCALL_NET(sys_getaddrinfo),
+ SYSCALL_NET(sys_gethostbyname2_r),
+
+ (void *)sys_notimpl, //(void *)network,
+ (void *)sys_notimpl, //(void *)network,
+ (void *)sys_notimpl, //(void *)network,
+ (void *)sys_notimpl, //(void *)network,
+ (void *)sys_notimpl, //(void *)network,
+ (void *)sys_notimpl, //(void *)network,
+ (void *)sys_notimpl, //(void *)network,
+ (void *)sys_notimpl, //(void *)network,
+
+#ifdef RT_USING_DFS
+ (void *)sys_select,
+#else
+ (void *)sys_notimpl,
+#endif
+
+ (void *)sys_notimpl, //(void *)sys_hw_interrupt_disable,
+ (void *)sys_notimpl, //(void *)sys_hw_interrupt_enable,
+
+ (void *)sys_tick_get,
+ (void *)sys_exit_group,
+
+ (void *)sys_notimpl, //(void *)rt_delayed_work_init,
+ (void *)sys_notimpl, //(void *)rt_work_submit,
+ (void *)sys_notimpl, //(void *)rt_wqueue_wakeup,
+ (void *)sys_thread_mdelay,
+ (void*)sys_sigaction,
+ (void*)sys_sigprocmask,
+ (void*)sys_thread_kill,
+ (void*)sys_thread_sighandler_set,
+ (void*)sys_thread_sigprocmask,
+ (void*)sys_notimpl,
+ (void*)sys_notimpl,
+ (void*)sys_waitpid,
+
+ (void *)sys_timer_create,
+ (void *)sys_timer_delete,
+ (void *)sys_timer_start,
+ (void *)sys_timer_stop,
+ (void *)sys_timer_control,
+ (void *)sys_getcwd,
+ (void *)sys_chdir,
+ (void *)sys_unlink,
+ (void *)sys_mkdir,
+ (void *)sys_rmdir,
+ (void *)sys_getdents,
+ (void *)sys_get_errno,
+ (void *)sys_set_thread_area,
+ (void *)sys_set_tid_address,
+ (void *)sys_access,
+ (void *)sys_pipe,
};
const void *lwp_get_sys_api(rt_uint32_t number)
diff --git a/components/lwp/lwp_syscall.h b/components/lwp/lwp_syscall.h
index a2809059f0b679d276ca77a6145c12291639e0f8..bb3fab6535857f132aa951bfe1a1bcf824f04cbf 100644
--- a/components/lwp/lwp_syscall.h
+++ b/components/lwp/lwp_syscall.h
@@ -1,11 +1,11 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
- * 2018-12-10 Jesven fix complie error in iar and keil
+ * 2019-11-12 Jesven the first version
*/
#ifndef __LWP_SYSCALL_H__
@@ -14,9 +14,14 @@
#include
#include
#include
+#include
#include
#include
+#ifdef __cplusplus
+extern "C" {
+#endif
+
typedef long suseconds_t; /* microseconds (signed) */
typedef uint32_t id_t; /* may contain pid, uid or gid */
@@ -30,35 +35,62 @@ typedef uint32_t id_t; /* may contain pid, uid or gid */
#define PRIO_PGRP 1
#define PRIO_USER 2
-#ifndef TIMEVAL_TO_TIMESPEC
-#define TIMEVAL_TO_TIMESPEC(tv, ts) { \
- (ts)->tv_sec = (tv)->tv_sec; \
- (ts)->tv_nsec = (tv)->tv_usec * 1000; \
-}
-#endif
-
-#ifndef TIMESPEC_TO_TIMEVAL
-#define TIMESPEC_TO_TIMEVAL(tv, ts) { \
- (tv)->tv_sec = (ts)->tv_sec; \
- (tv)->tv_usec = (ts)->tv_nsec / 1000; \
-}
-#endif
-
void sys_exit(int value);
ssize_t sys_read(int fd, void *buf, size_t nbyte);
ssize_t sys_write(int fd, const void *buf, size_t nbyte);
off_t sys_lseek(int fd, off_t offset, int whence);
int sys_open(const char *name, int mode, ...);
int sys_close(int fd);
+int sys_ioctl(int fd, unsigned long cmd, void* data);
+int sys_fstat(int file, struct stat *buf);
+int sys_poll(struct pollfd *fds, nfds_t nfds, int timeout);
int sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
-int sys_getpriority(int which, id_t who);
-int sys_setpriority(int which, id_t who, int prio);
int sys_gettimeofday(struct timeval *tp, struct timezone *tzp);
int sys_settimeofday(const struct timeval *tv, const struct timezone *tzp);
-int sys_msgget(key_t key, int msgflg);
-int sys_msgsend(int msqid, const void *msgp, size_t msgsz, int msgflg);
-int sys_msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
+int sys_exec(char *filename, int argc, char **argv, char **envp);
+int sys_kill(int pid, int sig);
+int sys_getpid(void);
+int sys_getpriority(int which, id_t who);
+int sys_setpriority(int which, id_t who, int prio);
+rt_sem_t sys_sem_create(const char *name, rt_uint32_t value, rt_uint8_t flag);
+rt_err_t sys_sem_delete(rt_sem_t sem);
+rt_err_t sys_sem_take(rt_sem_t sem, rt_int32_t time);
+rt_err_t sys_sem_release(rt_sem_t sem);
+rt_mutex_t sys_mutex_create(const char *name, rt_uint8_t flag);
+rt_err_t sys_mutex_delete(rt_mutex_t mutex);
+rt_err_t sys_mutex_take(rt_mutex_t mutex, rt_int32_t time);
+rt_err_t sys_mutex_release(rt_mutex_t mutex);
+rt_event_t sys_event_create(const char *name, rt_uint8_t flag);
+rt_err_t sys_event_delete(rt_event_t event);
+rt_err_t sys_event_send(rt_event_t event, rt_uint32_t set);
+rt_err_t sys_event_recv(rt_event_t event, rt_uint32_t set, rt_uint8_t opt, rt_int32_t timeout, rt_uint32_t *recved);
+rt_mailbox_t sys_mb_create(const char *name, rt_size_t size, rt_uint8_t flag);
+rt_err_t sys_mb_delete(rt_mailbox_t mb);
+rt_err_t sys_mb_send(rt_mailbox_t mb, rt_uint32_t value);
+rt_err_t sys_mb_send_wait(rt_mailbox_t mb, rt_uint32_t value, rt_int32_t timeout);
+rt_err_t sys_mb_recv(rt_mailbox_t mb, rt_uint32_t *value, rt_int32_t timeout);
+rt_mq_t sys_mq_create(const char *name, rt_size_t msg_size, rt_size_t max_msgs, rt_uint8_t flag);
+rt_err_t sys_mq_delete(rt_mq_t mq);
+rt_err_t sys_mq_send(rt_mq_t mq, void *buffer, rt_size_t size);
+rt_err_t sys_mq_urgent(rt_mq_t mq, void *buffer, rt_size_t size);
+rt_err_t sys_mq_recv(rt_mq_t mq, void *buffer, rt_size_t size, rt_int32_t timeout);
+rt_thread_t sys_thread_create(void *arg[]);
+rt_err_t sys_thread_delete(rt_thread_t thread);
+rt_err_t sys_thread_startup(rt_thread_t thread);
+rt_thread_t sys_thread_self(void);
+int sys_channel_open(const char *name, int flags);
+rt_err_t sys_channel_close(int fd);
+rt_err_t sys_channel_send(int fd, rt_channel_msg_t data);
+rt_err_t sys_channel_send_recv(int fd, rt_channel_msg_t data, rt_channel_msg_t data_ret);
+rt_err_t sys_channel_reply(int fd, rt_channel_msg_t data);
+rt_err_t sys_channel_recv(int fd, rt_channel_msg_t data);
+void sys_enter_critical(void);
+void sys_exit_critical(void);
int sys_log(const char* log, int size);
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/components/lwp/lwp_user_mm.c b/components/lwp/lwp_user_mm.c
new file mode 100644
index 0000000000000000000000000000000000000000..c5ebe96bf4d8c5176b66c429cbe4c4a8c21fbbe3
--- /dev/null
+++ b/components/lwp/lwp_user_mm.c
@@ -0,0 +1,523 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-10-28 Jesven first version
+ */
+
+#include
+#include
+
+#ifdef RT_USING_USERSPACE
+
+#include
+#include
+#include
+#include
+#include
+
+#ifdef RT_USING_GDBSERVER
+#include
+#include
+#endif
+
+int lwp_user_space_init(struct rt_lwp *lwp)
+{
+ return arch_user_space_init(lwp);
+}
+
+void switch_mmu(void *mtable);
+void *mmu_table_get(void);
+void lwp_mmu_switch(struct rt_thread *thread)
+{
+ struct rt_lwp *l = RT_NULL;
+ void *pre_mmu_table, *new_mmu_table;
+
+ if (thread->lwp)
+ {
+ l = (struct rt_lwp*)thread->lwp;
+ new_mmu_table = (void*)((char*)l->mmu_info.vtable + l->mmu_info.pv_off);
+#ifdef LWP_DEBUG
+ {
+ int i;
+ size_t *p = l->mmu_info.vtable;
+ rt_kprintf("vtable = 0x%p\n", l->mmu_info.vtable);
+ for (i = 0; i < 0x1000; i++)
+ {
+ rt_kprintf("0x%08x ", *p++);
+ if (( i & 0xf) == 0xf)
+ {
+ rt_kprintf("\n");
+ }
+ }
+ }
+#endif
+ }
+ else
+ {
+ new_mmu_table = arch_kernel_mmu_table_get();
+ }
+
+ pre_mmu_table = mmu_table_get();
+ if (pre_mmu_table != new_mmu_table)
+ {
+#ifdef RT_USING_GDBSERVER
+ set_process_id((uint32_t)(size_t)l);
+#endif
+ switch_mmu(new_mmu_table);
+ }
+#ifdef RT_USING_GDBSERVER
+ if (l && l->debug)
+ {
+ uint32_t step_type;
+
+ step_type = gdb_get_step_type();
+
+ if ((step_type == 2) || (thread->step_exec && (step_type == 1)))
+ {
+ arch_activate_step();
+ }
+ else
+ {
+ arch_deactivate_step();
+ }
+ }
+#endif
+}
+
+static void free_area(struct rt_lwp *lwp, void *addr, size_t size, int auto_free)
+{
+ void *va, *pa;
+ int i;
+
+ for (va = addr, i = 0; i < size; va = (void*)((char*)va + ARCH_PAGE_SIZE), i += ARCH_PAGE_SIZE)
+ {
+ pa = rt_hw_mmu_v2p(&lwp->mmu_info, va);
+ if (pa)
+ {
+ rt_hw_mmu_unmap(&lwp->mmu_info, va, ARCH_PAGE_SIZE);
+ if (auto_free)
+ {
+ rt_pages_free((void*)((char*)pa - PV_OFFSET), 0);
+ }
+ }
+ }
+}
+
+void lwp_unmap_user_space(struct rt_lwp *lwp)
+{
+ struct lwp_avl_struct* node;
+ rt_mmu_info *m_info = &lwp->mmu_info;
+
+ while ((node = lwp_map_find_first(lwp->map_area)) != 0)
+ {
+ struct rt_mm_area_struct *ma;
+
+ ma = (struct rt_mm_area_struct*)node->data;
+ free_area(lwp, (void*)ma->addr, ma->size, ma->auto_free);
+ lwp_map_area_remove(&lwp->map_area, ma->addr);
+ }
+ rt_pages_free(m_info->vtable, 2);
+}
+
+static void *_lwp_map_user(struct rt_lwp *lwp, void *map_va, size_t map_size)
+{
+ void *va;
+ int ret;
+ rt_mmu_info *m_info = &lwp->mmu_info;
+
+ va = rt_hw_mmu_map_auto(m_info, map_va, map_size, MMU_MAP_U_RWCB);
+ if (!va)
+ {
+ return 0;
+ }
+ ret = lwp_map_area_insert(&lwp->map_area, (size_t)va, map_size, 1);
+ if (ret != 0)
+ {
+ free_area(lwp, va, map_size, 1);
+ return 0;
+ }
+ return va;
+}
+
+int lwp_unmap_user(struct rt_lwp *lwp, void *va, size_t size)
+{
+ rt_base_t level;
+ size_t offset;
+
+ if (!size)
+ {
+ return -1;
+ }
+ offset = (size_t)va & ARCH_PAGE_MASK;
+ size += (offset + ARCH_PAGE_SIZE - 1);
+ size &= ~ARCH_PAGE_MASK;
+ va = (void*)((size_t)va & ~ARCH_PAGE_MASK);
+
+ level = rt_hw_interrupt_disable();
+ free_area(lwp, va, size, 1);
+ lwp_map_area_remove(&lwp->map_area, (size_t)va);
+ rt_hw_interrupt_enable(level);
+ return 0;
+}
+
+int lwp_unmap_user_phy(struct rt_lwp *lwp, void *va, size_t size)
+{
+ rt_base_t level;
+ size_t offset;
+
+ if (!size)
+ {
+ return -1;
+ }
+ offset = (size_t)va & ARCH_PAGE_MASK;
+ size += (offset + ARCH_PAGE_SIZE - 1);
+ size &= ~ARCH_PAGE_MASK;
+ va = (void*)((size_t)va & ~ARCH_PAGE_MASK);
+
+ level = rt_hw_interrupt_disable();
+ free_area(lwp, va, size, 0);
+ lwp_map_area_remove(&lwp->map_area, (size_t)va);
+ rt_hw_interrupt_enable(level);
+ return 0;
+}
+
+void *lwp_map_user(struct rt_lwp *lwp, void *map_va, size_t map_size)
+{
+ rt_base_t level;
+ void *ret;
+ size_t offset;
+
+ if (!map_size)
+ {
+ return 0;
+ }
+ offset = (size_t)map_va & ARCH_PAGE_MASK;
+ map_size += (offset + ARCH_PAGE_SIZE - 1);
+ map_size &= ~ARCH_PAGE_MASK;
+ map_va = (void*)((size_t)map_va & ~ARCH_PAGE_MASK);
+
+ level = rt_hw_interrupt_disable();
+ ret = _lwp_map_user(lwp, map_va, map_size);
+ rt_hw_interrupt_enable(level);
+ if (ret)
+ {
+ ret = (void*)((char*)ret + offset);
+ }
+ return ret;
+}
+
+static void *_lwp_map_user_phy(struct rt_lwp *lwp, void *map_va, void *map_pa, size_t map_size, int cached)
+{
+ void *va;
+ rt_mmu_info *m_info = &lwp->mmu_info;
+ size_t attr;
+ int ret;
+
+ if (cached)
+ {
+ attr = MMU_MAP_U_RWCB;
+ }
+ else
+ {
+ attr = MMU_MAP_U_RW;
+ }
+
+ va = rt_hw_mmu_map(m_info, map_va, map_pa, map_size, attr);
+ ret = lwp_map_area_insert(&lwp->map_area, (size_t)va, map_size, 0);
+ if (ret != 0)
+ {
+ free_area(lwp, va, map_size, 0);
+ return 0;
+ }
+ return va;
+}
+
+void *lwp_map_user_phy(struct rt_lwp *lwp, void *map_va, void *map_pa, size_t map_size, int cached)
+{
+ rt_base_t level;
+ void *ret;
+ size_t offset;
+
+ if (!map_size)
+ {
+ return 0;
+ }
+ if (map_va)
+ {
+ if (((size_t)map_va & ARCH_PAGE_MASK) != ((size_t)map_pa & ARCH_PAGE_MASK))
+ {
+ return 0;
+ }
+ }
+ offset = (size_t)map_pa & ARCH_PAGE_MASK;
+ map_size += (offset + ARCH_PAGE_SIZE - 1);
+ map_size &= ~ARCH_PAGE_MASK;
+ map_pa = (void*)((size_t)map_pa & ~ARCH_PAGE_MASK);
+
+ level = rt_hw_interrupt_disable();
+ ret = _lwp_map_user_phy(lwp, map_va, map_pa, map_size, cached);
+ rt_hw_interrupt_enable(level);
+ if (ret)
+ {
+ ret = (void*)((char*)ret + offset);
+ }
+ return ret;
+}
+
+int lwp_brk(void *addr)
+{
+ rt_base_t level;
+ int ret = -1;
+ struct rt_lwp *lwp;
+
+ level = rt_hw_interrupt_disable();
+ lwp = rt_thread_self()->lwp;
+
+ if ((size_t)addr <= lwp->end_heap)
+ {
+ ret = (int)lwp->end_heap;
+ }
+ else
+ {
+ size_t size;
+ void *va;
+
+ size = (((size_t)addr - lwp->end_heap) + ARCH_PAGE_SIZE - 1) & ~ARCH_PAGE_MASK;
+ va = lwp_map_user(lwp, (void*)lwp->end_heap, size);
+ if (va)
+ {
+ lwp->end_heap += size;
+ ret = 0;
+ }
+ else
+ {
+ ret = -1;
+ }
+ }
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
+
+void* lwp_mmap2(void *addr, size_t length, int prot,
+ int flags, int fd, off_t pgoffset)
+{
+ rt_base_t level;
+ void *ret = (void*)-1;
+ struct rt_lwp *lwp;
+
+ level = rt_hw_interrupt_disable();
+ if (fd == -1)
+ {
+ lwp = rt_thread_self()->lwp;
+ ret = lwp_map_user(lwp, addr, length);
+ if (!ret)
+ {
+ ret = (void*)-1;
+ }
+ }
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
+
+int lwp_munmap(void *addr, size_t length)
+{
+ rt_base_t level;
+ int ret;
+ struct rt_lwp *lwp;
+
+ level = rt_hw_interrupt_disable();
+ lwp = rt_thread_self()->lwp;
+ ret = lwp_unmap_user(lwp, addr, length);
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
+
+size_t lwp_get_from_user(void *dst, void *src, size_t size)
+{
+ struct rt_lwp *lwp;
+ rt_mmu_info *m_info;
+
+ /* check src */
+ if (src >= (void*)KERNEL_VADDR_START)
+ {
+ return 0;
+ }
+ if ((void*)((char*)src + size) > (void*)KERNEL_VADDR_START)
+ {
+ return 0;
+ }
+
+ lwp = lwp_self();
+ if (!lwp)
+ {
+ return 0;
+ }
+ m_info = &lwp->mmu_info;
+
+ return lwp_data_get(m_info, dst, src, size);
+}
+
+size_t lwp_put_to_user(void *dst, void *src, size_t size)
+{
+ struct rt_lwp *lwp;
+ rt_mmu_info *m_info;
+
+ /* check dst */
+ if (dst >= (void*)KERNEL_VADDR_START)
+ {
+ return 0;
+ }
+ if ((void*)((char*)dst + size) > (void*)KERNEL_VADDR_START)
+ {
+ return 0;
+ }
+
+ lwp = lwp_self();
+ if (!lwp)
+ {
+ return 0;
+ }
+ m_info = &lwp->mmu_info;
+ return lwp_data_put(m_info, dst, src, size);
+}
+
+int lwp_user_accessable(void *addr, size_t size)
+{
+ void *addr_start, *addr_end, *next_page;
+ void *tmp_addr;
+ struct rt_lwp *lwp = lwp_self();
+ rt_mmu_info *mmu_info = RT_NULL;
+
+ if (!lwp)
+ {
+ return 0;
+ }
+ if (!size || !addr)
+ {
+ return 0;
+ }
+ addr_start = addr;
+ addr_end = (void*)((char*)addr + size);
+ if (addr_start >= (void*)KERNEL_VADDR_START)
+ {
+ return 0;
+ }
+ if (addr_start > (void *)KERNEL_VADDR_START)
+ {
+ return 0;
+ }
+
+ mmu_info = &lwp->mmu_info;
+ next_page = (void*)(((size_t)addr_start + ARCH_PAGE_SIZE) & ~(ARCH_PAGE_SIZE - 1));
+ do
+ {
+ size_t len = (char*)next_page - (char*)addr_start;
+
+ if (size < len)
+ {
+ len = size;
+ }
+ tmp_addr = rt_hw_mmu_v2p(mmu_info, addr_start);
+ if (!tmp_addr)
+ {
+ return 0;
+ }
+ addr_start = (void*)((char*)addr_start + len);
+ size -= len;
+ next_page = (void*)((char*)next_page + ARCH_PAGE_SIZE);
+ } while (addr_start < addr_end);
+ return 1;
+}
+
+/* src is in mmu_info space, dst is in current thread space */
+size_t lwp_data_get(rt_mmu_info *mmu_info, void *dst, void *src, size_t size)
+{
+ size_t copy_len = 0;
+ void *addr_start, *addr_end, *next_page;
+ void *tmp_dst, *tmp_src;
+
+ if (!size || !dst)
+ {
+ return 0;
+ }
+ tmp_dst = dst;
+ addr_start = src;
+ addr_end = (void*)((char*)src + size);
+ next_page = (void*)(((size_t)addr_start + ARCH_PAGE_SIZE) & ~(ARCH_PAGE_SIZE - 1));
+ do
+ {
+ size_t len = (char*)next_page - (char*)addr_start;
+
+ if (size < len)
+ {
+ len = size;
+ }
+ tmp_src = rt_hw_mmu_v2p(mmu_info, addr_start);
+ if (!tmp_src)
+ {
+ break;
+ }
+ tmp_src = (void*)((char*)rt_hw_mmu_v2p(mmu_info, addr_start) - PV_OFFSET);
+ rt_memcpy(tmp_dst, tmp_src, len);
+ tmp_dst = (void*)((char*)tmp_dst + len);
+ addr_start = (void*)((char*)addr_start + len);
+ size -= len;
+ next_page = (void*)((char*)next_page + ARCH_PAGE_SIZE);
+ copy_len += len;
+ } while (addr_start < addr_end);
+ return copy_len;
+}
+
+/* dst is in mmu_info space, src is in current thread space */
+size_t lwp_data_put(rt_mmu_info *mmu_info, void *dst, void *src, size_t size)
+{
+ size_t copy_len = 0;
+ void *addr_start, *addr_end, *next_page;
+ void *tmp_dst, *tmp_src;
+
+ if (!size || !dst)
+ {
+ return 0;
+ }
+ tmp_src = src;
+ addr_start = dst;
+ addr_end = (void*)((char*)dst + size);
+ next_page = (void*)(((size_t)addr_start + ARCH_PAGE_SIZE) & ~(ARCH_PAGE_SIZE - 1));
+ do
+ {
+ size_t len = (char*)next_page - (char*)addr_start;
+
+ if (size < len)
+ {
+ len = size;
+ }
+ tmp_dst = rt_hw_mmu_v2p(mmu_info, addr_start);
+ if (!tmp_dst)
+ {
+ break;
+ }
+ tmp_dst = (void*)((char*)rt_hw_mmu_v2p(mmu_info, addr_start) - PV_OFFSET);
+ rt_memcpy(tmp_dst, tmp_src, len);
+ tmp_src = (void*)((char*)tmp_src + len);
+ addr_start = (void*)((char*)addr_start + len);
+ size -= len;
+ next_page = (void*)((char*)next_page + ARCH_PAGE_SIZE);
+ copy_len += len;
+ } while (addr_start < addr_end);
+ return copy_len;
+}
+
+void lwp_data_cache_flush(rt_mmu_info *mmu_info, void *vaddr, size_t size)
+{
+ void *paddr;
+
+ paddr = rt_hw_mmu_v2p(mmu_info, vaddr);
+ paddr = (void*)((char*)paddr - PV_OFFSET);
+
+ rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, paddr, size);
+}
+#endif
diff --git a/components/lwp/lwp_user_mm.h b/components/lwp/lwp_user_mm.h
new file mode 100644
index 0000000000000000000000000000000000000000..d72a1ff30080c4779e73c89eed13069393bc2e15
--- /dev/null
+++ b/components/lwp/lwp_user_mm.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-10-28 Jesven first version
+ */
+#ifndef __LWP_USER_MM_H__
+#define __LWP_USER_MM_H__
+
+#include
+#include
+
+#ifdef RT_USING_USERSPACE
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int lwp_user_space_init(struct rt_lwp *lwp);
+void lwp_unmap_user_space(struct rt_lwp *lwp);
+
+int lwp_unmap_user(struct rt_lwp *lwp, void *va, size_t size);
+void *lwp_map_user(struct rt_lwp *lwp, void *map_va, size_t map_size);
+
+void *lwp_map_user_phy(struct rt_lwp *lwp, void *map_va, void *map_pa, size_t map_size, int cached);
+int lwp_unmap_user_phy(struct rt_lwp *lwp, void *va, size_t size);
+
+int lwp_brk(void *addr);
+void* lwp_mmap2(void *addr, size_t length, int prot, int flags, int fd, off_t pgoffset);
+int lwp_munmap(void *addr, size_t length);
+
+size_t lwp_get_from_user(void *dst, void *src, size_t size);
+size_t lwp_put_to_user(void *dst, void *src, size_t size);
+int lwp_user_accessable(void *addr, size_t size);
+
+size_t lwp_data_get(rt_mmu_info *mmu_info, void *dst, void *src, size_t size);
+size_t lwp_data_put(rt_mmu_info *mmu_info, void *dst, void *src, size_t size);
+void lwp_data_cache_flush(rt_mmu_info *mmu_info, void *vaddr, size_t size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#endif /*__LWP_USER_MM_H__*/
diff --git a/components/net/lwip-2.0.2/src/arch/sys_arch.c b/components/net/lwip-2.0.2/src/arch/sys_arch.c
index 40c79011ec612e762276212c16ae7aed10fe859d..827dcd154bfe4ba24447bccd0545cf0b3b48f285 100644
--- a/components/net/lwip-2.0.2/src/arch/sys_arch.c
+++ b/components/net/lwip-2.0.2/src/arch/sys_arch.c
@@ -508,7 +508,7 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
t = timeout / (1000/RT_TICK_PER_SECOND);
}
- ret = rt_mb_recv(*mbox, (rt_ubase_t *)msg, t);
+ ret = rt_mb_recv_interruptibale(*mbox, (rt_ubase_t *)msg, t);
if(ret != RT_EOK)
{
return SYS_ARCH_TIMEOUT;
diff --git a/components/net/netdev/src/netdev_ipaddr.c b/components/net/netdev/src/netdev_ipaddr.c
index a70a90bb75ccb34c6ee19441144b00adb31ea365..a0f4e2f97f2bc55e3ba35bfedbc881f67714da5a 100644
--- a/components/net/netdev/src/netdev_ipaddr.c
+++ b/components/net/netdev/src/netdev_ipaddr.c
@@ -9,6 +9,7 @@
*/
#include
+#include
#include
/* Here for now until needed in other places in lwIP */
diff --git a/components/net/sal_socket/include/sal_socket.h b/components/net/sal_socket/include/sal_socket.h
index b620bbe23cf602a5734cf6815c4b84689d768814..19ac3e27787fb8545f5a950f5c57cee0c3f2b7cb 100644
--- a/components/net/sal_socket/include/sal_socket.h
+++ b/components/net/sal_socket/include/sal_socket.h
@@ -35,8 +35,12 @@ typedef uint16_t in_port_t;
#define SOCK_STREAM 1
#define SOCK_DGRAM 2
#define SOCK_RAW 3
+#define SOCK_PACKET 10
-#define SOCK_MAX (SOCK_RAW + 1)
+#define SOCK_NONBLOCK 04000
+#define SOCK_CLOEXEC 02000000
+
+#define SOCK_MAX (SOCK_CLOEXEC + 1)
/* Option flags per-socket. These must match the SOF_ flags in ip.h (checked in init.c) */
#define SO_REUSEADDR 0x0004 /* Allow local address reuse */
diff --git a/components/utilities/ulog/ulog.c b/components/utilities/ulog/ulog.c
index 76100892982dde363d1e80b7439dc57a1c06d530..e2685afbbd787156aa1fc817f5701e51de9c0724 100644
--- a/components/utilities/ulog/ulog.c
+++ b/components/utilities/ulog/ulog.c
@@ -7,7 +7,7 @@
* Date Author Notes
* 2018-08-25 armink the first version
*/
-
+#include
#include
#include "ulog.h"
#include "rthw.h"
diff --git a/components/vbus/prio_queue.c b/components/vbus/prio_queue.c
index bca3cdcd9a698095226b0fa8e80326f128c7ecf1..0d15da5ab86d0933873117aa2c2fc2e52d536b9c 100644
--- a/components/vbus/prio_queue.c
+++ b/components/vbus/prio_queue.c
@@ -205,7 +205,7 @@ rt_err_t rt_prio_queue_pop(struct rt_prio_queue *que,
thread = rt_thread_self();
thread->error = RT_EOK;
- rt_thread_suspend(thread);
+ rt_thread_suspend_with_flag(thread, RT_UNINTERRUPTIBLE);
rt_list_insert_before(&(que->suspended_pop_list), &(thread->tlist));
diff --git a/components/vbus/vbus.c b/components/vbus/vbus.c
index 8add15d9dbacede318dbbb2374490b6a1c7e23a6..d471a9d21b274cefc66e14228b57332921337551 100644
--- a/components/vbus/vbus.c
+++ b/components/vbus/vbus.c
@@ -230,7 +230,7 @@ static void _bus_out_entry(void *param)
/* kick the guest, hoping this could force it do the work */
rt_vbus_tick(0, RT_VBUS_GUEST_VIRQ);
- rt_thread_suspend(rt_thread_self());
+ rt_thread_suspend_with_flag(rt_thread_self(), RT_UNINTERRUPTIBLE);
rt_schedule();
RT_VBUS_OUT_RING->blocked = 0;
@@ -334,7 +334,7 @@ rt_err_t rt_vbus_post(rt_uint8_t id,
/* We only touch the _chn_suspended_threads in thread, so lock the
* scheduler is enough. */
rt_enter_critical();
- rt_thread_suspend(thread);
+ rt_thread_suspend_with_flag(thread, RT_UNINTERRUPTIBLE);
rt_list_insert_after(&_chn_suspended_threads[id], &thread->tlist);
if (timeout > 0)
diff --git a/components/vbus/watermark_queue.h b/components/vbus/watermark_queue.h
index 0ecc52d8ff7710650ccef31108b1c6cca79cc914..8828ceb1ac44935d5c90ca3ca91ca93952c9c9b6 100644
--- a/components/vbus/watermark_queue.h
+++ b/components/vbus/watermark_queue.h
@@ -63,7 +63,7 @@ rt_inline rt_err_t rt_wm_que_inc(struct rt_watermark_queue *wg,
thread = rt_thread_self();
thread->error = RT_EOK;
- rt_thread_suspend(thread);
+ rt_thread_suspend_with_flag(thread, RT_UNINTERRUPTIBLE);
rt_list_insert_after(&wg->suspended_threads, &thread->tlist);
if (timeout > 0)
{
diff --git a/examples/kernel/thread_resume.c b/examples/kernel/thread_resume.c
index cea814616f92047339f38ddb2631e0fb516df045..26bebe91603f4288ad73872947f9686b83ce6821 100644
--- a/examples/kernel/thread_resume.c
+++ b/examples/kernel/thread_resume.c
@@ -18,7 +18,7 @@ static void thread1_entry(void* parameter)
/* 挂起自身 */
rt_kprintf("suspend thread self\n");
- rt_thread_suspend(tid1);
+ rt_thread_suspend_witch_flag(tid1, RT_UNINTERRUPTIBLE);
/* 主动执行线程调度 */
rt_schedule();
diff --git a/examples/kernel/thread_suspend.c b/examples/kernel/thread_suspend.c
index 947cc3cbf61a6f605bc1043f231ccec6efc0910c..a6cf11b08910e9c13eb3505c3bc413dc06675ba5 100644
--- a/examples/kernel/thread_suspend.c
+++ b/examples/kernel/thread_suspend.c
@@ -28,7 +28,7 @@ static void thread2_entry(void* parameter)
rt_thread_delay(10);
/* 挂起线程1 */
- rt_thread_suspend(tid1);
+ rt_thread_suspend_witch_flag(tid1, RT_UNINTERRUPTIBLE);
/* 延时10个OS Tick */
rt_thread_delay(10);
diff --git a/include/libc/libc_errno.h b/include/libc/libc_errno.h
index 9143c841f24b059d21f1320d1439a4bf2fb6839f..37f1ed44609d0dd4be609950d71a0087aafd05bf 100644
--- a/include/libc/libc_errno.h
+++ b/include/libc/libc_errno.h
@@ -13,7 +13,7 @@
#include
-#if defined(RT_USING_NEWLIB) || defined(_WIN32) || (defined( __GNUC__ ) && !defined(__ARMCC_VERSION))
+#if defined(RT_USING_NEWLIB) || defined(_WIN32) || defined(__ARMCC_GNUC__)
/* use errno.h file in toolchains */
#include
#endif
@@ -45,7 +45,7 @@ defined in armcc/errno.h
#define ERROR_BASE_NO 0
#endif
-#if !defined(RT_USING_NEWLIB) && !defined(_WIN32) && !(defined( __GNUC__ ) && !defined(__ARMCC_VERSION))
+#if !defined(RT_USING_NEWLIB) && !defined(_WIN32) && !defined(__ARMCC_GNUC__)
#define EPERM (ERROR_BASE_NO + 1)
#define ENOENT (ERROR_BASE_NO + 2)
diff --git a/include/libc/libc_fdset.h b/include/libc/libc_fdset.h
index 9700c7e83e6b0f5c36e47fa03c99a4c4360103a0..67014072c58e64b1db05e923ef372a7ac1689c32 100644
--- a/include/libc/libc_fdset.h
+++ b/include/libc/libc_fdset.h
@@ -15,7 +15,7 @@
#if defined(RT_USING_NEWLIB) || defined(_WIN32) || (defined( __GNUC__ ) && !defined(__ARMCC_VERSION))
#include
-#if defined(HAVE_SYS_SELECT_H)
+#if defined(HAVE_SYS_SELECT_H) && !defined(RT_USING_MINILIBC)
#include
#endif
diff --git a/include/libc/libc_signal.h b/include/libc/libc_signal.h
index 539685de3e32e43e523b03af3df0ba487e3a1095..643efaee9711265db700552ac559a034644ffc8d 100644
--- a/include/libc/libc_signal.h
+++ b/include/libc/libc_signal.h
@@ -55,16 +55,18 @@ struct siginfo
typedef struct siginfo siginfo_t;
#endif
+#if !defined(RT_USING_MUSL)
#define SI_USER 0x01 /* Signal sent by kill(). */
#define SI_QUEUE 0x02 /* Signal sent by sigqueue(). */
-#define SI_TIMER 0x03 /* Signal generated by expiration of a
+#define SI_TIMER 0x03 /* Signal generated by expiration of a
timer set by timer_settime(). */
-#define SI_ASYNCIO 0x04 /* Signal generated by completion of an
+#define SI_ASYNCIO 0x04 /* Signal generated by completion of an
asynchronous I/O request. */
-#define SI_MESGQ 0x05 /* Signal generated by arrival of a
+#define SI_MESGQ 0x05 /* Signal generated by arrival of a
message on an empty message queue. */
+#endif
-#if !defined(RT_USING_NEWLIB)
+#if !defined(RT_USING_NEWLIB) && !defined(RT_USING_MUSL)
typedef void (*_sig_func_ptr)(int);
typedef unsigned long sigset_t;
#endif
diff --git a/include/rtdef.h b/include/rtdef.h
index e4ddbd37d394833ce9c6bb7c2e47bd31e9a49f57..542a586ee1d322a212e332d30bec5dc21a090b7b 100644
--- a/include/rtdef.h
+++ b/include/rtdef.h
@@ -53,9 +53,9 @@ extern "C" {
/**@{*/
/* RT-Thread version information */
-#define RT_VERSION 4L /**< major version number */
+#define RT_VERSION 5L /**< major version number */
#define RT_SUBVERSION 0L /**< minor version number */
-#define RT_REVISION 3L /**< revise version number */
+#define RT_REVISION 0L /**< revise version number */
/* RT-Thread version */
#define RTTHREAD_VERSION ((RT_VERSION * 10000) + \
@@ -114,6 +114,10 @@ typedef rt_base_t rt_off_t; /**< Type for offset */
#define __CLANG_ARM
#endif
+#if defined(__ARMCC_VERSION) && defined(__GNUC__)
+#define __ARMCC_GNUC__
+#endif
+
/* Compiler Related Definitions */
#if defined(__CC_ARM) || defined(__CLANG_ARM) /* ARM Compiler */
#include
@@ -143,7 +147,7 @@ typedef rt_base_t rt_off_t; /**< Type for offset */
#define RTT_API
#elif defined (__GNUC__) /* GNU GCC Compiler */
- #ifdef RT_USING_NEWLIB
+ #if defined(RT_USING_NEWLIB) || defined(RT_USING_MUSL)
#include
#else
/* the version of GNU GCC must be greater than 4.x */
@@ -221,11 +225,11 @@ typedef int (*init_fn_t)(void);
#define INIT_EXPORT(fn, level)
#endif
-/* board init routines will be called in board_init() function */
+/* board initial routines will be called in board_init() function */
#define INIT_BOARD_EXPORT(fn) INIT_EXPORT(fn, "1")
-/* pre/device/component/env/app init routines will be called in init_thread */
-/* components pre-initialization (pure software initilization) */
+/* pre/device/component/env/app initial routines will be called in init_thread */
+/* components pre-initialization (pure software initialization) */
#define INIT_PREV_EXPORT(fn) INIT_EXPORT(fn, "2")
/* device initialization */
#define INIT_DEVICE_EXPORT(fn) INIT_EXPORT(fn, "3")
@@ -233,7 +237,7 @@ typedef int (*init_fn_t)(void);
#define INIT_COMPONENT_EXPORT(fn) INIT_EXPORT(fn, "4")
/* environment initialization (mount disk, ...) */
#define INIT_ENV_EXPORT(fn) INIT_EXPORT(fn, "5")
-/* appliation initialization (rtgui application etc ...) */
+/* application initialization (rtgui application etc ...) */
#define INIT_APP_EXPORT(fn) INIT_EXPORT(fn, "6")
#if !defined(RT_USING_FINSH)
@@ -287,6 +291,7 @@ typedef int (*init_fn_t)(void);
#define RT_EIO 8 /**< IO error */
#define RT_EINTR 9 /**< Interrupted system call */
#define RT_EINVAL 10 /**< Invalid argument */
+#define RT_ETRAP 11 /**< trap event */
/**@}*/
@@ -358,6 +363,11 @@ struct rt_object
#ifdef RT_USING_MODULE
void *module_id; /**< id of application module */
#endif
+
+#ifdef RT_USING_LWP
+ rt_list_t lwp_obj_list; /**< list node of kernel object for lwp */
+#endif
+
rt_list_t list; /**< list node of kernel object */
};
typedef struct rt_object *rt_object_t; /**< Type for kernel objects. */
@@ -393,7 +403,8 @@ enum rt_object_class_type
RT_Object_Class_Device = 0x09, /**< The object is a device. */
RT_Object_Class_Timer = 0x0a, /**< The object is a timer. */
RT_Object_Class_Module = 0x0b, /**< The object is a module. */
- RT_Object_Class_Unknown = 0x0c, /**< The object is unknown. */
+ RT_Object_Class_Channel = 0x0c, /**< The object is a channel */
+ RT_Object_Class_Unknown = 0x0d, /**< The object is unknown. */
RT_Object_Class_Static = 0x80 /**< The object is a static object. */
};
@@ -441,6 +452,10 @@ struct rt_object_information
#define RT_TIMER_CTRL_SET_ONESHOT 0x2 /**< change timer to one shot */
#define RT_TIMER_CTRL_SET_PERIODIC 0x3 /**< change timer to periodic */
#define RT_TIMER_CTRL_GET_STATE 0x4 /**< get timer run state active or deactive*/
+#define RT_TIMER_CTRL_GET_FUNC 0x5 /**< get timer timeout func */
+#define RT_TIMER_CTRL_SET_FUNC 0x6 /**< set timer timeout func */
+#define RT_TIMER_CTRL_GET_PARM 0x7 /**< get timer parameter */
+#define RT_TIMER_CTRL_SET_PARM 0x8 /**< get timer parameter */
#ifndef RT_TIMER_SKIP_LIST_LEVEL
#define RT_TIMER_SKIP_LIST_LEVEL 1
@@ -496,13 +511,30 @@ typedef siginfo_t rt_siginfo_t;
/*
* thread state definitions
*/
-#define RT_THREAD_INIT 0x00 /**< Initialized status */
-#define RT_THREAD_READY 0x01 /**< Ready status */
-#define RT_THREAD_SUSPEND 0x02 /**< Suspend status */
-#define RT_THREAD_RUNNING 0x03 /**< Running status */
-#define RT_THREAD_BLOCK RT_THREAD_SUSPEND /**< Blocked status */
-#define RT_THREAD_CLOSE 0x04 /**< Closed status */
-#define RT_THREAD_STAT_MASK 0x07
+#define RT_THREAD_INIT 0x00 /**< Initialized status */
+#define RT_THREAD_CLOSE 0x01 /**< Closed status */
+#define RT_THREAD_READY 0x02 /**< Ready status */
+#define RT_THREAD_RUNNING 0x03 /**< Running status */
+
+/*
+ * for rt_thread_suspend_with_flag()
+ */
+enum
+{
+ RT_INTERRUPTIBLE = 0,
+ RT_KILLABLE,
+ RT_UNINTERRUPTIBLE,
+};
+
+#define RT_THREAD_SUSPEND_MASK 0x04
+#define RT_SIGNAL_COMMON_WAKEUP_MASK 0x02
+#define RT_SIGNAL_KILL_WAKEUP_MASK 0x01
+
+#define RT_THREAD_SUSPEND_INTERRUPTIBLE (RT_THREAD_SUSPEND_MASK) /**< Suspend interruptable 0x4 */
+#define RT_THREAD_SUSPEND RT_THREAD_SUSPEND_INTERRUPTIBLE
+#define RT_THREAD_SUSPEND_KILLABLE (RT_THREAD_SUSPEND_MASK | RT_SIGNAL_COMMON_WAKEUP_MASK) /**< Suspend with killable 0x6 */
+#define RT_THREAD_SUSPEND_UNINTERRUPTIBLE (RT_THREAD_SUSPEND_MASK | RT_SIGNAL_COMMON_WAKEUP_MASK | RT_SIGNAL_KILL_WAKEUP_MASK) /**< Suspend with uninterruptable 0x7 */
+#define RT_THREAD_STAT_MASK 0x07
#define RT_THREAD_STAT_YIELD 0x08 /**< indicate whether remaining_tick has been reloaded since last schedule */
#define RT_THREAD_STAT_YIELD_MASK RT_THREAD_STAT_YIELD
@@ -556,6 +588,45 @@ struct rt_cpu
#endif
+struct rt_thread;
+
+#ifdef RT_USING_LWP
+typedef rt_err_t (*rt_wakeup_func_t)(void *object, struct rt_thread *thread);
+
+struct rt_wakeup
+{
+ rt_wakeup_func_t func;
+ void *user_data;
+};
+
+#define _LWP_NSIG 64
+#define _LWP_NSIG_BPW 32
+#define _LWP_NSIG_WORDS (_LWP_NSIG / _LWP_NSIG_BPW)
+
+typedef void (*lwp_sighandler_t)(int);
+
+typedef struct {
+ unsigned long sig[_LWP_NSIG_WORDS];
+} lwp_sigset_t;
+
+struct lwp_sigaction {
+ union {
+ void (*_sa_handler)(int);
+ void (*_sa_sigaction)(int, siginfo_t *, void *);
+ } __sa_handler;
+ lwp_sigset_t sa_mask;
+ int sa_flags;
+ void (*sa_restorer)(void);
+};
+
+struct rt_user_context
+{
+ void *sp;
+ void *pc;
+ void *flag;
+};
+#endif
+
/**
* Thread structure
*/
@@ -570,6 +641,10 @@ struct rt_thread
void *module_id; /**< id of application module */
#endif
+#ifdef RT_USING_LWP
+ rt_list_t lwp_obj_list; /**< list node of kernel object for lwp */
+#endif
+
rt_list_t list; /**< the object list */
rt_list_t tlist; /**< the thread list */
@@ -620,9 +695,16 @@ struct rt_thread
void *si_list; /**< the signal infor list */
#endif
+#if defined(RT_USING_LWP)
+ void *msg_ret; /**< the return msg */
+#endif
+
rt_ubase_t init_tick; /**< thread's initialized tick */
rt_ubase_t remaining_tick; /**< remaining tick */
+ rt_ubase_t tick_mark;
+ rt_ubase_t run_tick;
+
struct rt_timer thread_timer; /**< built-in thread timer */
void (*cleanup)(struct rt_thread *tid); /**< cleanup function when thread exit */
@@ -630,6 +712,29 @@ struct rt_thread
/* light weight process if present */
#ifdef RT_USING_LWP
void *lwp;
+ /* for user create */
+ void *user_entry;
+ void *user_stack;
+ rt_uint32_t user_stack_size;
+ rt_uint32_t *kernel_sp; /**< kernel stack point */
+ rt_list_t sibling; /**< next thread of same process */
+
+ lwp_sigset_t signal;
+ lwp_sigset_t signal_mask;
+ int signal_mask_bak;
+ rt_uint32_t signal_in_process;
+ lwp_sighandler_t signal_handler[_LWP_NSIG];
+ struct rt_user_context user_ctx;
+
+ struct rt_wakeup wakeup; /**< wakeup data */
+ int exit_request;
+#ifdef RT_USING_USERSPACE
+ int step_exec;
+ int debug_ret_user;
+ int debug_suspend;
+ struct rt_hw_exp_stack *regs;
+ void * thread_idr; /** lwp thread indicator */
+#endif
#endif
rt_ubase_t user_data; /**< private user data beyond this thread */
@@ -909,6 +1014,8 @@ enum rt_device_class_type
#define RT_DEVICE_CTRL_SUSPEND 0x02 /**< suspend device */
#define RT_DEVICE_CTRL_CONFIG 0x03 /**< configure device */
#define RT_DEVICE_CTRL_CLOSE 0x04 /**< close device */
+#define RT_DEVICE_CTRL_NOTIFY_SET 0x05 /**< set notify func */
+#define RT_DEVICE_CTRL_CONSOLE_OFLAG 0x06 /**< get console open flag */
#define RT_DEVICE_CTRL_SET_INT 0x10 /**< set interrupt */
#define RT_DEVICE_CTRL_CLR_INT 0x11 /**< clear interrupt */
@@ -995,6 +1102,29 @@ struct rt_device
void *user_data; /**< device private data */
};
+/**
+ * Notify structure
+ */
+struct rt_device_notify
+{
+ void (*notify)(rt_device_t dev);
+ struct rt_device *dev;
+};
+
+#ifdef RT_USING_LWP
+struct rt_channel
+{
+ struct rt_ipc_object parent; /**< inherit from object */
+ struct rt_thread *reply; /**< the thread will be reply */
+ rt_list_t wait_msg; /**< the wait queue of sender msg */
+ rt_list_t wait_thread; /**< the wait queue of sender thread */
+ rt_wqueue_t reader_queue; /**< channel poll queue */
+ rt_uint8_t stat; /**< the status of this channel */
+ rt_ubase_t ref;
+};
+typedef struct rt_channel *rt_channel_t;
+#endif
+
/**
* block device geometry structure
*/
diff --git a/include/rthw.h b/include/rthw.h
index 89877faf9033f0c822063b67ea067df51a9cf72b..6aa07a6718e808064b2d5f89ffe8d155b436698c 100644
--- a/include/rthw.h
+++ b/include/rthw.h
@@ -12,6 +12,7 @@
* 2017-10-17 Hichard add some micros
* 2018-11-17 Jesven add rt_hw_spinlock_t
* add smp support
+ * 2019-05-18 Bernard add empty definition for not enable cache case
*/
#ifndef __RT_HW_H__
@@ -49,6 +50,7 @@ enum RT_HW_CACHE_OPS
/*
* CPU interfaces
*/
+#ifdef RT_USING_CACHE
void rt_hw_cpu_icache_enable(void);
void rt_hw_cpu_icache_disable(void);
rt_base_t rt_hw_cpu_icache_status(void);
@@ -58,6 +60,20 @@ void rt_hw_cpu_dcache_enable(void);
void rt_hw_cpu_dcache_disable(void);
rt_base_t rt_hw_cpu_dcache_status(void);
void rt_hw_cpu_dcache_ops(int ops, void* addr, int size);
+#else
+
+/* define cache ops as empty */
+#define rt_hw_cpu_icache_enable
+#define rt_hw_cpu_icache_disable
+#define rt_hw_cpu_icache_ops
+#define rt_hw_cpu_dcache_enable
+#define rt_hw_cpu_dcache_disable
+#define rt_hw_cpu_dcache_ops
+
+#define rt_hw_cpu_icache_status 0
+#define rt_hw_cpu_dcache_status 0
+
+#endif
void rt_hw_cpu_reset(void);
void rt_hw_cpu_shutdown(void);
@@ -187,6 +203,8 @@ void rt_hw_secondary_cpu_idle_exec(void);
#define rt_hw_spin_lock(lock) *(lock) = rt_hw_interrupt_disable()
#define rt_hw_spin_unlock(lock) rt_hw_interrupt_enable(*(lock))
+typedef int rt_spinlock_t;
+
#endif
#ifdef __cplusplus
diff --git a/include/rtthread.h b/include/rtthread.h
index a76601a3bf8a391f6139a4f1e98fc8a2d780fcc5..f6e08898897559e6d58d2ca17afbe8e5cb45f68d 100644
--- a/include/rtthread.h
+++ b/include/rtthread.h
@@ -79,6 +79,9 @@ rt_tick_t rt_tick_get(void);
void rt_tick_set(rt_tick_t tick);
void rt_tick_increase(void);
rt_tick_t rt_tick_from_millisecond(rt_int32_t ms);
+#ifdef RT_USING_HOOK
+void rt_tick_sethook(void (*hook)(void));
+#endif
void rt_system_timer_init(void);
void rt_system_timer_thread_init(void);
@@ -145,7 +148,12 @@ rt_err_t rt_thread_delay_until(rt_tick_t *tick, rt_tick_t inc_tick);
rt_err_t rt_thread_mdelay(rt_int32_t ms);
rt_err_t rt_thread_control(rt_thread_t thread, int cmd, void *arg);
rt_err_t rt_thread_suspend(rt_thread_t thread);
+rt_err_t rt_thread_suspend_with_flag(rt_thread_t thread, int suspend_flag);
rt_err_t rt_thread_resume(rt_thread_t thread);
+#ifdef RT_USING_LWP
+rt_err_t rt_thread_wakeup(rt_thread_t thread);
+void rt_thread_wakeup_set(struct rt_thread *thread, rt_wakeup_func_t func, void* user_data);
+#endif
void rt_thread_timeout(void *parameter);
#ifdef RT_USING_SIGNALS
@@ -307,6 +315,8 @@ rt_sem_t rt_sem_create(const char *name, rt_uint32_t value, rt_uint8_t flag);
rt_err_t rt_sem_delete(rt_sem_t sem);
rt_err_t rt_sem_take(rt_sem_t sem, rt_int32_t time);
+rt_err_t rt_sem_take_interruptible(rt_sem_t sem, rt_int32_t time);
+rt_err_t rt_sem_take_killable(rt_sem_t sem, rt_int32_t time);
rt_err_t rt_sem_trytake(rt_sem_t sem);
rt_err_t rt_sem_release(rt_sem_t sem);
rt_err_t rt_sem_control(rt_sem_t sem, int cmd, void *arg);
@@ -322,6 +332,8 @@ rt_mutex_t rt_mutex_create(const char *name, rt_uint8_t flag);
rt_err_t rt_mutex_delete(rt_mutex_t mutex);
rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time);
+rt_err_t rt_mutex_take_interruptible(rt_mutex_t mutex, rt_int32_t time);
+rt_err_t rt_mutex_take_killable(rt_mutex_t mutex, rt_int32_t time);
rt_err_t rt_mutex_release(rt_mutex_t mutex);
rt_err_t rt_mutex_control(rt_mutex_t mutex, int cmd, void *arg);
#endif
@@ -341,6 +353,16 @@ rt_err_t rt_event_recv(rt_event_t event,
rt_uint8_t opt,
rt_int32_t timeout,
rt_uint32_t *recved);
+rt_err_t rt_event_recv_interruptible(rt_event_t event,
+ rt_uint32_t set,
+ rt_uint8_t opt,
+ rt_int32_t timeout,
+ rt_uint32_t *recved);
+rt_err_t rt_event_recv_killable(rt_event_t event,
+ rt_uint32_t set,
+ rt_uint8_t opt,
+ rt_int32_t timeout,
+ rt_uint32_t *recved);
rt_err_t rt_event_control(rt_event_t event, int cmd, void *arg);
#endif
@@ -361,7 +383,15 @@ rt_err_t rt_mb_send(rt_mailbox_t mb, rt_ubase_t value);
rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
rt_ubase_t value,
rt_int32_t timeout);
+rt_err_t rt_mb_send_wait_interruptible(rt_mailbox_t mb,
+ rt_ubase_t value,
+ rt_int32_t timeout);
+rt_err_t rt_mb_send_wait_killable(rt_mailbox_t mb,
+ rt_ubase_t value,
+ rt_int32_t timeout);
rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout);
+rt_err_t rt_mb_recv_interruptibale(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout);
+rt_err_t rt_mb_recv_killable(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout);
rt_err_t rt_mb_control(rt_mailbox_t mb, int cmd, void *arg);
#endif
@@ -383,15 +413,33 @@ rt_mq_t rt_mq_create(const char *name,
rt_err_t rt_mq_delete(rt_mq_t mq);
rt_err_t rt_mq_send(rt_mq_t mq, const void *buffer, rt_size_t size);
+rt_err_t rt_mq_send_interrupt(rt_mq_t mq, const void *buffer, rt_size_t size);
+rt_err_t rt_mq_send_killable(rt_mq_t mq, const void *buffer, rt_size_t size);
rt_err_t rt_mq_send_wait(rt_mq_t mq,
const void *buffer,
rt_size_t size,
rt_int32_t timeout);
+rt_err_t rt_mq_send_wait_interruptible(rt_mq_t mq,
+ const void *buffer,
+ rt_size_t size,
+ rt_int32_t timeout);
+rt_err_t rt_mq_send_wait_killable(rt_mq_t mq,
+ const void *buffer,
+ rt_size_t size,
+ rt_int32_t timeout);
rt_err_t rt_mq_urgent(rt_mq_t mq, const void *buffer, rt_size_t size);
rt_err_t rt_mq_recv(rt_mq_t mq,
void *buffer,
rt_size_t size,
rt_int32_t timeout);
+rt_err_t rt_mq_recv_interruptible(rt_mq_t mq,
+ void *buffer,
+ rt_size_t size,
+ rt_int32_t timeout);
+rt_err_t rt_mq_recv_killable(rt_mq_t mq,
+ void *buffer,
+ rt_size_t size,
+ rt_int32_t timeout);
rt_err_t rt_mq_control(rt_mq_t mq, int cmd, void *arg);
#endif
diff --git a/libcpu/Kconfig b/libcpu/Kconfig
index ae2767dec9ca53cfe5e53fd4b3a73f8040b7363b..f339d63624fe3f9baefa82462b6c25e18561c5ae 100644
--- a/libcpu/Kconfig
+++ b/libcpu/Kconfig
@@ -1,13 +1,21 @@
config ARCH_CPU_64BIT
bool
-config ARCH_ARM
+config RT_USING_CACHE
bool
+ default n
config RT_USING_CPU_FFS
bool
default n
+config ARCH_CPU_STACK_GROWS_UPWARD
+ bool
+ default n
+
+config ARCH_ARM
+ bool
+
config ARCH_ARM_CORTEX_M
bool
select ARCH_ARM
@@ -44,8 +52,29 @@ config ARCH_ARM_CORTEX_R
config ARCH_ARM_MMU
bool
+ select RT_USING_CACHE
depends on ARCH_ARM
+config RT_USING_USERSPACE
+ bool "Isolated user space"
+ default n
+ depends on ARCH_ARM_MMU
+
+config KERNEL_VADDR_START
+ hex "The virtural address of kernel start"
+ default 0xc0000000
+ depends on RT_USING_USERSPACE
+
+config PV_OFFSET
+ hex "The offset of kernel physical address and virtural address"
+ default 0
+ depends on RT_USING_USERSPACE
+
+config RT_IOREMAP_LATE
+ bool "Support to create IO mapping in the kernel address space after system initlalization."
+ default n
+ depends on ARCH_ARM_CORTEX_A
+
config ARCH_ARM_ARM9
bool
select ARCH_ARM
@@ -74,6 +103,11 @@ config ARCH_ARM_CORTEX_A9
bool
select ARCH_ARM_CORTEX_A
+config RT_BACKTRACE_FUNCTION_NAME
+ bool "To show function name when backtrace"
+ default n
+ depends on ARCH_ARM_CORTEX_A
+
config ARCH_ARMV8
bool
@@ -82,10 +116,7 @@ config ARCH_MIPS
config ARCH_MIPS64
bool
- select ARCH_CPU_64BIT
-
-config ARCH_CPU_64BIT
- bool
+ select ARCH_CPU_64BIT
config ARCH_MIPS_XBURST
bool
@@ -128,7 +159,3 @@ config ARCH_TIDSP_C28X
config ARCH_HOST_SIMULATOR
bool
-
-config ARCH_CPU_STACK_GROWS_UPWARD
- bool
- default n
diff --git a/libcpu/arm/AT91SAM7X/trap.c b/libcpu/arm/AT91SAM7X/trap.c
index 1c1c351ff81b63ac1c80f1586cd2a0d4db0ca9e8..dbbe2a1684a8ea00229ae0cce6c86e995e20f948 100644
--- a/libcpu/arm/AT91SAM7X/trap.c
+++ b/libcpu/arm/AT91SAM7X/trap.c
@@ -42,7 +42,7 @@ extern struct rt_thread* rt_current_thread;
void rt_hw_trap_abort(void)
{
rt_kprintf("Abort occured!!! Thread [%s] suspended.\n",rt_current_thread->name);
- rt_thread_suspend(rt_current_thread);
+ rt_thread_suspend_witch_flag(rt_current_thread, RT_UNINTERRUPTIBLE);
rt_schedule();
}
diff --git a/libcpu/arm/cortex-a/SConscript b/libcpu/arm/cortex-a/SConscript
index 9ff30a796b5ca7b75c976f1e694598d125655840..42d528ee0da7940f117247caf07f09a52b083dac 100644
--- a/libcpu/arm/cortex-a/SConscript
+++ b/libcpu/arm/cortex-a/SConscript
@@ -18,6 +18,10 @@ if rtconfig.PLATFORM == 'gcc':
if rtconfig.PLATFORM == 'iar':
src += Glob('*_iar.S')
+# There is no GIC in Raspi3, so remove it from source files.
+if GetDepend('SOC_BCM283x'):
+ SrcRemove(src, ['gic.c'])
+
group = DefineGroup('cpu', src, depend = [''], CPPPATH = CPPPATH)
Return('group')
diff --git a/libcpu/arm/cortex-a/arch.h b/libcpu/arm/cortex-a/arch.h
new file mode 100644
index 0000000000000000000000000000000000000000..0dda710242f9dab82a90c6b6938687d858e3cafd
--- /dev/null
+++ b/libcpu/arm/cortex-a/arch.h
@@ -0,0 +1,15 @@
+/*
+ * Copyright (c) 2006-2020, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ */
+
+#ifndef ARCH_H__
+#define ARCH_H__
+
+#include
+
+#endif /*ARCH_H__*/
diff --git a/libcpu/arm/cortex-a/armv7.h b/libcpu/arm/cortex-a/armv7.h
index d22f72fa68c80ffa24aab57197dba327c33b8ffc..69f1333c6124e4d5177696356b8afa9e66169d97 100644
--- a/libcpu/arm/cortex-a/armv7.h
+++ b/libcpu/arm/cortex-a/armv7.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -12,43 +12,43 @@
/* the exception stack without VFP registers */
struct rt_hw_exp_stack
{
- unsigned long r0;
- unsigned long r1;
- unsigned long r2;
- unsigned long r3;
- unsigned long r4;
- unsigned long r5;
- unsigned long r6;
- unsigned long r7;
- unsigned long r8;
- unsigned long r9;
- unsigned long r10;
- unsigned long fp;
- unsigned long ip;
- unsigned long sp;
- unsigned long lr;
- unsigned long pc;
- unsigned long cpsr;
+ unsigned long r0;
+ unsigned long r1;
+ unsigned long r2;
+ unsigned long r3;
+ unsigned long r4;
+ unsigned long r5;
+ unsigned long r6;
+ unsigned long r7;
+ unsigned long r8;
+ unsigned long r9;
+ unsigned long r10;
+ unsigned long fp;
+ unsigned long ip;
+ unsigned long sp;
+ unsigned long lr;
+ unsigned long pc;
+ unsigned long cpsr;
};
struct rt_hw_stack
{
- unsigned long cpsr;
- unsigned long r0;
- unsigned long r1;
- unsigned long r2;
- unsigned long r3;
- unsigned long r4;
- unsigned long r5;
- unsigned long r6;
- unsigned long r7;
- unsigned long r8;
- unsigned long r9;
- unsigned long r10;
- unsigned long fp;
- unsigned long ip;
- unsigned long lr;
- unsigned long pc;
+ unsigned long cpsr;
+ unsigned long r0;
+ unsigned long r1;
+ unsigned long r2;
+ unsigned long r3;
+ unsigned long r4;
+ unsigned long r5;
+ unsigned long r6;
+ unsigned long r7;
+ unsigned long r8;
+ unsigned long r9;
+ unsigned long r10;
+ unsigned long fp;
+ unsigned long ip;
+ unsigned long lr;
+ unsigned long pc;
};
#define USERMODE 0x10
@@ -69,4 +69,24 @@ struct rt_hw_stack
#define E_Bit (1<<9)
#define J_Bit (1<<24)
+rt_inline void isb(void)
+{
+ asm volatile ("isb":::"memory");
+}
+
+rt_inline void dmb(void)
+{
+ asm volatile ("dmb":::"memory");
+}
+
+rt_inline void dsb(void)
+{
+ asm volatile ("dsb":::"memory");
+}
+
+rt_inline void icache_invalid_all(void)
+{
+ asm volatile ("mcr p15, 0, r0, c7, c5, 0":::"memory");//iciallu
+ isb();
+}
#endif
diff --git a/libcpu/arm/cortex-a/backtrace.c b/libcpu/arm/cortex-a/backtrace.c
new file mode 100644
index 0000000000000000000000000000000000000000..695e31ca5a69d275742986bbb0884cfd84ca96ac
--- /dev/null
+++ b/libcpu/arm/cortex-a/backtrace.c
@@ -0,0 +1,533 @@
+#ifndef __CHECKER__
+#if !defined (__ARM_EABI__)
+#warning Your compiler does not have EABI support.
+#warning ARM unwind is known to compile only with EABI compilers.
+#warning Change compiler or disable ARM_UNWIND option.
+#elif (__GNUC__ == 4 && __GNUC_MINOR__ <= 2) && !defined(__clang__)
+#warning Your compiler is too buggy; it is known to not compile ARM unwind support.
+#warning Change compiler or disable ARM_UNWIND option.
+#endif
+#endif /* __CHECKER__ */
+
+#include
+#include
+#include
+
+#define DBG_TAG "BACKTRACE"
+#define DBG_LVL DBG_INFO
+#include
+
+rt_inline void arm_get_current_stackframe(struct pt_regs *regs, struct stackframe *frame)
+{
+ frame->fp = frame_pointer(regs);
+ frame->sp = regs->ARM_sp;
+ frame->lr = regs->ARM_lr;
+ frame->pc = regs->ARM_pc;
+}
+
+/* Dummy functions to avoid linker complaints */
+void __aeabi_unwind_cpp_pr0(void)
+{
+};
+
+void __aeabi_unwind_cpp_pr1(void)
+{
+};
+
+void __aeabi_unwind_cpp_pr2(void)
+{
+};
+
+struct unwind_ctrl_block {
+ unsigned long vrs[16]; /* virtual register set */
+ const unsigned long *insn; /* pointer to the current instructions word */
+ unsigned long sp_high; /* highest value of sp allowed */
+ /*
+ * 1 : check for stack overflow for each register pop.
+ * 0 : save overhead if there is plenty of stack remaining.
+ */
+ int check_each_pop;
+ int entries; /* number of entries left to interpret */
+ int byte; /* current byte number in the instructions word */
+};
+
+enum regs
+{
+#ifdef CONFIG_THUMB2_KERNEL
+ FP = 7,
+#else
+ FP = 11,
+#endif
+ SP = 13,
+ LR = 14,
+ PC = 15
+};
+
+static int core_kernel_text(unsigned long addr)
+{
+ return 1;
+}
+
+/* Convert a prel31 symbol to an absolute address */
+#define prel31_to_addr(ptr) \
+ ({ \
+ /* sign-extend to 32 bits */ \
+ long offset = (((long)*(ptr)) << 1) >> 1; \
+ (unsigned long)(ptr) + offset; \
+ })
+
+/*
+ * Binary search in the unwind index. The entries are
+ * guaranteed to be sorted in ascending order by the linker.
+ *
+ * start = first entry
+ * origin = first entry with positive offset (or stop if there is no such entry)
+ * stop - 1 = last entry
+ */
+static const struct unwind_idx *search_index(unsigned long addr,
+ const struct unwind_idx *start,
+ const struct unwind_idx *origin,
+ const struct unwind_idx *stop)
+{
+ unsigned long addr_prel31;
+
+ LOG_D("%s(%08lx, %x, %x, %x)",
+ __func__, addr, start, origin, stop);
+
+ /*
+ * only search in the section with the matching sign. This way the
+ * prel31 numbers can be compared as unsigned longs.
+ */
+ if (addr < (unsigned long)start)
+ /* negative offsets: [start; origin) */
+ stop = origin;
+ else
+ /* positive offsets: [origin; stop) */
+ start = origin;
+
+ /* prel31 for address relavive to start */
+ addr_prel31 = (addr - (unsigned long)start) & 0x7fffffff;
+
+ while (start < stop - 1)
+ {
+ const struct unwind_idx *mid = start + ((stop - start) >> 1);
+
+ /*
+ * As addr_prel31 is relative to start an offset is needed to
+ * make it relative to mid.
+ */
+ if (addr_prel31 - ((unsigned long)mid - (unsigned long)start) <
+ mid->addr_offset)
+ stop = mid;
+ else
+ {
+ /* keep addr_prel31 relative to start */
+ addr_prel31 -= ((unsigned long)mid -
+ (unsigned long)start);
+ start = mid;
+ }
+ }
+
+ if (start->addr_offset <= addr_prel31)
+ return start;
+ else
+ {
+ LOG_W("unwind: Unknown symbol address %08lx", addr);
+ return RT_NULL;
+ }
+}
+
+static const struct unwind_idx *unwind_find_origin(
+ const struct unwind_idx *start, const struct unwind_idx *stop)
+{
+ LOG_D("%s(%x, %x)", __func__, start, stop);
+ while (start < stop)
+ {
+ const struct unwind_idx *mid = start + ((stop - start) >> 1);
+
+ if (mid->addr_offset >= 0x40000000)
+ /* negative offset */
+ start = mid + 1;
+ else
+ /* positive offset */
+ stop = mid;
+ }
+ LOG_D("%s -> %x", __func__, stop);
+ return stop;
+}
+
+static const struct unwind_idx *unwind_find_idx(unsigned long addr, const struct unwind_idx **origin_idx, const struct unwind_idx exidx_start[], const struct unwind_idx exidx_end[])
+{
+ const struct unwind_idx *idx = RT_NULL;
+
+ LOG_D("%s(%08lx)", __func__, addr);
+
+ if (core_kernel_text(addr))
+ {
+ if (!*origin_idx)
+ *origin_idx =
+ unwind_find_origin(exidx_start,
+ exidx_end);
+
+ /* main unwind table */
+ idx = search_index(addr, exidx_start,
+ *origin_idx,
+ exidx_end);
+ }
+
+ LOG_D("%s: idx = %x", __func__, idx);
+ return idx;
+}
+
+static unsigned long unwind_get_byte(struct unwind_ctrl_block *ctrl)
+{
+ unsigned long ret;
+
+ if (ctrl->entries <= 0)
+ {
+ LOG_W("unwind: Corrupt unwind table");
+ return 0;
+ }
+
+ ret = (*ctrl->insn >> (ctrl->byte * 8)) & 0xff;
+
+ if (ctrl->byte == 0)
+ {
+ ctrl->insn++;
+ ctrl->entries--;
+ ctrl->byte = 3;
+ }
+ else
+ ctrl->byte--;
+
+ return ret;
+}
+
+/* Before poping a register check whether it is feasible or not */
+static int unwind_pop_register(struct unwind_ctrl_block *ctrl,
+ unsigned long **vsp, unsigned int reg)
+{
+ if (ctrl->check_each_pop)
+ if (*vsp >= (unsigned long *)ctrl->sp_high)
+ return -URC_FAILURE;
+
+ ctrl->vrs[reg] = *(*vsp)++;
+ return URC_OK;
+}
+
+/* Helper functions to execute the instructions */
+static int unwind_exec_pop_subset_r4_to_r13(struct unwind_ctrl_block *ctrl,
+ unsigned long mask)
+{
+ unsigned long *vsp = (unsigned long *)ctrl->vrs[SP];
+ int load_sp, reg = 4;
+
+ load_sp = mask & (1 << (13 - 4));
+ while (mask)
+ {
+ if (mask & 1)
+ if (unwind_pop_register(ctrl, &vsp, reg))
+ return -URC_FAILURE;
+ mask >>= 1;
+ reg++;
+ }
+ if (!load_sp)
+ ctrl->vrs[SP] = (unsigned long)vsp;
+
+ return URC_OK;
+}
+
+static int unwind_exec_pop_r4_to_rN(struct unwind_ctrl_block *ctrl,
+ unsigned long insn)
+{
+ unsigned long *vsp = (unsigned long *)ctrl->vrs[SP];
+ int reg;
+
+ /* pop R4-R[4+bbb] */
+ for (reg = 4; reg <= 4 + (insn & 7); reg++)
+ if (unwind_pop_register(ctrl, &vsp, reg))
+ return -URC_FAILURE;
+
+ if (insn & 0x8)
+ if (unwind_pop_register(ctrl, &vsp, 14))
+ return -URC_FAILURE;
+
+ ctrl->vrs[SP] = (unsigned long)vsp;
+
+ return URC_OK;
+}
+
+static int unwind_exec_pop_subset_r0_to_r3(struct unwind_ctrl_block *ctrl,
+ unsigned long mask)
+{
+ unsigned long *vsp = (unsigned long *)ctrl->vrs[SP];
+ int reg = 0;
+
+ /* pop R0-R3 according to mask */
+ while (mask)
+ {
+ if (mask & 1)
+ if (unwind_pop_register(ctrl, &vsp, reg))
+ return -URC_FAILURE;
+ mask >>= 1;
+ reg++;
+ }
+ ctrl->vrs[SP] = (unsigned long)vsp;
+
+ return URC_OK;
+}
+
+/*
+ * Execute the current unwind instruction.
+ */
+static int unwind_exec_insn(struct unwind_ctrl_block *ctrl)
+{
+ unsigned long insn = unwind_get_byte(ctrl);
+ int ret = URC_OK;
+
+ LOG_D("%s: insn = %08lx", __func__, insn);
+
+ if ((insn & 0xc0) == 0x00)
+ ctrl->vrs[SP] += ((insn & 0x3f) << 2) + 4;
+ else if ((insn & 0xc0) == 0x40)
+ ctrl->vrs[SP] -= ((insn & 0x3f) << 2) + 4;
+ else if ((insn & 0xf0) == 0x80)
+ {
+ unsigned long mask;
+
+ insn = (insn << 8) | unwind_get_byte(ctrl);
+ mask = insn & 0x0fff;
+ if (mask == 0)
+ {
+ LOG_W("unwind: 'Refuse to unwind' instruction %04lx",
+ insn);
+ return -URC_FAILURE;
+ }
+
+ ret = unwind_exec_pop_subset_r4_to_r13(ctrl, mask);
+ if (ret)
+ goto error;
+ }
+ else if ((insn & 0xf0) == 0x90 &&
+ (insn & 0x0d) != 0x0d)
+ ctrl->vrs[SP] = ctrl->vrs[insn & 0x0f];
+ else if ((insn & 0xf0) == 0xa0)
+ {
+ ret = unwind_exec_pop_r4_to_rN(ctrl, insn);
+ if (ret)
+ goto error;
+ }
+ else if (insn == 0xb0)
+ {
+ if (ctrl->vrs[PC] == 0)
+ ctrl->vrs[PC] = ctrl->vrs[LR];
+ /* no further processing */
+ ctrl->entries = 0;
+ }
+ else if (insn == 0xb1)
+ {
+ unsigned long mask = unwind_get_byte(ctrl);
+
+ if (mask == 0 || mask & 0xf0)
+ {
+ LOG_W("unwind: Spare encoding %04lx",
+ (insn << 8) | mask);
+ return -URC_FAILURE;
+ }
+
+ ret = unwind_exec_pop_subset_r0_to_r3(ctrl, mask);
+ if (ret)
+ goto error;
+ }
+ else if (insn == 0xb2)
+ {
+ unsigned long uleb128 = unwind_get_byte(ctrl);
+
+ ctrl->vrs[SP] += 0x204 + (uleb128 << 2);
+ }
+ else
+ {
+ LOG_W("unwind: Unhandled instruction %02lx", insn);
+ return -URC_FAILURE;
+ }
+
+ LOG_D("%s: fp = %08lx sp = %08lx lr = %08lx pc = %08lx", __func__,
+ ctrl->vrs[FP], ctrl->vrs[SP], ctrl->vrs[LR], ctrl->vrs[PC]);
+
+error:
+ return ret;
+}
+
+#ifdef RT_BACKTRACE_FUNCTION_NAME
+static char *unwind_get_function_name(void *address)
+{
+ uint32_t flag_word = *(uint32_t *)((char*)address - 4);
+
+ if ((flag_word & 0xff000000) == 0xff000000)
+ {
+ return (char *)((char*)address - 4 - (flag_word & 0x00ffffff));
+ }
+ return RT_NULL;
+}
+#endif
+/*
+ * Unwind a single frame starting with *sp for the symbol at *pc. It
+ * updates the *pc and *sp with the new values.
+ */
+int unwind_frame(struct stackframe *frame, const struct unwind_idx **origin_idx, const struct unwind_idx exidx_start[], const struct unwind_idx exidx_end[])
+{
+ unsigned long low;
+ const struct unwind_idx *idx;
+ struct unwind_ctrl_block ctrl;
+ struct rt_thread *rt_c_thread;
+
+ /* store the highest address on the stack to avoid crossing it*/
+ low = frame->sp;
+ rt_c_thread = rt_thread_self();
+ ctrl.sp_high = (unsigned long)((char*)rt_c_thread->stack_addr + rt_c_thread->stack_size);
+
+ LOG_D("%s(pc = %08lx lr = %08lx sp = %08lx)", __func__,
+ frame->pc, frame->lr, frame->sp);
+
+ idx = unwind_find_idx(frame->pc, origin_idx, exidx_start, exidx_end);
+ if (!idx)
+ {
+ LOG_W("unwind: Index not found %08lx", frame->pc);
+ return -URC_FAILURE;
+ }
+
+#ifdef RT_BACKTRACE_FUNCTION_NAME
+ {
+ char *fun_name;
+ fun_name = unwind_get_function_name((void *)prel31_to_addr(&idx->addr_offset));
+ if (fun_name)
+ {
+ rt_kprintf("0x%08x @ %s\n", frame->pc, fun_name);
+ }
+ }
+#endif
+
+ ctrl.vrs[FP] = frame->fp;
+ ctrl.vrs[SP] = frame->sp;
+ ctrl.vrs[LR] = frame->lr;
+ ctrl.vrs[PC] = 0;
+
+ if (idx->insn == 1)
+ /* can't unwind */
+ return -URC_FAILURE;
+ else if ((idx->insn & 0x80000000) == 0)
+ /* prel31 to the unwind table */
+ ctrl.insn = (unsigned long *)prel31_to_addr(&idx->insn);
+ else if ((idx->insn & 0xff000000) == 0x80000000)
+ /* only personality routine 0 supported in the index */
+ ctrl.insn = &idx->insn;
+ else
+ {
+ LOG_W("unwind: Unsupported personality routine %08lx in the index at %x",
+ idx->insn, idx);
+ return -URC_FAILURE;
+ }
+
+ /* check the personality routine */
+ if ((*ctrl.insn & 0xff000000) == 0x80000000)
+ {
+ ctrl.byte = 2;
+ ctrl.entries = 1;
+ }
+ else if ((*ctrl.insn & 0xff000000) == 0x81000000)
+ {
+ ctrl.byte = 1;
+ ctrl.entries = 1 + ((*ctrl.insn & 0x00ff0000) >> 16);
+ }
+ else
+ {
+ LOG_W("unwind: Unsupported personality routine %08lx at %x",
+ *ctrl.insn, ctrl.insn);
+ return -URC_FAILURE;
+ }
+
+ ctrl.check_each_pop = 0;
+
+ while (ctrl.entries > 0)
+ {
+ int urc;
+ if ((ctrl.sp_high - ctrl.vrs[SP]) < sizeof(ctrl.vrs))
+ ctrl.check_each_pop = 1;
+ urc = unwind_exec_insn(&ctrl);
+ if (urc < 0)
+ return urc;
+ if (ctrl.vrs[SP] < low || ctrl.vrs[SP] >= ctrl.sp_high)
+ return -URC_FAILURE;
+ }
+
+ if (ctrl.vrs[PC] == 0)
+ ctrl.vrs[PC] = ctrl.vrs[LR];
+
+ /* check for infinite loop */
+ if (frame->pc == ctrl.vrs[PC])
+ return -URC_FAILURE;
+
+ frame->fp = ctrl.vrs[FP];
+ frame->sp = ctrl.vrs[SP];
+ frame->lr = ctrl.vrs[LR];
+ frame->pc = ctrl.vrs[PC];
+
+ return URC_OK;
+}
+
+void unwind_backtrace(struct pt_regs *regs, const struct unwind_idx exidx_start[], const struct unwind_idx exidx_end[])
+{
+ struct stackframe frame;
+ const struct unwind_idx *origin_idx = RT_NULL;
+
+ LOG_D("%s(regs = %x)", __func__, regs);
+
+ arm_get_current_stackframe(regs, &frame);
+
+#ifndef RT_BACKTRACE_FUNCTION_NAME
+ rt_kprintf("please use: addr2line -e rtthread.elf -a -f %08x", frame.pc);
+#endif
+ LOG_D("pc = %08x, sp = %08x", frame.pc, frame.sp);
+
+ while (1)
+ {
+ int urc;
+
+ urc = unwind_frame(&frame, &origin_idx, exidx_start, exidx_end);
+ if (urc < 0)
+ break;
+ //dump_backtrace_entry(where, frame.pc, frame.sp - 4);
+#ifndef RT_BACKTRACE_FUNCTION_NAME
+ rt_kprintf(" %08x", frame.pc);
+#endif
+ LOG_D("from: pc = %08x, frame = %08x", frame.pc, frame.sp - 4);
+ }
+ rt_kprintf("\n");
+}
+
+extern const struct unwind_idx __exidx_start[];
+extern const struct unwind_idx __exidx_end[];
+
+void rt_unwind(struct rt_hw_exp_stack *regs, unsigned int pc_adj)
+{
+ struct pt_regs e_regs;
+
+ e_regs.ARM_fp = regs->fp;
+ e_regs.ARM_sp = regs->sp;
+ e_regs.ARM_lr = regs->lr;
+ e_regs.ARM_pc = regs->pc - pc_adj;
+ rt_kprintf("backtrace:\n");
+ unwind_backtrace(&e_regs, __exidx_start, __exidx_end);
+}
+
+void rt_backtrace(void)
+{
+ struct rt_hw_exp_stack regs;
+
+ asm volatile ("mov %0, fp":"=r"(regs.fp));
+ asm volatile ("mov %0, sp":"=r"(regs.sp));
+ asm volatile ("mov %0, lr":"=r"(regs.lr));
+ asm volatile ("mov %0, pc":"=r"(regs.pc));
+ rt_unwind(®s, 8);
+}
+
diff --git a/libcpu/arm/cortex-a/backtrace.h b/libcpu/arm/cortex-a/backtrace.h
new file mode 100644
index 0000000000000000000000000000000000000000..3a79d9565dff6f9ec39104eb26d99d936bc67649
--- /dev/null
+++ b/libcpu/arm/cortex-a/backtrace.h
@@ -0,0 +1,83 @@
+#ifndef __BACKTRACE_H
+#define __BACKTRACE_H
+
+#ifndef __ASSEMBLY__
+#include
+
+/* Unwind reason code according the the ARM EABI documents */
+enum unwind_reason_code
+{
+ URC_OK = 0, /* operation completed successfully */
+ URC_CONTINUE_UNWIND = 8,
+ URC_FAILURE = 9 /* unspecified failure of some kind */
+};
+
+struct unwind_idx
+{
+ unsigned long addr_offset;
+ unsigned long insn;
+};
+
+struct unwind_table
+{
+ const struct unwind_idx *start;
+ const struct unwind_idx *origin;
+ const struct unwind_idx *stop;
+ unsigned long begin_addr;
+ unsigned long end_addr;
+};
+
+struct stackframe
+{
+ /*
+ * FP member should hold R7 when CONFIG_THUMB2_KERNEL is enabled
+ * and R11 otherwise.
+ */
+ unsigned long fp;
+ unsigned long sp;
+ unsigned long lr;
+ unsigned long pc;
+};
+
+struct pt_regs
+{
+ unsigned long uregs[18];
+};
+
+#define ARM_cpsr uregs[16]
+#define ARM_pc uregs[15]
+#define ARM_lr uregs[14]
+#define ARM_sp uregs[13]
+#define ARM_ip uregs[12]
+#define ARM_fp uregs[11]
+#define ARM_r10 uregs[10]
+#define ARM_r9 uregs[9]
+#define ARM_r8 uregs[8]
+#define ARM_r7 uregs[7]
+#define ARM_r6 uregs[6]
+#define ARM_r5 uregs[5]
+#define ARM_r4 uregs[4]
+#define ARM_r3 uregs[3]
+#define ARM_r2 uregs[2]
+#define ARM_r1 uregs[1]
+#define ARM_r0 uregs[0]
+#define ARM_ORIG_r0 uregs[17]
+
+#define instruction_pointer(regs) (regs)->ARM_pc
+
+#ifdef CONFIG_THUMB2_KERNEL
+#define frame_pointer(regs) (regs)->ARM_r7
+#else
+#define frame_pointer(regs) (regs)->ARM_fp
+#endif
+
+int unwind_frame(struct stackframe *frame, const struct unwind_idx **origin_idx, const struct unwind_idx exidx_start[], const struct unwind_idx exidx_end[]);
+void unwind_backtrace(struct pt_regs *regs, const struct unwind_idx exidx_start[], const struct unwind_idx exidx_end[]);
+
+void rt_unwind(struct rt_hw_exp_stack *regs, unsigned int pc_adj);
+void rt_backtrace(void);
+
+#endif /* !__ASSEMBLY__ */
+
+#endif /* __BACKTRACE_H */
+
diff --git a/libcpu/arm/cortex-a/context_gcc.S b/libcpu/arm/cortex-a/context_gcc.S
index 768c5138e9c058739a98a98445a6b37550dcd50e..7fa3a26a88f7a45de6cb300d0bd1454819082342 100644
--- a/libcpu/arm/cortex-a/context_gcc.S
+++ b/libcpu/arm/cortex-a/context_gcc.S
@@ -45,6 +45,12 @@ rt_hw_context_switch_to:
#ifdef RT_USING_SMP
mov r0, r1
bl rt_cpus_lock_status_restore
+#else
+#ifdef RT_USING_USERSPACE
+ ldr r1, =rt_current_thread
+ ldr r0, [r1]
+ bl lwp_mmu_switch
+#endif
#endif /*RT_USING_SMP*/
b rt_hw_context_switch_exit
@@ -95,6 +101,12 @@ rt_hw_context_switch:
#ifdef RT_USING_SMP
mov r0, r2
bl rt_cpus_lock_status_restore
+#else
+#ifdef RT_USING_USERSPACE
+ ldr r1, =rt_current_thread
+ ldr r0, [r1]
+ bl lwp_mmu_switch
+#endif
#endif /*RT_USING_SMP*/
b rt_hw_context_switch_exit
@@ -178,5 +190,29 @@ rt_hw_context_switch_exit:
#endif
ldmfd sp!, {r1}
msr spsr_cxsf, r1 /* original mode */
+
+#ifdef RT_USING_GDBSERVER
+ bl lwp_check_debug
+#endif
+
+#ifdef RT_USING_LWP
+ bl lwp_check_exit
+#endif
+
+#ifdef RT_USING_LWP
+ and r1, #0x1f
+ cmp r1, #0x10
+ bne 1f
+ ldmfd sp!, {r0-r12,lr}
+ ldmfd sp!, {lr}
+ b ret_to_user
+1:
+#endif
ldmfd sp!, {r0-r12,lr,pc}^ /* irq return */
+#ifdef RT_USING_FPU
+.global set_fpexc
+set_fpexc:
+ vmsr fpexc, r0
+ bx lr
+#endif
diff --git a/libcpu/arm/cortex-a/cp15.h b/libcpu/arm/cortex-a/cp15.h
index 97c5b93ad24a1bf21488f6b9d3fa0664b0ab73d7..1bbf76d3b1ed2b7b9be3046c514914254a2b91bb 100644
--- a/libcpu/arm/cortex-a/cp15.h
+++ b/libcpu/arm/cortex-a/cp15.h
@@ -21,4 +21,143 @@ void rt_cpu_icache_flush(void);
void rt_cpu_vector_set_base(unsigned int addr);
+#ifdef SOC_BCM283x
+
+#ifndef __STATIC_FORCEINLINE
+#define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline
+#endif
+
+#define __WFI() __asm__ volatile ("wfi":::"memory")
+
+#define __WFE() __asm__ volatile ("wfe":::"memory")
+
+#define __SEV() __asm__ volatile ("sev")
+
+__STATIC_FORCEINLINE void __ISB(void)
+{
+ __asm__ volatile ("isb 0xF":::"memory");
+}
+
+
+/**
+ \brief Data Synchronization Barrier
+ \details Acts as a special kind of Data Memory Barrier.
+ It completes when all explicit memory accesses before this instruction complete.
+ */
+__STATIC_FORCEINLINE void __DSB(void)
+{
+ __asm__ volatile ("dsb 0xF":::"memory");
+}
+
+/**
+ \brief Data Memory Barrier
+ \details Ensures the apparent order of the explicit memory operations before
+ and after the instruction, without ensuring their completion.
+ */
+
+__STATIC_FORCEINLINE void __DMB(void)
+{
+ __asm__ volatile ("dmb 0xF":::"memory");
+}
+
+static inline void send_ipi_msg(int cpu, int ipi_vector)
+{
+ IPI_MAILBOX_SET(cpu) = 1 << ipi_vector;
+}
+
+static inline void setup_bootstrap_addr(int cpu, int addr)
+{
+ CORE_MAILBOX3_SET(cpu) = addr;
+}
+
+static inline void enable_cpu_ipi_intr(int cpu)
+{
+ COREMB_INTCTL(cpu) = IPI_MAILBOX_INT_MASK;
+}
+
+static inline void enable_cpu_timer_intr(int cpu)
+{
+ CORETIMER_INTCTL(cpu) = 0x8;
+}
+
+static inline void enable_cntv(void)
+{
+ rt_uint32_t cntv_ctl;
+ cntv_ctl = 1;
+ asm volatile ("mcr p15, 0, %0, c14, c3, 1" :: "r"(cntv_ctl)); // write CNTV_CTL
+}
+
+static inline void disable_cntv(void)
+{
+ rt_uint32_t cntv_ctl;
+ cntv_ctl = 0;
+ asm volatile ("mcr p15, 0, %0, c14, c3, 1" :: "r"(cntv_ctl)); // write CNTV_CTL
+}
+
+static inline void mask_cntv(void)
+{
+ rt_uint32_t cntv_ctl;
+ cntv_ctl = 2;
+ asm volatile ("mcr p15, 0, %0, c14, c3, 1" :: "r"(cntv_ctl)); // write CNTV_CTL
+}
+
+static inline void unmask_cntv(void)
+{
+ rt_uint32_t cntv_ctl;
+ cntv_ctl = 1;
+ asm volatile ("mcr p15, 0, %0, c14, c3, 1" :: "r"(cntv_ctl)); // write CNTV_CTL
+}
+
+static inline rt_uint64_t read_cntvct(void)
+{
+ rt_uint32_t val,val1;
+ asm volatile ("mrrc p15, 1, %0, %1, c14" : "=r" (val),"=r" (val1));
+ return (val);
+}
+
+static inline rt_uint64_t read_cntvoff(void)
+{
+
+ rt_uint64_t val;
+ asm volatile ("mrrc p15, 4, %Q0, %R0, c14" : "=r" (val));
+ return (val);
+}
+
+static inline rt_uint32_t read_cntv_tval(void)
+{
+ rt_uint32_t val;
+ asm volatile ("mrc p15, 0, %0, c14, c3, 0" : "=r"(val));
+ return val;
+}
+
+
+static inline void write_cntv_tval(rt_uint32_t val)
+{
+ asm volatile ("mcr p15, 0, %0, c14, c3, 0" :: "r"(val));
+ return;
+}
+
+static inline rt_uint32_t read_cntfrq(void)
+{
+ rt_uint32_t val;
+ asm volatile ("mrc p15, 0, %0, c14, c0, 0" : "=r"(val));
+ return val;
+}
+
+
+static inline rt_uint32_t read_cntctrl(void)
+{
+ rt_uint32_t val;
+ asm volatile ("mrc p15, 0, %0, c14, c1, 0" : "=r"(val));
+ return val;
+}
+
+static inline uint32_t write_cntctrl(uint32_t val)
+{
+
+ asm volatile ("mcr p15, 0, %0, c14, c1, 0" : :"r"(val));
+ return val;
+}
+#endif
+
#endif
diff --git a/libcpu/arm/cortex-a/cpu.c b/libcpu/arm/cortex-a/cpu.c
index 7c6bf58a4bea14dbaa6c440b7ba7ae5a099c108d..8087cfff1d12bfe821c57505ec6986ba7db39aba 100644
--- a/libcpu/arm/cortex-a/cpu.c
+++ b/libcpu/arm/cortex-a/cpu.c
@@ -13,18 +13,18 @@
#include
#include
-#ifdef RT_USING_SMP
-
int rt_hw_cpu_id(void)
{
int cpu_id;
__asm__ volatile (
"mrc p15, 0, %0, c0, c0, 5"
:"=r"(cpu_id)
- );
+ );
cpu_id &= 0xf;
return cpu_id;
-};
+}
+
+#ifdef RT_USING_SMP
void rt_hw_spin_lock_init(rt_hw_spinlock_t *lock)
{
@@ -40,7 +40,7 @@ void rt_hw_spin_lock(rt_hw_spinlock_t *lock)
__asm__ __volatile__(
"pld [%0]"
::"r"(&lock->slock)
- );
+ );
__asm__ __volatile__(
"1: ldrex %0, [%3]\n"
@@ -52,9 +52,10 @@ void rt_hw_spin_lock(rt_hw_spinlock_t *lock)
: "r" (&lock->slock), "I" (1 << 16)
: "cc");
- while (lockval.tickets.next != lockval.tickets.owner) {
+ while (lockval.tickets.next != lockval.tickets.owner)
+ {
__asm__ __volatile__("wfe":::"memory");
- lockval.tickets.owner = *(volatile unsigned short *)(&lock->tickets.owner);
+ lockval.tickets.owner = *(volatile unsigned short *) (&lock->tickets.owner);
}
__asm__ volatile ("dmb":::"memory");
@@ -77,6 +78,7 @@ void rt_hw_spin_unlock(rt_hw_spinlock_t *lock)
void rt_hw_cpu_shutdown()
{
rt_uint32_t level;
+
rt_kprintf("shutdown...\n");
level = rt_hw_interrupt_disable();
diff --git a/libcpu/arm/cortex-a/gic.c b/libcpu/arm/cortex-a/gic.c
index 2e94b882770243ee2e1f4c475fba81704aa5865f..fac822a2db956fdea66fb7eb0369402cd40da5cf 100644
--- a/libcpu/arm/cortex-a/gic.c
+++ b/libcpu/arm/cortex-a/gic.c
@@ -255,12 +255,13 @@ int arm_gic_cpu_init(rt_uint32_t index, rt_uint32_t cpu_base)
{
RT_ASSERT(index < ARM_GIC_MAX_NR);
- _gic_table[index].cpu_hw_base = cpu_base;
+ if (_gic_table[index].cpu_hw_base == 0)
+ _gic_table[index].cpu_hw_base = cpu_base;
- GIC_CPU_PRIMASK(cpu_base) = 0xf0;
- GIC_CPU_BINPOINT(cpu_base) = 0x7;
+ GIC_CPU_PRIMASK(_gic_table[index].cpu_hw_base) = 0xf0;
+ GIC_CPU_BINPOINT(_gic_table[index].cpu_hw_base) = 0x7;
/* Enable CPU interrupt */
- GIC_CPU_CTRL(cpu_base) = 0x01;
+ GIC_CPU_CTRL(_gic_table[index].cpu_hw_base) = 0x01;
return 0;
}
diff --git a/libcpu/arm/cortex-a/gic.h b/libcpu/arm/cortex-a/gic.h
index a16d0467fb31d87a6a01baf35478d2acf4990737..f90bc0dae2c8d178578e166db66818562a3caea3 100644
--- a/libcpu/arm/cortex-a/gic.h
+++ b/libcpu/arm/cortex-a/gic.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
diff --git a/libcpu/arm/cortex-a/interrupt.c b/libcpu/arm/cortex-a/interrupt.c
index b7a70719a9024741d0d39e10af0f3551780c274f..85cf1de23e17ba80e50ce82b077a008af249d3a6 100644
--- a/libcpu/arm/cortex-a/interrupt.c
+++ b/libcpu/arm/cortex-a/interrupt.c
@@ -11,15 +11,15 @@
#include
#include
+#include
#include "interrupt.h"
#include "gic.h"
-
/* exception and interrupt handler table */
struct rt_irq_desc isr_table[MAX_HANDLERS];
#ifndef RT_USING_SMP
-/* Those varibles will be accessed in ISR, so we need to share them. */
+/* Those variables will be accessed in ISR, so we need to share them. */
rt_uint32_t rt_interrupt_from_thread = 0;
rt_uint32_t rt_interrupt_to_thread = 0;
rt_uint32_t rt_thread_switch_interrupt_flag = 0;
@@ -29,6 +29,23 @@ const unsigned int VECTOR_BASE = 0x00;
extern void rt_cpu_vector_set_base(unsigned int addr);
extern int system_vectors;
+#ifdef RT_USING_SMP
+#define rt_interrupt_nest rt_cpu_self()->irq_nest
+#else
+extern volatile rt_uint8_t rt_interrupt_nest;
+#endif
+
+#ifdef SOC_BCM283x
+static void default_isr_handler(int vector, void *param)
+{
+#ifdef RT_USING_SMP
+ rt_kprintf("cpu %d unhandled irq: %d\n", rt_hw_cpu_id(),vector);
+#else
+ rt_kprintf("unhandled irq: %d\n",vector);
+#endif
+}
+#endif
+
void rt_hw_vector_init(void)
{
rt_cpu_vector_set_base((unsigned int)&system_vectors);
@@ -39,6 +56,34 @@ void rt_hw_vector_init(void)
*/
void rt_hw_interrupt_init(void)
{
+#ifdef SOC_BCM283x
+ rt_uint32_t index;
+ /* initialize vector table */
+ rt_hw_vector_init();
+
+ /* initialize exceptions table */
+ rt_memset(isr_table, 0x00, sizeof(isr_table));
+
+ /* mask all of interrupts */
+ IRQ_DISABLE_BASIC = 0x000000ff;
+ IRQ_DISABLE1 = 0xffffffff;
+ IRQ_DISABLE2 = 0xffffffff;
+ for (index = 0; index < MAX_HANDLERS; index ++)
+ {
+ isr_table[index].handler = default_isr_handler;
+ isr_table[index].param = RT_NULL;
+#ifdef RT_USING_INTERRUPT_INFO
+ rt_strncpy(isr_table[index].name, "unknown", RT_NAME_MAX);
+ isr_table[index].counter = 0;
+#endif
+ }
+
+ /* init interrupt nest, and context in thread sp */
+ rt_interrupt_nest = 0;
+ rt_interrupt_from_thread = 0;
+ rt_interrupt_to_thread = 0;
+ rt_thread_switch_interrupt_flag = 0;
+#else
rt_uint32_t gic_cpu_base;
rt_uint32_t gic_dist_base;
rt_uint32_t gic_irq_start;
@@ -50,13 +95,19 @@ void rt_hw_interrupt_init(void)
rt_memset(isr_table, 0x00, sizeof(isr_table));
/* initialize ARM GIC */
+#ifdef RT_USING_USERSPACE
+ gic_dist_base = (uint32_t)rt_hw_mmu_map(&mmu_info, 0, (void*)platform_get_gic_dist_base(), 0x2000, MMU_MAP_K_RW);
+ gic_cpu_base = (uint32_t)rt_hw_mmu_map(&mmu_info, 0, (void*)platform_get_gic_cpu_base(), 0x1000, MMU_MAP_K_RW);
+#else
gic_dist_base = platform_get_gic_dist_base();
gic_cpu_base = platform_get_gic_cpu_base();
+#endif
gic_irq_start = GIC_IRQ_START;
arm_gic_dist_init(0, gic_dist_base, gic_irq_start);
arm_gic_cpu_init(0, gic_cpu_base);
+#endif
}
/**
@@ -65,7 +116,24 @@ void rt_hw_interrupt_init(void)
*/
void rt_hw_interrupt_mask(int vector)
{
+#ifdef SOC_BCM283x
+ if (vector < 32)
+ {
+ IRQ_DISABLE1 = (1 << vector);
+ }
+ else if (vector < 64)
+ {
+ vector = vector % 32;
+ IRQ_DISABLE2 = (1 << vector);
+ }
+ else
+ {
+ vector = vector - 64;
+ IRQ_DISABLE_BASIC = (1 << vector);
+ }
+#else
arm_gic_mask(0, vector);
+#endif
}
/**
@@ -74,7 +142,24 @@ void rt_hw_interrupt_mask(int vector)
*/
void rt_hw_interrupt_umask(int vector)
{
+#ifdef SOC_BCM283x
+if (vector < 32)
+ {
+ IRQ_ENABLE1 = (1 << vector);
+ }
+ else if (vector < 64)
+ {
+ vector = vector % 32;
+ IRQ_ENABLE2 = (1 << vector);
+ }
+ else
+ {
+ vector = vector - 64;
+ IRQ_ENABLE_BASIC = (1 << vector);
+ }
+#else
arm_gic_umask(0, vector);
+#endif
}
/**
@@ -83,7 +168,11 @@ void rt_hw_interrupt_umask(int vector)
*/
int rt_hw_interrupt_get_irq(void)
{
+#ifndef SOC_BCM283x
return arm_gic_get_active_irq(0) & GIC_ACK_INTID_MASK;
+#else
+ return 0;
+#endif
}
/**
@@ -92,8 +181,11 @@ int rt_hw_interrupt_get_irq(void)
*/
void rt_hw_interrupt_ack(int vector)
{
+#ifndef SOC_BCM283x
arm_gic_ack(0, vector);
+#endif
}
+
/**
* This function will install a interrupt service routine to a interrupt.
* @param vector the interrupt number
diff --git a/libcpu/arm/cortex-a/mmu.c b/libcpu/arm/cortex-a/mmu.c
index 1260f41fe52dbac75f9bb0d2f6ec6e17a8a27305..b50d7ab92edecaaee00fe722b343275e4c47fad9 100644
--- a/libcpu/arm/cortex-a/mmu.c
+++ b/libcpu/arm/cortex-a/mmu.c
@@ -15,6 +15,10 @@
#include "cp15.h"
#include "mmu.h"
+#ifdef RT_USING_USERSPACE
+#include "page.h"
+#endif
+
/* dump 2nd level page table */
void rt_hw_cpu_dump_page_table_2nd(rt_uint32_t *ptb)
{
@@ -123,7 +127,7 @@ void rt_hw_cpu_dump_page_table(rt_uint32_t *ptb)
}
/* level1 page table, each entry for 1MB memory. */
-volatile static unsigned long MMUTable[4*1024] __attribute__((aligned(16*1024)));
+volatile unsigned long MMUTable[4*1024] __attribute__((aligned(16*1024)));
void rt_hw_mmu_setmtt(rt_uint32_t vaddrStart,
rt_uint32_t vaddrEnd,
rt_uint32_t paddrStart,
@@ -150,6 +154,7 @@ unsigned long rt_hw_set_domain_register(unsigned long domain_val)
return old_domain;
}
+void rt_hw_cpu_dcache_clean(void *addr, int size);
void rt_hw_init_mmu_table(struct mem_desc *mdesc, rt_uint32_t size)
{
/* set page table */
@@ -159,6 +164,7 @@ void rt_hw_init_mmu_table(struct mem_desc *mdesc, rt_uint32_t size)
mdesc->paddr_start, mdesc->attr);
mdesc++;
}
+ rt_hw_cpu_dcache_clean((void*)MMUTable, sizeof MMUTable);
}
void rt_hw_mmu_init(void)
@@ -180,3 +186,694 @@ void rt_hw_mmu_init(void)
rt_hw_cpu_dcache_enable();
}
+/*
+ mem map
+*/
+
+void rt_hw_cpu_dcache_clean(void *addr, int size);
+
+int rt_hw_mmu_map_init(rt_mmu_info *mmu_info, void* v_address, size_t size, size_t *vtable, size_t pv_off)
+{
+ size_t l1_off, va_s, va_e;
+ rt_base_t level;
+
+ if (!mmu_info || !vtable)
+ {
+ return -1;
+ }
+
+ va_s = (size_t)v_address;
+ va_e = (size_t)v_address + size - 1;
+
+ if ( va_e < va_s)
+ {
+ return -1;
+ }
+
+ va_s >>= ARCH_SECTION_SHIFT;
+ va_e >>= ARCH_SECTION_SHIFT;
+
+ if (va_s == 0)
+ {
+ return -1;
+ }
+
+ level = rt_hw_interrupt_disable();
+
+ for (l1_off = va_s; l1_off <= va_e; l1_off++)
+ {
+ size_t v = vtable[l1_off];
+
+ if (v & ARCH_MMU_USED_MASK)
+ {
+ rt_hw_interrupt_enable(level);
+ return -1;
+ }
+ }
+
+ mmu_info->vtable = vtable;
+ mmu_info->vstart = va_s;
+ mmu_info->vend = va_e;
+ mmu_info->pv_off = pv_off;
+
+ rt_hw_interrupt_enable(level);
+
+ return 0;
+}
+
+int rt_hw_mmu_ioremap_init(rt_mmu_info *mmu_info, void* v_address, size_t size)
+{
+#ifdef RT_IOREMAP_LATE
+ size_t loop_va;
+ size_t l1_off;
+ size_t *mmu_l1, *mmu_l2;
+ size_t sections;
+ size_t *ref_cnt;
+
+ /* for kernel ioremap */
+ if ((size_t)v_address < KERNEL_VADDR_START)
+ {
+ return -1;
+ }
+ /* must align to section */
+ if ((size_t)v_address & ARCH_SECTION_MASK)
+ {
+ return -1;
+ }
+ /* must align to section */
+ if (size & ARCH_SECTION_MASK)
+ {
+ return -1;
+ }
+
+ loop_va = (size_t)v_address;
+ sections = (size >> ARCH_SECTION_SHIFT);
+ while (sections--)
+ {
+ l1_off = (loop_va >> ARCH_SECTION_SHIFT);
+ mmu_l1 = (size_t*)mmu_info->vtable + l1_off;
+
+ RT_ASSERT((*mmu_l1 & ARCH_MMU_USED_MASK) == 0);
+#ifdef RT_USING_USERSPACE
+ mmu_l2 = (size_t*)rt_pages_alloc(0);
+#else
+ mmu_l2 = (size_t*)rt_malloc_align(ARCH_PAGE_TBL_SIZE * 2, ARCH_PAGE_TBL_SIZE);
+#endif
+ if (mmu_l2)
+ {
+ rt_memset(mmu_l2, 0, ARCH_PAGE_TBL_SIZE * 2);
+ /* cache maintain */
+ rt_hw_cpu_dcache_clean(mmu_l2, ARCH_PAGE_TBL_SIZE);
+
+ *mmu_l1 = (((size_t)mmu_l2 + mmu_info->pv_off) | 0x1);
+ /* cache maintain */
+ rt_hw_cpu_dcache_clean(mmu_l1, 4);
+ }
+ else
+ {
+ /* error */
+ return -1;
+ }
+
+ ref_cnt = mmu_l2 + (ARCH_SECTION_SIZE/ARCH_PAGE_SIZE);
+ *ref_cnt = 1;
+
+ loop_va += ARCH_SECTION_SIZE;
+ }
+#endif
+ return 0;
+}
+
+static size_t find_vaddr(rt_mmu_info *mmu_info, int pages)
+{
+ size_t l1_off, l2_off;
+ size_t *mmu_l1, *mmu_l2;
+ size_t find_off = 0;
+ size_t find_va = 0;
+ int n = 0;
+
+ if (!pages)
+ {
+ return 0;
+ }
+
+ if (!mmu_info)
+ {
+ return 0;
+ }
+
+ for (l1_off = mmu_info->vstart; l1_off <= mmu_info->vend; l1_off++)
+ {
+ mmu_l1 = (size_t*)mmu_info->vtable + l1_off;
+ if (*mmu_l1 & ARCH_MMU_USED_MASK)
+ {
+ mmu_l2 = (size_t *)((*mmu_l1 & ~ARCH_PAGE_TBL_MASK) - mmu_info->pv_off);
+ for (l2_off = 0; l2_off < (ARCH_SECTION_SIZE/ARCH_PAGE_SIZE); l2_off++)
+ {
+ if (*(mmu_l2 + l2_off) & ARCH_MMU_USED_MASK)
+ {
+ /* in use */
+ n = 0;
+ }
+ else
+ {
+ if (!n)
+ {
+ find_va = l1_off;
+ find_off = l2_off;
+ }
+ n++;
+ if (n >= pages)
+ {
+ return (find_va << ARCH_SECTION_SHIFT) + (find_off << ARCH_PAGE_SHIFT);
+ }
+ }
+ }
+ }
+ else
+ {
+ if (!n)
+ {
+ find_va = l1_off;
+ find_off = 0;
+ }
+ n += (ARCH_SECTION_SIZE/ARCH_PAGE_SIZE);
+ if (n >= pages)
+ {
+ return (find_va << ARCH_SECTION_SHIFT) + (find_off << ARCH_PAGE_SHIFT);
+ }
+ }
+ }
+ return 0;
+}
+
+#ifdef RT_USING_USERSPACE
+static int check_vaddr(rt_mmu_info *mmu_info, void *va, int pages)
+{
+ size_t loop_va = (size_t)va & ~ARCH_PAGE_MASK;
+ size_t l1_off, l2_off;
+ size_t *mmu_l1, *mmu_l2;
+
+ if (!pages)
+ {
+ return -1;
+ }
+
+ if (!mmu_info)
+ {
+ return -1;
+ }
+
+ while (pages--)
+ {
+ l1_off = (loop_va >> ARCH_SECTION_SHIFT);
+ l2_off = ((loop_va & ARCH_SECTION_MASK) >> ARCH_PAGE_SHIFT);
+ mmu_l1 = (size_t*)mmu_info->vtable + l1_off;
+
+ if (*mmu_l1 & ARCH_MMU_USED_MASK)
+ {
+ mmu_l2 = (size_t *)((*mmu_l1 & ~ARCH_PAGE_TBL_MASK) - mmu_info->pv_off);
+ if (*(mmu_l2 + l2_off) & ARCH_MMU_USED_MASK)
+ {
+ return -1;
+ }
+ }
+ loop_va += ARCH_PAGE_SIZE;
+ }
+ return 0;
+}
+#endif
+
+static void __rt_hw_mmu_unmap(rt_mmu_info *mmu_info, void* v_addr, size_t npages)
+{
+ size_t loop_va = (size_t)v_addr & ~ARCH_PAGE_MASK;
+ size_t l1_off, l2_off;
+ size_t *mmu_l1, *mmu_l2;
+ size_t *ref_cnt;
+
+ if (!mmu_info)
+ {
+ return;
+ }
+
+ while (npages--)
+ {
+ l1_off = (loop_va >> ARCH_SECTION_SHIFT);
+ if (l1_off < mmu_info->vstart || l1_off > mmu_info->vend)
+ {
+ return;
+ }
+
+ l2_off = ((loop_va & ARCH_SECTION_MASK) >> ARCH_PAGE_SHIFT);
+ mmu_l1 = (size_t*)mmu_info->vtable + l1_off;
+
+ if (*mmu_l1 & ARCH_MMU_USED_MASK)
+ {
+ mmu_l2 = (size_t *)((*mmu_l1 & ~ARCH_PAGE_TBL_MASK) - mmu_info->pv_off);
+ }
+ else
+ {
+ return;
+ }
+
+ if (*(mmu_l2 + l2_off) & ARCH_MMU_USED_MASK)
+ {
+ *(mmu_l2 + l2_off) = 0;
+ /* cache maintain */
+ rt_hw_cpu_dcache_clean(mmu_l2 + l2_off, 4);
+
+ ref_cnt = mmu_l2 + (ARCH_SECTION_SIZE/ARCH_PAGE_SIZE);
+ (*ref_cnt)--;
+ if (!*ref_cnt)
+ {
+#ifdef RT_USING_USERSPACE
+ rt_pages_free(mmu_l2, 0);
+#else
+ rt_free_align(mmu_l2);
+#endif
+ *mmu_l1 = 0;
+
+ /* cache maintain */
+ rt_hw_cpu_dcache_clean(mmu_l1, 4);
+ }
+ }
+ loop_va += ARCH_PAGE_SIZE;
+ }
+}
+
+static int __rt_hw_mmu_map(rt_mmu_info *mmu_info, void* v_addr, void* p_addr, size_t npages, size_t attr)
+{
+ size_t loop_va = (size_t)v_addr & ~ARCH_PAGE_MASK;
+ size_t loop_pa = (size_t)p_addr & ~ARCH_PAGE_MASK;
+ size_t l1_off, l2_off;
+ size_t *mmu_l1, *mmu_l2;
+ size_t *ref_cnt;
+
+ if (!mmu_info)
+ {
+ return -1;
+ }
+
+ while (npages--)
+ {
+ l1_off = (loop_va >> ARCH_SECTION_SHIFT);
+ l2_off = ((loop_va & ARCH_SECTION_MASK) >> ARCH_PAGE_SHIFT);
+ mmu_l1 = (size_t*)mmu_info->vtable + l1_off;
+
+ if (*mmu_l1 & ARCH_MMU_USED_MASK)
+ {
+ mmu_l2 = (size_t *)((*mmu_l1 & ~ARCH_PAGE_TBL_MASK) - mmu_info->pv_off);
+ }
+ else
+ {
+#ifdef RT_USING_USERSPACE
+ mmu_l2 = (size_t*)rt_pages_alloc(0);
+#else
+ mmu_l2 = (size_t*)rt_malloc_align(ARCH_PAGE_TBL_SIZE * 2, ARCH_PAGE_TBL_SIZE);
+#endif
+ if (mmu_l2)
+ {
+ rt_memset(mmu_l2, 0, ARCH_PAGE_TBL_SIZE * 2);
+ /* cache maintain */
+ rt_hw_cpu_dcache_clean(mmu_l2, ARCH_PAGE_TBL_SIZE);
+
+ *mmu_l1 = (((size_t)mmu_l2 + mmu_info->pv_off) | 0x1);
+ /* cache maintain */
+ rt_hw_cpu_dcache_clean(mmu_l1, 4);
+ }
+ else
+ {
+ /* error, unmap and quit */
+ __rt_hw_mmu_unmap(mmu_info, v_addr, npages);
+ return -1;
+ }
+ }
+
+ ref_cnt = mmu_l2 + (ARCH_SECTION_SIZE/ARCH_PAGE_SIZE);
+ (*ref_cnt)++;
+
+ *(mmu_l2 + l2_off) = (loop_pa | attr);
+ /* cache maintain */
+ rt_hw_cpu_dcache_clean(mmu_l2 + l2_off, 4);
+
+ loop_va += ARCH_PAGE_SIZE;
+ loop_pa += ARCH_PAGE_SIZE;
+ }
+ return 0;
+}
+
+static void rt_hw_cpu_tlb_invalidate(void)
+{
+ asm volatile ("mcr p15, 0, r0, c8, c7, 0\ndsb\nisb" ::: "memory");
+}
+
+#ifdef RT_USING_USERSPACE
+void *_rt_hw_mmu_map(rt_mmu_info *mmu_info, void *v_addr, void* p_addr, size_t size, size_t attr)
+{
+ size_t pa_s, pa_e;
+ size_t vaddr;
+ int pages;
+ int ret;
+
+ if (!size)
+ {
+ return 0;
+ }
+ pa_s = (size_t)p_addr;
+ pa_e = (size_t)p_addr + size - 1;
+ pa_s >>= ARCH_PAGE_SHIFT;
+ pa_e >>= ARCH_PAGE_SHIFT;
+ pages = pa_e - pa_s + 1;
+ if (v_addr)
+ {
+ vaddr = (size_t)v_addr;
+ pa_s = (size_t)p_addr;
+ if ((vaddr & ARCH_PAGE_MASK) != (pa_s & ARCH_PAGE_MASK))
+ {
+ return 0;
+ }
+ vaddr &= ~ARCH_PAGE_MASK;
+ if (check_vaddr(mmu_info, (void*)vaddr, pages) != 0)
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ vaddr = find_vaddr(mmu_info, pages);
+ }
+ if (vaddr) {
+ ret = __rt_hw_mmu_map(mmu_info, (void*)vaddr, p_addr, pages, attr);
+ if (ret == 0)
+ {
+ rt_hw_cpu_tlb_invalidate();
+ return (void*)(vaddr + ((size_t)p_addr & ARCH_PAGE_MASK));
+ }
+ }
+ return 0;
+}
+#else
+void *_rt_hw_mmu_map(rt_mmu_info *mmu_info, void* p_addr, size_t size, size_t attr)
+{
+ size_t pa_s, pa_e;
+ size_t vaddr;
+ int pages;
+ int ret;
+
+ pa_s = (size_t)p_addr;
+ pa_e = (size_t)p_addr + size - 1;
+ pa_s >>= ARCH_PAGE_SHIFT;
+ pa_e >>= ARCH_PAGE_SHIFT;
+ pages = pa_e - pa_s + 1;
+ vaddr = find_vaddr(mmu_info, pages);
+ if (vaddr) {
+ ret = __rt_hw_mmu_map(mmu_info, (void*)vaddr, p_addr, pages, attr);
+ if (ret == 0)
+ {
+ rt_hw_cpu_tlb_invalidate();
+ return (void*)(vaddr + ((size_t)p_addr & ARCH_PAGE_MASK));
+ }
+ }
+ return 0;
+}
+#endif
+
+#ifdef RT_USING_USERSPACE
+static int __rt_hw_mmu_map_auto(rt_mmu_info *mmu_info, void* v_addr, size_t npages, size_t attr)
+{
+ size_t loop_va = (size_t)v_addr & ~ARCH_PAGE_MASK;
+ size_t loop_pa;
+ size_t l1_off, l2_off;
+ size_t *mmu_l1, *mmu_l2;
+ size_t *ref_cnt;
+
+ if (!mmu_info)
+ {
+ return -1;
+ }
+
+ while (npages--)
+ {
+ loop_pa = (size_t)rt_pages_alloc(0);
+ if (!loop_pa)
+ goto err;
+
+ l1_off = (loop_va >> ARCH_SECTION_SHIFT);
+ l2_off = ((loop_va & ARCH_SECTION_MASK) >> ARCH_PAGE_SHIFT);
+ mmu_l1 = (size_t*)mmu_info->vtable + l1_off;
+
+ if (*mmu_l1 & ARCH_MMU_USED_MASK)
+ {
+ mmu_l2 = (size_t *)((*mmu_l1 & ~ARCH_PAGE_TBL_MASK) - mmu_info->pv_off);
+ }
+ else
+ {
+ //mmu_l2 = (size_t*)rt_malloc_align(ARCH_PAGE_TBL_SIZE * 2, ARCH_PAGE_TBL_SIZE);
+ mmu_l2 = (size_t*)rt_pages_alloc(0);
+ if (mmu_l2)
+ {
+ rt_memset(mmu_l2, 0, ARCH_PAGE_TBL_SIZE * 2);
+ /* cache maintain */
+ rt_hw_cpu_dcache_clean(mmu_l2, ARCH_PAGE_TBL_SIZE);
+
+ *mmu_l1 = (((size_t)mmu_l2 + mmu_info->pv_off) | 0x1);
+ /* cache maintain */
+ rt_hw_cpu_dcache_clean(mmu_l1, 4);
+ }
+ else
+ goto err;
+ }
+
+ ref_cnt = mmu_l2 + (ARCH_SECTION_SIZE/ARCH_PAGE_SIZE);
+ (*ref_cnt)++;
+
+ loop_pa += mmu_info->pv_off;
+ *(mmu_l2 + l2_off) = (loop_pa | attr);
+ /* cache maintain */
+ rt_hw_cpu_dcache_clean(mmu_l2 + l2_off, 4);
+
+ loop_va += ARCH_PAGE_SIZE;
+ }
+ return 0;
+err:
+ {
+ /* error, unmap and quit */
+ int i;
+ void *va, *pa;
+
+ va = (void*)((size_t)v_addr & ~ARCH_PAGE_MASK);
+ for (i = 0; i < npages; i++)
+ {
+ pa = rt_hw_mmu_v2p(mmu_info, va);
+ pa = (void*)((char*)pa - mmu_info->pv_off);
+ rt_pages_free(pa, 0);
+ va = (void*)((char*)va + ARCH_PAGE_SIZE);
+ }
+
+ __rt_hw_mmu_unmap(mmu_info, v_addr, npages);
+ return -1;
+ }
+}
+
+void *_rt_hw_mmu_map_auto(rt_mmu_info *mmu_info, void *v_addr, size_t size, size_t attr)
+{
+ size_t vaddr;
+ size_t offset;
+ int pages;
+ int ret;
+
+ if (!size)
+ {
+ return 0;
+ }
+ offset = (size_t)v_addr & ARCH_PAGE_MASK;
+ size += (offset + ARCH_PAGE_SIZE - 1);
+ pages = (size >> ARCH_PAGE_SHIFT);
+ if (v_addr)
+ {
+ vaddr = (size_t)v_addr;
+ vaddr &= ~ARCH_PAGE_MASK;
+ if (check_vaddr(mmu_info, (void*)vaddr, pages) != 0)
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ vaddr = find_vaddr(mmu_info, pages);
+ }
+ if (vaddr) {
+ ret = __rt_hw_mmu_map_auto(mmu_info, (void*)vaddr, pages, attr);
+ if (ret == 0)
+ {
+ rt_hw_cpu_tlb_invalidate();
+ return (void*)((char*)vaddr + offset);
+ }
+ }
+ return 0;
+}
+#endif
+
+void _rt_hw_mmu_unmap(rt_mmu_info *mmu_info, void* v_addr, size_t size)
+{
+ size_t va_s, va_e;
+ int pages;
+
+ va_s = (size_t)v_addr;
+ va_e = (size_t)v_addr + size - 1;
+ va_s >>= ARCH_PAGE_SHIFT;
+ va_e >>= ARCH_PAGE_SHIFT;
+ pages = va_e - va_s + 1;
+ __rt_hw_mmu_unmap(mmu_info, v_addr, pages);
+ rt_hw_cpu_tlb_invalidate();
+}
+
+
+extern void *_rt_hw_mmu_v2p(rt_mmu_info *mmu_info, void* v_addr);
+//va --> pa
+// void *rt_hw_kernel_virt_to_phys(void *v_addr, size_t size)
+void *rt_hw_kernel_virt_to_phys(void *v_addr)
+{
+ void *p_addr = 0;
+ #ifdef RT_USING_USERSPACE
+ rt_base_t level;
+
+ extern rt_mmu_info mmu_info;
+ level = rt_hw_interrupt_disable();
+ p_addr = _rt_hw_mmu_v2p(&mmu_info, v_addr);
+ rt_hw_interrupt_enable(level);
+ #else
+ p_addr = v_addr;
+ #endif
+
+ return p_addr;
+}
+
+//pa --> va
+void *rt_hw_kernel_phys_to_virt(void *p_addr, size_t size)
+{
+ void *v_addr = 0;
+
+ #ifdef RT_USING_USERSPACE
+ extern rt_mmu_info mmu_info;
+ v_addr = rt_hw_mmu_map(&mmu_info, 0, p_addr, size, MMU_MAP_K_RW);
+ #else
+ v_addr = p_addr;
+ #endif
+
+ return v_addr;
+}
+
+#ifdef RT_USING_USERSPACE
+void *rt_hw_mmu_map(rt_mmu_info *mmu_info, void *v_addr, void* p_addr, size_t size, size_t attr)
+{
+ void *ret;
+ rt_base_t level;
+
+ level = rt_hw_interrupt_disable();
+ ret = _rt_hw_mmu_map(mmu_info, v_addr, p_addr, size, attr);
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
+
+void *rt_hw_mmu_map_auto(rt_mmu_info *mmu_info, void *v_addr, size_t size, size_t attr)
+{
+ void *ret;
+ rt_base_t level;
+
+ level = rt_hw_interrupt_disable();
+ ret = _rt_hw_mmu_map_auto(mmu_info, v_addr, size, attr);
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
+#endif
+
+void rt_hw_mmu_unmap(rt_mmu_info *mmu_info, void* v_addr, size_t size)
+{
+ rt_base_t level;
+
+ level = rt_hw_interrupt_disable();
+ _rt_hw_mmu_unmap(mmu_info, v_addr, size);
+ rt_hw_interrupt_enable(level);
+}
+
+void *_rt_hw_mmu_v2p(rt_mmu_info *mmu_info, void* v_addr)
+{
+ size_t l1_off, l2_off;
+ size_t *mmu_l1, *mmu_l2;
+ size_t tmp;
+ size_t pa;
+
+ l1_off = (size_t)v_addr >> ARCH_SECTION_SHIFT;
+
+ if (!mmu_info)
+ {
+ return (void*)0;
+ }
+
+ mmu_l1 = (size_t*)mmu_info->vtable + l1_off;
+
+ tmp = *mmu_l1;
+
+ switch (tmp & ARCH_MMU_USED_MASK)
+ {
+ case 0: /* not used */
+ break;
+ case 1: /* page table */
+ mmu_l2 = (size_t *)((tmp & ~ARCH_PAGE_TBL_MASK) - mmu_info->pv_off);
+ l2_off = (((size_t)v_addr & ARCH_SECTION_MASK) >> ARCH_PAGE_SHIFT);
+ pa = *(mmu_l2 + l2_off);
+ if (pa & ARCH_MMU_USED_MASK)
+ {
+ if ((pa & ARCH_MMU_USED_MASK) == 1)
+ {
+ /* large page, not support */
+ break;
+ }
+ pa &= ~(ARCH_PAGE_MASK);
+ pa += ((size_t)v_addr & ARCH_PAGE_MASK);
+ return (void*)pa;
+ }
+ break;
+ case 2:
+ case 3:
+ /* section */
+ if (tmp & ARCH_TYPE_SUPERSECTION)
+ {
+ /* super section, not support */
+ break;
+ }
+ pa = (tmp & ~ARCH_SECTION_MASK);
+ pa += ((size_t)v_addr & ARCH_SECTION_MASK);
+ return (void*)pa;
+ }
+ return (void*)0;
+}
+
+void *rt_hw_mmu_v2p(rt_mmu_info *mmu_info, void* v_addr)
+{
+ void *ret;
+ rt_base_t level;
+
+ level = rt_hw_interrupt_disable();
+ ret = _rt_hw_mmu_v2p(mmu_info, v_addr);
+ rt_hw_interrupt_enable(level);
+ return ret;
+}
+
+#ifdef RT_USING_USERSPACE
+void init_mm_setup(unsigned int *mtbl, unsigned int size, unsigned int pv_off) {
+ unsigned int va;
+
+ for (va = 0; va < 0x1000; va++) {
+ unsigned int vaddr = (va << 20);
+ if (vaddr >= KERNEL_VADDR_START && vaddr - KERNEL_VADDR_START < size) {
+ mtbl[va] = ((va << 20) + pv_off) | NORMAL_MEM;
+ } else if (vaddr >= (KERNEL_VADDR_START + pv_off) && vaddr - (KERNEL_VADDR_START + pv_off) < size) {
+ mtbl[va] = (va << 20) | NORMAL_MEM;
+ } else {
+ mtbl[va] = 0;
+ }
+ }
+}
+#endif
diff --git a/libcpu/arm/cortex-a/mmu.h b/libcpu/arm/cortex-a/mmu.h
index fbce6df93514ea612d255977995214c2bda70b40..ecbd3e70532d01f97110495f120c2786bd7fae86 100644
--- a/libcpu/arm/cortex-a/mmu.h
+++ b/libcpu/arm/cortex-a/mmu.h
@@ -19,8 +19,14 @@
#define SHAREDEVICE (1<<2) /* shared device */
#define STRONGORDER (0<<2) /* strong ordered */
#define XN (1<<4) /* eXecute Never */
+#ifdef RT_USING_USERSPACE
+#define AP_RW (1<<10) /* supervisor=RW, user=No */
+#define AP_RO ((1<<10) |(1 << 15)) /* supervisor=RW, user=No */
+#else
#define AP_RW (3<<10) /* supervisor=RW, user=RW */
-#define AP_RO (2<<10) /* supervisor=RW, user=RO */
+#define AP_RO ((2<<10) /* supervisor=RW, user=RO */
+#endif
+
#define SHARED (1<<16) /* shareable */
#define DOMAIN_FAULT (0x0)
@@ -37,6 +43,8 @@
/* normal memory mapping type */
#define NORMAL_MEM (SHARED|AP_RW|DOMAIN0|MEMWBWA|DESC_SEC)
+#define STRONG_ORDER_MEM (SHARED|AP_RO|XN|DESC_SEC)
+
struct mem_desc
{
rt_uint32_t vaddr_start;
@@ -45,5 +53,62 @@ struct mem_desc
rt_uint32_t attr;
};
+#define MMU_MAP_MTBL_XN (1<<0)
+#define MMU_MAP_MTBL_A (1<<1)
+#define MMU_MAP_MTBL_B (1<<2)
+#define MMU_MAP_MTBL_C (1<<3)
+#define MMU_MAP_MTBL_AP01(x) (x<<4)
+#define MMU_MAP_MTBL_TEX(x) (x<<6)
+#define MMU_MAP_MTBL_AP2(x) (x<<9)
+#define MMU_MAP_MTBL_SHARE (1<<10)
+
+#define MMU_MAP_K_RO (MMU_MAP_MTBL_A|MMU_MAP_MTBL_AP2(1)|MMU_MAP_MTBL_AP01(1)|MMU_MAP_MTBL_TEX(0)|MMU_MAP_MTBL_C|MMU_MAP_MTBL_SHARE)
+#define MMU_MAP_K_RWCB (MMU_MAP_MTBL_A|MMU_MAP_MTBL_AP2(0)|MMU_MAP_MTBL_AP01(1)|MMU_MAP_MTBL_TEX(0)|MMU_MAP_MTBL_B|MMU_MAP_MTBL_C|MMU_MAP_MTBL_SHARE)
+#define MMU_MAP_K_RW (MMU_MAP_MTBL_A|MMU_MAP_MTBL_AP2(0)|MMU_MAP_MTBL_AP01(1)|MMU_MAP_MTBL_TEX(0)|MMU_MAP_MTBL_SHARE)
+#define MMU_MAP_K_DEVICE (MMU_MAP_MTBL_A|MMU_MAP_MTBL_AP2(0)|MMU_MAP_MTBL_AP01(1)|MMU_MAP_MTBL_TEX(0)|MMU_MAP_MTBL_B|MMU_MAP_MTBL_SHARE)
+#define MMU_MAP_U_RO (MMU_MAP_MTBL_A|MMU_MAP_MTBL_AP2(0)|MMU_MAP_MTBL_AP01(2)|MMU_MAP_MTBL_TEX(0)|MMU_MAP_MTBL_C|MMU_MAP_MTBL_SHARE)
+#define MMU_MAP_U_RWCB (MMU_MAP_MTBL_A|MMU_MAP_MTBL_AP2(0)|MMU_MAP_MTBL_AP01(3)|MMU_MAP_MTBL_TEX(0)|MMU_MAP_MTBL_B|MMU_MAP_MTBL_C|MMU_MAP_MTBL_SHARE)
+#define MMU_MAP_U_RW (MMU_MAP_MTBL_A|MMU_MAP_MTBL_AP2(0)|MMU_MAP_MTBL_AP01(3)|MMU_MAP_MTBL_TEX(0)|MMU_MAP_MTBL_SHARE)
+#define MMU_MAP_U_DEVICE (MMU_MAP_MTBL_A|MMU_MAP_MTBL_AP2(0)|MMU_MAP_MTBL_AP01(3)|MMU_MAP_MTBL_TEX(0)|MMU_MAP_MTBL_B|MMU_MAP_MTBL_SHARE)
+
+#define ARCH_SECTION_SHIFT 20
+#define ARCH_SECTION_SIZE (1 << ARCH_SECTION_SHIFT)
+#define ARCH_SECTION_MASK (ARCH_SECTION_SIZE - 1)
+#define ARCH_PAGE_SHIFT 12
+#define ARCH_PAGE_SIZE (1 << ARCH_PAGE_SHIFT)
+#define ARCH_PAGE_MASK (ARCH_PAGE_SIZE - 1)
+#define ARCH_PAGE_TBL_SHIFT 10
+#define ARCH_PAGE_TBL_SIZE (1 << ARCH_PAGE_TBL_SHIFT)
+#define ARCH_PAGE_TBL_MASK (ARCH_PAGE_TBL_SIZE - 1)
+
+#define ARCH_MMU_USED_MASK 3
+
+#define ARCH_TYPE_SUPERSECTION (1 << 18)
+
+#define ARCH_ADDRESS_WIDTH_BITS 32
+
+typedef struct
+{
+ size_t *vtable;
+ size_t vstart;
+ size_t vend;
+ size_t pv_off;
+} rt_mmu_info;
+
+int rt_hw_mmu_map_init(rt_mmu_info *mmu_info, void* v_address, size_t size, size_t *vtable, size_t pv_off);
+int rt_hw_mmu_ioremap_init(rt_mmu_info *mmu_info, void* v_address, size_t size);
+
+#ifdef RT_USING_USERSPACE
+void *rt_hw_mmu_map(rt_mmu_info *mmu_info, void *v_addr, void* p_addr, size_t size, size_t attr);
+void *rt_hw_mmu_map_auto(rt_mmu_info *mmu_info, void *v_addr, size_t size, size_t attr);
+#else
+void *rt_hw_mmu_map(rt_mmu_info *mmu_info, void* p_addr, size_t size, size_t attr);
+#endif
+
+void rt_hw_mmu_unmap(rt_mmu_info *mmu_info, void* v_addr, size_t size);
+void *rt_hw_mmu_v2p(rt_mmu_info *mmu_info, void* v_addr);
+
+void *rt_hw_kernel_phys_to_virt(void *p_addr, size_t size);
+void *rt_hw_kernel_virt_to_phys(void *v_addr);
#endif
diff --git a/libcpu/arm/cortex-a/page.c b/libcpu/arm/cortex-a/page.c
new file mode 100644
index 0000000000000000000000000000000000000000..716e4f1aaf7a93a62103d08a0ee1b651b83b5831
--- /dev/null
+++ b/libcpu/arm/cortex-a/page.c
@@ -0,0 +1,315 @@
+/*
+ * Copyright (c) 2006-2019, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-11-01 Jesven The first version
+ */
+#include
+
+#include
+#include
+
+#ifdef RT_USING_USERSPACE
+
+#include
+#include
+
+#define ARCH_PAGE_LIST_SIZE (ARCH_ADDRESS_WIDTH_BITS - ARCH_PAGE_SHIFT)
+
+#define DBG_TAG "PAGE"
+#define DBG_LVL DBG_WARNING
+#include
+
+struct page
+{
+ struct page *next; // same level next
+ struct page *pre; // same level pre
+ uint32_t size_bits; // if is ARCH_ADDRESS_WIDTH_BITS, means not free
+};
+
+static struct page* page_start;
+static void* page_addr;
+static size_t page_nr;
+
+static struct page *page_list[ARCH_PAGE_LIST_SIZE];
+
+size_t rt_page_bits(size_t size)
+{
+ int bit;
+
+ bit = __builtin_clz(size);
+ bit = (31 - bit);
+ if ((size ^ (1UL << bit)) != 0)
+ {
+ bit++;
+ }
+ bit -= ARCH_PAGE_SHIFT;
+ if (bit < 0)
+ {
+ bit = 0;
+ }
+ return bit;
+}
+
+static struct page * addr_to_page(void *addr)
+{
+ size_t off;
+
+ if (addr < page_addr)
+ {
+ return 0;
+ }
+ off = (size_t)((char*)addr - (char*)page_addr);
+ off >>= ARCH_PAGE_SHIFT;
+ if (off >= page_nr)
+ {
+ return 0;
+ }
+ return &page_start[off];
+}
+
+static void* page_to_addr(struct page* p)
+{
+ if (!p)
+ {
+ return 0;
+ }
+ return (void*)((char*)page_addr + ((p - page_start) << ARCH_PAGE_SHIFT));
+}
+
+static inline struct page *buddy_get(struct page *p, uint32_t size_bits)
+{
+ size_t addr;
+
+ addr = (size_t)page_to_addr(p);
+ addr ^= (1UL << (size_bits + ARCH_PAGE_SHIFT));
+ return addr_to_page((void*)addr);
+}
+
+static void page_remove(struct page *p, uint32_t size_bits)
+{
+ if (p->pre)
+ {
+ p->pre->next = p->next;
+ }
+ else
+ {
+ page_list[size_bits] = p->next;
+ }
+
+ if (p->next)
+ {
+ p->next->pre = p->pre;
+ }
+
+ p->size_bits = ARCH_ADDRESS_WIDTH_BITS;
+}
+
+static void page_insert(struct page *p, uint32_t size_bits)
+{
+ p->next = page_list[size_bits];
+ if (p->next)
+ {
+ p->next->pre = p;
+ }
+ p->pre = 0;
+ page_list[size_bits] = p;
+ p->size_bits = size_bits;
+}
+
+static void _pages_free(struct page *p, uint32_t size_bits)
+{
+ uint32_t level = size_bits;
+ uint32_t high = ARCH_ADDRESS_WIDTH_BITS - size_bits - 1;
+ struct page *buddy;
+
+ while (level < high)
+ {
+ buddy = buddy_get(p, level);
+ if (buddy && buddy->size_bits == level)
+ {
+ page_remove(buddy, level);
+ p = (p < buddy) ? p : buddy;
+ level++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ page_insert(p, level);
+}
+
+static struct page *_pages_alloc(uint32_t size_bits)
+{
+ struct page *p;
+
+ if (page_list[size_bits])
+ {
+ p = page_list[size_bits];
+ page_remove(p, size_bits);
+ }
+ else
+ {
+ uint32_t level;
+ uint32_t high = ARCH_ADDRESS_WIDTH_BITS - size_bits - 1;
+
+ for (level = size_bits + 1; level <= high; level++)
+ {
+ if (page_list[level])
+ {
+ break;
+ }
+ }
+ if (level == high + 1)
+ {
+ return 0;
+ }
+
+ p = page_list[level];
+ page_remove(p, level);
+ while (level > size_bits)
+ {
+ page_insert(p, level - 1);
+ p = buddy_get(p, level - 1);
+ level--;
+ }
+ }
+ return p;
+}
+
+void *rt_pages_alloc(uint32_t size_bits)
+{
+ struct page *p;
+ rt_base_t level;
+
+ level = rt_hw_interrupt_disable();
+ p = _pages_alloc(size_bits);
+ rt_hw_interrupt_enable(level);
+ return page_to_addr(p);
+}
+
+void rt_pages_free(void *addr, uint32_t size_bits)
+{
+ struct page *p;
+
+ p = addr_to_page(addr);
+ if (p)
+ {
+ rt_base_t level;
+ level = rt_hw_interrupt_disable();
+ _pages_free(p, size_bits);
+ rt_hw_interrupt_enable(level);
+ }
+}
+
+void rt_pageinfo_dump(void)
+{
+ int i;
+ size_t total = 0;
+
+ rt_base_t level;
+ level = rt_hw_interrupt_disable();
+
+ for (i = 0; i < ARCH_PAGE_LIST_SIZE; i++)
+ {
+ struct page *p = page_list[i];
+
+ rt_kprintf("level %d ", i);
+
+ while (p)
+ {
+ total += (1UL << i);
+ rt_kprintf("[0x%08x]", page_to_addr(p));
+ p = p->next;
+ }
+ rt_kprintf("\n");
+ }
+ rt_hw_interrupt_enable(level);
+ rt_kprintf("free pages is %08x\n", total);
+ rt_kprintf("-------------------------------\n");
+}
+MSH_CMD_EXPORT(rt_pageinfo_dump, show page info);
+
+void rt_page_get_info(size_t *total_nr, size_t *free_nr)
+{
+ int i;
+ size_t total_free = 0;
+ rt_base_t level;
+
+ level = rt_hw_interrupt_disable();
+ for (i = 0; i < ARCH_PAGE_LIST_SIZE; i++)
+ {
+ struct page *p = page_list[i];
+
+ while (p)
+ {
+ total_free += (1UL << i);
+ p = p->next;
+ }
+ }
+ rt_hw_interrupt_enable(level);
+ *total_nr = page_nr;
+ *free_nr = total_free;
+}
+
+void rt_page_init(rt_region_t reg)
+{
+ uint32_t align_bits;
+ uint32_t size_bits;
+ int i;
+
+ LOG_D("split 0x%08x 0x%08x\n", reg.start, reg.end);
+
+ reg.start += ARCH_PAGE_MASK;
+ reg.start &= ~ARCH_PAGE_MASK;
+
+ reg.end &= ~ARCH_PAGE_MASK;
+
+ {
+ int nr = ARCH_PAGE_SIZE/sizeof(struct page);
+ int total = (reg.end - reg.start) >> ARCH_PAGE_SHIFT;
+ int mnr = (total + nr)/(nr + 1);
+
+ LOG_D("nr = 0x%08x\n", nr);
+ LOG_D("total = 0x%08x\n", total);
+ LOG_D("mnr = 0x%08x\n", mnr);
+
+ page_start = (struct page*)reg.start;
+ reg.start += (mnr << ARCH_PAGE_SHIFT);
+ page_addr = (void*)reg.start;
+ page_nr = (reg.end - reg.start) >> ARCH_PAGE_SHIFT;
+ }
+
+ LOG_D("align 0x%08x 0x%08x\n", reg.start, reg.end);
+
+ /* init page struct */
+ for (i = 0; i < page_nr; i++)
+ {
+ page_start[i].size_bits = ARCH_ADDRESS_WIDTH_BITS;
+ }
+
+ /* init free list */
+ for (i = 0; i < ARCH_PAGE_LIST_SIZE; i++)
+ {
+ page_list[i] = 0;
+ }
+
+ while (reg.start != reg.end)
+ {
+ size_bits = ARCH_ADDRESS_WIDTH_BITS - 1 - __builtin_clz(reg.end - reg.start);
+ align_bits = __builtin_ctz(reg.start);
+ if (align_bits < size_bits)
+ {
+ size_bits = align_bits;
+ }
+
+ _pages_free(addr_to_page((void*)reg.start), size_bits - ARCH_PAGE_SHIFT);
+
+ reg.start += (1U << size_bits);
+ }
+}
+#endif
diff --git a/libcpu/arm/cortex-a/page.h b/libcpu/arm/cortex-a/page.h
new file mode 100644
index 0000000000000000000000000000000000000000..a5965e2a2ec8b8d73de8102408ba42701936f1d5
--- /dev/null
+++ b/libcpu/arm/cortex-a/page.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2006-2019, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-11-01 Jesven The first version
+ */
+
+#ifndef __PAGE_H__
+#define __PAGE_H__
+
+#ifdef RT_USING_USERSPACE
+
+typedef struct tag_region
+{
+ size_t start;
+ size_t end;
+} rt_region_t;
+
+void rt_page_init(rt_region_t reg);
+
+void *rt_pages_alloc(uint32_t size_bits);
+
+void rt_pages_free(void *addr, uint32_t size_bits);
+
+void rt_pageinfo_dump(void);
+
+size_t rt_page_bits(size_t size);
+
+void rt_page_get_info(size_t *total_nr, size_t *free_nr);
+
+#endif
+
+#endif /*__PAGE_H__*/
diff --git a/libcpu/arm/cortex-a/pmu.c b/libcpu/arm/cortex-a/pmu.c
index 8ffc1dede610da978808fa242898e2e2b1b681a2..23bc45156ad0a801b869d77bc1c1497f80a296d3 100644
--- a/libcpu/arm/cortex-a/pmu.c
+++ b/libcpu/arm/cortex-a/pmu.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
+ * Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -9,12 +9,16 @@
#include
#include "pmu.h"
+#define DBG_TAG "PMU"
+#define DBG_LVL DBG_WARNING
+#include
+
void rt_hw_pmu_dump_feature(void)
{
unsigned long reg;
reg = rt_hw_pmu_get_control();
- rt_kprintf("ARM PMU Implementor: %c, ID code: %02x, %d counters\n",
- reg >> 24, (reg >> 16) & 0xff, (reg >> 11) & 0x1f);
+ LOG_D("ARM PMU Implementor: %c, ID code: %02x, %d counters\n",
+ reg >> 24, (reg >> 16) & 0xff, (reg >> 11) & 0x1f);
RT_ASSERT(ARM_PMU_CNTER_NR == ((reg >> 11) & 0x1f));
}
diff --git a/libcpu/arm/cortex-a/stack.c b/libcpu/arm/cortex-a/stack.c
index 07d795ab5b6fce482bf9211e4fe4b76265ae4c01..e67e3c1fa1b3394ddbb8d8fa5a5d2c747cbd6f1c 100644
--- a/libcpu/arm/cortex-a/stack.c
+++ b/libcpu/arm/cortex-a/stack.c
@@ -10,10 +10,10 @@
*/
#include
#include
-#include
+#include
/**
- * @addtogroup AM33xx
+ * @addtogroup ARM Cortex-A
*/
/*@{*/
diff --git a/libcpu/arm/cortex-a/start_gcc.S b/libcpu/arm/cortex-a/start_gcc.S
index 2e99db72189ebb79e766c4633d2b63bbce80edcd..11e51cbd0acef062292a6d0ab7a76f853e6a5946 100644
--- a/libcpu/arm/cortex-a/start_gcc.S
+++ b/libcpu/arm/cortex-a/start_gcc.S
@@ -22,13 +22,9 @@
.equ I_Bit, 0x80 @ when I bit is set, IRQ is disabled
.equ F_Bit, 0x40 @ when F bit is set, FIQ is disabled
-#ifdef RT_USING_FPU
.equ UND_Stack_Size, 0x00000400
-#else
-.equ UND_Stack_Size, 0x00000000
-#endif
.equ SVC_Stack_Size, 0x00000400
-.equ ABT_Stack_Size, 0x00000000
+.equ ABT_Stack_Size, 0x00000400
.equ RT_FIQ_STACK_PGSZ, 0x00000000
.equ RT_IRQ_STACK_PGSZ, 0x00000800
.equ USR_Stack_Size, 0x00000400
@@ -41,13 +37,19 @@
.globl stack_start
.globl stack_top
-.align 3
stack_start:
.rept ISR_Stack_Size
.byte 0
.endr
stack_top:
+#ifdef RT_USING_USERSPACE
+.data
+.align 14
+init_mtbl:
+ .space 16*1024
+#endif
+
.text
/* reset entry */
.globl _reset
@@ -72,8 +74,75 @@ overHyped: /* Get out of HYP mode */
continue:
#endif
+
+#ifdef SOC_BCM283x
+ /* Suspend the other cpu cores */
+ mrc p15, 0, r0, c0, c0, 5
+ ands r0, #3
+ bne _halt
+
+ /* Disable IRQ & FIQ */
+ cpsid if
+
+ /* Check for HYP mode */
+ mrs r0, cpsr_all
+ and r0, r0, #0x1F
+ mov r8, #0x1A
+ cmp r0, r8
+ beq overHyped
+ b continue
+
+overHyped: /* Get out of HYP mode */
+ adr r1, continue
+ msr ELR_hyp, r1
+ mrs r1, cpsr_all
+ and r1, r1, #0x1f ;@ CPSR_MODE_MASK
+ orr r1, r1, #0x13 ;@ CPSR_MODE_SUPERVISOR
+ msr SPSR_hyp, r1
+ eret
+
+continue:
+ /* set the cpu to SVC32 mode and disable interrupt */
+ mrs r0, cpsr
+ bic r0, r0, #0x1f
+ orr r0, r0, #0x13
+ msr cpsr_c, r0
+#endif
+
+#ifdef RT_USING_USERSPACE
+ ldr r5, =PV_OFFSET
+
+ mov r7, #0x100000
+ sub r7, #1
+ mvn r8, r7
+
+ ldr r9, =KERNEL_VADDR_START
+
+ ldr r6, =__bss_end
+ add r6, r7
+ and r6, r8 //r6 end vaddr align up to 1M
+ sub r6, r9 //r6 is size
+
+ ldr sp, =stack_top
+ add sp, r5 //use paddr
+
+ ldr r0, =init_mtbl
+ add r0, r5
+ mov r1, r6
+ mov r2, r5
+ bl init_mm_setup
+
+ ldr lr, =after_enable_mmu
+ ldr r0, =init_mtbl
+ add r0, r5
+ b enable_mmu
+
+after_enable_mmu:
+#endif
+#ifndef SOC_BCM283x
/* set the cpu to SVC32 mode and disable interrupt */
cps #Mode_SVC
+#endif
#ifdef RT_USING_FPU
mov r4, #0xfffffff
@@ -89,14 +158,14 @@ continue:
bl stack_setup
/* clear .bss */
- mov r0,#0 /* get a zero */
- ldr r1,=__bss_start /* bss start */
- ldr r2,=__bss_end /* bss end */
+ mov r0,#0 /* get a zero */
+ ldr r1,=__bss_start /* bss start */
+ ldr r2,=__bss_end /* bss end */
bss_loop:
- cmp r1,r2 /* check if data to clear */
- strlo r0,[r1],#4 /* clear 4 bytes */
- blo bss_loop /* loop until done */
+ cmp r1,r2 /* check if data to clear */
+ strlo r0,[r1],#4 /* clear 4 bytes */
+ blo bss_loop /* loop until done */
#ifdef RT_USING_SMP
mrc p15, 0, r1, c1, c0, 1
@@ -110,7 +179,14 @@ bss_loop:
ldr r1, =platform_mem_desc_size
ldr r1, [r1]
bl rt_hw_init_mmu_table
+
+#ifdef RT_USING_USERSPACE
+ ldr r0, =MMUTable /* vaddr */
+ add r0, r5 /* to paddr */
+ bl switch_mmu
+#else
bl rt_hw_mmu_init
+#endif
/* call C++ constructors of global objects */
ldr r0, =__ctors_start__
@@ -162,6 +238,63 @@ stack_setup:
msr cpsr_c, #Mode_SVC|I_Bit|F_Bit
bx lr
+#ifdef RT_USING_USERSPACE
+.align 2
+.global enable_mmu
+enable_mmu:
+ orr r0, #0x18
+ mcr p15, 0, r0, c2, c0, 0 //ttbr0
+
+ mov r0, #(1 << 5) //PD1=1
+ mcr p15, 0, r0, c2, c0, 2 //ttbcr
+
+ mov r0, #1
+ mcr p15, 0, r0, c3, c0, 0 //dacr
+
+ // invalid tlb before enable mmu
+ mov r0, #0
+ mcr p15, 0, r0, c8, c7, 0
+ mcr p15, 0, r0, c7, c5, 0 ;//iciallu
+ mcr p15, 0, r0, c7, c5, 6 ;//bpiall
+
+ mrc p15, 0, r0, c1, c0, 0
+ orr r0, #(1 | 4)
+ orr r0, #(1 << 12)
+ mcr p15, 0, r0, c1, c0, 0
+ dsb
+ isb
+ mov pc, lr
+
+.global set_process_id
+set_process_id:
+ MCR p15, 0, r0, c13, c0, 1
+ mov pc, lr
+
+.global switch_mmu
+switch_mmu:
+ orr r0, #0x18
+ mcr p15, 0, r0, c2, c0, 0 //ttbr0
+
+ // invalid tlb
+ mov r0, #0
+ mcr p15, 0, r0, c8, c7, 0
+ mcr p15, 0, r0, c7, c5, 0 ;//iciallu
+ mcr p15, 0, r0, c7, c5, 6 ;//bpiall
+
+ dsb
+ isb
+ mov pc, lr
+.global mmu_table_get
+mmu_table_get:
+ mrc p15, 0, r0, c2, c0, 0 //ttbr0
+ bic r0, #0x18
+ mov pc, lr
+#endif
+
+_halt:
+ wfe
+ b _halt
+
/* exception handlers: undef, swi, padt, dabt, resv, irq, fiq */
.section .text.isr, "ax"
.align 5
@@ -204,7 +337,7 @@ vector_irq:
#ifdef RT_USING_LWP
stmfd r0, {r13, r14}^ /* usr_sp, usr_lr */
- sub r0, #8
+ sub r0, #8
#endif
#ifdef RT_USING_FPU
/* fpu context */
@@ -224,12 +357,13 @@ vector_irq:
/* backup r0 -> r8 */
mov r8, r0
+ cps #Mode_SVC
+ mov sp, r8
+
bl rt_interrupt_enter
bl rt_hw_trap_irq
bl rt_interrupt_leave
- cps #Mode_SVC
- mov sp, r8
mov r0, r8
bl rt_scheduler_do_irq_switch
@@ -249,8 +383,36 @@ vector_irq:
cmp r1, #1
beq rt_hw_context_switch_interrupt_do
+#ifdef RT_USING_LWP
+ ldmfd sp!, {r0-r12,lr}
+ cps #Mode_SVC
+ push {r0-r12}
+ mov r7, lr
+ cps #Mode_IRQ
+ mrs r4, spsr
+ sub r5, lr, #4
+ cps #Mode_SVC
+ bl lwp_check_exit
+ and r6, r4, #0x1f
+ cmp r6, #0x10
+ bne 1f
+ msr spsr_csxf, r4
+ mov lr, r5
+ pop {r0-r12}
+ b ret_to_user
+1:
+ mov lr, r7
+ cps #Mode_IRQ
+ msr spsr_csxf, r4
+ mov lr, r5
+ cps #Mode_SVC
+ pop {r0-r12}
+ cps #Mode_IRQ
+ movs pc, lr
+#else
ldmfd sp!, {r0-r12,lr}
subs pc, lr, #4
+#endif
rt_hw_context_switch_interrupt_do:
mov r1, #0 @ clear flag
@@ -274,9 +436,10 @@ rt_hw_context_switch_interrupt_do:
stmfd sp!, {r0} @ push old task's cpsr
#ifdef RT_USING_LWP
- stmfd sp, {r13, r14}^ @push usr_sp, usr_lr
- sub sp, #8
+ stmfd sp, {r13, r14}^ @push usr_sp, usr_lr
+ sub sp, #8
#endif
+
#ifdef RT_USING_FPU
/* fpu context */
vmrs r6, fpexc
@@ -298,6 +461,12 @@ rt_hw_context_switch_interrupt_do:
ldr r6, [r6]
ldr sp, [r6] @ get new task's stack pointer
+#ifdef RT_USING_USERSPACE
+ ldr r1, =rt_current_thread
+ ldr r0, [r1]
+ bl lwp_mmu_switch
+#endif
+
#ifdef RT_USING_FPU
/* fpu context */
ldmfd sp!, {r6}
@@ -319,6 +488,23 @@ rt_hw_context_switch_interrupt_do:
ldmfd sp!, {r4} @ pop new task's cpsr to spsr
msr spsr_cxsf, r4
+#ifdef RT_USING_GDBSERVER
+ bl lwp_check_debug
+#endif
+
+#ifdef RT_USING_LWP
+ bl lwp_check_exit
+#endif
+
+#ifdef RT_USING_LWP
+ and r4, #0x1f
+ cmp r4, #0x10
+ bne 1f
+ ldmfd sp!, {r0-r12,lr}
+ ldmfd sp!, {lr}
+ b ret_to_user
+1:
+#endif
ldmfd sp!, {r0-r12,lr,pc}^ @ pop new task's r0-r12,lr & pc, copy spsr to cpsr
#endif
@@ -327,12 +513,18 @@ rt_hw_context_switch_interrupt_do:
sub sp, sp, #17 * 4 @/* Sizeof(struct rt_hw_exp_stack) */
stmia sp, {r0 - r12} @/* Calling r0-r12 */
mov r0, sp
+ add sp, sp, #17 * 4
mrs r6, spsr @/* Save CPSR */
str lr, [r0, #15*4] @/* Push PC */
str r6, [r0, #16*4] @/* Push CPSR */
+ and r1, r6, #0x1f
+ cmp r1, #0x10
+ cps #Mode_SYS
+ streq sp, [r0, #13*4] @/* Save calling SP */
+ streq lr, [r0, #14*4] @/* Save calling PC */
cps #Mode_SVC
- str sp, [r0, #13*4] @/* Save calling SP */
- str lr, [r0, #14*4] @/* Save calling PC */
+ strne sp, [r0, #13*4] @/* Save calling SP */
+ strne lr, [r0, #14*4] @/* Save calling PC */
.endm
.align 5
@@ -346,9 +538,10 @@ vector_swi:
.globl vector_undef
vector_undef:
push_svc_reg
- cps #Mode_UND
bl rt_hw_trap_undef
+ cps #Mode_UND
#ifdef RT_USING_FPU
+ sub sp, sp, #17 * 4
ldr lr, [sp, #15*4]
ldmia sp, {r0 - r12}
add sp, sp, #17 * 4
@@ -360,15 +553,57 @@ vector_undef:
.globl vector_pabt
vector_pabt:
push_svc_reg
+#ifdef RT_USING_USERSPACE
+ /* cp Mode_ABT stack to SVC */
+ sub sp, sp, #17 * 4 @/* Sizeof(struct rt_hw_exp_stack) */
+ mov lr, r0
+ ldmia lr, {r0 - r12}
+ stmia sp, {r0 - r12}
+ add r1, lr, #13 * 4
+ add r2, sp, #13 * 4
+ ldmia r1, {r4 - r7}
+ stmia r2, {r4 - r7}
+ mov r0, sp
+ bl rt_hw_trap_pabt
+ /* return to user */
+ ldr lr, [sp, #16*4] //orign spsr
+ msr spsr_cxsf, lr
+ ldr lr, [sp, #15*4] //orign pc
+ ldmia sp, {r0 - r12}
+ add sp, #17 * 4
+ b ret_to_user
+#else
bl rt_hw_trap_pabt
b .
+#endif
.align 5
.globl vector_dabt
vector_dabt:
push_svc_reg
+#ifdef RT_USING_USERSPACE
+ /* cp Mode_ABT stack to SVC */
+ sub sp, sp, #17 * 4 @/* Sizeof(struct rt_hw_exp_stack) */
+ mov lr, r0
+ ldmia lr, {r0 - r12}
+ stmia sp, {r0 - r12}
+ add r1, lr, #13 * 4
+ add r2, sp, #13 * 4
+ ldmia r1, {r4 - r7}
+ stmia r2, {r4 - r7}
+ mov r0, sp
+ bl rt_hw_trap_dabt
+ /* return to user */
+ ldr lr, [sp, #16*4] //orign spsr
+ msr spsr_cxsf, lr
+ ldr lr, [sp, #15*4] //orign pc
+ ldmia sp, {r0 - r12}
+ add sp, #17 * 4
+ b ret_to_user
+#else
bl rt_hw_trap_dabt
b .
+#endif
.align 5
.globl vector_resv
@@ -380,16 +615,38 @@ vector_resv:
#ifdef RT_USING_SMP
.global set_secondary_cpu_boot_address
set_secondary_cpu_boot_address:
- ldr r0, =secondary_cpu_start
+#ifdef RT_USING_USERSPACE
+ ldr r2, =secondary_cpu_start
+ add r0, r2
- mvn r1, #0 //0xffffffff
- ldr r2, =0x10000034
- str r1, [r2]
- str r0, [r2, #-4]
- mov pc, lr
+ mvn r2, #0 //0xffffffff
+ str r2, [r1]
+ str r0, [r1, #-4]
+#else
+ ldr r0, =secondary_cpu_start
+
+ mvn r1, #0 //0xffffffff
+ ldr r2, =0x10000034
+ str r1, [r2]
+ str r0, [r2, #-4]
+#endif
+ mov pc, lr
.global secondary_cpu_start
secondary_cpu_start:
+#ifdef RT_USING_USERSPACE
+ ldr r5, =PV_OFFSET
+
+ ldr lr, =after_enable_mmu2
+ ldr r0, =init_mtbl
+ add r0, r5
+ b enable_mmu
+
+after_enable_mmu2:
+ ldr r0, =MMUTable
+ add r0, r5
+ bl switch_mmu
+#endif
#ifdef RT_USING_FPU
mov r4, #0xfffffff
@@ -405,10 +662,8 @@ secondary_cpu_start:
bic r0, #(1<<13)
mcr p15, 0, r0, c1, c0, 0
-#ifdef RT_USING_FPU
cps #Mode_UND
ldr sp, =und_stack_2_limit
-#endif
cps #Mode_IRQ
ldr sp, =irq_stack_2_limit
@@ -419,8 +674,13 @@ secondary_cpu_start:
cps #Mode_SVC
ldr sp, =svc_stack_2_limit
+ cps #Mode_ABT
+ ldr sp, =abt_stack_2_limit
+
/* initialize the mmu table and enable mmu */
+#ifndef RT_USING_USERSPACE
bl rt_hw_mmu_init
+#endif
b secondary_cpu_c_start
#endif
@@ -435,8 +695,10 @@ irq_stack_2:
.space (1 << 10)
irq_stack_2_limit:
-#ifdef RT_USING_FPU
und_stack_2:
.space (1 << 10)
und_stack_2_limit:
-#endif
+
+abt_stack_2:
+ .space (1 << 10)
+abt_stack_2_limit:
diff --git a/libcpu/arm/cortex-a/trap.c b/libcpu/arm/cortex-a/trap.c
index dc232a46ee2945ce769c03c97a6b7f213f72f9e9..bc4cf36a8cbddee3cd75e59b41991e51cb12af1c 100644
--- a/libcpu/arm/cortex-a/trap.c
+++ b/libcpu/arm/cortex-a/trap.c
@@ -11,14 +11,142 @@
#include
#include
#include
+#include
-#include "armv7.h"
+#include "arch.h"
#include "interrupt.h"
#ifdef RT_USING_FINSH
extern long list_thread(void);
#endif
+#ifdef RT_USING_LWP
+#include
+#include
+
+#ifdef LWP_USING_CORE_DUMP
+#include
+#endif
+
+#ifdef RT_USING_GDBSERVER
+#include
+#include
+
+static int check_debug_event(struct rt_hw_exp_stack *regs, uint32_t pc_adj)
+{
+ uint32_t mode = regs->cpsr;
+
+ if ((mode & 0x1f) == 0x10)
+ {
+ /*
+ uint32_t ifsr, dfar, dfsr;
+ */
+ uint32_t ifsr, dfar;
+ int ret;
+
+ asm volatile ("MRC p15, 0, %0, c5, c0, 1":"=r"(ifsr));
+ ifsr &= ((1UL << 10) | 0xfUL);
+ if (ifsr == 0x2UL)
+ {
+ uint32_t dbgdscr;
+ struct rt_channel_msg msg;
+ gdb_thread_info thread_info;
+
+ regs->pc -= pc_adj;
+
+ asm volatile ("MRC p14, 0, %0, c0, c1, 0":"=r"(dbgdscr));
+ switch ((dbgdscr & (0xfUL << 2)))
+ {
+ case (0x1UL << 2): //breadkpoint
+ case (0x3UL << 2): //bkpt
+ do {
+ struct rt_lwp *gdb_lwp = gdb_get_dbg_lwp();
+ struct rt_lwp *lwp;
+
+ if (!gdb_lwp)
+ {
+ break;
+ }
+ lwp = lwp_self();
+ if (lwp == gdb_lwp)
+ {
+ break;
+ }
+ *(uint32_t*)regs->pc = lwp->bak_first_ins;
+ rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, (void*)regs->pc, 4);
+ icache_invalid_all();
+ lwp->debug = 0;
+ return 1;
+ } while (0);
+
+ thread_info.notify_type = GDB_NOTIFIY_BREAKPOINT;
+ thread_info.abt_ins = *(uint32_t*)regs->pc;
+ ret = 1;
+ break;
+ case (0xaUL << 2): //watchpoint
+ asm volatile ("MRC p15, 0, %0, c6, c0, 0":"=r"(dfar));
+ thread_info.watch_addr = (void*)dfar;
+ /*
+ asm volatile ("MRC p15, 0, %0, c5, c0, 0":"=r"(dfsr));
+ thread_info.rw = (1UL << ((dfsr >> 11) & 1UL));
+ */
+ thread_info.rw = (1UL << (((~*(uint32_t*)regs->pc) >> 20) & 1UL));
+ thread_info.notify_type = GDB_NOTIFIY_WATCHPOINT;
+ ret = 2;
+ break;
+ default:
+ return 0;
+ }
+ thread_info.thread = rt_thread_self();
+ thread_info.thread->regs = regs;
+ msg.u.d = (void*)&thread_info;
+ dmb();
+ thread_info.thread->debug_suspend = 1;
+ dsb();
+ rt_thread_suspend_witch_flag(thread_info.thread, RT_UNINTERRUPTIBLE);
+ rt_raw_channel_send(gdb_get_server_channel(), &msg);
+ rt_schedule();
+ while (thread_info.thread->debug_suspend)
+ {
+ rt_thread_suspend_witch_flag(thread_info.thread, RT_UNINTERRUPTIBLE);
+ rt_schedule();
+ }
+ return ret;
+ }
+ }
+ return 0;
+}
+#endif
+
+void sys_exit(int value);
+void check_user_fault(struct rt_hw_exp_stack *regs, uint32_t pc_adj, char *info)
+{
+ uint32_t mode = regs->cpsr;
+
+ if ((mode & 0x1f) == 0x10)
+ {
+ rt_kprintf("%s! pc = 0x%08x\n", info, regs->pc - pc_adj);
+#ifdef LWP_USING_CORE_DUMP
+ lwp_core_dump(regs, pc_adj);
+#endif
+ sys_exit(-1);
+ }
+}
+
+int check_user_stack(struct rt_hw_exp_stack *regs)
+{
+ void* dfar = RT_NULL;
+
+ asm volatile ("MRC p15, 0, %0, c6, c0, 0":"=r"(dfar));
+ if (arch_expand_user_stack(dfar))
+ {
+ regs->pc -= 8;
+ return 1;
+ }
+ return 0;
+}
+#endif
+
/**
* this function will show registers of CPU
*
@@ -33,6 +161,18 @@ void rt_hw_show_register(struct rt_hw_exp_stack *regs)
rt_kprintf("fp :0x%08x ip :0x%08x\n", regs->fp, regs->ip);
rt_kprintf("sp :0x%08x lr :0x%08x pc :0x%08x\n", regs->sp, regs->lr, regs->pc);
rt_kprintf("cpsr:0x%08x\n", regs->cpsr);
+#ifdef RT_USING_USERSPACE
+ {
+ uint32_t v;
+ asm volatile ("MRC p15, 0, %0, c5, c0, 0":"=r"(v));
+ rt_kprintf("dfsr:0x%08x\n", v);
+ asm volatile ("MRC p15, 0, %0, c2, c0, 0":"=r"(v));
+ rt_kprintf("ttbr0:0x%08x\n", v);
+ asm volatile ("MRC p15, 0, %0, c6, c0, 0":"=r"(v));
+ rt_kprintf("dfar:0x%08x\n", v);
+ rt_kprintf("0x%08x -> 0x%08x\n", v, rt_hw_mmu_v2p(&mmu_info, (void*)v));
+ }
+#endif
}
/**
@@ -43,6 +183,9 @@ void rt_hw_show_register(struct rt_hw_exp_stack *regs)
*
* @note never invoke this function in application
*/
+#ifdef RT_USING_FPU
+void set_fpexc(rt_uint32_t val);
+#endif
void rt_hw_trap_undef(struct rt_hw_exp_stack *regs)
{
#ifdef RT_USING_FPU
@@ -70,14 +213,16 @@ void rt_hw_trap_undef(struct rt_hw_exp_stack *regs)
if ((ins & 0xe00) == 0xa00)
{
/* float ins */
- uint32_t val = (1U << 30);
-
- asm volatile ("vmsr fpexc, %0"::"r"(val):"memory");
+ set_fpexc(1U << 30);
regs->pc = addr;
return;
}
}
#endif
+#ifdef RT_USING_LWP
+ check_user_fault(regs, 4, "User undefined instruction");
+#endif
+ rt_unwind(regs, 4);
rt_kprintf("undefined instruction:\n");
rt_hw_show_register(regs);
#ifdef RT_USING_FINSH
@@ -115,6 +260,16 @@ void rt_hw_trap_swi(struct rt_hw_exp_stack *regs)
*/
void rt_hw_trap_pabt(struct rt_hw_exp_stack *regs)
{
+#ifdef RT_USING_LWP
+#ifdef RT_USING_GDBSERVER
+ if (check_debug_event(regs, 4))
+ {
+ return;
+ }
+#endif
+ check_user_fault(regs, 4, "User prefetch abort");
+#endif
+ rt_unwind(regs, 4);
rt_kprintf("prefetch abort:\n");
rt_hw_show_register(regs);
#ifdef RT_USING_FINSH
@@ -133,6 +288,20 @@ void rt_hw_trap_pabt(struct rt_hw_exp_stack *regs)
*/
void rt_hw_trap_dabt(struct rt_hw_exp_stack *regs)
{
+#ifdef RT_USING_LWP
+#ifdef RT_USING_GDBSERVER
+ if (check_debug_event(regs, 8))
+ {
+ return;
+ }
+#endif
+ if (check_user_stack(regs))
+ {
+ return;
+ }
+ check_user_fault(regs, 8, "User data abort");
+#endif
+ rt_unwind(regs, 8);
rt_kprintf("data abort:");
rt_hw_show_register(regs);
#ifdef RT_USING_FINSH
@@ -160,6 +329,69 @@ void rt_hw_trap_resv(struct rt_hw_exp_stack *regs)
void rt_hw_trap_irq(void)
{
+#ifdef SOC_BCM283x
+ extern rt_uint8_t core_timer_flag;
+ void *param;
+ uint32_t irq;
+ rt_isr_handler_t isr_func;
+ extern struct rt_irq_desc isr_table[];
+ uint32_t value = 0;
+ value = IRQ_PEND_BASIC & 0x3ff;
+
+ if(core_timer_flag != 0)
+ {
+ uint32_t cpu_id = rt_hw_cpu_id();
+ uint32_t int_source = CORE_IRQSOURCE(cpu_id);
+ if (int_source & 0x0f)
+ {
+ if (int_source & 0x08)
+ {
+ isr_func = isr_table[IRQ_ARM_TIMER].handler;
+ #ifdef RT_USING_INTERRUPT_INFO
+ isr_table[IRQ_ARM_TIMER].counter++;
+ #endif
+ if (isr_func)
+ {
+ param = isr_table[IRQ_ARM_TIMER].param;
+ isr_func(IRQ_ARM_TIMER, param);
+ }
+ }
+ }
+ }
+
+ /* local interrupt*/
+ if (value)
+ {
+ if (value & (1 << 8))
+ {
+ value = IRQ_PEND1;
+ irq = __rt_ffs(value) - 1;
+ }
+ else if (value & (1 << 9))
+ {
+ value = IRQ_PEND2;
+ irq = __rt_ffs(value) + 31;
+ }
+ else
+ {
+ value &= 0x0f;
+ irq = __rt_ffs(value) + 63;
+ }
+
+ /* get interrupt service routine */
+ isr_func = isr_table[irq].handler;
+#ifdef RT_USING_INTERRUPT_INFO
+ isr_table[irq].counter++;
+#endif
+ if (isr_func)
+ {
+ /* Interrupt for myself. */
+ param = isr_table[irq].param;
+ /* turn to interrupt service routine */
+ isr_func(irq, param);
+ }
+ }
+#else
void *param;
int ir;
rt_isr_handler_t isr_func;
@@ -188,6 +420,7 @@ void rt_hw_trap_irq(void)
/* end of interrupt */
rt_hw_interrupt_ack(ir);
+#endif
}
void rt_hw_trap_fiq(void)
diff --git a/libcpu/arm/cortex-a/vector_gcc.S b/libcpu/arm/cortex-a/vector_gcc.S
index 60d3c6cf1d9083f312cf47465bd62c96d5fdc9bf..eb872db71f31d9a5caafa13e6a9b6ae16fa55f1a 100644
--- a/libcpu/arm/cortex-a/vector_gcc.S
+++ b/libcpu/arm/cortex-a/vector_gcc.S
@@ -7,13 +7,19 @@
* Date Author Notes
* 2013-07-05 Bernard the first version
*/
+
+#include "rtconfig.h"
.section .vectors, "ax"
.code 32
.globl system_vectors
system_vectors:
+#ifdef RT_USING_USERSPACE
+ b _reset
+#else
ldr pc, _vector_reset
+#endif
ldr pc, _vector_undef
ldr pc, _vector_swi
ldr pc, _vector_pabt
diff --git a/libcpu/arm/s3c24x0/cpu.c b/libcpu/arm/s3c24x0/cpu.c
index 4d3bf3c1abcc7a5b21a620331ae1c8772e25d636..ccf864a18a158d07ece5895a3436b3dec8dfffee 100644
--- a/libcpu/arm/s3c24x0/cpu.c
+++ b/libcpu/arm/s3c24x0/cpu.c
@@ -17,77 +17,148 @@
*/
/*@{*/
-#define ICACHE_MASK (rt_uint32_t)(1 << 12)
-#define DCACHE_MASK (rt_uint32_t)(1 << 2)
+#define ICACHE_MASK (rt_uint32_t)(1 << 12)
+#define DCACHE_MASK (rt_uint32_t)(1 << 2)
+#define CACHE_LINE_SIZE 32
#ifdef __GNUC__
rt_inline rt_uint32_t cp15_rd(void)
{
- rt_uint32_t i;
+ rt_uint32_t i;
- asm ("mrc p15, 0, %0, c1, c0, 0":"=r" (i));
- return i;
+ asm("mrc p15, 0, %0, c1, c0, 0"
+ : "=r"(i));
+ return i;
}
rt_inline void cache_enable(rt_uint32_t bit)
{
- __asm__ __volatile__( \
- "mrc p15,0,r0,c1,c0,0\n\t" \
- "orr r0,r0,%0\n\t" \
- "mcr p15,0,r0,c1,c0,0" \
- : \
- :"r" (bit) \
- :"memory");
+ __asm__ __volatile__(
+ "mrc p15,0,r0,c1,c0,0\n\t"
+ "orr r0,r0,%0\n\t"
+ "mcr p15,0,r0,c1,c0,0"
+ :
+ : "r"(bit)
+ : "memory");
}
rt_inline void cache_disable(rt_uint32_t bit)
{
- __asm__ __volatile__( \
- "mrc p15,0,r0,c1,c0,0\n\t" \
- "bic r0,r0,%0\n\t" \
- "mcr p15,0,r0,c1,c0,0" \
- : \
- :"r" (bit) \
- :"memory");
+ __asm__ __volatile__(
+ "mrc p15,0,r0,c1,c0,0\n\t"
+ "bic r0,r0,%0\n\t"
+ "mcr p15,0,r0,c1,c0,0"
+ :
+ : "r"(bit)
+ : "memory");
+}
+
+void dcache_clean(rt_uint32_t buffer, rt_uint32_t size)
+{
+ unsigned int ptr;
+
+ ptr = buffer & ~(CACHE_LINE_SIZE - 1);
+
+ while (ptr < buffer + size)
+ {
+ asm volatile("mcr p15, 0, %0, c7, c10, 1": :"r"(ptr));
+
+ ptr += CACHE_LINE_SIZE;
+ }
+}
+
+void dcache_invalidate(rt_uint32_t buffer, rt_uint32_t size)
+{
+ unsigned int ptr;
+
+ ptr = buffer & ~(CACHE_LINE_SIZE - 1);
+
+ while (ptr < buffer + size)
+ {
+ asm volatile("mcr p15, 0, %0, c7, c6, 1": :"r"(ptr));
+
+ ptr += CACHE_LINE_SIZE;
+ }
+}
+
+void icache_invalidate()
+{
+ asm volatile("mcr p15, 0, %0, c7, c5, 0": :"r"(0));
}
#endif
#ifdef __CC_ARM
rt_inline rt_uint32_t cp15_rd(void)
{
- rt_uint32_t i;
+ rt_uint32_t i;
- __asm
- {
- mrc p15, 0, i, c1, c0, 0
- }
+ __asm
+ {
+ mrc p15, 0, i, c1, c0, 0
+ }
- return i;
+ return i;
}
rt_inline void cache_enable(rt_uint32_t bit)
{
- rt_uint32_t value;
+ rt_uint32_t value;
- __asm
- {
- mrc p15, 0, value, c1, c0, 0
- orr value, value, bit
- mcr p15, 0, value, c1, c0, 0
- }
+ __asm
+ {
+ mrc p15, 0, value, c1, c0, 0
+ orr value, value, bit
+ mcr p15, 0, value, c1, c0, 0
+ }
}
rt_inline void cache_disable(rt_uint32_t bit)
{
- rt_uint32_t value;
+ rt_uint32_t value;
- __asm
- {
- mrc p15, 0, value, c1, c0, 0
- bic value, value, bit
- mcr p15, 0, value, c1, c0, 0
- }
+ __asm
+ {
+ mrc p15, 0, value, c1, c0, 0
+ bic value, value, bit
+ mcr p15, 0, value, c1, c0, 0
+ }
}
+
+void dcache_clean(rt_uint32_t buffer, rt_uint32_t size)
+{
+ unsigned int ptr;
+
+ ptr = buffer & ~(CACHE_LINE_SIZE - 1);
+
+ while (ptr < buffer + size)
+ {
+ __asm volatile { mcr p15, 0, ptr, c7, c10, 1 }
+ ptr += CACHE_LINE_SIZE;
+ }
+}
+
+void dcache_invalidate(rt_uint32_t buffer, rt_uint32_t size)
+{
+ unsigned int ptr;
+
+ ptr = buffer & ~(CACHE_LINE_SIZE - 1);
+
+ while (ptr < buffer + size)
+ {
+ __asm volatile { mcr p15, 0, ptr, c7, c6, 1 }
+ ptr += CACHE_LINE_SIZE;
+ }
+}
+
+void icache_invalidate()
+{
+ register rt_uint32_t value;
+
+ value = 0;
+
+ __asm volatile { mcr p15, 0, value, c7, c5, 0 }
+}
+
#endif
/**
@@ -96,7 +167,7 @@ rt_inline void cache_disable(rt_uint32_t bit)
*/
void rt_hw_cpu_icache_enable()
{
- cache_enable(ICACHE_MASK);
+ cache_enable(ICACHE_MASK);
}
/**
@@ -105,7 +176,7 @@ void rt_hw_cpu_icache_enable()
*/
void rt_hw_cpu_icache_disable()
{
- cache_disable(ICACHE_MASK);
+ cache_disable(ICACHE_MASK);
}
/**
@@ -114,7 +185,7 @@ void rt_hw_cpu_icache_disable()
*/
rt_base_t rt_hw_cpu_icache_status()
{
- return (cp15_rd() & ICACHE_MASK);
+ return (cp15_rd() & ICACHE_MASK);
}
/**
@@ -123,7 +194,7 @@ rt_base_t rt_hw_cpu_icache_status()
*/
void rt_hw_cpu_dcache_enable()
{
- cache_enable(DCACHE_MASK);
+ cache_enable(DCACHE_MASK);
}
/**
@@ -132,7 +203,7 @@ void rt_hw_cpu_dcache_enable()
*/
void rt_hw_cpu_dcache_disable()
{
- cache_disable(DCACHE_MASK);
+ cache_disable(DCACHE_MASK);
}
/**
@@ -141,7 +212,21 @@ void rt_hw_cpu_dcache_disable()
*/
rt_base_t rt_hw_cpu_dcache_status()
{
- return (cp15_rd() & DCACHE_MASK);
+ return (cp15_rd() & DCACHE_MASK);
+}
+
+void rt_hw_cpu_icache_ops(int ops, void *addr, int size)
+{
+ if (ops == RT_HW_CACHE_INVALIDATE)
+ icache_invalidate(); /* TODO: only invalidate an addr range */
+}
+
+void rt_hw_cpu_dcache_ops(int ops, void *addr, int size)
+{
+ if (ops == RT_HW_CACHE_FLUSH)
+ dcache_clean(addr, size);
+ else if (ops == RT_HW_CACHE_INVALIDATE)
+ dcache_invalidate(addr, size);
}
/**
@@ -150,21 +235,22 @@ rt_base_t rt_hw_cpu_dcache_status()
*/
void rt_hw_cpu_reset()
{
- /* Disable all interrupt except the WDT */
- INTMSK = (~((rt_uint32_t)1 << INTWDT));
+ /* Disable all interrupt except the WDT */
+ INTMSK = (~((rt_uint32_t)1 << INTWDT));
- /* Disable watchdog */
- WTCON = 0x0000;
+ /* Disable watchdog */
+ WTCON = 0x0000;
- /* Initialize watchdog timer count register */
- WTCNT = 0x0001;
+ /* Initialize watchdog timer count register */
+ WTCNT = 0x0001;
- /* Enable watchdog timer; assert reset at timer timeout */
- WTCON = 0x0021;
+ /* Enable watchdog timer; assert reset at timer timeout */
+ WTCON = 0x0021;
- while(1); /* loop forever and wait for reset to happen */
+ while (1)
+ ; /* loop forever and wait for reset to happen */
- /* NEVER REACHED */
+ /* NEVER REACHED */
}
/**
@@ -173,14 +259,14 @@ void rt_hw_cpu_reset()
*/
void rt_hw_cpu_shutdown()
{
- rt_uint32_t level;
- rt_kprintf("shutdown...\n");
+ rt_uint32_t level;
+ rt_kprintf("shutdown...\n");
- level = rt_hw_interrupt_disable();
- while (level)
- {
- RT_ASSERT(0);
- }
+ level = rt_hw_interrupt_disable();
+ while (level)
+ {
+ RT_ASSERT(0);
+ }
}
/*@}*/
diff --git a/src/Kconfig b/src/Kconfig
index 63a7a67887285ff1b45b584c505cd45faf655476..e96ff9b4535a935951b27b5f632e7097e3070512 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -17,6 +17,13 @@ config RT_USING_ARCH_DATA_TYPE
Please re-define these data types in rtconfig_project.h file.
+config RT_USING_SMART
+ bool "Enable RT-Thread Smart (microkernel on kernel/userland)"
+ default n
+ select RT_USING_LWP
+ help
+ RT-Thread Smart is a microkernel based operating system on RT-Thread.
+
config RT_USING_SMP
bool "Enable SMP(Symmetric multiprocessing)"
default n
diff --git a/src/clock.c b/src/clock.c
index a91cd829b65fad7f9044e886213b42afe5a27b35..7ac68c469b7a58b2a93b29f8b3b8a61e2d2426ca 100644
--- a/src/clock.c
+++ b/src/clock.c
@@ -65,6 +65,15 @@ void rt_tick_set(rt_tick_t tick)
rt_hw_interrupt_enable(level);
}
+#ifdef RT_USING_HOOK
+static void (*rt_tick_hook)(void);
+
+void rt_tick_sethook(void (*hook)(void))
+{
+ rt_tick_hook = hook;
+}
+#endif
+
/**
* This function will notify kernel there is one tick passed. Normally,
* this function is invoked by clock ISR.
@@ -80,6 +89,13 @@ void rt_tick_increase(void)
++ rt_tick;
#endif
+#ifdef RT_USING_HOOK
+ if (rt_tick_hook)
+ {
+ rt_tick_hook();
+ }
+#endif
+
/* check time slice */
thread = rt_thread_self();
diff --git a/src/cpu.c b/src/cpu.c
index 96e585713ba39adc1266e74b00f15b7f72942f9f..2f71c4f8aac6eb09b7c0a2e52930428dd8eb6c62 100644
--- a/src/cpu.c
+++ b/src/cpu.c
@@ -10,6 +10,10 @@
#include
#include
+#ifdef RT_USING_USERSPACE
+#include
+#endif
+
#ifdef RT_USING_SMP
static struct rt_cpu rt_cpus[RT_CPUS_NR];
rt_hw_spinlock_t _cpus_lock;
@@ -64,29 +68,41 @@ static void rt_preempt_enable(void)
/* enable interrupt */
rt_hw_local_irq_enable(level);
}
+#endif /* end of RT_USING_SMP */
void rt_spin_lock_init(struct rt_spinlock *lock)
{
+#ifdef RT_USING_SMP
rt_hw_spin_lock_init(&lock->lock);
+#endif
}
RTM_EXPORT(rt_spin_lock_init)
void rt_spin_lock(struct rt_spinlock *lock)
{
+#ifdef RT_USING_SMP
rt_preempt_disable();
rt_hw_spin_lock(&lock->lock);
+#else
+ rt_enter_critical();
+#endif
}
RTM_EXPORT(rt_spin_lock)
void rt_spin_unlock(struct rt_spinlock *lock)
{
+#ifdef RT_USING_SMP
rt_hw_spin_unlock(&lock->lock);
rt_preempt_enable();
+#else
+ rt_exit_critical();
+#endif
}
RTM_EXPORT(rt_spin_unlock)
rt_base_t rt_spin_lock_irqsave(struct rt_spinlock *lock)
{
+#ifdef RT_USING_SMP
unsigned long level;
rt_preempt_disable();
@@ -95,20 +111,27 @@ rt_base_t rt_spin_lock_irqsave(struct rt_spinlock *lock)
rt_hw_spin_lock(&lock->lock);
return level;
+#else
+ return rt_hw_interrupt_disable();
+#endif
}
RTM_EXPORT(rt_spin_lock_irqsave)
void rt_spin_unlock_irqrestore(struct rt_spinlock *lock, rt_base_t level)
{
+#ifdef RT_USING_SMP
rt_hw_spin_unlock(&lock->lock);
rt_hw_local_irq_enable(level);
rt_preempt_enable();
+#else
+ rt_hw_interrupt_enable(level);
+#endif
}
RTM_EXPORT(rt_spin_unlock_irqrestore)
/**
- * This fucntion will return current cpu.
+ * This function will return current cpu.
*/
struct rt_cpu *rt_cpu_self(void)
{
@@ -177,6 +200,14 @@ void rt_cpus_lock_status_restore(struct rt_thread *thread)
{
struct rt_cpu* pcpu = rt_cpu_self();
+#ifdef RT_USING_USERSPACE
+ if (pcpu->current_thread)
+ {
+ pcpu->current_thread->thread_idr = rt_cpu_get_thread_idr();
+ }
+ lwp_mmu_switch(thread);
+ rt_cpu_set_thread_idr(thread->thread_idr);
+#endif
pcpu->current_thread = thread;
if (!thread->cpus_lock_nest)
{
@@ -184,5 +215,3 @@ void rt_cpus_lock_status_restore(struct rt_thread *thread)
}
}
RTM_EXPORT(rt_cpus_lock_status_restore);
-
-#endif
diff --git a/src/ipc.c b/src/ipc.c
index 454fcb5439bd26ae3534d4e6c7c66b22e31b1f89..7e64496e55d85c62c03d25adf7402b16fbb7b8e6 100644
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -82,10 +82,16 @@ rt_inline rt_err_t rt_ipc_object_init(struct rt_ipc_object *ipc)
*/
rt_inline rt_err_t rt_ipc_list_suspend(rt_list_t *list,
struct rt_thread *thread,
- rt_uint8_t flag)
+ rt_uint8_t flag,
+ int suspend_flag)
{
+ rt_err_t ret = rt_thread_suspend_with_flag(thread, suspend_flag);
+
/* suspend thread */
- rt_thread_suspend(thread);
+ if (ret != RT_EOK)
+ {
+ return ret;
+ }
switch (flag)
{
@@ -144,6 +150,8 @@ rt_inline rt_err_t rt_ipc_list_resume(rt_list_t *list)
/* get thread entry */
thread = rt_list_entry(list->next, struct rt_thread, tlist);
+ thread->error = RT_EOK;
+
RT_DEBUG_LOG(RT_DEBUG_IPC, ("resume thread:%s\n", thread->name));
/* resume it */
@@ -327,10 +335,11 @@ RTM_EXPORT(rt_sem_delete);
*
* @return the error code
*/
-rt_err_t rt_sem_take(rt_sem_t sem, rt_int32_t time)
+static rt_err_t _rt_sem_take(rt_sem_t sem, rt_int32_t time, int suspend_flag)
{
register rt_base_t temp;
struct rt_thread *thread;
+ rt_err_t ret;
/* parameter check */
RT_ASSERT(sem != RT_NULL);
@@ -373,15 +382,21 @@ rt_err_t rt_sem_take(rt_sem_t sem, rt_int32_t time)
thread = rt_thread_self();
/* reset thread error number */
- thread->error = RT_EOK;
+ thread->error = -RT_EINTR;
RT_DEBUG_LOG(RT_DEBUG_IPC, ("sem take: suspend thread - %s\n",
thread->name));
/* suspend thread */
- rt_ipc_list_suspend(&(sem->parent.suspend_thread),
+ ret = rt_ipc_list_suspend(&(sem->parent.suspend_thread),
thread,
- sem->parent.parent.flag);
+ sem->parent.parent.flag,
+ suspend_flag);
+ if (ret != RT_EOK)
+ {
+ rt_hw_interrupt_enable(temp);
+ return ret;
+ }
/* has waiting time, start thread timer */
if (time > 0)
@@ -413,8 +428,25 @@ rt_err_t rt_sem_take(rt_sem_t sem, rt_int32_t time)
return RT_EOK;
}
+
+rt_err_t rt_sem_take(rt_sem_t sem, rt_int32_t time)
+{
+ return _rt_sem_take(sem, time, RT_UNINTERRUPTIBLE);
+}
RTM_EXPORT(rt_sem_take);
+rt_err_t rt_sem_take_interruptible(rt_sem_t sem, rt_int32_t time)
+{
+ return _rt_sem_take(sem, time, RT_INTERRUPTIBLE);
+}
+RTM_EXPORT(rt_sem_take_interruptible);
+
+rt_err_t rt_sem_take_killable(rt_sem_t sem, rt_int32_t time)
+{
+ return _rt_sem_take(sem, time, RT_KILLABLE);
+}
+RTM_EXPORT(rt_sem_take_killable);
+
/**
* This function will try to take a semaphore and immediately return
*
@@ -667,10 +699,11 @@ RTM_EXPORT(rt_mutex_delete);
*
* @return the error code
*/
-rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time)
+static rt_err_t _rt_mutex_take(rt_mutex_t mutex, rt_int32_t time, int suspend_flag)
{
register rt_base_t temp;
struct rt_thread *thread;
+ rt_err_t ret;
/* this function must not be used in interrupt even if time = 0 */
RT_DEBUG_IN_THREAD_CONTEXT;
@@ -692,7 +725,7 @@ rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time)
thread->name, mutex->value, mutex->hold));
/* reset thread error */
- thread->error = RT_EOK;
+ thread->error = -RT_EINTR;
if (mutex->owner == thread)
{
@@ -709,9 +742,6 @@ rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time)
}
else
{
-#ifdef RT_USING_SIGNALS
-__again:
-#endif /* end of RT_USING_SIGNALS */
/* The value of mutex is 1 in initial status. Therefore, if the
* value is great than 0, it indicates the mutex is avaible.
*/
@@ -762,9 +792,15 @@ __again:
}
/* suspend current thread */
- rt_ipc_list_suspend(&(mutex->parent.suspend_thread),
+ ret = rt_ipc_list_suspend(&(mutex->parent.suspend_thread),
thread,
- mutex->parent.parent.flag);
+ mutex->parent.parent.flag,
+ suspend_flag);
+ if (ret != RT_EOK)
+ {
+ rt_hw_interrupt_enable(temp);
+ return ret;
+ }
/* has waiting time, start thread timer */
if (time > 0)
@@ -788,11 +824,6 @@ __again:
if (thread->error != RT_EOK)
{
-#ifdef RT_USING_SIGNALS
- /* interrupt by signal, try it again */
- if (thread->error == -RT_EINTR) goto __again;
-#endif /* end of RT_USING_SIGNALS */
-
/* return error */
return thread->error;
}
@@ -813,8 +844,25 @@ __again:
return RT_EOK;
}
+
+rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time)
+{
+ return _rt_mutex_take(mutex, time, RT_UNINTERRUPTIBLE);
+}
RTM_EXPORT(rt_mutex_take);
+rt_err_t rt_mutex_take_interruptible(rt_mutex_t mutex, rt_int32_t time)
+{
+ return _rt_mutex_take(mutex, time, RT_INTERRUPTIBLE);
+}
+RTM_EXPORT(rt_mutex_take_interruptible);
+
+rt_err_t rt_mutex_take_killable(rt_mutex_t mutex, rt_int32_t time)
+{
+ return _rt_mutex_take(mutex, time, RT_KILLABLE);
+}
+RTM_EXPORT(rt_mutex_take_killable);
+
/**
* This function will release a mutex, if there are threads suspended on mutex,
* it will be waked up.
@@ -915,7 +963,7 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex)
rt_hw_interrupt_enable(temp); /* enable interrupt */
return -RT_EFULL; /* value overflowed */
}
-
+
/* clear owner */
mutex->owner = RT_NULL;
mutex->original_priority = 0xff;
@@ -1152,6 +1200,7 @@ rt_err_t rt_event_send(rt_event_t event, rt_uint32_t set)
/* resume thread, and thread list breaks out */
rt_thread_resume(thread);
+ thread->error = RT_EOK;
/* need do a scheduling */
need_schedule = RT_TRUE;
@@ -1183,15 +1232,17 @@ RTM_EXPORT(rt_event_send);
*
* @return the error code
*/
-rt_err_t rt_event_recv(rt_event_t event,
+static rt_err_t _rt_event_recv(rt_event_t event,
rt_uint32_t set,
rt_uint8_t option,
rt_int32_t timeout,
- rt_uint32_t *recved)
+ rt_uint32_t *recved,
+ int suspend_flag)
{
struct rt_thread *thread;
register rt_ubase_t level;
register rt_base_t status;
+ rt_err_t ret;
RT_DEBUG_IN_THREAD_CONTEXT;
@@ -1207,7 +1258,7 @@ rt_err_t rt_event_recv(rt_event_t event,
/* get current thread */
thread = rt_thread_self();
/* reset thread error */
- thread->error = RT_EOK;
+ thread->error = -RT_EINTR;
RT_OBJECT_HOOK_CALL(rt_object_trytake_hook, (&(event->parent.parent)));
@@ -1236,11 +1287,11 @@ rt_err_t rt_event_recv(rt_event_t event,
/* set received event */
if (recved)
*recved = (event->set & set);
-
- /* fill thread event info */
+
+ /* fill thread event info */
thread->event_set = (event->set & set);
thread->event_info = option;
-
+
/* received event */
if (option & RT_EVENT_FLAG_CLEAR)
event->set &= ~set;
@@ -1262,9 +1313,15 @@ rt_err_t rt_event_recv(rt_event_t event,
thread->event_info = option;
/* put thread to suspended thread list */
- rt_ipc_list_suspend(&(event->parent.suspend_thread),
+ ret = rt_ipc_list_suspend(&(event->parent.suspend_thread),
thread,
- event->parent.parent.flag);
+ event->parent.parent.flag,
+ suspend_flag);
+ if (ret != RT_EOK)
+ {
+ rt_hw_interrupt_enable(level);
+ return ret;
+ }
/* if there is a waiting timeout, active thread timer */
if (timeout > 0)
@@ -1303,8 +1360,36 @@ rt_err_t rt_event_recv(rt_event_t event,
return thread->error;
}
+
+rt_err_t rt_event_recv(rt_event_t event,
+ rt_uint32_t set,
+ rt_uint8_t option,
+ rt_int32_t timeout,
+ rt_uint32_t *recved)
+{
+ return _rt_event_recv(event, set, option, timeout, recved, RT_UNINTERRUPTIBLE);
+}
RTM_EXPORT(rt_event_recv);
+rt_err_t rt_event_recv_interruptible(rt_event_t event,
+ rt_uint32_t set,
+ rt_uint8_t option,
+ rt_int32_t timeout,
+ rt_uint32_t *recved)
+{
+ return _rt_event_recv(event, set, option, timeout, recved, RT_INTERRUPTIBLE);
+}
+RTM_EXPORT(rt_event_recv_interruptible);
+
+rt_err_t rt_event_recv_killable(rt_event_t event,
+ rt_uint32_t set,
+ rt_uint8_t option,
+ rt_int32_t timeout,
+ rt_uint32_t *recved)
+{
+ return _rt_event_recv(event, set, option, timeout, recved, RT_KILLABLE);
+}
+RTM_EXPORT(rt_event_recv_killable);
/**
* This function can get or set some extra attributions of an event object.
*
@@ -1507,13 +1592,15 @@ RTM_EXPORT(rt_mb_delete);
*
* @return the error code
*/
-rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
+static rt_err_t _rt_mb_send_wait(rt_mailbox_t mb,
rt_ubase_t value,
- rt_int32_t timeout)
+ rt_int32_t timeout,
+ int suspend_flag)
{
struct rt_thread *thread;
register rt_ubase_t temp;
rt_uint32_t tick_delta;
+ rt_err_t ret;
/* parameter check */
RT_ASSERT(mb != RT_NULL);
@@ -1541,7 +1628,7 @@ rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
while (mb->entry == mb->size)
{
/* reset error number in thread */
- thread->error = RT_EOK;
+ thread->error = -RT_EINTR;
/* no waiting, return timeout */
if (timeout == 0)
@@ -1554,9 +1641,16 @@ rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
RT_DEBUG_IN_THREAD_CONTEXT;
/* suspend current thread */
- rt_ipc_list_suspend(&(mb->suspend_sender_thread),
+ ret = rt_ipc_list_suspend(&(mb->suspend_sender_thread),
thread,
- mb->parent.parent.flag);
+ mb->parent.parent.flag,
+ suspend_flag);
+
+ if (ret != RT_EOK)
+ {
+ rt_hw_interrupt_enable(temp);
+ return ret;
+ }
/* has waiting time, start thread timer */
if (timeout > 0)
@@ -1606,7 +1700,7 @@ rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
++ mb->in_offset;
if (mb->in_offset >= mb->size)
mb->in_offset = 0;
-
+
if(mb->entry < RT_MB_ENTRY_MAX)
{
/* increase message entry */
@@ -1617,7 +1711,7 @@ rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
rt_hw_interrupt_enable(temp); /* enable interrupt */
return -RT_EFULL; /* value overflowed */
}
-
+
/* resume suspended thread */
if (!rt_list_isempty(&mb->parent.suspend_thread))
{
@@ -1636,8 +1730,30 @@ rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
return RT_EOK;
}
+
+rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
+ rt_ubase_t value,
+ rt_int32_t timeout)
+{
+ return _rt_mb_send_wait(mb, value, timeout, RT_UNINTERRUPTIBLE);
+}
RTM_EXPORT(rt_mb_send_wait);
+rt_err_t rt_mb_send_wait_interruptible(rt_mailbox_t mb,
+ rt_ubase_t value,
+ rt_int32_t timeout)
+{
+ return _rt_mb_send_wait(mb, value, timeout, RT_INTERRUPTIBLE);
+}
+RTM_EXPORT(rt_mb_send_wait_interruptible);
+
+rt_err_t rt_mb_send_wait_killable(rt_mailbox_t mb,
+ rt_ubase_t value,
+ rt_int32_t timeout)
+{
+ return _rt_mb_send_wait(mb, value, timeout, RT_KILLABLE);
+}
+RTM_EXPORT(rt_mb_send_wait_killable);
/**
* This function will send a mail to mailbox object, if there are threads
* suspended on mailbox object, it will be waked up. This function will return
@@ -1654,6 +1770,18 @@ rt_err_t rt_mb_send(rt_mailbox_t mb, rt_ubase_t value)
}
RTM_EXPORT(rt_mb_send);
+rt_err_t rt_mb_send_interruptible(rt_mailbox_t mb, rt_ubase_t value)
+{
+ return rt_mb_send_wait_interruptible(mb, value, 0);
+}
+RTM_EXPORT(rt_mb_send_interruptible);
+
+rt_err_t rt_mb_send_killable(rt_mailbox_t mb, rt_ubase_t value)
+{
+ return rt_mb_send_wait_killable(mb, value, 0);
+}
+RTM_EXPORT(rt_mb_send_killable);
+
/**
* This function will receive a mail from mailbox object, if there is no mail
* in mailbox object, the thread shall wait for a specified time.
@@ -1664,11 +1792,12 @@ RTM_EXPORT(rt_mb_send);
*
* @return the error code
*/
-rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout)
+static rt_err_t _rt_mb_recv(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout, int suspend_flag)
{
struct rt_thread *thread;
register rt_ubase_t temp;
rt_uint32_t tick_delta;
+ rt_err_t ret;
/* parameter check */
RT_ASSERT(mb != RT_NULL);
@@ -1696,7 +1825,7 @@ rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout)
while (mb->entry == 0)
{
/* reset error number in thread */
- thread->error = RT_EOK;
+ thread->error = -RT_EINTR;
/* no waiting, return timeout */
if (timeout == 0)
@@ -1711,9 +1840,15 @@ rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout)
RT_DEBUG_IN_THREAD_CONTEXT;
/* suspend current thread */
- rt_ipc_list_suspend(&(mb->parent.suspend_thread),
+ ret = rt_ipc_list_suspend(&(mb->parent.suspend_thread),
thread,
- mb->parent.parent.flag);
+ mb->parent.parent.flag,
+ suspend_flag);
+ if (ret != RT_EOK)
+ {
+ rt_hw_interrupt_enable(temp);
+ return ret;
+ }
/* has waiting time, start thread timer */
if (timeout > 0)
@@ -1789,8 +1924,25 @@ rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout)
return RT_EOK;
}
+
+rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout)
+{
+ return _rt_mb_recv(mb, value, timeout, RT_UNINTERRUPTIBLE);
+}
RTM_EXPORT(rt_mb_recv);
+rt_err_t rt_mb_recv_interruptibale(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout)
+{
+ return _rt_mb_recv(mb, value, timeout, RT_INTERRUPTIBLE);
+}
+RTM_EXPORT(rt_mb_recv_interruptibale);
+
+rt_err_t rt_mb_recv_killable(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout)
+{
+ return _rt_mb_recv(mb, value, timeout, RT_KILLABLE);
+}
+RTM_EXPORT(rt_mb_recv_killable);
+
/**
* This function can get or set some extra attributions of a mailbox object.
*
@@ -2049,15 +2201,17 @@ RTM_EXPORT(rt_mq_delete);
*
* @return the error code
*/
-rt_err_t rt_mq_send_wait(rt_mq_t mq,
+static rt_err_t _rt_mq_send_wait(rt_mq_t mq,
const void *buffer,
rt_size_t size,
- rt_int32_t timeout)
+ rt_int32_t timeout,
+ int suspend_flag)
{
register rt_ubase_t temp;
struct rt_mq_message *msg;
rt_uint32_t tick_delta;
struct rt_thread *thread;
+ rt_err_t ret;
/* parameter check */
RT_ASSERT(mq != RT_NULL);
@@ -2094,7 +2248,7 @@ rt_err_t rt_mq_send_wait(rt_mq_t mq,
while ((msg = mq->msg_queue_free) == RT_NULL)
{
/* reset error number in thread */
- thread->error = RT_EOK;
+ thread->error = -RT_EINTR;
/* no waiting, return timeout */
if (timeout == 0)
@@ -2107,9 +2261,15 @@ rt_err_t rt_mq_send_wait(rt_mq_t mq,
RT_DEBUG_IN_THREAD_CONTEXT;
/* suspend current thread */
- rt_ipc_list_suspend(&(mq->suspend_sender_thread),
+ ret = rt_ipc_list_suspend(&(mq->suspend_sender_thread),
thread,
- mq->parent.parent.flag);
+ mq->parent.parent.flag,
+ suspend_flag);
+ if (ret != RT_EOK)
+ {
+ rt_hw_interrupt_enable(temp);
+ return ret;
+ }
/* has waiting time, start thread timer */
if (timeout > 0)
@@ -2208,8 +2368,33 @@ rt_err_t rt_mq_send_wait(rt_mq_t mq,
return RT_EOK;
}
+
+rt_err_t rt_mq_send_wait(rt_mq_t mq,
+ const void *buffer,
+ rt_size_t size,
+ rt_int32_t timeout)
+{
+ return _rt_mq_send_wait(mq, buffer, size, timeout, RT_UNINTERRUPTIBLE);
+}
RTM_EXPORT(rt_mq_send_wait)
+rt_err_t rt_mq_send_wait_interruptible(rt_mq_t mq,
+ const void *buffer,
+ rt_size_t size,
+ rt_int32_t timeout)
+{
+ return _rt_mq_send_wait(mq, buffer, size, timeout, RT_INTERRUPTIBLE);
+}
+RTM_EXPORT(rt_mq_send_wait_interruptible)
+
+rt_err_t rt_mq_send_wait_killable(rt_mq_t mq,
+ const void *buffer,
+ rt_size_t size,
+ rt_int32_t timeout)
+{
+ return _rt_mq_send_wait(mq, buffer, size, timeout, RT_KILLABLE);
+}
+RTM_EXPORT(rt_mq_send_wait_killable)
/**
* This function will send a message to message queue object, if there are
* threads suspended on message queue object, it will be waked up.
@@ -2226,6 +2411,17 @@ rt_err_t rt_mq_send(rt_mq_t mq, const void *buffer, rt_size_t size)
}
RTM_EXPORT(rt_mq_send);
+rt_err_t rt_mq_send_interrupt(rt_mq_t mq, const void *buffer, rt_size_t size)
+{
+ return rt_mq_send_wait_interruptible(mq, buffer, size, 0);
+}
+RTM_EXPORT(rt_mq_send_interrupt);
+
+rt_err_t rt_mq_send_killable(rt_mq_t mq, const void *buffer, rt_size_t size)
+{
+ return rt_mq_send_wait_killable(mq, buffer, size, 0);
+}
+RTM_EXPORT(rt_mq_send_killable);
/**
* This function will send an urgent message to message queue object, which
* means the message will be inserted to the head of message queue. If there
@@ -2297,7 +2493,7 @@ rt_err_t rt_mq_urgent(rt_mq_t mq, const void *buffer, rt_size_t size)
rt_hw_interrupt_enable(temp); /* enable interrupt */
return -RT_EFULL; /* value overflowed */
}
-
+
/* resume suspended thread */
if (!rt_list_isempty(&mq->parent.suspend_thread))
{
@@ -2330,15 +2526,17 @@ RTM_EXPORT(rt_mq_urgent);
*
* @return the error code
*/
-rt_err_t rt_mq_recv(rt_mq_t mq,
+static rt_err_t _rt_mq_recv(rt_mq_t mq,
void *buffer,
rt_size_t size,
- rt_int32_t timeout)
+ rt_int32_t timeout,
+ int suspend_flag)
{
struct rt_thread *thread;
register rt_ubase_t temp;
struct rt_mq_message *msg;
rt_uint32_t tick_delta;
+ rt_err_t ret;
/* parameter check */
RT_ASSERT(mq != RT_NULL);
@@ -2369,7 +2567,7 @@ rt_err_t rt_mq_recv(rt_mq_t mq,
RT_DEBUG_IN_THREAD_CONTEXT;
/* reset error number in thread */
- thread->error = RT_EOK;
+ thread->error = -RT_EINTR;
/* no waiting, return timeout */
if (timeout == 0)
@@ -2383,9 +2581,15 @@ rt_err_t rt_mq_recv(rt_mq_t mq,
}
/* suspend current thread */
- rt_ipc_list_suspend(&(mq->parent.suspend_thread),
+ ret = rt_ipc_list_suspend(&(mq->parent.suspend_thread),
thread,
- mq->parent.parent.flag);
+ mq->parent.parent.flag,
+ suspend_flag);
+ if (ret != RT_EOK)
+ {
+ rt_hw_interrupt_enable(temp);
+ return ret;
+ }
/* has waiting time, start thread timer */
if (timeout > 0)
@@ -2475,8 +2679,33 @@ rt_err_t rt_mq_recv(rt_mq_t mq,
return RT_EOK;
}
+
+rt_err_t rt_mq_recv(rt_mq_t mq,
+ void *buffer,
+ rt_size_t size,
+ rt_int32_t timeout)
+{
+ return _rt_mq_recv(mq, buffer, size, timeout, RT_UNINTERRUPTIBLE);
+}
RTM_EXPORT(rt_mq_recv);
+rt_err_t rt_mq_recv_interruptible(rt_mq_t mq,
+ void *buffer,
+ rt_size_t size,
+ rt_int32_t timeout)
+{
+ return _rt_mq_recv(mq, buffer, size, timeout, RT_INTERRUPTIBLE);
+}
+RTM_EXPORT(rt_mq_recv_interruptible);
+
+rt_err_t rt_mq_recv_killable(rt_mq_t mq,
+ void *buffer,
+ rt_size_t size,
+ rt_int32_t timeout)
+{
+ return _rt_mq_recv(mq, buffer, size, timeout, RT_KILLABLE);
+}
+RTM_EXPORT(rt_mq_recv_killable);
/**
* This function can get or set some extra attributions of a message queue
* object.
diff --git a/src/kservice.c b/src/kservice.c
index 0a74f052689a797f6ca6fcd3e0327eea82941a14..7750acd9c702537ae601d6786f936cd01a252344 100644
--- a/src/kservice.c
+++ b/src/kservice.c
@@ -26,6 +26,10 @@
#include
#endif
+#ifdef RT_USING_LWP
+#include
+#endif
+
/* use precision */
#define RT_PRINTF_PRECISION
@@ -114,6 +118,13 @@ int *_rt_errno(void)
}
RTM_EXPORT(_rt_errno);
+#ifdef RT_USING_MUSL
+int *___errno_location(void)
+{
+ return _rt_errno();
+}
+#endif
+
/**
* This function will set the content of memory to specified value
*
@@ -456,7 +467,7 @@ RTM_EXPORT(rt_strncmp);
rt_int32_t rt_strcmp(const char *cs, const char *ct)
{
while (*cs && *cs == *ct)
- {
+ {
cs++;
ct++;
}
@@ -538,7 +549,11 @@ char *strdup(const char *s) __attribute__((alias("rt_strdup")));
void rt_show_version(void)
{
rt_kprintf("\n \\ | /\n");
+#ifdef RT_USING_SMART
+ rt_kprintf("- RT - Thread Smart Operating System\n");
+#else
rt_kprintf("- RT - Thread Operating System\n");
+#endif
rt_kprintf(" / | \\ %d.%d.%d build %s\n",
RT_VERSION, RT_SUBVERSION, RT_REVISION, __DATE__);
rt_kprintf(" 2006 - 2020 Copyright by rt-thread team\n");
@@ -1120,6 +1135,27 @@ RTM_EXPORT(rt_console_get_device);
*/
rt_device_t rt_console_set_device(const char *name)
{
+#ifdef RT_USING_LWP
+ rt_device_t new_iodev, old_iodev = RT_NULL;
+
+ /* find new console device */
+ new_iodev = rt_device_find(name);
+ if (new_iodev != RT_NULL)
+ {
+ if (_console_device != RT_NULL)
+ {
+ old_iodev = rt_console_set_iodev(new_iodev);
+ }
+ else
+ {
+ rt_console_register("console", new_iodev);
+ _console_device = rt_device_find("console");
+ rt_device_open(_console_device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_STREAM);
+ }
+ }
+
+ return old_iodev;
+#else
rt_device_t new_device, old_device;
/* save old device */
@@ -1145,6 +1181,7 @@ rt_device_t rt_console_set_device(const char *name)
}
return old_device;
+#endif
}
RTM_EXPORT(rt_console_set_device);
#endif
diff --git a/src/mem.c b/src/mem.c
index c03c8b3452854b6c82ca2e94cc3b2e4e292377ef..971e04dbd84ecc79e4dd60bfcb9033d52a8c35f7 100644
--- a/src/mem.c
+++ b/src/mem.c
@@ -629,12 +629,25 @@ void rt_memory_info(rt_uint32_t *total,
}
#ifdef RT_USING_FINSH
-#include
+
+#ifdef RT_USING_LWP
+#include
+#else
+#ifndef ARCH_PAGE_SIZE
+#define ARCH_PAGE_SIZE 0
+#endif
+
+#endif
void list_mem(void)
{
- rt_kprintf("total memory: %d\n", mem_size_aligned);
- rt_kprintf("used memory : %d\n", used_mem);
+ size_t total_pages = 0, free_pages = 0;
+#ifdef RT_USING_USERSPACE
+ rt_page_get_info(&total_pages, &free_pages);
+#endif
+
+ rt_kprintf("total memory: %d\n", mem_size_aligned + total_pages * ARCH_PAGE_SIZE);
+ rt_kprintf("used memory : %d\n", used_mem + (total_pages - free_pages) * ARCH_PAGE_SIZE);
rt_kprintf("maximum allocated memory: %d\n", max_mem);
}
FINSH_FUNCTION_EXPORT(list_mem, list memory usage information)
diff --git a/src/mempool.c b/src/mempool.c
index db614032aa67ac7d357408b9521192c39555adbe..5be9520c94454d2f0c4dbb208c522d303f316d2c 100644
--- a/src/mempool.c
+++ b/src/mempool.c
@@ -334,7 +334,7 @@ void *rt_mp_alloc(rt_mp_t mp, rt_int32_t time)
thread->error = RT_EOK;
/* need suspend thread */
- rt_thread_suspend(thread);
+ rt_thread_suspend_with_flag(thread, RT_UNINTERRUPTIBLE);
rt_list_insert_after(&(mp->suspend_thread), &(thread->tlist));
if (time > 0)
diff --git a/src/object.c b/src/object.c
index 6866d805ca3064991086741644a1f128b110303a..3929c7e17c67ed58bc80f7554046f385f3f88158 100644
--- a/src/object.c
+++ b/src/object.c
@@ -22,6 +22,10 @@
#include
#endif
+#ifdef RT_USING_LWP
+#include
+#endif
+
/*
* define object_info for the number of rt_object_container items.
*/
@@ -55,6 +59,9 @@ enum rt_object_info_type
RT_Object_Info_Timer, /**< The object is a timer. */
#ifdef RT_USING_MODULE
RT_Object_Info_Module, /**< The object is a module. */
+#endif
+#ifdef RT_USING_LWP
+ RT_Object_Info_Channel, /**< The object is a IPC channel */
#endif
RT_Object_Info_Unknown, /**< The object is unknown. */
};
@@ -103,6 +110,10 @@ static struct rt_object_information rt_object_container[RT_Object_Info_Unknown]
/* initialize object container - module */
{RT_Object_Class_Module, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Module), sizeof(struct rt_dlmodule)},
#endif
+#ifdef RT_USING_LWP
+ /* initialize object container - module */
+ {RT_Object_Class_Channel, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Channel), sizeof(struct rt_channel)},
+#endif
};
#ifdef RT_USING_HOOK
@@ -212,7 +223,7 @@ void rt_system_object_init(void)
/**
* This function will return the specified type of object information.
*
- * @param type the type of object, which can be
+ * @param type the type of object, which can be
* RT_Object_Class_Thread/Semaphore/Mutex... etc
*
* @return the object type information or RT_NULL
@@ -232,7 +243,7 @@ RTM_EXPORT(rt_object_get_information);
/**
* This function will return the length of object list in object container.
*
- * @param type the type of object, which can be
+ * @param type the type of object, which can be
* RT_Object_Class_Thread/Semaphore/Mutex... etc
* @return the length of object list
*/
@@ -259,10 +270,10 @@ int rt_object_get_length(enum rt_object_class_type type)
RTM_EXPORT(rt_object_get_length);
/**
- * This function will copy the object pointer of the specified type,
+ * This function will copy the object pointer of the specified type,
* with the maximum size specified by maxlen.
*
- * @param type the type of object, which can be
+ * @param type the type of object, which can be
* RT_Object_Class_Thread/Semaphore/Mutex... etc
* @param pointers the pointers will be saved to
* @param maxlen the maximum number of pointers can be saved
@@ -462,6 +473,21 @@ rt_object_t rt_object_allocate(enum rt_object_class_type type, const char *name)
rt_list_insert_after(&(information->object_list), &(object->list));
}
+#ifdef RT_USING_LWP
+ {
+ struct rt_lwp *lwp = lwp_self();
+ if (lwp)
+ {
+ /* insert object into lwP object list */
+ rt_list_insert_after(&(lwp->object_list), &(object->lwp_obj_list));
+ }
+ else
+ {
+ rt_list_init(&(object->lwp_obj_list));
+ }
+ }
+#endif
+
/* unlock interrupt */
rt_hw_interrupt_enable(temp);
@@ -493,6 +519,11 @@ void rt_object_delete(rt_object_t object)
/* remove from old list */
rt_list_remove(&(object->list));
+#ifdef RT_USING_LWP
+ /* remove from the object list of lwP */
+ rt_list_remove(&(object->lwp_obj_list));
+#endif
+
/* unlock interrupt */
rt_hw_interrupt_enable(temp);
diff --git a/src/scheduler.c b/src/scheduler.c
index 2250c4a00696152091093e67765332491f7bcddc..385d800b482c265627a906424fba6ae8052bd429 100644
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -275,10 +275,10 @@ void rt_system_scheduler_start(void)
#ifdef RT_USING_SMP
/**
* This function will handle IPI interrupt and do a scheduling in system;
- *
+ *
* @param vector, the number of IPI interrupt for system scheduling
* @param param, use RT_NULL
- *
+ *
* NOTE: this function should be invoke or register as ISR in BSP.
*/
void rt_scheduler_ipi_handler(int vector, void *param)
@@ -288,7 +288,7 @@ void rt_scheduler_ipi_handler(int vector, void *param)
/**
* This function will perform one scheduling. It will select one thread
- * with the highest priority level in global ready queue or local ready queue,
+ * with the highest priority level in global ready queue or local ready queue,
* then switch to it.
*/
void rt_schedule(void)
@@ -315,13 +315,17 @@ void rt_schedule(void)
}
#ifdef RT_USING_SIGNALS
- if ((current_thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND)
+ if ((current_thread->stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK)
{
/* if current_thread signal is in pending */
if ((current_thread->stat & RT_THREAD_STAT_SIGNAL_MASK) & RT_THREAD_STAT_SIGNAL_PENDING)
{
+#ifdef RT_USING_LWP
+ rt_thread_wakeup(current_thread);
+#else
rt_thread_resume(current_thread);
+#endif
}
}
#endif
@@ -555,13 +559,17 @@ void rt_scheduler_do_irq_switch(void *context)
current_thread = pcpu->current_thread;
#ifdef RT_USING_SIGNALS
- if ((current_thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND)
+ if ((current_thread->stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK)
{
/* if current_thread signal is in pending */
if ((current_thread->stat & RT_THREAD_STAT_SIGNAL_MASK) & RT_THREAD_STAT_SIGNAL_PENDING)
{
+#ifdef RT_USING_LWP
+ rt_thread_wakeup(current_thread);
+#else
rt_thread_resume(current_thread);
+#endif
}
}
#endif
@@ -854,7 +862,6 @@ void rt_enter_critical(void)
* the maximal number of nest is RT_UINT16_MAX, which is big
* enough and does not check here
*/
-
{
register rt_uint16_t lock_nest = current_thread->cpus_lock_nest;
current_thread->cpus_lock_nest++;
diff --git a/src/signal.c b/src/signal.c
index bb9339ab6c3f216cdaa5ab3569aa70543d415232..cef7e853352f0062929f8688f59233b792af582b 100644
--- a/src/signal.c
+++ b/src/signal.c
@@ -102,10 +102,14 @@ static void _signal_deliver(rt_thread_t tid)
return;
}
- if ((tid->stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND)
+ if ((tid->stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK)
{
/* resume thread to handle signal */
+#ifdef RT_USING_LWP
+ rt_thread_wakeup(tid);
+#else
rt_thread_resume(tid);
+#endif
/* add signal state */
tid->stat |= (RT_THREAD_STAT_SIGNAL | RT_THREAD_STAT_SIGNAL_PENDING);
@@ -197,7 +201,7 @@ void *rt_signal_check(void* context)
rt_hw_interrupt_enable(level);
sig_context = rt_hw_stack_init((void *)_signal_entry, context,
- (void *)(context - 32), RT_NULL);
+ (void*)((char*)context - 32), RT_NULL);
return sig_context;
}
}
@@ -298,7 +302,7 @@ int rt_signal_wait(const rt_sigset_t *set, rt_siginfo_t *si, rt_int32_t timeout)
}
/* suspend self thread */
- rt_thread_suspend(tid);
+ rt_thread_suspend_with_flag(tid, RT_UNINTERRUPTIBLE);
/* set thread stat as waiting for signal */
tid->stat |= RT_THREAD_STAT_SIGNAL_WAIT;
diff --git a/src/thread.c b/src/thread.c
index 49e2022bf7a275a302ff0b0efd5e5894e4ece15a..863bf6259a3dee7bd323e399aa0c943da9661270 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -126,6 +126,10 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread,
/* init thread list */
rt_list_init(&(thread->tlist));
+#ifdef RT_USING_LWP
+ thread->wakeup.func = RT_NULL;
+#endif
+
thread->entry = (void *)entry;
thread->parameter = parameter;
@@ -201,6 +205,13 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread,
#ifdef RT_USING_LWP
thread->lwp = RT_NULL;
+ rt_list_init(&(thread->sibling));
+ rt_memset(&thread->signal, 0, sizeof(lwp_sigset_t));
+ rt_memset(&thread->signal_mask, 0, sizeof(lwp_sigset_t));
+ thread->signal_mask_bak = 0;
+ thread->signal_in_process = 0;
+ rt_memset(thread->signal_handler, 0, sizeof thread->signal_handler);
+ rt_memset(&thread->user_ctx, 0, sizeof thread->user_ctx);
#endif
RT_OBJECT_HOOK_CALL(rt_thread_inited_hook, (thread));
@@ -478,15 +489,18 @@ RTM_EXPORT(rt_thread_delete);
*/
rt_err_t rt_thread_yield(void)
{
+ rt_base_t level;
struct rt_thread *thread;
- rt_base_t lock;
thread = rt_thread_self();
- lock = rt_hw_interrupt_disable();
+
+ level = rt_hw_interrupt_disable();
+
thread->remaining_tick = thread->init_tick;
thread->stat |= RT_THREAD_STAT_YIELD;
+
rt_schedule();
- rt_hw_interrupt_enable(lock);
+ rt_hw_interrupt_enable(level);
return RT_EOK;
}
@@ -513,7 +527,7 @@ rt_err_t rt_thread_sleep(rt_tick_t tick)
temp = rt_hw_interrupt_disable();
/* suspend thread */
- rt_thread_suspend(thread);
+ rt_thread_suspend_with_flag(thread, RT_INTERRUPTIBLE);
/* reset the timeout of thread timer and start it */
rt_timer_control(&(thread->thread_timer), RT_TIMER_CTRL_SET_TIME, &tick);
@@ -572,7 +586,7 @@ rt_err_t rt_thread_delay_until(rt_tick_t *tick, rt_tick_t inc_tick)
*tick = *tick + inc_tick - rt_tick_get();
/* suspend thread */
- rt_thread_suspend(thread);
+ rt_thread_suspend_with_flag(thread, RT_UNINTERRUPTIBLE);
/* reset the timeout of thread timer and start it */
rt_timer_control(&(thread->thread_timer), RT_TIMER_CTRL_SET_TIME, tick);
@@ -724,17 +738,45 @@ rt_err_t rt_thread_control(rt_thread_t thread, int cmd, void *arg)
}
RTM_EXPORT(rt_thread_control);
+#ifdef RT_USING_LWP
+int lwp_suspend_sigcheck(rt_thread_t thread, int suspend_flag);
+#endif
+
+static void rt_thread_set_suspend_state(struct rt_thread *thread, int suspend_flag)
+{
+ rt_uint8_t stat = RT_THREAD_SUSPEND_UNINTERRUPTIBLE;
+
+ RT_ASSERT(thread != RT_NULL);
+ switch (suspend_flag)
+ {
+ case RT_INTERRUPTIBLE:
+ stat = RT_THREAD_SUSPEND_INTERRUPTIBLE;
+ break;
+ case RT_KILLABLE:
+ stat = RT_THREAD_SUSPEND_KILLABLE;
+ break;
+ case RT_UNINTERRUPTIBLE:
+ stat = RT_THREAD_SUSPEND_UNINTERRUPTIBLE;
+ break;
+ default:
+ RT_ASSERT(0);
+ break;
+ }
+ thread->stat = stat | (thread->stat & ~RT_THREAD_STAT_MASK);
+}
+
/**
* This function will suspend the specified thread.
*
* @param thread the thread to be suspended
+ * @param suspend_flag status flag of the thread to be suspended
*
* @return the operation status, RT_EOK on OK, -RT_ERROR on error
*
* @note if suspend self thread, after this function call, the
* rt_schedule() must be invoked.
*/
-rt_err_t rt_thread_suspend(rt_thread_t thread)
+rt_err_t rt_thread_suspend_with_flag(rt_thread_t thread, int suspend_flag)
{
register rt_base_t stat;
register rt_base_t temp;
@@ -760,10 +802,18 @@ rt_err_t rt_thread_suspend(rt_thread_t thread)
/* not suspend running status thread on other core */
RT_ASSERT(thread == rt_thread_self());
}
+#ifdef RT_USING_LWP
+ if (lwp_suspend_sigcheck(thread, suspend_flag) == 0)
+ {
+ /* not to suspend */
+ rt_hw_interrupt_enable(temp);
+ return -RT_EINTR;
+ }
+#endif
/* change thread stat */
rt_schedule_remove_thread(thread);
- thread->stat = RT_THREAD_SUSPEND | (thread->stat & ~RT_THREAD_STAT_MASK);
+ rt_thread_set_suspend_state(thread, suspend_flag);
/* stop thread timer anyway */
rt_timer_stop(&(thread->thread_timer));
@@ -774,8 +824,15 @@ rt_err_t rt_thread_suspend(rt_thread_t thread)
RT_OBJECT_HOOK_CALL(rt_thread_suspend_hook, (thread));
return RT_EOK;
}
+RTM_EXPORT(rt_thread_suspend_with_flag);
+
+rt_err_t rt_thread_suspend(rt_thread_t thread)
+{
+ return rt_thread_suspend_with_flag(thread, RT_UNINTERRUPTIBLE);
+}
RTM_EXPORT(rt_thread_suspend);
+
/**
* This function will resume a thread and put it to system ready queue.
*
@@ -793,7 +850,7 @@ rt_err_t rt_thread_resume(rt_thread_t thread)
RT_DEBUG_LOG(RT_DEBUG_THREAD, ("thread resume: %s\n", thread->name));
- if ((thread->stat & RT_THREAD_STAT_MASK) != RT_THREAD_SUSPEND)
+ if ((thread->stat & RT_THREAD_SUSPEND_MASK) != RT_THREAD_SUSPEND_MASK)
{
RT_DEBUG_LOG(RT_DEBUG_THREAD, ("thread resume: thread disorder, %d\n",
thread->stat));
@@ -809,6 +866,10 @@ rt_err_t rt_thread_resume(rt_thread_t thread)
rt_timer_stop(&thread->thread_timer);
+#ifdef RT_USING_LWP
+ thread->wakeup.func = RT_NULL;
+#endif
+
/* enable interrupt */
rt_hw_interrupt_enable(temp);
@@ -820,6 +881,53 @@ rt_err_t rt_thread_resume(rt_thread_t thread)
}
RTM_EXPORT(rt_thread_resume);
+#ifdef RT_USING_LWP
+/**
+ * This function will wakeup a thread with customized operation.
+ *
+ * @param thread the thread to be resumed
+ *
+ * @return the operation status, RT_EOK on OK, -RT_ERROR on error
+ */
+rt_err_t rt_thread_wakeup(rt_thread_t thread)
+{
+ register rt_base_t temp;
+ rt_err_t ret;
+
+ RT_ASSERT(thread != RT_NULL);
+ RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);
+ /* disable interrupt */
+ temp = rt_hw_interrupt_disable();
+ if (thread->wakeup.func)
+ {
+ ret = thread->wakeup.func(thread->wakeup.user_data, thread);
+ thread->wakeup.func = RT_NULL;
+ }
+ else
+ {
+ ret = rt_thread_resume(thread);
+ }
+
+ rt_hw_interrupt_enable(temp);
+ return ret;
+}
+RTM_EXPORT(rt_thread_wakeup);
+
+void rt_thread_wakeup_set(struct rt_thread *thread, rt_wakeup_func_t func, void* user_data)
+{
+ register rt_base_t temp;
+
+ RT_ASSERT(thread != RT_NULL);
+ RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);
+
+ temp = rt_hw_interrupt_disable();
+ thread->wakeup.func = func;
+ thread->wakeup.user_data = user_data;
+ rt_hw_interrupt_enable(temp);
+}
+RTM_EXPORT(rt_thread_wakeup_set);
+#endif
+
/**
* This function is the timeout function for thread, normally which is invoked
* when thread is timeout to wait some resource.
@@ -834,7 +942,7 @@ void rt_thread_timeout(void *parameter)
/* thread check */
RT_ASSERT(thread != RT_NULL);
- RT_ASSERT((thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND);
+ RT_ASSERT((thread->stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK);
RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);
/* set error number */
diff --git a/src/timer.c b/src/timer.c
index 4b9003794c0fc2c5aa928150081cafdc51cab965..38c17687ad08a5feada2b7af9011cf5c6c1dbf7f 100644
--- a/src/timer.c
+++ b/src/timer.c
@@ -331,7 +331,6 @@ rt_err_t rt_timer_start(rt_timer_t timer)
_rt_timer_remove(timer);
/* change status of timer */
timer->parent.flag &= ~RT_TIMER_FLAG_ACTIVATED;
- rt_hw_interrupt_enable(level);
RT_OBJECT_HOOK_CALL(rt_object_take_hook, (&(timer->parent)));
@@ -342,9 +341,6 @@ rt_err_t rt_timer_start(rt_timer_t timer)
RT_ASSERT(timer->init_tick < RT_TICK_MAX / 2);
timer->timeout_tick = rt_tick_get() + timer->init_tick;
- /* disable interrupt */
- level = rt_hw_interrupt_disable();
-
#ifdef RT_USING_TIMER_SOFT
if (timer->parent.flag & RT_TIMER_FLAG_SOFT_TIMER)
{
@@ -419,7 +415,7 @@ rt_err_t rt_timer_start(rt_timer_t timer)
{
/* check whether timer thread is ready */
if ((soft_timer_status == RT_SOFT_TIMER_IDLE) &&
- ((timer_thread.stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND))
+ ((timer_thread.stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK))
{
/* resume timer thread to check soft timer */
rt_thread_resume(&timer_thread);
@@ -443,18 +439,21 @@ rt_err_t rt_timer_stop(rt_timer_t timer)
{
register rt_base_t level;
+ /* disable interrupt */
+ level = rt_hw_interrupt_disable();
+
/* timer check */
RT_ASSERT(timer != RT_NULL);
RT_ASSERT(rt_object_get_type(&timer->parent) == RT_Object_Class_Timer);
if (!(timer->parent.flag & RT_TIMER_FLAG_ACTIVATED))
+ {
+ rt_hw_interrupt_enable(level);
return -RT_ERROR;
+ }
RT_OBJECT_HOOK_CALL(rt_object_put_hook, (&(timer->parent)));
- /* disable interrupt */
- level = rt_hw_interrupt_disable();
-
_rt_timer_remove(timer);
/* change status */
timer->parent.flag &= ~RT_TIMER_FLAG_ACTIVATED;
@@ -514,6 +513,21 @@ rt_err_t rt_timer_control(rt_timer_t timer, int cmd, void *arg)
*(rt_tick_t *)arg = RT_TIMER_FLAG_DEACTIVATED;
}
break;
+ case RT_TIMER_CTRL_GET_FUNC:
+ *(void **)arg = timer->timeout_func;
+ break;
+
+ case RT_TIMER_CTRL_SET_FUNC:
+ timer->timeout_func = (void (*)(void*))arg;
+ break;
+
+ case RT_TIMER_CTRL_GET_PARM:
+ *(void **)arg = timer->parameter;
+ break;
+
+ case RT_TIMER_CTRL_SET_PARM:
+ timer->parameter = arg;
+ break;
default:
break;
@@ -696,7 +710,7 @@ static void rt_thread_timer_entry(void *parameter)
if (next_timeout == RT_TICK_MAX)
{
/* no software timer exist, suspend self. */
- rt_thread_suspend(rt_thread_self());
+ rt_thread_suspend_with_flag(rt_thread_self(), RT_UNINTERRUPTIBLE);
rt_schedule();
}
else
diff --git a/tools/building.py b/tools/building.py
index 1de54e236b685ac546de5e304fb5f84c8e8b2b9f..a71e414744c7eafb3bb1d6ba9b33daa9cb904a90 100644
--- a/tools/building.py
+++ b/tools/building.py
@@ -275,9 +275,6 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
except KeyError:
print ('Unknow target: '+ tgt_name+'. Avaible targets: ' +', '.join(tgt_dict.keys()))
sys.exit(1)
- elif (GetDepend('RT_USING_NEWLIB') == False and GetDepend('RT_USING_NOLIBC') == False) \
- and rtconfig.PLATFORM == 'gcc':
- AddDepend('RT_USING_MINILIBC')
# auto change the 'RTT_EXEC_PATH' when 'rtconfig.EXEC_PATH' get failed
if not os.path.exists(rtconfig.EXEC_PATH):
@@ -331,11 +328,17 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
# parse rtconfig.h to get used component
PreProcessor = PatchedPreProcessor()
- f = open('rtconfig.h', 'r')
- contents = f.read()
- f.close()
- PreProcessor.process_contents(contents)
- BuildOptions = PreProcessor.cpp_namespace
+ try:
+ f = open('rtconfig.h', 'r')
+ contents = f.read()
+ f.close()
+ PreProcessor.process_contents(contents)
+ BuildOptions = PreProcessor.cpp_namespace
+ except:
+ pass
+
+ if rtconfig.PLATFORM == 'gcc' and not GetDepend('RT_USING_LIBC'):
+ AddDepend('RT_USING_MINILIBC') # use minilibc
if GetOption('clang-analyzer'):
# perform what scan-build does
diff --git a/tools/gcc.py b/tools/gcc.py
index 8c9685d52b9a9811c367ca26e95331a012f0deca..6c31a279f71ee09876b150c43ea924ecd14e0f53 100644
--- a/tools/gcc.py
+++ b/tools/gcc.py
@@ -86,10 +86,29 @@ def GetNewLibVersion(rtconfig):
f.close()
return version
+def CheckMUSLLibc():
+ try:
+ f = open(".config")
+ if f:
+ for line in f:
+ if line.find('CONFIG_RT_USING_MUSL=y') != -1:
+ return True
+
+ f.close()
+ else:
+ print("open .config failed")
+
+ return False
+ except Exception as e:
+ pass
+
+ return False
+
def GCCResult(rtconfig, str):
import subprocess
result = ''
+ use_musl = CheckMUSLLibc()
def checkAndGetResult(pattern, string):
if re.search(pattern, string):
@@ -149,16 +168,19 @@ def GCCResult(rtconfig, str):
if re.findall('pthread_create', line):
posix_thread = 1
+ if use_musl:
+ result += '#define HAVE_SYS_SELECT_H 1\n\n'
+
if have_fdset:
result += '#define HAVE_FDSET 1\n'
- if have_sigaction:
+ if have_sigaction or use_musl:
result += '#define HAVE_SIGACTION 1\n'
- if have_sigevent:
+ if have_sigevent or use_musl:
result += '#define HAVE_SIGEVENT 1\n'
- if have_siginfo:
+ if have_siginfo or use_musl:
result += '#define HAVE_SIGINFO 1\n'
- if have_sigval:
+ if have_sigval or use_musl:
result += '#define HAVE_SIGVAL 1\n'
if version: