USB 有多个层,在USB 2.0 规范中进行了描述。如果你熟悉 OSI 分层网络模型,你可以这样想:
- 会话层 = 第 10 章 USB 主机硬件和软件(设备驱动程序)
- 传输层 = 第 9 章 USB 设备框架
- 网络层 = 第 8 章协议层(比特流)
- 数据链路层 = 第 7 章电气(电路)
- 物理层 = 第 6 章机械(电缆和连接器)
从概念上讲,USB 基于称为Endpoints的数据流,它可以是 IN(到主机)或 OUT(从主机)。每个设备都有端点 0,用于控制和状态。设备可能具有用于应用程序数据的附加端点。每个端点的行为就像一个 FIFO 缓冲区。
数据在端点上以Bulk(如 TCP/IP,保证每个字节以正确的顺序到达)或Isochronous(如 UDP/IP,保证新鲜但可能丢弃数据包)的形式在端点上传输。有一种误导性地命名为“中断”传输类型,它实际上只是由主机轮询。
USB 2.0 使用差分对进行数据链路。我不会详细介绍,因为 USB 2.0 规范第 7 章对此进行了介绍。通常在 PCB 布局中,我们将其视为长度匹配的差分对,并放入任何 USB PHY(物理接口)正在使用中。USB 外围设备在 D+ 或 D- 线之一上使用高阻值电阻来通知主机它是高速或低速外围设备。
USB 主机发现设备存在后不久,主机会从该设备请求一堆描述符。这是由 FTDI 芯片在幕后处理的。描述在第 9.5 章中描述。其中包括设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符,甚至可能是HID 报告描述符。
设备描述符包括USB VID(供应商标识)和PID(产品标识)编号。操作系统使用这对数字 VID_PID 来确定该设备应使用哪个设备驱动程序。请注意,VID 号码是由 USB 实施者论坛的成员颁发的,所以如果您是个人发明者,这会是一个问题。
此外,还有 HID(人机接口设备)类驱动程序,它为键盘/鼠标等提供某种通用输入,以及任何通用输入/输出。HID 的一个优点是它不需要提供自定义设备驱动程序,但与自定义批量驱动程序相比,它的吞吐量有所限制。关于 HID 描述符还有一个完整的其他规范文档;和HID 使用表 文档,其中详细说明了描述给定人机接口设备上可用的各种功能的所有代码编号。
FT220X 数据表等 FTDI 芯片提供 USB“串行接口引擎”(不要与 SPI 串行或 RS232 串行混淆)。这处理了第 6、7 和 8 章中描述的大部分低级内容。
FTDI 使用 EEPROM(在 FT2232H 上为片外,在 FT220X 上为片上)来包含一些进入描述符的信息。您可以自定义 VID/PID 值,并提供自定义描述字符串。