1. USB协议基础:USB总线拓扑结构、主机与设备角色、USB OTG与Gadget概念辨析
1.1 USB总线拓扑结构
USB(Universal Serial Bus)采用分层星型(Tiered Star)拓扑结构,由主机(Host)、集线器(Hub)和设备(Device)三级节点构成。整个拓扑以主机控制器(Host Controller)为根,通过根集线器(Root Hub)向下扩展,最多支持7层(Tier 7),包括主机在内。
关键约束:USB 2.0 规范规定最大层级深度为 7 层(Tier 1 ~ Tier 7),且任意两个设备之间的物理路径不能超过 5 米(使用标准线缆)。USB 3.x 放宽了部分限制,但拓扑层级仍受限于协议。
1.2 主机与设备角色
在标准USB协议中,主机(Host)与设备(Device)的角色是固定且非对称的:
| 角色 | 职责 | 典型硬件 | 协议控制权 |
|---|---|---|---|
| 主机(Host) | 调度总线事务、发起传输、管理枚举、提供电源 | PC、笔记本电脑、嵌入式主机板 | 完全控制(主控) |
| 设备(Device) | 响应主机请求、报告描述符、执行端点功能 | U盘、鼠标、键盘、摄像头 | 被动响应(从属) |
面试高频点:主机是唯一能发起事务(Transaction)的节点。设备永远不能主动向主机发送数据,只能等待主机发送IN令牌后,才能将数据上传。这是USB协议设计的核心原则。
1.3 USB OTG 与 Gadget 概念辨析
随着移动设备和嵌入式系统的普及,固定角色模式无法满足双角色切换的需求。为此,USB Implementers Forum(USB-IF)先后推出了USB OTG(On-The-Go)和USB Gadget两种解决方案。
1.3.1 USB OTG(On-The-Go)
USB OTG 是硬件规范,允许设备通过ID引脚(Mini/Micro USB的第4脚)或角色协商协议(HNP/SRP)动态切换主机/设备角色。OTG设备必须支持双角色(Dual-Role),即同一端口既可以作为Host,也可以作为Device。
- ID引脚机制:ID接地 → 设备默认为Host;ID悬空 → 设备默认为Device。
- SRP(Session Request Protocol):设备请求主机启动Vbus供电。
- HNP(Host Negotiation Protocol):Host与Device协商角色互换。
1.3.2 USB Gadget
USB Gadget 是软件框架,特指Linux内核中用于实现设备端(Device Side)功能的驱动子系统。Gadget框架允许嵌入式设备模拟成各种标准USB设备(如串口、网卡、存储设备、音频设备等),而无需改变硬件。
常见混淆点:OTG是硬件规范,Gadget是软件框架。一个支持OTG的硬件平台,必须配合Gadget驱动才能实现设备功能;反之,Gadget驱动也可以在纯设备模式的硬件上运行(如开发板的USB Device Only端口)。
1.4 面试核心考点对照表
| 考点 | 常见问题 | 关键回答要点 |
|---|---|---|
| 拓扑结构 | USB总线最多支持多少层? | 7层(Tier 1~7),主机为第1层 |
| 角色固定性 | 设备能否主动发送数据? | 不能,必须等待主机IN令牌 |
| OTG vs Gadget | OTG和Gadget是同一回事吗? | OTG是硬件规范,Gadget是软件框架 |
| HNP协议 | OTG如何实现角色互换? | 通过HNP协商,Host→Device或Device→Host |
| Gadget依赖 | Gadget驱动需要什么硬件支持? | 需要UDC(USB Device Controller)硬件单元 |
面试官提示:在嵌入式Linux面试中,面试官常会追问“如果硬件只有USB Device端口,没有OTG控制器,能否使用Gadget框架?”答案是肯定的——Gadget框架不依赖OTG硬件,只要SoC内部有UDC外设即可。OTG只是提供了角色切换的硬件能力。