Skip to main content
在开始之前,请按照 Qualcomm Linux 构建指南中的说明设置您的基础设施。 接口工作流程

图:接口工作流程

识别接口状态

默认接口状态表示接口在启动期间的状态。要识别接口状态,请成功注册接口并获取已启用接口的列表。

获取启动日志

要获取设备的启动日志,请执行以下操作:
  1. 在 permissive 模式下打开 SSH shell,或使用 ADB shell。有关如何运行 SSH 的更多信息,请参阅使用 SSH 部分。
  2. 运行以下命令获取已启用接口的日志。
    输出:
  3. 连接 UART 串口以登录控制台。 USB 连接器

列出设备上已启用的接口

要获取已启用接口的列表,请执行以下操作:
  • 对于 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
  1. 在以下文件中启用 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
  2. 通过检查平台设备树中的串行引擎节点来识别可用的串行引擎。典型的 SE 编号:SE0、SE1、SE2、…、SE15(因平台而异)。
    注意您可以根据接口需求选择所需的协议。
    • I2C:传感器、EEPROM、PMIC
    • SPI:显示屏、闪存、ADC
    • UART:控制台、GPS、蓝牙
  3. 通过在设备树文件中添加或修改串行引擎节点来配置设备树。
    • I2C 配置示例:
    • SPI 配置示例:
    • UART 配置示例:
      可选:为高吞吐量设备启用 GSI DMA。
  4. 切换串行引擎协议。例如,从 I2C 切换到 SPI。
    1. 原始 I2C 配置:
    2. 新配置(SPI)
    注意重启设备以使更改生效。
有关补丁系列的更多信息,请参阅以下资源: 表:设备树属性
属性类型描述是否必需
statusstring启用/禁用 SE(okay/disabled
qcom,enable-gsi-dmaboolean启用 GSI DMA 模式
clock-frequencyu32I2C 时钟频率(Hz)
spi-max-frequencyu32SPI 最大频率(Hz)
pinctrl-namesstring array引脚控制状态名称建议
pinctrl-0phandle默认引脚配置建议
常见时钟频率
  • 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 模式配置示例
  • 采用 GSI DMA 模式的 I2C
  • 采用 GSI DMA 模式的 SPI

用例

  • 使用不同协议的多个串行引擎
  • 多个 QUP 实例:
    • qupv3_0(QUP0):SE0-SE7
    • qupv3_1(QUP1):SE8-SE15
  • 引脚复用:确保正确的引脚配置:
  • 性能优化 表:模式选择
    模式何时使用
    GSI DMA 模式(qcom,enable-gsi-dma;传输大小经常 > 32 字节、高吞吐量设备(触摸屏、显示屏)、批量数据传输、对 CPU 效率要求高
    FIFO 模式小规模、频繁的传输,低延迟要求,可用 DMA 通道有限,简单的设备通信

故障排除

  • 调试命令
  • 内核日志
  • 设备树验证
下表列出了故障排除过程中发现的常见问题。 表:常见问题及解决方案
问题症状解决方案
固件加载失败qcom-geni-se: firmware request failed
  1. 验证固件文件是否存在。ls -la /lib/firmware/qcom/
  2. 检查内核配置。CONFIG_FW_LOADER=y CONFIG_FW_LOADER_USER_HELPER=y
  3. 验证驱动程序中的固件路径。
串行引擎未探测到
  • 未创建设备节点
  • 驱动程序未加载
  1. 检查设备树状态。status = "okay";
  2. 验证 compatible 字符串与驱动程序匹配。
  3. 检查内核日志。dmesg | grep -i qup dmesg | grep -i geni
协议冲突qcom-geni-se: serial engine is already in use确保每个串行引擎仅启用一种协议。
DMA 分配失败qcom-geni-se: GSI DMA allocation failed
  1. 检查可用的 DMA 通道。
  2. 从某些串行引擎中移除 qcom,enable-gsi-dma;
  3. 对不太关键的设备使用 FIFO 模式。
引脚复用冲突
  • 通信失败
  • 设备无响应
  1. 验证引脚配置。cat /sys/kernel/debug/pinctrl/*/pinmux-pins
  2. 检查与其他外设的引脚冲突。
  3. 确保在 pinctrl 中选择了正确的功能。

启用所需接口

要启用某个接口,请执行以下操作:

验证接口状态

要验证不同接口的功能,请执行以下操作:
  • 对于 UART,请参阅验证 UART 接口部分。
  • 对于 SPI,请参阅 SPI 验证部分。
  • 对于 I2C,请参阅验证 I2C 接口部分。
  • 对于 PCIe,使用以下命令验证已连接的端点。
    将显示以下输出。
    注意输出可能因底层硬件而异。
  • 对于 USB,加载 USB 固件以检测设备连接,并按如下方式验证设备和主机:
    • 设备:连接 USB Type-C 端口,并通过主机 PC 验证枚举日志。
      将显示以下输出。
    • 主机:连接鼠标或 U 盘等 USB 设备,并使用以下命令验证设备检测。
      将显示以下输出。