audio - USB 音频小工具驱动程序:如何在主机设备上重命名/定义显示的 UAC1 设备名称
问题描述
我使用 USB 音频类 1 (UAC1) 创建了一个 USB 音频小工具,通过 USB 从 Linux 设备 (Raspberry Pi) 向/从 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
。对我来说,您似乎无法动态更改预定义函数 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
. (剧透,那些测试文件不适用于我的所有端点。但作为示例,它是一个很好的来源。)
这是一项小工作,但值得。
推荐阅读
- c++ - constexpr 和 mutable 成员和隐式 copy-ctor
- c# - 我可以使用 Xamarin 应用程序监控 Android 设备上所有打开的应用程序吗?
- julia - 位于 Julia 中的 REQUIRE 文件在哪里?
- entity-framework - 实体框架插入具有来自另一个表的标识的表
- c - WASD movement with ncurses (Not sure why it doesnt work)
- javascript - puppeteer 无法使用我的 javascript 代码
- bash - BASH Shell 变量插值 - 无需 eval 或创建新变量
- mysql - WSO2-Api Manager 数据库 MySQL
- javascript - 如何一个接一个地为多个 HTML5 画布对象设置动画?
- ios - 当应用程序在 iOS 中运行时,是否在关闭后台通知的情况下收到静默通知?