diff options
| author | GuEe-GUI <[email protected]> | 2026-06-10 23:52:31 +0800 |
|---|---|---|
| committer | Rbb666 <[email protected]> | 2026-06-15 10:00:57 +0800 |
| commit | ea5a974305739cd0daaca89ba8f2fa3563b47c3f (patch) | |
| tree | ec125291be3eb26d35314dcf9a771ec23f982e12 /bsp | |
| parent | b2b3331fd584576b4424448e59e9a94d4ff7f355 (diff) | |
[bsp][qemu-virt64-aarch64] add DM config and docs
Signed-off-by: GuEe-GUI <[email protected]>
Diffstat (limited to 'bsp')
| -rw-r--r-- | bsp/qemu-virt64-aarch64/.config | 101 | ||||
| -rw-r--r-- | bsp/qemu-virt64-aarch64/README.md | 409 | ||||
| -rw-r--r-- | bsp/qemu-virt64-aarch64/README_zh.md | 404 | ||||
| -rw-r--r-- | bsp/qemu-virt64-aarch64/applications/SConscript | 2 | ||||
| -rwxr-xr-x | bsp/qemu-virt64-aarch64/applications/camera.c | 12 | ||||
| -rwxr-xr-x | bsp/qemu-virt64-aarch64/qemu-device-camera.c | 13 | ||||
| -rwxr-xr-x | bsp/qemu-virt64-aarch64/qemu.py | 17 | ||||
| -rw-r--r-- | bsp/qemu-virt64-aarch64/rtconfig.h | 48 |
8 files changed, 864 insertions, 142 deletions
diff --git a/bsp/qemu-virt64-aarch64/.config b/bsp/qemu-virt64-aarch64/.config index 9aa0a43b0c..a0bd1c6132 100644 --- a/bsp/qemu-virt64-aarch64/.config +++ b/bsp/qemu-virt64-aarch64/.config @@ -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 diff --git a/bsp/qemu-virt64-aarch64/README.md b/bsp/qemu-virt64-aarch64/README.md index f350b3c641..6811bf3062 100644 --- a/bsp/qemu-virt64-aarch64/README.md +++ b/bsp/qemu-virt64-aarch64/README.md @@ -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 -```` +``` + +### 3.7 Networking + +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: -If use tap net mode with tap0 card, modify qemu run script config ``` --netdev user,id=net0 +camera [camera_device] [framebuffer_device] ``` -to + +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: + ``` --netdev tap,id=net0,ifname=tap0 +(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 ``` -## 4. Condition +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 -| 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 |
\ No newline at end of file +- 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`. diff --git a/bsp/qemu-virt64-aarch64/README_zh.md b/bsp/qemu-virt64-aarch64/README_zh.md index f6b6e58b1a..7cdcaaf73c 100644 --- a/bsp/qemu-virt64-aarch64/README_zh.md +++ b/bsp/qemu-virt64-aarch64/README_zh.md @@ -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` 文件。 + +也可通过 `scons --exec-path="GCC工具链路径"` 在指定工具链的同时直接编译。 + +配置修改可使用 `scons --menuconfig`,保存后重新 `scons` 编译。 + +## 3. 运行 -## 3. 执行 +本 BSP 使用 `qemu-system-aarch64` 模拟器,通过 `qemu.py` 启动。 -本工程执行环境为`qemu-system-aarch64`模拟器,工程可配置为使用`Cortex-A53/A57/A72`等芯片,GIC支持`V2/V3`版本,其中`V2`最多可配置8个处理器。 +### 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 +./qemu.py -tap ``` -修改为 + +Linux 下需预先配置 TAP 网桥,Windows / WSL 下 TAP 支持有限。TAP 模式下 SSH 端口转发不可用。 + +## 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 命令: + ``` --netdev tap,id=net0,ifname=tap0 +camera [摄像头设备] [framebuffer设备] ``` -## 4.支持情况 +示例:`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. 修改配置后的注意事项 -| 驱动 | 支持情况 | 备注 | -| ------ | ---- | :------: | -| UART | 支持 | UART0 | -| RTC | 支持 | - | -| GPIO | 支持 | - | -| VIRTIO BLK | 支持 | - | -| VIRTIO NET | 支持 | - | -| VIRTIO Console | 支持 | - | -| VIRTIO GPU | 支持 | 2D | -| VIRTIO Input | 支持 | Keyboard, Mouse, Tablet |
\ No newline at end of file +- 修改 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` 覆盖默认参数。 diff --git a/bsp/qemu-virt64-aarch64/applications/SConscript b/bsp/qemu-virt64-aarch64/applications/SConscript index 19c43aa9bf..8a1d164ac6 100644 --- a/bsp/qemu-virt64-aarch64/applications/SConscript +++ b/bsp/qemu-virt64-aarch64/applications/SConscript @@ -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']): diff --git a/bsp/qemu-virt64-aarch64/applications/camera.c b/bsp/qemu-virt64-aarch64/applications/camera.c index b1593c461f..4dc129da4b 100755 --- a/bsp/qemu-virt64-aarch64/applications/camera.c +++ b/bsp/qemu-virt64-aarch64/applications/camera.c @@ -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) diff --git a/bsp/qemu-virt64-aarch64/qemu-device-camera.c b/bsp/qemu-virt64-aarch64/qemu-device-camera.c index 494fb7275e..5025ea4ffd 100755 --- a/bsp/qemu-virt64-aarch64/qemu-device-camera.c +++ b/bsp/qemu-virt64-aarch64/qemu-device-camera.c @@ -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> diff --git a/bsp/qemu-virt64-aarch64/qemu.py b/bsp/qemu-virt64-aarch64/qemu.py index 91b1ed1e33..ef720849f6 100755 --- a/bsp/qemu-virt64-aarch64/qemu.py +++ b/bsp/qemu-virt64-aarch64/qemu.py @@ -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] diff --git a/bsp/qemu-virt64-aarch64/rtconfig.h b/bsp/qemu-virt64-aarch64/rtconfig.h index 9de8955219..2cdc287372 100644 --- a/bsp/qemu-virt64-aarch64/rtconfig.h +++ b/bsp/qemu-virt64-aarch64/rtconfig.h @@ -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 */ |
