> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# USB

通用串行总线（USB）是一项行业标准，允许在各类电子设备之间进行数据交换和电力传输。它可以以不同速度运行，例如 1.5 Mbps 的低速、12 Mbps 的全速、480 Mbps 的高速、5 Gbps 的 SuperSpeed 以及 10 Gbps 的 SuperSpeed Plus。

Qualcomm SoC 上的 USB 由 Synopsys DesignWare® Core SuperSpeed USB 3.x 驱动，并连接到两个 PHY：通过 UTMI 接口连接 USB2 PHY，通过 PIPE 接口连接 USB3 PHY。这些 PHY 连接到物理 Type-C 端口，实现与外部世界的通信。

以下是 USB 的关键硬件组件。

* **USB 控制器**
  * 主控制器是 Synopsys DesignWare Core SuperSpeed USB 3.x 控制器（Gen1/Gen2）。
    * 两个用于 USB SuperSpeed 和 DisplayPort 的 Qualcomm 多用途 PHY（QMP）实例。
    * 用于高速 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 规范的控制器，可配置为以下方式之一：
    * 仅外设（Peripheral-only）配置
    * 仅主机（Host-only）配置
    * 双角色（Dual-role）配置
  * 支持所有传输类型（控制、批量、中断和同步传输）
  * 支持 SuperSpeed 批量流（bulk streams）
  * 符合可扩展主机控制器接口（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**
  * 使用 PM7325B PD 控制器支持 USB Type-C 和电力传输（Power Delivery）。
  * 完全符合 USB Type-C 3.0 电力传输规范。
  * 在传输控制器确定所连接链路伙伴的 Type-C 方向、角色和模式后，支持根据 UCSI 框架更新 PM7325B 软件驱动。
  * 仅用于主 USB 控制器。

### **时钟**

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

**表：**

**USB 控制器时钟**

|                   **时钟名称**                   |                        **工作频率**                        |                                 **描述**                                |
| :------------------------------------------: | :----------------------------------------------------: | :-------------------------------------------------------------------: |
|    `gcc_usb30_prim_master_clk “core_clk”`    | <ul><li>200 MHz SuperSpeed</li><li>66 MHz 高速</li></ul> |                         与总线时钟异步；时钟频率在设备树节点中定义                         |
|  `gcc_cfg_noc_usb3_prim_axi_clk “iface_clk”` | <ul><li>200 MHz SuperSpeed</li><li>66 MHz 高速</li></ul> |                              辅助总线控制器单元时钟。                             |
| `gcc_aggre_usb3_prim_axi_clk “bus_aggr_clk”` | <ul><li>200 MHz SuperSpeed</li><li>66 MHz 高速</li></ul> |            馈入 `aggregator2` 模块的时钟，该模块控制从 USB AXI 到 NoC 的数据流           |
|   `gcc_usb30_prim_mock_utmi_clk “utmi_clk”`  |                        19.2 MHz                        | 内部控制器 `ref_clk`，用于在 USB 收发器宏单元接口（UTMI）/UTMI+ 低引脚接口（ULPI）挂起时生成 ITP 计数器 |
|    `gcc_usb30_prim_sleep_clk “sleep_clk”`    |                         32 kHz                         |                                  睡眠时钟                                 |
|       `gcc_usb3_sec_clkref_clk_en “xo”`      |                        19.2 MHz                        |                         HS-PHY 的外部参考时钟源（PMIC）                         |
|         `rpmh_cxo_clk “ref_clk_src”`         |                        19.2 MHz                        |                             HS-PHY 的参考时钟源                             |
|  `gcc_usb_phy_cfg_ahb2phy_clk “cfg_ahb_clk”` |                         100 MHz                        |                     AHB2PHY 模块所需的时钟（频率基于 PNoC 频率）。                    |

**表：**

**高速 PHY 时钟**

|                   **时钟名称**                  | **工作频率** |             **描述**            |
| :-----------------------------------------: | :------: | :---------------------------: |
|         `rpmh_cxo_clk “ref_clk_src”`        | 19.2 MHz |         HS-PHY 的参考时钟源         |
| `gcc_usb_phy_cfg_ahb2phy_clk “cfg_ahb_clk”` |  100 MHz | AHB2PHY 模块所需的时钟（频率基于 PNoC 频率） |

**表：**

**SuperSpeed PHY 时钟**

|                    **时钟名称**                   | **工作频率** |                 **描述**                 |
| :-------------------------------------------: | :------: | :------------------------------------: |
|     `gcc_usb3_prim_phy_aux_clk "aux_clk”`     | 19.2 MHz | 用于电源状态的 PHY 到 PCI express 接口（PIPE）辅助时钟 |
|    `gcc_usb3_prim_phy_pipe_clk “pipe_clk”`    |  125 MHz |      PIPE 的输入源，允许 PHY 与控制器之间的数据传输      |
|          `rpmh_cxo_clk "ref_clk_src"`         | 19.2 MHz |             `ref_clk` 的父时钟             |
|      `gcc_usb3_prim_clkref_clk "ref_clk"`     | 19.2 MHz |              SS-PHY 的参考时钟源             |
| `gcc_usb3_prim_phy_com_aux_clk "com_aux_clk"` | 19.2 MHz |                    –                   |

### **电压轨**

下表列出了高速（HighSpeed）和 SuperSpeed PHY 所需的电压轨。

**表：**

**USB 电压轨**

|  **电压轨**  | **电压等级（MAX/NOM/MIN）** | **设备模式** | **描述** |                      |                            |
| :-------: | :-------------------: | :------: | :----: | -------------------- | -------------------------- |
|  VREG L1C |          1.8          |    1.7   |    0   | 主和副 HS-PHY           | 系统中两个 HS-PHY 共用的 1.8 V 稳压器 |
|  VREG L2B |          3.3          |   3.05   |    0   | 主和副 HS-PHY           | 系统中两个 HS-PHY 共用的 3.3 V 稳压器 |
|  VREG L1B |         0.912         |   0.912  |    0   | SS-PHY               | SS-PHY VDD 内核              |
| VREG L10C |         0.880         |   0.880  |    0   | 主和副 HS‑PHY 以及 SS‑PHY | HS-PHY/SS‑PHY VDD 内核       |

**Dragonwing IQ-9075 USB 电压轨**

* HS PHY：L7A（0.88 V）、L6C（1.8 V）、L9A（3.3 V）
* SS PHY：L1C、L7A

### **中断**

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

**表：**

**USB 控制器中断**

|     **中断名称**    | **QCS6490 /QCS5430 中断** | **Dragonwing IQ-9075 中断** | **Dragonwing IQ-8275 中断** | **Dragonwing IQ-615 中断** | **中断事件 PDC 唤醒内核处理** | **描述** |     |     |         |                                                                                                                       |                                         |
| :-------------: | :---------------------: | :-----------------------: | :-----------------------: | :----------------------: | :-----------------: | :----: | --- | --- | ------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------- |
| `dp_hs_phy_irq` |            14           |           PDC14           |            PDC8           |           PDC10          |        PDC14        |  PDC10 | 9   | 10  | D+ 变化   | –                                                                                                                     | 仅在系统处于 VDD min/XO 关断时使用                 |
| `dm_hs_phy_irq` |            15           |           PDC15           |            PDC7           |           PDC9           |        PDC15        |  PDC9  | 8   | 11  | D- 变化   | –                                                                                                                     | 仅在系统处于 VDD min/XO 关断时使用                 |
|   `ss_phy_irq`  |            17           |           PDC12           |           PDC13           |             –            |        PDC12        |    –   | 6   | –   | LFPS 检测 | –                                                                                                                     | 仅在系统处于 VDD min/XO 关断时使用                 |
| `pwr_event_irq` |           130           |            287            |            352            |            444           |         131         |   444  | 130 | 663 | –       | USB PHY 电源状态变化 退出/进入 P3/L2                                                                                            | 当系统未处于电源塌陷（power collapse）时用作主要的控制器唤醒句柄 |
|    `core irq`   |           133           |            292            |            349            |            442           |         292         |   442  | 133 | 664 | –       | <ul><li>总线事件 <ul><li>挂起</li><li>恢复</li><li>复位</li></ul></li><li>控制器事件完成 <ul><li>传输完成</li><li>命令完成</li></ul></li></ul> | 处理所有 USB 控制器事件的主 USB 中断                 |

### **互连**

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

**表：**

**USB 互连**

| **互连名称** |                                                                                              **控制器**                                                                                              |                                                                                             **目标**                                                                                            |                                                                                                        **互连路径带宽（MBps）**                                                                                                       |
| :------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
|  USB-DDR | <ul><li>`MASTER_USB3_0`</li><li>Dragonwing IQ-9075 <ul><li>`MASTER_USB3_1`</li><li>`MASTER_USB2`</li></ul></li><li>Dragonwing IQ-8275、Dragonwing IQ-615 <ul><li>`MASTER_USB2`</li></ul></li></ul> |                                                                                          `SLAVE_EBI1`                                                                                         | <ul><li>USB\_MEMORY\_AVG\_HS\_BW MBps\_to\_icc(240)</li><li>USB\_MEMORY\_PEAK\_HS\_BW MBps\_to\_icc(700)</li><li>USB\_MEMORY\_AVG\_SS\_BW MBps\_to\_icc(1000)</li><li>USB\_MEMORY\_PEAK\_SS\_BW MBps\_to\_icc(2500)</li></ul> |
| APPS-USB |                                                                                        `MASTER_APPSS_PROC`                                                                                        | <ul><li>`SLAVE_USB3_0`</li><li>Dragonwing IQ-9075 <ul><li>`SLAVE_USB3_1`</li><li>`SLAVE_USB2`</li></ul></li><li>Dragonwing IQ-8275、Dragonwing IQ-615 <ul><li>`SLAVE_USB2`</li></ul></li></ul> |                                                                      <ul><li>APPS\_USB\_AVG\_BW 0</li><li>APPS\_USB\_PEAK\_BW MBps\_to\_icc(40)</li></ul>                                                                     |

### **使用时钟控制复位 USB 控制器**

下表列出了用于 USB 控制器和 PHY 的复位方法。

**表：**

**USB 时钟复位方法**

|                    **时钟名称**                   | **复位控制** |        **描述**        |
| :-------------------------------------------: | :------: | :------------------: |
| `GCC_USB3_DP_PHY_PRIM_BCR "global_phy_reset"` |  SS-PHY  |  复位 SS-PHY 控制和状态寄存器  |
|      `GCC_USB3_PHY_PRIM_BCR "phy_reset"`      |  SS-PHY  |       复位 SS-PHY      |
|      `GCC_QUSB2PHY_PRIM_BCR "phy_reset"`      |  HS-PHY  |       复位 HS-PHY      |
|       `GCC_USB30_PRIM_BCR "core_reset"`       |  USB 控制器 | 时钟控制器输出，用于复位 USB 控制器 |

### **使用寄存器进行 USB 控制器软件复位**

下表列出了用于复位 USB 控制器的寄存器选项。

**表：**

**USB 控制器复位**

| **USB 控制器寄存器** |      **USB 寄存器位域**      | **复位控制** |     **描述**     |
| :------------: | :---------------------: | :------: | :------------: |
|   DWC3\_DCTL   |    CSFTRST \[Bit 30]    |  USB 控制器 | 复位 USB 控制器设备栈。 |
|   DWC3\_GCTL   | CORESOFTRESET \[Bit 11] |     -    |  DWC3 控制器的全局复位 |

**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 控制器的知识产权（IP）和 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` 封装器（知识产权和软件驱动）内部，该封装器负责在探测（probe）、挂起或恢复状态期间管理所需资源（时钟、互连、中断、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/dwc3-qcom.c)。有关控制器核心驱动的信息，请参阅 [https://github.com/torvalds/linux/blob/master/drivers/usb/dwc3/core.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 Type-C 连接器系统软件接口作为库在 Linux 内核中提供。它定义了一组寄存器和数据结构，用于与系统上的 USB Type-C 连接器交互。平台上的 USB Type-C 连接器被称为平台策略管理器（PPM），系统软件组件被称为 OS 策略管理器（OPM）。
* Qualcomm 参考设计使用 UCSI `Glink` 驱动，通过 PMIC GLINK 处理应用处理器上的 OPM 与 PPM（即运行在远程子系统（aDSP）上的充电器固件）之间的通信。
* USB Type-C DisplayPort 备用模式（alternate mode）增加了支持额外线缆细节的能力，例如 DPAM 版本和线缆的信号方式。Qualcomm 参考设计支持通过 Type-C 使用 DisplayPort，并支持 USB SuperSpeed 与 DisplayPort 并发，DisplayPort 最多使用两条通道（两条通道用于 USB SuperSpeed，两条通道用于 DisplayPort）。
* USB Type-C 电力传输由 PM7325B PD 控制器支持，完全符合 USB PD 3.0 规范。通过 UCSI 接口，支持 USB 数据角色交换和电源角色交换。
  **注意**：Dragonwing IQ-9075 和 Dragonwing IQ-8275 不支持通过 Type-C 连接器进行数据和电源角色交换。
* 以下是相关驱动的参考链接：
  * [https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/usb/typec/ucsi/ucsi.c?h=v6.6.2](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/usb/typec/ucsi/ucsi.c?h=v6.6.2)
  * [https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/usb/typec/ucsi/ucsi\_glink.c?h=v6.6.2](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/usb/typec/ucsi/ucsi_glink.c?h=v6.6.2)
  * [https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/usb/typec/ucsi/displayport.c?h=v6.6.2](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/usb/typec/ucsi/displayport.c?h=v6.6.2)
  * [https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/phy/qualcomm/phy-qcom-qmp-combo.c?h=v6.6.2](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/phy/qualcomm/phy-qcom-qmp-combo.c?h=v6.6.2)
  * [https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/usb/dwc3/dwc3-qcom.c?h=v6.6.2](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/usb/dwc3/dwc3-qcom.c?h=v6.6.2)
  * [https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/soc/qcom/pmic\_glink.c?h=v6.6.2](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/soc/qcom/pmic_glink.c?h=v6.6.2)
  * [https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/soc/qcom/pmic\_glink\_altmode.c?h=v6.6.2](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/soc/qcom/pmic_glink_altmode.c?h=v6.6.2)

## **USB 特性**

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

**表：**

**USB 特性：Linux**

|      **特性**     |                         **描述**                         |
| :-------------: | :----------------------------------------------------: |
|  USB\_DWC3 控制器  |         Linux 内核默认支持 Synopsys DesignWare Core。         |
| USB\_DWC3\_QCOM | 使用 Synopsys DesignWare Core 实现 USB 功能的 `Qscratch` 封装器。 |
|   运行时电源管理（RPM）  |      Linux 通过软件驱动文件 `dwc3-qcom` 支持 RPM，用于低功耗模式操作。      |
|    低功耗模式（LPM）   |             LPM 提供来自 HS/SS-PHY 以及控制器的省电选项。             |
|       DRD       |               双角色设备检测允许 USB 同时工作在主机和设备模式。              |

### **运行时电源管理**

可以根据您的需求启用运行时电源管理功能。LPM 支持已作为 [https://lore.kernel.org/all/20231017131851.8299-1-quic\_kriskura@quicinc.com/](https://lore.kernel.org/all/20231017131851.8299-1-quic_kriskura@quicinc.com/) 的一部分添加。

**注意**：Dragonwing IQ-9075 和 Dragonwing IQ-8275 不支持 USB Type-A 端口的运行时电源管理。

默认情况下，运行时的 USB 挂起和恢复处于禁用状态。要启用这些功能，请运行以下命令：

```text theme={null}
echo auto > /sys/bus/platform/devices/a600000.usb/power/control
```

默认自动挂起延迟设置为 5 秒。要更改延迟，请运行以下 `sysfs` 命令：

```text theme={null}
echo 2000 > /sys/bus/platform/devices/a600000.usb/power/autosuspend_delay_ms
```

在角色切换期间，DWC3 控制器进入挂起状态、切换 GDSC 并复位控制器，以确保主机模式外设枚举成功。

在主机模式下，为使远程唤醒生效，需根据您的需求为 xHCI 接口、USB 根集线器和已连接的外设启用唤醒（wake-up）和自动挂起。

```text theme={null}
echo enabled > /sys/bus/platform/devices/xhci-hcd.X.auto/power/wakeup
cd /sys/bus/usb/devices/
echo enabled > usb1/power/wakeup
echo enabled > usb2/power/wakeup
```

**注意**：主机控制器驱动（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 光电鼠标启用远程唤醒，请运行以下命令：

```text theme={null}
cd /sys/bus/usb/devices/usb1/1-1/
echo auto > power/control
echo enabled > power/wakeup
```

要检查运行时状态，请运行以下命令：

```text theme={null}
cat /sys/bus/platform/devices/a600000.usb/power/runtime_status
```

为避免在组合（composition）切换中挂起，请通过运行以下命令移除活动的 UDC 以重新绑定组合：

```text theme={null}
echo on > /sys/bus/platform/devices/a600000.usb/power/control
echo auto > /sys/bus/platform/devices/a600000.usb/power/control
```

### **软件特性**

软件支持以下 USB 特性。

**表：**

**USB 软件特性**

|         **特性**         |                           **描述**                           |
| :--------------------: | :--------------------------------------------------------: |
|         外设 ADB         |                 ADB 功能通过 functionFS（FFS）集成                 |
|         外设大容量存储        |                     通用 Mass\_storage 功能                    |
|         外设 diag        |                      Diag 功能通过 FFS 集成                      |
|        外设 RNDIS        |                   符合 Linux 内核的标准 RNDIS 协议                  |
|    外设网络控制调制解调器（NCM）    |                    符合 Linux 内核的标准 NCM 协议                   |
|   主机 USB 3.0 驱动（xHCI）  |                    两个 USB 控制器均支持 xHCI 架构                   |
|        主机高速 USB        |                       主机模式下的高速 USB 检测                      |
|    主机 HID/MS/hub 驱动    |                         主机模式下的类驱动检测                        |
|         主机视频驱动         |                     UVC 已在有限的网络摄像头型号上验证                    |
|        主机链路电源管理        |                       USB 主机模式 LPM 实现                      |
|      外设 USB 链路电源管理     |                       USB 设备模式 LPM 实现                      |
|           DRD          |                     支持双角色设备（主机/设备模式支持）                     |
|       USB Type-C       | 由 PM7325B 支持；支持电流充电、CC 逻辑和 SuperSpeed USB 开关选择，均在嵌入式控制器中执行 |
| USB Type-C DisplayPort |  支持 SuperSpeed USB + DisplayPort 并发运行（2 条 DisplayPort 通道）  |
|    USB PD 2.0/3.0 充电   |             PD 支持取决于所使用的 PM7325B 方案。完全符合 PD 3.0            |
|      USB 3.1 Gen1      |               USB 控制器支持 USB 3.x Gen1（5 Gbps）。              |

## **USB 架构**

Qualcomm USB 软件架构大致由两个组件组成，一个基于纯上游（upstream），另一个是包含部分待合入特性相关更改的沙箱（sandbox）。纯上游部分直接取自最新的稳定内核长期支持版本（LTS）6.6.2。该架构使用 Yocto（4.0 版）配方（recipe）来创建二进制文件。

***图：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\_DWC3\_QCOM：主 glue 驱动，根据所连接的设备负责主机和设备两种模式下的 USB 功能。glue 驱动的设备树条目包含时钟、电源轨和中断等资源。该特性将 DWC3 核心驱动作为库使用，由后者控制 DWC3 控制器的实际功能。有关详细信息，请参阅 [https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/usb/dwc3/dwc3-qcom.c?h=v6.6.2](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/usb/dwc3/dwc3-qcom.c?h=v6.6.2)。
* Synopsys femto PHY：Qualcomm Synopsys femto PHY 是高速 USB PHY，负责控制 **D+**/**D-** 线路，并在实现数据传输的同时进行充电器检测。有关详细信息，请参阅 [https://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](https://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 组合 PHY：Qualcomm 多用途 PHY（QMP）DisplayPort 组合 PHY 为通用用途而设计。USB 的一个示例用例是 SuperSpeed 和 SuperSpeed-plus 功能，其中 **Rx+**/**Rx-** 和 **Tx+**/**Tx-** 可用于数据传输。当显示器可以占用一对通道用于镜像功能而 USB 以 SuperSpeed 工作时，该 PHY 支持显示备用模式。有关详细信息，请参阅 [https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/phy/qualcomm/phy-qcom-qmp-combo.c?h=v6.6.2](https://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 接口**

USB 支持多种接口来传输音频、视频、调试信息和网络共享。以下每种 USB 接口的通信协议各不相同，除标准 USB 协议外还各自拥有专属协议。

* Android 调试桥（ADB）
  * USB ADB 是一个调试接口，通过 USB 连接提供对系统的访问。有关 ADB 的更多信息，请参阅 [https://developer.android.com/tools/adb](https://developer.android.com/tools/adb)。
  * 这些文件名是 `dev` 节点的虚拟 `eps` 名称。有关 `f_fs.c` 的更多信息，请参阅 [https://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_fs.c?h=v6.6.2)。
  * 用户空间服务：用户空间守护进程 `adbd.service` 操作 ADB，负责在底层内核驱动与主机 PC 之间建立连接。
* 诊断（diag）
  * Diag 是一个诊断框架，用于从各个子系统收集日志数据并进行调试。Diag 数据通过 USB 传输到主机 PC。
  * 内核驱动：Diag 使用 `f_fs.c` 暴露 `/dev/ffs-diag` 节点，由用户空间服务对其进行各种操作。该 `dev` 节点包含以下三个文件：
    * `ep0`：控制操作
    * `ep1`：读取操作
    * `ep2`：写入操作
      这些文件名是 `dev` 节点的虚拟 `eps` 名称。有关 `f_fs.c` 的更多信息，请参阅 [https://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_fs.c?h=v6.6.2)。
* 大容量存储
  * 提供带大容量存储驱动的通用接口驱动，使设备可以充当通用存储设备。
  * 内核驱动：`mass_storage` 功能由 `f_mass_storage.c` 驱动管理。该驱动暴露 `dev node[revisit]`，由主机 PC 控制。有关大容量存储的更多信息，请参阅 [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](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)。
* 远程网络驱动接口规范（RNDIS）
  * RNDIS 是 Microsoft 为动态即插即用 I/O 总线（如 USB）上的网络设备开发的规范。
  * 内核驱动：它使用上游 Linux 内核中的 `f_rndis` 驱动，直接与网络接口或网络栈通信。
* 网络控制模型（NCM）
  * NCM 是一种协议，旨在提供比 RNDIS 更先进的特性和能力。
  * 它常见于 USB 设备必须处理高要求网络任务的应用中。
* USB 音频类 2（UAC2）
  * UAC2 是管理 USB 音频设备与计算机之间通信的标准。
  * UAC2 支持更高的音频数据传输速率，从而改善音频质量并降低延迟。
* USB 视频类（UVC）
  * UVC 是一项标准，定义了视频流设备（如网络摄像头）如何通过 USB 与计算机通信。
  * UVC 为视频设备提供即插即用功能。

## **USB 工具**

下表列出了几个常用的 USB 工具。

**表：**

**USB 工具及下载详情**

|     **USB 工具**     |                                                                                   **下载链接**                                                                                   |
| :----------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| 平台工具（adb/fastboot） |                          [https://developer.android.com/tools/releases/platform-tools](https://developer.android.com/tools/releases/platform-tools)                          |
|    USB 视频类（UVC）    | `LibUVC` <ul><li>[https://github.com/libuvc/libuvc](https://github.com/libuvc/libuvc)</li><li>[https://libuvc.github.io/libuvc/](https://libuvc.github.io/libuvc/)</li></ul> |
|     UVC gadget     |                                                   [https://github.com/wlhe/uvc-gadget](https://github.com/wlhe/uvc-gadget)                                                   |
|    UVC streamer    |                                         [https://github.com/bsapundzhiev/uvc-streamer](https://github.com/bsapundzhiev/uvc-streamer)                                         |
|   UVC Video4Linux  |           `v4l2-utils`：[https://linuxtv.org/downloads/v4l-dvb-apis/driver-api/v4l2-core.html](https://linuxtv.org/downloads/v4l-dvb-apis/driver-api/v4l2-core.html)          |

## **配置 USB 引导加载程序**

可以使用 Qualcomm DeviceTree 编辑器（QDTE）工具修改引导加载程序中用于调优高速和 SuperSpeed USB 信号质量的设备树参数。

QDTE 工具通过编辑 *xbl\_config.elf* 文件来配置设备树二进制 blob，如下图所示。有关如何配置设备树 blob 的更多信息，请参阅 [QDTE](https://docs.qualcomm.com/bundle/publicresource/topics/80-80021-4/tools.html#qdte) 部分。Linux 主机上的设备树文件路径为 */boot\_images/boot/Settings/Soc/\<Chipset>/Core/WiredConnectivity/USB/usb.dtsi*。

***图：设备树布局***

下表列出了用于调优 HS-USB PHY 和 SS USB PHY 信号质量的属性。

**表：**

**USB 配置属性**

|                  **属性名称**                 |              **属性描述**             |   **数据类型**   |                                                                                  **可能的值和取值范围**                                                                                  |                  **设备行为**                  |
| :---------------------------------------: | :-------------------------------: | :----------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------: |
|        `path=/soc/usb0/hs_phy_cfg`        |   调优主 USB 控制器 HS-PHY 的 USB 信号质量。  | UINT32-array | <ul><li>该属性是地址、值对 \<`addr`, `val`> 的数组</li><li>`addr` 长度为 4 字节。它可取 4 个值之一，范围：`[0x88E306C, 0x88E3070, 0x88E3074, 0x88E3078]`</li><li>`val` 长度为 1 字节，范围：`0x00` 到 `0xFF`</li></ul> |         改善主 USB HS-PHY 的 USB 信号质量。         |
|        `path=/soc/usb0/ss_phy_cfg`        |     改善主 USB 控制器 SS-PHY 的信号质量。     | UINT32-array |                 <ul><li>该属性是地址、值对 \<`addr`, `val`> 的数组</li><li>`addr` 长度为 4 字节。范围：`[0x088E8000, 0x088EB000]`</li><li>`val` 长度为 1 字节，范围：`0x00 `到 `0xFF`</li></ul>                |            改善主 USB SS-PHY 的信号质量。           |
|        `path=/soc/usb1/hs_phy_cfg`        |   改善副 USB 控制器 HS-PHY 的 USB 信号质量。  | UINT32-array |  <ul><li>该属性是地址、值对 \<`addr`, `val`> 的数组</li><li>`addr` 长度为 4 字节。它可取 4 个值之一，范围：`[0x88E406C,0x88E4070, 0x88E4074, 0x88E4078]`</li><li>`val` 长度为 1 字节，范围：`0x00` 到 `0xFF`</li></ul> |            改善副 USB HS-PHY 的信号质量。           |
| `Path = /sw/usb_config/fastboot_core_num` | 选择用于 Fastboot 的 USB 核心编号（主=0/副=1） |    UINT32    |                                                                                      0 或 1                                                                                      | 根据所选属性，Fastboot 设备在 USB core0 或 core1 上枚举。 |

## **配置 USB 摄像头**

Qualcomm Linux 设备为符合 USB 视频类（UVC）标准的 USB 网络摄像头提供驱动支持。Linux 内核的 `uvcvideo` 驱动支持摄像头。有关 `uvcvideo` 驱动的更多信息，请参阅 [https://www.kernel.org/doc/html/v4.19/media/v4l-drivers/uvcvideo.html](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 程序。要在主机设备上获取并交叉编译 Yavta，请执行以下操作：

1. 可以使用以下任一方法建立交叉编译环境。
   * 方法 1：要设置交叉编译环境，请运行以下命令。
     ```text theme={null}
     sudo apt install gcc-aarch64-linux-gnu
     ```
   * 方法 2：要设置交叉编译环境，请运行以下命令：
     1. 下载交叉编译器。
        ```text theme={null}
        wget https://releases.linaro.org/archive/14.07/components/toolchain/binaries/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux.tar.xz
        ```
     2. 解压交叉编译器。
        ```text theme={null}
        tar -xf gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux.tar.xz
        ```
     3. 通过运行以下命令设置交叉编译环境。
        ```text theme={null}
        export PATH=$PATH:`pwd`/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin
        ```
2. 克隆 Yavta 仓库并切换目录。
   ```text theme={null}
   git clone https://github.com/fastr/yavta.git
   cd yavta
   ```
3. 交叉编译该工具。
   ```text theme={null}
   make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
   ```
4. 要将 Yavta 推送到 Qualcomm Linux 硬件 SoC，请执行以下操作：
   1. 以宽容（permissive）模式打开 SSH shell 或使用 ADB shell。有关如何运行 SSH 的更多信息，请参阅[使用 SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-80021-254/how_to.html) 部分。
   2. 挂载文件系统。
      ```text theme={null}
      mount -o remount,rw /usr
      ```
   3. 使用 SCP 或类似工具传输文件。
      例如，`scp yavta root@10.92.162.185:/usr/bin`
   4. 为 Yavta 分配执行权限。
      ```text theme={null}
      chmod 0777 /usr/bin/yavta
      ```

### **前提条件：获取图像格式和尺寸**

无论是通过 Yavta 还是 GStreamer 配置 USB 摄像头，以下步骤都是必需的。

1. 要了解枚举详情，请插入 USB 摄像头并运行以下命令。
   ```text theme={null}
   lsusb
   ```
   将显示以下输出。
   ```text theme={null}
   Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
   Bus 001 Device 002: ID 03f0:0959 HP, Inc w200
   Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
   ```
2. 从串行控制台识别创建为 */dev/videoX* 的 USB 摄像头视频节点。
   ```text theme={null}
   ls /sys/bus/usb/devices/1-1/1-1:1.0/video4linux/
   ```
   **注意**：`1-1/1-1:1.0` 值会根据所连接的 USB 设备而变化。
   将显示以下输出。
   ```text theme={null}
   video4	video5
   ```
3. 要使用 Yavta 查看支持的输出格式和尺寸，请运行以下命令：
   ```text theme={null}
   yavta /dev/video*X* --enum-formats
   ```
   其中 `X` 值取决于节点。
   例如：
   ```text theme={null}
   yavta /dev/video4 --enum-formats
   ```
   将显示以下输出。
   ```text theme={null}
   Device /dev/video*X* opened: w200: w200 (usb-xhci-hcd.2.auto-1).
   - Available formats:
   	Format 0: MJPG (47504a4d)
   	Type: Video capture (1)
   	Name: Motion-JPEG
   	Frame size: 1280x720 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
   	Frame size: 800x600 (1/30)
   	Frame size: 640x480 (1/30)
   	Frame size: 320x240 (1/30)
   	Format 1: YUYV (56595559)
   	Type: Video capture (1)
   	Name: YUYV 4:2:2
   	Frame size: 1280x720 (1/10)
   	Frame size: 800x600 (1/15)
   	Frame size: 640x480 (1/30)
   	Frame size: 320x240 (1/30)
   ```
4. 从步骤 3 中选择所需的图像格式和尺寸。

### **使用 Yavta 配置 USB 摄像头**

**前提条件**：确保已交叉编译 Yavta，并已确定输出格式和尺寸。

* 要选择 1280x720 输出尺寸、30 fps 的 MJPEG 格式，在 */tmp/* 下捕获 10 帧、文件名为 *testmjpeg-00000\*.bin*，请运行以下命令。
  ```text theme={null}
  cd /usr/bin
  ```
  ```text theme={null}
  yavta -f MJPEG -s 1280x720 -t 1/30 -c10 -F/tmp/testmjpeg /dev/video*X*
  ```
  将显示以下输出。
  ```text theme={null}
  Device /dev/video*X* opened: w200: w200 (usb-xhci-hcd.2.auto-1).
  Video format set: width: 1280 height: 720 buffer size: 1843789
  Video format: MJPG (47504a4d) 1280x720
  Current frame rate: 1/30
  Setting frame rate to: 1/30
  Frame rate set: 1/30
  8 buffers requested.
  length: 1843789 offset: 0
  Buffer 0 mapped at address 0x7fabd5d000.
  length: 1843789 offset: 1847296
  Buffer 1 mapped at address 0x7fabb9a000.
  length: 1843789 offset: 3694592
  Buffer 2 mapped at address 0x7fab9d7000.
  length: 1843789 offset: 5541888
  Buffer 3 mapped at address 0x7fab814000.
  length: 1843789 offset: 7389184
  Buffer 4 mapped at address 0x7fab651000.
  length: 1843789 offset: 9236480
  Buffer 5 mapped at address 0x7fab48e000.
  length: 1843789 offset: 11083776
  Buffer 6 mapped at address 0x7fab2cb000.
  length: 1843789 offset: 12931072
  Buffer 7 mapped at address 0x7fab108000.
  0 (0) [-] 0 57672 bytes 2459.697791 315967245.973463
  1 (1) [-] 1 40816 bytes 2459.730553 315967246.005839
  2 (2) [-] 2 40472 bytes 2459.763517 315967246.039485
  3 (3) [-] 3 41272 bytes 2459.797002 315967246.073073
  4 (4) [-] 4 42232 bytes 2459.830192 315967246.105592
  5 (5) [-] 5 46024 bytes 2459.863253 315967246.139142
  6 (6) [-] 6 47440 bytes 2459.896755 315967246.172384
  7 (7) [-] 7 48840 bytes 2459.930006 315967246.205114
  8 (0) [-] 8 50248 bytes 2459.963235 315967246.238308
  9 (1) [-] 9 53136 bytes 2459.996526 315967246.272690
  Captured 9 frames in 0.300183 seconds (29.981711 fps, 1559555.337911 B/s).
  8 buffers released.
  ```
* 要选择 1280x960 输出尺寸、30 fps 的 YUV 格式，在 */tmp/* 下捕获 10 帧，生成的文件名为 *testyuv-00000\*.bin*，请运行以下命令。
  ```text theme={null}
  yavta -f YUYV -s 1280x720 -t 1/30 -c10 -F/tmp/testyuv /dev/video*X*
  ```
  **注意**：使用命令 `#setenforce 0` 启用宽容（Permissive）模式。
  将显示以下输出。
  ```text theme={null}
  Device /dev/video*X* opened: w200: w200 (usb-xhci-hcd.2.auto-1).
  Video format set: width: 1280 height: 720 buffer size: 1843200
  Video format: YUYV (56595559) 1280x720
  Current frame rate: 1/10
  Setting frame rate to: 1/10
  Frame rate set: 1/10
  8 buffers requested.
  length: 1843200 offset: 0
  Buffer 0 mapped at address 0x7f9853e000.
  length: 1843200 offset: 1843200
  Buffer 1 mapped at address 0x7f9837c000.
  length: 1843200 offset: 3686400
  Buffer 2 mapped at address 0x7f981ba000.
  length: 1843200 offset: 5529600
  Buffer 3 mapped at address 0x7f97ff8000.
  length: 1843200 offset: 7372800
  Buffer 4 mapped at address 0x7f97e36000.
  length: 1843200 offset: 9216000
  Buffer 5 mapped at address 0x7f97c74000.
  length: 1843200 offset: 11059200
  Buffer 6 mapped at address 0x7f97ab2000.
  length: 1843200 offset: 12902400
  Buffer 7 mapped at address 0x7f978f0000.
  0 (3) [-] 3 1843200 bytes 2536.837027 315967323.172707
  1 (4) [-] 4 1843200 bytes 2536.937122 315967323.273059
  2 (6) [-] 6 1843200 bytes 2537.136830 315967323.472473
  3 (7) [-] 7 1843200 bytes 2537.237183 315967323.572533
  4 (2) [-] 17 1843200 bytes 2538.237266 315967324.571848
  5 (2) [-] 24 1843200 bytes 2538.936539 315967325.271919
  6 (3) [-] 25 1843200 bytes 2539.036550 315967325.372403
  Warning: bytes used 0 != image size 1843200
  7 (7) [E] 28 0 bytes 2539.336529 3159  325.609436
  Warning: bytes used 0 != image size 1843200
  8 (0) [E] 22 0 bytes 2538.737975 315967325.610149
  Warning: bytes used 0 != image size 1843200
  9 (1) [E] 23 0 bytes 2538.837814 315967325.610622
  Captured 9 frames in 2.438312 seconds (3.691078 fps, 5291529.549951 B/s).
  8 buffers released.
  ```

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

Qualcomm IM SDK 使用 [GStreamer](https://gstreamer.freedesktop.org/)（一个开源多媒体框架）在多媒体和机器学习领域提供易用的 API 和插件。有关安装 Qualcomm IM SDK 的信息，请参阅[快速入门](https://docs.qualcomm.com/bundle/publicresource/topics/80-80021-51/install-sdk.html)部分。

Qualcomm IM SDK 包含 `v4l2src` 插件，它允许以选定格式接收来自 USB 摄像头的输入。`waylandsink` 插件负责在 Wayland 显示器上渲染视频输出。

**注意：前提条件：**

* 确保已交叉编译 Yavta，并已确定输出格式和尺寸。
* 要下载或更新固件，请参阅[下载 PCIe 转 USB 控制器固件](https://docs.qualcomm.com/doc/80-80021-8/topic/pcie.html?product=895724676033554725\&facet=Interfaces\&version=2.0-rc2#pcie-software-support-for-usb__section_j5l_2jx_4bc)。

1. 要为 Wayland 显示器设置环境变量，请在串行控制台中运行以下命令。
   ```text theme={null}
   export XDG_RUNTIME_DIR=/dev/socket/weston && export WAYLAND_DISPLAY=wayland-1
   ```
2. 使用 GStreamer 命令将摄像头视频流传输到 UI。确保设置了正确的设备 ID（`/dev/videoX`），并根据 USB 摄像头检测结果选择正确的格式。
   **注意**：在 GStreamer 中，YUYV 颜色格式被称为 YUY2。因此，在设置管线时必须指定 YUYV 格式，并在 caps filter 中使用 **YUY2**。
   * 对于 720p，请运行以下命令：
     ```text theme={null}
     gst-launch-1.0 -e v4l2src io-mode=dmabuf-import device="/dev/video0" ! video/x-raw,format=YUY2,width=1280,height=720,framerate=10/1 ! waylandsink fullscreen=true
     ```
     将显示以下输出。
     ```text theme={null}
     Y2,width=1280,height=720,framerate=10/1 ! waylandsink fullscreen=true
     Setting pipeline to PAUSED ...
     I/Adreno-UNKNOWN (1985,1985): <ReadGpuID:357>: Reading chip ID through GSL
     GBM_INFO::msmgbm_mapper(262)::gbm mapper instantiated
     gbm_create_device(224): Info: backend name is: msm_drm
     Pipeline is live and does not need PREROLL ...
     Pipeline is PREROLLED ...
     Setting pipeline to PLAYING ...
     New clock: GstSystemClock
     gbm_create_device(224): Info: backend name is: msm_drm
     GBM_ERR::msmgbm_bo_create(870)::DRM_IOCTL_PRIME_FD_TO_HANDLE failed for data fd errono: 22 (Invalid argument) drm fd: 24 data fd: 26
      GBM_ERR::msmgbm_bo_create(923)::DRM_IOCTL_PRIME_FD_TO_HANDLE failed for metadata fd errono: 22 (Invalid argument) drm fd: 24 metadata fd: 27
     GBM_ERR::msmgbm_bo_create(870)::DRM_IOCTL_PRIME_FD_TO_HANDLE failed for data fd errono: 22 (Invalid argument) drm fd: 24 data fd: 29
     GBM_ERR::msmgbm_bo_create(923)::DRM_IOCTL_PRIME_FD_TO_HANDLE failed for metadata fd errono: 22 (Invalid argument) drm fd: 24 metadata fd: 30
     GBM_ERR::msmgbm_bo_create(870)::DRM_IOCTL_PRIME_FD_TO_HANDLE failed for data fd errono: 22 (Invalid argument) drm fd: 24 data fd: 32
     GBM_ERR::msmgbm_bo_create(923)::DRM_IOCTL_PRIME_FD_TO_HANDLE failed for metadata fd errono: 22 (Invalid argument) drm fd: 24 metadata fd: 33
     GBM_ERR::msmgbm_bo_create(870)::DRM_IOCTL_PRIME_FD_TO_HANDLE failed for data fd errono: 22 (Invalid argument) drm fd: 24 data fd: 35
     GBM_ERR::msmgbm_bo_create(923)::DRM_IOCTL_PRIME_FD_TO_HANDLE failed for metadata fd errono: 22 (Invalid argument) drm fd: 24 metadata fd: 36
     Redistribute latency...
     0:00:47.7 / 99:99:99.
     ```
   * 对于 1080p，请运行以下命令：
     ```text theme={null}
     gst-launch-1.0 -e v4l2src io-mode=dmabuf-import device="/dev/video0" ! video/x-raw,format=YUY2,width=1920,height=1080,framerate=5/1 ! waylandsink fullscreen=true
     ```

## **自定义 USB 设备**

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

### **包含 diag 和 ADB 接口的 USB 组合示例 shell 脚本**

```text theme={null}
cd /sys/kernel/config/usb_gadget/adb
echo on > /sys/bus/platform/devices/a600000.usb/power/control
echo "" > UDC
mkdir functions/ffs.diag
echo "QCOM" > strings/0x409/manufacturer
echo 0x05c6 > idVendor
echo 0x901d > idProduct
echo "Diag_ADB" > configs/c.1/strings/0x409/configuration

if [ ! -d /dev/ffs-diag ]; then
mkdir -p /dev/ffs-diag
fi
if [ ! -e /dev/ffs-diag/ep0 ]; then
mount -o uid=2000,gid=2000 -t functionfs diag /dev/ffs-diag
fi

/usr/bin/diag-router &

cd configs/c.1
rm -r ffs.usb0
ln -s ../../functions/ffs.diag f1
ln -s ../../functions/ffs.usb0 f2
cd ../../ udcname=`ls -1 /sys/class/udc | head -n 1`
echo $udcname > UDC
echo auto > /sys/bus/platform/devices/a600000.usb/power/control
```

### **通过 QUSB 服务更改 USB 组合**

`usb.service` 在 */usr/bin/qusb* 处启动 QUSB 服务，为用户提供配置 USB gadget 的灵活性。它完全免除了通过 `configfs` 手动执行命令来初始化 USB 的麻烦。

**前提条件**：通过运行以下命令启用 SELinux。

```text theme={null}
setenforce 0
```

示例：

```text theme={null}
qusb [bind] [unbind] [showpid] [help]
                     [setpid [-p] <PID>] [persist <PID>]
```

### **启用和配置 UVC 用例**

USB 视频设备类（亦称 USB 视频类或 UVC）是一种 USB 设备类，用于描述能够进行视频流传输的设备，例如网络摄像头、数码摄像机、转码器、模拟视频转换器和静态图像相机。

USB 视频类规范的最新修订版为 v1.5。USB 实施者论坛（USB implementers forum）在 v1.5 中描述了基本协议和不同的负载格式。

**注意**：Dragonwing IQ-9075 和 Dragonwing IQ-8275 不支持 UVC 用例。

测试 UVC 的工具和流程如下：

* **UVC gadget**（设备侧）：这是一个用于测试 `f_uvc` 功能驱动的示例应用程序。它打开由 `uvc_gadget` 创建的视频节点，并以指定的帧率发送 MJPEG 帧。该应用程序需为 DUT 交叉编译。
  **注意**：确保主机上已安装交叉编译 64 位 Arm® 技术编译器所需的软件包和工具。
  1. 可以使用以下任一选项建立交叉编译环境。
     * 选项 **A**：运行以下命令。
       ```text theme={null}
       sudo apt install gcc-aarch64-linux-gnu
       ```
     * 选项 **B**：要设置交叉编译环境，请运行以下命令：
       1. 下载交叉编译器。
          ```text theme={null}
          wget https://releases.linaro.org/archive/14.07/components/toolchain/binaries/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux.tar.xz
          ```
       2. 解压交叉编译器。
          ```text theme={null}
          tar -xf gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux.tar.xz
          ```
       3. 通过运行以下命令设置交叉编译环境。
          ```text theme={null}
          export PATH=$PATH:`pwd`/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin
          ```
  2. 要构建 UVC gadget 工具，请执行以下操作。
     1. 克隆 `uvc-gadget` 仓库。
        ```text theme={null}
        git clone https://github.com/wlhe/uvc-gadget.git
        cd uvc-gadget
        ```
     2. 修改 `Makefile` 以进行静态构建。
        ```text theme={null}
        git diff
        diff --git a/Makefile b/Makefile
        index ccf5a34..5be54cc 100644
        --- a/Makefile
        +++ b/Makefile
        @@ -2,7 +2,7 @@ CROSS_COMPILE   ?=
         ARCH           ?= x86
         KERNEL_DIR     ?= /usr/src/linux
        -CC             := $(CROSS_COMPILE)gcc
        +CC             := $(CROSS_COMPILE)gcc -static
         KERNEL_INCLUDE := -I$(KERNEL_DIR)/include -I$(KERNEL_DIR)/arch/$(ARCH)/include
         CFLAGS         := -W -Wall -g $(KERNEL_INCLUDE)
         LDFLAGS                := -g
        ```
     3. 为 `arm64` 交叉编译以生成 `uvc‑gadget` 可执行文件。
        ```text theme={null}
        make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
        ```
* **UVC 查看器**（主机侧）：要接收 UVC 数据，请在计算机上打开任意 USB 网络摄像头应用程序。
  1. 要进行验证，将 UVC gadget 应用程序和示例图像文件推送到设备，请执行以下操作：
     1. 以宽容模式打开 SSH shell 或使用 ADB shell。有关如何运行 SSH 的更多信息，请参阅[使用 SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-80021-254/how_to.html) 部分。
     2. 挂载文件系统。
        ```text theme={null}
        mount -o remount,rw /usr
        ```
     3. 使用 SCP 或类似工具传输文件。
        例如，`scp uvc-gadget root@10.92.175.138:/usr/bin`
     4. 分配执行权限。
        ```text theme={null}
        chmod 0777 /usr/bin/uvc-gadget
        ```
  2. 切换到任意 UVC 组合（90DF 或 90CB）。例如，
     ```text theme={null}
     qusb setpid 90CB
     ```

只有当用户空间视频应用程序打开时，USB 才会以 UVC 组合枚举。要触发 USB 枚举，请通过控制台（串行控制台或 SSH shell，或使用 ADB shell）启动 `uvc_gadget` 应用程序。

* YUYV
  1. 将 `image-720.yuv` 图像文件推送到 `/root` 或 `/etc`。
     ```text theme={null}
     scp image-720.yuv root@10.92.175.138:/root
     ```
  2. 使用 `uvc-gadget` 工具验证 `image-720.yuv` 图像。
     ```text theme={null}
     uvc-gadget -u /dev/videoX -i /root/image-720.yuv -s 2 -m 2 -n 32  -t 10 -f 0
     ```
     * 其中 `X` 表示组合切换后创建的新视频节点
     * 其中 `-f` 为格式，取值如下：
       * `0` = V4L2\_PIX\_FMT\_YUYV
       * `1` = V4L2\_PIX\_FMT\_MJPEG
* MJPEG
  1. 将 `image-720.jpg` 图像文件推送到 `/root` 或 `/etc`。
     ```text theme={null}
     scp image-720.jpg root@10.92.175.138:/root
     ```
  2. 使用 `uvc-gadget` 工具验证 `image-720.jpg` 图像。
     ```text theme={null}
     uvc-gadget -u /dev/videoX -i /root/image-720.jpg -s 2 -m 2 -n 32  -t 10 -f 1
     ```
     * 其中 `X` 表示组合切换后创建的新视频节点
     * 其中 `-f` 为 \<format>，取值如下：
       * `0` = V4L2\_PIX\_FMT\_YUYV
       * `1` = V4L2\_PIX\_FMT\_MJPEG
* 有关用法信息，请运行以下命令。
  ```text theme={null}
  ./uvc-gadget -h
  ```
  将显示以下输出。
  ```text theme={null}
  Usage: uvc-gadget [options]
  Available options are
  -b             Use bulk mode
  -d             Do not use any real V4L2 capture device
  -f <format>    Select frame format
          0 = V4L2_PIX_FMT_YUYV
          1 = V4L2_PIX_FMT_MJPEG
  -h             Print this help screen and exit
  -i image       MJPEG image
  -m             Streaming mult for ISOC (b/w 0 and 2)
  -n             Number of Video buffers (b/w 2 and 32)
  -o <IO method> Select UVC IO method:
          0 = MMAP
          1 = USER_PTR
  -r <resolution> Select frame resolution:
          0 = 360p, VGA (640x360)
          1 = 720p, WXGA (1280x720)
  -s <speed>     Select USB bus speed (b/w 0 and 2)
          0 = Full Speed (FS)
          1 = High Speed (HS)
          2 = Super Speed (SS)
  -t             Streaming burst (b/w 0 and 15)
  -u device      UVC Video Output device
  -v device      V4L2 Video Capture device
  ```

### **UAC 用例**

USB 音频使用同步、中断和控制传输。所有音频数据均使用同步传输方式传输。中断传输用于传递音频时钟可用性的相关信息，控制传输用于设置音量和请求采样率。

**注意**：Dragonwing IQ-9075 和 Dragonwing IQ-8275 不支持 UAC 用例。

要进行验证，请选择包含 UAC 功能的 USB 组合。

```text theme={null}
qusb setpid 90CA
```

要进行捕获或播放，请使用 `rootfs` 中提供的 `tinyutils` 应用程序，例如 `tinyplay/tinycap`。当 UAC 驱动绑定成功后，该应用程序会打开在 `/dev/snd/` 中创建的 PCM 节点。

以下是一些示例命令。

* 在 Linux 主机上列出声卡。
  ```text theme={null}
  arecord -L 
  aplay -f S16_LE -r 44100 -c 2 -D front:CARD=qcs6490rb3gen2v,DEV=0 441k_16bit_5min_m1dB.wav
  ```
* 播放音频文件。
  * 要从设备向主机播放音频，请推送具有匹配音频配置的 `file.wav` 文件。以下是示例配置。
    ```text theme={null}
    cat /sys/kernel/config/usb_gadget/adb/functions/uac2.0/p_chmask
    ```
    输出：
    ```text theme={null}
    3
    ```
    ```text theme={null}
    cat /sys/kernel/config/usb_gadget/adb/functions/uac2.0/c_chmask
    ```
    输出：
    ```text theme={null}
    3
    ```
    ```text theme={null}
    cat /sys/kernel/config/usb_gadget/adb/functions/uac2.0/p_srate
    ```
    输出：
    ```text theme={null}
    48000
    ```
    ```text theme={null}
    cat /sys/kernel/config/usb_gadget/adb/functions/uac2.0/c_srate
    ```
    输出：
    ```text theme={null}
    64000
    ```
    ```text theme={null}
    cat /sys/kernel/config/usb_gadget/adb/functions/uac2.0/p_ssize
    ```
    输出：
    ```text theme={null}
    2
    ```
    ```text theme={null}
    cat /sys/kernel/config/usb_gadget/adb/functions/uac2.0/c_ssize
    ```
    输出：
    ```text theme={null}
    2
    ```
    **注意**：要修改音频配置，请在将 USB 组合设置为 90CA 之前调整上述参数。
  * 在 SSH shell 上运行以下命令，或使用 ADB shell。
    ```text theme={null}
    tinyplay
    ```
    将显示以下输出。
    ```text theme={null}
    Usage: tinyplay file.wav [-D card] [-d device] [-p period_size] [-n n_periods]
    ```
  * 在 Linux 主机上使用 `arecord` 等应用程序运行以下命令以捕获音频。
    ```text theme={null}
    arecord -f S16_LE -r 44100 -c 2 -D front:CARD=qcs6490rb3gen2v,DEV=0 test1.wav
    ```
* 录制音频文件。
  * 在 Linux 主机上使用 `aplay` 等应用程序运行以下命令以播放音频。
    ```text theme={null}
    aplay -f S16_LE -r 44100 -c 2 -D front:CARD=qcs6490rb3gen2v,DEV=0 441k_16bit_5min_m1dB.wav
    ```
  * 在设备的 SSH shell 上运行以下命令，或使用 ADB shell。
    ```text theme={null}
    tinycap
    ```
    将显示以下输出。
    ```text theme={null}
    Usage: tinycap file.wav [-D card] [-d device] [-c channels] [-r rate] [-b bits] [-a 	bits_packed] [-p period_size] [-n n_periods] [-T capture time]
    ```

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

数据角色交换（DR\_SWAP）是使用 USB Type-C 连接器在端口伙伴之间交换 DFP（主机）和 UFP（设备）角色。电源角色交换（PR\_SWAP）在端口伙伴之间交换源（source）和汇（sink）角色。

**注意**：Dragonwing IQ-9075 和 Dragonwing IQ-8275 不支持使用 Type-C 连接器进行数据和电源角色交换。

* 数据角色
  * 要将数据角色从主机交换为设备，请运行以下命令：
    ```text theme={null}
    cat /sys/class/typec/port0/data_role
    ```
    将显示以下输出。
    ```text theme={null}
    [host] device
    ```
    ```text theme={null}
    echo device > /sys/class/typec/port0/data_role
    cat /sys/class/typec/port0/data_role
    ```
    将显示以下输出。
    ```text theme={null}
    host [device]
    ```
  * 要将数据角色从设备交换为主机，请运行以下命令：
    ```text theme={null}
    cat /sys/class/typec/port0/data_role
    ```
    将显示以下输出。
    ```text theme={null}
    host [device]
    ```
    ```text theme={null}
    echo host > /sys/class/typec/port0/data_role
    cat /sys/class/typec/port0/data_role
    ```
    将显示以下输出。
    ```text theme={null}
    [host] device
    ```
* 电源角色
  * 要将电源角色从汇交换为源，请运行以下命令：
    ```text theme={null}
    cat /sys/class/typec/port0/power_role
    ```
    将显示以下输出。
    ```text theme={null}
    source [sink]
    ```
    ```text theme={null}
    echo source > /sys/class/typec/port0/power_role
    cat /sys/class/typec/port0/power_role
    ```
    将显示以下输出。
    ```text theme={null}
    [source] sink
    ```
  * 要将电源角色从源交换为汇，请运行以下命令：
    ```text theme={null}
    cat /sys/class/typec/port0/power_role
    ```
    将显示以下输出。
    ```text theme={null}
    [source] sink
    ```
    ```text theme={null}
    echo sink > /sys/class/typec/port0/power_role
    cat /sys/class/typec/port0/power_role
    ```
    将显示以下输出。
    ```text theme={null}
    source [sink]
    ```

### **使用 configfs 进行自定义**

`configfs` 文件系统提供与 `sysfs` 相反的功能。多种接口可以配置 Linux USB gadget，每个接口代表一个 USB 功能。

`qusb` 可执行文件使用以下命令配置 `configfs` USB gadget。

1. 创建 `configfs` 并挂载 `functionfs`。
   ```text theme={null}
   qusb init
   ```
2. 启动 `adbd/diag` 服务。
3. 将 `configfs` 与 USB gadget 应用程序绑定。
   ```text theme={null}
   qusb bind
   ```
4. 停止或解绑 USB gadget 应用程序。
   ```text theme={null}
   qusb unbind
   ```
5. 设置 diag 和 ADB 组合。
   ```text theme={null}
   qusb setpid 901D
   ```
6. 列出可用的 USB 组合。
   ```text theme={null}
   qusb showpid
   ```
   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`

## **验证 USB 设备**

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

**表：**

**USB 设备和主机模式验证**

|     **USB 模式**    |                                                                                                                                                                                            **特性**                                                                                                                                                                                           |             **描述**            |
| :---------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------: |
|      USB 设备模式     |                                                                                                                                                                                             ADB                                                                                                                                                                                             |     默认情况下，USB 以纯 ADB 组合枚举。    |
|        Diag       | 请参阅[包含 diag 和 ADB 接口的 USB 组合示例 shell 脚本](https://docs.qualcomm.com/doc/80-80021-8/topic/usb.html?product=895724676033554725\&facet=Interfaces\&version=2.0-rc2#usb-customization__section_y3t_dhl_j1c)和[通过 QUSB 服务更改 USB 组合](https://docs.qualcomm.com/doc/80-80021-8/topic/usb.html?product=895724676033554725\&facet=Interfaces\&version=2.0-rc2#usb-customization__section_nqf_ghl_j1c)。 |                               |
|       大容量存储       |                                                                                    更改 USB 组合（请参阅[通过 QUSB 服务更改 USB 组合](https://docs.qualcomm.com/doc/80-80021-8/topic/usb.html?product=895724676033554725\&facet=Interfaces\&version=2.0-rc2#usb-customization__section_nqf_ghl_j1c)）并选择 mass\_storage 组合。                                                                                   |                               |
|        组合切换       | 请参阅[包含 diag 和 ADB 接口的 USB 组合示例 shell 脚本](https://docs.qualcomm.com/doc/80-80021-8/topic/usb.html?product=895724676033554725\&facet=Interfaces\&version=2.0-rc2#usb-customization__section_y3t_dhl_j1c)和[通过 QUSB 服务更改 USB 组合](https://docs.qualcomm.com/doc/80-80021-8/topic/usb.html?product=895724676033554725\&facet=Interfaces\&version=2.0-rc2#usb-customization__section_nqf_ghl_j1c)。 |                               |
| 线缆连接和断开时的 USB LPM |                                                                                                                                                                              手动断开 USB，使 `dwc3-qcom` 模块进入低功耗模式。                                                                                                                                                                              |                               |
|   网络控制调制解调器（NCM）  |                                                                                          更改 USB 组合（[通过 QUSB 服务更改 USB 组合](https://docs.qualcomm.com/doc/80-80021-8/topic/usb.html?product=895724676033554725\&facet=Interfaces\&version=2.0-rc2#usb-customization__section_nqf_ghl_j1c)）并选择 NCM 组合。                                                                                          |                               |
|      USB 主机模式     |                                                                                                                                                                                        主机人机接口设备（HID）类                                                                                                                                                                                       | 通过将 HID 类设备直接连接到被测设备来切换到主机模式。 |
|    主机大容量存储（MS）类   |                                                                                                                                                                                 通过将 MS 类设备直接连接到被测设备来切换到主机模式。                                                                                                                                                                                |                               |
|      主机 hub 类     |                                                                                                                                                                                通过将 hub 类设备直接连接到被测设备来切换到主机模式。                                                                                                                                                                                |                               |
|       主机电源管理      |                                                                                                                                                                       当 `dwc3-qcom` 模块在主机模式下进入低功耗模式时，外设支持主机模式挂起（耳机）状态。                                                                                                                                                                      |                               |
| 外设连接和断开时的 USB LPM |                                                                                                                                                                        当 `dwc3-qcom` 模块在主机模式下进入低功耗模式时，外设支持主机模式挂起（耳机）。                                                                                                                                                                       |                               |
|  高速下的 USB L1 LPM  |                                                                                                                                                                       当 `dwc3-qcom` 模块在主机模式下进入低功耗模式时，高速外设支持主机模式挂起（耳机）。                                                                                                                                                                      |                               |
|      USB 摄像头      |                                                                                                               请参阅[配置 USB 摄像头](https://docs.qualcomm.com/doc/80-80021-8/topic/usb.html?product=895724676033554725\&facet=Interfaces\&version=2.0-rc2#usb-camera-configuration)。                                                                                                              |                               |

## **调试 USB 问题**

本节提供获取调试日志的各种方法的信息。调试方法包括 `regdumps`、调试 `ftraces`、`configfs` 节点。在调试低功耗模式进入/退出、SMMU 故障、无时钟访问等问题时，这些日志可提供事件和控制器状态详情的可见性。

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

### **跟踪 USB**

`debugfs` 跟踪可深入查看 USB 线路上的每个事务。要查看跟踪列表，请运行以下命令。

```text theme={null}
ls /sys/kernel/debug/tracing/events/dwc3
```

**注意**：确保 `debugfs` 已挂载。如果未挂载，请运行以下命令挂载 `debugfs`。

```text theme={null}
mount -t debugfs none /sys/kernel/debug
```

以下是可用于验证 xHCI/gadget 栈/USB Type-C 连接器系统软件接口（UCSI）中数据传输的跟踪。

```text theme={null}
dwc3_alloc_request  dwc3_event              dwc3_gadget_generic_cmd  enable
dwc3_complete_trb   dwc3_free_request       dwc3_gadget_giveback     filter
dwc3_ctrl_req       dwc3_gadget_ep_cmd      dwc3_prepare_trb
dwc3_ep_dequeue     dwc3_gadget_ep_disable  dwc3_readl
dwc3_ep_queue       dwc3_gadget_ep_enable   dwc3_writel
```

要列出 xHCI/主机控制器驱动（HCD）中的跟踪，请运行以下命令。

```text theme={null}
ls /sys/kernel/debug/tracing/events/xhci-hcd
```

以下是可用于验证 xHCI/HCD 中数据传输的跟踪。

```text theme={null}
enable                            xhci_handle_cmd_config_ep
filter                            xhci_handle_cmd_disable_slot
  xhci_add_endpoint                 xhci_handle_cmd_reset_dev
  xhci_address_ctrl_ctx             xhci_handle_cmd_reset_ep
  xhci_address_ctx                  xhci_handle_cmd_set_deq
  xhci_alloc_dev                    xhci_handle_cmd_set_deq_ep
  xhci_alloc_virt_device            xhci_handle_cmd_stop_ep
  xhci_configure_endpoint           xhci_handle_command
  xhci_configure_endpoint_ctrl_ctx  xhci_handle_event
  xhci_dbc_alloc_request            xhci_handle_port_status
  xhci_dbc_free_request             xhci_handle_transfer
  xhci_dbc_gadget_ep_queue          xhci_hub_status_data
  xhci_dbc_giveback_request         xhci_inc_deq
  xhci_dbc_handle_event             xhci_inc_enq
  xhci_dbc_handle_transfer          xhci_queue_trb
  xhci_dbc_queue_request            xhci_ring_alloc
  xhci_dbg_address                  xhci_ring_ep_doorbell
  xhci_dbg_cancel_urb               xhci_ring_expansion
  xhci_dbg_context_change           xhci_ring_free
  xhci_dbg_init                     xhci_ring_host_doorbell
  xhci_dbg_quirks                   xhci_setup_addressable_virt_device
  xhci_dbg_reset_ep                 xhci_setup_device
  xhci_dbg_ring_expansion           xhci_setup_device_slot
  xhci_discover_or_reset_device     xhci_stop_device
  xhci_free_dev                     xhci_urb_dequeue
  xhci_free_virt_device             xhci_urb_enqueue
  xhci_get_port_status              xhci_urb_giveback
  xhci_handle_cmd_addr_dev
```

要列出 USB 视频类（UVC）gadget 驱动的可用事件，请运行以下命令。

```text theme={null}
ls /sys/kernel/debug/tracing/events/gadget
```

将显示以下输出。

```text theme={null}
enable                      usb_gadget_activate
  filter                      usb_gadget_clear_selfpowered
  usb_ep_alloc_request        usb_gadget_connect
  usb_ep_clear_halt           usb_gadget_deactivate
  usb_ep_dequeue              usb_gadget_disconnect
  usb_ep_disable              usb_gadget_frame_number
  usb_ep_enable               usb_gadget_giveback_request
  usb_ep_fifo_flush           usb_gadget_set_remote_wakeup
  usb_ep_fifo_status          usb_gadget_set_selfpowered
  usb_ep_free_request         usb_gadget_vbus_connect
  usb_ep_queue                usb_gadget_vbus_disconnect
  usb_ep_set_halt             usb_gadget_vbus_draw
  usb_ep_set_maxpacket_limit  usb_gadget_wakeup
  usb_ep_set_wedge
```

要列出 UCSI 驱动中的可用事件，请运行以下命令。

```text theme={null}
ls /sys/kernel/debug/tracing/events/ucsi
```

将显示以下输出。

```text theme={null}
enable  ucsi_connector_change  ucsi_register_port  ucsi_run_command
filter  ucsi_register_altmode  ucsi_reset_ppm
```

### **USB regdump**

USB `debugfs` 提供以下信息。

**注意**：`a600000.usb` 地址因芯片组而异。

* 工作模式。
  ```text theme={null}
  cat /sys/kernel/debug/usb/a600000.usb/mode
  ```
  示例输出：
  ```text theme={null}
  device
  ```
* 设备模式下所有端点的状态和传输环形缓冲区（TRB）队列。
* 当前链路状态。
  ```text theme={null}
  cat /sys/kernel/debug/usb/a600000.usb/link_state
  ```
  示例输出。
  ```text theme={null}
  Sleep
  ```
* 列表处理器（LSP）转储。
  ```text theme={null}
  cat /sys/kernel/debug/usb/a600000.usb/lsp_dump
  ```
  示例输出：
  ```text theme={null}
  GDBGLSP[0] = 0x40000000
  GDBGLSP[1] = 0x00003a80
  GDBGLSP[2] = 0x38200000
  GDBGLSP[3] = 0x00802000
  GDBGLSP[4] = 0x126f1000
  GDBGLSP[5] = 0x3a800018
  GDBGLSP[6] = 0x00000a80
  GDBGLSP[7] = 0xfc03f14a
  GDBGLSP[8] = 0x0b803fff
  GDBGLSP[9] = 0x00000000
  GDBGLSP[10] = 0x000000f8
  GDBGLSP[11] = 0x000000f8
  GDBGLSP[12] = 0x000000f8
  GDBGLSP[13] = 0x000000f8
  GDBGLSP[14] = 0x000000f8
  GDBGLSP[15] = 0x000000f8
  ```

```text theme={null}
ls /sys/kernel/debug/usb/a600000.usb
```

示例输出：

```text theme={null}
ep0in    ep11out  ep14in   ep1out  ep4in   ep6out  ep9in       regdump
ep0out   ep12in   ep14out  ep2in   ep4out  ep7in   ep9out      testmode
ep10in   ep12out  ep15in   ep2out  ep5in   ep7out  link_state
ep10out  ep13in   ep15out  ep3in   ep5out  ep8in   lsp_dump
ep11in   ep13out  ep1in    ep3out  ep6in   ep8out  mode
```

`regdump` 命令提供以下寄存器的寄存器空间当前状态：

* 设备模式寄存器，例如 DCTL、DSTS 和 DCFG
* 全局寄存器，例如 GCTL 和 GSTS

```text theme={null}
cd /sys/kernel/debug/usb/a600000.usb
cat regdump
                
```

示例输出：

```text theme={null}
GSBUSCFG0 = 0x2222000e
GSBUSCFG1 = 0x00001700
GTXTHRCFG = 0x00000000
GRXTHRCFG = 0x00000000
GCTL = 0x00102000
GEVTEN = 0x00000000
GSTS = 0x7e800000
GUCTL1 = 0x810c1802
GSNPSID = 0x5533330a
GGPIO = 0x00000000
GUID = 0x00060500
GUCTL = 0x0d00c010
GBUSERRADDR0 = 0x00000000
GBUSERRADDR1 = 0x00000000
GPRTBIMAP0 = 0x00000000
GPRTBIMAP1 = 0x00000000
GHWPARAMS0 = 0x4020400a
GDBGFIFOSPACE = 0x00420000
GDBGLTSSM = 0x41090658
GDBGBMU = 0x20300000
GPRTBIMAP_HS0 = 0x00000000
GPRTBIMAP_HS1 = 0x00000000
GPRTBIMAP_FS0 = 0x00000000
GPRTBIMAP_FS1 = 0x00000000
GUCTL2 = 0x0198440d
VER_NUMBER = 0x00000000
VER_TYPE = 0x00000000
GUSB2PHYCFG(0) = 0x00002400
GUSB2I2CCTL(0) = 0x00000000
GUSB2PHYACC(0) = 0x00000000
GUSB3PIPECTL(0) = 0x030e0002
GTXFIFOSIZ(0) = 0x00000042
GRXFIFOSIZ(0) = 0x00000305
GEVNTADRLO(0) = 0xfffff000
GEVNTADRHI(0) = 0x0000000f
GEVNTSIZ(0) = 0x00001000
GEVNTCOUNT(0) = 0x00000000
GHWPARAMS8 = 0x000007ea
GUCTL3 = 0x00010000
GFLADJ = 0x8c80c8a0
DCFG = 0x00cc08b4
DCTL = 0x8cf00a00
DEVTEN = 0x00000257
DSTS = 0x008a5200
DGCMDPAR = 0x00000000
DGCMD = 0x00000000
DALEPENA = 0x0000000f
DEPCMDPAR2(0) = 0x00000000
DEPCMDPAR1(0) = 0xffffe000
DEPCMDPAR0(0) = 0x0000000f
DEPCMD(0) = 0x00000006
OCFG = 0x00000000
OCTL = 0x00000000
OEVT = 0x00000000
OEVTEN = 0x00000000
OSTS = 0x00000000
```

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

要查看总线详情，请运行以下命令。

```text theme={null}
lsusb
```

示例输出：

```text theme={null}
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 03f0:134a HP, Inc Optical Mouse
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

要列出当前目录的内容，请运行以下命令。

```text theme={null}
cd /sys/bus/usb/devices/
ls
```

示例输出：

```text theme={null}
1-0:1.0  1-1  1-1:1.0  2-0:1.0  usb1  usb2
```

要查看有关 USB 设备的详细信息，请运行以下命令。

```text theme={null}
cat /sys/kernel/debug/usb/devices
```

示例输出：

```text theme={null}
T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480  MxCh= 1
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev= 6.05
S:  Manufacturer=Linux 6.5.0-rc4 xhci-hcd
S:  Product=xHCI Host Controller
S:  SerialNumber=xhci-hcd.0.auto
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   4 Ivl=256ms

T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=1.5  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=03f0 ProdID=134a Rev= 1.00
S:  Manufacturer=PixArt
S:  Product=HP USB Optical Mouse
C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=02 Driver=usbhid
E:  Ad=81(I) Atr=03(Int.) MxPS=   4 Ivl=10ms

T:  Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=5000 MxCh= 1
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
D:  Ver= 3.00 Cls=09(hub  ) Sub=00 Prot=03 MxPS= 9 #Cfgs=  1
P:  Vendor=1d6b ProdID=0003 Rev= 6.05
S:  Manufacturer=Linux 6.5.0-rc4 xhci-hcd
S:  Product=xHCI Host Controller
S:  SerialNumber=xhci-hcd.0.auto
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   4 Ivl=256ms
```

## **USB 示例**

QCS6490：[https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts](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://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/af60c05b-4a0f-51b8-486a-1fc601602515@quicinc.com/) 和 [https://lore.kernel.org/all/20231016-dwc3-refactor-v1-0-ab4a84165470@quicinc.com/](https://lore.kernel.org/all/20231016-dwc3-refactor-v1-0-ab4a84165470@quicinc.com/)。

<Tooltip tip="上一页：PCIe" />\\
