Linux USB 概述
综述
USB OTG 功能以 Linux USB 子系统框架为基础,结合 Realtek 专项开发的 USB PHY 驱动与经适配的 DWC2 控制器驱动共同实现。
架构
USB 软件架构如下图所示。
USB 软件栈分层
以下表格展示了从硬件到应用的完整 USB 软件栈层次:
层次 |
组件 |
说明 |
|---|---|---|
应用层 |
|
用户空间工具和测试脚本 |
类驱动 |
|
各 USB 类的协议处理 |
USB 核心层 |
|
枚举、传输管理、UDC 框架 |
控制器驱动 |
|
主机/设备双角色控制器 (Realtek 修改) |
PHY 驱动 |
|
Realtek USB PHY,时钟/校准/force_mode |
硬件层 |
USB 控制器( |
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.4 或 usb 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 |
|
USB support |
|
USB Gadget Support |
|
Support for Host-side USB |
|
DesignWare USB2 DRD Core Support |
|
DWC2 mode(以主机模式为例) |
|
备注
根据实际需求选择 DWC2 模式:
主机模式:
(*) Host only mode设备模式:
( ) Gadget only modeOTG 模式:
( ) Dual Role USB support
[*] USB support 必须选中才能进入 USB 子菜单。
USB PHY 驱动在 Device Drivers -> Drivers for Realtek 下。
配置项 |
menuconfig 路径 |
|---|---|
USB PHY driver |
|
USB support |
|
USB Gadget Support |
|
Support for Host-side USB |
|
DesignWare USB2 DRD Core Support |
|
DWC2 mode(以主机模式为例) |
|
备注
DWC2 模式选择与内置编译配置相同。模块加载需按顺序执行:
主机模式:
insmod /lib/modules/<kernel_ver>/kernel/drivers/rtkdrivers/usb_phy/phy-rtk-usb.ko
insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/common/usb-common.ko
insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/core/usbcore.ko
insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/udc/udc-core.ko
insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/roles/roles.ko
insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/dwc2/dwc2.ko
设备模式:
insmod /lib/modules/<kernel_ver>/kernel/drivers/rtkdrivers/usb_phy/phy-rtk-usb.ko
insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/common/usb-common.ko
insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/core/usbcore.ko
insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/udc/udc-core.ko
insmod /lib/modules/<kernel_ver>/kernel/fs/configfs/configfs.ko
insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/gadget/libcomposite.ko
insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/roles/roles.ko
insmod /lib/modules/<kernel_ver>/kernel/drivers/usb/dwc2/dwc2.ko
快速使用
SDK 提供了位于板端的 /bin/rtk_usb_test.sh 用于快速测试 USB 功能。
使用 rtk_usb_test.sh 前,需先通过 menuconfig 使能对应功能的内核选项。
具体路径参见各子章节的 menuconfig 配置说明。
下表列出 usb system v6.18 支持的所有 USB class、当前 defconfig 状态以及是否被 rtk_usb_test.sh 支持。
功能类别 |
Kernel CONFIG |
defconfig 状态 |
rtk_usb_test.sh |
|---|---|---|---|
CDC ACM 主机 |
|
not set |
Y |
MSC 主机 |
|
=m |
Y |
UVC 主机 |
|
not set |
Y |
HID 主机 |
|
=m |
Y |
UAC 主机 |
|
not set |
Y |
Vendor 主机 |
|
not set |
Y |
USB Serial |
|
not set |
N |
UAS |
|
not set |
N |
CDC 网络主机(ECM / NCM / RNDIS / EEM) |
|
not set |
N |
其他(Printer / WDM / TMC / Bluetooth / USB Monitor / EHSET) |
|
not set |
N |
功能类别 |
Kernel CONFIG |
defconfig 状态 |
rtk_usb_test.sh |
|---|---|---|---|
CDC ACM 设备 |
|
=y |
Y |
MSC 设备 |
|
=y |
Y |
HID 设备 |
|
=y |
Y |
UAC2 设备 |
|
not set |
Y |
ADB 设备 |
|
=y |
Y |
Vendor 设备 |
|
=y |
Y |
USB OTG(双角色) |
|
=y |
Y |
UVC 设备 |
|
not set |
N |
网络设备(ECM / RNDIS / NCM) |
|
not set |
N |
UAC1 设备 |
|
not set |
N |
FunctionFS |
|
not set |
N |
Serial(gser) |
|
not set |
N |
其他(UAC1 Legacy / MIDI / MIDI2 / Printer / TCM / OBEX / EEM / Phonet) |
|
not set |
N |
备注
同时使能上述所有 class 功能会导致根文件系统固件体积过大而溢出(overflow),请根据实际项目需求在 menuconfig 中仅勾选当前所需功能。
"其他"行包含内核源码支持但嵌入式/IoT 场景中较少使用 class,仅供参考。如有需要可在 menuconfig 中手动启用。
使用方法:
使用 -r 参数指定要测试的角色(如 usbh_msc、usbh_uac、usbd_acm、usbd_hid 等)。此命令会自动加载对应功能所需的内核模块,并自动设置 USB 模式(主机或设备)。
sh /bin/rtk_usb_test.sh -r <role>
对于已编译进内核的功能,使用 -b 参数跳过模块加载:
sh /bin/rtk_usb_test.sh -b -r <role>