USB Gadget接口配置
Linux 内核在设备端提供了 Gadget Framework,允许开发板虚拟成各种 USB 外设:串口、网卡、音频设备、U盘、摄像头等。
适用平台:Linux-4.9 及同架构的全志 SoC(T507 / H616 等)
ACM(虚拟串口)NCM(以太网网卡)UAC1(音频设备)ADB(Android Debug Bridge)
3.1、接口类型详解
核心结构
ini
usb_gadget/g1/
├── idVendor → 厂商 VID
├── idProduct → 产品 PID
├── strings/0x409/ → 设备字符串(序列号、制造商、产品名)
├── configs/c.1/ → 配置集合(可以有多个)
│ ├── strings/0x409/configuration
│ └── f1.acm → ../functions/acm.usb0
├── functions/ → 功能函数目录
│ ├── acm.usb0
│ ├── ncm.usb0
│ ├── uac1.gs0
│ └── ffs.adb
└── UDC → 绑定到实际 USB 控制器
3.1.1、ACM (Abstract Control Model --- 虚拟串口)
把 USB 设备虚拟为 CDC ACM 标准的串口,PC 端识别为 COM 口,Linux 端对应 /dev/ttyGS0。
配置关键模块
shell
CONFIG_USB_CONFIGFS_ACM=y/m
CONFIG_USB_F_ACM=y/m
CONFIG_USB_U_SERIAL=y/m
ConfigFS 配置示例
shell
mkdir -p /sys/kernel/config/usb_gadget/g1/functions/acm.usb0
ln -s /sys/kernel/config/usb_gadget/g1/functions/acm.usb0 /sys/kernel/config/usb_gadget/g1/configs/c.1/
使用
- 板端写:
echo hello > /dev/ttyGS0 PC端读:通过串口工具打开对应COM口。- 典型波特率
115200 ~ 921600均可,延迟< 1 ms。
3.1.2、NCM (Network Control Model --- 虚拟网卡)
功能
将开发板虚拟为 USB 网卡,实现主机与设备间的 IP 通信(类似 RNDIS,但 NCM 性能更高)。
配置关键模块
shell
CONFIG_USB_CONFIGFS_NCM=y/m
CONFIG_USB_F_NCM=y/m
CONFIG_USB_U_ETH=y/m
ConfigFS 配置示例
shell
mkdir -p /sys/kernel/config/usb_gadget/g1/functions/ncm.usb0
echo "02:12:34:56:78:9a" > /sys/kernel/config/usb_gadget/g1/functions/ncm.usb0/dev_addr
echo "06:12:34:56:78:9a" > /sys/kernel/config/usb_gadget/g1/functions/ncm.usb0/host_addr
ln -s /sys/kernel/config/usb_gadget/g1/functions/ncm.usb0 /sys/kernel/config/usb_gadget/g1/configs/c.1/
使用
设备端会生成 usb0 网口:
shell
ifconfig usb0 192.168.42.2 up
PC 端设置静态 IP 192.168.42.1,即可 ping 通,支持 SSH、SCP、HTTP 等通信。
优势
- 相比
RNDIS,NCM采用CDC规范,驱动跨平台(Windows 10+、Linux、macOS均支持)。 - 支持多
frame打包,提高带宽利用率。
3.1.3、UAC1 (USB Audio Class 1.0)
功能
让板卡虚拟成标准 USB 声卡,PC 端识别为 "USB Audio Device",可作为录音或播放通道。
配置关键模块
shell
CONFIG_USB_CONFIGFS_F_UAC1=y/m
CONFIG_USB_F_UAC1=y/m
ConfigFS 配置示例
shell
mkdir -p /sys/kernel/config/usb_gadget/g1/functions/uac1.gs0
# 可选参数
# echo 48000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.gs0/p_srate
# echo 2 > /sys/kernel/config/usb_gadget/g1/functions/uac1.gs0/p_chmask
ln -s /sys/kernel/config/usb_gadget/g1/functions/uac1.gs0 /sys/kernel/config/usb_gadget/g1/configs/c.1/
使用
- 在
aplay -l中会出现 "USB Audio Device"。 - 可用
ALSA接口读取或播放音频流。 - 常用于语音输入/输出、
AI语音网关、视频会议终端。
注意
- 声道和采样率受限于
USB带宽。 - 若需双向音频,可启用
p_*和c_*参数分别控制Playback/Capture。
3.1.4、ADB (Android Debug Bridge,基于 FunctionFS)
功能
通过 USB 实现主机 ADB 调试通道,用于 Android 或 基于 Android 系统的 Linux 设备。
配置关键模块
shell
CONFIG_USB_CONFIGFS_F_FS=y/m
CONFIG_USB_F_FS=y/m
ConfigFS 配置示例
shell
mkdir -p /dev/usb-ffs/adb
mount -t functionfs adb /dev/usb-ffs/adb
mkdir -p /sys/kernel/config/usb_gadget/g1/functions/ffs.adb
ln -s /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/c.1/
使用
板端启动 adbd:
shell
/usr/bin/adbd &
PC 端执行:
shell
adb devices
即可识别到设备。
特性
- 通信层基于
FunctionFS,速度快、稳定。 - 可同时与
ACM、NCM并存。
3.1.5、配置方式
-
打开
kernel配置页面shellcd cd kernel/linux-4.9/ make ARCH=arm64 menuconfig -
修改
usb虚拟串口相关配置路径:
Device Drivers → USB support → USB Gadget Supportshell<M> USB Gadget Drivers (Serial Gadget (with CDC ACM and CDC OBEX support)) --->路径:
Device Drivers → USB support → USB Serial Converter supportshell<M> USB driver for GSM and CDMA modems -
保存并退出
-
编译并打包
shell./build.sh kernel && ./build.sh pack
3.2、复合设备(Composite Gadget)
Linux 4.9 的 ConfigFS 支持多功能并存,只需在 同一 gadget 下创建多个 function 并链接到 同一个 config。
典型结构
shell
functions/
├── acm.usb0
├── ncm.usb0
├── uac1.gs0
└── ffs.adb
configs/c.1/
├── f1.acm -> ../functions/acm.usb0
├── f2.ncm -> ../functions/ncm.usb0
├── f3.uac1 -> ../functions/uac1.gs0
└── f4.adb -> ../functions/ffs.adb
内核通过
Composite Framework自动合并接口描述符,主机端会看到多接口复合设备。
3.3、工作流程与启动顺序
-
加载核心模块
modprobe libcomposite(加载ConfigFS支撑) -
挂载
configfsmount -t configfs none /sys/kernel/config -
创建
gadget目录/sys/kernel/config/usb_gadget/g1 -
设置
VID/PID、字符串信息写入
idVendor和idProduct;创建strings/0x409/。 -
创建
configs/c.1并设定MaxPower等参数。 -
创建所需
functions(acm/ncm/uac1/ffs.adb)。 -
符号链接 到
config。 -
绑定
UDC(USB控制器):shellls /sys/class/udc/ echo musb-hdrc.1.auto > /sys/kernel/config/usb_gadget/g1/UDC
解绑时:
shell
echo "" > /sys/kernel/config/usb_gadget/g1/UDC
3.4、主机侧识别情况
Function |
Windows 识别 |
Linux 识别节点 |
macOS 识别 |
|---|---|---|---|
ACM |
USB Serial (COM x) |
/dev/ttyACM0 |
/dev/tty.usbmodem |
NCM |
USB 以太网适配器 |
usb0 |
支持 |
UAC1 |
USB Audio Device |
ALSA: card X |
支持 |
ADB |
Android Composite ADB Interface |
/dev/bus/usb/... |
支持 |
性能与延迟参考
| 模块 | 吞吐 | 延迟(典型) | 备注 |
|---|---|---|---|
ACM |
1--3 MB/s |
< 1 ms | 控制台调试、AT 通信 |
NCM |
40--100 Mbps |
1--2 ms | 远程 SSH / ADB 复合 |
UAC1 |
44.1/48 kHz 16bit |
< 10 ms | 语音通道 |
ADB |
10--30 MB/s |
1--3 ms | 调试、文件传输 |