Skip to main content
通用串行总线(USB)是一种行业标准,允许在各种类型的电子设备之间进行数据交换和电力传输。它可以运行在不同的速度上,如低速 1.5 Mbps、全速 12 Mbps、高速 480 Mbps、SuperSpeed 5 Gbps 以及 SuperSpeed Plus 10 Gbps。 Synopsys DesignWare® Core SuperSpeed USB 3.x 为 Qualcomm SoC 上的 USB 提供支持,并连接到两个 PHY:通过 UTMI 接口连接的 USB2 PHY 和通过 PIPE 接口连接的 USB3 PHY。这些 PHY 连接到物理 Type-C 端口,便于与外部世界进行通信。 以下是 USB 的关键硬件组件。
  • USB 控制器
    • 主控制器是 Synopsys DesignWare Core SuperSpeed USB 3.x 控制器(Gen1/Gen2)。
      • 两个 Qualcomm 多用途 PHY(QMP)实例,用于 USB SuperSpeed 和 DisplayPort。
      • 用于高速 USB 的 Synopsys PHY。
    • 辅助控制器是 Synopsys DesignWare Core 高速 USB 2.0 控制器。
      • 用于高速 USB 的 Synopsys PHY
    • 第三控制器是 Synopsys DesignWare Core 高速 USB 2.0 控制器。
      • 用于高速 USB 的 Synopsys PHY。
    • Dragonwing IQ-9075 有三个 USB 控制器(主 USB 3.2、辅助 USB 3.2、第三 USB 2.0)
  • Synopsys DesignWare core SuperSpeed USB 3.x 控制器特性
    • Synopsys DesignWare Core SuperSpeed USB 3.x 控制器是符合 USB SuperSpeed 标准的控制器,可以配置为以下方式之一:
      • 仅外设配置
      • 仅主机配置
      • 双角色配置
    • 支持所有传输类型(控制、批量、中断和同步)
    • 支持 SuperSpeed 批量流
    • 符合可扩展主机控制器接口(xHCI)规范
    • 主机模式支持 SuperSpeed(5 Gbps)、高速(480 Mbps)、全速(12 Mbps)和低速(1.5 Mbps)操作。
    • 设备模式支持 SuperSpeed(5 Gbps)、高速(480 Mbps)和全速(12 Mbps)操作,并最多支持 16 个双向端点(包括控制管道 ep0)。
    • 链路电源管理
  • USB PHY 访问方式
    • 通过 AHB2PHY 提供寄存器级接口,用于执行 PHY 相关操作。
  • USB Type-C
    • 支持 USB Type-C 并使用 PM7325B PD 控制器进行电力传输。
    • 完全符合 USB Type-C 3.0 电力传输规范。
    • 在传输控制器确定连接的链路伙伴的 Type-C 方向、角色和模式后,支持根据 UCSI 框架更新 PM7325B 软件驱动程序。
    • 仅用于主 USB 控制器。

时钟

下表列出了 USB 控制器以及高速和 SuperSpeed PHY 正常运行所需的时钟和工作频率。 表: USB 控制器时钟 表: 高速 PHY 时钟 表: SuperSpeed PHY 时钟

电压轨

下表列出了高速和 SuperSpeed PHY 所需的电压轨。 表: USB 电压轨 Dragonwing IQ-9075 USB 电压轨
  • HS PHY: L7A (0.88 V), L6C (1.8 V), L9A (3.3 V)
  • SS PHY: L1C, L7A

中断

下表列出了 USB 控制器用于通知事件的各种中断。 表: USB 控制器中断

互连

下表列出了 USB 控制器使用的各种互连。 表: USB 互连

使用时钟控制的 USB 控制器复位

下表列出了 USB 控制器和 PHY 使用的复位方法。 表: USB 时钟复位方法

使用寄存器的 USB 控制器软件复位

下表列出了复位 USB 控制器的寄存器选项。 表: USB 控制器复位 Dragonwing IQ-9075 控制器复位寄存器
  • HS: GCC_USB2_PHY_PRIM_BCR
  • SS: GCC_USB3_PHY_PRIM_BCR/ GCC_USB3PHY_PHY_PRIM_BCR
  • GCC_USB3_PHY_TERT_BCR
  • USB30_PRIM_GDSC
  • USB30_SEC_GDSC
  • USB20_PRIM_GDSC
Dragonwing IQ-615 辅助 USB 控制器复位寄存器
  • GCC_USB20_SEC_BCR
  • GCC_QUSB2PHY_SEC_BCR
  • GCC_USB2_PHY_SEC_BCR

USB 控制器和 SoC 集成

USB 控制器的知识产权和 PHY 集成到 SoC 中,如下图所示。 图:USB 控制器 PHY 和 SoC 集成USB 3.xcontrollerSoCType-C connectorAHB 2PHYDisplay port controllerSS0_1DPPHY (QMP)SS0_0DPPHY (QMP)EUDHS0PHY(SNPS)PipeUTMISSHS Synopsys DesignWare Core SuperSpeed USB 3.0 知识产权仅控制核心功能,不控制设备规格,如时钟、互连、稳压器和 GDSC。Synopsys DesignWare Core 知识产权嵌入在 Qscratch 包装器(知识产权和软件驱动程序)内,该包装器负责在探测、挂起或恢复状态期间管理所需的资源(时钟、互连、中断、GDSC 和稳压器)。这两个驱动程序共存以确保 USB 功能。 有关 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。

xHCI 支持

xHCI 规范描述了 USB 2.0 及更高版本的寄存器级主机控制器接口。USB 控制器符合 xHCI 规范,在主机模式下支持 SuperSpeed(5 Gbps)、高速(480 Mbps)、全速(12 Mbps)和低速(1.5 Mbps)操作。 在主机模式下使用 Linux 标准 xHCI 驱动程序来操作 USB 控制器。

USB Type-C 连接器系统软件接口(UCSI)

注意Dragonwing IQ-9075 和 Dragonwing IQ-8275 不支持 USB Type-C 功能。

USB 功能

Qualcomm 芯片硬件 SoC 允许在双角色设备(DRD)模式下工作。DRD 支持设备和主机两种角色。设备动态检测要切换到的角色,并相应地对控制器进行编程。支持自动挂起功能,可在拔下电缆时关闭 USB 控制器。支持视频、音频、网络共享、文件传输、媒体传输和充电等功能接口。 表: USB 功能:Linux

运行时电源管理

可根据您的要求启用运行时电源管理功能。LPM 支持已作为 https://lore.kernel.org/all/20231017131851.8299-1-quic_kriskura@quicinc.com/ 的一部分添加。 注意Dragonwing IQ-9075 和 Dragonwing IQ-8275 不支持 USB Type-A 端口的运行时电源管理。 默认情况下,运行时的 USB 挂起和恢复被禁用。要启用这些功能,请运行以下命令:
默认的自动挂起延迟设置为 5 秒。要更改延迟,请运行以下 sysfs 命令:
在角色切换期间,DWC3 控制器进入挂起状态,切换 GDSC,并复位控制器,以确保主机模式外设枚举成功。 在主机模式下,为了使远程唤醒正常工作,根据您的要求为 xHCI 接口、USB 根集线器和连接的外设启用唤醒和自动挂起。
注意主机控制器驱动程序(HCD)设备生成 xhci-hcd.X.auto 值,其中 X = 0、1、2。它表示连接到 USB 的设备数量。连接的设备在 /sys/bus/platform/devices/xhci-hcd.X.auto/usb1/<node number> 下列出。<node number> 值取决于连接到 USB 端口的设备数量。 要为 LS 光学鼠标启用远程唤醒,请运行以下命令:
要检查运行时状态,请运行以下命令:
要避免在组合切换中挂起,请通过运行以下命令删除活动的 UDC 以重新绑定组合:

软件功能

软件支持以下 USB 功能。 表: USB 软件功能

USB 架构

Qualcomm USB 软件架构大致由两个组件组成,一个基于纯上游,另一个是包含一些待处理功能相关变更的沙盒。纯上游直接从最新的稳定内核长期支持(LTS)6.6.2 版本中选取。该架构使用 Yocto(4.0 版)配方来创建二进制文件。 图:USB 软件架构/dev/ffs-xxx//dev/ffs-xxx//dev/ffs-xxx//sys/kernel/config/usb_gadget/…/sys/bus/usb/…Function driverFunction driverGadget frameworkconfigfs, UDC coreDevice controller driverClassdriverClassdriverUSB coreHost controller driverdwc3-qcomDWC3 core driversFemto phy driverQMP phy driverUCSIPMIC GLINKPM7325BaDSP corecharger firmwareVBUS, CC, D+,D-HSSS/sys/class/typec/port0/…Dual-role class driverType-C role swapdiag-routerport-bridgeadbd.serviceUSB peripheral mode configurationRuntime power management controlUser-space servicesVFSKernel-spaceType-C connector 沙盒使用以下特定于 Qualcomm 的功能实现。

USB 接口

USB 支持多种接口来传输音频、视频、调试信息和网络共享。以下每个 USB 接口通信协议都不同,除了标准 USB 协议外,还有自己的协议。
  • Android 调试桥(ADB)
  • 诊断(diag)
  • 大容量存储
  • 远程网络驱动程序接口规范(RNDIS)
    • RNDIS 是 Microsoft 为动态即插即用 I/O 总线(如 USB)上的网络设备开发的规范。
    • 内核驱动程序:它使用 f_rndis 驱动程序,该驱动程序存在于上游 Linux 内核中,直接与网络接口或堆栈通信。
  • 网络控制模型(NCM)
    • NCM 是一种协议,与 RNDIS 相比,旨在提供高级特性和功能。
    • 它通常出现在 USB 设备必须处理苛刻网络任务的应用中。
  • USB 音频类 2(UAC2)
    • UAC2 是控制 USB 音频设备与计算机之间通信的标准。
    • UAC2 支持更高的音频数据传输速率,从而改善音频质量并减少延迟。
  • USB 视频类(UVC)
    • UVC 是一种标准,定义了视频流设备(如网络摄像头)应如何使用 USB 与计算机通信。
    • UVC 便于视频设备的即插即用功能。

USB 工具

下表列出了一些常用的 USB 工具。 表: USB 工具和下载详情

配置 USB 引导加载程序

引导加载程序中用于调整高速和 SuperSpeed USB 信号质量的设备树参数可以使用 Qualcomm DeviceTree 编辑器(QDTE)工具进行修改。 QDTE 工具用于通过编辑 xbl_config.elf 文件来配置设备树二进制 Blob,如下图所示。有关如何配置设备树 Blob 的更多信息,请参见 QDTE 部分。Linux 主机上的设备树文件路径为 /boot_images/boot/Settings/Soc/<Chipset>/Core/WiredConnectivity/USB/usb.dtsi。 图:设备树布局 下表列出了用于调整 HS-USB PHY 和 SS USB PHY 信号质量的属性。 表: USB 配置属性

配置 USB 摄像头

Qualcomm Linux 设备为符合 USB 视频类(UVC)标准的 USB 网络摄像头提供驱动程序支持。Linux 内核的 uvcvideo 驱动程序支持摄像头。有关 uvcvideo 驱动程序的更多信息,请参见 https://www.kernel.org/doc/html/v4.19/media/v4l-drivers/uvcvideo.html。 uvcvideo 驱动程序将这些摄像头暴露为 V4L2 视频设备,可以通过字符设备节点(如 /dev/videoX)访问。 在用户空间中,应用程序可以使用 v4l2src GStreamer 插件管理 USB 摄像头,该插件与 Qualcomm 智能多媒体 SDK(IM SDK)一起提供。或者,Yavta(yet another V4L2 test application)等程序直接与 V4L2(Video4Linux2)接口交互以测试和控制摄像头设备。 如果目标上没有 YAVTA,请按照以下步骤交叉编译并安装它:
  1. 可以使用以下任一方法建立交叉编译环境。
    • 方法 1:要设置交叉编译环境,请运行以下命令。
    • 方法 2:要设置交叉编译环境,请运行以下命令:
      1. 下载交叉编译器。
      2. 解压交叉编译器。
      3. 运行以下命令为交叉编译设置环境。
  2. 克隆 Yavta 仓库并更改目录。
  3. 交叉编译该工具。
  4. 要将 Yavta 推送到 Qualcomm Linux 硬件 SoC,请执行以下操作:
    1. 在宽松模式下打开 SSH shell 或使用 ADB shell。有关如何运行 SSH 的更多信息,请参见 Use SSH 部分。
    2. 挂载文件系统。
    3. 使用 SCP 或类似工具传输文件。 例如,scp yavta root@10.92.162.185:/usr/bin
    4. 为 Yavta 分配执行权限。

前提条件:获取图像格式和大小

要通过 Yavta 或 GStreamer 配置 USB 摄像头,以下步骤是必需的。
  1. 要了解枚举详情,请插入 USB 摄像头并运行以下命令。
    将显示以下输出。
  2. 从串行控制台识别创建的 USB 摄像头视频节点 /dev/videoX。
    注意1-1/1-1:1.0 值根据连接的 USB 设备而变化。 将显示以下输出。
  3. 要使用 Yavta 查看支持的输出格式和大小,请运行以下命令:
    其中 X 值基于节点。 例如:
    将显示以下输出。
  4. 从第 3 步选择所需的图像格式和大小。

使用 Yavta 配置 USB 摄像头

前提条件:确保 Yavta 已交叉编译,并已识别输出格式和大小。
  • 要选择 MJPEG 格式(1280x720 输出大小、30 fps),在 /tmp/ 下捕获 10 帧,文件名为 testmjpeg-00000*.bin,请运行以下命令。
    将显示以下输出。
  • 要选择 YUV 格式(1280x960 输出大小、30 fps),在 /tmp/ 下捕获 10 帧,生成的文件名为 testyuv-00000*.bin,请运行以下命令。
    注意使用命令 #setenforce 0 启用宽松模式。 将显示以下输出。

在 Qualcomm IM SDK 中使用 GStreamer 配置 USB 摄像头

Qualcomm IM SDK 使用 GStreamer,一个开源的多媒体框架,用于在多媒体和机器学习领域公开简单的 API 和插件。有关安装 Qualcomm IM SDK 的信息,请参见 Getting Started 部分。 Qualcomm IM SDK 包括 v4l2src 插件,该插件允许从具有所选格式的 USB 摄像头输入。waylandsink 插件负责在 Wayland 显示器上渲染视频输出。 注意 前提条件:
  1. 要为 Wayland 显示器设置环境变量,请在串行控制台中运行以下命令。
  2. 使用 GStreamer 命令将视频从摄像头流式传输到 UI。确保您设置了适当的设备 ID (/dev/videoX) 并根据 USB 摄像头检测选择正确的格式。 注意在 GStreamer 中,YUYV 颜色格式称为 YUY2。因此,在设置管道时您必须指定 YUYV 格式,并在 caps 过滤器中使用 YUY2。
    • 对于 720p,运行以下命令:
      将显示以下输出。
    • 对于 1080p,运行以下命令:

自定义 USB 设备

本节描述 USB 软件中各种配置和自定义的要求。

具有 diag 和 ADB 接口的 USB 组合的示例 shell 脚本

使用 configfs 自定义

configfs 文件系统提供与 sysfs 功能相反的功能。多种接口可以配置 Linux USB gadget,每个接口代表一个 USB 功能。 这些接口的组合可以通过类似于上一节中启动 diag-adb 的命令进行枚举。 可用的 USB 组合如下。
  • A4A1 NCM
  • 4EE7 ADB
  • 900E DIAG
  • 901C DIAG + UAC2
  • 901D DIAG + ADB
  • 9015 MASS_STORAGE + ADB
  • 9024 RNDIS + ADB
  • 902A RNDIS + MASS_STORAGE
  • 902B RNDIS + ADB + MASS_STORAGE
  • 902C RNDIS + DIAG
  • 902D RNDIS + DIAG + ADB
  • 902F RNDIS + DIAG + MASS_STORAGE
  • 9060 DIAG + QDSS + ADB
  • 908C NCM + ADB
  • 90CA DIAG + UAC2 + ADB
  • 90CB DIAG + UVC + ADB
  • 90CC DIAG + UAC2 + UVC + ADB
  • 90DF DIAG + UVC
  • 90E0 DIAG + UAC2 + UVC
  • F000 MASS_STORAGE
  • F00E RNDIS

启用和配置 UVC 用例

USB 视频设备类(也称为 USB 视频类或 UVC)是一种 USB 设备类,描述能够流式传输视频的设备,例如网络摄像头、数字摄像机、转码器、模拟视频转换器和静态图像相机。 USB 视频类规范的最新版本为 v1.5。USB 实施者论坛在 v1.5 中描述了基本协议和不同的有效载荷格式。 注意Dragonwing IQ-9075 和 Dragonwing IQ-8275 不支持 UVC 用例。 测试 UVC 的工具和程序如下:
  • UVC gadget(设备端):这是一个用于测试 f_uvc 功能驱动程序的示例应用程序。它打开由 uvc_gadget 创建的视频节点,并以指定的帧速率发送 MJPEG 帧。此应用程序为 DUT 交叉编译。 注意确保主机上已安装交叉编译 64 位 Arm® 技术编译器所需的软件包和工具。
    1. 可以使用以下任一选项建立交叉编译环境。
      • 选项 A:运行以下命令。
      • 选项 B:要设置交叉编译环境,请运行以下命令:
        1. 下载交叉编译器。
        2. 解压交叉编译器。
        3. 运行以下命令为交叉编译设置环境。
    2. 要构建 UVC gadget 工具,请执行以下操作。
      1. 克隆 uvc-gadget 仓库。
      2. 修改 Makefile 以进行静态构建。
      3. 为 arm64 交叉编译以生成 uvc-gadget 可执行文件。
  • UVC viewer(主机端):要接收 UVC 数据,请在计算机上打开任何 USB 网络摄像头应用程序。
    1. 要验证,请将 UVC gadget 应用程序和示例图像文件推送到设备,请执行以下操作:
      1. 在宽松模式下打开 SSH shell 或使用 ADB shell。有关如何运行 SSH 的更多信息,请参见 Use SSH 部分。
      2. 挂载文件系统。
      3. 使用 SCP 或类似工具传输文件。 例如,scp uvc-gadget root@10.92.175.138:/usr/bin
      4. 分配执行权限。
    2. 更改为任何 UVC 组合(90DF 或 90CB)。
只有在用户空间视频应用程序打开时,USB 才会在 UVC 组合中枚举。要发生 USB 枚举,请通过控制台(串行控制台或 SSH shell 或使用 ADB shell)启动 uvc_gadget 应用程序。
  • YUYV
    1. 将 image-720.yuv 图像文件推送到 /root 或 /etc。
    2. 使用 uvc-gadget 工具验证 image-720.yuv 图像。
      • 其中 X 表示组合切换后创建的新视频节点
      • 其中 -f 是格式,值如下:
        • 0 = V4L2_PIX_FMT_YUYV
        • 1 = V4L2_PIX_FMT_MJPEG
  • MJPEG
    1. 将 image-720.jpg 图像文件推送到 /root 或 /etc。
    2. 使用 uvc-gadget 工具验证 image-720.jpg 图像。
      • 其中 X 表示组合切换后创建的新视频节点
      • 其中 -f 是 <format>,值如下:
        • 0 = V4L2_PIX_FMT_YUYV
        • 1 = V4L2_PIX_FMT_MJPEG
  • 有关用法信息,请运行以下命令。
    将显示以下输出。

UAC 用例

USB 音频使用同步、中断和控制传输。所有音频数据都使用同步传输进行传输。中断传输用于传递有关音频时钟可用性的信息,控制传输用于设置音量、请求采样率。 注意Dragonwing IQ-9075 和 Dragonwing IQ-8275 不支持 UAC 用例。 要验证,请选择具有 UAC 功能的 USB 组合。 要捕获或播放,请使用 rootfs 中提供的 tinyutils 应用程序,如 tinyplay/tinycap。当 UAC 驱动程序绑定成功时,该应用程序会打开 /dev/snd/ 中创建的 PCM 节点。 以下是一些示例命令。
  • 列出 Linux 主机上的声卡。
  • 播放音频文件。
    • 要将音频从设备播放到主机,请推送具有匹配音频配置的 file.wav 文件。以下是示例配置的示例。
      输出:
      输出:
      输出:
      输出:
      输出:
      输出:
      注意要修改音频配置,请在将 USB 组合建立为 90CA 之前调整上述参数。
    • 在 SSH shell 上运行以下命令或使用 ADB shell。
      将显示以下输出。
    • 在 Linux 主机上运行以下带有 arecord 等应用程序的命令来捕获音频。
  • 录制音频文件。
    • 在 Linux 主机上运行以下带有 aplay 等应用程序的命令来播放音频。
    • 在设备的 SSH shell 上运行以下命令或使用 ADB shell。
      将显示以下输出。

USB 电力传输中的数据角色交换

数据角色交换(DR_SWAP)是使用 USB Type-C 连接器在端口伙伴之间交换 DFP(主机)和 UFP(设备)角色。电源角色交换(PR_SWAP)在端口伙伴之间交换源和接收角色。 注意Dragonwing IQ-9075 和 Dragonwing IQ-8275 不支持使用 Type-C 连接器进行数据和电源角色交换。
  • 数据角色
    • 要将数据角色从主机切换到设备,请运行以下命令:
      将显示以下输出。
      将显示以下输出。
    • 要将数据角色从设备切换到主机,请运行以下命令:
      将显示以下输出。
      将显示以下输出。
  • 电源角色
    • 要将电源角色从接收切换到源,请运行以下命令:
      将显示以下输出。
      将显示以下输出。
    • 要将电源角色从源切换到接收,请运行以下命令:
      将显示以下输出。
      将显示以下输出。

验证 USB 设备

下表列出了验证 USB 设备和主机模式的各种方法。 表: USB 设备和主机模式验证

调试 USB 问题

本节介绍了获取调试日志的各种方法。调试方法包括 regdumps、调试 ftraces、configfs 节点。这些日志在调试低功耗模式进入-退出、SMMU 故障、无时钟访问等问题时,提供事件和控制器状态详情的可见性。 注意Dragonwing IQ-9075 和 Dragonwing IQ-8275 不支持 USB Type-C 功能。

跟踪 USB

debugfs 跟踪提供了对 USB 线路上每个事务的更深层次的视图。要查看跟踪列表,请运行以下命令。
注意确保已挂载 debugfs。如果未挂载,请运行以下命令挂载 debugfs。
以下是可用于验证 xHCI/gadget 堆栈/USB Type-C 连接器系统软件接口(UCSI)中数据传输的跟踪。
要列出 xHCI/主机控制器驱动程序(HCD)中的跟踪,请运行以下命令。
以下是可用于验证 xHCI/HCD 中数据传输的跟踪。
要列出 USB 视频类(UVC)gadget 驱动程序的可用事件,请运行以下命令。
将显示以下输出。
要列出 UCSI 驱动程序中的可用事件,请运行以下命令。
将显示以下输出。

USB regdump

USB debugfs 提供以下信息。 注意a600000.usb 地址因芯片组而异。
  • 操作模式。
    示例输出:
  • 设备模式下所有端点的状态和传输环缓冲区(TRB)队列。
  • 当前链路状态。
    示例输出。
  • 列表处理器(LSP)转储。
    示例输出:
示例输出:
regdump 命令提供以下寄存器的寄存器空间的当前状态:
  • 设备模式寄存器,如 DCTL、DSTS 和 DCFG
  • 全局寄存器,如 GCTL 和 GSTS
示例输出:

使用 sysfs 查看主机模式的文件系统属性

要查看总线详情,请运行以下命令。
示例输出:
要列出当前目录的内容,请运行以下命令。
示例输出:
要查看有关 USB 设备的详细信息,请运行以下命令。
示例输出:

USB 示例

QCS6490:https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts 有关 USB 驱动程序中的 RPM 更改和其他示例的信息,请参见 https://patchwork.kernel.org/project/linux-usb/list/?series=793939&archive=both。 有关如何扁平化设备树的信息,请参见 https://lore.kernel.org/all/af60c05b-4a0f-51b8-486a-1fc601602515@quicinc.com/ 和 https://lore.kernel.org/all/20231016-dwc3-refactor-v1-0-ab4a84165470@quicinc.com/。 \