
图:接口工作流程
识别接口状态
默认接口状态表示接口在启动期间的状态。要识别接口状态,请成功注册接口并获取已启用接口的列表。获取启动日志
要获取设备的启动日志,请执行以下操作:- 在 permissive 模式下打开 SSH shell,或使用 ADB shell。有关如何运行 SSH 的更多信息,请参阅使用 SSH 部分。
- 运行以下命令获取已启用接口的日志。
输出:
- 连接 UART 串口以登录控制台。
列出设备上已启用的接口
要获取已启用接口的列表,请执行以下操作:- 对于 UART,运行以下命令。
输出:
- 对于 I2C,运行以下命令。
将显示以下输出。
- 默认情况下,SPI 未启用。要启用 SPI,请参阅 SPI 软件设备树配置。要验证 SPI 是否已启用,请运行以下命令。
将显示以下输出。
- 对于 PCIe,获取枚举日志。有关 PCIe 探测日志的更多信息,请参阅 PCIe 相关配置和 QPS615 交换机支持。
使用 Linux 内核加载 QUP v3 串行引擎固件
本文档介绍使用 Linux 内核加载 QUP v3 串行引擎固件的机制。它描述了从基于 TrustZone 的架构(具有固定的协议分配和有限的灵活性)到基于 Linux 的方法的转变,后者通过设备树配置实现动态协议分配、更轻松的调试和简化的开发。QUP v3 包含多个串行引擎,可配置为以下协议:- I2C
- SPI
- UART
默认配置
每个串行引擎的默认配置(包括所选的数据传输模式和所有权)位于_/TZ.XF.5.0/core.tz/2.0/settings/buses/qup\_accesscontrol/qupv3/config/lemans/QUPAC\_Access.c_ 文件中。
在默认配置中,Linux 拥有所有串行引擎。
加载固件
固件文件位于 /lib/firmware/qcom/<target-name>/qupv3fw.elf。-
在以下文件中启用 CONFIG_QUP_FW_LOAD:
- 在 arch/arm64/configs/qcom_defconfig 中设置
CONFIG_QCOM_QUP_FW_LOAD=y - 在 arch/arm64/configs/qcom_vm_defconfig 中设置
CONFIG_QCOM_QUP_FW_LOAD=m
- 在 arch/arm64/configs/qcom_defconfig 中设置
-
通过检查平台设备树中的串行引擎节点来识别可用的串行引擎。典型的 SE 编号:SE0、SE1、SE2、…、SE15(因平台而异)。
注意您可以根据接口需求选择所需的协议。
- I2C:传感器、EEPROM、PMIC
- SPI:显示屏、闪存、ADC
- UART:控制台、GPS、蓝牙
-
通过在设备树文件中添加或修改串行引擎节点来配置设备树。
- I2C 配置示例:
- SPI 配置示例:
- UART 配置示例:
可选:为高吞吐量设备启用 GSI DMA。
- I2C 配置示例:
-
切换串行引擎协议。例如,从 I2C 切换到 SPI。
- 原始 I2C 配置:
- 新配置(SPI)
注意重启设备以使更改生效。 - 原始 I2C 配置:
- 驱动程序实现的主要补丁系列:
- https://lore.kernel.org/all/20250911043256.3523057-1-viken.dadhaniya@oss.qualcomm.com/
- 主要更改:固件加载基础设施、GSI DMA 支持、协议初始化、错误处理改进
- 设备树绑定和示例:
| 属性 | 类型 | 描述 | 是否必需 |
|---|---|---|---|
status | string | 启用/禁用 SE(okay/disabled) | 是 |
qcom,enable-gsi-dma | boolean | 启用 GSI DMA 模式 | 否 |
clock-frequency | u32 | I2C 时钟频率(Hz) | 否 |
spi-max-frequency | u32 | SPI 最大频率(Hz) | 否 |
pinctrl-names | string array | 引脚控制状态名称 | 建议 |
pinctrl-0 | phandle | 默认引脚配置 | 建议 |
- I2C
- 标准模式:100 kHz
- 快速模式:400 kHz
- 增强快速模式(Fast mode plus):1 MHz
- SPI
- 低速:1–10 MHz
- 中速:10–50 MHz
- 高速:50–100 MHz
数据传输模式
QUP v3 串行引擎支持两种主要的数据传输模式:FIFO 模式和 GSI DMA 模式。FIFO 模式是默认模式,最适合小规模、频繁的传输,且配置最少。通用软件接口(GSI)DMA 模式利用 DMA 通道进行批量数据传输,需要额外配置。下表总结了每种模式的主要特性和适用条件。 表:FIFO 和 GSI DMA 模式特性| 属性 | FIFO 模式 | GSI DMA 模式 |
|---|---|---|
| 数据路径 | 使用内部 FIFO 缓冲区 | 使用 GSI DMA 模式 |
| 最适用于 | 小规模、频繁的传输;简单的设备通信 | 大规模或批量传输;高吞吐量设备(触摸屏、显示屏) |
| 开销 | 开销较低 | 设置开销较高,但对于大规模传输可以减轻 CPU 负担 |
| 配置 | 默认模式;无需特殊配置 | 需要在设备树中添加 qcom,enable-gsi-dma; 属性 |
| DMA 通道使用 | 不需要 | 需要可用的 DMA 通道;受平台限制 |
| 性能 | 大数据吞吐量较低;低延迟 | 大数据吞吐量较高;CPU 效率高 |
| 何时使用 | 当 DMA 通道有限,或用于低延迟/小规模传输时 | 传输大小 > 32 字节,或用于批量/高速数据时 |
| 限制 | 不适合大规模或高速传输 | 受 DMA 通道数量限制;并非所有 SE 都支持 GSI DMA |
| 设备树示例 | 省略 qcom,enable-gsi-dma; 属性 | 添加 qcom,enable-gsi-dma; 属性 |
| 调试 | 标准 Linux 调试工具;内核日志 | 与 FIFO 类似,但还包括 DMA 分配日志 |
- 采用 GSI DMA 模式的 I2C
- 采用 GSI DMA 模式的 SPI
用例
-
使用不同协议的多个串行引擎
-
多个 QUP 实例:
qupv3_0(QUP0):SE0-SE7qupv3_1(QUP1):SE8-SE15
-
引脚复用:确保正确的引脚配置:
-
性能优化
表:模式选择
模式 何时使用 GSI DMA 模式( qcom,enable-gsi-dma;)传输大小经常 > 32 字节、高吞吐量设备(触摸屏、显示屏)、批量数据传输、对 CPU 效率要求高 FIFO 模式 小规模、频繁的传输,低延迟要求,可用 DMA 通道有限,简单的设备通信
故障排除
- 调试命令
- 内核日志
- 设备树验证
| 问题 | 症状 | 解决方案 |
|---|---|---|
| 固件加载失败 | qcom-geni-se: firmware request failed |
|
| 串行引擎未探测到 |
|
|
| 协议冲突 | qcom-geni-se: serial engine is already in use | 确保每个串行引擎仅启用一种协议。 |
| DMA 分配失败 | qcom-geni-se: GSI DMA allocation failed |
|
| 引脚复用冲突 |
|
|
启用所需接口
要启用某个接口,请执行以下操作:- 对于 UART,请参阅 UART 软件设备树配置部分。
- 对于 SPI,请参阅 SPI 软件设备树配置部分。
- 对于 I2C,请参阅 I2C 软件设备树配置部分。
- 对于 PCIe,请参阅 PCIe 软件驱动程序配置部分。
- 对于 USB,请参阅配置 USB 引导加载程序部分。
验证接口状态
要验证不同接口的功能,请执行以下操作:- 对于 UART,请参阅验证 UART 接口部分。
- 对于 SPI,请参阅 SPI 验证部分。
- 对于 I2C,请参阅验证 I2C 接口部分。
-
对于 PCIe,使用以下命令验证已连接的端点。
将显示以下输出。注意输出可能因底层硬件而异。
-
对于 USB,加载 USB 固件以检测设备连接,并按如下方式验证设备和主机:
- 设备:连接 USB Type-C 端口,并通过主机 PC 验证枚举日志。
将显示以下输出。
- 主机:连接鼠标或 U 盘等 USB 设备,并使用以下命令验证设备检测。
将显示以下输出。
- 设备:连接 USB Type-C 端口,并通过主机 PC 验证枚举日志。

