Linux平台移植音频芯片实战记录
本文详细记录在NXP I.MX6ULL+Linux平台下进行WM8960音频芯片移植的过程,其他平台操作方法类似,希望为大家提供帮助。
1. 环境准备
平台: HD6ULL-IOT开发板
要求: 外接一个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上的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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 hp-det-polarity>; * 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" ; }; }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | &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)和数据线(SDA)是飞线到J17的3,4脚(UART6_TXD,UART6_RXD),对应的CSI_MCLK与CSI_PIXCLK,我们需要将其复用成I2C1_SCL,I2C1_SDA功能。(需要查询对应的引脚功能列表和datasheet)
1 2 3 4 5 6 | pinctrl_i2c1: i2c1grp { fsl,pins = < MX6UL_PAD_CSI_PIXCLK__I2C1_SCL 0x4001b8b0 MX6UL_PAD_CSI_MCLK__I2C1_SDA 0x4001b8b0 >; }; |
③. 由于底板上有一个耳机接口是从核心板直接引出的,我们需要禁掉他。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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这个工具;
源码下载网址:https://www.alsa-project.org/wiki/Download#alsa-lib
编译参考网址: https://blog.csdn.net/gjy938815/article/details/11809269
编译好后:alsa-utils-1.2.9\aplay 这个目录下会生成aplay(145M),然后改名为arecord即可。
录音播放测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 将arecord拷贝到U盘内,依次执行以下指令: cp /mnt/sda1/arecord /home/demo/ chmod a+x /home/demo/arecord cd /home/audio/ ./amixer cset numid=1 60 录音功能需设置录音控件的参数 ./amixer cset numid=36 240 录音功能需设置录音控件的参数 ./amixer cset numid=41 1 将麦克风输出信号同时记录在左右声道 cd /home/demo 执行下面这个指令时需要对着WM8960说话,会录音到/tmp/t.wav文件中。 录音时间为10s ./arecord -f cd -d 10 /tmp/t.wav 播放录音文件 (最好用耳机听声音) cd /home/audio/ ./aplay /tmp/t.wav |
5. 音量调节
1 2 3 4 5 6 7 8 9 10 11 | 控制耳机音量大小: 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) |
至此,我们完成移植、测试的全部工作。如您在开发过程中遇到问题,欢迎技术交流。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App