Linux USB 概述

综述

USB OTG 功能以 Linux USB 子系统框架为基础,结合 Realtek 专项开发的 USB PHY 驱动与经适配的 DWC2 控制器驱动共同实现。

架构

USB 软件架构如下图所示。

../../_images/usb_software_architecture.svg

USB 软件栈分层

以下表格展示了从硬件到应用的完整 USB 软件栈层次:

层次

组件

说明

应用层

rtk_usb_test.sharecord/aplayevtest

用户空间工具和测试脚本

类驱动

snd-usb-audiouvcvideousb-storage、ConfigFS gadget functions

各 USB 类的协议处理

USB 核心层

usbcoreusb-commongadget/corelibcomposite

枚举、传输管理、UDC 框架

控制器驱动

dwc2

主机/设备双角色控制器 (Realtek 修改)

PHY 驱动

phy-rtk-usb

Realtek USB PHY,时钟/校准/force_mode

硬件层

USB 控制器(0x40080000)+ PHY 寄存器(0x400B0000

RTL8730E USB OTG 外设

实现

文件

描述

<linux>/drivers/usb/dwc2/

经 Realtek 适配的 DWC2 主机/设备控制器驱动

<linux>/drivers/usb/core/

HCD 核心

<linux>/drivers/usb/gadget/

Gadget 核心

<linux>/drivers/usb/gadget/function/

设备类,例如ADB、CDC ACM、HID、MSC等。

<linux>/drivers/usb/class/cdc-acm.*

CDC ACM 主机类

<linux>/drivers/usb/storage/*

MSC 主机类

<linux>/drivers/media/usb/uvc/

UVC 主机类

<linux>/sound/usb/

UAC 主机类(snd-usb-audio)

<linux>/drivers/rtkdrivers/usb_phy/

Realtek USB PHY 驱动

更多 USB 子系统详情,参见 usb system v5.4usb system v6.18

配置

USB 设备树配置

USB 的设备树节点在 sources/kernel/linux-6.18/arch/arm/boot/dts/realtek/ameba/rtl8730e-ocp.dtsi 中定义:

usb: usb@40080000 {
   compatible = "realtek,dwc-otg";
   reg = <0x40080000 0x20000>;
   interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
   g-rx-fifo-size = <504>;
   g-np-tx-fifo-size = <256>;
   g-tx-fifo-size = <256>;
   status = "okay";
   endpoints {
      ep1in {
         ep_name = "ep1in";
         ep_type = <0x0E>; // USB_EP_CAPS_TYPE_ALL
      };
      ep2out {
         ep_name = "ep2out";
         ep_type = <0x0E>; // USB_EP_CAPS_TYPE_ALL
      };
      ep3in {
         ep_name = "ep3in";
         ep_type = <0x0E>; // USB_EP_CAPS_TYPE_ALL
      };
      ep4out {
         ep_name = "ep4out";
         ep_type = <0x0E>; // USB_EP_CAPS_TYPE_ALL
      };
      ep5in {
         ep_name = "ep5in";
         ep_type = <0x0E>; // USB_EP_CAPS_TYPE_ALL
      };
      ep5out {
         ep_name = "ep5out";
         ep_type = <0x0E>; // USB_EP_CAPS_TYPE_ALL
      };
   };
};

USB 的设备树配置如下所示:

属性

描述

可配置?

compatible

用于将 DWC2 控制器驱动与 USB OTG 设备匹配的 ID。

reg

USB 寄存器资源

interrupts

USB 的 GIC 中断

g-rx-fifo-size

USB 设备的周期性接收 FIFO 大小(单位:DWORDS)。

16~512

g-np-tx-fifo-size

USB 设备的非周期性传输 FIFO 大小(单位:DWORDS)。

16~256

g-tx-fifo-size

在专用 FIFO 模式下的 TX FIFO 大小数组。每个值对应一个起始端点(单位:DWORDS)。Realtek USB 在共享 FIFO 模式下工作,因此此配置将被忽略。

16~256

status

USB 设备状态

disabled/okay

endpoints

允许 USB 端点地址配置以满足特定客户需求。

备注

  • 总数据 FIFO 深度为 1016,这意味着 g-rx-fifo-size,g-np-tx-fifo-size,g-tx-fifo-size 的和不应大于 1016。

  • 除非确有必要,否则不要更改默认配置。

USB 节点默认启用。如需禁用,可在上层设备树文件(如芯片级或板级文件)中通过节点引用将状态覆盖为 disabled:

&usb{
   status = "disabled";
};

如需配置工作模式,在板级设备树文件(如 sources/kernel/linux-6.18/arch/arm/boot/dts/realtek/ameba/xx.dts)中覆盖 dr_mode

&usb {
   dr_mode = "otg";
};

dr_mode 决定 DWC2 驱动的初始化方式:

  • "host":仅初始化主机模式,Gadget(设备)功能在驱动初始化时被永久禁用。仅在不需要 Gadget 功能时使用。

  • "peripheral":仅初始化设备模式,主机功能在驱动初始化时被永久禁用。仅在不需要主机功能时使用。

  • "otg"``(默认):同时初始化两种角色。QFN100,需通过 ``force_mode 手动指定角色,详见 DRD

编译配置

USB 功能可以配置为内核固件中的内置功能或独立的内核模块。

以下内置编译配置与模块配置为二选一方案,根据实际需求选择。

内置配置:

配置项

menuconfig 路径

USB PHY driver

Device Drivers -> Drivers for Realtek -> [*] USB PHY driver

USB support

Device Drivers -> [*] USB support

USB Gadget Support

Device Drivers -> USB support -> [*] USB Gadget Support

Support for Host-side USB

Device Drivers -> USB support -> [*] Support for Host-side USB

DesignWare USB2 DRD Core Support

Device Drivers -> USB support -> [*] DesignWare USB2 DRD Core Support

DWC2 mode(以主机模式为例)

Device Drivers -> USB support -> DesignWare USB2 DRD Core Support -> (*) Host only mode

备注

根据实际需求选择 DWC2 模式:

  • 主机模式:(*) Host only mode

  • 设备模式:( ) Gadget only mode

  • OTG 模式:( ) Dual Role USB support

[*] USB support 必须选中才能进入 USB 子菜单。

USB PHY 驱动在 Device Drivers -> Drivers for Realtek 下。

快速使用

SDK 提供了位于板端的 /bin/rtk_usb_test.sh 用于快速测试 USB 功能。

使用 rtk_usb_test.sh 前,需先通过 menuconfig 使能对应功能的内核选项。

具体路径参见各子章节的 menuconfig 配置说明。

下表列出 usb system v6.18 支持的所有 USB class、当前 defconfig 状态以及是否被 rtk_usb_test.sh 支持。

Host:

功能类别

Kernel CONFIG

defconfig 状态

rtk_usb_test.sh

CDC ACM 主机

USB_ACM

not set

Y usbh_acm

MSC 主机

USB_STORAGE

=m

Y usbh_msc

UVC 主机

USB_VIDEO_CLASS

not set

Y usbh_uvc

HID 主机

USB_HID

=m

Y usbh_hid

UAC 主机

SND_USB_AUDIO

not set

Y usbh_uac

Vendor 主机

USB_TEST

not set

Y usbh_vendor

USB Serial

USB_SERIAL

not set

N

UAS

USB_UAS

not set

N

CDC 网络主机(ECM / NCM / RNDIS / EEM)

USB_USBNET / USB_NET_CDCETHER / USB_NET_CDC_NCM / USB_NET_RNDIS_HOST / USB_NET_CDC_EEM

not set

N

其他(Printer / WDM / TMC / Bluetooth / USB Monitor / EHSET)

USB_PRINTER / USB_WDM / USB_TMC / BT_HCIBTUSB / USB_MON / USB_EHSET_TEST_FIXTURE

not set

N

备注

同时使能上述所有 class 功能会导致根文件系统固件体积过大而溢出(overflow),请根据实际项目需求在 menuconfig 中仅勾选当前所需功能。

"其他"行包含内核源码支持但嵌入式/IoT 场景中较少使用 class,仅供参考。如有需要可在 menuconfig 中手动启用。

使用方法:

使用 -r 参数指定要测试的角色(如 usbh_mscusbh_uacusbd_acmusbd_hid 等)。此命令会自动加载对应功能所需的内核模块,并自动设置 USB 模式(主机或设备)。

sh /bin/rtk_usb_test.sh -r <role>

对于已编译进内核的功能,使用 -b 参数跳过模块加载:

sh /bin/rtk_usb_test.sh -b -r <role>