全志linux开发 USB接口设置

USB Gadget接口配置

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

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

  • ACM(虚拟串口)
  • NCM(以太网网卡)
  • UAC1(音频设备)
  • ADBAndroid 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/m
CONFIG_USB_F_ACM=y/m
CONFIG_USB_U_SERIAL=y/m

ConfigFS 配置示例

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 性能更高)。

配置关键模块

CONFIG_USB_CONFIGFS_NCM=y/m
CONFIG_USB_F_NCM=y/m
CONFIG_USB_U_ETH=y/m

ConfigFS 配置示例

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 网口:

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”,可作为录音或播放通道。

配置关键模块

CONFIG_USB_CONFIGFS_F_UAC1=y/m
CONFIG_USB_F_UAC1=y/m

ConfigFS 配置示例

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 设备。

配置关键模块

CONFIG_USB_CONFIGFS_F_FS=y/m
CONFIG_USB_F_FS=y/m

ConfigFS 配置示例

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

/usr/bin/adbd &

PC 端执行:

adb devices

即可识别到设备。

特性

  • 通信层基于 FunctionFS,速度快、稳定。
  • 可同时与 ACMNCM 并存。
3.1.5、配置方式
  1. 打开kernel配置页面

    cd cd kernel/linux-4.9/
    make ARCH=arm64 menuconfig
    
  2. 修改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 driver for GSM and CDMA modems 
    
  3. 保存并退出

  4. 编译并打包

    ./build.sh kernel && ./build.sh pack
    
3.2、复合设备(Composite Gadget

Linux 4.9ConfigFS 支持多功能并存,只需在 同一 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、工作流程与启动顺序
  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 控制器):

    ls /sys/class/udc/
    echo musb-hdrc.1.auto > /sys/kernel/config/usb_gadget/g1/UDC
    

解绑时:

echo "" > /sys/kernel/config/usb_gadget/g1/UDC
3.4、主机侧识别情况
FunctionWindows 识别Linux 识别节点macOS 识别
ACMUSB Serial (COM x)/dev/ttyACM0/dev/tty.usbmodem
NCMUSB 以太网适配器usb0支持
UAC1USB Audio DeviceALSA: card X支持
ADBAndroid Composite ADB Interface/dev/bus/usb/...支持

性能与延迟参考

模块吞吐延迟(典型)备注
ACM1–3 MB/s< 1 ms控制台调试、AT 通信
NCM40–100 Mbps1–2 ms远程 SSH / ADB 复合
UAC144.1/48 kHz 16bit< 10 ms语音通道
ADB10–30 MB/s1–3 ms调试、文件传输
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值