目录
目录
前言
DTS配置的参考
内核配置的参考
USB Subsystem内核配置
USB Phy内核配置
USB Host Core驱动内核配置
USB EHCI驱动内核配置
芯片平台USB Host Controller驱动内核配置
ALSA相关内核配置
验证测试的参考
总结
前言
USB外置声卡一般是基于USB音频类(UAC)标准的设备,通过USB接口连接计算机,实现音频的输入输出功能。
- UAC标准是核心基础
UAC是USB规范中的音频类标准,定义了音频设备与主机的通信方式,包括设备枚举、音频数据传输和控制功能,支持即插即用并在Windows、macOS、Linux等系统上广泛兼容。该标准分为UAC1.0和UAC2.0等版本,其中UAC2.0支持更高采样率(如192kHz/24bit)和更高效的数据传输。
- 工作原理与关键特性
USB声卡通过UAC协议使用USB控制传输设置参数、批量传输传输音频数据,并利用中断传输传递状态信息。其关键特性包括:
- 高兼容性:无需额外驱动即可在多种操作系统上运行。
- 灵活的音频格式支持:可配置采样率、位深度和通道数,例如支持双声道16bit/48kHz或更高规格。
- 低延迟与高保真
部分设备信噪比达85dB,适合专业录音和播放。
- 常见应用场景
USB声卡广泛应用于音乐制作、语音采集、游戏、家庭影院和音视频会议等场景。
USB声卡是外置声卡,即外挂USB设备作为声卡,我们调试过程中可以将主控的对应的USB接口配置成HOST模式,此时需要打开Linux ALSA驱动中的USB声卡驱动配置。
DTS配置的参考
/* usb20 host controller */ usb_1: usb1@YYYYYYYY { compatible = "xxx,xxx-usb"; reg = <0xYYYYYYYY 0xYYY>; interrupts = <GIC_SPI INT_USB20_HOST IRQ_TYPE_LEVEL_HIGH>; clocks = <&ahbX_gate 9>, <&ahbX_reset 9>; clock-names = "usb_gate", "usb_reset"; xxx,usbphy = <&usbphy_1>; dr_mode = "host"; /* 配置成了USB host模式 */ ...内核配置的参考
USB Subsystem内核配置
CONFIG_USB_SUPPORT=y CONFIG_USB_ARCH_HAS_HCD=yUSB Phy内核配置
CONFIG_USB_PHY=y CONFIG_USB_NX_PHY=yUSB Host Core驱动内核配置
CONFIG_USB_COMMON=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y CONFIG_USB_DEFAULT_PERSIST=yUSB EHCI驱动内核配置
CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ROOT_HUB_TT=y CONFIG_USB_EHCI_TT_NEWSCHED=y CONFIG_USB_EHCI_HCD_PLATFORM=y芯片平台USB Host Controller驱动内核配置
CONFIG_USB_XXX=y CONFIG_USB_XXX_HOST=y CONFIG_USB_XXX_DEBUG=yALSA相关内核配置
CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y验证测试的参考
1. 烧录固件后,正常开机,接入USB声卡,命令行终端可以输入:dmesg | grep "usb",探测到该USB接口的声卡的打印如下:
# dmesg | grep "usb" ... [ 0.986351] usbcore: registered new interface driver snd-usb-audio [ 0.993497] usb 1-1.1: new full-speed USB device number 3 using lb_hdc [ 1.150058] usb 1-1.1: New USB device found, idVendor=1b3f, idProduct=2008, bcdDevice= 1.00 [ 1.150068] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 1.150074] usb 1-1.1: Product: USB Audio Device [ 1.150080] usb 1-1.1: Manufacturer: GeneralPlus [ 1.177847] input: GeneralPlus USB Audio Device as /devices/platform/xxxxxxxx.usb1/xxx_hdc.1/usb1/1-1/1-1.1/1-1.1:1.3/0003:1B3F:2008.0001/input/input5 [ 1.177999] hid-generic 0003:1B3F:2008.0001: input: USB HID v2.01 Device [GeneralPlus USB Audio Device] on usb-xxx_hdc.1-1.1/input3 ...2. 列出USB设备列表,查看USB声卡的USB设备信息是否存在。例如:
# lsusb Bus 001 Device 001: ID 1d6b:0002 Bus 001 Device 004: ID 0bda:c820 Bus 001 Device 002: ID 05e3:0608 Bus 001 Device 003: ID 1b3f:2008 (这里USB声卡的VID是1b3f,PID是2008。)3. 查看音频设备信息。例如:
# cat /proc/asound/cards 0 [xxxcard ]: xxx_card - xxx_card (主控内置的音频编解码器设备) xxx_card 1 [Device ]: USB-Audio - USB Audio Device (外置的USB声卡设备) GeneralPlus USB Audio Device at usb-xxx_hdc.1-1.2, full speed # arecord -l **** List of CAPTURE Hardware Devices **** card 0: xxxcard [xxx_card], device 0: audio xxx_ac_dai-0 [] (主控内置的音频编解码器设备) Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: Device [USB Audio Device], device 0: USB Audio [USB Audio] (外置的USB声卡设备) Subdevices: 1/1 Subdevice #0: subdevice #0 # aplay -l **** List of PLAYBACK Hardware Devices **** card 0: xxxcard [xxx_card], device 0: audio xxx_ac_dai-0 [](主控内置的音频编解码器设备) Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: Device [USB Audio Device], device 0: USB Audio [USB Audio] (外置的USB声卡设备) Subdevices: 1/1 Subdevice #0: subdevice #0 # cat /proc/asound/card1/usbbus 001/003 # cat /proc/asound/card1/usbid 1b3f:20084. 录制音频测试。例如,录制USB声卡20秒声音:
# arecord -D "plughw:1,0" -f S16_LE -r 48000 -c 2 -d 20 -t wav /mnt/card/test.wav Recording WAVE '/mnt/card/test.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono其中:
- -D用于选择设备名称,这里使用外置USB声卡(plughw:1,0);
- -f用于指定录音格式,S16_LE代表有符号16位小端序;
- -r用于指定采样率,48000表示48KHz采样;
- -c用于指定声道数,2表示双声道;
- -d用于指定录音的时长,单位为秒。如果未指定此参数,录音将默认持续进行,直到用户手动中断(例如通过按 Ctrl+C);
- -t用于指定录音文件格式,wav表示wav格式;
- /mnt/card/test.wav表示指定保存的文件路径或文件名。
5. 播放音频测试。例如,播放20秒声音:
# aplay -v /mnt/card/test.wav Playing WAVE '/mnt/card/test.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo Plug PCM: Direct Stream Mixing PCM Its setup is: stream : PLAYBACK access : RW_INTERLEAVED format : S16_LE subformat : STD channels : 2 rate : 48000 exact rate : 48000 (48000/1) msbits : 16 buffer_size : 7680 period_size : 1920 period_time : 40000 tstamp_mode : NONE tstamp_type : MONOTONIC period_step : 1 avail_min : 1920 period_event : 0 start_threshold : 7680 stop_threshold : 7680 silence_threshold: 0 silence_size : 0 boundary : 2013265920 Hardware PCM card 1 'AB13X USB Audio' device 0 subdevice 0 Its setup is: stream : PLAYBACK access : MMAP_INTERLEAVED format : S16_LE subformat : STD channels : 2 rate : 48000 exact rate : 48000 (48000/1) msbits : 16 buffer_size : 7680 period_size : 1920 period_time : 40000 tstamp_mode : ENABLE tstamp_type : MONOTONIC period_step : 1 avail_min : 1920 period_event : 0 start_threshold : 1 stop_threshold : 2013265920 silence_threshold: 0 silence_size : 2013265920 boundary : 2013265920 appl_ptr : 0 hw_ptr : 06. 验证USB声卡的录制和播放音频正常后,修改asound.conf的配置。例如:
pcm.!dmix { # 叹号(!)表明这个dmix配置会覆盖ALSA的默认dmix配置。 type dmix # dmix混音输出,实现多个音频流的混合输出的一个pcm插件。 ipc_key 5678293 # 必须为整数形式的唯一ipc_key。 ipc_key_add_uid yes # UID值将添加到ipc_key设置中,可避免同一IPC密钥与不同用户同时发生冲突。 slave { # slave是该dmix输出的PCM设备。 pcm "hw:1,0" # 这里配置为声卡1的0号设备。 period_time 40000 buffer_time 160000 format S16_LE rate 48000 # 当前采样率,这里配置为48KHz。 channels 2 # 当前通道数,这里配置为双通道。 } } pcm.!dsnoop { # 叹号(!)表明这个dsnoop配置会覆盖ALSA的默认dsnoop配置。 type dsnoop # dsnoop录音分流,实现输入音频流的分流。 ipc_key 5778293 # 必须为整数形式的唯一ipc_key。 ipc_key_add_uid yes # UID值将添加到ipc_key设置中,可避免同一IPC密钥与不同用户同时发生冲突。 slave { # slave是该dsnoop输出的PCM设备。 pcm "hw:1,0" # 这里配置为声卡1的0号设备。 period_time 40000 buffer_time 160000 format S16_LE rate 48000 # 当前采样率,这里配置为48KHz。 channels 2 # 当前通道数,这里配置为双通道。 } } pcm.asymed { type asym # asym插件能同时支持播放和录音。 playback.pcm "dmix" capture.pcm "dsnoop" } pcm.!default { # 叹号(!)表明把ALSA的默认PCM设备设置为"asymed", # 这样应用程序通过ALSA接口打开默认PCM设备时,使用的就是"asymed"设备。 type plug slave.pcm "asymed" # 指明默认的PCM设备为"asymed"。 } ...7. 修改audio.json的配置。例如:
{ "card1" : { "playback" : { /* 音频播放 */ "card" : 1, /* 配置为声卡1 */ "device" : 0, /* 配置为0号设备 */ "rate" : 48000, /* 当前采样率,这里配置为48KHz。 */ "format" : 16, /* 这里配置位宽为16bit */ "channels" : 2, /* 这里配置为双通道 */ "period_time" : 32, "period_count" : 2 }, "capture" : { /* 音频录制 */ "card" : 1, /* 配置为声卡1 */ "device" : 0, /* 配置为0号设备 */ "rate" : 48000, /* 当前采样率,这里配置为48KHz。 */ "format" : 16, /* 这里配置位宽为16bit */ "channels" : 2, /* 这里配置为双通道 */ "period_time" : 32, "period_count" : 2 }, ... } }8. 修改完配置后,重新编译root并烧录固件后,正常开机,接入USB声卡,可进行音视频录制和播放,查看效果是否可以达到项目需求。
总结
USB声卡大部分是通过UAC协议通信的,这是USB音频设备的通用标准。简单来说,UAC(USB Audio Class)是USB规范中专门为音频设备定义的一套通信协议,它确保了不同厂商的USB声卡能在各种操作系统(如Windows、macOS、Linux)下正常工作。无论是USB麦克风、USB声卡还是其他音频设备,只要通过USB接口与电脑连接,底层的大部分是基于UAC协议进行音频数据的传输和控制。UAC协议还分为多个版本,比如UAC1.0、UAC2.0和UAC3.0,虽然不同版本支持的功能和性能有所差异,但核心通信机制是一致的。所以,无论我们用的是哪种USB声卡,背后都是UAC协议在发挥作用。