文章目录
-
- 概述
- 一、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/
下一步学习:
- 02-协议基础01:USB发展背景与总线架构 - 从协议开始
- 13-Host驱动01:USB子系统初始化流程 - 从代码开始
- 64-附录C:usb-skeleton.c详解 - 从模板开始