news 2026/1/12 18:37:11

Linux USB HOST EXTERNAL SOUNDCARD

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux USB HOST EXTERNAL SOUNDCARD

目录

目录

前言

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控制传输设置参数、批量传输传输音频数据,并利用中断传输传递状态信息。‌其关键特性包括:

  1. ‌高兼容性‌:无需额外驱动即可在多种操作系统上运行。‌
  2. ‌灵活的音频格式支持‌:可配置采样率、位深度和通道数,例如支持双声道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=y

USB Phy内核配置

CONFIG_USB_PHY=y CONFIG_USB_NX_PHY=y

USB Host Core驱动内核配置

CONFIG_USB_COMMON=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y CONFIG_USB_DEFAULT_PERSIST=y

USB 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=y

ALSA相关内核配置

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:2008

4. 录制音频测试。例如,录制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 : 0

6. 验证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协议在发挥作用。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/25 3:20:43

ModbusRTU入门实战:使用STM32实现从站通信

手把手教你用STM32实现ModbusRTU从站通信工业现场的设备五花八门&#xff0c;PLC、变频器、温控表……它们怎么“对话”&#xff1f;答案往往是&#xff1a;ModbusRTU。这个诞生于上世纪80年代的协议&#xff0c;至今仍在无数产线上默默工作。它不炫技&#xff0c;但足够可靠、…

作者头像 李华
网站建设 2026/1/11 8:49:24

Agentic AI实践指南|秘籍七:Agent可观测性评估

本系列文章基于在多个项目中积累的Agent应用构建经验&#xff0c;分享Agentic AI基础设施实践经验内容&#xff0c;帮助您全面深入地掌握Agent构建的基本环节。上篇文章系统介绍了Agent质量评估相关内容。本篇文章将探讨Agent可观测性的核心要素、实现方式和最佳实践&#xff0…

作者头像 李华
网站建设 2026/1/11 3:30:34

16、Git 高级操作:改写提交历史

Git 高级操作:改写提交历史 1. 重置操作 在某些情况下,直接提交可能会使提交图变得混乱,此时应确定正确的状态并进行重置。以下是两种重置方式: - 硬重置 :使用 git reset --hard 命令,它会将当前分支的 HEAD 引用、索引和工作目录都重置到指定的提交。例如: $…

作者头像 李华
网站建设 2025/12/25 3:11:09

STM32 JLink烧录时序与流程深度剖析

深入理解STM32的JLink烧录机制&#xff1a;从物理连接到Flash写入的全过程解析在嵌入式开发中&#xff0c;固件烧录是产品调试、量产和维护的关键一步。尽管大多数工程师已经习惯使用Keil或STM32CubeProgrammer点击“Download”完成程序下载&#xff0c;但当遇到“无法连接目标…

作者头像 李华
网站建设 2025/12/25 3:10:48

25、Git 补丁与钩子深度解析

Git 补丁与钩子深度解析 1. Git 补丁相关内容 1.1 补丁作者和提交者信息 在 Git 中,补丁的作者和作者日期是根据原始提交和补丁来确定的,而提交者的数据则反映了应用补丁并将其提交到当前分支和仓库的操作。 1.2 糟糕补丁的问题 在全球多个分布式仓库中创建健壮且相同的…

作者头像 李华