mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-08-19 21:43:17 +08:00
[bsp][qemu-virt64-aarch64] add DM config and docs
RT-Thread BSP Static Build Check / 🔍 Summary of Git Diff Changes (push) Has been cancelled
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (push) Has been cancelled
RT-Thread BSP Static Build Check / collect-artifacts (push) Has been cancelled
pkgs_test / change (push) Has been cancelled
utest_auto_run / A9 :components/dfs.cfg (push) Has been cancelled
utest_auto_run / A9 :components/lwip.cfg (push) Has been cancelled
utest_auto_run / A9 :components/netdev.cfg (push) Has been cancelled
utest_auto_run / A9 :components/sal.cfg (push) Has been cancelled
utest_auto_run / A9 :cpp11/cpp11.cfg (push) Has been cancelled
utest_auto_run / AARCH64-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64 :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64-smp :default.cfg (push) Has been cancelled
utest_auto_run / A9 :default.cfg (push) Has been cancelled
utest_auto_run / A9-smp :default.cfg (push) Has been cancelled
utest_auto_run / RISCV :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-smp :default.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / RISCV :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / A9-smp :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / RISCV :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / A9-smp :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / RISCV :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / AARCH64-rtsmart :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / AARCH64 :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / AARCH64-smp :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / A9-smp :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / RISCV :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / RISCV-smp :kernel/mem.cfg (push) Has been cancelled
ToolsCI / Tools (push) Has been cancelled
doc_doxygen / doxygen_doc generate (push) Has been cancelled
doc_doxygen / deploy (push) Has been cancelled
RT-Thread BSP Static Build Check / 🔍 Summary of Git Diff Changes (push) Has been cancelled
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (push) Has been cancelled
RT-Thread BSP Static Build Check / collect-artifacts (push) Has been cancelled
pkgs_test / change (push) Has been cancelled
utest_auto_run / A9 :components/dfs.cfg (push) Has been cancelled
utest_auto_run / A9 :components/lwip.cfg (push) Has been cancelled
utest_auto_run / A9 :components/netdev.cfg (push) Has been cancelled
utest_auto_run / A9 :components/sal.cfg (push) Has been cancelled
utest_auto_run / A9 :cpp11/cpp11.cfg (push) Has been cancelled
utest_auto_run / AARCH64-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64 :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64-smp :default.cfg (push) Has been cancelled
utest_auto_run / A9 :default.cfg (push) Has been cancelled
utest_auto_run / A9-smp :default.cfg (push) Has been cancelled
utest_auto_run / RISCV :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-smp :default.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / RISCV :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / A9-smp :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / RISCV :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / A9-smp :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / RISCV :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / AARCH64-rtsmart :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / AARCH64 :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / AARCH64-smp :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / A9-smp :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / RISCV :kernel/mem.cfg (push) Has been cancelled
utest_auto_run / RISCV-smp :kernel/mem.cfg (push) Has been cancelled
ToolsCI / Tools (push) Has been cancelled
doc_doxygen / doxygen_doc generate (push) Has been cancelled
doc_doxygen / deploy (push) Has been cancelled
Signed-off-by: GuEe-GUI <2991707448@qq.com>
This commit is contained in:
@@ -293,8 +293,9 @@ jobs:
|
||||
if [[ "${{ matrix.platform.QEMU_ARCH }}" == "aarch64" ]]; then
|
||||
sudo apt-get -yqq install device-tree-compiler
|
||||
if [[ "${{ matrix.platform.QEMU_MACHINE }}" == "virt" ]]; then
|
||||
qemu-system-$TEST_QEMU_ARCH -M virt,gic-version=2 -cpu cortex-a53 -smp 4 -kernel $TEST_BSP_ROOT/rtthread.bin -nographic \
|
||||
-drive if=none,file=$TEST_BSP_ROOT/sd.bin,format=raw,id=blk0 -device virtio-blk-device,drive=blk0,bus=virtio-mmio-bus.0 \
|
||||
qemu-system-$TEST_QEMU_ARCH -M virt -cpu max -smp 4 -m 128M -kernel $TEST_BSP_ROOT/rtthread.bin -nographic \
|
||||
-append "console=ttyAMA0 earlycon cma=8M coherent_pool=2M root=vda0 rootfstype=elm rootwait rw" \
|
||||
-drive if=none,file=$TEST_BSP_ROOT/sd.bin,format=raw,id=blk0 -device virtio-blk-device,drive=blk0 \
|
||||
-netdev user,id=net0 -device virtio-net-device,netdev=net0,bus=virtio-mmio-bus.1 \
|
||||
> qemu_output_$TEST_QEMU_ARCH.log 2>&1 &
|
||||
elif [[ "${{ matrix.platform.QEMU_MACHINE }}" == "xlnx-zcu102" ]]; then
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
# end of rt_strnlen options
|
||||
# end of klibc options
|
||||
|
||||
CONFIG_RT_NAME_MAX=16
|
||||
CONFIG_RT_NAME_MAX=24
|
||||
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
|
||||
# CONFIG_RT_USING_NANO is not set
|
||||
# CONFIG_RT_USING_SMART is not set
|
||||
@@ -131,7 +131,8 @@ CONFIG_RT_USING_TIMER_SOFT=y
|
||||
CONFIG_RT_TIMER_THREAD_PRIO=4
|
||||
CONFIG_RT_TIMER_THREAD_STACK_SIZE=8192
|
||||
# CONFIG_RT_USING_TIMER_ALL_SOFT is not set
|
||||
# CONFIG_RT_USING_CPU_USAGE_TRACER is not set
|
||||
CONFIG_RT_USING_CPU_USAGE_TRACER=y
|
||||
CONFIG_RT_CPU_USAGE_CALC_INTERVAL_MS=200
|
||||
|
||||
#
|
||||
# kservice options
|
||||
@@ -165,7 +166,7 @@ CONFIG_RT_USING_MESSAGEQUEUE=y
|
||||
#
|
||||
CONFIG_RT_USING_MEMPOOL=y
|
||||
CONFIG_RT_USING_SMALL_MEM=y
|
||||
# CONFIG_RT_USING_SLAB is not set
|
||||
CONFIG_RT_USING_SLAB=y
|
||||
CONFIG_RT_USING_MEMHEAP=y
|
||||
CONFIG_RT_MEMHEAP_FAST_MODE=y
|
||||
# CONFIG_RT_MEMHEAP_BEST_MODE is not set
|
||||
@@ -229,7 +230,7 @@ CONFIG_RT_USING_FINSH=y
|
||||
CONFIG_FINSH_USING_MSH=y
|
||||
CONFIG_FINSH_THREAD_NAME="tshell"
|
||||
CONFIG_FINSH_THREAD_PRIORITY=20
|
||||
CONFIG_FINSH_THREAD_STACK_SIZE=4096
|
||||
CONFIG_FINSH_THREAD_STACK_SIZE=8192
|
||||
CONFIG_FINSH_USING_HISTORY=y
|
||||
CONFIG_FINSH_HISTORY_LINES=10
|
||||
# CONFIG_FINSH_USING_WORD_OPERATION is not set
|
||||
@@ -249,12 +250,9 @@ CONFIG_FINSH_USING_OPTION_COMPLETION=y
|
||||
CONFIG_RT_USING_DFS=y
|
||||
CONFIG_DFS_USING_POSIX=y
|
||||
CONFIG_DFS_USING_WORKDIR=y
|
||||
# CONFIG_RT_USING_DFS_MNTTABLE is not set
|
||||
CONFIG_DFS_FD_MAX=32
|
||||
CONFIG_RT_USING_DFS_V1=y
|
||||
# CONFIG_RT_USING_DFS_V2 is not set
|
||||
CONFIG_DFS_FILESYSTEMS_MAX=4
|
||||
CONFIG_DFS_FILESYSTEM_TYPES_MAX=8
|
||||
# CONFIG_RT_USING_DFS_V1 is not set
|
||||
CONFIG_RT_USING_DFS_V2=y
|
||||
CONFIG_RT_USING_DFS_ELMFAT=y
|
||||
|
||||
#
|
||||
@@ -282,12 +280,8 @@ CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000
|
||||
# end of elm-chan's FatFs, Generic FAT Filesystem Module
|
||||
|
||||
CONFIG_RT_USING_DFS_DEVFS=y
|
||||
CONFIG_RT_USING_DFS_9PFS=y
|
||||
# CONFIG_RT_USING_DFS_ISO9660 is not set
|
||||
CONFIG_RT_USING_DFS_ROMFS=y
|
||||
# CONFIG_RT_USING_DFS_ROMFS_USER_ROOT is not set
|
||||
# CONFIG_RT_USING_DFS_CROMFS is not set
|
||||
# CONFIG_RT_USING_DFS_RAMFS is not set
|
||||
# CONFIG_RT_USING_DFS_TMPFS is not set
|
||||
# CONFIG_RT_USING_DFS_MQUEUE is not set
|
||||
# end of DFS: device virtual file system
|
||||
@@ -309,7 +303,7 @@ CONFIG_RT_USING_SERIAL_V1=y
|
||||
# CONFIG_RT_USING_SERIAL_V2 is not set
|
||||
CONFIG_RT_SERIAL_USING_DMA=y
|
||||
CONFIG_RT_SERIAL_RB_BUFSZ=256
|
||||
# CONFIG_RT_USING_SERIAL_BYPASS is not set
|
||||
CONFIG_RT_USING_SERIAL_BYPASS=y
|
||||
# CONFIG_RT_SERIAL_EARLY_HVC is not set
|
||||
CONFIG_RT_SERIAL_PL011=y
|
||||
CONFIG_RT_SERIAL_8250=y
|
||||
@@ -346,10 +340,16 @@ CONFIG_RT_RTC_PL031=y
|
||||
# CONFIG_RT_USING_SDIO is not set
|
||||
# CONFIG_RT_USING_SPI is not set
|
||||
CONFIG_RT_USING_WDT=y
|
||||
# CONFIG_RT_WDT_DW is not set
|
||||
CONFIG_RT_WDT_I6300ESB=y
|
||||
# CONFIG_RT_USING_AUDIO is not set
|
||||
CONFIG_RT_USING_AUDIO=y
|
||||
CONFIG_RT_AUDIO_REPLAY_MP_BLOCK_SIZE=4096
|
||||
CONFIG_RT_AUDIO_REPLAY_MP_BLOCK_COUNT=2
|
||||
CONFIG_RT_AUDIO_RECORD_PIPE_SIZE=2048
|
||||
CONFIG_RT_AUDIO_INTEL_HDA=y
|
||||
# CONFIG_RT_USING_SENSOR is not set
|
||||
# CONFIG_RT_USING_TOUCH is not set
|
||||
CONFIG_RT_USING_TOUCH=y
|
||||
# CONFIG_RT_TOUCH_PIN_IRQ is not set
|
||||
CONFIG_RT_USING_LCD=y
|
||||
CONFIG_RT_USING_GRAPHIC=y
|
||||
# CONFIG_RT_GRAPHIC_BACKLIGHT is not set
|
||||
@@ -392,14 +392,21 @@ CONFIG_RT_INPUT_POWER=y
|
||||
CONFIG_RT_INPUT_KEYBOARD=y
|
||||
CONFIG_RT_INPUT_KEYBOARD_GPIO=y
|
||||
# CONFIG_RT_INPUT_MISC is not set
|
||||
# CONFIG_RT_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_RT_USING_MBOX is not set
|
||||
CONFIG_RT_INPUT_TOUCHSCREEN=y
|
||||
CONFIG_RT_USING_MBOX=y
|
||||
CONFIG_RT_MBOX_PIC=y
|
||||
# CONFIG_RT_USING_HWSPINLOCK is not set
|
||||
CONFIG_RT_USING_RPMSG=y
|
||||
CONFIG_RT_RPMSG_CHAR_MSG_MAX=64
|
||||
CONFIG_RT_RPMSG_CHAR_MSG_SIZE_MAX=256
|
||||
CONFIG_RT_RPMSG_RT_THREAD_VIRTIO=y
|
||||
# CONFIG_RT_USING_PHYE is not set
|
||||
CONFIG_RT_USING_ATA=y
|
||||
CONFIG_RT_ATA_AHCI=y
|
||||
CONFIG_RT_ATA_AHCI_PCI=y
|
||||
# CONFIG_RT_USING_NVME is not set
|
||||
CONFIG_RT_USING_NVME=y
|
||||
CONFIG_RT_USING_NVME_IO_QUEUE=4
|
||||
CONFIG_RT_NVME_PCI=y
|
||||
CONFIG_RT_USING_BLK=y
|
||||
|
||||
#
|
||||
@@ -412,13 +419,16 @@ CONFIG_RT_BLK_PARTITION_EFI=y
|
||||
CONFIG_RT_USING_SCSI=y
|
||||
CONFIG_RT_SCSI_SD=y
|
||||
CONFIG_RT_SCSI_CDROM=y
|
||||
CONFIG_RT_USING_UFS=y
|
||||
CONFIG_RT_UFS_PCI=y
|
||||
CONFIG_RT_USING_FIRMWARE=y
|
||||
CONFIG_RT_FIRMWARE_QEMU_FW_CFG=y
|
||||
# CONFIG_RT_FIRMWARE_ARM_SCMI is not set
|
||||
# CONFIG_RT_USING_HWCACHE is not set
|
||||
CONFIG_RT_USING_REGULATOR=y
|
||||
# CONFIG_RT_REGULATOR_GPIO is not set
|
||||
# CONFIG_RT_USING_RESET is not set
|
||||
CONFIG_RT_USING_RESET=y
|
||||
# CONFIG_RT_RESET_SIMPLE is not set
|
||||
|
||||
#
|
||||
# Power Management (PM) Domains device drivers
|
||||
@@ -434,13 +444,17 @@ CONFIG_RT_VIRTIO_TRANSPORT_PCI=y
|
||||
CONFIG_RT_VIRTIO_BLK=y
|
||||
CONFIG_RT_VIRTIO_CONSOLE=y
|
||||
CONFIG_RT_VIRTIO_RNG=y
|
||||
CONFIG_RT_VIRTIO_RPMSG=y
|
||||
CONFIG_RT_VIRTIO_SCSI=y
|
||||
# CONFIG_RT_VIRTIO_9P is not set
|
||||
CONFIG_RT_VIRTIO_RPROC_SERIAL=y
|
||||
CONFIG_RT_VIRTIO_GPU=y
|
||||
CONFIG_RT_VIRTIO_INPUT=y
|
||||
CONFIG_RT_VIRTIO_CRYPTO=y
|
||||
CONFIG_RT_VIRTIO_SOUND=y
|
||||
# CONFIG_RT_USING_NVMEM is not set
|
||||
CONFIG_RT_USING_DMA=y
|
||||
# CONFIG_RT_DMA_PL330 is not set
|
||||
CONFIG_RT_USING_MFD=y
|
||||
CONFIG_RT_MFD_EDU=y
|
||||
CONFIG_RT_MFD_SYSCON=y
|
||||
@@ -480,6 +494,10 @@ CONFIG_RT_USING_CLK=y
|
||||
#
|
||||
# SoC (System on Chip) Drivers
|
||||
#
|
||||
CONFIG_RT_GRAPHIC_ROMFB_WIDTH=800
|
||||
CONFIG_RT_GRAPHIC_ROMFB_HEIGHT=600
|
||||
CONFIG_RT_SOC_CAMERA=y
|
||||
# end of SoC (System on Chip) Drivers
|
||||
# end of Device Drivers
|
||||
|
||||
#
|
||||
@@ -517,7 +535,7 @@ CONFIG_RT_USING_POSIX_TERMIOS=y
|
||||
# CONFIG_RT_USING_POSIX_MMAN is not set
|
||||
CONFIG_RT_USING_POSIX_DELAY=y
|
||||
CONFIG_RT_USING_POSIX_CLOCK=y
|
||||
# CONFIG_RT_USING_POSIX_TIMER is not set
|
||||
CONFIG_RT_USING_POSIX_TIMER=y
|
||||
# CONFIG_RT_USING_PTHREADS is not set
|
||||
# CONFIG_RT_USING_MODULE is not set
|
||||
|
||||
@@ -596,6 +614,7 @@ CONFIG_RT_INIT_MEMORY_REGIONS=128
|
||||
# end of Using USB legacy version
|
||||
|
||||
# CONFIG_RT_USING_FDT is not set
|
||||
# CONFIG_BSP_USING_VIRTIO is not set
|
||||
# CONFIG_RT_USING_RUST is not set
|
||||
# end of RT-Thread Components
|
||||
|
||||
@@ -798,7 +817,6 @@ CONFIG_RT_INIT_MEMORY_REGIONS=128
|
||||
# CONFIG_PKG_USING_U8G2 is not set
|
||||
# end of u8g2: a monochrome graphic library
|
||||
|
||||
# CONFIG_PKG_USING_NES_SIMULATOR is not set
|
||||
# CONFIG_PKG_USING_OPENMV is not set
|
||||
# CONFIG_PKG_USING_MUPDF is not set
|
||||
# CONFIG_PKG_USING_STEMWIN is not set
|
||||
@@ -823,9 +841,6 @@ CONFIG_RT_INIT_MEMORY_REGIONS=128
|
||||
#
|
||||
# tools packages
|
||||
#
|
||||
# CONFIG_PKG_USING_VECTOR is not set
|
||||
# CONFIG_PKG_USING_SORCH is not set
|
||||
# CONFIG_PKG_USING_DICT is not set
|
||||
# CONFIG_PKG_USING_CMBACKTRACE is not set
|
||||
# CONFIG_PKG_USING_MCOREDUMP is not set
|
||||
# CONFIG_PKG_USING_EASYFLASH is not set
|
||||
@@ -874,9 +889,6 @@ CONFIG_RT_INIT_MEMORY_REGIONS=128
|
||||
# CONFIG_PKG_USING_RVBACKTRACE is not set
|
||||
# CONFIG_PKG_USING_HPATCHLITE is not set
|
||||
# CONFIG_PKG_USING_THREAD_METRIC is not set
|
||||
# CONFIG_PKG_USING_UORB is not set
|
||||
# CONFIG_PKG_USING_RT_TUNNEL is not set
|
||||
# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set
|
||||
# end of tools packages
|
||||
|
||||
#
|
||||
@@ -971,9 +983,6 @@ CONFIG_RT_INIT_MEMORY_REGIONS=128
|
||||
# CONFIG_PKG_USING_R_RHEALSTONE is not set
|
||||
# CONFIG_PKG_USING_HEARTBEAT is not set
|
||||
# CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set
|
||||
# CONFIG_PKG_USING_CHERRYECAT is not set
|
||||
# CONFIG_PKG_USING_EVENT_LOOP is not set
|
||||
# CONFIG_PKG_USING_THREAD_MANAGER is not set
|
||||
# end of system packages
|
||||
|
||||
#
|
||||
@@ -1119,7 +1128,9 @@ CONFIG_RT_INIT_MEMORY_REGIONS=128
|
||||
#
|
||||
# NUVOTON Drivers
|
||||
#
|
||||
# CONFIG_PKG_USING_NUVOTON_CMSIS_DRIVER is not set
|
||||
# CONFIG_PKG_USING_NUVOTON_SERIES_DRIVER is not set
|
||||
# CONFIG_PKG_USING_NUVOTON_ARM926_LIB is not set
|
||||
# end of NUVOTON Drivers
|
||||
|
||||
#
|
||||
@@ -1127,24 +1138,7 @@ CONFIG_RT_INIT_MEMORY_REGIONS=128
|
||||
#
|
||||
# CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set
|
||||
# CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set
|
||||
# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set
|
||||
# CONFIG_PKG_USING_GD32VW55X_WIFI is not set
|
||||
# end of GD32 Drivers
|
||||
|
||||
#
|
||||
# HPMicro SDK
|
||||
#
|
||||
# CONFIG_PKG_USING_HPM_SDK is not set
|
||||
# end of HPMicro SDK
|
||||
|
||||
#
|
||||
# FT32 HAL & SDK Drivers
|
||||
#
|
||||
# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set
|
||||
# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set
|
||||
# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set
|
||||
# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set
|
||||
# end of FT32 HAL & SDK Drivers
|
||||
# end of HAL & SDK Drivers
|
||||
|
||||
#
|
||||
@@ -1190,11 +1184,9 @@ CONFIG_RT_INIT_MEMORY_REGIONS=128
|
||||
# CONFIG_PKG_USING_RT3020 is not set
|
||||
# CONFIG_PKG_USING_MLX90632 is not set
|
||||
# CONFIG_PKG_USING_MLX90382 is not set
|
||||
# CONFIG_PKG_USING_MLX90384 is not set
|
||||
# CONFIG_PKG_USING_MLX90393 is not set
|
||||
# CONFIG_PKG_USING_MLX90392 is not set
|
||||
# CONFIG_PKG_USING_MLX90394 is not set
|
||||
# CONFIG_PKG_USING_MLX90396 is not set
|
||||
# CONFIG_PKG_USING_MLX90397 is not set
|
||||
# CONFIG_PKG_USING_MS5611 is not set
|
||||
# CONFIG_PKG_USING_MAX31865 is not set
|
||||
@@ -1223,7 +1215,6 @@ CONFIG_RT_INIT_MEMORY_REGIONS=128
|
||||
# CONFIG_PKG_USING_P3T1755 is not set
|
||||
# CONFIG_PKG_USING_QMI8658 is not set
|
||||
# CONFIG_PKG_USING_ICM20948 is not set
|
||||
# CONFIG_PKG_USING_SCD4X is not set
|
||||
# end of sensors drivers
|
||||
|
||||
#
|
||||
@@ -1241,7 +1232,6 @@ CONFIG_RT_INIT_MEMORY_REGIONS=128
|
||||
# CONFIG_PKG_USING_CST812T is not set
|
||||
# end of touch drivers
|
||||
|
||||
# CONFIG_PKG_USING_LCD_SPI_DRIVER is not set
|
||||
# CONFIG_PKG_USING_REALTEK_AMEBA is not set
|
||||
# CONFIG_PKG_USING_BUTTON is not set
|
||||
# CONFIG_PKG_USING_PCF8574 is not set
|
||||
@@ -1321,13 +1311,6 @@ CONFIG_RT_INIT_MEMORY_REGIONS=128
|
||||
# CONFIG_PKG_USING_IC74HC165 is not set
|
||||
# CONFIG_PKG_USING_IST8310 is not set
|
||||
# CONFIG_PKG_USING_ST7789_SPI is not set
|
||||
# CONFIG_PKG_USING_CAN_UDS is not set
|
||||
# CONFIG_PKG_USING_ISOTP_C is not set
|
||||
# CONFIG_PKG_USING_IKUNLED is not set
|
||||
# CONFIG_PKG_USING_INS5T8025 is not set
|
||||
# CONFIG_PKG_USING_IRUART is not set
|
||||
# CONFIG_PKG_USING_ST7305 is not set
|
||||
# CONFIG_PKG_USING_TM1668 is not set
|
||||
# CONFIG_PKG_USING_SPI_TOOLS is not set
|
||||
# end of peripheral libraries and drivers
|
||||
|
||||
|
||||
@@ -4,70 +4,419 @@
|
||||
|
||||
## 1. Introduction
|
||||
|
||||
The AArch64 execution state was introduced with the ARMv8 ISA for machines executing A64 instructions. This project ported RT-Thread on QEMU AArch64 VIRT machine.
|
||||
AArch64 is the 64-bit execution state of the ARMv8 architecture for machines executing A64 instructions. This BSP ports RT-Thread to the QEMU `virt` AArch64 machine, based on the device model (DM), Open Firmware (OFW/FDT), and PCI bus framework. It serves as a development and validation platform for VirtIO, PCI, and other platform drivers.
|
||||
|
||||
Default configuration highlights:
|
||||
|
||||
| Item | Description |
|
||||
| ---- | ----------- |
|
||||
| RT-Thread version | 5.3 |
|
||||
| Architecture | ARMv8 AArch64, MMU |
|
||||
| SMP | 4 cores (`RT_CPUS_NR=4`) |
|
||||
| Interrupt controller | GICv2 / GICv3 (with ITS, MSI) |
|
||||
| Console | UART0 (PL011, `ttyAMA0`) |
|
||||
| Root filesystem | VirtIO Block `vda0`, FatFs (elm-chan) |
|
||||
| Memory | 128 MB by default (adjustable via `qemu.py -mem`) |
|
||||
|
||||
## 2. Compiling
|
||||
|
||||
Usage ARM Developer GNU ToolChain, it support Linux and Windows:
|
||||
ARM Developer GNU cross-compiler toolchain is recommended, supporting Linux and Windows:
|
||||
|
||||
```
|
||||
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads/
|
||||
```
|
||||
Download the `xxx-aarch64-none-elf` of x86_64 hosted platform,set the `RTT_EXEC_PATH` is system environment after decompress the binary.
|
||||
|
||||
Enter directory `rt-thread/bsp/qemu-virt64-aarch64` and input:
|
||||
Download the `xxx-aarch64-none-elf` package for the x86_64 hosted platform, extract it, and set the `RTT_EXEC_PATH` environment variable to the compiler's `bin` directory.
|
||||
|
||||
Enter the `rt-thread/bsp/qemu-virt64-aarch64` directory and run:
|
||||
|
||||
```
|
||||
scons
|
||||
```
|
||||
|
||||
## 3. Execution
|
||||
This produces `rtthread.elf` and `rtthread.bin`.
|
||||
|
||||
The project execution tool is `qemu-system-aarch64`, the project can be configured to `Cortex-A53/A57/A72`, GIC supports `V2/V3` version, and `V2` of GIC can use 8 processors max.
|
||||
You can also compile with a specific toolchain path:
|
||||
|
||||
```
|
||||
scons --exec-path="path-to-gcc-toolchain"
|
||||
```
|
||||
|
||||
Use `scons --menuconfig` to change configuration, then run `scons` again to rebuild.
|
||||
|
||||
## 3. Running
|
||||
|
||||
This BSP uses the `qemu-system-aarch64` emulator and is started via `qemu.py`.
|
||||
|
||||
### 3.1 Installing QEMU
|
||||
|
||||
Windows:
|
||||
|
||||
Download Windows platform from website:
|
||||
```
|
||||
https://www.qemu.org/download/
|
||||
```
|
||||
On Linux platform (Ubuntu, Deepin and so on), install QEMU by apt.
|
||||
|
||||
Linux (Ubuntu, Deepin, etc.):
|
||||
|
||||
```
|
||||
sudo apt update
|
||||
sudo apt install qemu-system-arm
|
||||
```
|
||||
|
||||
Please fixup the exec scripts if modify the default configuration of the project. Run qemu.bat or qemu.sh in terminal:
|
||||
Some optional features require a minimum QEMU version:
|
||||
|
||||
| Feature | Minimum QEMU version |
|
||||
| ------- | -------------------- |
|
||||
| UFS storage | 8.2.0 |
|
||||
| VirtIO Sound (`-sound virtio`) | 8.2.0 |
|
||||
|
||||
### 3.2 Environment Variables
|
||||
|
||||
| Variable | Description |
|
||||
| -------- | ----------- |
|
||||
| `RTT_QEMU_ROOT` | Prefix path to QEMU binaries (the script appends `qemu-system-aarch64`) |
|
||||
| `RTT_ROOT` | RT-Thread source root; defaults to two levels above the BSP directory |
|
||||
|
||||
### 3.3 Basic Startup
|
||||
|
||||
In the BSP directory, run:
|
||||
|
||||
```
|
||||
python qemu.py
|
||||
```
|
||||
|
||||
or:
|
||||
|
||||
```
|
||||
./qemu.py
|
||||
```
|
||||
|
||||
On first run, 64 MB `qcow2` disk images are created automatically for each storage device. The default is `-nographic` mode with serial output on the current terminal.
|
||||
|
||||
Typical boot log:
|
||||
|
||||
```
|
||||
heap: [0x40042aa0 - 0x40142aa0]
|
||||
|
||||
\ | /
|
||||
- RT - Thread Operating System
|
||||
/ | \ 4.0.4 build Aug 6 2021
|
||||
2006 - 2021 Copyright by rt-thread team
|
||||
Hi, this is RT-Thread!!
|
||||
/ | \ 5.3.0 build ...
|
||||
2006 - 2026 Copyright by rt-thread team
|
||||
hello rt-thread
|
||||
msh />
|
||||
```
|
||||
|
||||
Use VirtIO-Console in new terminal by:
|
||||
````
|
||||
### 3.4 `qemu.py` Command-Line Options
|
||||
|
||||
| Option | Default | Description |
|
||||
| ------ | ------- | ----------- |
|
||||
| `-gic` | `2` | GIC version (`2` / `3` / `max`); auto-switches to GICv3 when `-smp` > 8 |
|
||||
| `-smp` | `RT_CPUS_NR` (4) | Number of CPU cores |
|
||||
| `-mem` | `128` | Memory size (MB) |
|
||||
| `-el` | `1` | Exception level: `1` default; `2` virtualization on; `3` secure on |
|
||||
| `-bootargs` | see below | Kernel boot arguments |
|
||||
| `-initrd` | — | Path to initrd image |
|
||||
| `-graphic` | — | Graphics mode (ramfb + VirtIO keyboard/tablet), replaces `-nographic` |
|
||||
| `-gl` | — | In graphics mode, attach `virtio-gpu-gl-pci` and enable QEMU display OpenGL (e.g. `-gl gtk`); requires QEMU built with `--enable-opengl` and `--enable-virglrenderer`; must be used with `-graphic` |
|
||||
| `-debug` | — | Enable GDB debugging (`-S -s`) |
|
||||
| `-dumpdtb` | — | Export runtime DTB and convert to DTS |
|
||||
| `-dtb` | — | Use a custom DTB file |
|
||||
| `-virtio-block` | `virtio` | VirtIO Block disk image prefix (creates `virtio.qcow2`, mounted as `vda`) |
|
||||
| `-scsi` | `scsi` | VirtIO SCSI disk image prefix |
|
||||
| `-flash` | `flash` | pflash disk image prefix (pflash1, CFI NOR) |
|
||||
| `-emmc` | `emmc` | SDHCI eMMC disk image prefix |
|
||||
| `-nvme` | `nvme` | NVMe disk image prefix |
|
||||
| `-ahci` | `ahci` | AHCI SATA disk image prefix |
|
||||
| `-ufs` | `ufs` | UFS disk image prefix (QEMU ≥ 8.2.0) |
|
||||
| `-cdrom` | — | SCSI CD-ROM image path (e.g. ISO file) |
|
||||
| `-sound` | `hda` | Audio device: `hda` (Intel HDA) or `virtio` (VirtIO Sound PCI) |
|
||||
| `-tap` | — | Use TAP networking (replaces user mode) |
|
||||
| `-ssh` | `12055` | SSH port forwarding in user mode (`hostfwd=tcp::PORT-:22`) |
|
||||
| `-9p` | — | VirtIO 9P shared directory path (enable VirtIO 9P in menuconfig) |
|
||||
| `-camera` | — | Enable vfio-user camera (Linux only, with `qemu-device-camera`) |
|
||||
| `-dtbo` | — | AMP mode: DTBO overlay file (e.g. `amp.dtsi`); **requires Smart kernel** (see below) |
|
||||
|
||||
Default `-bootargs`:
|
||||
|
||||
```
|
||||
console=ttyAMA0 earlycon cma=8M coherent_pool=2M root=vda0 rootfstype=elm rootwait rw
|
||||
```
|
||||
|
||||
### 3.5 Common Startup Examples
|
||||
|
||||
Graphics (VirtIO GPU + keyboard/mouse):
|
||||
|
||||
```
|
||||
./qemu.py -graphic
|
||||
```
|
||||
|
||||
QEMU OpenGL display (`-gl`):
|
||||
|
||||
```
|
||||
./qemu.py -graphic -gl gtk
|
||||
```
|
||||
|
||||
> **Note**: `-gl` enables OpenGL only on the QEMU / host display path (`virtio-gpu-gl-pci` + VirGL). This BSP includes only the VirtIO GPU 2D framebuffer driver by default — **no OpenGL / VirGL user-space or kernel implementation**. `-gl` does not provide OpenGL acceleration inside RT-Thread. For graphics demos, use `-graphic` (`virtio-gpu-device`) with framebuffer / HMI tests.
|
||||
|
||||
GDB debugging:
|
||||
|
||||
```
|
||||
./qemu.py -debug
|
||||
```
|
||||
|
||||
More memory and GICv3:
|
||||
|
||||
```
|
||||
./qemu.py -mem 256 -gic 3
|
||||
```
|
||||
|
||||
Mount CD-ROM:
|
||||
|
||||
```
|
||||
./qemu.py -cdrom /path/to/image.iso
|
||||
```
|
||||
|
||||
VirtIO Sound:
|
||||
|
||||
```
|
||||
./qemu.py -sound virtio
|
||||
```
|
||||
|
||||
9P directory sharing (enable `RT_VIRTIO_9P` first):
|
||||
|
||||
```
|
||||
./qemu.py -9p /path/to/share
|
||||
```
|
||||
|
||||
AMP heterogeneous multi-core (RPMSG slave, **requires Smart version**):
|
||||
|
||||
```
|
||||
./qemu.py -dtbo amp.dtsi -mem 258
|
||||
```
|
||||
|
||||
> **Note**: The AMP demo requires the **Smart version** (`RT_USING_SMART`). The standard kernel must run in a region where virtual addresses equal physical addresses. The slave image is loaded by QEMU `loader` to fixed physical addresses specified in `amp.dtsi` (e.g. `kernel-entry = 0x48480000`), which differs from the primary MMU layout; the standard kernel cannot boot correctly in that address space. Enable Smart in menuconfig and rebuild.
|
||||
|
||||
Camera demo:
|
||||
|
||||
```
|
||||
./qemu.py -graphic -camera
|
||||
```
|
||||
|
||||
### 3.6 Console and Telnet
|
||||
|
||||
| Port | Device | Description |
|
||||
| ---- | ------ | ----------- |
|
||||
| Current terminal | UART0 (PL011) | Default `-nographic` serial |
|
||||
| `4321` | VirtIO Console | `telnet 127.0.0.1 4321`, port name `org.rt-thread.console` |
|
||||
| `4322` | PCI 8250 serial | `telnet 127.0.0.1 4322` |
|
||||
| `4323` | AMP slave console | `-dtbo` mode only, `telnet localhost 4323` |
|
||||
|
||||
VirtIO Console connection example:
|
||||
|
||||
```
|
||||
telnet 127.0.0.1 4321
|
||||
````
|
||||
|
||||
If use tap net mode with tap0 card, modify qemu run script config
|
||||
```
|
||||
-netdev user,id=net0
|
||||
```
|
||||
to
|
||||
```
|
||||
-netdev tap,id=net0,ifname=tap0
|
||||
```
|
||||
|
||||
## 4. Condition
|
||||
### 3.7 Networking
|
||||
|
||||
| Driver | Condition | Remark |
|
||||
| ------ | --------- | ------ |
|
||||
| UART | Support | UART0 |
|
||||
| RTC | Support | - |
|
||||
| GPIO | Support | - |
|
||||
| VIRTIO BLK | Support | - |
|
||||
| VIRTIO NET | Support | - |
|
||||
| VIRTIO Console | Support | - |
|
||||
| VIRTIO GPU | Support | 2D |
|
||||
| VIRTIO Input | Support | Keyboard, Mouse, Tablet |
|
||||
User-mode networking (`-netdev user`) is used by default, with SSH forwarded to local port `12055` (changeable via `-ssh`).
|
||||
|
||||
TAP networking example:
|
||||
|
||||
```
|
||||
./qemu.py -tap
|
||||
```
|
||||
|
||||
TAP requires bridge setup on Linux; support on Windows / WSL is limited. SSH port forwarding is not available in TAP mode.
|
||||
|
||||
## 4. Default QEMU Devices
|
||||
|
||||
`qemu.py` attaches the following devices by default (matching the default driver configuration):
|
||||
|
||||
| QEMU device | Image file | RT-Thread side |
|
||||
| ----------- | ---------- | -------------- |
|
||||
| `virtio-blk-device` | `virtio.qcow2` | VirtIO Block, root partition `vda0` |
|
||||
| `virtio-scsi-pci` + `scsi-hd` | `scsi.qcow2` | VirtIO SCSI |
|
||||
| `scsi-cd` (optional `-cdrom`) | user-specified | SCSI CD-ROM |
|
||||
| `pflash` (index=1) | `flash.qcow2` | MTD NOR CFI |
|
||||
| `sdhci-pci` + `sd-card` | `emmc.qcow2` | SDHCI eMMC (enable SDIO) |
|
||||
| `nvme` + `nvme-ns` | `nvme.qcow2` | NVMe |
|
||||
| `ahci` + `ide-hd` | `ahci.qcow2` | AHCI SATA |
|
||||
| `ufs` + `ufs-lu` | `ufs.qcow2` | UFS (QEMU ≥ 8.2.0) |
|
||||
| `virtio-net-device` | — | VirtIO Net (enable network stack) |
|
||||
| `virtio-rng-device` | — | VirtIO RNG |
|
||||
| `virtio-crypto-device` | — | VirtIO Crypto |
|
||||
| `virtio-serial-device` | — | VirtIO Console / RPROC Serial |
|
||||
| `pci-serial` (8250 PCI) | — | PCI 8250 serial |
|
||||
| `intel-hda` + `hda-duplex` | — | Intel HDA audio |
|
||||
| `i6300esb` | — | I6300ESB watchdog |
|
||||
| `edu` | — | QEMU EDU teaching device (MFD) |
|
||||
| `virtio-gpu-device` (`-graphic`) | — | VirtIO GPU 2D (default) |
|
||||
| `virtio-gpu-gl-pci` (`-graphic -gl`) | — | QEMU OpenGL display; no GL driver on RT-Thread side |
|
||||
| `virtio-keyboard-device` / `virtio-tablet-device` | — | VirtIO Input |
|
||||
| `virtio-9p-device` (`-9p`) | — | VirtIO 9P (enable driver) |
|
||||
| `virtio-sound-pci` (`-sound virtio`) | — | VirtIO Sound |
|
||||
| vfio-user camera (`-camera`) | — | PCI camera (BSP `drv_camera`) |
|
||||
|
||||
## 5. Driver Support
|
||||
|
||||
### 5.1 Enabled by Default
|
||||
|
||||
| Category | Driver | Description |
|
||||
| -------- | ------ | ----------- |
|
||||
| Serial | PL011 | UART0, system console `uart0` / `ttyAMA0` |
|
||||
| Serial | 8250 PCI | PCI serial, Telnet port 4322 |
|
||||
| RTC | PL031 | Real-time clock |
|
||||
| GPIO | PL061 | GPIO controller |
|
||||
| Clock | ARM Architected Timer | System tick |
|
||||
| Watchdog | I6300ESB | PCI watchdog |
|
||||
| Storage | VirtIO Block | Block device, `vda` |
|
||||
| Storage | VirtIO SCSI | SD / CD-ROM |
|
||||
| Storage | AHCI PCI | SATA disk |
|
||||
| Storage | NVMe PCI | NVMe disk |
|
||||
| Storage | UFS PCI | UFS disk |
|
||||
| Storage | MTD NOR CFI | pflash flash |
|
||||
| Storage | BLK partition | DFS / EFI partition table |
|
||||
| Graphics | VirtIO GPU | 2D framebuffer (`-graphic`); no OpenGL / VirGL |
|
||||
| Graphics | Framebuffer | ROMFB 800×600, HMI / graphics tests |
|
||||
| Graphics | LCD | LCD device framework |
|
||||
| Input | VirtIO Input | Keyboard, mouse, tablet (`-graphic`) |
|
||||
| Input | Touchscreen | Touchscreen framework |
|
||||
| Input | Keyboard GPIO | GPIO keyboard |
|
||||
| Input | Power | Power key |
|
||||
| Audio | Intel HDA | Default `-sound hda` |
|
||||
| Audio | VirtIO Sound | `-sound virtio` |
|
||||
| Crypto | HwCrypto | AES / DES / 3DES / RC4 / RNG |
|
||||
| Crypto | VirtIO Crypto | VirtIO crypto backend |
|
||||
| Random | VirtIO RNG | Hardware random number |
|
||||
| Comm | VirtIO Console | Telnet 4321 |
|
||||
| Comm | VirtIO RPROC Serial | Remoteproc serial link |
|
||||
| Comm | RPMSG | VirtIO RPMSG character device |
|
||||
| Comm | Mailbox PIC | Mailbox interrupt controller |
|
||||
| Firmware | QEMU FW_CFG | Firmware configuration interface |
|
||||
| Bus | PCI | ECAM + Generic Host, MSI / MSI-X |
|
||||
| Bus | VirtIO | MMIO + PCI transport |
|
||||
| IRQ | GICv2 / GICv3 / ITS | Including GICv2m MSI |
|
||||
| Devicetree | OFW / FDT | Dynamic devicetree parsing |
|
||||
| Other | DMA | DMA framework |
|
||||
| Other | MFD EDU / SYSCON | Multi-function devices |
|
||||
| Other | Regulator / Reset | Power and reset framework |
|
||||
| Filesystem | DFS v2 | FatFs, devfs, romfs |
|
||||
| POSIX | Partial APIs | poll / select / termios / pipe, etc. |
|
||||
|
||||
### 5.2 Not Enabled by Default but Available via menuconfig
|
||||
|
||||
This BSP enables the PCI bus and VirtIO PCI transport; QEMU also attaches the corresponding devices. The following drivers are unchecked in the default `.config` but can be used after enabling the Kconfig options and rebuilding (no `qemu.py` changes required):
|
||||
|
||||
| Driver / feature | Kconfig | QEMU device | Notes |
|
||||
| ---------------- | ------- | ----------- | ----- |
|
||||
| VirtIO Net | `RT_USING_SAL` + `RT_USING_LWIP` + `RT_USING_ETHERNET` | `virtio-net-device` | Network stack not enabled by default |
|
||||
| VirtIO 9P | `RT_VIRTIO_9P` | `virtio-9p-device` | Use with `-9p` shared directory |
|
||||
| SDHCI eMMC | `RT_USING_SDIO` + `RT_SDIO_SDHCI_PCI` | `sdhci-pci` | eMMC storage |
|
||||
| SDIO DW MMC PCI | `RT_USING_SDIO` + `RT_SDIO_DW_MMC_PCI` | — | DesignWare MMC |
|
||||
| USB | `RT_USING_USB_HOST` / `RT_USING_USB_DEVICE` | Add USB controller manually | Not a default QEMU device |
|
||||
| CherryUSB | `RT_USING_CHERRYUSB` | Add USB controller manually | — |
|
||||
| I2C / SPI | `RT_USING_I2C` / `RT_USING_SPI` | Depends on PCI device | Requires matching PCI controller driver |
|
||||
| CAN | `RT_USING_CAN` | Depends on PCI device | — |
|
||||
| Sensor | `RT_USING_SENSOR` | — | — |
|
||||
| WiFi | `RT_USING_WIFI` | — | — |
|
||||
| PM | `RT_USING_PM` | — | — |
|
||||
| Pinctrl | `RT_USING_PINCTRL` | — | — |
|
||||
| SCMI firmware | `RT_FIRMWARE_ARM_SCMI` + `RT_VIRTIO_SCMI` | — | — |
|
||||
|
||||
> **Note**: Any PCI driver marked `depends on RT_USING_PCI` can be enabled on this BSP via menuconfig. If QEMU does not attach the device by default, add the corresponding `-device` argument in `qemu.py`.
|
||||
|
||||
### 5.3 BSP-Specific Features (Driver Layer)
|
||||
|
||||
| Feature | Config | Startup |
|
||||
| ------- | ------ | ------- |
|
||||
| HMI graphics test | `RT_GRAPHIC_HMI_TEST` | `-graphic` (embedded in `drv_romfb.c`) |
|
||||
| Graphics draw test | `RT_GRAPHIC_GRAPHIC_TEST` | `-graphic` (embedded in `drv_romfb.c`) |
|
||||
| Camera driver | `RT_SOC_CAMERA` | `-graphic -camera` |
|
||||
|
||||
### 5.4 Sample Applications (`applications/`)
|
||||
|
||||
| Source | Build condition | Description |
|
||||
| ------ | --------------- | ----------- |
|
||||
| `main.c` | Always | Entry `main()`, prints `hello rt-thread` |
|
||||
| `amp.c` | `RT_RPMSG_RT_THREAD_VIRTIO` | AMP heterogeneous multi-core and RPMSG demo |
|
||||
| `camera.c` | `RT_SOC_CAMERA` | Overlay camera feed onto framebuffer |
|
||||
|
||||
**`main.c`**
|
||||
|
||||
Default application. Prints `hello rt-thread` after boot, then enters msh.
|
||||
|
||||
**`amp.c` (AMP + RPMSG)**
|
||||
|
||||
The primary core boots an additional CPU running RT-Thread as slave via the `amp_soc` devicetree node and PSCI. Primary and slave communicate through VirtIO RPMSG and Mailbox. The primary writes VirtIO Block `vdb` resource info into the slave DTB before starting the slave.
|
||||
|
||||
**Version requirement**: **Smart version** required (`RT_USING_SMART` in menuconfig). The standard kernel must run with virtual addresses equal to physical addresses. The AMP slave is loaded by QEMU into a separate physical memory region (see `amp_memory`, `kernel-entry` in `amp.dtsi`), which violates that constraint — the standard kernel cannot be used for AMP demos.
|
||||
|
||||
Startup:
|
||||
|
||||
```
|
||||
./qemu.py -dtbo amp.dtsi -mem 258
|
||||
```
|
||||
|
||||
Slave console: `telnet localhost 4323`.
|
||||
|
||||
msh commands:
|
||||
|
||||
| Command | Description |
|
||||
| ------- | ----------- |
|
||||
| `rpmsg_write <device> <message>` | Write a message to an RPMSG character device |
|
||||
| `rpmsg_read <device>` | Read all messages from an RPMSG character device |
|
||||
| `amp_startup` | Manually trigger AMP slave boot (exported when console and msh are both enabled; otherwise runs automatically at app init) |
|
||||
|
||||
An RPMSG endpoint is created automatically at boot (`rpmsg_char0`, endpoint name `rpmsg-char`, addresses 114/514). Addresses are swapped on the slave side.
|
||||
|
||||
**`camera.c` (Camera Preview)**
|
||||
|
||||
Centers and overlays the vfio-user PCI camera feed onto the framebuffer. Default devices `camera0` → `fb0`, runs for about 10 seconds (300 frames).
|
||||
|
||||
Startup:
|
||||
|
||||
```
|
||||
./qemu.py -graphic -camera
|
||||
```
|
||||
|
||||
msh command:
|
||||
|
||||
```
|
||||
camera [camera_device] [framebuffer_device]
|
||||
```
|
||||
|
||||
Example: `camera camera0 fb0`
|
||||
|
||||
## 6. Storage and Partitions
|
||||
|
||||
- Root filesystem is mounted on the first partition of VirtIO Block `vda0`, filesystem type `elm` (FatFs).
|
||||
- Storage images are auto-created as 64 MB `qcow2` files on first run; resize with `qemu-img` or replace beforehand.
|
||||
- pflash0 is used for BootROM (e.g. UEFI); this BSP uses pflash1 (`flash.qcow2`) as CFI NOR. pflash0 data is not preserved after QEMU exits.
|
||||
- On Linux, partition `qcow2` images with `qemu-nbd` + `fdisk` (not supported on Windows).
|
||||
|
||||
## 7. QEMU Monitor Hot-Plug Tips
|
||||
|
||||
Dynamically add or remove VirtIO serial ports in the QEMU Monitor:
|
||||
|
||||
```
|
||||
(qemu) chardev-add socket,host=127.0.0.1,port=4323,server=on,wait=off,telnet=on,id=console2
|
||||
(qemu) device_add virtserialport,chardev=console2,name=org.rt-thread.port,id=port2
|
||||
(qemu) device_del port2
|
||||
(qemu) chardev-remove console2
|
||||
```
|
||||
|
||||
Optional VirtIO device arguments (add in `qemu.py` as needed):
|
||||
|
||||
- Disable legacy: `-global virtio-mmio.force-legacy=false`
|
||||
- Virtqueue packed: `-device virtio-XXX-device,packed=on`
|
||||
- PCI mode (≥ 1.0): `-device virtio-XXX-pci,disable-legacy=on`
|
||||
|
||||
## 8. Notes After Configuration Changes
|
||||
|
||||
- After changing CPU count, adjust `qemu.py -smp` or rebuild so `RT_CPUS_NR` matches.
|
||||
- GIC auto-switches to v3 when exceeding 8 cores; or specify `-gic 3` manually.
|
||||
- 9P directory sharing requires QEMU built with virtfs (`--enable-virtfs`).
|
||||
- `-gl` requires QEMU built with OpenGL / VirGL (`--enable-opengl`, `--enable-virglrenderer`); this is independent of RT-Thread OpenGL support — the default software stack is 2D graphics only.
|
||||
- AMP (`-dtbo`) requires Smart kernel (`RT_USING_SMART`); the standard kernel requires VA=PA and cannot be used with slave images loaded at fixed physical addresses.
|
||||
- Override root device or boot parameters via `-bootargs`.
|
||||
|
||||
@@ -1,76 +1,418 @@
|
||||
# QEMU/AArch64 VIRT板级支持包说明
|
||||
# QEMU/AArch64 VIRT 板级支持包说明
|
||||
|
||||
中文页 | [English](README.md)
|
||||
|
||||
## 1. 简介
|
||||
|
||||
AArch64是一种采用ARMv8 ISA,用于执行A64指令的机器的64位执行模式。本工程是在QEMU的AArch64 VIRT版本上进行的一份移植。
|
||||
AArch64 是 ARMv8 架构下执行 A64 指令的 64 位执行状态。本 BSP 将 RT-Thread 移植到 QEMU `virt` AArch64 机器上,基于设备模型(DM)、Open Firmware(OFW/FDT)与 PCI 总线框架,可作为 VirtIO、PCI 及各类平台驱动的开发与验证平台。
|
||||
|
||||
当前默认配置要点:
|
||||
|
||||
| 项目 | 说明 |
|
||||
| ---- | ---- |
|
||||
| RT-Thread 版本 | 5.3 |
|
||||
| 架构 | ARMv8 AArch64,MMU |
|
||||
| SMP | 4 核(`RT_CPUS_NR=4`) |
|
||||
| 中断控制器 | GICv2 / GICv3(含 ITS、MSI) |
|
||||
| 控制台 | UART0(PL011,`ttyAMA0`) |
|
||||
| 根文件系统 | VirtIO Block `vda0`,FatFs(elm-chan) |
|
||||
| 内存 | 默认 128 MB(可通过 `qemu.py -mem` 调整) |
|
||||
|
||||
## 2. 编译说明
|
||||
|
||||
建议使用ARM Developer GNU交叉编译工具链,目前支持Linux/Windows平台:
|
||||
建议使用 ARM Developer GNU 交叉编译工具链,支持 Linux / Windows 平台:
|
||||
|
||||
```
|
||||
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads/
|
||||
```
|
||||
下载x86_64 Hosted平台下载对应的`xxx-aarch64-none-elf`二进制包,解压后设置`RTT_EXEC_PATH`环境变量为该编译器的bin目录下即可。
|
||||
|
||||
进入到`rt-thread/bsp/qemu-virt64-aarch64`目录进行输入:
|
||||
下载 x86_64 Hosted 平台对应的 `xxx-aarch64-none-elf` 二进制包,解压后将 `RTT_EXEC_PATH` 环境变量指向该编译器的 `bin` 目录。
|
||||
|
||||
进入 `rt-thread/bsp/qemu-virt64-aarch64` 目录执行:
|
||||
|
||||
```
|
||||
scons
|
||||
```
|
||||
可以看到正常生成`rtthread.elf`与`rtthread.bin`文件。
|
||||
|
||||
或者通过 `scons --exec-path="GCC工具链路径"` 命令,在指定工具链位置的同时直接编译。
|
||||
正常生成 `rtthread.elf` 与 `rtthread.bin` 文件。
|
||||
|
||||
## 3. 执行
|
||||
也可通过 `scons --exec-path="GCC工具链路径"` 在指定工具链的同时直接编译。
|
||||
|
||||
本工程执行环境为`qemu-system-aarch64`模拟器,工程可配置为使用`Cortex-A53/A57/A72`等芯片,GIC支持`V2/V3`版本,其中`V2`最多可配置8个处理器。
|
||||
配置修改可使用 `scons --menuconfig`,保存后重新 `scons` 编译。
|
||||
|
||||
## 3. 运行
|
||||
|
||||
本 BSP 使用 `qemu-system-aarch64` 模拟器,通过 `qemu.py` 启动。
|
||||
|
||||
### 3.1 安装 QEMU
|
||||
|
||||
Windows 平台:
|
||||
|
||||
Windows平台下,可以在此获取到QEMU:
|
||||
```
|
||||
https://www.qemu.org/download/
|
||||
```
|
||||
Linux平台下,以Ubuntu、Deepin系列发行版为例,可通过该命令安装QEMU:
|
||||
|
||||
Linux 平台(以 Ubuntu、Deepin 为例):
|
||||
|
||||
```
|
||||
sudo apt update
|
||||
sudo apt install qemu-system-arm
|
||||
```
|
||||
|
||||
工程默认配置修改后请注意修改运行脚本。在终端执行qemu.bat或qemu.sh可以看到程序运行:
|
||||
部分可选功能对 QEMU 版本有要求:
|
||||
|
||||
| 功能 | 最低 QEMU 版本 |
|
||||
| ---- | -------------- |
|
||||
| UFS 存储 | 8.2.0 |
|
||||
| VirtIO Sound(`-sound virtio`) | 8.2.0 |
|
||||
|
||||
### 3.2 环境变量
|
||||
|
||||
| 变量 | 说明 |
|
||||
| ---- | ---- |
|
||||
| `RTT_QEMU_ROOT` | QEMU 可执行文件所在目录前缀(脚本会在其后拼接 `qemu-system-aarch64`) |
|
||||
| `RTT_ROOT` | RT-Thread 源码根目录,默认自动取 BSP 上两级目录 |
|
||||
|
||||
### 3.3 基本启动
|
||||
|
||||
在 BSP 目录下执行:
|
||||
|
||||
```
|
||||
python qemu.py
|
||||
```
|
||||
|
||||
或:
|
||||
|
||||
```
|
||||
./qemu.py
|
||||
```
|
||||
|
||||
首次运行会自动创建各存储设备对应的 64 MB `qcow2` 镜像。默认以 `-nographic` 模式启动,串口输出到当前终端。
|
||||
|
||||
典型启动日志:
|
||||
|
||||
```
|
||||
heap: [0x40042aa0 - 0x40142aa0]
|
||||
|
||||
\ | /
|
||||
- RT - Thread Operating System
|
||||
/ | \ 4.0.4 build Aug 6 2021
|
||||
2006 - 2021 Copyright by rt-thread team
|
||||
Hi, this is RT-Thread!!
|
||||
/ | \ 5.3.0 build ...
|
||||
2006 - 2026 Copyright by rt-thread team
|
||||
hello rt-thread
|
||||
msh />
|
||||
```
|
||||
|
||||
如果需要使用VirtIO-Console,请在新终端使用以下命令连接控制台:
|
||||
### 3.4 `qemu.py` 命令行参数
|
||||
|
||||
| 参数 | 默认值 | 说明 |
|
||||
| ---- | ------ | ---- |
|
||||
| `-gic` | `2` | GIC 版本(`2` / `3` / `max`);`-smp` 大于 8 时自动切换为 GICv3 |
|
||||
| `-smp` | `RT_CPUS_NR`(4) | CPU 核心数 |
|
||||
| `-mem` | `128` | 内存大小(MB) |
|
||||
| `-el` | `1` | 异常级别:`1` 默认;`2` 开启虚拟化;`3` 开启 secure |
|
||||
| `-bootargs` | 见下文 | 内核启动参数 |
|
||||
| `-initrd` | — | 指定 initrd 镜像路径 |
|
||||
| `-graphic` | — | 图形模式(ramfb + VirtIO 键盘/平板),替代 `-nographic` |
|
||||
| `-gl` | — | 图形模式下挂载 `virtio-gpu-gl-pci` 并开启 QEMU 显示端 OpenGL(如 `-gl gtk`);需 QEMU 带 `--enable-opengl`、`--enable-virglrenderer`,且须与 `-graphic` 合用 |
|
||||
| `-debug` | — | 启用 GDB 调试(`-S -s`) |
|
||||
| `-dumpdtb` | — | 导出运行时 DTB 并转为 DTS |
|
||||
| `-dtb` | — | 使用自定义 DTB 文件 |
|
||||
| `-virtio-block` | `virtio` | VirtIO Block 磁盘镜像名前缀(生成 `virtio.qcow2`,挂载为 `vda`) |
|
||||
| `-scsi` | `scsi` | VirtIO SCSI 磁盘镜像名前缀 |
|
||||
| `-flash` | `flash` | pflash 磁盘镜像名前缀(pflash1,CFI NOR) |
|
||||
| `-emmc` | `emmc` | SDHCI eMMC 磁盘镜像名前缀 |
|
||||
| `-nvme` | `nvme` | NVMe 磁盘镜像名前缀 |
|
||||
| `-ahci` | `ahci` | AHCI SATA 磁盘镜像名前缀 |
|
||||
| `-ufs` | `ufs` | UFS 磁盘镜像名前缀(QEMU ≥ 8.2.0) |
|
||||
| `-cdrom` | — | SCSI CD-ROM 镜像路径(如 ISO 文件) |
|
||||
| `-sound` | `hda` | 音频设备:`hda`(Intel HDA)或 `virtio`(VirtIO Sound PCI) |
|
||||
| `-tap` | — | 使用 TAP 网卡(替代 user 模式) |
|
||||
| `-ssh` | `12055` | user 模式下 SSH 端口转发(`hostfwd=tcp::PORT-:22`) |
|
||||
| `-9p` | — | VirtIO 9P 共享目录路径(需在 menuconfig 中启用 VirtIO 9P) |
|
||||
| `-camera` | — | 启用 vfio-user 摄像头(仅 Linux,配合 `qemu-device-camera`) |
|
||||
| `-dtbo` | — | AMP 模式:指定 DTBO overlay 文件(如 `amp.dtsi`);**须 Smart 版本内核**(见下文说明) |
|
||||
|
||||
默认 `-bootargs`:
|
||||
|
||||
```
|
||||
console=ttyAMA0 earlycon cma=8M coherent_pool=2M root=vda0 rootfstype=elm rootwait rw
|
||||
```
|
||||
|
||||
### 3.5 常用启动示例
|
||||
|
||||
图形界面(VirtIO GPU + 键鼠):
|
||||
|
||||
```
|
||||
./qemu.py -graphic
|
||||
```
|
||||
|
||||
QEMU OpenGL 显示(`-gl`):
|
||||
|
||||
```
|
||||
./qemu.py -graphic -gl gtk
|
||||
```
|
||||
|
||||
> **说明**:`-gl` 仅在 QEMU / 宿主机显示链路侧启用 OpenGL(`virtio-gpu-gl-pci` + VirGL)。本 BSP 默认仅包含 VirtIO GPU 2D 帧缓冲驱动,**没有 OpenGL / VirGL 用户态与内核侧实现**,因此 `-gl` 不会带来 RT-Thread 内的 OpenGL 加速;图形演示请使用 `-graphic`(`virtio-gpu-device`)配合 framebuffer / HMI 测试。
|
||||
|
||||
GDB 调试:
|
||||
|
||||
```
|
||||
./qemu.py -debug
|
||||
```
|
||||
|
||||
更大内存与 GICv3:
|
||||
|
||||
```
|
||||
./qemu.py -mem 256 -gic 3
|
||||
```
|
||||
|
||||
挂载 CD-ROM:
|
||||
|
||||
```
|
||||
./qemu.py -cdrom /path/to/image.iso
|
||||
```
|
||||
|
||||
VirtIO Sound 音频:
|
||||
|
||||
```
|
||||
./qemu.py -sound virtio
|
||||
```
|
||||
|
||||
9P 目录共享(需先启用 `RT_VIRTIO_9P`):
|
||||
|
||||
```
|
||||
./qemu.py -9p /path/to/share
|
||||
```
|
||||
|
||||
AMP 异构多核(RPMSG 从核,**须 Smart 版本**):
|
||||
|
||||
```
|
||||
./qemu.py -dtbo amp.dtsi -mem 258
|
||||
```
|
||||
|
||||
> **说明**:AMP 示例要求启用 **Smart 版本**(`RT_USING_SMART`)。标准版内核要求在虚拟地址与物理地址相等的区域运行;从核镜像由 QEMU `loader` 加载到 `amp.dtsi` 指定的固定物理地址(如 `kernel-entry = 0x48480000`),与主核 MMU 映射布局不同,标准版无法在该地址空间正常启动。请在 menuconfig 中开启 Smart 后重新编译。
|
||||
|
||||
摄像头演示:
|
||||
|
||||
```
|
||||
./qemu.py -graphic -camera
|
||||
```
|
||||
|
||||
### 3.6 控制台与 Telnet
|
||||
|
||||
| 端口 | 设备 | 说明 |
|
||||
| ---- | ---- | ---- |
|
||||
| 当前终端 | UART0(PL011) | 默认 `-nographic` 串口 |
|
||||
| `4321` | VirtIO Console | `telnet 127.0.0.1 4321`,端口名 `org.rt-thread.console` |
|
||||
| `4322` | PCI 8250 串口 | `telnet 127.0.0.1 4322` |
|
||||
| `4323` | AMP 从核控制台 | 仅 `-dtbo` 模式,`telnet localhost 4323` |
|
||||
|
||||
VirtIO Console 连接示例:
|
||||
|
||||
```
|
||||
telnet 127.0.0.1 4321
|
||||
```
|
||||
|
||||
如果使用tap网卡模式,以设备tap0为例,将qemu运行脚本
|
||||
### 3.7 网络
|
||||
|
||||
默认使用 user 模式网络(`-netdev user`),SSH 端口转发到本机 `12055`(可用 `-ssh` 修改)。
|
||||
|
||||
TAP 网卡模式示例(以 `tap0` 为例):
|
||||
|
||||
```
|
||||
-netdev user,id=net0
|
||||
```
|
||||
修改为
|
||||
```
|
||||
-netdev tap,id=net0,ifname=tap0
|
||||
./qemu.py -tap
|
||||
```
|
||||
|
||||
## 4.支持情况
|
||||
Linux 下需预先配置 TAP 网桥,Windows / WSL 下 TAP 支持有限。TAP 模式下 SSH 端口转发不可用。
|
||||
|
||||
| 驱动 | 支持情况 | 备注 |
|
||||
| ------ | ---- | :------: |
|
||||
| UART | 支持 | UART0 |
|
||||
| RTC | 支持 | - |
|
||||
| GPIO | 支持 | - |
|
||||
| VIRTIO BLK | 支持 | - |
|
||||
| VIRTIO NET | 支持 | - |
|
||||
| VIRTIO Console | 支持 | - |
|
||||
| VIRTIO GPU | 支持 | 2D |
|
||||
| VIRTIO Input | 支持 | Keyboard, Mouse, Tablet |
|
||||
## 4. QEMU 默认挂载设备
|
||||
|
||||
`qemu.py` 默认向虚拟机挂载以下设备(与驱动默认配置对应):
|
||||
|
||||
| QEMU 设备 | 镜像文件 | RT-Thread 侧 |
|
||||
| --------- | -------- | ------------ |
|
||||
| `virtio-blk-device` | `virtio.qcow2` | VirtIO Block,根分区 `vda0` |
|
||||
| `virtio-scsi-pci` + `scsi-hd` | `scsi.qcow2` | VirtIO SCSI |
|
||||
| `scsi-cd`(可选 `-cdrom`) | 用户指定 | SCSI CD-ROM |
|
||||
| `pflash`(index=1) | `flash.qcow2` | MTD NOR CFI |
|
||||
| `sdhci-pci` + `sd-card` | `emmc.qcow2` | SDHCI eMMC(需启用 SDIO) |
|
||||
| `nvme` + `nvme-ns` | `nvme.qcow2` | NVMe |
|
||||
| `ahci` + `ide-hd` | `ahci.qcow2` | AHCI SATA |
|
||||
| `ufs` + `ufs-lu` | `ufs.qcow2` | UFS(QEMU ≥ 8.2.0) |
|
||||
| `virtio-net-device` | — | VirtIO Net(需启用网络协议栈) |
|
||||
| `virtio-rng-device` | — | VirtIO RNG |
|
||||
| `virtio-crypto-device` | — | VirtIO Crypto |
|
||||
| `virtio-serial-device` | — | VirtIO Console / RPROC Serial |
|
||||
| `pci-serial`(8250 PCI) | — | PCI 8250 串口 |
|
||||
| `intel-hda` + `hda-duplex` | — | Intel HDA 音频 |
|
||||
| `i6300esb` | — | I6300ESB 看门狗 |
|
||||
| `edu` | — | QEMU EDU 教学设备(MFD) |
|
||||
| `virtio-gpu-device`(`-graphic`) | — | VirtIO GPU 2D(默认) |
|
||||
| `virtio-gpu-gl-pci`(`-graphic -gl`) | — | QEMU OpenGL 显示设备;RT-Thread 侧无对应 GL 驱动 |
|
||||
| `virtio-keyboard-device` / `virtio-tablet-device` | — | VirtIO Input |
|
||||
| `virtio-9p-device`(`-9p`) | — | VirtIO 9P(需启用驱动) |
|
||||
| `virtio-sound-pci`(`-sound virtio`) | — | VirtIO Sound |
|
||||
| vfio-user 摄像头(`-camera`) | — | PCI 摄像头(BSP `drv_camera`) |
|
||||
|
||||
## 5. 驱动支持情况
|
||||
|
||||
### 5.1 默认已启用
|
||||
|
||||
| 类别 | 驱动 | 说明 |
|
||||
| ---- | ---- | ---- |
|
||||
| 串口 | PL011 | UART0,系统控制台 `uart0` / `ttyAMA0` |
|
||||
| 串口 | 8250 PCI | PCI 串口,Telnet 端口 4322 |
|
||||
| RTC | PL031 | 实时时钟 |
|
||||
| GPIO | PL061 | GPIO 控制器 |
|
||||
| 时钟 | ARM Architected Timer | 系统 tick |
|
||||
| 看门狗 | I6300ESB | PCI 看门狗 |
|
||||
| 存储 | VirtIO Block | 块设备,`vda` |
|
||||
| 存储 | VirtIO SCSI | SD / CD-ROM |
|
||||
| 存储 | AHCI PCI | SATA 磁盘 |
|
||||
| 存储 | NVMe PCI | NVMe 磁盘 |
|
||||
| 存储 | UFS PCI | UFS 磁盘 |
|
||||
| 存储 | MTD NOR CFI | pflash 闪存 |
|
||||
| 存储 | BLK 分区 | DFS / EFI 分区表 |
|
||||
| 图形 | VirtIO GPU | 2D 帧缓冲(`-graphic`);不含 OpenGL / VirGL |
|
||||
| 图形 | Framebuffer | ROMFB 800×600,含 HMI / 图形测试 |
|
||||
| 图形 | LCD | LCD 设备框架 |
|
||||
| 输入 | VirtIO Input | 键盘、鼠标、平板(`-graphic`) |
|
||||
| 输入 | Touchscreen | 触摸屏框架 |
|
||||
| 输入 | Keyboard GPIO | GPIO 键盘 |
|
||||
| 输入 | Power | 电源键 |
|
||||
| 音频 | Intel HDA | 默认 `-sound hda` |
|
||||
| 音频 | VirtIO Sound | `-sound virtio` |
|
||||
| 加密 | HwCrypto | AES / DES / 3DES / RC4 / RNG |
|
||||
| 加密 | VirtIO Crypto | VirtIO 加密后端 |
|
||||
| 随机数 | VirtIO RNG | 硬件随机数 |
|
||||
| 通信 | VirtIO Console | Telnet 4321 |
|
||||
| 通信 | VirtIO RPROC Serial | Remoteproc 串口链路 |
|
||||
| 通信 | RPMSG | VirtIO RPMSG 字符设备 |
|
||||
| 通信 | Mailbox PIC | 邮箱中断控制器 |
|
||||
| 固件 | QEMU FW_CFG | 固件配置接口 |
|
||||
| 总线 | PCI | ECAM + Generic Host,MSI / MSI-X |
|
||||
| 总线 | VirtIO | MMIO + PCI 传输 |
|
||||
| 中断 | GICv2 / GICv3 / ITS | 含 GICv2m MSI |
|
||||
| 设备树 | OFW / FDT | 动态设备树解析 |
|
||||
| 其他 | DMA | DMA 框架 |
|
||||
| 其他 | MFD EDU / SYSCON | 多功能设备 |
|
||||
| 其他 | Regulator / Reset | 电源与复位框架 |
|
||||
| 文件系统 | DFS v2 | FatFs、devfs、romfs |
|
||||
| POSIX | 部分接口 | poll / select / termios / pipe 等 |
|
||||
|
||||
### 5.2 默认未启用但可通过 menuconfig 开启
|
||||
|
||||
本 BSP 已启用 PCI 总线与 VirtIO PCI 传输,QEMU 中也已挂载对应设备。下列驱动在默认 `.config` 中未勾选,开启相应 Kconfig 选项并重新编译后即可使用(无需修改 `qemu.py`):
|
||||
|
||||
| 驱动 / 功能 | Kconfig 要点 | QEMU 设备 | 说明 |
|
||||
| ----------- | ------------ | --------- | ---- |
|
||||
| VirtIO Net | `RT_USING_SAL` + `RT_USING_LWIP` + `RT_USING_ETHERNET` | `virtio-net-device` | 网络协议栈未默认启用 |
|
||||
| VirtIO 9P | `RT_VIRTIO_9P` | `virtio-9p-device` | 配合 `-9p` 共享目录 |
|
||||
| SDHCI eMMC | `RT_USING_SDIO` + `RT_SDIO_SDHCI_PCI` | `sdhci-pci` | eMMC 存储 |
|
||||
| SDIO DW MMC PCI | `RT_USING_SDIO` + `RT_SDIO_DW_MMC_PCI` | — | DesignWare MMC |
|
||||
| USB | `RT_USING_USB_HOST` / `RT_USING_USB_DEVICE` | 需自行添加 USB 控制器 | 非 QEMU 默认设备 |
|
||||
| CherryUSB | `RT_USING_CHERRYUSB` | 需自行添加 USB 控制器 | — |
|
||||
| I2C / SPI | `RT_USING_I2C` / `RT_USING_SPI` | 视具体 PCI 设备 | 需对应 PCI 控制器驱动 |
|
||||
| CAN | `RT_USING_CAN` | 视具体 PCI 设备 | — |
|
||||
| Sensor | `RT_USING_SENSOR` | — | — |
|
||||
| WiFi | `RT_USING_WIFI` | — | — |
|
||||
| PM 电源管理 | `RT_USING_PM` | — | — |
|
||||
| Pinctrl | `RT_USING_PINCTRL` | — | — |
|
||||
| SCMI 固件 | `RT_FIRMWARE_ARM_SCMI` + `RT_VIRTIO_SCMI` | — | — |
|
||||
|
||||
> **说明**:凡标注 `depends on RT_USING_PCI` 的 PCI 类驱动,均可在此 BSP 上通过 menuconfig 启用;QEMU 侧若未挂载对应设备,需自行在 `qemu.py` 中添加 `-device` 参数。
|
||||
|
||||
### 5.3 BSP 特有功能(驱动层)
|
||||
|
||||
| 功能 | 配置项 | 启动方式 |
|
||||
| ---- | ------ | -------- |
|
||||
| HMI 图形测试 | `RT_GRAPHIC_HMI_TEST` | `-graphic`(`drv_romfb.c` 内嵌) |
|
||||
| 图形绘制测试 | `RT_GRAPHIC_GRAPHIC_TEST` | `-graphic`(`drv_romfb.c` 内嵌) |
|
||||
| 摄像头驱动 | `RT_SOC_CAMERA` | `-graphic -camera` |
|
||||
|
||||
### 5.4 示例应用(`applications/`)
|
||||
|
||||
| 源文件 | 编译条件 | 说明 |
|
||||
| ------ | -------- | ---- |
|
||||
| `main.c` | 始终编译 | 入口 `main()`,打印 `hello rt-thread` |
|
||||
| `amp.c` | `RT_RPMSG_RT_THREAD_VIRTIO` | AMP 异构多核与 RPMSG 通信示例 |
|
||||
| `camera.c` | `RT_SOC_CAMERA` | 摄像头画面叠加到 framebuffer |
|
||||
|
||||
**`main.c`**
|
||||
|
||||
默认应用,系统启动后输出 `hello rt-thread`,随后进入 msh。
|
||||
|
||||
**`amp.c`(AMP + RPMSG)**
|
||||
|
||||
主核通过设备树 `amp_soc` 节点,以 PSCI 拉起额外一颗 CPU 运行从核 RT-Thread,主从之间通过 VirtIO RPMSG + Mailbox 通信。主核将 VirtIO Block `vdb` 的资源信息写入从核 DTB 后启动从核。
|
||||
|
||||
**版本要求**:须 **Smart 版本**(menuconfig 中 `RT_USING_SMART`)。标准版内核必须在虚拟地址与物理地址一致的映射下运行;AMP 从核由 QEMU 加载到独立物理内存区域(见 `amp.dtsi` 中 `amp_memory`、`kernel-entry` 等),不满足该约束,因此标准版无法用于 AMP 演示。
|
||||
|
||||
启动方式:
|
||||
|
||||
```
|
||||
./qemu.py -dtbo amp.dtsi -mem 258
|
||||
```
|
||||
|
||||
从核控制台:`telnet localhost 4323`。
|
||||
|
||||
msh 命令:
|
||||
|
||||
| 命令 | 说明 |
|
||||
| ---- | ---- |
|
||||
| `rpmsg_write <设备> <消息>` | 向 RPMSG 字符设备写入消息 |
|
||||
| `rpmsg_read <设备>` | 读取 RPMSG 字符设备全部消息 |
|
||||
| `amp_startup` | 手动触发 AMP 从核启动(同时启用控制台与 msh 时导出;否则自动在应用初始化阶段执行) |
|
||||
|
||||
系统启动时会自动创建 RPMSG 端点(`rpmsg_char0`,端点名 `rpmsg-char`,地址 114/514)。从核侧地址互换。
|
||||
|
||||
**`camera.c`(摄像头预览)**
|
||||
|
||||
将 vfio-user PCI 摄像头画面居中叠加到 framebuffer,默认设备 `camera0` → `fb0`,约 10 秒(300 帧)。
|
||||
|
||||
启动方式:
|
||||
|
||||
```
|
||||
./qemu.py -graphic -camera
|
||||
```
|
||||
|
||||
msh 命令:
|
||||
|
||||
```
|
||||
camera [摄像头设备] [framebuffer设备]
|
||||
```
|
||||
|
||||
示例:`camera camera0 fb0`
|
||||
|
||||
## 6. 存储与分区
|
||||
|
||||
- 根文件系统默认挂载在 VirtIO Block 第一个分区 `vda0`,文件系统类型 `elm`(FatFs)。
|
||||
- 各存储镜像首次运行自动创建为 64 MB `qcow2` 文件,可通过 `qemu-img` 扩容或预先替换。
|
||||
- pflash0 用于 BootROM(如 UEFI),本 BSP 使用 pflash1(`flash.qcow2`)作为 CFI NOR;pflash0 数据在 QEMU 退出后不保留。
|
||||
- Linux 下可使用 `qemu-nbd` + `fdisk` 对 `qcow2` 镜像分区(Windows 不支持)。
|
||||
|
||||
## 7. QEMU Monitor 热插拔提示
|
||||
|
||||
在 QEMU Monitor 中可动态增删 VirtIO 串口端口:
|
||||
|
||||
```
|
||||
(qemu) chardev-add socket,host=127.0.0.1,port=4323,server=on,wait=off,telnet=on,id=console2
|
||||
(qemu) device_add virtserialport,chardev=console2,name=org.rt-thread.port,id=port2
|
||||
(qemu) device_del port2
|
||||
(qemu) chardev-remove console2
|
||||
```
|
||||
|
||||
VirtIO 设备可选参数(在 `qemu.py` 中按需添加):
|
||||
|
||||
- 禁用 legacy:` -global virtio-mmio.force-legacy=false`
|
||||
- Virtqueue packed:` -device virtio-XXX-device,packed=on`
|
||||
- PCI 模式(≥ 1.0):` -device virtio-XXX-pci,disable-legacy=on`
|
||||
|
||||
## 8. 修改配置后的注意事项
|
||||
|
||||
- 修改 CPU 数量后,同步调整 `qemu.py -smp` 或重新编译使 `RT_CPUS_NR` 与之一致。
|
||||
- 超过 8 核时 GIC 自动切换为 v3,也可手动指定 `-gic 3`。
|
||||
- 启用 9P 目录共享需 QEMU 编译时包含 virtfs(`--enable-virtfs`)。
|
||||
- 使用 `-gl` 需 QEMU 编译时包含 OpenGL / VirGL(`--enable-opengl`、`--enable-virglrenderer`);这与 RT-Thread 是否支持 OpenGL 无关,当前软件栈默认仅 2D 图形。
|
||||
- AMP(`-dtbo`)须 Smart 版本内核(`RT_USING_SMART`);标准版要求 VA=PA 运行,无法用于从核固定物理地址加载场景。
|
||||
- 修改根设备或启动参数时,通过 `-bootargs` 覆盖默认参数。
|
||||
|
||||
@@ -4,7 +4,7 @@ cwd = GetCurrentDir()
|
||||
src = Glob('*.c') + Glob('*.cpp')
|
||||
CPPPATH = [cwd]
|
||||
|
||||
if not GetDepend(['RT_RPMSG_RT_THREAD_VIRTIO']):
|
||||
if not GetDepend(['RT_USING_SMART']):
|
||||
SrcRemove(src, ['amp.c'])
|
||||
|
||||
if not GetDepend(['RT_SOC_CAMERA']):
|
||||
|
||||
@@ -52,7 +52,7 @@ static void blend_camera_to_fb(rt_uint8_t *cam_fb, rt_uint8_t *fb,
|
||||
src_row = cam_fb + y * cam_w * 3;
|
||||
dst = fb + (dst_y + y) * fb_pitch + dst_x * 2;
|
||||
dst_pixel = (rt_uint16_t*)dst;
|
||||
|
||||
|
||||
for (x = 0; x < draw_w; ++x)
|
||||
{
|
||||
rt_uint8_t r = src_row[x * 3 + 0];
|
||||
@@ -63,7 +63,7 @@ static void blend_camera_to_fb(rt_uint8_t *cam_fb, rt_uint8_t *fb,
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
case RTGRAPHIC_PIXEL_FORMAT_ARGB888:
|
||||
{
|
||||
rt_uint32_t *dst_pixel;
|
||||
@@ -72,7 +72,7 @@ static void blend_camera_to_fb(rt_uint8_t *cam_fb, rt_uint8_t *fb,
|
||||
src_row = cam_fb + y * cam_w * 3;
|
||||
dst = fb + (dst_y + y) * fb_pitch + dst_x * 4;
|
||||
dst_pixel = (rt_uint32_t*)dst;
|
||||
|
||||
|
||||
for (x = 0; x < draw_w; ++x)
|
||||
{
|
||||
rt_uint8_t r = src_row[x * 3 + 0];
|
||||
@@ -83,7 +83,7 @@ static void blend_camera_to_fb(rt_uint8_t *cam_fb, rt_uint8_t *fb,
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
case RTGRAPHIC_PIXEL_FORMAT_ABGR888:
|
||||
{
|
||||
rt_uint32_t *dst_pixel;
|
||||
@@ -92,7 +92,7 @@ static void blend_camera_to_fb(rt_uint8_t *cam_fb, rt_uint8_t *fb,
|
||||
src_row = cam_fb + y * cam_w * 3;
|
||||
dst = fb + (dst_y + y) * fb_pitch + dst_x * 4;
|
||||
dst_pixel = (rt_uint32_t*)dst;
|
||||
|
||||
|
||||
for (x = 0; x < draw_w; ++x)
|
||||
{
|
||||
rt_uint8_t r = src_row[x * 3 + 0];
|
||||
@@ -103,7 +103,7 @@ static void blend_camera_to_fb(rt_uint8_t *cam_fb, rt_uint8_t *fb,
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
default:
|
||||
/* Fallback: direct copy for RGB888 */
|
||||
for (y = 0; y < draw_h; ++y)
|
||||
|
||||
@@ -14,6 +14,19 @@ exit
|
||||
* 2026-04-07 GuEe-GUI the first version
|
||||
*/
|
||||
|
||||
/*
|
||||
* Install libvfio-user
|
||||
* 1. Dependency library
|
||||
* Debian:
|
||||
* sudo apt install libjson-c-dev libcmocka-dev
|
||||
* RedHat:
|
||||
* sudo yum install json-c-devel libcmocka-devel
|
||||
*
|
||||
* 2. git clone https://github.com/nutanix/libvfio-user.git
|
||||
* 3. meson build
|
||||
* 4. ninja -C build
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@@ -96,6 +96,7 @@ q_flash = "flash"
|
||||
q_emmc = "emmc"
|
||||
q_nvme = "nvme"
|
||||
q_ahci = "ahci"
|
||||
q_sound = "hda"
|
||||
q_gl = None
|
||||
q_9p = ""
|
||||
q_ufs = "ufs"
|
||||
@@ -129,6 +130,7 @@ for i in range(len(opt)):
|
||||
if is_opt("flash", inkey): q_flash = opt[i + 1]
|
||||
if is_opt("emmc", inkey): q_emmc = opt[i + 1]
|
||||
if is_opt("nvme", inkey): q_nvme = opt[i + 1]
|
||||
if is_opt("sound", inkey): q_sound = opt[i + 1]
|
||||
if is_opt("gl", inkey): q_gl = "-device virtio-gpu-gl-pci -display {},gl=on ".format(opt[i + 1])
|
||||
if is_opt("9p", inkey): q_9p = opt[i + 1]
|
||||
if is_opt("ufs", inkey): q_ufs = opt[i + 1]
|
||||
@@ -164,6 +166,18 @@ elif q_gl != None:
|
||||
print("Error: GL should in graphic mode")
|
||||
exit(-1)
|
||||
|
||||
# Sound
|
||||
if q_sound == "hda":
|
||||
q_sound = "-device intel-hda -device hda-duplex "
|
||||
elif q_sound == "virtio":
|
||||
if qemu_version < '8.2.0':
|
||||
print("Error: VirtIO Sound is not in this version: {}".format(qemu_version.toString()))
|
||||
exit(-1)
|
||||
q_sound = "-device virtio-sound-pci,audiodev=vsnd -audiodev alsa,id=vsnd "
|
||||
else:
|
||||
print("Error: Invalid -sound {}".format(q_sound))
|
||||
exit(-1)
|
||||
|
||||
# Net
|
||||
# --enable-slirp
|
||||
# Enable TAP in example (not support in Windows, Maybe WSL2):
|
||||
@@ -284,6 +298,7 @@ cmd_base = """
|
||||
-device virtio-serial-device \
|
||||
-chardev socket,host=127.0.0.1,port=4321,server=on,wait=off,telnet=on,id=console0 \
|
||||
-device virtserialport,chardev=console0,name=org.rt-thread.console \
|
||||
{} \
|
||||
-drive if=pflash,file={}.qcow2,format=qcow2,index=1 \
|
||||
-device pci-serial,chardev=console1 \
|
||||
-chardev socket,host=127.0.0.1,port=4322,server=on,wait=off,telnet=on,id=console1 \
|
||||
@@ -304,7 +319,7 @@ cmd_base = """
|
||||
def cmd():
|
||||
return cmd_base.format(RTT_QEMU_ROOT, q_gic, q_dumpdtb, q_el, q_smp, q_mem, q_bootargs, q_dtb, q_initrd,
|
||||
q_graphic, q_debug, q_block, q_net, q_scsi, cdrom_cfg, virtfs_cfg,
|
||||
q_flash, q_emmc, q_nvme, q_ahci, ufs_cfg, camera_cfg, amp_cfg)
|
||||
q_sound, q_flash, q_emmc, q_nvme, q_ahci, ufs_cfg, camera_cfg, amp_cfg)
|
||||
|
||||
def dumpdtb():
|
||||
dtb = q_dumpdtb.split('=')[-1]
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
|
||||
/* end of rt_strnlen options */
|
||||
/* end of klibc options */
|
||||
#define RT_NAME_MAX 16
|
||||
#define RT_NAME_MAX 24
|
||||
#define RT_USING_SMP
|
||||
#define RT_CPUS_NR 4
|
||||
#define RT_ALIGN_SIZE 8
|
||||
@@ -78,6 +78,8 @@
|
||||
#define RT_USING_TIMER_SOFT
|
||||
#define RT_TIMER_THREAD_PRIO 4
|
||||
#define RT_TIMER_THREAD_STACK_SIZE 8192
|
||||
#define RT_USING_CPU_USAGE_TRACER
|
||||
#define RT_CPU_USAGE_CALC_INTERVAL_MS 200
|
||||
|
||||
/* kservice options */
|
||||
|
||||
@@ -100,6 +102,7 @@
|
||||
|
||||
#define RT_USING_MEMPOOL
|
||||
#define RT_USING_SMALL_MEM
|
||||
#define RT_USING_SLAB
|
||||
#define RT_USING_MEMHEAP
|
||||
#define RT_MEMHEAP_FAST_MODE
|
||||
#define RT_USING_MEMHEAP_AS_HEAP
|
||||
@@ -151,7 +154,7 @@
|
||||
#define FINSH_USING_MSH
|
||||
#define FINSH_THREAD_NAME "tshell"
|
||||
#define FINSH_THREAD_PRIORITY 20
|
||||
#define FINSH_THREAD_STACK_SIZE 4096
|
||||
#define FINSH_THREAD_STACK_SIZE 8192
|
||||
#define FINSH_USING_HISTORY
|
||||
#define FINSH_HISTORY_LINES 10
|
||||
#define FINSH_USING_SYMTAB
|
||||
@@ -167,9 +170,7 @@
|
||||
#define DFS_USING_POSIX
|
||||
#define DFS_USING_WORKDIR
|
||||
#define DFS_FD_MAX 32
|
||||
#define RT_USING_DFS_V1
|
||||
#define DFS_FILESYSTEMS_MAX 4
|
||||
#define DFS_FILESYSTEM_TYPES_MAX 8
|
||||
#define RT_USING_DFS_V2
|
||||
#define RT_USING_DFS_ELMFAT
|
||||
|
||||
/* elm-chan's FatFs, Generic FAT Filesystem Module */
|
||||
@@ -187,7 +188,6 @@
|
||||
#define RT_DFS_ELM_MUTEX_TIMEOUT 3000
|
||||
/* end of elm-chan's FatFs, Generic FAT Filesystem Module */
|
||||
#define RT_USING_DFS_DEVFS
|
||||
#define RT_USING_DFS_9PFS
|
||||
#define RT_USING_DFS_ROMFS
|
||||
/* end of DFS: device virtual file system */
|
||||
|
||||
@@ -204,6 +204,7 @@
|
||||
#define RT_USING_SERIAL_V1
|
||||
#define RT_SERIAL_USING_DMA
|
||||
#define RT_SERIAL_RB_BUFSZ 256
|
||||
#define RT_USING_SERIAL_BYPASS
|
||||
#define RT_SERIAL_PL011
|
||||
#define RT_SERIAL_8250
|
||||
#define RT_SERIAL_8250_PCI
|
||||
@@ -222,6 +223,12 @@
|
||||
#define RT_RTC_PL031
|
||||
#define RT_USING_WDT
|
||||
#define RT_WDT_I6300ESB
|
||||
#define RT_USING_AUDIO
|
||||
#define RT_AUDIO_REPLAY_MP_BLOCK_SIZE 4096
|
||||
#define RT_AUDIO_REPLAY_MP_BLOCK_COUNT 2
|
||||
#define RT_AUDIO_RECORD_PIPE_SIZE 2048
|
||||
#define RT_AUDIO_INTEL_HDA
|
||||
#define RT_USING_TOUCH
|
||||
#define RT_USING_LCD
|
||||
#define RT_USING_GRAPHIC
|
||||
#define RT_GRAPHIC_FB
|
||||
@@ -247,9 +254,19 @@
|
||||
#define RT_INPUT_POWER
|
||||
#define RT_INPUT_KEYBOARD
|
||||
#define RT_INPUT_KEYBOARD_GPIO
|
||||
#define RT_INPUT_TOUCHSCREEN
|
||||
#define RT_USING_MBOX
|
||||
#define RT_MBOX_PIC
|
||||
#define RT_USING_RPMSG
|
||||
#define RT_RPMSG_CHAR_MSG_MAX 64
|
||||
#define RT_RPMSG_CHAR_MSG_SIZE_MAX 256
|
||||
#define RT_RPMSG_RT_THREAD_VIRTIO
|
||||
#define RT_USING_ATA
|
||||
#define RT_ATA_AHCI
|
||||
#define RT_ATA_AHCI_PCI
|
||||
#define RT_USING_NVME
|
||||
#define RT_USING_NVME_IO_QUEUE 4
|
||||
#define RT_NVME_PCI
|
||||
#define RT_USING_BLK
|
||||
|
||||
/* Partition Types */
|
||||
@@ -260,9 +277,12 @@
|
||||
#define RT_USING_SCSI
|
||||
#define RT_SCSI_SD
|
||||
#define RT_SCSI_CDROM
|
||||
#define RT_USING_UFS
|
||||
#define RT_UFS_PCI
|
||||
#define RT_USING_FIRMWARE
|
||||
#define RT_FIRMWARE_QEMU_FW_CFG
|
||||
#define RT_USING_REGULATOR
|
||||
#define RT_USING_RESET
|
||||
|
||||
/* Power Management (PM) Domains device drivers */
|
||||
|
||||
@@ -273,10 +293,13 @@
|
||||
#define RT_VIRTIO_BLK
|
||||
#define RT_VIRTIO_CONSOLE
|
||||
#define RT_VIRTIO_RNG
|
||||
#define RT_VIRTIO_RPMSG
|
||||
#define RT_VIRTIO_SCSI
|
||||
#define RT_VIRTIO_RPROC_SERIAL
|
||||
#define RT_VIRTIO_GPU
|
||||
#define RT_VIRTIO_INPUT
|
||||
#define RT_VIRTIO_CRYPTO
|
||||
#define RT_VIRTIO_SOUND
|
||||
#define RT_USING_DMA
|
||||
#define RT_USING_MFD
|
||||
#define RT_MFD_EDU
|
||||
@@ -308,6 +331,10 @@
|
||||
|
||||
/* SoC (System on Chip) Drivers */
|
||||
|
||||
#define RT_GRAPHIC_ROMFB_WIDTH 800
|
||||
#define RT_GRAPHIC_ROMFB_HEIGHT 600
|
||||
#define RT_SOC_CAMERA
|
||||
/* end of SoC (System on Chip) Drivers */
|
||||
/* end of Device Drivers */
|
||||
|
||||
/* C/C++ and POSIX layer */
|
||||
@@ -333,6 +360,7 @@
|
||||
#define RT_USING_POSIX_TERMIOS
|
||||
#define RT_USING_POSIX_DELAY
|
||||
#define RT_USING_POSIX_CLOCK
|
||||
#define RT_USING_POSIX_TIMER
|
||||
|
||||
/* Interprocess Communication (IPC) */
|
||||
|
||||
@@ -505,14 +533,6 @@
|
||||
/* GD32 Drivers */
|
||||
|
||||
/* end of GD32 Drivers */
|
||||
|
||||
/* HPMicro SDK */
|
||||
|
||||
/* end of HPMicro SDK */
|
||||
|
||||
/* FT32 HAL & SDK Drivers */
|
||||
|
||||
/* end of FT32 HAL & SDK Drivers */
|
||||
/* end of HAL & SDK Drivers */
|
||||
|
||||
/* sensors drivers */
|
||||
|
||||
Reference in New Issue
Block a user