Skip to main content

QUP v3 概述

QUP v3 是一种高度灵活且可编程的硬件,可支持多种串行接口。单个 QUP v3 串行引擎硬件核心最多可提供八个串行接口。两个 QUP v3 硬件核心如下:
  • 16 串行引擎核心
  • SSC QUP v3 硬件核心,在 SSC_I/O 中提供五个串行引擎
QUP v3 支持系统中多个硬件实体的访问。每个实体拥有自己的执行环境(EE)、独立的地址空间和一条中断线。有关 QUP v3 中可配置的各种传输模式的信息,请参阅QUP v3 支持的传输模式 下图显示了一个 GSI 核心/引擎连接最多八个串行引擎(SE)。您可以根据用例或串行引擎的协议灵活地自定义配置。有关如何自定义配置的信息,请参阅 QUP v3 访问控制自定义。要验证 QUP v3 固件是否已正确烧写,请参阅 QUP v3 固件状态验证
QUPv3 框图

图:QUP v3 框图

QUP v3 支持的传输模式

QUP v3 串行引擎可配置为以下模式。
  • FIFO 模式:简单可靠,但 CPU 占用高。最适合低流量控制操作和基本启动(bring-up)。
  • CPU DMA(SE DMA 模式):将数据搬移工作卸载,但仍依赖 CPU 协调。可带来中等程度的性能提升。
  • 通用软件接口(GSI)DMA 模式(首选):完全由硬件驱动的传输,CPU 参与度极低。针对高性能、可扩展性和功耗效率进行了优化。
表:用户层面对比摘要
方面FIFOCPU DMAGSI DMA
CPU 参与度极低
中断频率非常低
功耗效率
性能可扩展性中等优秀
最适合简单控制中等传输高性能系统
QUPv3 GENI 支持多种数据搬移机制。传统上,传输可以使用 FIFO(基于 PIO)或 CPU 管理的 DMA 模式执行。虽然这些方式对于低吞吐量或不频繁的传输已经足够,但在高流量条件下,它们会给 CPU 带来持续负载并产生较高的中断率。

QUPv3 GENI 传输模式

QUPv3 GENI 支持多种数据搬移机制。传统上,传输可以使用 FIFO(基于 PIO)或 CPU 管理的 DMA 模式执行。虽然这些方式对于低吞吐量或不频繁的传输已经足够,但在高流量条件下,它们会给 CPU 带来持续负载并产生较高的中断率。 FIFO 模式
Fifo 模式

图:FIFO 模式

  1. ①:应用处理器配置通用接口(GENI)。
  2. ②:应用处理器处理 Rx/Tx 数据。数据在 GENI 和内存之间传输。
DMA 模式
DMA 模式

图:DMA 模式

  1. ①:应用处理器初始化 DMA。
  2. ②:串行引擎配置 GENI,并启动传输过程。
GSI 模式 GSI 模式引入了一种基于描述符的硬件辅助 DMA 机制,使用 Qualcomm 的 GPI DMA 引擎。在此模式下,CPU 编写一组事务描述符——称为事务环元素(Transaction Ring Elements,TRE)——它们完整描述一次 I/O 操作。一旦提交,GPI 硬件即自主执行传输,在系统内存和 GENI 串行引擎之间搬移数据,无需 CPU 进一步干预。GSI 模式最适合以下用例:
  • 高速 I3C 设备
  • 摄像头和以太网子系统
  • 通过 I2C 的 PCIe 交换机
使用 GSI 模式的系统级优势如下:
  • 大幅减轻 CPU 负载
  • 更少的中断
  • 负载下更好的可扩展性
  • 性能提升
    • 大传输量下性能稳定
    • 每次传输的中断率更低
    • 延迟可预测
    • 高速下吞吐量稳定
    • 大数据负载下不会急剧劣化
GSI 模式

图:GSI 模式

  1. ①:应用处理器准备 TRE。
  2. ②:应用处理器通知 QUP(GSI)。
  3. ③:GSI 处理 TRE。
  4. ④:TRE 处理完成后,发送给 GENI。
  5. ⑤:串行引擎处理 Rx/Tx 数据。
注意QUP v3 UART 串行引擎不支持 GSI 模式。

QUP v3 访问控制自定义

QUP v3 用户访问文件 QUPAC_Access.c 指定串行引擎资源的所有者。它最初根据系统 I/O GPIO 分配进行填充。所有串行引擎都必须列出才能访问子系统。它足够灵活,可以只列出特定设备上可用的串行引擎。 要为所需的串行引擎协议自定义访问控制,请在 QUPAC_Access.c 文件中配置参数。QUPAC_Access.c 文件的 Qualcomm TEE 镜像位于 /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/config/<chipset>/QUPAC_Access.c 要指定串行引擎资源的所有者,请修改 QUPAC_Access.c 文件以适配板卡设计。 以下用例指定了在已启用的串行引擎上运行的默认协议。您可以根据自己的板卡设计修改代码。 QUP v3 串行引擎中的非安全模式用例 QUP v3 串行引擎支持以下非安全模式用例。

QUP v3 串行引擎访问列表说明

以下变量会传入 QUPv3_se_security_permissions_type 结构体。 表:QUP v3 的安全权限变量
变量说明
PeriphID要配置和分配的串行引擎外设。
ProtocolID所需协议的宏。
ModeFIFO/GSI/DMA 模式的宏。
NsOwner存放需要访问权限的镜像的宏。
bAllowFifo如果模式为 FIFO,则该布尔标志设为 True,否则设为 False。
bLoad该布尔标志值设为 True 以加载协议固件。
bModExcl此标志专用于 Qualcomm TEE。当 NsOwner 为 AC_TZ 时设为 True。
有关此宏的更多信息,请参阅 settings/buses/qup_accesscontrol/qupv3/interface/QupACCommonIds.h

QUP v3 固件状态验证

要使串行引擎正常工作,必须正确烧写 QUP 固件。固件通过 metabuild 提供,位于 common/core_qupv3fw/<chipset>/qupv3fw.elf。您可以通过检查 GENI_FW_REVISION_RO0xa8c068)来验证固件状态。例如,在内核日志中查找该寄存器的 0x0000ffff 值。在以下日志中,0000ffff 错误表示固件未正确烧写。
仅当您打算使用与默认配置不同的协议时,才修改 QUPAC_Access.c 文件配置。 当加载后配置不匹配时,会显示以下示例日志。

相关文档

标题资源
Qualcomm Technologies, Inc.
安全外壳(SSH)https://docs.qualcomm.com/bundle/publicresource/topics/80-80022-254/how_to.html
QDTEhttps://docs.qualcomm.com/bundle/publicresource/topics/80-80022-4/tools.html#qdte
资源
PCI 总线子系统https://www.kernel.org/doc/html/latest/PCI/index.html
Linux 用户空间示例https://github.com/DigilientLinux-userspace-examples/tree/master/uart_example_linux/src
DTSI 配置示例https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts
UART 串行接口驱动的测试工具和方法https://docs.kernel.org/admin-guide/serial-console.html
UART Linux APIhttps://github.com/torvalds/linux/blob/master/include/linux/tty.h
UART 上游设备树参考https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi
Qualcomm Dragonwing RB3 Gen 2 开发套件设备树节点https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts
SPI 内核工具https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/tools/spi
SPI 上游设备树参考https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi
I2C 示例
I2C Linux API
I2C 上游内核测试应用和 I2C 工具https://layers.openembedded.org/layerindex/recipe/27859/
I2C 上游设备树参考https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi
PCIe 设备初始化和枚举流程https://www.kernel.org/doc/html/latest/PCI/index.html
PCIe 框架和客户端驱动的 PCIe 注册https://www.kernel.org/doc/html/latest/PCI/index.html
为 PCIe 实例添加受支持的 MSI 组https://lore.kernel.org/linux-arm-msm/f1168212-bc6e-4570-869c-2870d6f248ad@linaro.org/T/
PCIe 调试https://pcisig.com/specifications
PCIe 上游设备树参考
USB Qscratch 封装驱动https://github.com/torvalds/linux/blob/master/drivers/usb/dwc3/dwc3-qcom.c
控制器核心驱动https://github.com/torvalds/linux/blob/master/drivers/usb/dwc3/core.c
Type-C 连接器的 USB 软件接口驱动
LPM 支持https://lore.kernel.org/20231017131851.8299-1-quic_kriskura@quicinc.com/
USB DWC3 驱动https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/usb/dwc3/dwc3-qcom.c?h=v6.6.2
Qualcomm Synopsys femto PHYhttps://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/phy/qualcomm/phy-qcom-snps-femto-v2.c?h=v6.6.2
QMP DisplayPort 组合 PHYhttps://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/phy/qualcomm/phy-qcom-qmp-combo.c?h=v6.6.2
USB ADBhttps://developer.android.com/tools/adb
f_fs.chttps://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/usb/gadget/function/f_fs.c?h=v6.6.2
大容量存储https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/usb/gadget/function/f_mass_storage.c?h=v6.6.2
平台工具(adb/fastboot)https://developer.android.com/tools/releases/platform-tools
平台 LibUVC
UVC gadgethttps://github.com/wlhe/uvc-gadget
UVC streamerhttps://github.com/bsapundzhiev/uvc-streamer
UVC Video4Linux (v4l2-utils)https://linuxtv.org/downloads/v4l-dvb-apis/driver-api/v4l2-core.html
USB 上游设备树参考https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi
Qualcomm Linux 硬件 SoC 设备树节点https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts
USB 驱动中的 RPM 更改及其他示例https://patchwork.kernel.org/project/linux-usb/list/?series=793939&archive=both
扁平化设备树

缩略语和术语

缩略语或术语定义
aDSP应用数字信号处理器
ADBAndroid 调试桥
ASPM活动状态电源管理
BDF总线设备功能
CAN控制器局域网
CRC循环冗余校验
CTS清除发送
DLLP数据链路层数据包
DTS设备树源文件
ECRC端到端 CRC
EE执行环境
ESE执行安全环境
FP指纹
GPIO通用输入/输出
GSI通用软件接口
HID人机接口设备
I/O输入/输出
IOMMU输入/输出内存管理单元
I2C集成电路间总线
I3C改进型集成电路间总线
LSP列表处理器
MS大容量存储
MSI消息信号中断
NCM网络控制调制解调器
NFC近场通信
NIC网络接口卡
PCIe外设组件互连高速总线
QoS服务质量
QIMQualcomm 智能多媒体
RTS请求发送
SCL串行时钟线
SDK软件开发套件
SDL串行数据线
SE串行引擎
SLPI传感器低功耗岛
SPI串行外设接口
SPMI系统电源管理接口
SR-IOV单根 I/O 虚拟化
SSCSnapdragon 传感器核心
TC流量类别
TEE可信执行环境
TLP事务层数据包
UEFI统一可扩展固件接口
UACUSB 音频类
UART通用异步收发器
UCSIUSB Type-C 连接器系统软件接口
V4L2Video4Linux2
VC虚拟通道
Yavta又一个 V4L2 测试应用