本文詳細記錄在NXP I.MX6ULL+Linux平臺下進行WM8960音頻芯片移植的過程,其他平臺操作方法類似,希望為大家提供幫助。
1.環(huán)境準備
平臺: HD6ULL-IOT開發(fā)板
要求:外接一個WM8960模塊。要求能正常播放音頻文件。
2.原理圖及相關資料
將模塊飛線到底板J17上,接法如下;且模塊1腳接了J17的1腳(3.3V);然后模塊的3腳(GND)接的J17的29腳地。



WM8960資料:
https://www.waveshare.net/wiki/WM8960_Audio_Board
3.內核以及設備樹調試
內核需要勾選WM8960相關配置,可以make menuconfig后/搜索8960然后勾上就行。
設備樹注意三點:
①. 客戶飛線WM8960是掛載到i2c1上的。
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>;
/*not support
* hp-det = ;
* hp-det-pin: JD1 JD2 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";
};
};
&sai2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sai2>;
assigned-clocks = <&clks IMX6UL_CLK_SAI2_SEL>,
<&clks IMX6UL_CLK_SAI2>;
assigned-clock-parents = <&clks IMX6UL_CLK_PLL4_AUDIO_DIV>;
assigned-clock-rates = <0>, <12288000>;
status = "okay";
};
pinctrl_sai2: sai2grp {
fsl,pins = <
MX6UL_PAD_JTAG_TDI__SAI2_TX_BCLK0x17088
MX6UL_PAD_JTAG_TDO__SAI2_TX_SYNC0x17088
MX6UL_PAD_JTAG_TRST_B__SAI2_TX_DATA0x11088
MX6UL_PAD_JTAG_TCK__SAI2_RX_DATA0x11088
MX6UL_PAD_JTAG_TMS__SAI2_MCLK0x17088
MX6UL_PAD_SNVS_TAMPER4__GPIO5_IO040x17059
>;
};
&i2c1 {
clock-frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c1>;
status = "okay";
codec: wm8960@1a {
compatible = "wlf,wm8960";
reg = <0x1a>;
clocks = <&clks IMX6UL_CLK_SAI2>;
clock-names = "mclk";
wlf,shared-lrclk;
};
};
pinctrl_i2c1: i2c1grp {
fsl,pins = <
MX6UL_PAD_CSI_PIXCLK__I2C1_SCL 0x4001b8b0
MX6UL_PAD_CSI_MCLK__I2C1_SDA 0x4001b8b0
>;
};
②. 時鐘線(SCL)和數(shù)據(jù)線(SDA)是飛線到J17的3,4腳(UART6_TXD,UART6_RXD),對應的CSI_MCLK與CSI_PIXCLK,我們需要將其復用成I2C1_SCL,I2C1_SDA功能。(需要查詢對應的引腳功能列表和datasheet)

pinctrl_i2c1: i2c1grp {
fsl,pins = <
MX6UL_PAD_CSI_PIXCLK__I2C1_SCL 0x4001b8b0
MX6UL_PAD_CSI_MCLK__I2C1_SDA 0x4001b8b0
>;
};
③. 由于底板上有一個耳機接口是從核心板直接引出的,我們需要禁掉他。
sound-mqs {
compatible = "fsl,imx-audio-mqs";
model = "mqs-audio";
cpu-dai = <&sai1>;
asrc-controller = <&asrc>;
audio-codec = <&mqs>;
status = "disabled";
};
&sai1 {
assigned-clocks = <&clks IMX6UL_CLK_SAI1_SEL>,
<&clks IMX6UL_CLK_SAI1>;
assigned-clock-parents = <&clks IMX6UL_CLK_PLL4_AUDIO_DIV>;
assigned-clock-rates = <0>, <24576000>;
status = "disabled";
};
&mqs {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_mqs>;
clocks = <&clks IMX6UL_CLK_SAI1>;
clock-names = "mclk";
status = "disabled";
};
重新編譯后替換設備樹,然后cd /home/audio ./aplay 1.wav。插上耳機或者揚聲器即有聲音。
在調試過程中,可通過i2cdetect -y -a 0(此處wm8960掛載在i2c1)檢查音頻設備是否掛載到i2c1上,或者dmesg | grep wm8960檢查驅動是否加載成功。
4.錄音測試
首先需要有arecord這個工具;
源碼下載網(wǎng)址:https://www.alsa-project.org/wiki/Download#alsa-lib
編譯參考網(wǎng)址:https://blog.csdn.net/gjy938815/article/details/11809269
編譯好后:alsa-utils-1.2.9aplay 這個目錄下會生成aplay(145M),然后改名為arecord即可。
錄音播放測試:
將arecord拷貝到U盤內,依次執(zhí)行以下指令: cp /mnt/sda1/arecord /home/demo/ chmod a+x /home/demo/arecord cd /home/audio/ ./amixer cset numid=1 60 錄音功能需設置錄音控件的參數(shù) ./amixer cset numid=36 240 錄音功能需設置錄音控件的參數(shù) ./amixer cset numid=41 1 將麥克風輸出信號同時記錄在左右聲道 cd /home/demo 執(zhí)行下面這個指令時需要對著WM8960說話,會錄音到/tmp/t.wav文件中。 錄音時間為10s ./arecord -f cd -d 10 /tmp/t.wav 播放錄音文件 (最好用耳機聽聲音) cd /home/audio/ ./aplay /tmp/t.wav
5.音量調節(jié)
控制耳機音量大小: numid=11,iface=MIXER,name='Headphone Playback Volume' ./amixer cset numid=11 80 (范圍0~127, 80合適) 控制喇叭音量大小: numid=13,iface=MIXER,name='Speaker Playback Volume' 這個配置 ./amixer cset numid=13 100 (范圍0~127,但一般100聲音就合適了) 錄音時配置: numid=36,iface=MIXER,name='ADC PCM Capture Volume' ./amixer cset numid=36 190 (錄音范圍0~255,一般190左右合適,值過大雜聲會有點大) numid=1,iface=MIXER,name='Capture Volume' (設置捕獲的音量) ./amixer cset numid=1 30 (范圍0~63 ,可以選擇30)
至此,我們完成移植、測試的全部工作。
-
PCM
+關注
關注
1文章
207瀏覽量
55363 -
SDA
+關注
關注
0文章
125瀏覽量
29380 -
音頻芯片
+關注
關注
3文章
151瀏覽量
18721 -
GND
+關注
關注
2文章
548瀏覽量
41101 -
時鐘線
+關注
關注
0文章
7瀏覽量
3754
原文標題:Linux平臺移植音頻芯片實戰(zhàn)記錄
文章出處:【微信號:萬象奧科,微信公眾號:萬象奧科】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
移植NXP官方linux 5.4內核到i.MX6ULL開發(fā)板
請問m8960 wm8974 wm8978 wm8994 一系列音頻接口芯片在錄放音的音質上有提升嗎?
請問在哪里把CODEC_PWR_EN引腳拉高給音頻芯片供電呢
wm8960掛載在I2C2上匹配不了驅動這是為什么
在開發(fā)板上掛載的wm8960錄音失敗怎么解決
I2C3掛載wm8960音頻芯片
請問wm8960聲卡驅動是否支持音頻輸入動態(tài)選擇?
請問WM8960有驅動源碼嗎?
如何通過tinyalsa命令音頻正在通過wm8960播放?
在Android11中通過GUI的wm8960模塊播放音頻找不到是為什么?
微雪電子樹莓派音頻編解碼擴展板|WM8960 Audio HAT介紹
I2C3掛載wm8960音頻芯片 | 飛凌干貨筆記

淺析在NXP I.MX6ULL+Linux平臺下進行WM8960音頻芯片移植的過程
評論