本帖最后由 sumoon_yao 于 2022-4-11 16:16 编辑
前段时间给一块根据官方板定制的iMX6UL板增加音频驱动,由于iMX6UL和iMX6ULL的音频部分基本一致,所以整个驱动移植和alsa库移植也同样适用于iMX6ULL板。 arm linux内核中常用的音频芯片如wm8960等驱动源码都已经具备,所以最主要的工作就是根据硬件来配置设备树,以imx6ull_14x14_evk.dtb为例。 下面是音频wm8960的原理图:
根据原理图,相应的在设备树文件中增加以下内容: 在根节点下增加sound子节点: sound { compatible = "fsl,imx6ul-evk-wm8960", "fsl,imx-audio-wm8960"; model = "wm8960-audio"; cpu-dai = <&sai2>; audio-codec = <&codec>; asrc-controller = <&asrc>; codec-master; gpr = <&gpr 4 0x100000 0x100000>; /* * hp-det = <hp-det-pinhp-det-polarity>; * hp-det-pin: JD1JD2 or JD3 * hp-det-polarity = 0:hp detect high for headphone * hp-det-polarity = 1:hp detect high for speaker */ hp-det = <3 0>; hp-det-gpios = <&gpio5 4 0>; mic-det-gpios = <&gpio5 4 0>; audio-routing = "Headphone Jack", "HP_L", "Headphone Jack", "HP_R", "Ext Spk", "SPK_LP", "Ext Spk", "SPK_LN", "Ext Spk", "SPK_RP", "Ext Spk", "SPK_RN", "LINPUT2", "Mic Jack", "LINPUT3", "Mic Jack", "RINPUT1", "Main MIC", "RINPUT2", "Main MIC", "Mic Jack", "MICB", "Main MIC", "MICB", "CPU-Playback", "ASRC-Playback", "Playback", "CPU-Playback", "ASRC-Capture", "CPU-Capture", "CPU-Capture", "Capture"; }; 在i2c2节点下增加codec:8960: codec: wm8960@1a { compatible = "wlf,wm8960"; reg = <0x1a>; clocks = <&clks IMX6UL_CLK_SAI2>; clock-names = "mclk"; wlf,shared-lrclk; }; 在iomuxc节点配置sai2引脚 pinctrl_sai2: sai2grp { fsl,pins = < MX6UL_PAD_JTAG_TDI__SAI2_TX_BCLK 0x17088 MX6UL_PAD_JTAG_TDO__SAI2_TX_SYNC 0x17088 MX6UL_PAD_JTAG_TRST_B__SAI2_TX_DATA 0x11088 MX6UL_PAD_JTAG_TCK__SAI2_RX_DATA 0x11088 MX6UL_PAD_JTAG_TMS__SAI2_MCLK 0x17088 >; }; 配置sai2节点的pinctrl属性 &sai2 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_sai2 &pinctrl_sai2_hp_det_b>; assigned-clocks = <&clks IMX6UL_CLK_SAI2_SEL>, <&clksIMX6UL_CLK_SAI2>; assigned-clock-parents = <&clksIMX6UL_CLK_PLL4_AUDIO_DIV>; assigned-clock-rates = <0>, <12288000>; status = "okay"; };
在内核图形化配置界面中选中音频芯片wm8960,然后使用下面的命令重新编译内核和设备树。 sudo make ARCH=arm CROSS_COMPILE=arm-none-eabi- 使用mfgtool工具重新烧写镜像,完成后重启系统,此时内核启动信息中应该就会提示找到了音频芯片wm8960。
接着是alsa库的移植,先从alsa官网下载alsalib和utils源码: https://www.alsa-project.org/files/pub/lib/ 我下载的是alsa-lib-1.1.9.tar和alsa-utils-1.1.9.tar。
alsa-lib要先编译,因为alsa-utils的编译要用到alsa-lib库文件。 建目录/usr/share/alsa。 清除中间文件,防止得不到想要的结果: sudo make clean 然后顺序键入以下命令编译alsa-lib库。 sudo ./configure --host=arm-linux-gnueabihf--prefix=/home/nfs/alsa-lib --with-configdir=/usr/share/alsa sudo make sudo make install 再编译alsa-util。 清除中间文件: sudo make clean 顺序键入以下命令编译alsa-util库。 sudo ./configure --host=arm-linux-gnueabihf--prefix=/home/nfs/alsa-util --with-alsa-inc-prefix=/home/nfs/alsa-lib/include--with-alsa-prefix=/home/nfs/alsa-lib/lib --disable-alsamixer --disable-xmlto sudo make sudo make install
需要注意的是,库的移植以及应用的移植,一定要注意所使用的交叉编译工具版本类型,否则编译出来的库或者应用程序将不能正常运行
编译完成后通过网络或者使用u盘分别将alsa-lib目录和alsa-util目录下的文件拷贝到开发板。 /usr/share/alsa目录下的所有文件拷贝到开发板同一目录下。 将alsa-lib/lib目录下的所有文件拷贝到开发板的/usr/lib目录,注意符号链接文件。 将alsa-util目录下的3个子目录bin、sbin、share中的文件分别拷贝到开发板目录/usr/bin、/usr/sbin、/usr/share。
在使用音频前需要通过amixer命令配置音频参数,以录音为例,需要配置的参数如下: amixer cset name='Left InputMixer Boost Switch' on/off 左路音频输入开关 amixer cset name='Left BoostMixer LINPUT1 Switch' on/off 左路音频输入LINPUT1开关 amixer cset name='Left BoostMixer LINPUT2 Switch' on/off 左路音频输入LINPUT2开关 amixer cset name='Left BoostMixer LINPUT3 Switch' on/off 左路音频输入LINPUT3开关 amixer cset name='Right InputMixer Boost Switch' on/off 右路音频输入开关 amixer cset name='Right BoostMixer RINPUT1 Switch' on/off 右路音频输入RINPUT1开关 amixer cset name='Right BoostMixer RINPUT2 Switch' on/off 右路音频输入RINPUT2开关 amixer cset name='Right BoostMixer RINPUT3 Switch' on/off 右路音频输入RINPUT3开关 amixer cset name='ADC PCMCapture Volume' 200(0 - 255) ADC PCM捕获音量设置 amixer cset name='CaptureVolume' 50(0 - 63) 捕获音量设置 amixer cset name='ADC DataOutput Select' 0 MAIN MIC或HP MIC单端输入设置 amixer cset name='ADC DataOutput Select' 1 HP MIC立体声输入设置 amixer cset name='ADC DataOutput Select' 2 MAIN MIC立体声输入设置
参数配置完成后可以使用命令alsactl进行保存,下次使用时也可以通过该命令恢复配置的参数。 先键一个子目录: mkdir /var/lib/alsa 手动保存配置参数指令: alsactl –f /var/lib/alsa/asound.state store 手动恢复保存的配置参数指令: alsactl –f /var/lib/alsa/asound.state restore
配置好音频录制参数就可以使用arecord命令来录制音频了,目前只支持wav格式的音频录制。 arecord -Dplughw:0,0 -r 44100-f S16_LE -c 2 -d 10 record.wav -D:指定声卡设备 -r:指定采样频率 -f:指定采样格式 -c:指定采样通道数 -d:录制时长(单位:秒) record.wav 录音文件名称 由于项目只涉及音频录制,音频播放部分未作过多研究,所以本篇就不做介绍了。
|