RK3588 kernel-6.1:drivers/usb/mtu3 功能与实现要点
源码基准:rk3588/kernel-6.1/drivers/usb/mtu3/。模块名 mtu3(CONFIG_USB_MTU3)。
1. 驱动定位
MTU3(MediaTek USB3 Dual Role Controller)是联发科 SoC 上的 USB2 + USB3(可选 Gen2)双角色控制器 Linux 驱动,在同一 SSUSB IP 上可同时具备:
- 设备侧:自有
U3DMAC,对接usb_gadget(mtu3_gadget*.c、mtu3_core.c)。 - 主机侧:不自建 OHCI/EHCI,而是配合
drivers/usb/host/xhci-mtk.c(CONFIG_USB_XHCI_MTK),由USB_MTU3Kconfigselect;MTU3 负责 上电、时钟、PHY、端口、DRD,再在 DT 子节点上of_platform_populate注册 xHCI platform 设备。
与 RK3588:驱动 depends on ARCH_MEDIATEK || COMPILE_TEST。RK3588 为 Rockchip,不使用 MTU3;RK3588 主线对应 drivers/usb/dwc3 等。本文档仍以「源码阅读/IP 架构」为主。
2. Kconfig / Makefile 与编译组合
| 选项 | 作用 |
|---|---|
USB_MTU3_HOST |
仅主机:编译 mtu3_plat.o + mtu3_host.o |
USB_MTU3_GADGET |
仅设备: mtu3_plat.o + mtu3_core.o / mtu3_gadget*.o / mtu3_qmu.o |
USB_MTU3_DUAL_ROLE |
OTG:HOST + GADGET 全套,另编 mtu3_dr.o;依赖 EXTCON 与 USB_ROLE_SWITCH |
USB_MTU3_DEBUG |
打开 DEBUG 编译开关 |
Makefile:CONFIG_TRACING 时增加 mtu3_trace.o;DEBUG_FS 时增加 mtu3_debugfs.o。
3. 数据结构与寄存器视图(mtu3.h / mtu3_hw_regs.h)
3.1 struct ssusb_mtk
顶层 platform 设备私有数据:指向 struct mtu3 *u3d,映射 mac_base(设备 MAC,不含 xHCI 寄存器窗)、ippc_base(IP Power & Clock,端口开关、主机/设备掉电、复位),以及 struct phy **、regulator、clocks、otg_switch、dr_mode、is_host、端口数量与屏蔽(u2_ports/u3_ports/u2p_dis_msk/u3p_dis_msk**)、可选 mediatek,syscon-wakeup(主机 ip-sleep 唤醒)。
3.2 struct mtu3
Gadget 实例:EP 数组、TX/RX FIFO 位图(按 512B 单元 MTU3_EP_FIFO_UNIT 管理)、中断、slot(U2/U3 IP 的 FIFO 倍增系数)、u3_capable/gen2cp(USB3 Gen2 兼容,影响 MTU3_TRUNK_VERS_1003 相关 CSR 布局)。
3.3 struct otg_switch_mtk
双角色切换:regulator VBUS、extcon(注释标明 deprecated,与 usb_role_switch 二选一)、desired_role、dr_work(避免在原子上下文睡眠)、is_u3_drd(U3 port0 是否参与 DRD)。
4. 平台与生命周期(mtu3_plat.c)
- 资源:
ioremapMAC/IPPC、clk-bulk、vusb33、多路phy_init/phy_power_on、reset。 - 复位与时钟:
ssusb_ip_sw_reset、ssusb_check_clocks(轮询 PLL/MAC 稳定位)。 - 模式:由
usb_get_dr_mode与 Kconfig 合成ssusb->dr_mode;默认is_host在非 peripheral 时为真。 - 分支初始化:
- PERIPHERAL:
ssusb_gadget_init - HOST:
ssusb_host_init(内部of_platform_populate拉起 xHCI) - OTG:先 Gadget,再 Host,再
ssusb_otg_switch_init(mtu3_dr.c)
- PERIPHERAL:
- 省电:
pm_runtime、wait_for_ip_sleep、suspend 时 关 PHY/时钟 并ssusb_wakeup_set打开 syscon 唤醒 glue。
5. 主机路径(mtu3_host.c)
host_ports_num_get:读U3D_SSUSB_IP_XHCI_CAP得到 U2/U3 端口数。ssusb_host_enable/disable:按端口掩码 PDN/使能,配置 force host(ssusb_set_force_mode(..., MTU3_DR_FORCE_HOST)),必要时 port0 VBUS。ssusb_host_init:ssusb_host_setup后of_platform_populate(parent_dn, ...),由 DT 子节点绑定xhci-mtk。ssusb_host_suspend/resume:按端口逐个 PDN 或 上电,并操纵SSUSB_IP_HOST_PDN。- 唤醒:
ssusb_wakeup_of_property_parse解析mediatek,syscon-wakeup,按uwk_vers写不同 PMIC/SPM 寄存器(多芯片兼容表)。
6. 双角色切换(mtu3_dr.c)
- 硬件约束:注释写明 仅 port0 支持 DRD。
ssusb_port0_switch:对 U2/U3 先后 PDN+DIS,再上电并HOST_SEL决定主机或设备。switch_port_to_host/switch_port_to_device:切端口后ssusb_check_clocks;主机路径末尾toggle_opstate(DC_SESSION+SOFT_CONN)配合链路。ssusb_mode_sw_work:对比desired_role与当前is_host,pm_runtime_get后执行模式切换、停/启 Gadget、xHCI 侧协作(与usb_role_switch回调衔接)。ssusb_set_vbus:可选regulator供电。
7. Gadget / 核心硬件层(mtu3_core.c 等)
- FIFO:
ep_fifo_alloc在位图上分配连续 512B 块;与slot、maxpacket 对齐 power-of-two。 - 速度:
mtu3_speed(inactive / FS / HS / SS / SSP)。 - 设备使能:
mtu3_device_enable:清SSUSB_IP_DEV_PDN,配置 U2/U3 port0 非 HOST、可选OTG_SEL/DUAL_MODE;mtu3_device_disable反向。 - USB3:
mtu3_ss_func_set(USB3_EN→ LTSSM);HS softconnect:SOFT_CONN。 - 中断 / EP0:与
mtu3_gadget_ep0.c的状态机(enum mtu3_g_ep0_state)联动。
8. QMU(mtu3_qmu.c / mtu3_qmu.h)
Queue Management Unit:硬件队列 DMA,使用 GPD(General Purpose Descriptor) 环形缓冲区(struct mtu3_gpd_ring,见 struct qmu_gpd 位域说明)。入口包括 mtu3_qmu_start/stop、mtu3_insert_gpd、mtu3_qmu_isr。Gen2 IP 支持更长 buffer(GPD_BUF_SIZE vs GPD_BUF_SIZE_EL)。
9. 小结
| 维度 | 说明 |
|---|---|
| 芯片 | MediaTek SSUSB:设备 U3D + 主机 xHCI(mtk glue) |
| 对上接口 | Gadget:usb_gadget;Host:usb_hcd 由 xhci-mtk 提供 |
| DRD | Port0 U2/U3 切换 + usb_role_switch/extcon + workqueue |
| PHY/电源 | Generic phy_*、vusb33、可选 VBUS regulator |
| RK3588 | 不适用;对照阅读 dwc3 + phy-rockchip 即可 |
若要对照主机栈,请同时打开 drivers/usb/host/xhci-mtk.c 与 Documentation/devicetree/bindings/usb/mediatek,*.yaml(若树内存在)中的 SSUSB / xhci 子节点关系。
正在加载留言…