RK3588 kernel-6.1:drivers/usb/mtu3 功能与实现要点

RK3588 kernel-6.1:drivers/usb/mtu3 功能与实现要点

源码基准:rk3588/kernel-6.1/drivers/usb/mtu3/。模块名 mtu3CONFIG_USB_MTU3)。

1. 驱动定位

MTU3(MediaTek USB3 Dual Role Controller)是联发科 SoC 上的 USB2 + USB3(可选 Gen2)双角色控制器 Linux 驱动,在同一 SSUSB IP 上可同时具备:

  • 设备侧:自有 U3D MAC,对接 usb_gadgetmtu3_gadget*.cmtu3_core.c)。
  • 主机侧:不自建 OHCI/EHCI,而是配合 drivers/usb/host/xhci-mtk.cCONFIG_USB_XHCI_MTK),由 USB_MTU3 Kconfig select;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;依赖 EXTCONUSB_ROLE_SWITCH
USB_MTU3_DEBUG 打开 DEBUG 编译开关

MakefileCONFIG_TRACING 时增加 mtu3_trace.oDEBUG_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_baseIP Power & Clock,端口开关、主机/设备掉电、复位),以及 struct phy **regulatorclocksotg_switchdr_modeis_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 VBUSextcon(注释标明 deprecated,与 usb_role_switch 二选一)、desired_roledr_work(避免在原子上下文睡眠)、is_u3_drd(U3 port0 是否参与 DRD)。


4. 平台与生命周期(mtu3_plat.c

  1. 资源ioremap MAC/IPPC clk-bulkvusb33、多路 phy_init/phy_power_onreset
  2. 复位与时钟ssusb_ip_sw_resetssusb_check_clocks(轮询 PLL/MAC 稳定位)。
  3. 模式:由 usb_get_dr_mode 与 Kconfig 合成 ssusb->dr_mode;默认 is_host 在非 peripheral 时为真。
  4. 分支初始化
    • PERIPHERALssusb_gadget_init
    • HOSTssusb_host_init(内部 of_platform_populate 拉起 xHCI
    • OTG:先 Gadget,再 Host,再 ssusb_otg_switch_initmtu3_dr.c
  5. 省电pm_runtimewait_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 hostssusb_set_force_mode(..., MTU3_DR_FORCE_HOST)),必要时 port0 VBUS
  • ssusb_host_initssusb_host_setupof_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_opstateDC_SESSION + SOFT_CONN)配合链路。
  • ssusb_mode_sw_work:对比 desired_role 与当前 is_hostpm_runtime_get 后执行模式切换、停/启 GadgetxHCI 侧协作(与 usb_role_switch 回调衔接)。
  • ssusb_set_vbus:可选 regulator 供电。

7. Gadget / 核心硬件层(mtu3_core.c 等)

  • FIFOep_fifo_alloc 在位图上分配连续 512B 块;与 slotmaxpacket 对齐 power-of-two
  • 速度mtu3_speed(inactive / FS / HS / SS / SSP)。
  • 设备使能mtu3_device_enable:清 SSUSB_IP_DEV_PDN,配置 U2/U3 port0 非 HOST、可选 OTG_SEL/DUAL_MODEmtu3_device_disable 反向。
  • USB3mtu3_ss_func_setUSB3_EN → LTSSM);HS softconnectSOFT_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/stopmtu3_insert_gpdmtu3_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_hcdxhci-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.cDocumentation/devicetree/bindings/usb/mediatek,*.yaml(若树内存在)中的 SSUSB / xhci 子节点关系。

文章互动

阅读 --

留言

0 条留言

正在加载留言…