1. 从零开始:认识你的USB声卡项目
最近有个朋友找我,说他们公司接了个项目,要在Linux板子上做个USB声卡,插到安卓手机或者电脑上就能被识别成一个外置的音频设备,既能录音也能放音。他一开始觉得这玩意儿应该挺简单,不就是个USB设备嘛,结果一头扎进去才发现,里面全是坑。什么UAC驱动、配置脚本、采样率、端点描述符……一堆名词砸过来,直接懵了。这其实也是很多刚接触嵌入式音频开发的工程师会遇到的情况。所以,我想结合自己这些年踩过的坑,写一份给新手的、能真正跑起来的Linux UAC USB声卡开发指南。
首先,我们得搞清楚几个核心概念。你做的这个“USB声卡”,在USB的世界里,它属于一个特定的“班级”,叫做USB Audio Class,简称UAC。你可以把USB协议想象成一个大学,里面有计算机系(Mass Storage Class,大容量存储)、通信系(CDC Class)等等,而UAC就是专门负责音频的那个系。这个系有自己的规矩,比如怎么传输声音数据(是打包成一帧一帧送,还是流式传输)、怎么控制音量、采样率是多少等等。主机(比如你的电脑或手机)通过读取设备“自我介绍”的文档(也就是各种描述符),就知道:“哦,原来你是个UAC设备,那我用对应的‘系规’(驱动程序)来跟你打交道就行了。”
那为什么Linux平台做这个特别有意思呢?因为Linux给了我们极大的灵活性。我们不是在做一个需要独立芯片、独立电路的硬件声卡,而是利用Linux系统强大的USB Gadget功能,让我们的开发板(比如树莓派、RK3308、i.MX系列等)自己“变身”成一个USB从设备。简单说,就是通过软件配置,让板子上的USB接口对外宣称:“嗨,我是一个USB声卡!” 这样一来,你只需要一块开发板,加上正确的软件配置,就能实现一个功能完整的音频设备,成本低,灵活性高,特别适合产品原型开发或者特定音频应用。
2. 开发环境搭建与内核配置
工欲善其事,必先利其器。在开始敲代码和配置之前,你得先把“厨房”收拾好。这里说的厨房,就是你的Linux开发环境。
2.1 内核与工具链准备
第一步,确保你手头的Linux内核版本支持USB Gadget框架,并且包含了UAC驱动。现在主流的嵌入式Linux内核(4.4以上,尤其是5.x版本)通常都默认支持,但最好确认一下。我习惯用自己编译的内核,这样心里有底。你需要准备对应你开发板架构的交叉编译工具链,比如ARM平台的arm-linux-gnueabihf-gcc。编译内核时,有几个关键配置项必须打开,它们通常藏在 Device Drivers -> USB support -> USB Gadget Support 这个菜单下面。
我一般会直接修改内核的默认配置文件(比如 defconfig),确保下面这些选项是 =y(编译进内核)或者 =m(编译为模块):
CONFIG_USB_CONFIGFS=y
CONFIG_USB_CONFIGFS_F_UAC1=y # 支持UAC 1.0
CONFIG_USB_CONFIGFS_F_UAC2=y # 支持UAC 2.0 (如果硬件支持高速USB,推荐)
CONFIG_USB_LIBCOMPOSITE=y
CONFIG_USB_GADGET=y
注意:CONFIG_USB_CONFIGFS_F_UAC1 和 CONFIG_USB_CONFIGFS_F_UAC2 是Rockchip平台常用的命名,在其他平台(比如使用主线内核)上,对应的配置名可能是 CONFIG_USB_F_UAC1 和 CONFIG_USB_F_UAC2。最稳妥的方法是在内核源码目录下执行 make menuconfig,然后搜索 “UAC” 或 “Audio”,就能找到它们。
2.2 用户空间工具与测试音频
内核准备好之后,我们还需要一些用户空间的工具来测试音频通路是否畅通。最常用的就是 alsa-utils 工具包,它包含了 aplay(播放)和 arecord(录音)这两个命令行神器。你需要在你的目标板(开发板)文件系统里安装它们。如果是Buildroot或Yocto,在配置菜单里选中 alsa-utils 包重新编译文件系统即可。如果是Debian系的系统,直接 apt-get install alsa-utils。
光有工具还不行,你得有“弹药”——测试用的音频文件。为了排除编解码器的干扰,我们最常用的是原始的PCM格式文件。你可以用电脑上的音频编辑软件(如Audacity)生成一段特定采样率、位深、时长的正弦波PCM文件(.raw后缀),或者直接找现成的。我习惯准备两个:一个48kHz、16bit、双声道的 test_playback.raw 用于播放测试,另一个同规格的空白或特定内容的 test_capture.raw 用于录音测试。把它们放到开发板的存储里备用。


639

被折叠的 条评论
为什么被折叠?



