01-USB驱动子系统总览:框架与核心文件导读

文章目录

    • 概述
    • 一、USB子系统全局架构
      • [1.1 总体分层](#1.1 总体分层)
      • [1.2 从两个视角看USB](#1.2 从两个视角看USB)
    • [二、USB Core 核心层](#二、USB Core 核心层)
      • [2.1 文件总览](#2.1 文件总览)
      • [2.2 初始化流程](#2.2 初始化流程)
      • [2.3 设备枚举流程](#2.3 设备枚举流程)
    • [三、Host 主机控制器驱动](#三、Host 主机控制器驱动)
      • [3.1 文件总览](#3.1 文件总览)
      • [3.2 HCD操作集](#3.2 HCD操作集)
      • [3.3 数据传输路径](#3.3 数据传输路径)
    • [四、Gadget 设备端框架](#四、Gadget 设备端框架)
      • [4.1 文件总览](#4.1 文件总览)
      • [4.2 三层架构](#4.2 三层架构)
      • [4.3 Function驱动文件](#4.3 Function驱动文件)
    • [五、DWC3 控制器](#五、DWC3 控制器)
      • [5.1 文件总览](#5.1 文件总览)
      • [5.2 双角色架构](#5.2 双角色架构)
    • [六、USB PHY 与 Type-C](#六、USB PHY 与 Type-C)
      • [6.1 文件总览](#6.1 文件总览)
      • [6.2 信号链路](#6.2 信号链路)
    • 七、类驱动与专用驱动
      • [7.1 文件总览](#7.1 文件总览)
    • 八、关键头文件
      • [8.1 文件总览](#8.1 文件总览)
      • [8.2 用户空间接口](#8.2 用户空间接口)
    • 九、教程与内核文件对照表
    • 十、知识总结

概述

本文是Linux USB驱动子系统的全局导读,从架构视角梳理整个USB驱动框架的分层设计、核心文件职责、模块间交互关系。帮助读者建立完整的USB子系统知识地图,知道"每个文件在哪里、做什么、怎么关联"。

源码位置 : drivers/usb/ + include/linux/usb/

内核版本: Linux 6.1


一、USB子系统全局架构

1.1 总体分层

#mermaid-svg-VF6UcXeapESzfPnW{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VF6UcXeapESzfPnW .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VF6UcXeapESzfPnW .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VF6UcXeapESzfPnW .error-icon{fill:#552222;}#mermaid-svg-VF6UcXeapESzfPnW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VF6UcXeapESzfPnW .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VF6UcXeapESzfPnW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VF6UcXeapESzfPnW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VF6UcXeapESzfPnW .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VF6UcXeapESzfPnW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VF6UcXeapESzfPnW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VF6UcXeapESzfPnW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VF6UcXeapESzfPnW .marker.cross{stroke:#333333;}#mermaid-svg-VF6UcXeapESzfPnW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VF6UcXeapESzfPnW p{margin:0;}#mermaid-svg-VF6UcXeapESzfPnW .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VF6UcXeapESzfPnW .cluster-label text{fill:#333;}#mermaid-svg-VF6UcXeapESzfPnW .cluster-label span{color:#333;}#mermaid-svg-VF6UcXeapESzfPnW .cluster-label span p{background-color:transparent;}#mermaid-svg-VF6UcXeapESzfPnW .label text,#mermaid-svg-VF6UcXeapESzfPnW span{fill:#333;color:#333;}#mermaid-svg-VF6UcXeapESzfPnW .node rect,#mermaid-svg-VF6UcXeapESzfPnW .node circle,#mermaid-svg-VF6UcXeapESzfPnW .node ellipse,#mermaid-svg-VF6UcXeapESzfPnW .node polygon,#mermaid-svg-VF6UcXeapESzfPnW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VF6UcXeapESzfPnW .rough-node .label text,#mermaid-svg-VF6UcXeapESzfPnW .node .label text,#mermaid-svg-VF6UcXeapESzfPnW .image-shape .label,#mermaid-svg-VF6UcXeapESzfPnW .icon-shape .label{text-anchor:middle;}#mermaid-svg-VF6UcXeapESzfPnW .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VF6UcXeapESzfPnW .rough-node .label,#mermaid-svg-VF6UcXeapESzfPnW .node .label,#mermaid-svg-VF6UcXeapESzfPnW .image-shape .label,#mermaid-svg-VF6UcXeapESzfPnW .icon-shape .label{text-align:center;}#mermaid-svg-VF6UcXeapESzfPnW .node.clickable{cursor:pointer;}#mermaid-svg-VF6UcXeapESzfPnW .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VF6UcXeapESzfPnW .arrowheadPath{fill:#333333;}#mermaid-svg-VF6UcXeapESzfPnW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VF6UcXeapESzfPnW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VF6UcXeapESzfPnW .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VF6UcXeapESzfPnW .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VF6UcXeapESzfPnW .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VF6UcXeapESzfPnW .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VF6UcXeapESzfPnW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VF6UcXeapESzfPnW .cluster text{fill:#333;}#mermaid-svg-VF6UcXeapESzfPnW .cluster span{color:#333;}#mermaid-svg-VF6UcXeapESzfPnW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VF6UcXeapESzfPnW .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VF6UcXeapESzfPnW rect.text{fill:none;stroke-width:0;}#mermaid-svg-VF6UcXeapESzfPnW .icon-shape,#mermaid-svg-VF6UcXeapESzfPnW .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VF6UcXeapESzfPnW .icon-shape p,#mermaid-svg-VF6UcXeapESzfPnW .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VF6UcXeapESzfPnW .icon-shape .label rect,#mermaid-svg-VF6UcXeapESzfPnW .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VF6UcXeapESzfPnW .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VF6UcXeapESzfPnW .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VF6UcXeapESzfPnW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 内核空间
用户空间
硬件抽象
Device侧
Host侧
USB Core
应用程序

libusb/usbfs/udev
usb.c

总线注册
hub.c

设备枚举
driver.c

驱动匹配
hcd.c

HCD框架
urb.c

URB管理
message.c

控制传输
config.c

配置解析
sysfs.c

属性导出
quirks.c

设备quirks
EHCI

USB 2.0
xHCI

USB 3.0
OHCI

USB 1.1
composite.c

复合设备
configfs.c

动态配置
Function驱动

f_uvc/f_ecm/f_fs等
UDC core

控制器管理
DWC3

控制器
USB PHY

物理层
Type-C/PD

角色管理

1.2 从两个视角看USB

复制代码
┌─────────────────────────────────────────────────────────────────┐
│                    Linux USB 子系统                              │
├──────────────────────┬──────────────────────────────────────────┤
│    Host 侧(主机)      │         Device 侧(设备)                  │
│                      │                                          │
│  应用层               │  应用层                                   │
│  ├── libusb          │  ├── ConfigFS                            │
│  ├── usbfs           │  ├── functionfs                          │
│  └── udev            │  └── gadgetfs                            │
│                      │                                          │
│  类驱动               │  Function驱动                             │
│  ├── usb-storage     │  ├── f_uvc (视频)                         │
│  ├── usb-serial      │  ├── f_ecm (以太网)                       │
│  ├── usbnet          │  ├── f_fs  (ADB)                         │
│  └── usbhid          │  └── f_hid (人机接口)                     │
│                      │                                          │
│  USB Core            │  Gadget 框架                               │
│  ├── usb.c           │  ├── composite.c                         │
│  ├── hub.c           │  ├── configfs.c                          │
│  ├── hcd.c           │  ├── udc/core.c                          │
│  ├── urb.c           │  └── config.c                            │
│  └── driver.c        │                                          │
│                      │                                          │
│  主机控制器驱动         │  设备控制器驱动                             │
│  ├── EHCI (USB 2.0)  │  └── DWC3 (USB 2.0/3.0)                 │
│  ├── xHCI (USB 3.0)  │                                          │
│  └── OHCI (USB 1.1)  │  USB PHY                                 │
│                      │  ├── USB2 PHY                             │
│                      │  └── USB3 PHY                             │
├──────────────────────┴──────────────────────────────────────────┤
│                    USB 硬件(控制器+PHY+连接器)                     │
└─────────────────────────────────────────────────────────────────┘

二、USB Core 核心层

2.1 文件总览

源码 : drivers/usb/core/

文件 大小 核心职责 对应教程
usb.c 31KB 子系统入口,总线注册,初始化 Host驱动01/02
hub.c 183KB Hub驱动,热插拔检测,设备枚举 Host驱动07/08
driver.c 59KB 驱动注册/匹配/绑定 Host驱动02/03
hcd.c 92KB HCD通用框架,URB调度 Host驱动12
urb.c 35KB URB请求块管理 Host驱动12
message.c 74KB 控制/批量传输封装 Host驱动12
config.c 32KB 配置描述符解析 Host驱动14
sysfs.c 32KB sysfs属性导出 Host驱动14
quirks.c 21KB 设备quirks处理 Host驱动14
devio.c 72KB /dev/bus/usb/用户接口 Host驱动01
file.c 6KB 字符设备注册 Host驱动01
generic.c 9KB 通用USB设备驱动 Host驱动01
notify.c 2KB 通知链 Host驱动01
port.c 19KB 端口管理 ---
buffer.c 4KB 缓冲区管理 ---
endpoint.c 4KB 端点管理 ---
phy.c 5KB PHY管理 ---
of.c 3KB 设备树支持 ---
usb-acpi.c 7KB ACPI支持 ---

2.2 初始化流程

通知链 通用驱动 Hub驱动 文件系统 总线注册 usb_init() 通知链 通用驱动 Hub驱动 文件系统 总线注册 usb_init() #mermaid-svg-VX1TYZKBe2Gzz6P6{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VX1TYZKBe2Gzz6P6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .error-icon{fill:#552222;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .marker.cross{stroke:#333333;}#mermaid-svg-VX1TYZKBe2Gzz6P6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VX1TYZKBe2Gzz6P6 p{margin:0;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VX1TYZKBe2Gzz6P6 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-VX1TYZKBe2Gzz6P6 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-VX1TYZKBe2Gzz6P6 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .sequenceNumber{fill:white;}#mermaid-svg-VX1TYZKBe2Gzz6P6 #sequencenumber{fill:#333;}#mermaid-svg-VX1TYZKBe2Gzz6P6 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .messageText{fill:#333;stroke:none;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .labelText,#mermaid-svg-VX1TYZKBe2Gzz6P6 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .loopText,#mermaid-svg-VX1TYZKBe2Gzz6P6 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-VX1TYZKBe2Gzz6P6 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .noteText,#mermaid-svg-VX1TYZKBe2Gzz6P6 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .actorPopupMenu{position:absolute;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-VX1TYZKBe2Gzz6P6 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VX1TYZKBe2Gzz6P6 .actor-man circle,#mermaid-svg-VX1TYZKBe2Gzz6P6 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-VX1TYZKBe2Gzz6P6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 注册 /dev/bus/usb/ 注册主设备号 注册hub驱动 注册usb_generic_driver 初始化通知链 bus_register(&usb_bus_type) usb_devio_init() usb_major_init() usb_hub_init() usb_generic_driver_init() usb_notifier_init()

2.3 设备枚举流程

类驱动 driver.c config.c usb.c hub.c 类驱动 driver.c config.c usb.c hub.c #mermaid-svg-FjR6iBj8uhwFrpkA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-FjR6iBj8uhwFrpkA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-FjR6iBj8uhwFrpkA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-FjR6iBj8uhwFrpkA .error-icon{fill:#552222;}#mermaid-svg-FjR6iBj8uhwFrpkA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FjR6iBj8uhwFrpkA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-FjR6iBj8uhwFrpkA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FjR6iBj8uhwFrpkA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FjR6iBj8uhwFrpkA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-FjR6iBj8uhwFrpkA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FjR6iBj8uhwFrpkA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FjR6iBj8uhwFrpkA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FjR6iBj8uhwFrpkA .marker.cross{stroke:#333333;}#mermaid-svg-FjR6iBj8uhwFrpkA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FjR6iBj8uhwFrpkA p{margin:0;}#mermaid-svg-FjR6iBj8uhwFrpkA .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-FjR6iBj8uhwFrpkA text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-FjR6iBj8uhwFrpkA .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-FjR6iBj8uhwFrpkA .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-FjR6iBj8uhwFrpkA .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-FjR6iBj8uhwFrpkA .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-FjR6iBj8uhwFrpkA #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-FjR6iBj8uhwFrpkA .sequenceNumber{fill:white;}#mermaid-svg-FjR6iBj8uhwFrpkA #sequencenumber{fill:#333;}#mermaid-svg-FjR6iBj8uhwFrpkA #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-FjR6iBj8uhwFrpkA .messageText{fill:#333;stroke:none;}#mermaid-svg-FjR6iBj8uhwFrpkA .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-FjR6iBj8uhwFrpkA .labelText,#mermaid-svg-FjR6iBj8uhwFrpkA .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-FjR6iBj8uhwFrpkA .loopText,#mermaid-svg-FjR6iBj8uhwFrpkA .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-FjR6iBj8uhwFrpkA .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-FjR6iBj8uhwFrpkA .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-FjR6iBj8uhwFrpkA .noteText,#mermaid-svg-FjR6iBj8uhwFrpkA .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-FjR6iBj8uhwFrpkA .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-FjR6iBj8uhwFrpkA .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-FjR6iBj8uhwFrpkA .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-FjR6iBj8uhwFrpkA .actorPopupMenu{position:absolute;}#mermaid-svg-FjR6iBj8uhwFrpkA .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-FjR6iBj8uhwFrpkA .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-FjR6iBj8uhwFrpkA .actor-man circle,#mermaid-svg-FjR6iBj8uhwFrpkA line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-FjR6iBj8uhwFrpkA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} usb-storage/usb-serial等 检测端口状态变化 usb_new_device() 获取设备描述符(前8字节) 设置地址 获取完整描述符 usb_parse_configuration() 解析配置/接口/端点 usb_set_configuration() 匹配接口驱动 probe()


三、Host 主机控制器驱动

3.1 文件总览

源码 : drivers/usb/host/

控制器类型 核心文件 速度支持 对应教程
EHCI ehci-hcd.c, ehci-q.c, ehci-sched.c USB 2.0(480Mbps) Host驱动10/15
xHCI xhci.c, xhci-ring.c, xhci-mem.c USB 3.0+(5/10/20Gbps) Host驱动13
OHCI ohci-hcd.c, ohci-hub.c USB 1.1(12Mbps) ---
UHCI uhci-hcd.c USB 1.1(Intel) ---

3.2 HCD操作集

c 复制代码
/* 每个HCD必须实现的接口 */
struct hc_driver {
    /* 生命周期 */
    int     (*reset)(struct usb_hcd *hcd);
    int     (*start)(struct usb_hcd *hcd);
    void    (*stop)(struct usb_hcd *hcd);
    
    /* URB操作 */
    int     (*urb_enqueue)(struct usb_hcd *, struct urb *, gfp_t);
    int     (*urb_dequeue)(struct usb_hcd *, struct urb *, int);
    
    /* Hub操作 */
    int     (*hub_status_data)(struct usb_hcd *, char *);
    int     (*hub_control)(struct usb_hcd *, u16, u16, u16, char *, u16);
    
    /* 中断 */
    irqreturn_t (*irq)(struct usb_hcd *);
};

3.3 数据传输路径

复制代码
应用层 → usb_submit_urb() → hcd.c → 具体HCD(ehci/xhci) → 硬件
                                                              ↓
应用层 ← complete回调 ← urb.c ← HCD中断处理 ← 硬件完成传输 ←┘

四、Gadget 设备端框架

4.1 文件总览

源码 : drivers/usb/gadget/

目录/文件 功能 对应教程
composite.c 复合设备核心 Gadget框架01/06/12
configfs.c ConfigFS动态配置 Gadget框架02/08/12
config.c 配置管理 Gadget框架12
epautoconf.c 端点自动配置 Gadget框架04
function/ 功能驱动 功能驱动01~06
udc/core.c UDC管理 Gadget框架05
udc/dummy_hcd.c 虚拟UDC(测试) ---
legacy/ 传统Gadget驱动 Gadget框架07

4.2 三层架构

#mermaid-svg-OqjsrFFBs6qHemid{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OqjsrFFBs6qHemid .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OqjsrFFBs6qHemid .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OqjsrFFBs6qHemid .error-icon{fill:#552222;}#mermaid-svg-OqjsrFFBs6qHemid .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OqjsrFFBs6qHemid .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OqjsrFFBs6qHemid .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OqjsrFFBs6qHemid .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OqjsrFFBs6qHemid .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OqjsrFFBs6qHemid .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OqjsrFFBs6qHemid .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OqjsrFFBs6qHemid .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OqjsrFFBs6qHemid .marker.cross{stroke:#333333;}#mermaid-svg-OqjsrFFBs6qHemid svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OqjsrFFBs6qHemid p{margin:0;}#mermaid-svg-OqjsrFFBs6qHemid .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OqjsrFFBs6qHemid .cluster-label text{fill:#333;}#mermaid-svg-OqjsrFFBs6qHemid .cluster-label span{color:#333;}#mermaid-svg-OqjsrFFBs6qHemid .cluster-label span p{background-color:transparent;}#mermaid-svg-OqjsrFFBs6qHemid .label text,#mermaid-svg-OqjsrFFBs6qHemid span{fill:#333;color:#333;}#mermaid-svg-OqjsrFFBs6qHemid .node rect,#mermaid-svg-OqjsrFFBs6qHemid .node circle,#mermaid-svg-OqjsrFFBs6qHemid .node ellipse,#mermaid-svg-OqjsrFFBs6qHemid .node polygon,#mermaid-svg-OqjsrFFBs6qHemid .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OqjsrFFBs6qHemid .rough-node .label text,#mermaid-svg-OqjsrFFBs6qHemid .node .label text,#mermaid-svg-OqjsrFFBs6qHemid .image-shape .label,#mermaid-svg-OqjsrFFBs6qHemid .icon-shape .label{text-anchor:middle;}#mermaid-svg-OqjsrFFBs6qHemid .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OqjsrFFBs6qHemid .rough-node .label,#mermaid-svg-OqjsrFFBs6qHemid .node .label,#mermaid-svg-OqjsrFFBs6qHemid .image-shape .label,#mermaid-svg-OqjsrFFBs6qHemid .icon-shape .label{text-align:center;}#mermaid-svg-OqjsrFFBs6qHemid .node.clickable{cursor:pointer;}#mermaid-svg-OqjsrFFBs6qHemid .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OqjsrFFBs6qHemid .arrowheadPath{fill:#333333;}#mermaid-svg-OqjsrFFBs6qHemid .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OqjsrFFBs6qHemid .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OqjsrFFBs6qHemid .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OqjsrFFBs6qHemid .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OqjsrFFBs6qHemid .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OqjsrFFBs6qHemid .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OqjsrFFBs6qHemid .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OqjsrFFBs6qHemid .cluster text{fill:#333;}#mermaid-svg-OqjsrFFBs6qHemid .cluster span{color:#333;}#mermaid-svg-OqjsrFFBs6qHemid div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OqjsrFFBs6qHemid .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OqjsrFFBs6qHemid rect.text{fill:none;stroke-width:0;}#mermaid-svg-OqjsrFFBs6qHemid .icon-shape,#mermaid-svg-OqjsrFFBs6qHemid .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OqjsrFFBs6qHemid .icon-shape p,#mermaid-svg-OqjsrFFBs6qHemid .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OqjsrFFBs6qHemid .icon-shape .label rect,#mermaid-svg-OqjsrFFBs6qHemid .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OqjsrFFBs6qHemid .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OqjsrFFBs6qHemid .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OqjsrFFBs6qHemid :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 控制器层
设备层
Function层
f_uvc.c

视频
f_ecm.c

网络
f_fs.c

ADB
f_hid.c

人机
composite.c

复合设备管理
configfs.c

动态配置
udc/core.c

UDC框架
dwc3/gadget.c

DWC3控制器

4.3 Function驱动文件

源码 : drivers/usb/gadget/function/

文件 功能 对应教程
f_uvc.c UVC视频 功能驱动01/04/06
f_ecm.c ECM以太网 功能驱动02
f_rndis.c RNDIS网络 ---
f_ncm.c NCM网络 ---
f_fs.c FunctionFS(ADB) 功能驱动03
f_mass_storage.c 大容量存储 功能驱动05
f_hid.c HID人机接口 功能驱动05
f_acm.c ACM串口 功能驱动05
f_uac2.c UAC2音频 Gadget框架10
u_serial.c 串口通用层 Gadget框架13
u_ether.c 以太网通用层 Gadget框架13
u_audio.c 音频通用层 Gadget框架13
uvc_video.c UVC视频流 功能驱动06
uvc_queue.c UVC缓冲区 功能驱动06
uvc_v4l2.c UVC V4L2接口 功能驱动06
uvc_configfs.c UVC ConfigFS 功能驱动06

五、DWC3 控制器

5.1 文件总览

源码 : drivers/usb/dwc3/

文件 功能 对应教程
core.c 控制器初始化 平台实践05
core.h 寄存器定义 ---
gadget.c 设备端核心 Gadget框架11
ep0.c 端点0控制传输 Gadget框架11
drd.c 双角色切换 平台实践05
host.c Host模式 平台实践05
debugfs.c 调试接口 ---

5.2 双角色架构

复制代码
DWC3控制器
├── core.c: 初始化 + 模式选择
├── drd.c: 角色检测(OTG/DRD)
│   ├── Device模式 → gadget.c + ep0.c
│   └── Host模式 → host.c → xHCI驱动
└── 共享: 寄存器/中断/PHY

六、USB PHY 与 Type-C

6.1 文件总览

目录 功能 对应教程
drivers/usb/phy/ USB PHY驱动 平台实践06
drivers/phy/ 通用PHY驱动 平台实践03
drivers/usb/typec/ Type-C驱动 平台实践06
drivers/extcon/ 外部连接器 Host驱动11

6.2 信号链路

复制代码
USB控制器(DWC3) → USB PHY(物理层) → USB连接器(Type-C) → USB线缆 → 对端设备

七、类驱动与专用驱动

7.1 文件总览

目录 功能 对应教程
drivers/usb/storage/ USB存储(U盘) 应用调试09
drivers/usb/serial/ USB转串口 应用调试09
drivers/usb/class/ USB类驱动 ---
drivers/usb/mon/ usbmon抓包 应用调试06
drivers/hid/usbhid/ USB HID 应用调试01
drivers/net/usb/ USB网卡 应用调试02
drivers/media/usb/uvc/ UVC摄像头 功能驱动01

八、关键头文件

8.1 文件总览

源码 : include/linux/usb/

头文件 功能 引用位置
usb.h 核心结构体 几乎所有USB驱动
hcd.h HCD接口 Host控制器驱动
gadget.h Gadget接口 Device端驱动
composite.h 复合设备接口 Function驱动
ch9.h USB描述符定义 协议基础07
phy.h PHY接口 平台实践03/06
typec.h Type-C接口 平台实践06
usbnet.h USB网络接口 应用调试02
otg.h OTG接口 ---
role.h USB角色管理 Host驱动11

8.2 用户空间接口

源码 : include/uapi/linux/usb/

头文件 功能
ch9.h USB协议第9章(描述符)
ch11.h USB Hub规范
device_fs.h usbfs接口
functionfs.h FunctionFS接口

九、教程与内核文件对照表

教程文件 覆盖的内核文件
协议基础01~07 USB协议规范(非代码)
传输与枚举01~04 USB传输/枚举流程
Host驱动01 usb.c, devio.c, file.c, generic.c, notify.c
Host驱动02 usb.c, driver.c
Host驱动03 usb_driver结构体
Host驱动04 usb_device_driver结构体
Host驱动05 include/linux/usb.h
Host驱动06 usbcore框架
Host驱动07 hub.c
Host驱动08 hub.c(枚举流程)
Host驱动09 HCD框架
Host驱动10 ehci-platform.c
Host驱动11 extcon/
Host驱动12 hcd.c, urb.c, message.c
Host驱动13 xhci.c, xhci-ring.c, xhci-mem.c, xhci-hub.c
Host驱动14 config.c, sysfs.c, quirks.c
Host驱动15 ehci-hcd.c, ehci-q.c, ehci-sched.c
Gadget框架01 composite.c
Gadget框架02 configfs.c
Gadget框架03 udc/
Gadget框架04 端点管理
Gadget框架05 udc/core.c
Gadget框架06 composite.c(绑定)
Gadget框架07 legacy/
Gadget框架08 configfs.c
Gadget框架09 子协议
Gadget框架10 f_uac2.c
Gadget框架11 dwc3/gadget.c, dwc3/ep0.c
Gadget框架12 composite.c, configfs.c(深入)
Gadget框架13 u_serial.c, u_ether.c, u_audio.c
功能驱动01 UVC协议 + media/usb/uvc/
功能驱动02 f_ecm.c
功能驱动03 f_fs.c
功能驱动04 f_uvc.c
功能驱动05 f_mass_storage.c, f_hid.c, f_acm.c
功能驱动06 uvc_video.c, uvc_queue.c, uvc_v4l2.c
应用调试01~08 调试工具/方法
应用调试09 storage/, serial/
平台实践01 RK3568设备树
平台实践02 DTS配置
平台实践03 PHY驱动
平台实践04 DWC3配置
平台实践05 dwc3/core.c, drd.c, host.c
平台实践06 phy/, typec/
附录A~G 辅助参考

十、知识总结

复制代码
USB驱动子系统
├── USB Core (核心层)
│   ├── 总线管理: usb.c
│   ├── 设备枚举: hub.c
│   ├── 驱动匹配: driver.c
│   ├── HCD框架: hcd.c
│   ├── URB管理: urb.c
│   ├── 传输封装: message.c
│   ├── 配置解析: config.c
│   ├── 属性导出: sysfs.c
│   └── quirks: quirks.c
├── Host 主机侧
│   ├── EHCI: ehci-*.c (USB 2.0)
│   ├── xHCI: xhci-*.c (USB 3.0)
│   └── OHCI: ohci-*.c (USB 1.1)
├── Device 设备侧
│   ├── 框架: composite.c, configfs.c
│   ├── Function: f_uvc.c, f_ecm.c, f_fs.c等
│   ├── 底层: u_serial.c, u_ether.c, u_audio.c
│   └── UDC: udc/core.c
├── 控制器
│   ├── DWC3: dwc3/core.c, gadget.c, ep0.c
│   └── PHY: phy/, typec/
└── 类驱动
    ├── 存储: storage/
    ├── 串口: serial/
    ├── 网络: net/usb/
    └── HID: hid/usbhid/

下一步学习:

相关推荐
Industio_触觉智能4 天前
RK3576开发板GPIO驱动入门教程,基于触觉智能开发板教学-上
嵌入式硬件·硬件工程·智能硬件·开发板·gpio·瑞芯微·rk3576
π同学13 天前
ESP-IDF+vscode开发ESP32第十七讲——USB设备栈
vscode·esp32·usb
sinat_399010271 个月前
snps usb ip及 vip 使用
usb
IOT那些事儿1 个月前
RT-Thread STM32F407自制BSP编译
bsp·rt-thread·hal·stm32f407zet6
阿钱真强道1 个月前
29 鸿蒙LiteOS RK2206 Socket编程实战 UDP通信+LWIP原理全解析
udp·socket·鸿蒙·liteos·开源鸿蒙·瑞芯微·rk2206
阿钱真强道1 个月前
27 鸿蒙LiteOS RK2206 设备连路由器完整实战(配网+联网验证+网络连通性测试)
wifi·harmonyos·鸿蒙·rk·liteos·开源鸿蒙·瑞芯微
Championship.23.241 个月前
Linux 3.0 USB机制深度解析:USB 3.0支持与传统外设驱动架构
linux·运维·架构·usb
amuzhichuang1 个月前
阿姆智创ARM-3568A工控开发板,机器视觉设备控制升级
瑞芯微·机器视觉设备·amr工控开发板
阿钱真强道2 个月前
25 鸿蒙LiteOS GPIO轮询模式实战教程:电平读取与上升沿检测
嵌入式·harmonyos·liteos·开源鸿蒙·瑞芯微·rk2206