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

news/2024/11/19 21:20:08/文章来源:https://www.cnblogs.com/vanxoak/p/18197556

本文详细记录在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 0x4001b8b0MX6UL_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)

  

 

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/707687.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shared_ptr的概念和一些特性调查

shared_ptr 概念 shared_ptr 是 C++11 中引入的一种智能指针,用于自动管理资源,特别是动态分配的内存。它属于 头文件中定义的智能指针类之一,用于解决动态内存分配中的内存泄漏和资源生命周期管理问题。shared_ptr 通过引用计数机制来实现多个 shared_ptr 实例共享同一资源…

SIEM

背景和介绍 SIEM(Security Information and Event Management,简称SIEM)安全信息和事件管理,最初是被设计为一个工具,辅助企业实现合规和特定行业的规定。从时间维度上讲,SIEM是已经存活了近20年的技术。 其结合安全信息管理(security information management, SIM)和安…

七牛云文件批量上传加单个上传和下载

第一步: 先在七牛云官网注册一个账号 然后点击对象存储-空间管理-新建空间 创建一个存储空间创建好之后就完成了第一步 可以往里面放东西了 第二步: 打开你的VS 创建一个类 改成静态类 方便外部调用 写一个静态的方法/// <summary>/// 上传文件类/// </summary&g…

vue3 ts 集成 tinymce

首先引入 @tinymce/tinymce-vueyarn add @tinymce/tinymce-vue -S 我的版本是 然后写一个组件<template><main id="sample"><Editor v-model="editorData" api-key="j7tvgx4xnptg3cjd63cfnl62z9s78uylw4o7vkkwdljjy91e" :init=…

tinymce 集成 vue3 ts

首先引入 @tinymce/tinymce-vueyarn add @tinymce/tinymce-vue -S 我的版本是 然后写一个组件<template><main id="sample"><Editor v-model="editorData" api-key="j7tvgx4xnptg3cjd63cfnl62z9s78uylw4o7vkkwdljjy91e" :init=…

IBM X3650 M4服务器使用U盘重装系统教程

一、前期准备工作 1、已经制作完成的系统U盘(笔者使用魔术师制作的启动盘) 2、下载好的windows_server_2008_r2镜像 3、下载好的.M5110e阵列卡驱动 二、安装过程 1、将前期准备的镜像、阵列驱动拷贝到优盘根目录下2、优盘插入服务器后启动服务器,开机后会进入图1,等待后在图…

打开、关闭、切换App以及清除App进程,操作so easy!

有很多新手同学经常问到,如何优雅地快速打开、关闭、切换APP以及清除设备应用后台,那么本周我们来分享一下怎么优雅地实现这些操作吧此文章来源于项目官方公众号:“AirtestProject” 版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途#一、前言 很多新手…

稳定、省钱的 ClickHouse 读写分离方案:基于 JuiceFS 的主从架构实践

Jerry 是一家位于北美的科技公司,利用人工智能和机器学习技术,简化汽车保险和贷款的比价和购买流程。在美国,Jerry 的应用在其所属领域排名第一。 随着数据规模的增长,Jerry 在使用 AWS Redshift 时遇到了一些性能与成本的挑战。Jerry 重新设计了系统架构,使用 ClickHouse…

GDCL论文阅读笔记

Diffusion-Based Graph Contrastive Learning for Recommendation with Implicit Feedback论文阅读笔记 Abstract 提出问题: ​ 自监督学习模型大多采用随机辍学来构造附加的图视图,没有区分边的重要性。这些方法在捕获用户-项目交互图的结构属性方面的不足,导致了推荐性能的…

关于IDEA使用xml实现动态sql的问题

如上图,我在mapper层编写了一个list方法用于实现动态sql。 1.导入使用xml文件的mybatis依赖。 2.配置文件的修改 .properties .yml mybatis.mapper-locations=classpath:mapper/*.xml:这个配置项指定了 MyBatis 映射器 XML 文件的位置。 值 classpath:mapper/*.xml 表示 MyBa…

基于LoRa的智慧农业解决方案--ASR6601、SX1278、SX1262

我国《数字乡村发展战略纲要》明确指出“要推进农业数字化转型”,加快推广云计算、大数据、物联网、人工智能在农业生产经营管理中的运用。然而,目前我国的农业数字化转型还面临着诸多挑战。我国整体农业机械化程度和自动化控制水平仍然较低。由于农田面积广袤,大量的区域没…

服务器mac地址变化

检查是否开启了多路复用检查是否开启了随机硬件地址留待后查,同时方便他人 联系我:renhanlinbsl@163.com