[嵌入式Linux] Linux平台移植音频芯片实战记录

[复制链接]
1223|0
 楼主| 万象奥科 发表于 2024-5-17 11:25 | 显示全部楼层 |阅读模式
本帖最后由 万象奥科 于 2024-5-17 11:34 编辑


本文详细记录在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. sound {
  2.     compatible = "fsl,imx6ul-evk-wm8960",
  3.     "fsl,imx-audio-wm8960";
  4.     model = "wm8960-audio";
  5.     cpu-dai = <&sai2>;
  6.     audio-codec = <&codec>;
  7.     asrc-controller = <&asrc>;
  8.     codec-master;
  9.     gpr = <&gpr>;
  10. /*not support
  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. hp-det = <3 0>;
  16. hp-det-gpios = <&gpio5 4 0>;
  17. mic-det-gpios = <&gpio5 4 0>;
  18. */

  19. audio-routing =
  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.     };
  37. };
  1. &sai2 {
  2.     pinctrl-names = "default";
  3.     pinctrl-0 = <&pinctrl_sai2>;
  4.     assigned-clocks = <&clks IMX6UL_CLK_SAI2_SEL>,
  5.   <&clks IMX6UL_CLK_SAI2>;
  6.     assigned-clock-parents = <&clks IMX6UL_CLK_PLL4_AUDIO_DIV>;
  7.     assigned-clock-rates = <0>, <12288000>;
  8.     status = "okay";
  9. };
  10. pinctrl_sai2: sai2grp {
  11. fsl,pins = <
  12. MX6UL_PAD_JTAG_TDI__SAI2_TX_BCLK0x17088
  13. MX6UL_PAD_JTAG_TDO__SAI2_TX_SYNC0x17088
  14. MX6UL_PAD_JTAG_TRST_B__SAI2_TX_DATA0x11088
  15. MX6UL_PAD_JTAG_TCK__SAI2_RX_DATA0x11088
  16. MX6UL_PAD_JTAG_TMS__SAI2_MCLK0x17088
  17. MX6UL_PAD_SNVS_TAMPER4__GPIO5_IO040x17059
  18. >;
  19. };
  20. &i2c1 {
  21.     clock-frequency = <100000>;
  22.     pinctrl-names = "default";
  23.     pinctrl-0 = <&pinctrl_i2c1>;
  24.     status = "okay";
  25.     codec: wm8960@1a {
  26. compatible = "wlf,wm8960";
  27. reg = <0x1a>;
  28. clocks = <&clks IMX6UL_CLK_SAI2>;
  29. clock-names = "mclk";
  30. wlf,shared-lrclk;
  31.     };
  32. };
  33. pinctrl_i2c1: i2c1grp {
  34. fsl,pins = <
  35. MX6UL_PAD_CSI_PIXCLK__I2C1_SCL 0x4001b8b0
  36. MX6UL_PAD_CSI_MCLK__I2C1_SDA 0x4001b8b0
  37. >;
  38. };

②. 时钟线(SCL)和数据线(SDA)是飞线到J17的3,4脚(UART6_TXD,UART6_RXD),对应的CSI_MCLK与CSI_PIXCLK,我们需要将其复用成I2C1_SCL,I2C1_SDA功能。(需要查询对应的引脚功能列表和datasheet)
  1. pinctrl_i2c1: i2c1grp {
  2.     fsl,pins = <
  3.         MX6UL_PAD_CSI_PIXCLK__I2C1_SCL 0x4001b8b0
  4.         MX6UL_PAD_CSI_MCLK__I2C1_SDA 0x4001b8b0
  5.     >;
  6. };

③. 由于底板上有一个耳机接口是从核心板直接引出的,我们需要禁掉他。
  1. sound-mqs {
  2.     compatible = "fsl,imx-audio-mqs";
  3.     model = "mqs-audio";
  4.     cpu-dai = <&sai1>;
  5.     asrc-controller = <&asrc>;
  6.     audio-codec = <&mqs>;
  7.     status = "disabled";
  8. };
  9. &sai1 {
  10.     assigned-clocks = <&clks IMX6UL_CLK_SAI1_SEL>,
  11.     <&clks IMX6UL_CLK_SAI1>;
  12.     assigned-clock-parents = <&clks IMX6UL_CLK_PLL4_AUDIO_DIV>;
  13.     assigned-clock-rates = <0>, <24576000>;
  14.     status = "disabled";
  15. };
  16. &mqs {
  17.     pinctrl-names = "default";
  18.     pinctrl-0 = <&pinctrl_mqs>;
  19.     clocks = <&clks IMX6UL_CLK_SAI1>;
  20.     clock-names = "mclk";
  21.     status = "disabled";
  22. };

重新编译后替换设备树,然后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. 将arecord拷贝到U盘内,依次执行以下指令:
  2. cp /mnt/sda1/arecord /home/demo/
  3. chmod a+x /home/demo/arecord
  4. cd /home/audio/
  5. ./amixer cset numid=1 60     录音功能需设置录音控件的参数
  6. ./amixer cset numid=36 240    录音功能需设置录音控件的参数
  7. ./amixer cset numid=41 1     将麦克风输出信号同时记录在左右声道
  8. cd /home/demo
  9. 执行下面这个指令时需要对着WM8960说话,会录音到/tmp/t.wav文件中。 录音时间为10s
  10. ./arecord -f cd -d 10 /tmp/t.wav
  11. 播放录音文件 (最好用耳机听声音)
  12. cd /home/audio/
  13. ./aplay /tmp/t.wav

5. 音量调节
  1. 控制耳机音量大小:
  2. numid=11,iface=MIXER,name='Headphone Playback Volume'
  3. ./amixer cset numid=11 80     (范围0~127, 80合适)
  4. 控制喇叭音量大小:
  5. numid=13,iface=MIXER,name='Speaker Playback Volume' 这个配置
  6. ./amixer cset numid=13 100       (范围0~127,但一般100声音就合适了)
  7. 录音时配置:
  8. numid=36,iface=MIXER,name='ADC PCM Capture Volume'
  9. ./amixer cset numid=36 190    (录音范围0~255,一般190左右合适,值过大杂声会有点大)
  10. numid=1,iface=MIXER,name='Capture Volume'   (设置捕获的音量)
  11. ./amixer cset numid=1 30     (范围0~63 ,可以选择30)






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

113

主题

127

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部