Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长
大叔来之一个小村庄,上大学以后来到了省城济南。之前高中练习英语听力买过一个随声听,晚上练习听力,怕影响同学休息还买了一个耳机。 虽然听力没有大的提升,但是带上耳机睡觉是真的下觉啊。平时睡不着,一带上耳机,很快就睡着了。
到了大学以后,城里的同学也有一个随身听,大牌子。连耳机都号称是银线,价格不菲。我处于好奇听了一下到底好在哪里。当把耳机插入耳朵,音乐响起。我顿时傻住了。那真真实实的环绕立体声把我惊呆了。原因耳机里面竟然可以听到这么立体真实好听的音乐。说是刘姥姥进了大观园一点儿不假,真的是见了世面了。
说这么一个小故事,无非是忆苦思甜,也很碰巧今天学习音频。往昔的林林种种倾泻而来。个中的酸甜苦辣,不得不感叹时光荏苒、岁月如梭。
本节笔记主要学习一下如何使能 WM8960 驱动,并且通过 WM8960 芯片来完成音乐播放与录音。
本章的思维导图如下:
一、音频接口简介
1、为何需要音频编解码芯片?
ADC和DAC
2、WM8960简介
数字音频接口(I2S接口):
ADCDAT: ADC 数据输出引脚,采集到的音频数据转换为数字信号以后通过此引脚传输给
主控制器。
ADCLRC: ADC 数据对齐时钟,也就是帧时钟(LRCK),用于切换左右声道数据, 此信号
的频率就是采样率。此引脚可以配置为 GPIO 功能,配置为 GPIO 以后 ADC 就会使用 DACLRC
引脚作为帧时钟。
DACDAT: DAC 数据输入引脚,主控器通过此引脚将数字信号输入给 WM8960 的 DAC。
DACLRC: DAC 数据对齐时钟,功能和 ADCLRC 一样,都是帧时钟(LRCK),用于切换左
右声道数据,此信号的频率等于采样率。
BCLK: 位时钟,用于同步。
MCLK: 主时钟, WM8960 工作的时候还需要一路主时钟,此时钟由 I.MX6ULL 提供,
MCLK 频率等于采样率的 256 或 384 倍。
I2C 接口就是用于配置 WM8960 的。
3、I2S总线接口
I2S 接口需要 3 根信号线:
SCK: 串行时钟信号,也叫做位时钟(BCLK),音频数据的每一位数据都对应一个 SCK,立体声都是双声道的,因此 SCK=2×采样率×采样位数。比如采样率为 44.1KHz、 16 位的立体声音频,那么 SCK=2×44100×16=1411200Hz=1.4112MHz。
WS: 字段(声道)选择信号,也叫做 LRCK,也叫做帧时钟,用于切换左右声道数据, WS 为“ 1”表示正在传输左声道的数据, WS 为“ 0”表示正在传输右声道的数据。 WS 的频率等于采样率,比如采样率为 44.1KHz 的音频, WS=44.1KHz。
SD: 串行数据信号,也就是我们实际的音频数据,如果要同时实现放音和录音,那么就需要 2 根数据线,比如 WM8960 的 ADCDAT 和 DACDAT,就是分别用于录音和放音。不管音频数据是多少位的,数据的最高位都是最先传输的。数据的最高位总是出现在一帧开始后(LRCK变化)的第 2 个 SCK 脉冲处。
另外,有时候为了使音频 CODEC 芯片与主控制器之间能够更好的同步,会引入另外一个叫做 MCLK 的信号,也叫做主时钟或系统时钟,一般是采样率的 256 倍或 384 倍。
一帧立体声音频时序图:
数据格式根据 DATA 数据相对于 LRCK 和 SCLK 位置的不同,出现了 Left Justified(左对齐)和 Right Justified(右对齐)两种格式。
4、I.MX6ULL SAI简介
I.MX6ULL 的 SAI 是一个全双工、支持帧同步的串行接口,支持 I2S、 AC97、 TDM 和音频
DSP。
二、硬件原理图分析
三、音频驱动使能
1、修改设备树
I2C 用于配置 WM8960, SAI 接口用于音频数据传输。
1)、wm8960 i2c接口设备树
“ i2c2”节点添加 wm8960 信息,两个重要的属性:
compatible:兼容属性,属性值要设置为“ wlf,wm8960”。
reg: 设置 WM8960 的 I2C 地址。
codec: wm8960@1a {
compatible = "wlf,wm8960";
reg = <0x1a>;
wlf,shared-lrclk;/*这是一个 bool 类型的可选属性,如果添加了此属性, WM8960 的 R24 寄存器
的 LRCM 位(bit2)就会置 1。当 LRCM 为 1 的时候只有当 ADC 和 DAC 全部关闭以后 ADCLRC
和 DACLRC 时钟才会关闭。*/
};
1 codec: wm8960@1a {
2 compatible = "wlf,wm8960";
3 reg = <0x1a>;
4 clocks = <&clks IMX6UL_CLK_SAI2>;//指定时钟源为SAI2
5 clock-names = "mclk";//指定时钟名为mclk
6 wlf,shared-lrclk;
7 };
2)、I.MX6ULL SAI音频接口设备树
SAI2 接口的 pinctrl:
1 pinctrl_sai2: sai2grp {
2 fsl,pins = <
3 MX6UL_PAD_JTAG_TDI__SAI2_TX_BCLK 0x17088
4 MX6UL_PAD_JTAG_TDO__SAI2_TX_SYNC 0x17088
5 MX6UL_PAD_JTAG_TRST_B__SAI2_TX_DATA 0x11088
6 MX6UL_PAD_JTAG_TCK__SAI2_RX_DATA 0x11088
7 MX6UL_PAD_JTAG_TMS__SAI2_MCLK 0x17088
8 >;
9 };
10
11 pinctrl_sai2_hp_det_b: sai2_hp_det_grp {//耳机插入检测引脚
12 fsl,pins = <
13 MX6ULL_PAD_SNVS_TAMPER4__GPIO5_IO04 0x17059
14 >;
15 };
3)、I.MX6ULL sound节点
1 sound {
2 compatible = "fsl,imx6ul-evk-wm8960",/*用于匹配相应的驱动文件*/
3 "fsl,imx-audio-wm8960";
4 model = "wm8960-audio";/*声卡名字*/
5 cpu-dai = <&sai2>;/*CPU DAI(Digital Audio Interface)句柄,这里是 sai2 这个节点。*/
6 audio-codec = <&codec>;/*音频解码芯片句柄,也就是 WM8960 芯片,这里为“ codec”这个节点。*/
7 asrc-controller = <&asrc>;/*异步采样频率转化器。*/
8 codec-master;
9 gpr = <&gpr 4 0x100000 0x100000>;
10 /*
11 * hp-det = <hp-det-pin hp-det-polarity>;
12 * hp-det-pin: JD1 JD2 or JD3
13 * hp-det-polarity = 0: hp detect high for headphone
14 * hp-det-polarity = 1: hp detect high for speaker
15 */
16 hp-det = <3 0>;/*耳机插入检测引脚设置,第一个参数为检测引脚, 3 表示 JD3 为检测引脚。第二个
参数设置检测电平,设置为 0 的时候, hp 检测到高电平表示耳机插入;设置为 1 的时候, hp 检
测到高电平表示是喇叭,也就是耳机拔出了。*/
17 /*hp-det-gpios = <&gpio5 4 0>;
18 mic-det-gpios = <&gpio5 4 0>;*/
19 audio-routing =/*音频器件一系列的连接设置,每个条目都是一对字符串,第一个字符串是
连接的 sink,第二个是连接的 source(源)。*/
20 "Headphone Jack", "HP_L",
21 "Headphone Jack", "HP_R",
22 "Ext Spk", "SPK_LP",
23 "Ext Spk", "SPK_LN",
24 "Ext Spk", "SPK_RP",
25 "Ext Spk", "SPK_RN",
26 "LINPUT2", "Mic Jack",
27 "LINPUT3", "Mic Jack",
28 "RINPUT1", "Main MIC",
29 "RINPUT2", "Main MIC",
30 "Mic Jack", "MICB",
31 "Main MIC", "MICB",
32 "CPU-Playback", "ASRC-Playback",
33 "Playback", "CPU-Playback",
34 "ASRC-Capture", "CPU-Capture",
35 "CPU-Capture", "Capture";
36 };
2、使能内核的WM8960驱动
输入命令make menuconfig,进入图形化配置界面。
1)、取消ALSA模拟OSS API
路径如下:
-> Device Drivers
-> Sound card support (SOUND [=y])
-> Advanced Linux Sound Architecture (SND [=y])
-> <> OSS Mixer API //不选择
-> <> OSS PCM (digital audio) API //不选择
2)、使能I.MX6ULL的WM8960驱动
-> Device Drivers
-> Sound card support (SOUND [=y])
-> Advanced Linux Sound Architecture (SND [=y])
-> ALSA for SoC audio support (SND_SOC [=y])
-> SoC Audio for Freescale CPUs
-> <*> Asynchronous Sample Rate Converter (ASRC) module support //选中
-> <*> SoC Audio support for i.MX boards with wm8960 //选中
四、alsa-lib和alsa-utils移植
1、alsa-lib移植
配置信息的路径必须是绝对路径。
编译的时候必须是root用户。
2、alsa-utils移植
alsa-utils 是 ALSA 的一些小工具集合,用于测试声卡用。
按照如下命令编译
alsa-utils:
cd alsa-utils-1.2.2/ //进入
./configure --host=arm-linux-gnueabihf --prefix=/home/zuozhongkai/linux/IMX6ULL/tool/alsautils --with-alsa-inc-prefix=/home/zuozhongkai/linux/IMX6ULL/tool/alsa-lib/include/ --with-alsaprefix=/home/zuozhongkai/linux/IMX6ULL/tool/alsa-lib/lib/ --disable-alsamixer --disable-xmlto
make //编译
sudo make install
将 bin、 sbin 和 share 这三个目录中的所有文件分别拷贝到开发板根目录下的/bin、 /sbin 和/usr/share/alsa 目录下。
打开开发板根文件系统中的/etc/profile 文件,在里面加入如下所示内容:
export ALSA_CONFIG_PATH=/usr/share/arm-alsa/alsa.conf
ALSA_CONFIG_PATH 用于指定 alsa 的配置文件,这个配置文件是 alsa-lib 编译出来的。
五、声卡设置与测试
1、amixer使用方法
1)、查看帮助信息
amixer --help //查看 amixer 帮助信息
amixer 软件命令分为两组, scontrols、 scontents、 sset 和 sget 为一一组。 controls、 contents、 cset 和 cget 为另一组。这两组的基本功能都是一样的,只不过“ s”开头的是 simple(简单)组,这一组命令是简化版。
2)、查看设置项
amixer scontrols //查看所有设置项
controls 对应的设置项,输入如下命令:
amixer controls //查看所有设置项
只关注一些最常用的设置即可,比如设置耳机和喇叭音量、设置左右声道音量、设置输入音量等等。
3)、查看设置值
amixer scontents //查看设置值
“ Headphone”项目就是设置耳机音量的,音量范围为 0-127,当前音量为 0。有些设置项是 bool 类型,只有 on 和 off 两种状态。
4)、设置声卡
amixer sset 设置项目 设置值
amixer cset 设置项目 设置值
5)、获取声卡设置值
amixer sget 设置项目
amixer cget 设置项目
2、音乐播放测试
1)、使用amixer设置声卡
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)、使用aply播放WAV格式音乐
aplay test.wav //播放歌曲
3、MIC录音测试
1)、使用amixer设置声卡
4 amixer cset name='Capture Volume' 90,90
5
6 #PCM
7 amixer sset 'PCM Playback' on
8 amixer sset 'Playback' 256
9 amixer sset 'Right Output Mixer PCM' on
10 amixer sset 'Left Output Mixer PCM' on
11
12 #ADC PCM
13 amixer sset 'ADC PCM' 200
14
15 #耳机/喇叭(扬声器)设置播放音量,直流/交流
16 #Turn on Headphone
17 amixer sset 'Headphone Playback ZC' on
18 #Set the volume of your headphones(98% volume, 127 is the MaxVolume)
19 amixer sset Headphone 125,125
20 #Turn on the speaker
21 amixer sset 'Speaker Playback ZC' on
22 #Set the volume of your Speaker(98% volume, 127 is the MaxVolume)
23 amixer sset Speaker 125,125
24 #Set the volume of your Speaker AC(80% volume, 100 is the MaxVolume)
25 amixer sset 'Speaker AC' 4
26 #Set the volume of your Speaker AC(80% volume, 5 is the MaxVolume)
27 amixer sset 'Speaker DC' 4
28
29 #音频输入,左声道管理
30 #Turn on Left Input Mixer Boost
31 amixer sset 'Left Input Mixer Boost' off
32 amixer sset 'Left Boost Mixer LINPUT1' off
33 amixer sset 'Left Input Boost Mixer LINPUT1' 0
34 amixer sset 'Left Boost Mixer LINPUT2' off
35 amixer sset 'Left Input Boost Mixer LINPUT2' 0
36 #Turn off Left Boost Mixer LINPUT3
37 amixer sset 'Left Boost Mixer LINPUT3' off
38 amixer sset 'Left Input Boost Mixer LINPUT3' 0
39
40 #音频输入,右声道管理,全部关闭
41 #Turn on Right Input Mixer Boost
42 amixer sset 'Right Input Mixer Boost' on
43 amixer sset 'Right Boost Mixer RINPUT1' off
44 amixer sset 'Right Input Boost Mixer RINPUT2' 0
45 amixer sset 'Right Boost Mixer RINPUT2' on
46 amixer sset 'Right Input Boost Mixer RINPUT2' 127
47 amixer sset 'Right Boost Mixer RINPUT3' off
48 amixer sset 'Right Input Boost Mixer RINPUT3' 0
给予 mic_in_config.sh 可执行权限并运行,命令如下:
chmod 777 mic_in_config.sh //给予可执行权限
./mic_in_config.sh //运行
2)、使用arecord录制音频
使用 arecord 来录制一段 10 秒中的音频, arecord 也是 alsa-utils 编译出来的,输入如下命
令:
arecord -f cd -d 10 record.wav
-f 是设置录音质量,“ -f cd”表示录音质量为 cd 级别。 -d 是指定录音时间,单位是 s,这
条指令就是录制一段 cd 级别 10s 的 wav 音频,音频名字为 record.wav。
3)、单声道MIC录制立体声音频
将 R23 寄存器的值改为 0x01c4。
4、LINE IN录音测试
1)、使用amixer设置声卡
4 amixer cset name='Capture Volume' 100,100
5
6 #PCM
7 amixer sset 'PCM Playback' on
8 amixer sset 'Playback' 256
9 amixer sset 'Right Output Mixer PCM' on
10 amixer sset 'Left Output Mixer PCM' on
11
12 #ADC PCM
13 amixer sset 'ADC PCM' 200
14
15 #录音前应该设置耳机或者扬声器的音量为 0(下面并没有设置)防止干扰
16 #耳机/喇叭(扬声器)设置播放音量,直流/交流
17 #Turn on Headphone
18 amixer sset 'Headphone Playback ZC' on
19 #Set the volume of your headphones(98% volume, 127 is the MaxVolume)
20 amixer sset Headphone 125,125
21 #Turn on the speaker
22 amixer sset 'Speaker Playback ZC' on
23 #Set the volume of your Speaker(98% volume, 127 is the MaxVolume)
24 amixer sset Speaker 125,125
25 #Set the volume of your Speaker AC(80% volume, 100 is the MaxVolume)
26 amixer sset 'Speaker AC' 4
27 #Set the volume of your Speaker AC(80% volume, 5 is the MaxVolume)
28 amixer sset 'Speaker DC' 4
29
30 #音频输入,左声道管理
31 #Turn off Left Input Mixer Boost
32 amixer sset 'Left Input Mixer Boost' on
33 #关闭其他通道输入
34 amixer sset 'Left Boost Mixer LINPUT1' off
35 amixer sset 'Left Input Boost Mixer LINPUT1' 0
36 #关闭麦克风左声道输入
37 amixer sset 'Left Boost Mixer LINPUT2' on
38 amixer sset 'Left Input Boost Mixer LINPUT2' 127
39 #Line_in 右声道输入关闭
40 amixer sset 'Left Boost Mixer LINPUT3' off
41 amixer sset 'Left Input Boost Mixer LINPUT3' 0
42
43
44 #音频输入,右声道管理
45 #Turn on Right Input Mixer Boost
46 amixer sset 'Right Input Mixer Boost' on
47 amixer sset 'Right Boost Mixer RINPUT1' off
48 amixer sset 'Right Input Boost Mixer RINPUT1' 0
49 amixer sset 'Right Boost Mixer RINPUT2' off
50 amixer sset 'Right Input Boost Mixer RINPUT2' 0
51
52 #要想设置成音频输入, 请打开 RINPUT3,看原理图可知
53 #其他的声道通过上面的配置可关闭,这样是为了避免干扰,需要的时候就打开
54 #RINPUT3 打开(关键点)
55 amixer sset 'Right Boost Mixer RINPUT3' on
56 amixer sset 'Right Input Boost Mixer RINPUT3' 127
给予 line_in_config.sh 可执行权限并运行,命令如下:
chmod 777 line_in_config.sh //给予可执行权限
./line_in_config.sh //运行
2)、使用arecord录制音频
arecord -f cd -d 10 record.wav
六、开机自动配置声卡
1、使用alsactl保存声卡设置
alsactl -f /var/lib/alsa/asound.state store //保存声卡设置
//-f 指定声卡配置文件, store 表示保存。
要使用 asound.state 中的配置信息来配置声卡,执行如下命令即可:
alsactl -f /var/lib/alsa/asound.state restore
//restore 恢复
打开/etc/init.d/rcS 文件,在最后面追加如下内容:
1 if [ -f "/var/lib/alsa/asound.state" ]; then//第 1 行判断/var/lib/alsa/asound.state 这个文件是否存在, 存在的话就执行下面的。
2 echo "ALSA: Restoring mixer setting......"
3 /sbin/alsactl -f /var/lib/alsa/asound.state restore &/*调用/sbin/alsactl 来执行
声卡设置工作。*/
4 fi
七、mplayer播放器移植与使用
1、mplayer移植
1)、移植zlib库
下载,解压,建文件夹。
进入文件,配置编译,使用命令如下:
cd zlib-1.2.11/ //进去 zlib 源码
CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld AD=arm-linux-gnueabihfas ./configure --prefix=/home/zuozhongkai/linux/IMX6ULL/tool/zlib //配置
make //编译
make install
sudo cp lib/* /home/zuozhongkai/linux/nfs/rootfs/lib/ -rfa
2)、移植mplayer
下载,解压,建文件夹。
进入文件,配置编译,使用命令如下:
cd MPlayer-1.4/ //进去 mplayer 源码
./configure --cc=arm-linux-gnueabihf-gcc --host-cc=gcc --target=arm-linux-gnueabihf --disableossaudio --enable-alsa --prefix=/home/zuozhongkai/linux/IMX6ULL/tool/mplayer --extra-cflags="-I
/home/zuozhongkai/linux/IMX6ULL/tool/zlib/include -I
/home/zuozhongkai/linux/IMX6ULL/tool/alsa-lib/include" --extra-ldflags="-
L/home/zuozhongkai/linux/IMX6ULL/tool/zlib/lib -Iz -
L/home/zuozhongkai/linux/IMX6ULL/tool/alsa-lib/lib -lasound" --enable-fbdev --disable-mencoder
make //编译
编译完成以后打开 config.mak 文件,找到“ INSTALLSTRIP = -s”这一行,取消掉后面的“ -s”,否则“ make install”命令会失败!
“ make install”安装。
2、mplayer使用
1)、mplayer播放音频
“ mplayer+歌曲名”即可,比如:mplayer test.flac
2)、视频播放测试
“ mplayer+视频名”即可,但是这样的话视频不是居中播放的,我们可以加入“ -fs”参数让视频居中播放。
mplayer test.avi -fs //居中播放视频
八、alsamixer简介
alsamixer 是一个图形化的声卡设置工具。
本文为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,不得用于商业用途。