音频是Linux与Android的核心应用,本章围绕正点原子I.MX6ULL ALPHA开发板,聚焦WM8960音频编解码芯片,讲解如何使能其驱动,实现音乐播放与录音功能。
音频接口简介
.1 音频编解码芯片的必要性
处理器处理的是二进制数字信号,而外界声音为模拟信号。处理器“听声”需ADC芯片将模拟信号转数字信号,“发声”则靠DAC芯片将数字信号转模拟信号。若仅满足基础收发声,单独的ADC与DAC芯片可行,但音频应用对音质、音效调节、声音处理、接口标准化及开发便捷性有更高要求。将这些功能集成,便诞生了音频编解码芯片(Audio CODEC),手机、计算机提及的“CODEC”多指此类芯片。
音频CODEC的核心指标是采样率与采样位数,常见采样率有8kbps、44.1kbps、48kbps等,采样位数涵盖8位、16位、24位、32位。二者数值越高,声音还原越真实,HIFI音质便源于此,高端音频播放器也因此具备高采样率、高采样位数,成本也随之提升。
.2 WM8960芯片特性
WM8960是Wolfson(欧胜)推出的低功耗、高质量立体声音频CODEC,广泛应用于正点原子ALPHA开发板,具备诸多特性:
- 性能指标:DAC信噪比(SNR)达98dB,3.3V、48kHz下谐波失真(THD)为-84dB;ADC信噪比94dB,同条件下谐波失真为-82dB。
- 功能集成:集成3D增强功能;内置立体声D类功放,8Ω负载下每通道可驱动1W喇叭;自带耳机、麦克风接口。
- 采样支持:支持8kbps、11.025kbps、12kbps等多档采样率。
其整体框图含四类接口:
1. 输入接口:提供3路立体声输入源(LINPUT1/RINPUT1、LINPUT2/RINPUT2、LINPUT3/RINPUT3),用于接入麦克风或线路输入,硬件设计时需确定音频输入通道。
2.输出接口:SPK_LP/SPK_LN、SPK_RP/SPK_RN分别连接左右声道喇叭,支持1W、8Ω负载;HP_L/HP_R连接耳机。
3. 数字音频接口:含5根线,承担主控制器与WM8960的数据交互。ADCDAT输出ADC采集的数字信号;ADCLRC为ADC帧时钟,切换左右声道,频率等于采样率,可复用为GPIO;DACDAT接收主控制器输入的DAC数字信号;DACLRC功能同ADCLRC;SCLK为位时钟,实现同步;MCLK为主时钟,由I.MX6ULL提供,频率为采样率的256或384倍。
4. 控制接口:采用标准I²C接口,用于配置WM8960,确保芯片正常工作。
.3 I²S总线接口
I²S(Inter-IC Sound)是飞利浦提出的数字音频传输总线,用于主控制器与音频CODEC间的音频数据传输,I.MX6ULL的SAI外设与WM8960均支持该协议。
I²S接口信号线及功能如下:
- SCK(串行时钟/位时钟):音频数据每一位对应一个SCK,立体声双声道下,SCK = 2×采样率×采样位数,如44.1kHz、16位立体声,SCK = 1.4112MHz。
- WS(字段选择/帧时钟):即LRCK,切换左右声道,WS为1传输左声道,为0传输右声道,频率等于采样率。
- SD(串行数据):承载实际音频数据,收发需两根线,数据最高位优先传输,出现在帧开始后的第2个SCK脉冲处。
- MCLK(主时钟):为保障同步,引入MCLK,频率为采样率的256或384倍。
基于DATA与LRCK、SCLK的位置关系,I²S衍生出Left Justified(左对齐)和Right Justified(右对齐)两种数据格式。
.4 I.MX6ULL SAI外设
I.MX6ULL的SAI(Synchronous AudioInterface)是全双工、支持帧同步的串行接口,兼容I²S、AC97、TDM及音频DSP协议,核心特性包括:
- 帧最大支持32个字,字大小可选8bit或32bit。
- 收发通道各配备32×32bit的FIFO,FIFO出错后支持平滑重启。
2 硬件原理图分析
正点原子ALPHA开发板音频硬件核心涉及两个接口:
1. SAI接口:使用6根数据线,实现I.MX6ULL与WM8960的音频数据收发。
2. I²C接口:WM8960通过I²C2连接至I.MX6ULL,用于芯片配置。
3 音频驱动使能
NXP官方已编写WM8960驱动,仅需配置内核使能,核心是修改设备树,涉及I²C与SAI两类接口节点。
3.1 修改设备树
1. WM8960 I²C接口设备树:WM8960接在I.MX6ULL的I²C2接口,需在i2c2节点下添加WM8960信息。设备树必备属性为:
- `compatible`:设为“wolfson,wm8960”,关联驱动文件`sound/soc/codecs/wm8960.c`。
- `reg`:指定WM8960的I²C地址,ALPHA开发板为0x1a。
可选属性含`wolfson,shared-lrclk`、`wolfson,capless`,NXP官方I.MX6ULL EVK开发板的WM8960节点已预置,仅需补充时钟配置,指定时钟源为SAI2,命名为mclk。
2. I.MX6ULL SAI音频接口设备树:SAI接口配置参考`Documentation/devicetree/bindings/sound/fsl-sai.txt`,`imx6ull.dtsi`已定义SAI2节点,默认关闭,需在`imx6ull-alientek-emmc.dts`中修改:
- 开启SAI2,将`status`设为“okay”。
- 配置引脚复用(pinctrl),包含SAI2接口引脚与耳机插入检测引脚,ALPHA开发板与EVK引脚一致,无需调整。
- 配置时钟,指定时钟源与频率。
4 alsa-utils移植
alsa-utils提供音频控制与测试工具,移植步骤如下:
1. 配置编译:执行配置命令,指定安装路径、交叉编译工具,禁用alsamixer编译(因ncurses依赖问题),命令示例:
```bash
./configure --prefix=/home/zuozhongkai/linux/IMX6ULL/tool/alsa-lib --host=arm-linux-gnueabihf --disable-alsamixer
```
编译后生成bin、sbin、share目录。
2. 文件复制:将生成目录的文件分别复制到开发板根文件系统的`/bin`、`/sbin`、`/usr/share`目录。
3. 环境配置:在开发板`/etc/profile`中添加`exportALSA_CONFIG_PATH=/usr/share/arm-alsa/alsa.conf`,指定alsa配置文件路径。
5声卡设置与测试
5.1 amixer使用指南
amixer是alsa-utils的命令行声卡设置工具,功能与图形化工具alsamixer一致,操作如下:
1. 查看帮助:输入`amixer`,获取命令分组与使用说明,分为s开头的简化组与c开头的完整组,简化组操作更便捷。
2. 查看设置项:用`amixer scontrols`和`amixer controls`分别查看简化与完整的设置项,涵盖耳机、喇叭音量,输入输出控制等。
3. 查看设置值:执行`amixer scontents`查看简化组设置值,如耳机音量范围0~127,部分项目为bool型,仅on/off状态。
4. 设置与获取值:设置用`amixer sset 设置项目 设置值`或`amixer cset 设置项目 设置值`;获取用`amixer sget 设置项目`或`amixer cget 设置项目`。
5.2 音乐播放测试
1. 声卡设置:首次使用前,执行命令开启耳机、喇叭,设置音量,命令如下:
```bash
amixer sset Headphone 100,100
amixer sset Speaker 120,120
amixer sset 'Right Output Mixer PCM' on
amixer sset 'Left Output Mixer PCM' on
```
2. 播放测试:将WAV格式音乐文件放入开发板,用`aplay 文件名`播放,ALPHA开发板支持麦克风与耳机自动切换,不插耳机从麦克风播放,插耳机切换至耳机播放。
5.3 MIC录音测试
1. 声卡配置:创建`mic_in_config.sh`脚本,配置捕获音量、PCM、播放通道、ADC等参数,涵盖耳机、喇叭音量及输入通道管理,赋予执行权限并运行。
2. 音频录制:用`arecord -f cd -d 10 record.wav`录制10秒CD级WAV音频,录制时对着板载麦克风说话,默认仅左声道有数据。
3. 立体声录制优化:修改WM8960的R23寄存器,将值从0x01c0改为0x01c4,使左右声道共用左ADC数据,重新编译内核后,录制音频变为立体声。
5.4 Line in录音测试
若此前修改了R23寄存器,建议改回0x01c0(ALPHA开发板LINE IN为双声道,无需共用左声道,不改也可测试)。
1. 声卡设置:创建`line_in_config.sh`脚本,配置捕获音量、通道开关,重点开启RINPUT3通道,屏蔽其他干扰通道,赋予权限并运行。
2. 音频录制:用3.5mm公对公音频线连接手机/计算机与开发板LINE IN接口,执行`arecord -f cd -d 10 record.wav`录制,录制音频为立体声。
6 开机自动配置声卡
开发板重启后声卡设置会丢失,可通过alsactl工具保存配置:
1. 保存配置:创建`/var/lib/alsa`目录,用`amixer`设置声卡后,执行`alsactl -f /var/lib/alsa/asound.state store`保存配置,生成`asound.state`文件。
2. 恢复配置:执行`alsactl -f /var/lib/alsa/asound.state restore`恢复配置。
3. 开机自启:在`/etc/init.d/rcS`末尾添加判断与恢复命令,若`asound.state`存在,输出提示并执行恢复,重启后自动配置声卡。
7 alsamixer使用详解
alsamixer是图形化声卡配置工具,基于ncurses界面,操作便捷:
1. 启动与界面:终端输入`alsamixer`启动,顶部显示声卡名称、视图模式、选中项增益;中间为音量滑块;底部为快捷键提示。
2. 核心操作:
- 视图切换:F3切换播放设置,F4切换录音设置,F5显示所有选项,F6选择声卡,F1/F2查看帮助与系统信息。
- 导航调节:左右键选择设置项,上下键调节音量。
- 静音控制:M键切换静音状态,MM表示静音,00为开启。
- 退出:Esc键退出。
3. 补充说明:交叉编译时因ncurses依赖问题,常无法编译alsamixer,可用amixer替代,二者功能一致。嵌入式开发推荐用Buildroot或Yocto构建根文件系统,便于处理依赖,编译出alsamixer。