嵌入式产品开发中经常会遇到音频输入输出问题。如何为其添加“扬声器”和“麦克风”设备?本文将简单介绍ARM+Linux产品中的音频解决方案。
我们先来认识一下I2S(Inter-ICSound)总线。 I2S也称为集成电路内置音频总线。该总线专门用于音频设备之间的数据传输,广泛应用于各种多媒体系统中。它采用沿独立导线传输时钟和数据信号的设计。通过分离数据和时钟信号,有效避免了时间差造成的失真。
以HDG2L-IoT评估套件为例,RZ/G2L处理器提供至少一条I2S总线,通过该总线连接到音频编解码芯片(IC型号WM8960),以提供高质量的录音和广播功能。音频模块的硬件部署如下图所示。
图1HDG2L-IoT音频接口
G2L核心板与WM8960之间的音频通信引脚如下:
在Linux系统的音频编解码驱动中,通过I2C通信接口与音频IC进行通信,将音频IC中的各个功能寄存器抽象为音频控件,以便用户可以在User中直接调整IC中的参数空间。 I2S 音频引脚是发送和接收数字信号的通道。
广播时,音频IC接收数字信号,然后将其转换为模拟信号并发送出去。录音时,音频IC将接收到的音频模拟量转换为数字量并发送给处理器。
ALSA是Linux主流的音频架构。它包括一系列内核驱动程序、API 库和支持Linux 声音的工具。应用程序可以通过调用alsa-lib提供的API来完成对底层音频硬件的控制。
Linux通过alsa库和alsa工具来管理音频IC控制,通过“amixercontrols”列出当前系统中的音频控制项:
音频功能的关键控制信息如下所示。 (录音通道、广播通道、耳机音量、扬声器音量)。
在开发板下,运行aplay程序来测试音频播放。测试前需要将耳机插入开发板的耳机插孔。
测试基于I2S的音频输出接口,在命令行执行以下命令:
其中2.wav为需要播放的音频文件,假设2.wav位于/home/root/audios目录下。
在音频播放过程中,对于基于I2S的音频输出接口,可以使用amixer程序来调节音量。使用amixer程序调节耳机播放音量的命令行格式为:
其音量值范围为0到127,其中127表示最大音量。例如,要将音量设置为100,请在命令行中执行以下命令:
将扬声器连接至HDG2L-IOT开发板的左右声道插座。在播放音频之前,您可以设置扬声器播放音量和总音量,然后播放音频文件:
录音功能需要设置录音控制的参数,如下图。
使用arecord命令录制并保存为“/tmp/t.wav”,然后使用aplay命令回放进行验证。
由于当前麦克风输出信号仅连接到音频处理的左端作为输入,因此播放录音文件时只有左声道有输出。如果您想同时录制左右声道的麦克风输出信号,可以进行以下设置:
将“ADCDataOutputSelect”设置为1,其值表示“LeftData=LeftADC;RightData=LeftADC”。
从上面可以看出,音频编解码芯片在Linux系统中以控件的形式存在。内部参数一般只记录在存储器中。当系统断电后,修改的参数将会消失,因此需要保存和恢复指令来恢复上次的参数。参数保存在配置文件中。
alsa的配置文件为:/var/lib/alsa/asound.state
修改后的控件写操作如下。
恢复控制参数的操作如下(注:单板重启后会自动读取配置文件)。