USB Gadget接口配置
Linux内核在设备端提供了Gadget Framework,允许开发板虚拟成各种USB外设:串口、网卡、音频设备、U盘、摄像头等。
适用平台:Linux-4.9及同架构的全志SoC(T507/H616等)
ACM(虚拟串口)NCM(以太网网卡)UAC1(音频设备)ADB(Android Debug Bridge)
3.1、接口类型详解
核心结构
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。
配置关键模块
CONFIG_USB_CONFIGFS_ACM=y/mCONFIG_USB_F_ACM=y/mCONFIG_USB_U_SERIAL=y/mConfigFS配置示例
mkdir-p/sys/kernel/config/usb_gadget/g1/functions/acm.usb0ln-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性能更高)。
配置关键模块
CONFIG_USB_CONFIGFS_NCM=y/mCONFIG_USB_F_NCM=y/mCONFIG_USB_U_ETH=y/mConfigFS配置示例
mkdir-p/sys/kernel/config/usb_gadget/g1/functions/ncm.usb0echo"02:12:34:56:78:9a">/sys/kernel/config/usb_gadget/g1/functions/ncm.usb0/dev_addrecho"06:12:34:56:78:9a">/sys/kernel/config/usb_gadget/g1/functions/ncm.usb0/host_addrln-s/sys/kernel/config/usb_gadget/g1/functions/ncm.usb0 /sys/kernel/config/usb_gadget/g1/configs/c.1/使用
设备端会生成usb0网口:
ifconfigusb0192.168.42.2 upPC端设置静态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”,可作为录音或播放通道。
配置关键模块
CONFIG_USB_CONFIGFS_F_UAC1=y/mCONFIG_USB_F_UAC1=y/mConfigFS配置示例
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_chmaskln-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设备。
配置关键模块
CONFIG_USB_CONFIGFS_F_FS=y/mCONFIG_USB_F_FS=y/mConfigFS配置示例
mkdir-p/dev/usb-ffs/adbmount-tfunctionfs adb /dev/usb-ffs/adbmkdir-p/sys/kernel/config/usb_gadget/g1/functions/ffs.adbln-s/sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/c.1/使用
板端启动adbd:
/usr/bin/adbd&PC端执行:
adb devices即可识别到设备。
特性
- 通信层基于
FunctionFS,速度快、稳定。 - 可同时与
ACM、NCM并存。
3.1.5、配置方式
打开
kernel配置页面cdcdkernel/linux-4.9/makeARCH=arm64 menuconfig修改
usb虚拟串口相关配置路径:
Device Drivers → USB support → USB Gadget Support<M>USB Gadget Drivers(Serial Gadget(with CDC ACM and CDC OBEX support))--->路径:
Device Drivers → USB support → USB Serial Converter support<M>USB driverforGSM and CDMA modems保存并退出
编译并打包
./build.sh kernel&&./build.sh pack
3.2、复合设备(Composite Gadget)
Linux 4.9的ConfigFS支持多功能并存,只需在 同一gadget下创建多个function并链接到 同一个config。
典型结构
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控制器):ls/sys/class/udc/echomusb-hdrc.1.auto>/sys/kernel/config/usb_gadget/g1/UDC
解绑时:
echo"">/sys/kernel/config/usb_gadget/g1/UDC3.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 | 调试、文件传输 |