全志linux开发 USB接口设置

USB Gadget接口配置

Linux 内核在设备端提供了 Gadget Framework,允许开发板虚拟成各种 USB 外设:串口、网卡、音频设备、U盘、摄像头等。

​ 适用平台:Linux-4.9 及同架构的全志 SoCT507 / H616 等)

  • ACM(虚拟串口)
  • NCM(以太网网卡)
  • UAC1(音频设备)
  • ADBAndroid 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、NCMNetwork 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 通,支持 SSHSCPHTTP 等通信。

优势

  • 相比 RNDISNCM 采用 CDC 规范,驱动跨平台(Windows 10+LinuxmacOS 均支持)。
  • 支持多 frame 打包,提高带宽利用率。
3.1.3、UAC1USB 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、ADBAndroid 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,速度快、稳定。
  • 可同时与 ACMNCM 并存。
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.9ConfigFS 支持多功能并存,只需在 同一 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、字符串信息

    写入 idVendoridProduct;创建 strings/0x409/

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

  6. 创建所需 functionsacm/ncm/uac1/ffs.adb)。

  7. 符号链接 到 config

  8. 绑定 UDCUSB 控制器):

    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 调试、文件传输
相关推荐
江华森1 小时前
Linux 系统实战完全指南
linux·运维·服务器
Safeploy安策数据1 小时前
政务云加密太慢?万兆服务器密码机如何破解高并发性能瓶颈
linux·运维·github
阿泽·黑核1 小时前
06 keyflow 多平台移植指南:STM32/51/ESP32/Linux
linux·stm32·嵌入式硬件
开开心心_Every1 小时前
近200个工具的电脑故障修复合集
linux·运维·服务器·leetcode·智能手机·电脑·模拟退火算法
NGINX开源社区1 小时前
NGINX Gateway Fabric 支持 Gateway API Inference Extension
linux·服务器·网络
不会C语言的男孩1 小时前
Linux 系统编程 · 第 9 章:进程创建
linux·c语言·开发语言
babytiger1 小时前
银河麒麟v11,apt 安装不好用了,要打开维护模式
linux·运维·服务器
Android小码家1 小时前
andoird13 + bazel 编译 Linux kernel
linux·运维·服务器
码农爱学习1 小时前
Linux进程内存监测与内存泄漏示例
linux