2025-05-07
计算机网络
0

目录

引言

引言

最近调试大疆无人机,在进行二次发开时遇到一个Linux的新知识点————USB Gadget框架。网上搜索相关资料后总结出本篇博文。

USB Gadget 框架(USB Gadget Framework)是一个主要在 Linux 内核中使用的软件框架,它允许一个通常作为 USB 主机(Host)的设备(例如嵌入式 Linux 系统、单板计算机)模拟成一个 USB 从设备(Peripheral,也称 Gadget)。

简单来说,当你的 Linux 设备通过 USB 连接到另一台计算机(通常是 PC)时,USB Gadget 框架可以让你的 Linux 设备扮演各种 USB 设备的角色。

USB Gadget 框架的用途非常广泛,它使得嵌入式设备或计算机能够模拟标准 USB 设备类别:

  • 虚拟串口 (Serial Gadget / CDC ACM): 允许通过 USB 在主机和从设备之间建立一个串行通信通道,常用于调试或简单的数据传输。
  • 虚拟以太网适配器 (Ethernet Gadget / RNDIS, CDC Ethernet, EEM): 使得从设备可以通过 USB 与主机进行网络通信,就像连接了一个 USB 网卡一样。这对于文件传输、网络服务等非常有用。
  • 大容量存储设备 (Mass Storage Gadget): 可以让从设备的存储空间(如 SD 卡、内存的一部分)在主机上显示为一个 U 盘或移动硬盘,方便文件交换。
  • 人机接口设备 (HID Gadget): 模拟键盘、鼠标、游戏手柄等输入设备。
  • 音频设备 (Audio Gadget): 模拟麦克风或扬声器。
  • MTP/PTP 设备 (Media Transfer Protocol / Picture Transfer Protocol): 允许主机像访问数码相机或媒体播放器一样访问从设备上的媒体文件。

由此可以推断出安卓手机的USB网络共享的本质其实就是利用了USB Gadget框架,将USB接口模拟成一个虚拟网卡,实现电脑共享手机的网络。

那么USB Gadget框架解决了什么问题呢?

  1. 赋予嵌入式设备多样化的 USB 从设备能力: 许多嵌入式系统自身可能没有专门的硬件来实现特定的 USB 从设备功能(如网络适配器、存储设备等)。USB Gadget 框架通过软件模拟,使得这些设备能够灵活地扮演这些角色,而无需额外的硬件成本。
  2. 简化了 USB 从设备驱动的开发: 它提供了一套标准的 API 和结构,开发者可以专注于实现特定 USB 功能的逻辑(例如如何处理网络数据包或存储读写请求),而不用从头处理复杂的 USB 协议底层细节。
  3. 提高了配置的灵活性(尤其通过 ConfigFS): 早期的 Gadget 驱动配置可能需要在内核编译时确定,或者通过 sysfs 进行有限的运行时配置。引入 ConfigFS (Configuration Filesystem) 后,用户可以在运行时动态地创建、配置和启用不同的 USB Gadget 功能和组合,极大地增强了灵活性和易用性。例如,可以方便地修改 USB 设备的描述符(如 VID, PID, 序列号等)和所提供的功能。
  4. 促进了设备间的互操作性: 通过模拟标准的 USB 设备类别,可以确保与各种主流操作系统的 USB 主机驱动程序兼容。

在调试无人机的过程中,使用到了一种叫做BULK的端点,这里涉及到USB通信中的Endpoint (端点)————即描述设备内部与主机进行数据交换的具体通信信道或缓冲区的术语。 想象一下 USB 设备(如 U盘、打印机、扫描仪)和主机(如电脑)之间的通信。数据需要在两者之间流动。端点就是这些数据流动的特定“出入口”或“管道口”。USB 定义了四种主要的传输类型,每种类型对应不同特性的端点:

  1. Control Endpoints (控制端点): 用于设备配置、命令和状态查询。每个USB设备都必须有控制端点0。
  2. Interrupt Endpoints (中断端点): 用于传输少量、有及时性要求的数据,例如鼠标点击或键盘按键。数据传输有保证的延迟。
  3. Isochronous Endpoints (等时端点): 用于传输大量、连续的实时数据,如音频或视频流。它保证带宽,但如果发生错误,数据可能会丢失(不重传)。
  4. BULK Endpoints (批量端点): 用于传输大量数据,如向U盘写入文件或从扫描仪读取图像。

BULK 端点的主要特点就是面向大块数据传输,同时还有一个特性:单向性, 每个批量端点都是单向的。 BULK IN Endpoint: 数据从 USB 设备传输到主机。 BULK OUT Endpoint: 数据从主机传输到 USB 设备。 如果一个设备需要双向批量数据传输,它需要分别配置一个 BULK IN 端点和一个 BULK OUT 端点。

本文作者:James

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!