USB 使用参考¶
REVISION HISTORY¶
| Revision No. | Description |
Date |
|---|---|---|
| 1.0 | 01/06/2026 |
1. 概述¶
USB(通用串行总线,Universal Serial Bus)是一种广泛使用的接口标准,主要用于连接计算机与外部设备,实现数据传输和设备供电。
2. 关键字说明¶
-
Device
通过 USB 接口连接至计算机或其他设备以实现数据传输、供电或扩展功能的外部硬件,如 U 盘、键盘、移动硬盘等。
-
Host
USB Host 是控制 USB 总线并管理连接设备的主控端(如电脑、手机),负责供电、数据传输协调及驱动加载,使外部设备(如 U 盘、鼠标)得以正常工作。
-
EHCI
Enhanced Host Controller Interface, 增强型主机控制器接口规范定义了一个通用串行总线(USB)2.0 主机控制器的寄存器级接口。
-
XHCI
eXtensible Host Controller Interface, 可扩展主机控制器接口规范定义了一种通用串行总线(USB)3.0 主机控制器的寄存器级接口,可以与 USB 1.x、2.0 和 3.x 兼容设备接口连接。
-
UTMI
USB2.0 Transceiver Macrocell Interface,此协议是针对 USB2.0 的信号特点进行定义的,分为 8 位或 16 位数据接口。
-
PIPE
USB 3.0 PHY 接口协议。
-
SUPPHY
SATA/USB/PCIE 多协议共享 PHY,用于 Port2 等与 PCIE 共用 PHY 的场景。
3. 功能描述¶
-
USB HOST 可以支持键盘、鼠标、U 盘、USB 网卡、USB 摄像头、USB 耳机等多种设备接入,也支持 usb hub 接入扩展 usb 接口数量。
-
USB device 可以配置成 USB 摄像头、USB 音频采集播放、RNDIS 等设备。
3.1. MHERA¶
-
支持 4 个 USB port
-
其中两个 port 为 usb2.0 host only。另外两个 port 为 usb3.0,可做 device or host,记为 Port2 Port3,其中 Port3 可做 usb2.0 device,用做空片升级。其分布如下

-
USB3.0 Device EP 资源
- 9 个 in ep 的 FIFO 相互独立,总大小为 37408 字节
- 7 个 out ep 共享一块 6028 字节的 out FIFO
-
USB Port2 与 PCIE0 共用同一个 PHY(SUPPHY 的 lane1)。dtsi 默认为 PCIE0 2x + Port2 USB2.0-only(SUPPHY 给 PCIE0,Port2 仅用 UTMI 跑 USB2.0);若要 Port2 跑 USB3.0,需把 SUPPHY 让给 Port2(disable PCIE0 或降 1x)。三种用法的 DTS 配置见 USB 3.0 DTS 配置。
4. Uboot 用法介绍¶
4.1. USB2.0 Host Driver 使用¶
4.1.1. USB 2.0 Host menuconfig 配置¶
-> Device Drivers
-> [*] USB support --->
-> [*] Enable driver model for USB Gadget
-> [*] EHCI HCD (USB 2.0) support
-> [*] Sgs drivers --->
-> [*] Sgs USB2.0 Host Controller
-> [*] Sgs USB Reset Control
4.2. USB2.0 Device Driver 使用¶
4.2.1. USB 2.0 Device menuconfig 配置¶
-> Device Drivers
-> [*] USB support --->
-> [*] Enable driver model for USB Gadget
-> [*] USB Gadget Support --->
-> [*] Sgs drivers --->
-> [*] Sgs USB 2.0 Device Controller
-> [*] Sgs USB Reset Control
-> [*] USB device uses port1
4.3. USB3.0 Host Driver 使用¶
4.3.1. USB 3.0 Host menuconfig 配置¶
-> Device Drivers
-> [*] USB support --->
-> [*] Enable driver model for USB Gadget
-> [*] xHCI HCD (USB 3.0) support
-> [*] Sgs drivers --->
-> [*] DesignWare USB3 Host/Gadget Support on Sgs Platforms
-> DWC3 Mode Selection (Host only mode) --->
-> [*] Sgs USB Reset Control
4.4. USB3.0 Device Driver 使用¶
Uboot 下 USB3.0 只作为 host 使用。
如需使用 ufu 升级请将 Port3 配置成 USB2.0 使用。
4.5. ufu 使用¶
Uboot CONFIG 要开启 CMD_SGS_UFU,如果需要编译空片升级的 uboot,还需要额外开启 CONFIG_SGS_AUTOBOOT_RUN_UFU_ALWAYS
使用方法:Uboot 下输入 ufu,就会进入 ufu 升级模式,等待 PC 工具启动升级
注:usb 升级需要接 Port 3 !
4.6. usbstar 使用¶
Uboot CONFIG 要开启 CONFIG_CMD_SGS_USBSTAR
使用方法:project 下执行./image/makefiletools/script/make_usb_upgrade_sgs.sh,将生成的 image bin 放入 Fat32 格式的 U 盘,将 U 盘插入 USB Host 口,Uboot 下输入 usbstar,就可以开始升级
5. Kernel 用法介绍¶
5.1. Linux 配置使用 USB device¶
5.1.1. kernel config 配置¶
Device 的配置方式主要是开启 UDC 的配置(USB2.0 是 udc-msx250x.ko,USB3.0 是 dwc3.ko 和 sgs-dwc3-of-simple.ko)和 gadget 的一些配置(具体看需要哪个 function)
开启 Gadget 核心层和 UDC 配置
-
USB2.0
生成 usb-common.ko、udc-core.ko、udc-msb250x.ko sgs-usb2-phy.ko
[*] USB support ---> [M] USB Gadget Support ---> USB Peripheral Controller ---> [M]Sgs USB 2.0 Device Controller [*] SGS SoC platform drivers ---> -> <M> SGS USB2 PHY Driver
-
USB3.0
生成 usb-common.ko usbcore.ko udc-core.ko roles.ko sgs-usb3-phy.ko dwc3.ko sgs-dwc3-of-simple.ko
-> [*] USB support ---> -> <M> Support for Host-side USB -> <M> DesignWare USB3 DRD Core Support -> DWC3 Mode Selection (Dual Role mode) -> <M> USB Gadget Support -> <M> USB Role Switch Support -> [*] SGS SoC platform drivers ---> -> <M> Simple Glue Layer Of SGS For DWC3 -> <M> SGS USB3 PHY Driver -> [*] SGS USB3 PIPE PHY support -> [*] SGS USB3 SUPPHY support使用 configfs 脚本开启 gadget 配置,红色箭头指向为配置具体的 device function,生成 libcomposite.ko,以及具体 function 的 usb_f_xxx.ko
[*]USB support ---> [M]USB Gadget Support ---> [M]USB functions configurable through configfs
也可通过 leagacy 方式加载对应的 g_xxx.ko 来配置 gadget:
[*]USB support ---> [M]USB Gadget Support ---> USB Gadget precomposed configurations
例如 adb 需要打开如下配置(生成 usb_f_fs.ko):

5.1.2. dts 配置¶
5.1.2.1. USB 2.0 device¶
mhera.dtsi 里面的 usb 2.0 节点如下,msb250x-udc-p3 对应 Port 3,目前 kernel 下 Port3 默认作为 usb 3.0 使用,usb 2.0 device 的 udc 节点状态默认为 disabled
msb250x-udc-p3 {
compatible = "sgs,msb250x-udc";
reg = <0 0x1f286e00 0x200>, <0 0x1f28e000 0x200>, <0 0x1f28e400 0x400>, <0 0x1f203c00 0x200>;
reg-names = "utmi", "usb0", "otg", "chiptop";
interrupts = <GIC_SPI INT_IRQ_OTG_P3 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "msb250x_udc_p3";
maximum-speed = "high-speed";
ep_name = "ep0", "ep1" , "ep2", "ep3", "ep4", "ep5", "ep6";
ep_maxpkt_limit = <64>, <1024>, <1024>, <64>, <512>, <512>, <64>;
ep_fifo_size = <64>, <8192>, <1024>, <64>, <512>, <512>, <64>;
dma_channel_num = <4>;
force_device = <0x1f203c00>, <0x55>, <0x0>, <0x1>;
clocks = <&CLK_upll_960m>;
status = "disabled";
};
| 参数 | 释义 | 备注 |
|---|---|---|
| reg | register 基地址 | 硬件固定地址,不能修改 |
| reg-names | register 名称 | 驱动根据名称获取 reg,不能修改 |
| interrupts | 中断 | 由硬件决定,不能修改 |
| interrupt-names | 中断名称 | 驱动根据名称获取中断,不能修改 |
| maximum-speed | 最大速率 | 支持 high-speed 和 full-speed |
| ep_name | endpoint 名称 | 驱动根据名称获取 ep 个数,不能修改 |
| ep_maxpkt_limit | endpoint 最大包的长度 | 硬件固定值 |
| ep_fifo_size | endpoint fifo size | 硬件固定值 |
| dma_channel_num | dma 通道的数量 | 硬件固定值 |
| clocks | 使用的 clock 配置 | 硬件固定值 |
5.1.2.2. USB 3.0 DTS 配置(Device / Host 通用)¶
USB 3.0 Device 和 Host 的 DTS 配置结构完全一致,仅需修改 dwc3 子节点中的 dr_mode 字段:"peripheral" 表示 Device 模式,"host" 表示 Host 模式。
注意:
- USB Port2 与 PCIE0 共用同一个 PHY(SUPPHY 的 lane1)。 根据 SUPPHY 归属有三种用法:
- PCIE0 2x + Port2 USB2.0-only(dtsi 默认):
u3phy_p2_utmi、usb3drd_p2为 okay,u3phy_p2_pipe(SUPPHY)保持 disabled 让 PCIE0 占用,dwc3maximum-speed="high-speed"且phys只引用u3phy_p2_utmi、phy-names只"usb2-phy",并在usb3drd_p2加sgs,combo-phy-reset;(USB 侧替 SUPPHY 做 combo reset,使 Port2 USB2.0 不依赖 PCIE0/SUPPHY probe)。 - Port2 USB3.0:需把 PCIE0 disable(或降 1x),
u3phy_p2_utmi、u3phy_p2_pipe、usb3drd_p2改 okay,dwc3maximum-speed="super-speed"、phys引用 utmi+pipe、phy-names含"usb3-phy"(即下方 Port2 配置块)。 - PCIE0 2x + Port2 不用:Port2 相关节点保持 disabled。
- PCIE0 2x + Port2 USB2.0-only(dtsi 默认):
- UTMI PHY 和 PIPE/SUPPHY PHY 均为独立顶级节点,不再是嵌套在父容器下的子节点。
Port 3(使用 PIPE PHY,独立 USB3 PHY)配置如下:
u3phy_p3_utmi: utmi@1f286e00 {
compatible = "sgs,generic-utmi";
reg = <0x0 0x1f286e00 0x200>;
clocks = <&CLK_upll_480m>;
//sgs,dp-dm-swap;
#phy-cells = <0>;
status = "okay";
};
u3phy_p3_pipe: pipe@1f2a5200 {
compatible = "sgs,generic-pipe";
reg = <0x0 0x1f2a5200 0x800>;
clocks = <&CLK_ssusb_phy_108>, <&CLK_ssusb_phy_432>;
//sgs,synthesiszer-clk = <0x001ba5e3>;
sgs,spread-spectrum-clock-enabled = <0x001bb7a0>, <0x03ed>, <0x0004>;
sgs,tx-swing-and-de-emphasis = <0x3c>, <0x27>, <0x07>;
//sgs,force-r-term-disabled;
sgs,en-dynamic-symblock;
sgs,rx-lfps-burst-gap = <0x3e8>;
sgs,rx-lfps-deglitch = <1>; /* 0=67mV, 1=110mV, 2=150mV, 3=210mV */
#phy-cells = <0>;
port_id = <3>;
status = "okay";
};
drd_gp_syscon_p3: drd-gp-syscon-p3@1f286600 {
compatible = "sgs,generic-usb30-drd-gp-syscon", "syscon";
reg = <0x0 0x1f286600 0x200>;
reg-io-width = <2>;
};
drd_mac_syscon_p3: drd-mac-syscon-p3@1f286c00 {
compatible = "sgs,generic-usb30-drd-mac-syscon", "syscon";
reg = <0x0 0x1f286c00 0x200>;
reg-io-width = <2>;
};
usb3drd_p3: usb3-p3 {
compatible = "sgs,generic-dwc3";
clocks = <&CLK_sof_usb30_drd>, <&CLK_ssusb_axi>;
sgs,x2a-addr-off = <0x000000>, <0x000002>, <0x000004>, <0x000008>;
sgs,usb3drd-gp-syscon = <&drd_gp_syscon_p3>;
sgs,usb3drd-mac-syscon = <&drd_mac_syscon_p3>;
usb-phy = <&u3phy_p3_utmi>;
#address-cells = <2>;
#size-cells = <1>;
ranges;
status = "okay";
dwc3_p3: dwc3 {
dr_mode = "peripheral"; /* "peripheral" for Device, "host" for Host */
compatible = "snps,dwc3";
reg = <0x0 0x1f348000 0x1400>;
maximum-speed = "super-speed";
interrupts = <GIC_SPI INT_IRQ_USB30_DRD_GP2TOP IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "dwc_usb3";
phy_type = "utmi_wide";
phys = <&u3phy_p3_utmi>, <&u3phy_p3_pipe>;
phy-names = "usb2-phy", "usb3-phy";
snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>, <32>, <64>, <128>;
snps,dis_u3_susphy_quirk;
snps,dis_u2_susphy_quirk;
snps,dis-u1-entry-quirk;
snps,dis-u2-entry-quirk;
snps,usb3_lpm_capable; /* for XHCI_LPM_SUPPORT*/
snps,parkmode-disable-ss-quirk;
linux,sysdev_is_parent;
port_id = <3>;
snps,ep-maxpktnum = <1>, <6>, <6>, <6>, <1>, <1>, <1>, <1>, <6>;
status = "okay";
};
};
Port 2(使用 SUPPHY,与 PCIE0 共享 PHY)跑 USB3.0 时的配置如下。此场景需把 SUPPHY 让给 Port2(disable PCIE0 或降 1x),UTMI/SUPPHY/usb3drd 节点置 okay(下方配置块即此启用状态):
dtsi 默认是 PCIE0 2x + Port2 USB2.0-only(
u3phy_p2_pipe保持 disabled、dwc3high-speed且只引用 usb2-phy、usb3drd_p2带sgs,combo-phy-reset)。三种用法及完整切换步骤见 USB 3.0 DTS 配置 的注意事项,此处不再重复。
u3phy_p2_utmi: utmi@1f290000 {
compatible = "sgs,generic-utmi";
reg = <0x0 0x1f290000 0x200>;
clocks = <&CLK_upll_480m>;
//sgs,dp-dm-swap;
#phy-cells = <0>;
status = "okay";
};
u3phy_p2_pipe: pipe@1f2b2600 {
compatible = "sgs,supphy";
reg = <0x0 0x1f2b2600 0x600>;
clocks = <&CLK_ssusb_phy_108>, <&CLK_ssusb_phy_432>;
sgs,spread-spectrum-clock-enabled = <0x00162c37 0x04E9 0x0003 0x17>; /* synth_set, span_set, step_set, pll_lock_offset */
#phy-cells = <0>;
port_id = <2>;
status = "okay";
};
drd_gp_syscon_p2: drd-gp-syscon-p2@1f287000 {
compatible = "sgs,generic-usb30-drd-gp-syscon", "syscon";
reg = <0x0 0x1f287000 0x200>;
reg-io-width = <2>;
};
drd_mac_syscon_p2: drd-mac-syscon-p2@1f287200 {
compatible = "sgs,generic-usb30-drd-mac-syscon", "syscon";
reg = <0x0 0x1f287200 0x200>;
reg-io-width = <2>;
};
usb3drd_p2: usb3-p2 {
compatible = "sgs,generic-dwc3";
clocks = <&CLK_sof_usb30_drd>, <&CLK_ssusb_axi>;
sgs,x2a-addr-off = <0x000000>, <0x000002>, <0x000004>, <0x000008>;
sgs,usb3drd-gp-syscon = <&drd_gp_syscon_p2>;
sgs,usb3drd-mac-syscon = <&drd_mac_syscon_p2>;
usb-phy = <&u3phy_p2_utmi>;
#address-cells = <2>;
#size-cells = <1>;
ranges;
status = "okay";
dwc3_p2: dwc3 {
dr_mode = "peripheral"; /* "peripheral" for Device, "host" for Host */
compatible = "snps,dwc3";
reg = <0x0 0x1f352000 0x1400>;
maximum-speed = "super-speed";
interrupts = <GIC_SPI INT_IRQ_USB30_DRD_GP2TOP_P1 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "dwc_usb3";
phy_type = "utmi_wide";
phys = <&u3phy_p2_utmi>, <&u3phy_p2_pipe>;
phy-names = "usb2-phy", "usb3-phy";
snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>, <32>, <64>, <128>;
snps,dis_u3_susphy_quirk;
snps,dis_u2_susphy_quirk;
snps,usb3_lpm_capable;
snps,parkmode-disable-ss-quirk;
linux,sysdev_is_parent;
port_id = <2>;
snps,ep-maxpktnum = <1>, <6>, <6>, <6>, <1>, <1>, <1>, <1>, <6>;
status = "okay";
};
};
usb3drd节点属性说明:
| 属性值 | 描述 | 备注 |
|---|---|---|
| compatible | 用于匹配驱动进行驱动的注册 | 禁止修改 |
| clocks | 用于开启所有使用到的时钟 | 禁止修改 |
| sgs,x2a-addr-off | 用于设置 dwc3 register 映射到 Sgs bank | 禁止修改 |
| sgs,usb3drd-gp-syscon | 指定 usb30 所占用 gp bank 及范围,便于使用 regmap 访问寄存器 | 禁止修改 |
| sgs,usb3drd-mac-syscon | 指定 usb30 所占用 mac bank 及范围,便于使用 regmap 访问寄存器 | 禁止修改 |
| usb-phy | 指定 USB PHY 节点,用于 disconnect notification | 禁止修改 |
| #address-cells | 用于指定子节点 reg 属性地址信息所占用的字长(32bit) | 禁止修改 |
| #size-cells | 用于指定子节点 reg 属性地址范围信息所占的字长(32bit) | 禁止修改 |
| ranges | 用于表示子节点继承#address-cells 和#size-cells 属性 | 禁止修改 |
| status | 选择是否使能 usb3 驱动 | 根据需要修改 |
dwc3节点属性说明:
| 属性值 | 描述 | 备注 |
|---|---|---|
| compatible | 用于匹配驱动进行驱动的注册 | 禁止修改 |
| reg | 用于指定 dwc3 所占用 bank 寄存器地址范围 | 禁止修改 |
| dr_mode | 用于指定 dwc3 的模式,host or peripheral | 根据需要修改 |
| maximum-speed | 用于指定 dwc3 所支持的最大速率 | 根据需要修改 |
| interrupts | 用于指定 dwc3 的中断及触发方式 | 禁止修改 |
| interrupts-names | 用于 interrupts 属性的名称,与 interrupts 属性对应 | 禁止修改 |
| phy_type | 用于指定 phy 类型 | 禁止修改 |
| phys | 用于指定 usb30 所支持的 phy 列表 | 根据需要修改 |
| phy-names | 用于指定 phys 属性所支持 phy 列表的名称,与 phy 列表一一对应 | 根据需要修改 |
| snps,incr-burst-type-adjustment | 用于指定 dwc3 MAC 访问 DDR 所支持的 burst 字节数 | 禁止修改 |
| snps,dis_u3_susphy_quirk | synopsis 原生 quirk 属性 | 禁止修改 |
| snps,dis_u2_susphy_quirk | synopsis 原生 quirk 属性 | 禁止修改 |
| snps,dis-u1-entry-quirk | 禁止进入链路U1状态 | 不要修改 |
| snps,dis-u2-entry-quirk | 禁止进入链路U2状态 | 不要修改 |
| snps,usb3_lpm_capable | 用于设置开启 usb3 link power manage | 不要修改 |
| linux,sysdev_is_parent | 用于指定 host hcd 驱动的 sysdev,device 不使用 | 禁止修改 |
| status | 选择是否使能驱动 | 根据需要修改 |
5.1.3. ko 加载¶
5.1.3.1. USB2.0¶
kernel 下不支持 USB2.0 device
5.1.3.2. USB3.0¶
按照下列顺序加载:
usb-common.ko
usbcore.ko
udc-core.ko
roles.ko
sgs-usb3-phy.ko
dwc3.ko
sgs-dwc3-of-simple.ko
libcomposite.ko
#device function ko
例如adb需要加载usb_f_fs.ko
#如果是leagacy配置方式,还需要加载g_xxx.ko
5.2. Linux 配置使用 USB Host¶
5.2.1. kernel config 配置¶
kernel config 打开如下配置:
-
USB2.0
COFNIG_USB_EHCI_HCD:(生成 ehci-hcd.ko)

CONFIG_SGS_USB2_PHY:(生成 sgs-usb2-phy.ko)

-
USB3.0
->[*] USB support ---> -> <M> Support for Host-side USB -> <M> xHCI HCD (USB 3.0) support -> <M> Generic xHCI driver for a platform device -> <M> DesignWare USB3 DRD Core Support -> DWC3 Mode Selection (Dual Role mode) -> <M> USB Gadget Support -> <M> USB Role Switch Support -> [*] SGS SoC platform drivers ---> -> <M> Simple Glue Layer Of SGS For DWC3 -> <M> SGS USB3 PHY Driver -> [*] SGS USB3 PIPE PHY support -> [*] SGS USB3 SUPPHY support选择上述选项,然后编译出:usb-common.ko usbcore.ko udc-core.ko roles.ko sgs-usb3-phy.ko dwc3.ko sgs-dwc3-of-simple.ko xhci-hcd.ko xhci-plat-hcd.ko
5.2.2. dts 配置¶
5.2.2.1. USB 2.0¶
对应 mhera.dtsi 的节点如下,默认两个 usb 2.0 host port 都为 Enable
sgs-ehci-1 {
compatible = "sgs,ehci";
reg-names = "ehc_base";
reg = <0x0 0x1f284800 0x200>;
clocks = <&CLK_upll_480m>;
interrupts = <GIC_SPI INT_IRQ_UHC_P0 IRQ_TYPE_LEVEL_HIGH>;
phys = <&sgs_u2phy1>;
phy-names = "usb";
support_high_2g_access_patch;
port_id = <0>;
status = "okay";
};
sgs-ehci-2 {
compatible = "sgs,ehci";
reg-names = "ehc_base";
reg = <0x0 0x1f286400 0x200>;
clocks = <&CLK_upll_480m>;
interrupts = <GIC_SPI INT_IRQ_UHC_P1 IRQ_TYPE_LEVEL_HIGH>;
phys = <&sgs_u2phy2>;
phy-names = "usb";
support_high_2g_access_patch;
port_id = <1>;
status = "okay";
};
| 参数 | 释义 | 备注 |
|---|---|---|
| reg | register 基地址 | 硬件固定地址 |
| interrupts | 中断 | 固定中断 |
| phys | 使用的 phy 节点 | 引用的 phy 节点 |
| phy-names | phy 名称 | 驱动通过此获取 phy 节点 |
| clocks | 使用的 clock 配置 | 时钟源 |
5.2.2.2. USB 3.0¶
USB 3.0 Host 的 DTS 配置与 USB 3.0 DTS 配置 完全一致,只需将 dwc3 子节点中的 dr_mode 字段设置为 "host" 即可。
5.2.3. ko 加载¶
5.2.3.1. USB2.0¶
按如下顺序加载 ko:
5.2.3.2. USB3.0¶
usb-common.ko
usbcore.ko
udc-core.ko
roles.ko
sgs-usb3-phy.ko
dwc3.ko
sgs-dwc3-of-simple.ko
xhci-hcd.ko
xhci-plat-hcd.ko
5.3. UVC device 配置¶
5.3.1. kernel config 配置¶
开启 UVC device function 配置(生成 ko:libcomposite.ko、usb_f_uvc.ko、g_sgs_gadget.ko)
Device Drivers --->
[*]USB support --->
[M]USB Gadget Support --->
[M]USB functions configurable through configfs
USB Gadget precomposed configurations --->
[M]USB Sgs Gadget
[*]Include configuration with UVC (Video)


开启 Multimedia 配置(生成的 ko:mc.ko、videodev.ko、videobuf2-common.ko、videobuf2-v4l2.ko、videobuf2-memops.ko、videobuf2-vmalloc.ko、videobuf2-dma-sg.ko、uvcvideo.ko)
Device Drivers --->
[*]Multimedia support --->
Media drivers --->
[*]Media USB Adapters --->
[M]USB Vide Class (UVC)
Media device types --->
[*]Cameras and video grabbers
Media core support --->
[*]Media Controller API



5.3.2. ko 加载¶
按如下顺序加载 ko:
usb-common.ko
usbcore.ko # for USB3.0 dual role
udc-core.ko
udc-msb250x.ko # for USB2.0 UDC only,--mhera不支持
roles.ko # for USB3.0 only
sgs-usb3-phy.ko # for USB3.0 only
dwc3.ko # for USB3.0 only
sgs-dwc3-of-simple.ko # for USB3.0 only
libcomposite.ko
mc.ko
videodev.ko
videobuf2-common.ko
videobuf2-v4l2.ko
videobuf2-memops.ko
videobuf2-vmalloc.ko
videobuf2-dma-sg.ko
uvcvideo.ko
usb_f_uvc.ko
g_sgs_gadget.ko
ko 加载成功之后将生成/dev/video0 节点,板子 USB device 口用 USB 线连接到 PC 端,运行 UVC demo 使用 PotPlayer 等播放器打开摄像头设备将出现 UVC Camera 设备。

5.4. UVC host 配置¶
5.4.1. kernel config 配置¶
开启 Multimedia 配置(生成的 ko:mc.ko、videodev.ko、videobuf2-common.ko、videobuf2-v4l2.ko、videobuf2-memops.ko、videobuf2-vmalloc.ko、videobuf2-dma-sg.ko、uvcvideo.ko)
Device Drivers --->
[*]Multimedia support --->
Media drivers --->
[*]Media USB Adapters --->
[M]USB Vide Class (UVC)
Media device types --->
[*]Cameras and video grabbers
Media core support --->
[*]Media Controller API



5.4.2. ko 加载¶
usb-common.ko
usbcore.ko
udc-core.ko # for USB3.0 dual role
sgs-usb2-phy.ko # for USB2.0 only
ehci-hcd.ko # for USB2.0 only
roles.ko # for USB3.0 only
sgs-usb3-phy.ko # for USB3.0 only
dwc3.ko # for USB3.0 only
sgs-dwc3-of-simple.ko # for USB3.0 only
xhci-hcd.ko # for USB3.0 only
xhci-plat-hcd.ko # for USB3.0 only
#multimedia ko
mc.ko
videodev.ko
videobuf2-common.ko
videobuf2-v4l2.ko
videobuf2-memops.ko
videobuf2-vmalloc.ko
videobuf2-dma-sg.ko
uvcvideo.ko
ko 加载成功之后,板子 USB host 口用 USB 线连接到 uvc device 设备,可以看到/dev/videoX 节点
6. USB 2.0 模拟参数调整¶
以下情况需要考虑调节驱动能力
-
眼图的模板测试不通过,或者不够漂亮,修改驱动能力以期更好的测试结果。
-
遇到部分 USB2 不连接,通信中断,或其他诸如概率性的 USB2 的相关问题,想用修改驱动能力的方式,试试看,测测看,此种情形,本质上应当回归到第一点。但迫于有些没有眼图测试能力的,只能进行黑盒测试
以下将以 P0 Host 为例。
6.1. Tx swing trim(此参数 OTP 有 trim 过,修改时需要找 HWRD 确认)¶
位于 UTMI bank offset 0x44[9:4] ,调整值范围:0~63。
1) 查看当前值: cat /sys/kernel/debug/usb/phy-soc\:sgs-usb2-phy.1.2/swing_trim
2) 设置: echo value > /sys/kernel/debug/usb/phy-soc\:sgs-usb2-phy.1.2/swing_trim
6.2. pre_emphasis¶
位于 UTMI bank offset 0x43[9:8] ,调整值范围:0~3,值越大 pre-emphasis 越强。
1) 查看当前值: cat /sys/kernel/debug/usb/phy-soc\:sgs-usb2-phy.1.2/pre_emphasis
2) 设置: echo value > /sys/kernel/debug/usb/phy-soc\:sgs-usb2-phy.1.2/pre_emphasis
6.3. 眼图测试¶
开机进入 kernel,执行下列命令之后可以接示波器查看眼图
1) 测试 highspeed 眼图,执行:echo "hs" > /sys/kernel/debug/usb/phy-soc\:sgs-usb2-phy.1.2/eye_diagram_switch
2) 测试 fullspeed 眼图,执行:echo "fs" > /sys/kernel/debug/usb/phy-soc\:sgs-usb2-phy.1.2/eye_diagram_switch
6.4. Tx swing 和 pre_emphasis 参数含义¶

1) TX swing:如上图,指的是黄色 Mark 的的这部分,主要是针对眼高的调整(DM DP 差分信号的 Level 的调整,与 USB2 驱动能力的提法最为贴近),如果测试结果眼高部分不合要求,可以给出对应的修改方式/方法(开的强度越高,对应的眼高张得越开)
2) De-emphasis Current:如上图,指蓝色 Mark 部分,主要针对波形上升/下降速度的修改(高速信号传输中的去加重设计),如有上升/下降波形压眼图的情形,可以尝试调整此部分(开的强度越高,对应的波形越陡)
7. USB 3.0 PHY 参数调整¶
USB 3.0 PHY 驱动通过 debugfs 暴露参数调整接口,路径为 /sys/kernel/debug/usb/<device_name>/。
7.1. USB3 PIPE PHY¶
| 参数名 | 描述 | 范围 | 读写 |
|---|---|---|---|
| tx-idrv | TX 驱动电流 | 0~63 (6-bit) | RW |
| tx-idem | TX 去加重 | 0~63 (6-bit) | RW |
| tx-biasi | TX 偏置电流 | 0~7 | RW |
| ssc | SSC 使能/禁用 | 0=禁用,1=使能 | RW |
7.2. USB3 SUPPHY¶
| 参数名 | 描述 | 范围 | 读写 |
|---|---|---|---|
| swing-mode | TX Swing 模式选择 | 2=Full-Swing, 3=Low-Swing | RW |
| swing-amplitude | TX Low-Swing 幅度等级(0=-1.5dB, 1=-2.5dB, 2=-3.5dB, 3=-4.5dB, 4=-6dB, 5=-7.6dB) | 0~5 | RW |
| tx-deemphasis | TX 去加重幅度(0=-6dB, 1=-3.5dB, 2=0dB) | 0~2 | RW |
7.3. DWC3¶
| 参数名 | 描述 | 范围 | 读写 |
|---|---|---|---|
| ltssm-state | LTSSM 状态记录(需开启 ENABLE_LTSSM_MONITOR) | - | R |
| compliance-enabled | Compliance Mode 使能(仅 Host 模式) | 0 / 1 | W |
8. USB 3.0 眼图测试¶
对于 USB3.0,在进入 compliance mode 状态后就可以进行眼图测试,需要高阶示波器才能测 USB3.0 眼图。
8.1. Device mode¶
对于 3.0 device,当 USB3.0 device 接入高阶示波器后就可以自动进入 compliance mode.
8.2. Host mode¶
对于 3.0 host 需要在 kernel 起来后执行下面的命令,后接入高阶示波器就可以进入 compliance mode。注意下面的"soc:usb3-p3"视实际 usb3 节点名字而定。
9. FAQ¶
Q1:Kernel 下 USB Host 接入 Device 无法识别
-
检查是否有将 vbus 拉高
-
检查 DTS 节点的
status是否为okay -
检查 kernel config 是否配置
Q2:Kernel 下 high speed device 识别成 full speed
- 检查 device 上级是否有接 full speed hub
Q3:Uboot 下 U 盘升级失败
-
检查是否有将 vbus 拉高
-
检查 DTS 节点的
status是否为okay -
检查 U 盘是否是 Fat32 格式
Q4:USB 空片升级失败
-
检查是否处于空片升级状态,空片升级状态串口会打印 Start USB Mode
-
检查打包的 usb image 是否和板子匹配
Q5:配置成 USB3.0 设备后,连 PC 识别为 High speed
-
检查 USB 线缆是否支持 USB3.0
-
检查 UDC 是否为 dwc3
Q6:配置成 USB3.0 后,Port2 只能识别为 High speed
dtsi 默认是 PCIE0 2x + Port2 USB2.0-only(Port2 即工作在 High speed)。要让 Port2 跑 USB3.0(SuperSpeed),需把 SUPPHY lane1 让给 Port2 并完整修改 DTS(任一项漏改都会停在 High speed):
-
disable PCIE0(或降 1x),把 SUPPHY 让给 Port2
-
u3phy_p2_utmi/u3phy_p2_pipe/usb3drd_p2改 okay -
dwc3 恢复
maximum-speed="super-speed"且phys引用 utmi+pipe -
去掉
usb3drd_p2的sgs,combo-phy-reset -
EVB 板子上 phy 与 pcie 共用,信号会有干扰,需要 rework,详情请咨询 CAE