USB Gadget Engineering

Android USB Gadget:ConfigFS + FunctionFS 集成与通信

处理从 FunctionFS 挂载、ep0 描述符、ConfigFS Function 绑定、UDC 枚举到 Bulk IN / OUT 数据通信的完整链路。

USB GadgetConfigFSFunctionFSep0 / Endpointsys.usb.ffs.ready
Android USB Gadget ConfigFS FunctionFS 集成与通信流程图
点击图片查看完整流程图

USB Data Path

ConfigFS 与 FunctionFS 如何协同

图片把内核侧 ConfigFS 配置、用户态 FunctionFS 端点、USB 枚举、Bulk 数据通信和异常恢复放在同一条时间线上。

  • ep0 描述符与数据 Endpoint 创建
  • ConfigFS Function 绑定和 UDC 枚举
  • Daemon 数据收发与 Disconnect 恢复

Engineering Flow

ConfigFS + FunctionFS 生命周期

01

Daemon 启动

init.rc 启动协议 Daemon,加载配置并准备 FunctionFS。

  • 挂载 FunctionFS
  • 打开 /dev/usb-ffs/
  • 监控退出与重启
02

FunctionFS 准备

打开 ep0,写入 Descriptors 与 Strings,等待数据端点生成。

  • GET_DESCRIPTORS
  • ep1 / ep2 / ...
  • poll / epoll
03

ConfigFS 配置

设置 Gadget、VID/PID、strings、configuration,并绑定 ffs function。

  • /config/usb_gadget/g1
  • functions/ffs.
  • configs/c.1
04

UDC 绑定与枚举

选择 UDC 后主机执行 Reset、Descriptor、SET_CONFIGURATION 与 SET_INTERFACE。

  • Device Descriptor
  • Configuration Descriptor
  • Interface / Endpoint
05

数据通信

通过 ep0 控制传输与 Bulk IN / OUT 端点进行双向协议数据交换。

  • Device → Host
  • Host → Device
  • 非阻塞读写
06

异常恢复

处理 Disconnect、UNBIND、端点关闭、状态清理与重新枚举。

  • sys.usb.ffs.ready
  • 关闭 ep0 / epX
  • 自动重连
07

关闭流程

Daemon 退出时释放端点、移除 function、UDC unbind 并清理资源。

  • 避免残留状态
  • 支持 OTA / 重启
  • 可重复初始化

Architecture

用户空间与内核配置的协作关系

用户空间 FunctionFS
/dev/usb-ffs//ep0Descriptors / Stringsep1 / ep2Daemon read / write
内核 ConfigFS
/config/usb_gadget/g1functionsconfigsUDC
Android 控制
USB Gadget HALsys.usb.configsys.usb.statesys.usb.ffs.ready
主机侧
iPhone / AndroidUSB Host StackControl / Bulk Transfer
应用协议
iAP2 / EACarPlayAndroid Auto自定义 USB 协议

Common Failures

常见故障现象与定位方向

只有 ep0,没有数据端点

通常需要检查描述符是否已正确写入、格式是否匹配以及 FunctionFS 状态。

  • Descriptor write
  • Endpoint 数量与方向
  • Daemon 生命周期

Function 已配置但不枚举

检查 configs 链接、UDC 绑定、VID/PID、Configuration 和 Gadget HAL 状态。

  • ConfigFS symlink
  • UDC bind
  • sys.usb.state

BIND 后立即 UNBIND

结合 FunctionFS lifecycle、Daemon 退出、描述符错误和 USB HAL 时序分析。

  • BIND / ENABLE
  • UNBIND / DISABLE
  • logcat / dmesg

FAQ

常见问题与技术说明

围绕项目范围、技术边界、实施条件和交付内容进行说明。

为什么 FunctionFS 目录里只有 ep0?

ep0 是控制端点。数据端点通常在用户态向 ep0 写入有效的 FunctionFS 描述符后创建,需同时检查描述符、Daemon 状态与 ConfigFS 绑定。

ConfigFS 和 FunctionFS 有什么区别?

ConfigFS 用于内核侧 Gadget 与 Configuration 组合;FunctionFS 为用户态协议程序提供描述符、控制端点和数据端点接口。

可以用于 iAP2 和 Apple EA 吗?

可以。FunctionFS 可承载用户态 USB iAP2 / EA 协议服务,并与 Android Vendor Daemon、init.rc 和 SELinux 联动。