首页 > 系统相关 >Linux平台移植音频芯片实战记录

Linux平台移植音频芯片实战记录

时间:2024-05-17 11:40:46浏览次数:14  
标签:wm8960 音频芯片 numid pinctrl 录音 Linux audio hp 移植

本文详细记录在NXP I.MX6ULL+Linux平台下进行WM8960音频芯片移植的过程,其他平台操作方法类似,希望为大家提供帮助。

1. 环境准备

平台: HD6ULL-IOT开发板

要求: 外接一个WM8960模块。要求能正常播放音频文件。

2. 原理图及相关资料

将模块飞线到底板J17上,接法如下;且模块1脚 接了J17的1脚(3.3V); 然后模块的3脚(GND)接的J17的29脚地。

20240517

 

 

 

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 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";
    };
};
&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)

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这个工具;

源码下载网址: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即可。

录音播放测试:

将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. 音量调节

控制耳机音量大小:
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)

  

 

至此,我们完成移植、测试的全部工作。如您在开发过程中遇到问题,欢迎技术交流。

 

标签:wm8960,音频芯片,numid,pinctrl,录音,Linux,audio,hp,移植
From: https://www.cnblogs.com/vanxoak/p/18197556

相关文章

  • Linux Buffer/cache清理
    1、清理Buffer/cache缓存文件https://blog.csdn.net/u011066470/article/details/125510817syncsysctl-wvm.drop_caches=1sysctl-wvm.drop_caches=2sysctl-wvm.drop_caches=3定时脚本清理#!/bin/bashMem=$(free-m|awk'NR==2'|awk'{print$4}')......
  • 在Linux中,什么是持续集成/持续部署(CI/CD)?
    持续集成/持续部署(ContinuousIntegration/ContinuousDeployment,简称CI/CD)是一组软件开发实践,旨在通过自动化的流程来频繁地集成和部署代码变更,以提高软件交付的速度和质量。1.持续集成(CI)持续集成是指开发者频繁地将代码变更合并到主分支的实践。每次代码合并都伴随着自动化的......
  • 在Linux中,什么是双因素认证(2FA)?
    双因素认证(Two-FactorAuthentication,简称2FA)是一种安全验证方法,它要求用户提供两种不同的认证因素来证明其身份。这种方法的目的是增加安全性,因为即使攻击者获得了用户的密码,没有第二种认证因素,他们也无法访问账户。1.双因素认证的组成双因素认证通常由以下两种类型的身份验证......
  • 在Linux中,什么是微服务架构?
    微服务架构(MicroservicesArchitecture)是一种软件开发方法,它将一个应用程序构建为一系列小型服务的集合,每个服务实现特定的业务功能,并可以独立部署和扩展。这些服务通常是轻量级的,并且通过定义良好的API进行通信,通常是HTTPRESTfulAPI或轻量的消息传递系统。1.微服务架构的关键......
  • 在Linux中,如何设计和部署容器化应用?
    在Linux中设计和部署容器化应用是一个涉及多个步骤的过程。以下是一个详细的指南,帮助你理解如何在Linux上设计和部署容器化应用:1.理解容器化技术容器化技术允许你将应用程序及其依赖项打包到一个可移植、轻量级的容器中。与虚拟机相比,容器更加轻量级,因为它们共享宿主机的操作系......
  • Linux基础知识(Ubuntu)
    文件权限意义权限类型1.r可读2.w可写3.x可执行/切换陌路4.-无权限通配符*匹配0个或多个字符串?匹配1个字符[abcd]匹配abcd中间任意一个字符[a-Z]匹配a-Z范围里的任意一个字符[!abc]不匹配方括号里的任何一个字符;与[^abc]一致帮助命令man语法man[m......
  • Linux中Cache 和 Buffer 有什么区别?
    Cache和Buffer是两个不同的概念,简单的说,Cache是加速“读”,而buffer是缓冲“写”,前者解决读的问题,保存从磁盘上读出的数据,后者是解决写的问题,保存即将要写入到磁盘上的数据。在很多情况下,这两个名词并没有严格区分,常常把读写混合类型称为buffercache,本文后续的论述中,统一称为cache......
  • Linux 常用命令
    1、查找当前目录下所有以.tar结尾的文件然后移动到指定目录:find.-name“*.tar”-execmv{}./backup/;注解:find–name主要用于查找某个文件名字,-exec、xargs可以用来承接前面的结果,然后将要执行的动作,一般跟find在一起用的很多,find使用我们可以延伸-mtime查找修改时间、-t......
  • 运维必备Linux学习day3(面试常问的linux指令)
    一.问题:列举Linux高级命令,至少6个(百度)netstat//网络状态监控 top//系统运行状态 lsblk //查看硬盘分区findps-aux//查看运行进程chkconfig//查看服务启动状态systemctl//管理系统服务器二.问题:Linux查看内存、io读写、磁盘存储、端口占用、进程查看命令是什么?(......
  • linux常见操作
    现在互联网上常用的操作系统有微软的windows,苹果公司的unix系统以及开源的Linux系统.Linux以他的开源,可扩展性强等优势被广大it从业者所青睐,也是大多数互联网公司部署后端服务器所选择的操作系统.操作系统是一个计算机想要运行不可缺少的一款软件,他在计算机硬件与应......