如何解决ARM Linux系统UAC缺失/dev/snd/pcmC0D0c录音设备问题
解决USB Gadget UAC缺失录音设备问题
问题概述
在Linux 4.9.37内核中已配置UVC、UAC及USB声卡相关组件,通过configfs脚本配置USB Gadget并加载ARM设备驱动后,UVC设备工作正常,但UAC仅生成播放设备/dev/snd/pcmC0D0p和控制设备/dev/snd/controlC0,缺少录音设备/dev/snd/pcmC0D0c。
核心原因
现有脚本仅对UAC1功能设置了录音通道掩码为0x00(即禁用录音通道),且未配置录音相关的采样率、位深等必要参数,导致内核未创建录音PCM设备。
解决方案
1. 修改configfs配置脚本
调整脚本中UAC1功能的配置部分,开启录音通道并设置匹配的音频参数:
原脚本中UAC1配置段:
mkdir functions/uac1.usb0 echo "0x00" > functions/uac1.usb0/c_chmask
替换为以下配置(根据硬件支持调整参数):
mkdir functions/uac1.usb0 # 配置播放通道掩码:0x03表示立体声(左+右声道) echo "0x03" > functions/uac1.usb0/p_chmask # 配置录音通道掩码:0x01表示单声道(左声道),0x03表示立体声 echo "0x01" > functions/uac1.usb0/c_chmask # 设置播放采样率范围(示例为44100Hz) echo "44100" > functions/uac1.usb0/p_srate_min echo "44100" > functions/uac1.usb0/p_srate_max # 设置录音采样率范围(需与硬件支持匹配) echo "44100" > functions/uac1.usb0/c_srate_min echo "44100" > functions/uac1.usb0/c_srate_max # 设置播放音频位深(示例为16位PCM) echo "16" > functions/uac1.usb0/p_bits # 设置录音音频位深(需与硬件支持匹配) echo "16" > functions/uac1.usb0/c_bits
参数说明:
p_chmask:播放通道掩码,二进制位对应声道,0x01=左声道,0x02=右声道,0x03=立体声c_chmask:录音通道掩码,取值规则同播放通道p_srate_min/max:播放支持的最小/最大采样率c_srate_min/max:录音支持的最小/最大采样率p_bits/c_bits:播放/录音的音频位深(通常为16位)
2. 重新加载Gadget
如果当前Gadget已加载,先卸载现有配置:
# 进入Gadget目录 cd /sys/kernel/config/usb_gadget/camera # 断开UDC链接 echo "" > UDC # 移除功能链接和目录 rm configs/c.1/functions/uac1.usb0 rm configs/c.1/functions/uvc.usb0 rmdir functions/uac1.usb0 # 可选择删除整个Gadget目录重新创建 cd .. rmdir camera
执行修改后的脚本重新配置并加载Gadget。
3. 验证结果
执行以下命令检查录音设备是否生成:
# 查看录音设备 arecord -l # 查看/dev/snd目录下的设备 ls /dev/snd/
若配置正确,应能看到pcmC0D0c录音设备,且arecord -l输出中包含对应的录音PCM设备。
内核配置确认
现有内核配置已包含必要的UAC组件,无需额外添加:
CONFIG_USB_F_UAC1=yCONFIG_USB_CONFIGFS_F_UAC1=yCONFIG_USB_U_AUDIO=yCONFIG_SND_USB_AUDIO=y
内容的提问来源于stack exchange,提问作者Ken.Zhang
相关产品推荐
相关产品推荐

