首页 > 解决方案 > USB 音频小工具驱动程序:如何在主机设备上重命名/定义显示的 UAC1 设备名称

问题描述

我使用 USB 音频类 1 (UAC1) 创建了一个 USB 音频小工具,通过 USB 从 Linux 设备 (Raspberry Pi) 向/从 Windows 主机发送/接收音频。该小工具已经在工作,Windows 将 Raspberry Pi 检测为音频输入和输出。

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

我尝试使用uac1_legacyhttps://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

标签: audioraspberry-pidriverlinux-device-driverkernel-module

解决方案


你可以检查一下f_uac1.c。对我来说,您似乎无法动态更改预定义函数 f_uac 的 gstrings。

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

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

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

有关如何编写用户空间函数的文档:请参阅:linux/tools/usb/ffs-test.c. (剧透,那些测试文件不适用于我的所有端点。但作为示例,它是一个很好的来源。)

这是一项小工作,但值得。


推荐阅读