全志linux开发 USB接口设置

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、配置方式
  1. 打开kernel配置页面

    shell 复制代码
    cd cd kernel/linux-4.9/
    make ARCH=arm64 menuconfig
  2. 修改usb虚拟串口相关配置

    路径:Device Drivers → USB support → USB Gadget Support

    shell 复制代码
    <M>   USB Gadget Drivers (Serial Gadget (with CDC ACM and CDC OBEX support))  --->

    路径:Device Drivers → USB support → USB Serial Converter support

    shell 复制代码
    <M>   USB driver for GSM and CDMA modems 
  3. 保存并退出

  4. 编译并打包

    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、工作流程与启动顺序
  1. 加载核心模块

    modprobe libcomposite (加载 ConfigFS 支撑)

  2. 挂载 configfs

    mount -t configfs none /sys/kernel/config

  3. 创建 gadget 目录

    /sys/kernel/config/usb_gadget/g1

  4. 设置 VID/PID、字符串信息

    写入 idVendor 和 idProduct;创建 strings/0x409/。

  5. 创建 configs/c.1并设定 MaxPower 等参数。

  6. 创建所需 functions(acm/ncm/uac1/ffs.adb)。

  7. 符号链接 到 config。

  8. 绑定 UDC(USB 控制器):

    shell 复制代码
    ls /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 调试、文件传输
相关推荐
未济3 天前
linux 配置环境变量
linux
傲世仙尊3 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
_艾伦 耶格尔.3 天前
进程间通信
linux
Liuqy-053 天前
Linux IO编程——静态库、动态库
linux
女神下凡3 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
彧azz3 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
-梅3 天前
linux(8) 软硬链接
linux·运维·服务器
AIgorithmGEEK3 天前
[Linux]线程三部曲(上):一个执行流的诞生——从操作系统一路拆到 pthread_create
linux·线程·pid
琥珀色糖3 天前
SimlpeHttp
linux·服务器
qeen873 天前
【Linux】操作系统之进程介绍(二)
linux·笔记·学习·进程