Skip to content

drivers/spi: QEMU virtual SPI loopback bus for utest (#11972) - #11979

Open
cms19859230182-lang wants to merge 5 commits into
RT-Thread:masterfrom
cms19859230182-lang:fix/11972-spi-qemu-virt
Open

cms19859230182-lang wants to merge 5 commits into
RT-Thread:masterfrom
cms19859230182-lang:fix/11972-spi-qemu-virt

Conversation

@cms19859230182-lang

Copy link
Copy Markdown
Contributor

摘要

为 #11972 清单里 SPI/QEMU 格增加固件内虚拟 SPI bus(软件 MOSI↔MISO 回环),使现有 components.drivers.spi.loopback utest 在 qemu-vexpress-a9 上全绿,无需真实 PL022 模型。

本 PR 仅覆盖 SPI/QEMU 子项;清单其它设备格不在范围内,勿视为整份 #11972 已完成。

改动文件

  • components/drivers/spi/utest/spi_virt_bus.c(新建):纯软件 SPI bus,默认名 spi2;configure + xfer(memcpy 回环) + rt_spi_bus_register + INIT_BOARD_EXPORT
  • components/drivers/spi/utest/SConscript:纳入 spi_virt_bus.c;CPPPATH 补 utilities/utest 与 drivers/include
  • components/drivers/spi/utest/Kconfig:RT_UTEST_SPI_LOOPBACK_BUS_NAME 默认 spi2,补充 qemu 说明
  • bsp/qemu-vexpress-a9/rtconfig.h:打开 RT_USING_UTEST/RT_UTEST_SPI_LOOPBACK,bus 名 spi2
  • bsp/qemu-vexpress-a9/.config:与上面对齐的 Kconfig 符号

验证

cd bsp/qemu-vexpress-a9
scons -j$(nproc)
# QEMU
{ echo "utest_run components.drivers.spi.loopback"; sleep 25; echo "quit"; sleep 3; } | \
  timeout 60 qemu-system-arm -M vexpress-a9 -smp cpus=2 -kernel rtthread.bin -nographic -sd sd.bin

摘录:

[I/utest] SPI loopback test: connect MOSI and MISO on bus spi2.
...
[I/utest] [  PASSED  ] [ result   ] testcase (components.drivers.spi.loopback)
[I/utest] [  PASSED  ] [ result   ] 1 tests.

时钟矩阵 100k–10M Hz;数据长度 1–512 bytes(全双工 sendrecv/transfer/transfer_message)均通过。

English

Add an in-firmware virtual SPI loopback bus (software MOSI↔MISO) so components.drivers.spi.loopback passes on qemu-vexpress-a9 without a PL022 model. Default bus name spi2. Fixes the SPI/QEMU checklist item of #11972 only.

Fixes #11972

…1972)

Register a pure-software SPI bus (default name spi2) with memcpy
loopback xfer so components.drivers.spi.loopback passes on
qemu-vexpress-a9 without a PL022 model. Fix utest include/CPPPATH
and align Kconfig/rtconfig bus name.

Verified: scons + qemu utest_run components.drivers.spi.loopback PASSED.

Fixes RT-Thread#11972 (SPI/QEMU checklist item).
@github-actions

github-actions Bot commented Nov 3, 2026

Copy link
Copy Markdown

👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread!

为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。
To ensure your code complies with RT-Thread's coding style, please run the code formatting workflow by following the steps below (If the formatting of CI fails to run).


🛠 操作步骤 | Steps

  1. 前往 Actions 页面 | Go to the Actions page
    点击进入工作流 → | Click to open workflow →

  2. 点击 Run workflow | Click Run workflow

  • Use workflow from 保持默认分支(通常为 master)
    Keep the default branch (usually master) in Use workflow from
  • 在 branch 输入框填写 PR 分支 fix/11972-spi-qemu-virt
    Enter PR branch fix/11972-spi-qemu-virt in the branch field
  • 设置需排除的文件/目录(目录请以"/"结尾)
    Set files/directories to exclude (directories should end with "/")
  1. 等待工作流完成 | Wait for the workflow to complete
    格式化后的代码将作为独立提交推送至你的分支。
    The formatting changes will be pushed to your branch as a separate commit.

完成后,提交将自动更新至 fix/11972-spi-qemu-virt 分支,关联的 Pull Request 也会同步更新。
Once completed, commits will be pushed to the fix/11972-spi-qemu-virt branch automatically, and the related Pull Request will be updated.

如有问题欢迎联系我们,再次感谢您的贡献!💐
If you have any questions, feel free to reach out. Thanks again for your contribution!

@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

📌 Code Review Assignment

🏷️ Tag: components

Reviewers: @Maihuanyi

Changed Files (Click to expand)
  • components/drivers/spi/utest/Kconfig
  • components/drivers/spi/utest/SConscript
  • components/drivers/spi/utest/spi_virt_bus.c

🏷️ Tag: components_driver_spi

Reviewers: @Liang1795 @wdfk-prog

Changed Files (Click to expand)
  • components/drivers/spi/utest/Kconfig
  • components/drivers/spi/utest/SConscript
  • components/drivers/spi/utest/spi_virt_bus.c

🏷️ Tag: workflow

Reviewers: @Rbb666 @kurisaW @supperthomas

Changed Files (Click to expand)
  • .github/utest/configs/components/spi.cfg
  • .github/workflows/utest_auto_run.yml

📊 Current Review Status (Last Updated: 2026-11-05 19:35 CST)


📝 Review Instructions

  1. 维护者可以通过单击此处来刷新审查状态: 🔄 刷新状态
    Maintainers can refresh the review status by clicking here: 🔄 Refresh Status

  2. 确认审核通过后评论 LGTM/lgtm
    Comment LGTM/lgtm after confirming approval

  3. PR合并前需至少一位维护者确认
    PR must be confirmed by at least one maintainer before merging

ℹ️ 刷新CI状态操作需要具备仓库写入权限。
ℹ️ Refresh CI status operation requires repository Write permission.

Fix the 'Check File Format and License' CI job failure:

- put the spi_virt_ops initializer brace on the assignment line
- add the missing newline at end of file

No functional change.
@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

MemBrowse Memory Report · Explore what changed →

k230

  • SRAM: .eh_frame +600 B, .sbss -8 B, .text +416 B (+0.1%, 1,207,076 B / 268,300,288 B, total: 0% used)

nuvoton-m487

  • CODE: .text +40 B (+0.0%, 356,580 B / 524,288 B, total: 68% used)

qemu-virt64-aarch64

  • Code: .eh_frame +32 B, .text +496 B (+0.1%, 1,009,628 B)

raspberry-pico-rp2040

  • FLASH: .text +8 B (+0.0%, 114,192 B / 2,097,152 B, total: 5% used)

No memory changes detected for:


Catch memory regressions in CI with MemBrowse. Free for open source.

@Rbb666 Rbb666 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请将虚拟 SPI 总线与实际硬件回环测试的开关分开。

当前启用 RT_UTEST_SPI_LOOPBACK 就会编译 spi_virt_bus.c,在 INIT_BOARD_EXPORT 中按 RT_UTEST_SPI_LOOPBACK_BUS_NAME 注册软件总线。这个名字原本用于选择真实 SPI 控制器(默认 spi2),会与真实总线重名,造成注册失败,或让硬件回环测试实际只测到 memcpy。

建议新增默认关闭的虚拟总线选项,使用独立设备名,仅在 QEMU 测试配置中启用;硬件回环仍使用真实控制器。测试开关请放入现有 CI/attachconfig 配置,并由 .config 生成 rtconfig.h,不要固定进 BSP 默认配置。请分别验证虚拟总线和真实 BSP 的设备注册、测试选择。

@cms19859230182-lang

Copy link
Copy Markdown
Contributor Author

请将虚拟 SPI 总线与实际硬件回环测试的开关分开。

当前启用 RT_UTEST_SPI_LOOPBACK 就会编译 spi_virt_bus.c,在 INIT_BOARD_EXPORT 中按 RT_UTEST_SPI_LOOPBACK_BUS_NAME 注册软件总线。这个名字原本用于选择真实 SPI 控制器(默认 spi2),会与真实总线重名,造成注册失败,或让硬件回环测试实际只测到 memcpy。

建议新增默认关闭的虚拟总线选项,使用独立设备名,仅在 QEMU 测试配置中启用;硬件回环仍使用真实控制器。测试开关请放入现有 CI/attachconfig 配置,并由 .config 生成 rtconfig.h,不要固定进 BSP 默认配置。请分别验证虚拟总线和真实 BSP 的设备注册、测试选择。

收到,我来看看咋回事

…#11972)

Add a dedicated, default-off RT_UTEST_SPI_VIRT_BUS switch (default name
spi_virt) so enabling RT_UTEST_SPI_LOOPBACK no longer compiles or
registers a software SPI bus. Hardware loopback now always runs on the
real controller named by RT_UTEST_SPI_LOOPBACK_BUS_NAME, while QEMU/CI
targets opt in to the virtual bus explicitly.

Also move the utest enablement out of the qemu-vexpress-a9 BSP defaults
and into ci.attachconfig as peripheral.SPI_VIRT_LOOPBACK.
@CLAassistant

CLAassistant commented Nov 5, 2026 •

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

@Rbb666

Rbb666 commented Nov 5, 2026

Copy link
Copy Markdown
Member

建议将 SPI 回环用例接入 utest_auto_run 的配置和 A9 测试矩阵,补上自动执行覆盖。

当前 bsp/qemu-vexpress-a9/.ci/attachconfig/ci.attachconfig.yml 中的 peripheral.SPI_VIRT_LOOPBACK 接入的是 BSP 编译流程,构建脚本不会据此启动 QEMU 或执行 SPI 用例。现有 A9 自动测试读取的是 .github/utest/configs 下的 cfg,不会加载这段 YAML 配置。

请补充以下改动:

  1. 在 .github/utest/configs/components/ 增加 SPI 专用配置,启用 RT_UTEST_SPI_LOOPBACK 和 RT_UTEST_SPI_VIRT_BUS,并将测试总线名与虚拟总线名都设置为 spi_virt。
  2. 在 .github/workflows/utest_auto_run.yml 的 A9 测试矩阵中加入该配置,让 CI 启动 QEMU 并自动执行回环用例。
  3. 验证日志中出现 components.drivers.spi.loopback 的执行及通过记录,并确认用例失败时对应 job 会失败。仅编译成功不能作为测试已运行的依据。

@github-actions github-actions Bot added the action github action yml imporve label Nov 5, 2026
@CYFS3

CYFS3 commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

我觉得把模拟的设备放在qemu的文件夹下会更好点

@Rbb666 Rbb666 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已复核当前提交 a96b49bba92d8a72450ba592dec48e3cab0bc12b。此前提出的虚拟总线独立开关、独立设备名以及 A9 自动测试接入均已补齐;SPI 专项 CI 确实执行了回环用例并通过。

请在合并前处理以下兼容性问题:

[P2] 限制或适配启用设备模型的配置

spi_virt_bus.c 第 88 行 注册的是一个没有设备树节点的静态总线。在启用 RT_USING_DM 的 BSP 上,rt_spi_bus_register() 会查询 CS 引脚;例如 qemu-virt64-aarch64 默认启用了 DM 和 OFW,查询会因 parent.ofw_node == RT_NULL 返回 -RT_EINVAL,随后注销总线,回环测试无法找到 spi_virt。新增的 Kconfig 选项目前没有排除这些配置。

建议适配无设备树节点的虚拟总线注册;若本次只支持非 DM 配置,请先给 RT_UTEST_SPI_VIRT_BUS 增加 depends on !RT_USING_DM,并在帮助中说明限制。该失败路径已通过提取原注册代码的主机测试复现,尚未在 AArch64 QEMU 上实跑;当前 A9 CI 未启用 DM,因此不会覆盖此问题。

另请整理以下内容:

  • PR 描述仍写默认名称 spi2、修改 BSP 默认配置,与当前实现不一致。请更新为独立虚拟总线 spi_virt 和专用 CI 配置,并补充加载该配置的验证步骤。
  • 描述及首个提交中的 Fixes #11972 会关闭整个跟踪 issue,而本 PR 只完成 SPI 子项。请改用 Refs #11972,并确保最终合入的提交信息中也不保留该关闭关键字。
  • 标题和提交信息请按仓库规范使用方括号前缀,例如 [drivers][spi] 增加虚拟 SPI 回环总线及 A9 自动测试;格式修复和 CLA 空提交建议在合并时整理。

关于模拟设备的目录位置:当前实现仅依赖通用 SPI 接口,没有 QEMU 平台依赖,保留在 SPI 组件的 utest 目录便于复用,平台启用配置放在 BSP/CI 中即可。暂不建议把迁移到某个 QEMU BSP 作为本 PR 的合并条件。

@Rbb666

Rbb666 commented Nov 5, 2026

Copy link
Copy Markdown
Member

我觉得把模拟的设备放在qemu的文件夹下会更好点

感觉现在这样也还行,qemu属于BSP层级,这个用例虽然也是给QEMU跑的hh,不过其他的BSP也可运行,也算是通用的了吧

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] QEMU虚拟设备测试和模拟:为Z版本的发布做CI的自动化测试

4 participants