USB 音频小工具驱动程序:如何 rename/define 在主机设备上显示 UAC1 设备名称

USB Audio Gadget Driver: How to rename/define displayed UAC1 device name at host device

我使用 USB 音频 Class 1 (UAC1) 通过 USB 从 Linux 设备 (Raspberry Pi) send/receive 音频创建了一个 USB 音频小工具 to/from 一个 Windows 主机。该小工具已在运行,并且 Windows 将 Raspberry Pi 检测为音频输入和输出。

我遇到的问题是,音频输出设备称为“AC 接口”,输入音频设备称为“Windows 中的捕获输入终端(AC 接口)”。但是,我想定义一个自己的名称,该名称将显示在主机上。有人可以帮我怎么做吗?

我尝试使用 uac1_legacy (https://www.kernel.org/doc/Documentation/ABI/testing/configfs-usb-gadget-uac1_legacy) 更改名称,但无法将其添加到脚本中。

或者我是否必须使用小工具方案配置 USB 音频小工具?

# Load libcomposite
modprobe libcomposite

# Create USB Gadget 
mkdir -p /sys/kernel/config/usb_gadget/g1

# Device Descriptors
echo 0x1d6b > /sys/kernel/config/usb_gadget/g1/idVendor # Linux Foundation
echo 0x0104 > /sys/kernel/config/usb_gadget/g1/idProduct # Multifunction Composite Gadget
echo 0x0100 > /sys/kernel/config/usb_gadget/g1/bcdDevice # v1.0.0
echo 0x0200 > /sys/kernel/config/usb_gadget/g1/bcdUSB # USB 2.0
echo 0xef > /sys/kernel/config/usb_gadget/g1/bDeviceClass # USB 2.0
echo 0x02 > /sys/kernel/config/usb_gadget/g1/bDeviceSubClass # USB 2.0
echo 0x01 > /sys/kernel/config/usb_gadget/g1/bDeviceProtocol # USB 2.0
mkdir -p /sys/kernel/config/usb_gadget/g1/strings/0x409
echo "000001" > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
echo "xy" > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer
echo "xy" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product

# Configure UAC1 (audio) 
mkdir -p /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0
echo 0x1 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_chmask
echo 48000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_srate
echo 0xf > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_chmask
echo 48000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_srate
mkdir -p /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 250 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
ln -s /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0 /sys/kernel/config/usb_gadget/g1/configs/c.1/
udevadm settle -t 5 || :

# End
ls /sys/class/udc/ > /sys/kernel/config/usb_gadget/sonoDSP_audio/UDC

您可以检查f_uac1.c。对我来说,您似乎无法为预定义的功能动态更改 gstrings f_uac.

static struct usb_string strings_uac1[] = {
    [STR_AC_IF].s = "AC Interface",
    ...,
    [STR_IO_IN_IT].s = "Capture Input terminal",
    ...,
    { }
};

您可以做的是,使用您的自定义配置创建一个简单的 functionfs 用户 space 程序。有关 ffs 的更多详细信息,请参阅以下内容。

如何加载ffs? 参见:https://github.com/linkjumper/configfs/blob/master/setup_usb_gadget.sh

关于如何编写用户的文档space functionfs: 参见:linux/tools/usb/ffs-test.c。 (扰流板,这些测试文件对我来说并不适用于所有端点。但它是一个很好的例子。)

虽然有点辛苦,但值得。