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

图:接口工作流

识别接口状态

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

获取启动日志

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

列出设备上已启用的接口

要获取已启用接口的列表,请执行以下操作:
  • 对于 UART,运行以下命令。
    输出:
  • 对于 I2C,运行以下命令。
    将显示以下输出。
  • 默认情况下,SPI 未启用。要启用 SPI,请参阅 SPI software device tree configuration。要验证 SPI 是否已启用,请运行以下命令。
    将显示以下输出。
  • 对于 PCIe,请获取枚举日志。有关 PCIe 探测日志的更多信息,请参阅 PCIe-related configurations 和 QPS615 switch support。

使用 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. 通过检查平台设备树中的串行引擎节点来识别可用的串行引擎。串行引擎的名称和编号因平台而异。请使用平台定义的节点标签;例如:
    注意您可以根据接口需求选择所需的协议。
    • I2C:传感器、EEPROM、PMIC
    • SPI:显示屏、闪存、ADC
    • UART:控制台、GPS、蓝牙
  2. 通过在设备树文件中添加或修改串行引擎节点来配置设备树。
    • I2C 配置示例:
    • SPI 配置示例:
    • UART 配置示例:
      可选:为高吞吐量设备启用 GSI DMA。
  3. 切换串行引擎协议。例如,从 I2C 切换到 SPI。
    1. 原始 I2C 配置:
    2. 新配置(SPI)
      在启用 SPI 之前请先禁用原有的 I2C 节点,因为一个串行引擎同一时间只能使用一种协议。
    注意请使用更新后的设备树重新构建并部署软件镜像,然后使用更新后的镜像启动设备。
有关补丁系列的更多信息,请参阅以下资源: 表:设备树属性
属性类型说明是否必需
status字符串启用/禁用 SE(okay/disabled)是
qcom,enable-gsi-dma布尔值启用 GSI DMA 模式否
clock-frequencyu32I2C 时钟频率(Hz)否
spi-max-frequencyu32SPI 最大频率(Hz)否
pinctrl-names字符串数组引脚控制状态名称建议
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 实例: QUP 实例的名称和串行引擎分配因平台而异。请参考平台设备树以获取正确的节点标签。
  • 引脚复用:确保正确的引脚配置:
  • 性能优化 表:模式选择
    模式何时使用
    GSI DMA 模式(qcom,enable-gsi-dma;)经常传输大小 > 32 字节、高吞吐量设备(触摸屏、显示屏)、批量数据传输、CPU 效率至关重要
    FIFO 模式小型、频繁的传输,低延迟要求,可用 DMA 通道有限,简单的设备通信

故障排查

  • 调试命令
  • 内核日志
  • 设备树验证
下表列出了故障排查过程中发现的常见问题。 表:常见问题及解决方案
问题症状解决方案
固件加载失败
  • qcom-geni-se: firmware request failed
  1. 验证固件文件是否存在:ls -la /lib/firmware/qcom/<target-name>/qupv3fw.elf。
  2. 验证驱动程序使用的固件路径。
  3. 查看内核日志中的其他固件加载错误:dmesg | grep -i firmware。
串行引擎未探测
  • 未创建设备节点
  • 驱动程序未加载
  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,请参阅 Verify UART interface 部分。
  • 对于 SPI,请参阅 SPI verification 部分。
  • 对于 I2C,请参阅 Verify I2C interface 部分。
  • 对于 PCIe,使用以下命令验证已连接的端点。
    将显示以下输出。
    注意输出可能因底层硬件而异。
  • 对于 USB,加载 USB 固件以检测设备连接,并按如下方式验证设备和主机:
    • 设备:连接 USB Type-C 端口,并在主机 PC 上验证枚举日志。
      将显示以下输出。
    • 主机:连接鼠标或 U 盘等 USB 设备,并使用以下命令验证设备检测。
      将显示以下输出。