Ubuntu 16.04.3下如何为XMOS USB声卡指定相同驱动?
我来帮你搞定这个问题——在Ubuntu 16.04.3(内核4.4.0-113)上,两款XMOS声卡驱动表现差异的核心原因是:Linux内核靠**USB厂商ID(VID)和产品ID(PID)**匹配驱动,那款性能拉胯的声卡,它的VID/PID没被默认的XMOS高性能驱动配置识别,所以加载了通用的低性能驱动。下面是一步步的解决步骤:
1. 先拿到两款声卡的VID/PID
打开终端,运行lsusb命令,找到两款声卡的条目:
lsusb
输出里会有类似这样的行:
Bus 002 Device 003: ID 1234:5678 XMOS Ltd. XXXX Audio Device
把两款声卡的VID:PID(冒号前后的十六进制数字)记下来,比如:
- 正常工作的声卡:
1234:5678 - 驱动不佳的声卡:
AAAA:BBBB
2. 确认驱动是否识别这款“不听话”的声卡
接下来看看默认的snd-usb-audio驱动(XMOS设备通常用这个)是否包含那款问题声卡的ID:
modinfo snd-usb-audio | grep -E 'alias:.*usb:v[0-9A-F]+p[0-9A-F]+'
如果输出里找不到vAAAApBBBB(格式是v[VID]p[PID],不带前缀0x),说明驱动确实没把它当XMOS设备对待。
3. 强制让问题声卡用上高性能驱动
我们可以通过两种方式给内核“提个醒”,让它给这款声卡加载正确的驱动配置:
方法1:用modprobe配置文件(推荐)
这个方法直接给驱动模块加参数,让它识别新的设备ID:
- 打开终端,创建并编辑配置文件:
sudo nano /etc/modprobe.d/xmos-audio.conf
- 把下面的内容粘进去,记得替换成你刚才记下的问题声卡的VID和PID(前面要加
0x):
# 给问题XMOS声卡添加驱动支持 options snd-usb-audio vid=0xAAAA pid=0xBBBB device_setup=1 # 启用DSD和异步模式支持(和正常声卡一致) options snd-usb-audio enable=1 quirks=0x80
小提示:
device_setup=1是XMOS设备初始化的常用参数,quirks=0x80是开启高性能模式的关键。你也可以查看正常声卡的驱动参数做参考——运行cat /proc/asound/cardX/stream0(把X换成正常声卡的编号,从aplay -l里找),就能看到它用的参数。
- 保存退出:按
Ctrl+O,回车确认,再按Ctrl+X。
方法2:用udev规则(备选)
如果modprobe配置没生效,就用udev规则来指定设备的驱动:
- 创建udev规则文件:
sudo nano /etc/udev/rules.d/99-xmos-audio.rules
- 粘贴内容,替换成你的VID/PID(这里不用加
0x):
SUBSYSTEM=="sound", ATTRS{idVendor}=="AAAA", ATTRS{idProduct}=="BBBB", RUN+="/sbin/modprobe snd-usb-audio vid=0xAAAA pid=0xBBBB device_setup=1"
- 重新加载udev规则:
sudo udevadm control --reload-rules sudo udevadm trigger
4. 验证配置是否生效
现在重启驱动看看效果:
- 先卸载当前的
snd-usb-audio:
sudo rmmod snd-usb-audio
- 重新加载驱动:
sudo modprobe snd-usb-audio
- 运行
aplay -l或者cat /proc/asound/cards,检查两款声卡是不是都被识别成XMOS设备了。 - 试试播放DSD文件,看看那款问题声卡的性能有没有跟上正常的那款。
额外提醒
- 如果你的正常声卡用的是XMOS专用驱动(不是通用的
snd-usb-audio),那你得找到专用驱动的配置文件,把问题声卡的VID/PID加进去。 - Ubuntu 16.04的内核确实比较老,如果上面的方法都不管用,可以考虑升级内核到4.15或者更高版本——新版本的
snd-usb-audio可能已经包含了你那款问题声卡的ID,不用手动配置。
内容的提问来源于stack exchange,提问作者JLC

