# USB

Source: [https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html)

通用串行总线 (USB) 是一种行业标准，允许在各种类型的电子设备之间进行数据交换和供电。该标准支持多种运行速度，例如 1.5 Mbps 低速、12 Mbps 全速、480 Mbps 高速、5 Gbps 超高速以及 10 Gbps 超高速+。

Synopsys DesignWare® Core 超高速 USB 3.x 用于 Qualcomm SoC 上的 USB 模块，并连接到两个 PHY – USB2 PHY（通过 UTMI 接口连接）和 USB3 PHY（通过 PIPE 接口连接）。这两个 PHY 与物理 Type-C 端口相连，实现与外部世界进行通信。

以下为 USB 的关键硬件组件。
- **USB 控制器**
    - 主控制器为 Synopsys DesignWare Core 超高速 USB 3.x 控制器 (Gen1/Gen2)。
        - 两个 Qualcomm 多用途 PHY (QMP) 实例分别用于 USB 超高速和 DisplayPort。
        - Synopsys PHY 用于高速 USB。
    - 辅助控制器为 Synopsys DesignWare Core 高速 USB 2.0 控制器。
        - Synopsys PHY 用于高速 USB
    - 第三控制器为 Synopsys DesignWare Core 高速 USB 2.0 控制器。
        - Synopsys PHY 用于高速 USB。
    - QCS9075 有三个 USB 控制器（主 USB 3.2、辅助 USB 3.2、第三 USB 2.0）
- **Synopsys DesignWare Core 超高速 USB 3.x 控制器特性**
    - Synopsys DesignWare Core 超高速 USB 3.x 控制器是符合 USB 超高速标准的控制器，支持以下多种配置：
        - 仅外设配置
        - 仅主机配置
        - 双角色配置
    - 支持所有传输类型（控制、批量、中断和等时）
    - 支持超高速批量流
    - 符合可扩展主机控制器接口 (xHCI) 规范
    - 主机模式支持超高速 (5 Gbps)、高速 (480 Mbps)、全速 (12 Mbps) 和低速 (1.5 Mbps) 四种运行速度。
    - 设备模式支持超高速 (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 Power Delivery 规范。
    - 支持在 Power Delivery 控制器确定所连接链路伙伴的 Type-C 方向、角色和模式后，根据 UCSI 框架来更新 PM7325B 软件驱动程序。
    - 仅用于主 USB 控制器。

### 时钟

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

Table : USB 控制器时钟

| 时钟名称 | 工作频率 | 说明 |
| --- | --- | --- |
| `gcc_usb30_prim_master_clk "core_clk"` | <ul class="ul" id="usb__ul_dtq_hfk_k1c"><br>                                    <li class="li">200&nbsp;MHz 超高速</li><br><br>                                    <li class="li">66&nbsp;MHz 高速</li><br><br>                                </ul> | 与总线时钟异步；设备树节点中定义的时钟速率 |
| `gcc_cfg_noc_usb3_prim_axi_clk "iface_clk"` | <ul class="ul" id="usb__ul_avq_kfk_k1c"><br>                                    <li class="li">200&nbsp;MHz 超高速</li><br><br>                                    <li class="li">66&nbsp;MHz 高速</li><br><br>                                </ul> | 辅助总线控制器单元时钟。 |
| `gcc_aggre_usb3_prim_axi_clk "bus_aggr_clk"` | <ul class="ul" id="usb__ul_yjq_lfk_k1c"><br>                                    <li class="li">200&nbsp;MHz 超高速</li><br><br>                                    <li class="li">66&nbsp;MHz 高速</li><br><br>                                </ul> | 馈入 `aggregator2` 模块的时钟，控制着从 USB AXI 流入 NoC 的数据 |
| `gcc_usb30_prim_mock_utmi_clk "utmi_clk"` | 19.2 MHz | 用于在 USB 收发器宏单元接口 (UTMI)/UTMI+Low 引脚接口 (ULPI) 待机时生成 ITP 计数器的内部控制器 `ref_clk` |
| `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 频率的频率） |

Table : 高速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 频率的频率） |

Table : 超高速 PHY 时钟

| 时钟名称 | 工作频率 | 说明 |
| --- | --- | --- |
| `gcc_usb3_prim_phy_aux_clk "aux_clk"` | 19.2 MHz | PCI Express PHY 接口 (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 | – |

### 电压域

下表列出了高速和超高速 PHY 所需的电压域。

| 电压域 | 电压等级（最大值/标称值/最小值） | 电压等级（最大值/标称值/最小值） | 电压等级（最大值/标称值/最小值） | 设备模式 | 说明 |
| --- | --- | --- | --- | --- | --- |
| 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 核心 |

**QCS9075 USB 电压域**
- HS PHY：L7A (0.88 V)、L6C (1.8 V)、L9A (3.3 V)
- SS PHY：L1C、L7A

### 中断

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

| 中断名称 | QCS6490/QCS5430 中断 | QCS9075 中断 | QCS9075 中断 | QCS9075 中断 | 中断事件 PDC 唤醒内核处理 | 中断事件 PDC 唤醒内核处理 | 说明 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `dp_hs_phy_irq` | 14 | PDC14 | PDC8 | PDC10 | D+ 变化 | – | 仅可用于系统处于 VDD min/XO 关闭的情况下 |
| `dm_hs_phy_irq` | 15 | PDC15 | PDC7 | PDC9 | D- 变化 | – | 仅可用于系统处于 VDD min/XO 关闭的情况下 |
| `ss_phy_irq` | 17 | PDC12 | PDC13 | – | LFPS 检测 | – | 仅可用于系统处于 VDD min/XO 关闭的情况下 |
| `pwr_event_irq` | 130 | 287 | 352 | 444 | – | USB PHY 电源状态变化<br><br><br>                                    <br>退出/进入 P3/L2 | 用作系统未处于电源深度休眠状态时的主控制器唤醒句柄 |
| `core irq` | 133 | 292 | 349 | 442 | – | <ul class="ul" id="usb__ul_xgw_tkk_k1c"><br>                                        <li class="li">总线事件<ul class="ul" id="usb__ul_pqx_4mn_h1c"><br>                                                <li class="li">待机</li><br><br>                                                <li class="li">恢复</li><br><br>                                                <li class="li">复位</li><br><br>                                            </ul><br></li><br><br>                                        <li class="li">控制器事件完成<ul class="ul" id="usb__ul_qqx_4mn_h1c"><br>                                                <li class="li">传输完成</li><br><br>                                                <li class="li">命令完成</li><br><br>                                            </ul><br></li><br><br>                                    </ul> | 处理所有 USB 控制器事件的主 USB 中断 |

### 互连

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

Table : USB 互连

| 互连名称 | 控制器 | 目标 | 互连路径带宽 (MBps) |
| --- | --- | --- | --- |
| USB-DDR | <ul class="ul" id="usb__ul_qyk_ywh_4cc"><br>                                        <li class="li"><code class="ph codeph">MASTER_USB3_0</code></li><br><br>                                        <li class="li">QCS9075<ul class="ul" id="usb__ul_bym_bxh_4cc"><br>                                                <li class="li"><code class="ph codeph">MASTER_USB3_1</code></li><br><br>                                                <li class="li"><code class="ph codeph">MASTER_USB2</code></li><br><br>                                            </ul><br></li><br><br>                                    </ul> | `SLAVE_EBI1` | <ul class="ul" id="usb__ul_xwc_tlk_k1c"><br>                                        <li class="li">USB_MEMORY_AVG_HS_BW MBps_to_icc(240)</li><br><br>                                        <li class="li">USB_MEMORY_PEAK_HS_BW MBps_to_icc(700)</li><br><br>                                        <li class="li">USB_MEMORY_AVG_SS_BW MBps_to_icc(1000)</li><br><br>                                        <li class="li">USB_MEMORY_PEAK_SS_BW MBps_to_icc(2500)</li><br><br>                                    </ul> |
| APPS-USB | `MASTER_APPSS_PROC` | <ul class="ul" id="usb__ul_p4f_tj3_4cc"><br>                                        <li class="li"><code class="ph codeph">SLAVE_USB3_0</code></li><br><br>                                        <li class="li">QCS9075<ul class="ul" id="usb__ul_sm3_sj3_4cc"><br>                                                <li class="li"><code class="ph codeph">SLAVE_USB3_1</code></li><br><br>                                                <li class="li"><code class="ph codeph">SLAVE_USB2</code></li><br><br>                                            </ul><br></li><br><br>                                    </ul> | <ul class="ul" id="usb__ul_m24_vlk_k1c"><br>                                        <li class="li">APPS_USB_AVG_BW 0</li><br><br>                                        <li class="li">APPS_USB_PEAK_BW MBps_to_icc(40)</li><br><br>                                    </ul> |

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

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

Table : 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 控制器的寄存器选项。

Table : USB 控制器复位

| USB 控制器寄存器 | USB 寄存器位域 | 复位控制 | 说明 |
| --- | --- | --- | --- |
| DWC3\_DCTL | CSFTRST [位 30] | USB 控制器 | 复位 USB 控制器设备堆栈。 |
| DWC3\_GCTL | CORESOFTRESET [位 11] | - | 对 DWC3 控制器进行全局复位。 |

**QCS9075控制器复位寄存器**
- 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

### USB 控制器与 SoC 集成

USB 控制器的知识产权和 PHY 集成到 SoC 中，如下图所示。 
Figure : USB 控制器 PHY 与 SoC 集成
                    <!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->

<!-- 由 Microsoft Visio, SVG Export 生成 usb-controller-soc.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="5.25434in" height="5.20528in" viewbox="0 0 378.312 374.78" xml:space="preserve" color-interpolation-filters="sRGB" class="st16"><v:documentproperties v:langid="2052">	<v:userdefs>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-1 .st1 { fill: #ffffff; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.749999 }
.svg-1 .st2 { fill: none; stroke: #3253dc; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.999999 }
.svg-1 .st3 { fill: #000000; font-family: Arial; font-size: 1.00001em }
.svg-1 .st4 { font-family: 黑体; font-size: 1em }
.svg-1 .st5 { fill: none; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.999999 }
.svg-1 .st6 { fill: #000000; font-family: Arial; font-size: 1.16666em }
.svg-1 .st7 { font-size: 1em }
.svg-1 .st8 { marker-end: url("#mrkr4-28"); marker-start: url("#mrkr4-26"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.999999 }
.svg-1 .st9 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.28409062953578 }
.svg-1 .st10 { marker-end: url("#mrkr4-28"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.999999 }
.svg-1 .st11 { fill: none }
.svg-1 .st12 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.999999 }
.svg-1 .st13 { marker-start: url("#mrkr4-26"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.999999 }
.svg-1 .st14 { fill: #000000; font-family: 黑体; font-size: 0.833336em }
.svg-1 .st15 { fill: #000000; font-family: Arial; font-size: 0.833336em }
.svg-1 .st16 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="mrkr4-26" class="st9" v:arrowtype="4" v:arrowsize="2" v:setback="0" refx="0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(3.5200034638033) "></use>	</marker>	<marker id="mrkr4-28" class="st9" v:arrowtype="4" v:arrowsize="2" v:setback="0" refx="-0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-3.5200034638033,-3.5200034638033) "></use>	</marker></defs><g v:mid="1" v:index="1" v:groupcontext="backgroundPage">	<v:userdefs>		<v:ud v:nameu="msvVisioCreated" v:prompt="" v:val="VT0(0):26"></v:ud>	</v:userdefs>	<title>VBackground-1</title>	<v:pageproperties width="5.25434" height="5.20528" v:drawingscale="0.0393701" v:pagescale="0.0393701" v:drawingunits="24" v:shadowoffsetx="8.99999" v:shadowoffsety="-8.99999"></v:pageproperties>	<g id="shape1-1" v:mid="1" v:groupcontext="shape" transform="translate(0,-0.000337572)">		<title>Solid</title>		<v:userdefs>			<v:ud v:nameu="Background" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="msvShapeCategories" v:prompt="" v:val="VT4(DoNotContain)"></v:ud>			<v:ud v:nameu="msvVisioCreated" v:prompt="" v:val="VT0(0):26"></v:ud>		</v:userdefs>		<rect x="0" y="0.000675144" width="378.312" height="374.779" class="st1"></rect>	</g></g><g v:mid="0" v:index="2" v:groupcontext="foregroundPage">	<title>Page-1</title>	<v:pageproperties v:drawingscale="0.0393701" v:pagescale="0.0393701" v:drawingunits="24" v:shadowoffsetx="8.99999" v:shadowoffsety="-8.99999"></v:pageproperties>	<g id="shape1-3" v:mid="1" v:groupcontext="shape" transform="translate(19,-64.0002)">		<title>工作表.1</title>		<rect x="0" y="83.0006" width="340.312" height="291.78" class="st2"></rect>	</g>	<g id="shape2-5" v:mid="2" v:groupcontext="shape" transform="translate(127.563,-245.89)">		<title>工作表.2</title>		<desc>USB 3.x controller</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="36" cy="338.78" width="72" height="71.9999"></v:textrect>		<rect x="0" y="302.78" width="71.9999" height="71.9999" class="st2"></rect>		<text x="13.99" y="334.58" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>USB 3.x<v:lf></v:lf><tspan x="18" dy="1.275em" class="st4">控制器</tspan></text>		</g>	<g id="shape3-9" v:mid="3" v:groupcontext="shape" transform="translate(54.0324,-328.78)">		<title>工作表.3</title>		<desc>SoC</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="122.265" cy="361.28" width="244.54" height="27"></v:textrect>		<rect x="0" y="347.78" width="244.53" height="27" class="st5"></rect>		<text x="108.65" y="365.48" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>SoC</text>		</g>	<g id="shape4-12" v:mid="4" v:groupcontext="shape" transform="translate(51.0624,-19.0003)">		<title>工作表.4</title>		<desc>Type-C connector</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="131.625" cy="361.28" width="263.25" height="27"></v:textrect>		<rect x="0" y="347.78" width="263.25" height="27" class="st2"></rect>		<text x="92.29" y="365.18" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Type-C <tspan class="st4">连接器</tspan></text>		</g>	<g id="shape5-16" v:mid="5" v:groupcontext="shape" transform="translate(213.063,-245.89)">		<title>工作表.5</title>		<desc>AHB 2 PHY</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="36" cy="338.78" width="72" height="71.9999"></v:textrect>		<rect x="0" y="302.78" width="71.9999" height="71.9999" class="st2"></rect>		<text x="18.66" y="335.18" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>AHB 2<v:newlinechar></v:newlinechar><tspan x="23.66" dy="1.2em" class="st7">PHY</tspan></text>		</g>	<g id="shape6-20" v:mid="6" v:groupcontext="shape" transform="translate(518.813,129.25) rotate(90)">		<title>工作表.6</title>		<path d="M0 374.78 L6.68 374.78 L7.04 374.78 L84.49 374.78 L91.53 374.78" class="st8"></path>	</g>	<g id="shape7-29" v:mid="7" v:groupcontext="shape" transform="translate(446.813,292.78) rotate(90)">		<title>工作表.7</title>		<path d="M0 374.78 L6.68 374.78 L7.04 374.78 L28.96 374.78 L36 374.78" class="st8"></path>	</g>	<g id="shape8-36" v:mid="8" v:groupcontext="shape" transform="translate(27.0325,-245.53)">		<title>工作表.8</title>		<desc>Display port controller</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="36" cy="338.6" width="72" height="72.3599"></v:textrect>		<rect x="0" y="302.42" width="71.9999" height="72.3599" class="st2"></rect>		<text x="5.32" y="334.4" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>DisplayPort <v:newlinechar></v:newlinechar><tspan x="18" dy="1.275em" class="st4">控制器</tspan></text>		</g>	<g id="shape9-40" v:mid="9" v:groupcontext="shape" transform="translate(430.343,129.25) rotate(90)">		<title>工作表.9</title>		<path d="M0 374.78 L6.68 374.78 L7.04 374.78 L84.49 374.78 L91.53 374.78" class="st8"></path>	</g>	<g id="shape10-47" v:mid="10" v:groupcontext="shape" transform="translate(55.5624,-154)">		<title>工作表.10</title>		<path d="M0 354.13 L69.75 354.13 L69.75 367.74 L69.75 374.78" class="st10"></path>	</g>	<g id="shape11-52" v:mid="11" v:groupcontext="shape" transform="translate(186.063,-232.435)">		<title>工作表.11</title>		<path d="M0 374.78 L114.75 374.78 L0 374.78 Z" class="st11"></path>		<path d="M0 374.78 L114.75 374.78" class="st12"></path>	</g>	<g id="shape12-55" v:mid="12" v:groupcontext="shape" transform="translate(-188.717,129.25) rotate(-90) scale(-1,1)">		<title>工作表.12</title>		<path d="M0 374.78 L6.68 374.78 L7.04 374.78 L13.09 374.78" class="st13"></path>	</g>	<g id="shape13-60" v:mid="13" v:groupcontext="shape" transform="translate(108.033,-82.0002)">		<title>工作表.13</title>		<desc>SS0_1 DP PHY (QMP)</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="36" cy="338.78" width="72" height="71.9999"></v:textrect>		<rect x="0" y="302.78" width="71.9999" height="71.9999" class="st2"></rect>		<text x="17.99" y="327.98" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>SS0_1<v:newlinechar></v:newlinechar><tspan x="27.66" dy="1.2em" class="st7">DP<v:newlinechar></v:newlinechar></tspan><tspan x="4.33" dy="1.2em" class="st7">PHY </tspan>(QMP)</text>		</g>	<g id="shape14-65" v:mid="14" v:groupcontext="shape" transform="translate(512.358,328.78) rotate(90) scale(-1,1)">		<title>工作表.14</title>		<path d="M0 374.78 L6.68 374.78 L7.04 374.78 L28.96 374.78 L36 374.78" class="st8"></path>	</g>	<g id="shape15-72" v:mid="15" v:groupcontext="shape" transform="translate(36.0325,-82.0002)">		<title>工作表.15</title>		<desc>SS0_0 DP PHY (QMP)</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="36" cy="338.78" width="72" height="71.9999"></v:textrect>		<rect x="0" y="302.78" width="71.9999" height="71.9999" class="st2"></rect>		<text x="17.99" y="327.98" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>SS0_0<v:newlinechar></v:newlinechar><tspan x="27.66" dy="1.2em" class="st7">DP<v:newlinechar></v:newlinechar></tspan><tspan x="4.33" dy="1.2em" class="st7">PHY </tspan>(QMP)</text>		</g>	<g id="shape16-77" v:mid="16" v:groupcontext="shape" transform="translate(-280.967,165.97) rotate(-90) scale(-1,1)">		<title>工作表.16</title>		<path d="M0 374.78 L47.36 374.78 L54.4 374.78" class="st10"></path>	</g>	<g id="shape17-82" v:mid="17" v:groupcontext="shape" transform="translate(-213.467,165.97) rotate(-90) scale(-1,1)">		<title>工作表.17</title>		<path d="M0 374.78 L47.36 374.78 L54.4 374.78" class="st10"></path>	</g>	<g id="shape18-87" v:mid="18" v:groupcontext="shape" transform="translate(279.31,-208.81) scale(-1,1)">		<title>工作表.18</title>		<path d="M0 374.78 L185.5 374.78 L0 374.78 Z" class="st11"></path>		<path d="M0 374.78 L185.5 374.78" class="st12"></path>	</g>	<g id="shape19-90" v:mid="19" v:groupcontext="shape" transform="translate(614.843,129.25) rotate(90)">		<title>工作表.19</title>		<path d="M0 374.78 L6.68 374.78 L7.04 374.78 L36.72 374.78" class="st13"></path>	</g>	<g id="shape20-95" v:mid="20" v:groupcontext="shape" transform="translate(-73.9681,292.78) rotate(-90) scale(-1,1)">		<title>工作表.20</title>		<path d="M0 374.78 L6.68 374.78 L7.04 374.78 L28.55 374.78 L35.59 374.78" class="st8"></path>	</g>	<g id="shape21-102" v:mid="21" v:groupcontext="shape" transform="translate(264.813,-172.405)">		<title>工作表.21</title>		<desc>EUD</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="36" cy="362.968" width="72" height="23.625"></v:textrect>		<rect x="0" y="351.155" width="71.9999" height="23.625" class="st2"></rect>		<text x="23.33" y="366.57" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>EUD</text>		</g>	<g id="shape22-105" v:mid="22" v:groupcontext="shape" transform="translate(265.533,-82.0002)">		<title>工作表.22</title>		<desc>HS0 PHY (SNPS)</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="36" cy="338.78" width="72" height="71.9999"></v:textrect>		<rect x="0" y="302.78" width="71.9999" height="71.9999" class="st2"></rect>		<text x="24.33" y="327.98" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>HS0<v:newlinechar></v:newlinechar><tspan x="23.66" dy="1.2em" class="st7">PHY<v:newlinechar></v:newlinechar></tspan><tspan x="15.66" dy="1.2em" class="st7">(</tspan>SNPS)</text>		</g>	<g id="shape23-110" v:mid="23" v:groupcontext="shape" transform="translate(103.46,-224.479)">		<title>工作表.23</title>		<desc>Pipe</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="18.2806" cy="365.78" width="36.57" height="18"></v:textrect>		<rect x="0" y="356.78" width="36.5612" height="18" class="st5"></rect>		<text x="12.57" y="369.03" class="st14" v:langid="1033"><v:paragraph v:horizalign="2"></v:paragraph><v:tablist></v:tablist>管道</text>		</g>	<g id="shape24-113" v:mid="24" v:groupcontext="shape" transform="translate(153.8,-223.991)">		<title>工作表.24</title>		<desc>UTMI</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="18.2806" cy="365.78" width="36.57" height="18"></v:textrect>		<rect x="0" y="356.78" width="36.5612" height="18" class="st5"></rect>		<text x="4" y="368.78" class="st15" v:langid="1033"><v:paragraph></v:paragraph><v:tablist></v:tablist>UTMI</text>		</g>	<g id="shape25-116" v:mid="25" v:groupcontext="shape" transform="translate(134.313,-247.06)">		<title>工作表.25</title>		<desc>SS</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="13.5" cy="368.03" width="27" height="13.5"></v:textrect>		<rect x="0" y="361.28" width="27" height="13.5" class="st5"></rect>		<text x="4" y="371.03" class="st15" v:langid="1033"><v:paragraph></v:paragraph><v:tablist></v:tablist>SS</text>		</g>	<g id="shape26-119" v:mid="26" v:groupcontext="shape" transform="translate(170.313,-247.06)">		<title>工作表.26</title>		<desc>HS</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="13.5" cy="368.03" width="27" height="13.5"></v:textrect>		<rect x="0" y="361.28" width="27" height="13.5" class="st5"></rect>		<text x="9.11" y="371.03" class="st15" v:langid="1033"><v:paragraph v:horizalign="2"></v:paragraph><v:tablist></v:tablist>HS</text>		</g>	<g id="shape27-122" v:mid="27" v:groupcontext="shape" transform="translate(654.09,165.97) rotate(90)">		<title>工作表.27</title>		<path d="M0 374.78 L5.74 374.78 L12.78 374.78" class="st10"></path>	</g>	<g id="shape28-127" v:mid="28" v:groupcontext="shape" transform="translate(675.593,142.345) rotate(90)">		<title>工作表.28</title>		<path d="M0 374.78 L29.36 374.78 L36.4 374.78" class="st10"></path>	</g>	<g id="shape29-132" v:mid="29" v:groupcontext="shape" transform="translate(677.061,202.375) rotate(90)">		<title>工作表.29</title>		<path d="M0 374.78 L6.68 374.78 L7.04 374.78 L11.37 374.78 L18.41 374.78" class="st8"></path>	</g>	<g id="shape30-139" v:mid="30" v:groupcontext="shape" transform="translate(80.885,-154)">		<title>工作表.30</title>		<path d="M63.15 343.89 L0 343.89 L0 367.74 L0 374.78" class="st10"></path>	</g></g>
</svg>

Synopsys DesignWare Core 超高速 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/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 规范，在主机模式下支持超高速 (5 Gbps)、高速 (480 Mbps)、全速 (12 Mbps) 和低速 (1.5 Mbps) 四种运行速度。

Linux 标准 xHCI 驱动程序用于使 USB 控制器在主机模式下工作。

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

Note: QCS9075 不支持 USB Type-C 功能。

- USB Type-C 连接器系统软件接口在 Linux 内核中以库的形式提供。它定义了一组寄存器和数据结构，用于与系统上的 USB Type-C 连接器连接。平台上的 USB Type-C 连接器称为平台策略管理器 (PPM)，系统软件组件称为 OS 策略管理器 (OPM)。
- Qualcomm 参考设计使用 UCSI `Glink` 驱动程序来处理应用处理器上的 OPM 与 PPM 之间的通信，PPM 是通过 PMIC GLINK 在远程子系统 (aDSP) 上运行的充电固件。
- USB Type-C DisplayPort 备用模式增添了新功能以支持其他线缆详细信息，例如 DPAM 版本和线缆相关指示。Qualcomm 参考设计支持基于 Type-C 的 DisplayPort，并同时支持 USB 超高速和 DisplayPort，DisplayPort 最多有两条通道（USB 超高速有两条通道，DisplayPort 有两条通道）。
- USB Type-C Power Delivery 由 PM7325B PD 控制器提供支持，完全符合 USB PD 3.0 规范。通过使用 UCSI 接口，支持 USB 数据角色调换和电源角色调换。
- 以下是上述驱动程序的参考资料：
    - [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 功能

Source: [https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html)

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

Table : USB 功能：Linux

| 功能 | 说明 |
| --- | --- |
| USB\_DWC3 控制器 | Linux 内核默认支持 Synopsys DesignWare Core。 |
| USB\_DWC3\_QCOM | 使用 Synopsys DesignWare Core 实现 USB 功能的 `Qscratch` 封装程序。 |
| 运行时功耗管理 (RPM) | Linux 支持使用软件驱动文件 `dwc3-qcom` 进行 RPM，以实现低功耗模式操作。 |
| USB LPM | 低功耗模式，用于 HS/SS-PHY 以及控制器的节能选项。 |
| DRD | 双角色设备检测允许 USB 在主机模式和设备模式下工作。 |

### 运行时功耗管理

用户可根据需要启用运行时功耗管理功能。[https://lore.kernel.org/all/20231017131851.8299-1-quic_kriskura@quicinc.com/](https://lore.kernel.org/all/20231017131851.8299-1-quic_kriskura@quicinc.com/) 中添加了对 LPM 的支持。

默认情况下，禁止在运行时待机和恢复 USB。要启用这些功能，可运行以下命令：

    echo auto > /sys/bus/platform/devices/a600000.usb/power/controlCopy to clipboard

默认自动待机延迟设为 5 秒。要更改延迟，可运行以下 `sysfs` 命令：

    echo 2000 > /sys/bus/platform/devices/a600000.usb/power/autosuspend_delay_msCopy to clipboard

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

在主机模式下，为了使远程唤醒起作用，应根据用户要求为 xHCI 接口、USB 根集线器和连接的外设启用唤醒和自动待机。

    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
    Copy to clipboard

Note: 主机控制器驱动程序 (HCD) 设备生成 `xhci-hcd.X.auto` 值，其中 <var class="keyword varname">X</var> = 0、1、2 等。它表示连接到 USB 的设备数量。连接的设备在 /sys/bus/platform/devices/xhci-hcd.X.auto/usb1/&lt;&gt; 中列出。

要为 LS 光学鼠标启用远程唤醒，应运行以下命令：

    cd /sys/bus/usb/devices/usb1/1-1/
    echo auto > power/control
    echo enabled > power/wakeup
    Copy to clipboard

要查看运行时状态，可运行以下命令：

    cat /sys/bus/platform/devices/a600000.usb/power/runtime_statusCopy to clipboard

为避免在复合设备转换中发生待机，应通过运行以下命令删除活动 UDC 以重新绑定复合设备：

    echo on > /sys/bus/platform/devices/a600000.usb/power/control
    echo auto > /sys/bus/platform/devices/a600000.usb/power/control
    Copy to clipboard

## USB 架构

Source: [https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html)

Qualcomm USB 软件架构由两个组件构成，一个组件基于纯上游，另一个组件为存在某些待定功能相关更改的沙盒。纯上游直接从最新的长期支持 (LTS) 稳定内核 6.6.2 中选取。该架构使用 Yocto（发行版本 4.0）配方来创建二进制文件。

Figure : USB 软件架构
            <!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->

<!-- 由 Microsoft Visio, SVG Export 生成 usb-sw-architecture.svg Page-2 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="10.0208in" height="8.18062in" viewbox="0 0 721.498 589.005" xml:space="preserve" color-interpolation-filters="sRGB" class="st18"><v:documentproperties v:langid="2052">	<v:userdefs>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-2 .st1 { fill: #ffffff; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.749998 }
.svg-2 .st2 { fill: #ffffff; stroke: #3253dc; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.749998 }
.svg-2 .st3 { fill: #000000; font-family: Calibri; font-size: 1.00001em }
.svg-2 .st4 { fill: #000000; font-family: 黑体; font-size: 1.00001em }
.svg-2 .st5 { font-size: 1em }
.svg-2 .st6 { font-family: 黑体; font-size: 1em }
.svg-2 .st7 { marker-start: url("#mrkr4-93"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.749998 }
.svg-2 .st8 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.29411695645538 }
.svg-2 .st9 { fill: #ffffff; stroke: none; stroke-linecap: butt; stroke-width: 7.2 }
.svg-2 .st10 { fill: #000000; font-family: Calibri; font-size: 0.666664em }
.svg-2 .st11 { marker-start: url("#mrkr4-184"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.749998 }
.svg-2 .st12 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.34246500437445 }
.svg-2 .st13 { fill: #d8d8d8; stroke: #3253dc; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.749998 }
.svg-2 .st14 { fill: none; stroke: #3253dc; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.749998 }
.svg-2 .st15 { fill: none; stroke: #3253dc; stroke-linecap: butt; stroke-width: 5.99998 }
.svg-2 .st16 { fill: #000000; stroke: #3253dc; stroke-linecap: butt; stroke-width: 0.749998 }
.svg-2 .st17 { fill: #ffff00; stroke: #3253dc; stroke-linecap: butt; stroke-width: 0.749998 }
.svg-2 .st18 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="mrkr4-93" class="st8" v:arrowtype="4" v:arrowsize="1" v:setback="0" refx="0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(3.4000079833945) "></use>	</marker>	<marker id="mrkr4-184" class="st12" v:arrowtype="4" v:arrowsize="0" v:setback="0" refx="0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(2.9200063867156) "></use>	</marker></defs><g v:mid="1" v:index="1" v:groupcontext="backgroundPage">	<v:userdefs>		<v:ud v:nameu="msvVisioCreated" v:prompt="" v:val="VT0(0):26"></v:ud>	</v:userdefs>	<title>VBackground-1</title>	<v:pageproperties width="10.0208" height="8.18062" v:drawingscale="0.0393701" v:pagescale="0.0393701" v:drawingunits="24" v:shadowoffsetx="8.99997" v:shadowoffsety="-8.99997"></v:pageproperties>	<g id="shape1-1" v:mid="1" v:groupcontext="shape" transform="translate(0,-0.00129963)">		<title>Solid</title>		<v:userdefs>			<v:ud v:nameu="Background" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="msvShapeCategories" v:prompt="" v:val="VT4(DoNotContain)"></v:ud>			<v:ud v:nameu="msvVisioCreated" v:prompt="" v:val="VT0(0):26"></v:ud>		</v:userdefs>		<rect x="0" y="0.00259926" width="721.498" height="589.002" class="st1"></rect>	</g></g><g v:mid="0" v:index="2" v:groupcontext="foregroundPage">	<title>Page-2</title>	<v:pageproperties v:drawingscale="0.0393701" v:pagescale="0.0393701" v:drawingunits="24" v:shadowoffsetx="8.99997" v:shadowoffsety="-8.99997"></v:pageproperties>	<v:layer v:name="Connector" v:index="0"></v:layer>	<g id="shape1-3" v:mid="1" v:groupcontext="shape" transform="translate(18.7499,-403.323)">		<title>工作表.1</title>		<rect x="0" y="517.005" width="553.498" height="71.9998" class="st2"></rect>	</g>	<g id="shape2-5" v:mid="2" v:groupcontext="shape" transform="translate(18.7499,-83.824)">		<title>工作表.2</title>		<rect x="0" y="274.006" width="553.498" height="314.999" class="st2"></rect>	</g>	<g id="shape3-7" v:mid="3" v:groupcontext="shape" transform="translate(36.7499,-430.323)">		<title>工作表.3</title>		<desc>/dev/ffs-xxx/</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="35.9999" cy="575.503" width="72" height="26.9999"></v:textrect>		<rect x="0" y="562.005" width="71.9998" height="26.9999" class="st2"></rect>		<text x="4.56" y="579.1" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>/dev/ffs-xxx/</text>		</g>	<g id="shape4-10" v:mid="4" v:groupcontext="shape" transform="translate(45.7498,-421.323)">		<title>工作表.4</title>		<desc>/dev/ffs-xxx/</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="35.9999" cy="575.503" width="72" height="26.9999"></v:textrect>		<rect x="0" y="562.005" width="71.9998" height="26.9999" class="st2"></rect>		<text x="4.56" y="579.1" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>/dev/ffs-xxx/</text>		</g>	<g id="shape5-13" v:mid="5" v:groupcontext="shape" transform="translate(54.7498,-412.323)">		<title>工作表.5</title>		<desc>/dev/ffs-xxx/</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="35.9999" cy="575.503" width="72" height="26.9999"></v:textrect>		<rect x="0" y="562.005" width="71.9998" height="26.9999" class="st2"></rect>		<text x="4.56" y="579.1" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>/dev/ffs-xxx/</text>		</g>	<g id="shape6-16" v:mid="6" v:groupcontext="shape" transform="translate(133.5,-412.323)">		<title>工作表.6</title>		<desc>/sys/kernel/config/usb_gadget/...</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="89.9997" cy="575.503" width="180" height="26.9999"></v:textrect>		<rect x="0" y="562.005" width="179.999" height="26.9999" class="st2"></rect>		<text x="7.94" y="579.1" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>/sys/kernel/config/usb_gadget/...</text>		</g>	<g id="shape7-19" v:mid="7" v:groupcontext="shape" transform="translate(324.749,-412.323)">		<title>工作表.7</title>		<desc>/sys/bus/usb/...</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="47.2498" cy="575.503" width="94.5" height="26.9999"></v:textrect>		<rect x="0" y="562.005" width="94.4997" height="26.9999" class="st2"></rect>		<text x="8.72" y="579.1" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>/sys/bus/usb/...</text>		</g>	<g id="shape8-22" v:mid="8" v:groupcontext="shape" transform="translate(27.7499,-220.824)">		<title>工作表.8</title>		<rect x="0" y="429.005" width="188.999" height="159.999" class="st2"></rect>	</g>	<g id="shape9-24" v:mid="9" v:groupcontext="shape" transform="translate(36.7499,-326.823)">		<title>工作表.9</title>		<desc>Function driver</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="40.4999" cy="571.003" width="81" height="35.9999"></v:textrect>		<rect x="0" y="553.005" width="80.9997" height="35.9999" class="st2"></rect>		<text x="28.5" y="567.01" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>功能<v:lf></v:lf><tspan x="16.5" dy="1.331em" class="st5">驱动程序</tspan></text>		</g>	<g id="shape10-28" v:mid="10" v:groupcontext="shape" transform="translate(126.75,-326.823)">		<title>工作表.10</title>		<desc>Function driver</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="40.4999" cy="571.003" width="81" height="35.9999"></v:textrect>		<rect x="0" y="553.005" width="80.9997" height="35.9999" class="st2"></rect>		<text x="28.5" y="567.01" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>功能<v:lf></v:lf><tspan x="16.5" dy="1.331em" class="st5">驱动程序</tspan></text>		</g>	<g id="shape11-32" v:mid="11" v:groupcontext="shape" transform="translate(36.7499,-272.823)">		<title>工作表.11</title>		<desc>Gadget framework configfs, UDC core</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="85.4997" cy="566.503" width="171" height="44.9999"></v:textrect>		<rect x="0" y="544.005" width="170.999" height="44.9999" class="st2"></rect>		<text x="54.51" y="562.51" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Gadget <tspan class="st6">框架<v:newlinechar></v:newlinechar></tspan><tspan x="36.34" dy="1.331em" class="st5">configfs</tspan><tspan class="st6">、</tspan>UDC <tspan class="st6">核心</tspan></text>		</g>	<g id="shape12-39" v:mid="12" v:groupcontext="shape" transform="translate(36.7499,-227.824)">		<title>工作表.12</title>		<desc>Device controller driver</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="85.4997" cy="571.003" width="171" height="35.9999"></v:textrect>		<rect x="0" y="553.005" width="170.999" height="35.9999" class="st2"></rect>		<text x="31.5" y="575" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>设备控制器驱动程序</text>		</g>	<g id="shape13-42" v:mid="13" v:groupcontext="shape" transform="translate(252.749,-220.824)">		<title>工作表.13</title>		<rect x="0" y="429.005" width="188.999" height="159.999" class="st2"></rect>	</g>	<g id="shape14-44" v:mid="14" v:groupcontext="shape" transform="translate(261.749,-326.823)">		<title>工作表.14</title>		<desc>Class driver</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="40.4999" cy="571.003" width="81" height="35.9999"></v:textrect>		<rect x="0" y="553.005" width="80.9997" height="35.9999" class="st2"></rect>		<text x="28.5" y="567.01" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>类别<v:newlinechar></v:newlinechar><tspan x="16.5" dy="1.331em" class="st5">驱动程序</tspan></text>		</g>	<g id="shape15-48" v:mid="15" v:groupcontext="shape" transform="translate(351.749,-326.823)">		<title>工作表.15</title>		<desc>Class driver</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="40.4999" cy="571.003" width="81" height="35.9999"></v:textrect>		<rect x="0" y="553.005" width="80.9997" height="35.9999" class="st2"></rect>		<text x="28.5" y="567.01" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>类别<v:newlinechar></v:newlinechar><tspan x="16.5" dy="1.331em" class="st5">驱动程序</tspan></text>		</g>	<g id="shape16-52" v:mid="16" v:groupcontext="shape" transform="translate(261.749,-272.823)">		<title>工作表.16</title>		<desc>USB core</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="85.4997" cy="566.503" width="171" height="44.9999"></v:textrect>		<rect x="0" y="544.005" width="170.999" height="44.9999" class="st2"></rect>		<text x="62.27" y="570.5" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>USB <tspan class="st6">核心</tspan></text>		</g>	<g id="shape17-56" v:mid="17" v:groupcontext="shape" transform="translate(261.749,-227.824)">		<title>工作表.17</title>		<desc>Host controller driver</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="85.4997" cy="571.003" width="171" height="35.9999"></v:textrect>		<rect x="0" y="553.005" width="170.999" height="35.9999" class="st2"></rect>		<text x="31.5" y="575" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>主机控制器驱动程序</text>		</g>	<g id="shape18-59" v:mid="18" v:groupcontext="shape" transform="translate(144.75,-173.824)">		<title>工作表.18</title>		<desc>dwc3-qcom</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="89.9997" cy="577.191" width="180" height="23.6249"></v:textrect>		<rect x="0" y="565.38" width="179.999" height="23.6249" class="st2"></rect>		<text x="61.5" y="580.79" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>dwc3-qcom</text>		</g>	<g id="shape19-62" v:mid="19" v:groupcontext="shape" transform="translate(72.7498,-137.824)">		<title>工作表.19</title>		<desc>DWC3 core drivers</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="161.999" cy="577.191" width="324.01" height="23.6249"></v:textrect>		<rect x="0" y="565.38" width="323.999" height="23.6249" class="st2"></rect>		<text x="109.37" y="581.19" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>DWC3 <tspan class="st6">核心驱动程序</tspan></text>		</g>	<g id="shape20-66" v:mid="20" v:groupcontext="shape" transform="translate(72.7498,-96.761)">		<title>工作表.20</title>		<desc>Femto phy driver</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="55.7511" cy="578.597" width="111.52" height="20.8124"></v:textrect>		<rect x="0" y="568.192" width="111.502" height="20.8124" class="st2"></rect>		<text x="4.31" y="582.59" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Femto phy <tspan class="st6">驱动程序</tspan></text>		</g>	<g id="shape21-70" v:mid="21" v:groupcontext="shape" transform="translate(288.749,-96.761)">		<title>工作表.21</title>		<desc>QMP phy driver</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="53.9998" cy="578.597" width="108.01" height="20.8124"></v:textrect>		<rect x="0" y="568.192" width="108" height="20.8124" class="st2"></rect>		<text x="6" y="582.59" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>QMP phy <tspan class="st6">驱动程序</tspan></text>		</g>	<g id="shape22-74" v:mid="22" v:groupcontext="shape" transform="translate(459.748,-186.199)">		<title>工作表.22</title>		<desc>UCSI</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="49.4998" cy="577.191" width="99" height="23.6249"></v:textrect>		<rect x="0" y="565.38" width="98.9997" height="23.6249" class="st2"></rect>		<text x="38.18" y="580.79" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>UCSI</text>		</g>	<g id="shape23-77" v:mid="23" v:groupcontext="shape" transform="translate(459.748,-137.824)">		<title>工作表.23</title>		<desc>PMIC GLINK</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="49.4998" cy="577.191" width="99" height="23.6249"></v:textrect>		<rect x="0" y="565.38" width="98.9997" height="23.6249" class="st2"></rect>		<text x="20.39" y="580.79" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>PMIC GLINK</text>		</g>	<g id="shape24-80" v:mid="24" v:groupcontext="shape" transform="translate(612.748,-52.3241)">		<title>工作表.24</title>		<desc>PM7325B</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="44.9999" cy="575.503" width="90" height="26.9999"></v:textrect>		<rect x="0" y="562.005" width="89.9997" height="26.9999" class="st2"></rect>		<text x="21.34" y="579.1" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>PM7325B</text>		</g>	<g id="shape25-83" v:mid="25" v:groupcontext="shape" transform="translate(612.748,-137.824)">		<title>工作表.25</title>		<desc>aDSP core charger firmware</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="44.9999" cy="553.003" width="90" height="71.9998"></v:textrect>		<rect x="0" y="517.005" width="89.9997" height="71.9998" class="st2"></rect>		<text x="19.22" y="549.01" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>aDSP <tspan class="st6">内核<v:newlinechar></v:newlinechar></tspan><tspan x="15" dy="1.331em" class="st6">充电器固件</tspan></text>		</g>	<g id="shape26-88" v:mid="26" v:groupcontext="shape" v:layermember="0" transform="translate(558.748,-149.634)">		<title>Dynamic connector</title>		<path d="M54 589 L49.26 589 L48.9 589 L0 589" class="st7"></path>	</g>	<g id="shape27-94" v:mid="27" v:groupcontext="shape" v:layermember="0" transform="translate(657.751,-79.328)">		<title>Dynamic connector.28</title>		<path d="M0 530.5 L0 535.24 L0 535.6 L0 589" class="st7"></path>	</g>	<g id="shape28-99" v:mid="28" v:groupcontext="shape" v:layermember="0" transform="translate(509.251,-161.453)">		<title>Dynamic connector.29</title>		<path d="M0 564.25 L0 568.99 L0 569.35 L0 589" class="st7"></path>	</g>	<g id="shape29-104" v:mid="29" v:groupcontext="shape" v:layermember="0" transform="translate(324.749,-185.076)">		<title>Dynamic connector.30</title>		<path d="M0 589 L4.74 589 L5.1 589 L25.12 589 A2.36219 2.36219 0 1 1 29.84 589 L58.5 589 L58.5 577.75 L135 577.75" class="st7"></path>	</g>	<g id="shape30-109" v:mid="30" v:groupcontext="shape" v:layermember="0" transform="translate(335.81,-60.4071)">		<title>Dynamic connector.31</title>		<desc>VBUS, CC, D+,D-</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="138.469" cy="589.001" width="61.93" height="17.6035"></v:textrect>		<path d="M0 589 L4.74 589 L5.1 589 L276.94 589" class="st7"></path>		<rect v:rectcontext="textBkgnd" x="117.353" y="578.351" width="42.2303" height="21.3003" class="st9"></rect>		<text x="117.35" y="586.34" class="st10" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>VBUS<tspan class="st6">、</tspan>CC<tspan class="st6">、<v:lf></v:lf></tspan><tspan x="126.33" dy="1.331em" class="st5">D</tspan>+<tspan class="st6">、</tspan>D-</text>		</g>	<g id="shape31-120" v:mid="31" v:groupcontext="shape" v:layermember="0" transform="translate(156.002,-68.4956)">		<title>Dynamic connector.32</title>		<desc>HS</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="-0.00338999" cy="574.87" width="40.05" height="17.6035"></v:textrect>		<path d="M0 560.73 L0 565.47 L0 565.83 L0 589" class="st7"></path>		<rect v:rectcontext="textBkgnd" x="-4.33326" y="570.071" width="8.65997" height="9.59985" class="st9"></rect>		<text x="-4.33" y="577.27" class="st10" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>HS</text>		</g>	<g id="shape32-127" v:mid="32" v:groupcontext="shape" v:layermember="0" transform="translate(313.502,-68.4956)">		<title>Dynamic connector.33</title>		<desc>SS</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="-0.00338999" cy="574.87" width="40.05" height="17.6035"></v:textrect>		<path d="M0 560.73 L0 565.47 L0 565.83 L0 589" class="st7"></path>		<rect v:rectcontext="textBkgnd" x="-3.67902" y="570.071" width="7.3515" height="9.59985" class="st9"></rect>		<text x="-3.68" y="577.27" class="st10" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>SS</text>		</g>	<g id="shape33-134" v:mid="33" v:groupcontext="shape" v:layermember="0" transform="translate(126.753,-117.578)">		<title>Dynamic connector.34</title>		<path d="M0 589 L0 584.26 L0 583.9 L0 568.75" class="st7"></path>	</g>	<g id="shape34-139" v:mid="34" v:groupcontext="shape" v:layermember="0" transform="translate(342.752,-117.578)">		<title>Dynamic connector.44</title>		<path d="M0 589 L0 584.26 L0 583.9 L0 568.75" class="st7"></path>	</g>	<g id="shape35-144" v:mid="35" v:groupcontext="shape" v:layermember="0" transform="translate(108.753,-161.448)">		<title>Dynamic connector.45</title>		<path d="M0 529.62 L0 534.36 L0 534.72 L0 589" class="st7"></path>	</g>	<g id="shape36-149" v:mid="36" v:groupcontext="shape" v:layermember="0" transform="translate(352.231,-161.448)">		<title>Dynamic connector.37</title>		<path d="M0 529.62 L0 534.36 L0 534.72 L0 589" class="st7"></path>	</g>	<g id="shape37-154" v:mid="37" v:groupcontext="shape" v:layermember="0" transform="translate(372.002,-380.827)">		<title>Dynamic connector.47</title>		<path d="M0 557.5 L0 562.24 L0 562.6 L0 589" class="st7"></path>	</g>	<g id="shape38-159" v:mid="38" v:groupcontext="shape" v:layermember="0" transform="translate(175.127,-380.827)">		<title>Dynamic connector.49</title>		<path d="M0 557.5 L0 562.24 L0 562.6 L0 589" class="st7"></path>	</g>	<g id="shape39-164" v:mid="39" v:groupcontext="shape" v:layermember="0" transform="translate(90.7531,-380.827)">		<title>Dynamic connector.50</title>		<path d="M0 557.5 L0 562.24 L0 562.6 L0 589" class="st7"></path>	</g>	<g id="shape40-169" v:mid="40" v:groupcontext="shape" v:layermember="0" transform="translate(176.246,-197.448)">		<title>Dynamic connector.51</title>		<path d="M0 565.62 L0 570.36 L0 570.72 L0 589" class="st7"></path>	</g>	<g id="shape41-174" v:mid="41" v:groupcontext="shape" v:layermember="0" transform="translate(288.752,-197.448)">		<title>Dynamic connector.52</title>		<path d="M0 565.62 L0 570.36 L0 570.72 L0 589" class="st7"></path>	</g>	<g id="shape42-179" v:mid="42" v:groupcontext="shape" v:layermember="0" transform="translate(234.752,-161.447)">		<title>Dynamic connector.53</title>		<path d="M0 576.62 L0 580.64 L0 581 L0 589" class="st11"></path>	</g>	<g id="shape43-185" v:mid="43" v:groupcontext="shape" transform="translate(432.749,-412.323)">		<title>工作表.43</title>		<desc>/sys/class/typec/port0/...</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="67.4998" cy="575.503" width="135" height="26.9999"></v:textrect>		<rect x="0" y="562.005" width="135" height="26.9999" class="st2"></rect>		<text x="5.62" y="579.1" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>/sys/class/typec/port0/...</text>		</g>	<g id="shape44-188" v:mid="44" v:groupcontext="shape" transform="translate(459.748,-227.824)">		<title>工作表.44</title>		<desc>Dual-role class driver</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="49.4998" cy="571.003" width="99" height="35.9999"></v:textrect>		<rect x="0" y="553.005" width="98.9997" height="35.9999" class="st2"></rect>		<text x="25.5" y="567.01" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>双角色类<v:lf></v:lf><tspan x="25.5" dy="1.331em" class="st5">驱动程序</tspan></text>		</g>	<g id="shape45-192" v:mid="45" v:groupcontext="shape" v:layermember="0" transform="translate(509.251,-263.827)">		<title>Dynamic connector.46</title>		<path d="M0 440.51 L0 445.25 L0 445.61 L0 589" class="st7"></path>	</g>	<g id="shape46-197" v:mid="46" v:groupcontext="shape" transform="translate(18.7499,-488.823)">		<title>工作表.46</title>		<rect x="0" y="508.005" width="553.498" height="80.9997" class="st2"></rect>	</g>	<g id="shape47-199" v:mid="47" v:groupcontext="shape" transform="translate(456.868,-515.823)">		<title>工作表.47</title>		<desc>Type-C role swap</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="52.3798" cy="575.503" width="104.76" height="26.9999"></v:textrect>		<rect x="0" y="562.005" width="104.76" height="26.9999" class="st2"></rect>		<text x="10.21" y="579.5" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Type-C <tspan class="st6">角色调换</tspan></text>		</g>	<g id="shape48-203" v:mid="48" v:groupcontext="shape" transform="translate(24.3749,-493.323)">		<title>工作表.48</title>		<rect x="0" y="517.005" width="142.875" height="71.9998" class="st2"></rect>	</g>	<g id="shape49-205" v:mid="49" v:groupcontext="shape" transform="translate(27.7499,-533.823)">		<title>工作表.49</title>		<desc>diag-router</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="35.9999" cy="575.503" width="72" height="26.9999"></v:textrect>		<rect x="0" y="562.005" width="71.9998" height="26.9999" class="st2"></rect>		<text x="8.44" y="579.1" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>diag-router</text>		</g>	<g id="shape50-208" v:mid="50" v:groupcontext="shape" transform="translate(90.7497,-524.823)">		<title>工作表.50</title>		<desc>port-bridge</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="35.9999" cy="575.503" width="72" height="26.9999"></v:textrect>		<rect x="0" y="562.005" width="71.9998" height="26.9999" class="st2"></rect>		<text x="8.16" y="579.1" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>port-bridge</text>		</g>	<g id="shape51-211" v:mid="51" v:groupcontext="shape" transform="translate(50.2498,-502.323)">		<title>工作表.51</title>		<desc>adbd.service</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="35.9999" cy="575.503" width="72" height="26.9999"></v:textrect>		<rect x="0" y="562.005" width="71.9998" height="26.9999" class="st2"></rect>		<text x="5.12" y="579.1" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>adbd.service</text>		</g>	<g id="shape52-214" v:mid="52" v:groupcontext="shape" transform="translate(171.749,-502.323)">		<title>工作表.52</title>		<desc>USB peripheral mode configuration</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="80.9997" cy="575.503" width="162" height="26.9999"></v:textrect>		<rect x="0" y="562.005" width="161.999" height="26.9999" class="st2"></rect>		<text x="33.77" y="579.5" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>USB <tspan class="st6">外设模式配置</tspan></text>		</g>	<g id="shape53-218" v:mid="53" v:groupcontext="shape" transform="translate(283.124,-533.823)">		<title>工作表.53</title>		<desc>Runtime power management control</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="80.9997" cy="575.503" width="162" height="26.9999"></v:textrect>		<rect x="0" y="562.005" width="161.999" height="26.9999" class="st2"></rect>		<text x="27" y="579.5" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>运行时功耗管理控制</text>		</g>	<g id="shape54-221" v:mid="54" v:groupcontext="shape" v:layermember="0" transform="translate(376.502,-439.327)">		<title>Dynamic connector.68</title>		<path d="M0 494.5 L0 499.24 L0 499.6 L0 589" class="st7"></path>	</g>	<g id="shape55-226" v:mid="55" v:groupcontext="shape" v:layermember="0" transform="translate(509.251,-439.327)">		<title>Dynamic connector.69</title>		<path d="M0 512.5 L0 517.24 L0 517.6 L0 589" class="st7"></path>	</g>	<g id="shape56-231" v:mid="56" v:groupcontext="shape" v:layermember="0" transform="translate(242.627,-439.327)">		<title>Dynamic connector.70</title>		<path d="M0 526 L0 530.74 L0 531.1 L0 589" class="st7"></path>	</g>	<g id="shape57-236" v:mid="57" v:groupcontext="shape" v:layermember="0" transform="translate(72.7532,-457.327)">		<title>Dynamic connector.72</title>		<path d="M0 553 L0 557.74 L0 558.1 L0 589" class="st7"></path>	</g>	<g id="shape58-241" v:mid="58" v:groupcontext="shape" v:layermember="0" transform="translate(509.251,-209.828)">		<title>Dynamic connector.73</title>		<path d="M0 571 L0 575.74 L0 576.1 L0 589" class="st7"></path>	</g>	<g id="shape59-246" v:mid="59" v:groupcontext="shape" transform="translate(452.008,-550.178)">		<title>工作表.59</title>		<desc>User-space services</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="60.1198" cy="579.003" width="120.24" height="19.9999"></v:textrect>		<rect x="0" y="569.005" width="120.24" height="19.9999" class="st13"></rect>		<text x="24.12" y="583" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>用户空间服务</text>		</g>	<g id="shape60-249" v:mid="60" v:groupcontext="shape" transform="translate(534.498,-454.756)">		<title>工作表.60</title>		<desc>VFS</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="18.8749" cy="579.003" width="37.75" height="19.9999"></v:textrect>		<rect x="0" y="569.005" width="37.7499" height="19.9999" class="st13"></rect>		<text x="9.96" y="582.6" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>VFS</text>		</g>	<g id="shape61-252" v:mid="61" v:groupcontext="shape" transform="translate(500.248,-378.823)">		<title>工作表.61</title>		<desc>Kernel-space</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="35.9999" cy="579.003" width="72" height="19.9999"></v:textrect>		<rect x="0" y="569.005" width="71.9998" height="19.9999" class="st13"></rect>		<text x="12" y="583" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>内核空间</text>		</g>	<g id="shape62-255" v:mid="62" v:groupcontext="shape" transform="translate(173.17,-8.34773)">		<title>工作表.62</title>		<desc>Type-C connector</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)" v:tabspace="42.5196"></v:textblock>		<v:textrect cx="60.1198" cy="579.003" width="120.24" height="19.9999"></v:textrect>		<rect x="0" y="569.005" width="120.24" height="19.9999" class="st14"></rect>		<text x="23.95" y="583" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Type-C <tspan class="st6">连接器</tspan></text>		</g>	<g id="group63-259" transform="translate(131.25,-34.8907)" v:mid="63" v:groupcontext="group">		<title>工作表.63</title>		<g id="shape64-260" v:mid="64" v:groupcontext="shape">			<title>工作表.64</title>			<path d="M0 572.2 A16.8047 16.8047 -180 0 0 16.8 589 L190.2 589 A16.8047 16.8047 -180 0 0 207 572.2 A16.8047 16.8047						 -180 0 0 190.2 555.4 L16.8 555.4 A16.8047 16.8047 -180 0 0 0 572.2 Z" class="st15"></path>		</g>		<g id="shape65-262" v:mid="65" v:groupcontext="shape" transform="translate(13.3633,-12.9813)">			<title>工作表.65</title>			<path d="M0 588.24 a0.763852 0.763852 -180 0 0 0.763835 0.763835 L179.5 589 a0.763852 0.763852 -180 0 0 0.763835						 -0.763835 L180.27 582.13 a0.763852 0.763852 -180 0 0 -0.763835 -0.763835 L0.76 581.37 a0.763852 0.763852						 -180 0 0 -0.763835 0.763835 L0 588.24 Z" class="st16"></path>		</g>		<g id="shape66-264" v:mid="66" v:groupcontext="shape" transform="translate(14.322,-18.5188)">			<title>r.297</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape67-266" v:mid="67" v:groupcontext="shape" transform="translate(14.322,-11.6442)">			<title>工作表.67</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape68-268" v:mid="68" v:groupcontext="shape" transform="translate(29.5986,-18.5188)">			<title>r</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape69-270" v:mid="69" v:groupcontext="shape" transform="translate(29.5986,-11.6442)">			<title>工作表.69</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape70-272" v:mid="70" v:groupcontext="shape" transform="translate(44.8754,-18.5188)">			<title>r.307</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape71-274" v:mid="71" v:groupcontext="shape" transform="translate(44.8754,-11.6442)">			<title>工作表.71</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape72-276" v:mid="72" v:groupcontext="shape" transform="translate(60.152,-18.5188)">			<title>r.312</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape73-278" v:mid="73" v:groupcontext="shape" transform="translate(60.152,-11.6442)">			<title>工作表.73</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape74-280" v:mid="74" v:groupcontext="shape" transform="translate(75.4287,-18.5188)">			<title>r.317</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape75-282" v:mid="75" v:groupcontext="shape" transform="translate(75.4287,-11.6442)">			<title>工作表.75</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape76-284" v:mid="76" v:groupcontext="shape" transform="translate(90.7054,-18.5188)">			<title>r.322</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape77-286" v:mid="77" v:groupcontext="shape" transform="translate(90.7054,-11.6442)">			<title>工作表.77</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape78-288" v:mid="78" v:groupcontext="shape" transform="translate(105.982,-18.5188)">			<title>r.327</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape79-290" v:mid="79" v:groupcontext="shape" transform="translate(105.982,-11.6442)">			<title>工作表.79</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape80-292" v:mid="80" v:groupcontext="shape" transform="translate(121.259,-18.5188)">			<title>r.332</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape81-294" v:mid="81" v:groupcontext="shape" transform="translate(121.259,-11.6442)">			<title>工作表.81</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape82-296" v:mid="82" v:groupcontext="shape" transform="translate(136.536,-18.5188)">			<title>r.337</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape83-298" v:mid="83" v:groupcontext="shape" transform="translate(136.536,-11.6442)">			<title>工作表.83</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape84-300" v:mid="84" v:groupcontext="shape" transform="translate(151.812,-18.5188)">			<title>r.342</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape85-302" v:mid="85" v:groupcontext="shape" transform="translate(151.812,-11.6442)">			<title>工作表.85</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape86-304" v:mid="86" v:groupcontext="shape" transform="translate(167.088,-18.5188)">			<title>r.347</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape87-306" v:mid="87" v:groupcontext="shape" transform="translate(167.088,-11.6442)">			<title>工作表.87</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape88-308" v:mid="88" v:groupcontext="shape" transform="translate(182.365,-18.5188)">			<title>r.352</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>		<g id="shape89-310" v:mid="89" v:groupcontext="shape" transform="translate(182.365,-11.6442)">			<title>工作表.89</title>			<rect x="0" y="585.567" width="10.3118" height="3.43726" class="st17"></rect>		</g>	</g></g>
</svg>

沙盒通过以下 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- 进行数据传输。PHY 支持显示备用模式，当 USB 以 SuperSpeed 速度工作时，显示屏可声明一对通道用于镜像功能。更多详细信息，可访问 [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 接口

Source: [https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html)

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）上的网络设备制定的规范。
    - 内核驱动程序：它使用 `f_rndis` 驱动程序，该驱动程序位于上游 Linux 内核中，直接与网络接口或协议栈进行通信。
- 网络控制模型 (NCM)
    - NCM 是一种协议，旨在提供与 RNDIS 相比更为先进的特性和功能。
    - 该协议常见于 USB 设备必须处理高要求网络任务的应用中。
- USB 音频 2 类 (UAC2)
    - UAC2 是一种标准，用于管理 USB 音频设备与计算机之间的通信。
    - UAC2 支持更高的音频数据传输速率，可以改善音质并缩短延迟。
- USB 视频类 (UVC)
    - UVC 是一种标准，用于定义视频流设备（如网络摄像头）如何通过 USB 与计算机通信。
    - UVC 有助于实现视频设备的即插即用功能。

## USB 软件

Source: [https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html)

软件支持以下 USB 功能。

Table : USB 软件功能

| 功能 | 说明 |
| --- | --- |
| 外设 ADB | 通过 functionFS (FFS) 集成 ADB 功能 |
| 外设大容量存储 | 通用大容量存储功能 |
| 外设诊断 | 通过 FFS 集成诊断功能 |
| 外设 RNDIS | 基于 Linux 内核的标准 RNDIS 协议 |
| 外设网络控制 modem (NCM) | 基于 Linux 内核的标准 NCM 协议 |
| 主机 USB 3.0 驱动程序 (xHCI) | 两个 USB 控制器均支持 xHCI 架构 |
| 主机高速 USB | 主机模式下的高速 USB 检测 |
| 主机 HID/MS/集线器驱动程序 | 主机模式下的类驱动程序检测 |
| 主机视频驱动程序 | 在数量有限的网络摄像头模块上进行了 UVC 验证 |
| 主机链路功耗管理 | USB 主机模式低功耗实现 |
| 外设 USB 链路功耗管理 | USB 设备模式低功耗实现 |
| DRD | 可支持双角色设备（支持主机/设备模式） |
| USB Type-C | 受 PM7325B 支持；支持电流充电、CC 逻辑和 SuperSpeed USB 转换器选择，一切均在嵌入式控制器中完成 |
| USB Type-C DisplayPort | 支持超高速 USB + DisplayPort 并行工作（2 条 DisplayPort 通道） |
| USB PD 2.0/3.0 充电 | 是否支持 PD 取决于所使用的 PM7325B 解决方案。完全符合 PD 3.0 规范 |
| USB 3.1 第 1 代 | USB 控制器支持 USB 3.x Gen1 (5 Gbps)。 |

## USB 工具

Source: [https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html)

下表列出了一些常用的 USB 工具。

Table : USB 工具和下载详细信息

| USB 工具 | 下载链接 |
| --- | --- |
| 平台工具 (adb/fastboot) | [https://developer.android.com/tools/releases/platform-tools](https://developer.android.com/tools/releases/platform-tools) |
| USB 视频类 (UVC) LibUVC | <ul class="ul" id="usb-tools__ul_rj4_ccl_j1c"><br>                                    <li class="li"><a href="https://github.com/libuvc/libuvc" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://github.com/libuvc/libuvc')">https://github.com/libuvc/libuvc</a></li><br><br>                                    <li class="li"><a href="https://libuvc.github.io/libuvc/" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://libuvc.github.io/libuvc/')">https://libuvc.github.io/libuvc/</a></li><br><br>                                </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 bootloader 配置

Source: [https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html)

对于 bootloader 中用于调优高速和 SuperSpeed USB 信号质量的设备树参数，可以使用 Qualcomm DeviceTree 编辑器 (QDTE) 工具进行修改。

QDTE 工具用于通过编辑 xbl\_config.elf 文件来配置设备树二进制 blob (DTB)，如下图所示。有关如何配置设备树 blob 的更多信息，参见 [QDTE](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-4/qdte-tools.html) 一节。

Figure : 设备树布局
            ![](data:image/png;base64,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)

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

Table : USB 配置属性

| 属性名称 | 属性说明 | 数据类型 | 可能的值和值范围 | 设备行为 |
| --- | --- | --- | --- | --- |
| `path=/soc/usb0/hs_phy_cfg` | 调优主 USB 控制器 HS-PHY 的 USB 信号质量。 | UINT32-array | <ul class="ul" id="usb-configuration__ul_jml_bfl_l1c"><br>                                <li class="li">该属性为地址数组，值对 &lt;<code class="ph codeph">addr</code>, <code class="ph codeph">val</code>&gt;</li><br><br>                                <li class="li"><code class="ph codeph">addr</code> 的长度为 4 字节。共有 4 个值可供选择：<code class="ph codeph">[0x88E306C, 0x88E3070, 0x88E3074, 0x88E3078]</code></li><br><br>                                <li class="li"><code class="ph codeph">val</code> 的长度为 1 字节，取值范围为：<code class="ph codeph">0x00</code> 到 <code class="ph codeph">0xFF</code></li><br><br>                            </ul> | 改善了主 USB HS-PHY 的 USB 信号质量。 |
| `path=/soc/usb0/ss_phy_cfg` | 改善主 USB 控制器 SS-PHY 的信号质量。 | UINT32-array | <ul class="ul" id="usb-configuration__ul_lml_bfl_l1c"><br>                                <li class="li">该属性为地址数组，值对 &lt;<code class="ph codeph">addr</code>, <code class="ph codeph">val</code>&gt;</li><br><br>                                <li class="li"><code class="ph codeph">addr</code> 的长度为 4 字节。共有 2 个值可供选择： <code class="ph codeph">[0x088E8000, 0x088EB000]</code></li><br><br>                                <li class="li"><code class="ph codeph">val</code> 的长度为 1 字节，取值范围为：<code class="ph codeph">0x00</code> 到 <code class="ph codeph">0xFF</code></li><br><br>                            </ul> | 改善了主 USB SS-PHY 的信号质量。 |
| `path=/soc/usb1/hs_phy_cfg` | 改善辅 USB 控制器 HS-PHY 的 USB 信号质量。 | UINT32-array | <ul class="ul" id="usb-configuration__ul_nml_bfl_l1c"><br>                                <li class="li">该属性为地址数组，值对 &lt;<code class="ph codeph">addr</code>, <code class="ph codeph">val</code>&gt;</li><br><br>                                <li class="li"><code class="ph codeph">addr</code> 的长度为 4 字节。共有 4 个值可供选择：<code class="ph codeph">[0x88E406C,0x88E4070, 0x88E4074, 0x88E4078]</code></li><br><br>                                <li class="li"><code class="ph codeph">val</code> 的长度为 1 字节，取值范围为：<code class="ph codeph">0x00</code> 到 <code class="ph codeph">0xFF</code></li><br><br>                            </ul> | 改善了辅 USB HS-PHY 的信号质量。 |
| `Path = /sw/usb_config/fastboot_core_num` | 选择 Fastboot 的 USB 核心编号（主 = 0/辅 = 1） | UINT32 | 0 或 1 | 根据所选属性在 USB 核心 0 或核心 1 上枚举 Fastboot 设备。 |

## USB 摄像头配置

Source: [https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html)

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：要搭建交叉编译环境，可运行以下命令。

            sudo apt install gcc-aarch64-linux-gnuCopy to clipboard
    - 方法 2：要搭建交叉编译环境，可运行以下命令：
        1. 下载交叉编译器。

                wget https://releases.linaro.org/archive/14.07/components/toolchain/binaries/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux.tar.xz
                Copy to clipboard
        2. 解压获取交叉编译器。

                tar -xf gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux.tar.xzCopy to clipboard
        3. 通过运行以下命令搭建交叉编译环境。

                export PATH=$PATH:`pwd`/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/binCopy to clipboard
2. 克隆 Yavta 存储库并更改目录。

        git clone https://github.com/fastr/yavta.git
        cd yavta
        Copy to clipboard
3. 交叉编译工具。

        make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-Copy to clipboard
4. 要将 Yavta 推送到 Qualcomm Linux 芯片产品，应执行以下操作：
    1. 在 Permissive 模式下打开 SSH shell。有关如何运行 SSH 的更多信息，参见[使用 SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/how_to.html#use-ssh) 一节。
    2. 安装文件系统。

            mount -o remount,rw /Copy to clipboard
    3. 使用 SCP 或类似工具传输文件。有关如何运行 SSH 的更多信息，参见[使用 SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/how_to.html#use-ssh) 一节。
        例如，`scp yavta root@10.92.162.185:/usr/bin`
    4. 在 Yavta 中分配执行权限。

            chmod 0777 /usr/bin/yavtaCopy to clipboard

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

要通过 Yavta 或 GStreamer 配置 USB 摄像头，必须执行以下步骤。
1. 要了解枚举详细信息，应插入 USB 摄像头并运行以下命令。

        lsusbCopy to clipboard

随即显示以下输出。

        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
        Copy to clipboard
2. 在串行控制台中识别以 /dev/videoX 形式创建的 USB 摄像头视频节点。

        ls /sys/bus/usb/devices/1-1/1-1:1.0/video4linux/Copy to clipboard

Note: `1-1/1-1:1.0` 值因具体连接的 USB 设备而异。

随即显示以下输出。

        video4	video5Copy to clipboard
3. 要使用 Yavta 查看支持的输出格式和大小，应运行以下命令：

        yavta /dev/video4 --enum-formatsCopy to clipboard

随即显示以下输出。

        Device /dev/video4 opened: w200: w200 (usb-xhci-hcd.2.auto-1).
        - Available formats:Format 0: MJPG (47504a4d)Type: Video capture (1)Name: Motion-JPEGFrame 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:2Frame size: 1280x720 (1/10)Frame size: 800x600 (1/15)Frame size: 640x480 (1/30)Frame size: 320x240 (1/30)
        Copy to clipboard
4. 从第 3 步的显示结果中选择所需的图像格式和大小。

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

**前提条件**：确保 Yavta 已完成交叉编译，并且输出格式和大小已确定。

- 要选择 1280x720 输出大小和 30 fps 的 MJPEG 格式，并在 /tmp/ 下捕获 10 帧（文件名为 testmjpeg-00000\*.bin），应运行以下命令。

        yavta -f MJPEG -s 1280x720 -t 1/30 -c10 -F/tmp/testmjpeg /dev/video4Copy to clipboard

随即显示以下输出。

        Device /dev/video4 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.
        Copy to clipboard
- 要选择 1280x960 输出大小和 30 fps 的 YUV 格式，并在 /tmp/ 下捕获 10 帧（生成的文件名为 testmjpeg-00000\*.bin），应运行以下命令。

        yavta -f YUYV -s 1280x720 -t 1/30 -c10 -F/tmp/testyuv /dev/video4Copy to clipboard

随即显示以下输出。

        Device /dev/video4 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.
        Copy to clipboard

### 使用 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-70015-51/install-sdk.html)一节。

Qualcomm IM SDK 包含 `v4l2src` 插件，该插件可选择 USB 摄像头的输入格式。`waylandsink` 插件负责在 Wayland 显示界面上渲染视频输出。

**前提条件**：确保 Yavta 已完成交叉编译，并且输出格式和大小已确定。

1. 要设置 Wayland 显示界面的环境变量，应在串行控制台中运行以下命令。

        export XDG_RUNTIME_DIR=/dev/socket/weston && export WAYLAND_DISPLAY=wayland-1Copy to clipboard
2. 使用 GStreamer 命令将摄像头拍摄的视频流式传输到 UI。确保已设置合适的设备 ID (`/dev/videoX`)，并根据检测到的 USB 摄像头选择正确的格式。
    - 对于 720p，运行以下命令：

            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=trueCopy to clipboard

随即显示以下输出。

            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.
            Copy to clipboard
    - 对于 1080p，运行以下命令：

            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.Copy to clipboard

## USB 定制

Source: [https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html)

本节介绍在 USB 软件中进行各种配置和定制的要求。

### 具有 diag 和 ADB 接口的 USB 复合设备的 shell 脚本示例

    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
    Copy to clipboard

### 通过 QUSB 服务更改 USB 复合设备

`usb.service` 启动 QUSB 服务（位于 /usr/bin/qusb），以便用户灵活地配置 USB gadget。这样可以完全省去使用 `configfs` 手动执行命令初始化 USB 的麻烦。

示例：

    qusb [bind] [unbind] [showpid] [help]
                         [setpid [-p] <PID>] [persist <PID>]
    Copy to clipboard

### 启用和配置 UVC 用例

USB 视频设备类（也是 USB 视频类或 UVC）是一种 USB 设备类，描述可流式传输视频的设备，例如网络摄像头、数码相机、转码器、模拟视频转换器和静态图像相机。

USB 视频类规范的最新版本为 v1.5。USB 实施者论坛描述了 v1.5 中的基本协议和不同的净荷格式。

Note: QCS9075 不支持 UVC 用例。

下面介绍了用于测试 UVC 的工具和步骤：
- **UVC gadget**（设备端）：用于测试 `f_uvc` 功能驱动程序的示例程序。该示例程序会打开由 `uvc_gadget` 创建的视频节点，并以指定的帧率发送 MJPEG 帧。该示例程序针对 DUT 进行交叉编译。
Note: 确保主机上已安装交叉编译 64 位 Arm® 技术编译器所需的软件包和工具。

    1. 可以使用以下任一方法搭建交叉编译环境。
        - 方法 1：运行以下命令。

                sudo apt install gcc-aarch64-linux-gnuCopy to clipboard
        - 方法 2：要搭建交叉编译环境，可运行以下命令：
            1. 下载交叉编译器。

                    wget https://releases.linaro.org/archive/14.07/components/toolchain/binaries/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux.tar.xz
                    Copy to clipboard
            2. 解压获取交叉编译器。

                    tar -xf gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux.tar.xzCopy to clipboard
            3. 通过运行以下命令搭建交叉编译环境。

                    export PATH=$PATH:`pwd`/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/binCopy to clipboard
    2. 要编译 UVC gadget 工具，应执行以下操作。
        1. 克隆 `uvc-gadget` 存储库。

                git clone https://github.com/wlhe/uvc-gadget.git
                cd uvc-gadget
                Copy to clipboard
        2. 修改 `Makefile` 以进行静态编译。

                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
                Copy to clipboard
        3. 交叉编译 `arm64` 以生成 `uvc‑gadget` 可执行文件。

                make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-Copy to clipboard
- **UVC 查看器**（主机端）：要接收 UVC 数据，应打开计算机上的任意 USB 网络摄像头应用程序。
    1. 要进行验证，将 UVC gadget 应用程序和示例图像文件推送到设备，应执行以下操作：
        1. 在 Permissive 模式下打开 SSH shell。有关如何运行 SSH 的更多信息，参见[使用 SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/how_to.html#use-ssh) 一节。
        2. 安装文件系统。

                mount -o remount,rw /Copy to clipboard
        3. 使用 SCP 或类似工具传输文件。有关如何运行 SSH 的更多信息，参见[使用 SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/how_to.html#use-ssh) 一节。
            例如,`scp uvc-gadget root@10.92.175.138:/usr/bin`
        4. 分配执行权限。

                chmod 0777 /usr/bin/uvc-gadgetCopy to clipboard
    2. 切换到任意 UVC 复合设备（90DF 或 90CB）例如，

            qusb setpid 90CBCopy to clipboard

仅当用户空间视频应用程序打开时，才会在 UVC 复合设备中枚举 USB。要进行 USB 枚举，应通过控制台（串行控制台或 SSH shell）启动 `uvc_gadget`应用程序。
- YUYV
    1. 将 `image-720.yuv` 图像文件推送到 `/data`。

            scp image-720.yuv root@10.92.175.138:/dataCopy to clipboard
    2. 使用 `uvc-gadget` 工具验证 `image-720.yuv` 图像。

            uvc-gadget -u /dev/video0 -i /data/image-720.yuv -s 2 -m 2 -n 32  -t 10 -f 0
            Copy to clipboard

其中，`-f`为 &lt;format&gt;，可选择以下值：
        - `0` = V4L2\_PIX\_FMT\_YUYV
        - `1` = V4L2\_PIX\_FMT\_MJPEG
- MJPEG
    1. 将 `image-720.jpg` 图像文件推送到 `/data`。

            scp image-720.jpg root@10.92.175.138:/dataCopy to clipboard
    2. 使用 `uvc-gadget` 工具验证 `image-720.jpg` 图像。

            uvc-gadget -u /dev/video0 -i /data/image-720.jpg -s 2 -m 2 -n 32  -t 10 -f 1
            Copy to clipboard

其中，`-f`为 &lt;format&gt;，可选择以下值：
        - `0` = V4L2\_PIX\_FMT\_YUYV
        - `1` = V4L2\_PIX\_FMT\_MJPEG
- 有关使用信息，运行以下命令。

        ./uvc-gadget -hCopy to clipboard

    随即显示以下输出。

        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 deviceCopy to clipboard

### UAC 用例

USB 音频使用等时、中断和控制三种传输类型。所有音频数据均使用等时传输。中断传输用于中继转发与音频时钟可用性有关的信息，控制传输用于设置音量、请求采样率等。

Note: QCS9075 不支持 UAC 用例。

要进行验证，应选择具有 UAC 功能的 USB 复合设备。

    qusb setpid 90CACopy to clipboard

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

下面给出了一些示例命令。
- 列出 Linux 主机上的声卡。

        arecord -L 
        
        aplay -f S16_LE -r 44100 -c 2 -D front:CARD=qcs6490rb3gen2v,DEV=0 441k_16bit_5min_m1dB.wavCopy to clipboard
- 播放音频文件。
    - 要从设备向主机播放音频，应推送音频配置相匹配的 `file.wav`文件。以下为配置示例。
        - cat /sys/kernel/config/usb_gadget/adb/functions/uac2.0/p_chmaskCopy to clipboard

输出：

                3Copy to clipboard
        - cat /sys/kernel/config/usb_gadget/adb/functions/uac2.0/c_chmaskCopy to clipboard

输出：

                3Copy to clipboard
        - cat /sys/kernel/config/usb_gadget/adb/functions/uac2.0/p_srateCopy to clipboard

输出：

                48000Copy to clipboard
        - cat /sys/kernel/config/usb_gadget/adb/functions/uac2.0/c_srateCopy to clipboard

输出：

                64000Copy to clipboard
        - cat /sys/kernel/config/usb_gadget/adb/functions/uac2.0/p_ssizeCopy to clipboard

输出：

                2Copy to clipboard
        - cat /sys/kernel/config/usb_gadget/adb/functions/uac2.0/c_ssizeCopy to clipboard

输出：

                2Copy to clipboard

Note: 要修改音频配置，应先调整上述参数再将 USB 复合设备设为 90CA。
    - 在 SSH shell 或串行控制台上运行以下命令。

            tinyplay
            Copy to clipboard

随即显示以下输出。

            Usage: tinyplay file.wav [-D card] [-d device] [-p period_size] [-n n_periods]Copy to clipboard
    - 在装有 `arecord` 等应用程序的 Linux 主机上运行以下命令来捕获音频。

            arecord -f S16_LE -r 44100 -c 2 -D front:CARD=qcs6490rb3gen2v,DEV=0 test1.wavCopy to clipboard
- 录制音频文件。
    - 在装有 `aplay` 等应用程序的 Linux 主机上运行以下命令来播放音频。

            aplay -f S16_LE -r 44100 -c 2 -D front:CARD=qcs6490rb3gen2v,DEV=0 441k_16bit_5min_m1dB.wavCopy to clipboard
    - 在设备的 SSH shell 或串行控制台上运行以下命令。

            tinycap
            Copy to clipboard

随即显示以下输出。

            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]Copy to clipboard

### USB Power Delivery 中的数据角色调换

数据角色调换 (DR\_SWAP) 是指在通过 USB Type-C 连接器连接的两个端口伙伴之间调换 DFP（主机）角色与 UFP（设备）角色。电源角色调换 (PR\_SWAP) 在两个端口伙伴之间调换供电方角色和耗电方角色。

Note: QCS9075 不支持通过 Type-C 连接器进行数据/电源角色调换。

- 数据角色
    - 要将数据角色从主机调换为设备，应运行以下命令：

            cat /sys/class/typec/port0/data_role
            Copy to clipboard

随即显示以下输出。

            [host] deviceCopy to clipboard

            echo device > /sys/class/typec/port0/data_role
            cat /sys/class/typec/port0/data_roleCopy to clipboard

随即显示以下输出。

            host [device]Copy to clipboard
    - 要将数据角色从设备调换为主机，应运行以下命令：

            cat /sys/class/typec/port0/data_role
            Copy to clipboard

随即显示以下输出。

            host [device]Copy to clipboard

            echo host > /sys/class/typec/port0/data_role
            cat /sys/class/typec/port0/data_roleCopy to clipboard

随即显示以下输出。

            [host] deviceCopy to clipboard
- 电源角色
    - 要将电源角色从耗电方调换为供电方，应运行以下命令：

            cat /sys/class/typec/port0/power_role
            Copy to clipboard

随即显示以下输出。

            source [sink]Copy to clipboard

            echo source > /sys/class/typec/port0/power_role
            cat /sys/class/typec/port0/power_roleCopy to clipboard

随即显示以下输出。

            [source] sinkCopy to clipboard
    - 要将电源角色从供电方调换为耗电方，应运行以下命令：

            cat /sys/class/typec/port0/power_role
            Copy to clipboard

随即显示以下输出。

            [source] sinkCopy to clipboard

            echo sink > /sys/class/typec/port0/power_role
            cat /sys/class/typec/port0/power_roleCopy to clipboard

随即显示以下输出。

            source [sink]Copy to clipboard

### 使用 configfs 进行定制

`configfs` 文件系统提供 `sysfs` 功能的逆向操作。许多接口可以配置 Linux USB gadget，每个接口代表一个 USB 功能。

`qusb` 可执行文件通过 `configfs`使用以下命令配置 USB gadget。
1. 创建 `configfs` 并安装 `functionfs`。

        qusb initCopy to clipboard
2. 启动 `adbd/diag` 服务。
3. 将 `configfs` 与 USB gadget 应用程序绑定。

        qusb bindCopy to clipboard
4. 停止或解除绑定 USB gadget 应用程序。

        qusb unbindCopy to clipboard
5. 设置 diag 和 ADB 复合设备。

        qusb setpid 901DCopy to clipboard
6. 列出可用的 USB 复合设备。

        qusb showpidCopy to clipboard

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 验证

Source: [https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html)

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

| USB 模式 | 功能 | 说明 |
| --- | --- | --- |
| USB 设备模式 | ADB | 默认情况下，USB 在仅 ADB 复合设备中进行枚举。 |
| USB 设备模式 | 诊断 | 参见[具有 diag 和 ADB 接口的 USB 复合设备的 shell 脚本示例](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html#usb-customization__section_y3t_dhl_j1c)和[通过 QUSB 服务更改 USB 复合设备](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html#usb-customization__section_nqf_ghl_j1c)。 |
| USB 设备模式 | 大容量存储 | 更改 USB 复合设备（参见[通过 QUSB 服务更改 USB 复合设备](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html#usb-customization__section_nqf_ghl_j1c)），然后选择 mass\_storage 复合设备。 |
| USB 设备模式 | 复合设备转换 | 参见[具有 diag 和 ADB 接口的 USB 复合设备的 shell 脚本示例](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html#usb-customization__section_y3t_dhl_j1c)和[通过 QUSB 服务更改 USB 复合设备](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html#usb-customization__section_nqf_ghl_j1c)。 |
| USB 设备模式 | USB LPM 与电缆连接和断开 | 手动断开 USB，以使 `dwc3-qcom` 模块切换到低功耗模式。 |
| USB 设备模式 | 网络控制 modem (NCM) | 更改 USB 复合设备（[通过 QUSB 服务更改 USB 复合设备](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html#usb-customization__section_nqf_ghl_j1c)），然后选择 NCM 复合设备。 |
| USB 主机模式 | 主机人机界面设备 (HID) 类 | 通过将 HID 类设备直接连接到被测设备来切换到主机模式。 |
| USB 主机模式 | 主机大容量存储 (MS) 类 | 通过将 MS 类设备直接连接到被测设备来切换到主机模式。 |
| USB 主机模式 | 主机集线器类 | 通过将集线器类设备直接连接到被测设备来切换到主机模式。 |
| USB 主机模式 | 主机功耗管理 | 当 `dwc3-qcom` 模块在主机模式下切换到低功耗模式时，外设支持主机模式待机（耳机）状态。 |
| USB 主机模式 | USB LPM 与外设连接和断开 | 当 `dwc3-qcom` 模块在主机模式下切换到低功耗模式时，外设支持主机模式待机（耳机）。 |
| USB 主机模式 | USB L1 LPM 与高速 | 当 `dwc3-qcom` 模块在主机模式下切换到低功耗模式时，高速外设支持主机模式待机（耳机）。 |
| USB 主机模式 | USB 摄像头 | 参见[USB 摄像头配置](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html#usb-camera-configuration)章节。 |
|  |  |  |
|  |  |  |
|  |  |  |
|  |  |  |
|  |  |  |
|  |  |  |

## USB 调试

Source: [https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html)

本节提供有关获取调试日志的各种方法的信息。调试方法包括 `regdump`、调试 `ftraces`、`configfs` 节点等。在调试与进入/退出低功耗模式、SMMU 故障、无时钟访问相关的问题时，可通过上述日志查看事件和控制器状态的详细信息。

### USB 跟踪

使用 `debugfs` 跟踪可以更加深入地了解 USB 线上发生的每一个事务。如需查看跟踪列表，可运行以下命令。

    ls /sys/kernel/debug/tracing/events/dwc3Copy to clipboard

Note: 确保已挂载 `debugfs`。如果尚未挂载，可运行以下命令来挂载 `debugfs`。

    mount -t debugfs none /sys/kernel/debugCopy to clipboard

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

    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
    Copy to clipboard

要列出 xHCI/主机控制器驱动程序 (HCD) 中的跟踪，可运行以下命令。

    ls /sys/kernel/debug/tracing/events/xhci-hcdCopy to clipboard

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

    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
    Copy to clipboard

要列出 USB 视频类 (UVC) gadget 驱动程序的可用事件，可运行以下命令。

    ls /sys/kernel/debug/tracing/events/gadgetCopy to clipboard

随即显示以下输出。

    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
    Copy to clipboard

如需列出 UCSI 驱动程序中的可用事件，可运行以下命令。

    ls /sys/kernel/debug/tracing/events/ucsiCopy to clipboard

随即显示以下输出。

    enable  ucsi_connector_change  ucsi_register_port  ucsi_run_command
    filter  ucsi_register_altmode  ucsi_reset_ppm
    Copy to clipboard

### USB 寄存器打印

USB `debugfs`提供以下信息。
- 工作模式。

        cat /sys/kernel/debug/usb/a600000.usb/mode
        Copy to clipboard

示例输出：

        设备Copy to clipboard
- 设备模式下所有端点的状态和传输环形缓冲区 (TRB) 队列。
- 当前链路状态。

        cat /sys/kernel/debug/usb/a600000.usb/link_stateCopy to clipboard

示例输出。 

        休眠Copy to clipboard
- 列表处理器 (LSP) 转储。

        cat /sys/kernel/debug/usb/a600000.usb/lsp_dumpCopy to clipboard

示例输出： 

        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] = 0x000000f8Copy to clipboard

    ls /sys/kernel/debug/usb/a600000.usbCopy to clipboard

示例输出：

    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  modeCopy to clipboard

`regdump`命令提供以下寄存器的寄存器空间的当前状态：
- 设备模式的寄存器，例如 DCTL、DSTS 和 DCFG
- 全局寄存器，例如 GCTL 和 GSTS

    cd /sys/kernel/debug/usb/a600000.usb
    cat regdump
                    Copy to clipboard

示例输出：

    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
    Copy to clipboard

### 主机模式 sysfs 查询

要查看总线详细信息，可运行以下命令：

    lsusb
    Copy to clipboard

示例输出：

    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
    Copy to clipboard

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

    cd /sys/bus/usb/devices/
    lsCopy to clipboard

示例输出：

    1-0:1.0  1-1  1-1:1.0  2-0:1.0  usb1  usb2
    Copy to clipboard

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

    cat /sys/kernel/debug/usb/devices
    Copy to clipboard

示例输出：

    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
    Copy to clipboard

## USB 示例

Source: [https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html](https://docs.qualcomm.com/doc/80-70015-8SC/topic/usb.html)

有关上游设备树参考的信息，可访问 [https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi](https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi)。

有关 Qualcomm Linux 芯片产品设备树节点的信息，可访问 [https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts](https://git.linaro.org/kernel-org/linux-next.git/tree/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&amp;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/)。

Last Published: Dec 03, 2024

[Previous Topic
PCIe](https://docs.qualcomm.com/bundle/publicresource/80-70015-8SC/topics/pcie.md) [Next Topic
CAN](https://docs.qualcomm.com/bundle/publicresource/80-70015-8SC/topics/can.md)