stm32mp157 wm8960音频驱动调试笔记

2023-05-16

这次调试wm8960音频驱动遇到了好多的坑,研究好几天终于调试好了。

驱动调试步骤

驱动能不能成功加载是调试的第一大步骤,也是最关键的步骤之一。
1.查看硬件原理图:
在这里插入图片描述

2.打开对应的设备树(stm32mp157a-xxx.dtsi):
因为wm8960是挂载到I2C4上,所以在设备树I2C4节点上添加wm8960设备节点。

wm8960: wm8960@1a {
        compatible = "wlf,wm8960";
        reg = <0x1a>;
        #sound-dai-cells = <0>;
        status = "okay";
		wlf,shared-lrclk;
	 	clocks = <&sai2a>;
		clock-names = "mclk";
	        port {
	            #address-cells = <1>;
	            #size-cells = <0>;
		wm8960_tx_endpoint: endpoint@0 {
						reg = <0x0>;
						remote-endpoint = <&sai2b_endpoint>;
						frame-master;
						bitclock-master;
					};
	
		wm8960_rx_endpoint: endpoint@1 {
						reg = <0x1>;
						remote-endpoint = <&sai2a_endpoint>;
						frame-master;
						bitclock-master;
					};
	        };
    };

其中节点的clocks =< sai2a >是需要看原理图使用的是SAI2A 还是SAI2B作为主时钟。

3.SAI2配置:

&sai2 {
    clocks = <&rcc SAI2>, <&rcc PLL3_Q>, <&rcc PLL3_R>;
    clock-names = "pclk", "x8k", "x11k";
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&sai2a_pins_a>, <&sai2b_pins_b>;
    pinctrl-1 = <&sai2a_sleep_pins_a>, <&sai2b_sleep_pins_b>;
    status = "okay";

    sai2a: audio-controller@4400b004 {
    dma-names = "rx";
	#clock-cells = <0>;
        clocks = <&rcc SAI2_K>;
        clock-names = "sai_ck";
        status = "okay";

        sai2a_port: port {
            sai2a_endpoint: endpoint {
                remote-endpoint = <&wm8960_rx_endpoint>;
                format = "i2s";
                mclk-fs = <256>; 
                dai-tdm-slot-num = <2>;
                dai-tdm-slot-width = <16>;
            };
        };
    };
    sai2b: audio-controller@4400b024 {
        dma-names = "tx";
        st,sync = <&sai2a 2>;
        clocks = <&rcc SAI2_K>, <&sai2a>;
        clock-names = "sai_ck", "MCLK";
        status = "okay";
        sai2b_port: port {
            sai2b_endpoint: endpoint {
                remote-endpoint = <&wm8960_tx_endpoint>;
                format = "i2s";
                mclk-fs = <256>;
                dai-tdm-slot-num = <2>;
                dai-tdm-slot-width = <16>;
            };
        };
    };
};

其中比较重要的是sai2a,sai2b的输入输出问题,上述原理图描述的是sai2a作为ADC(capture),sai2b作为DAC(playback),所以,此时sai2a节点中的dma-names = ‘tx’,sai2b则是dma-names = ‘rx’,另外还有st,sync = <&sai2a 2>;
这里可以参考内核源码路径:Documentation/devicetree/bindings/sound/st,stm32-sai.txt文档

4.sound节点配置

  sound: sound {
        compatible = "audio-graph-card";
        label = "wm8960-audio";
       	mclk-fs = <256>;
	dai-format = "i2s";
	widgets =
            "Microphone", "Mic Jack",
            "Line", "Line In",
            "Line", "Line Out",
            "Speaker", "Speaker",
            "Headphone", "Headphone Jack";
        routing =
            "Headphone Jack", "HP_L",
            "Headphone Jack", "HP_R",
            "Speaker", "SPK_LP",
            "Speaker", "SPK_LN",
            "Speaker", "SPK_RP",
            "Speaker", "SPK_RN",
            "LINPUT1", "MICB",
            "LINPUT3", "MICB";
        dais = <&sai2a_port &sai2b_port>; 
        status = "okay";
    };

5.配置引脚(stm32mp15-pinctrl.dtsi):

sai2a_pins_a: sai2a-0 {
		pins {
			pinmux = <STM32_PINMUX('I', 6, AF10)>; /* SAI2_SD_A */		 
			bias-disable;
			drive-push-pull;
			slew-rate = <0>;
		};
	};

	sai2a_sleep_pins_a: sai2a-1 {
		pins {
			pinmux = <STM32_PINMUX('I', 6, ANALOG)>; /* SAI2_SD_A */
			
		};
	};
	sai2b_pins_b: sai2b-2 {
		pins {
			pinmux = <STM32_PINMUX('E', 11, AF10)>, /* SAI2_SD_B */
				 <STM32_PINMUX('I', 5, AF10)>, /* SAI2_SCK_A */ 
				 <STM32_PINMUX('I', 7, AF10)>, /* SAI2_FS_A */
				 <STM32_PINMUX('E', 0, AF10)>; /* SAI2_MCLK_A */
				bias-disable;
				drive-push-pull;
				slew-rate = <0>;
		};
	};

	sai2b_sleep_pins_b: sai2b-3 {
		pins {
			pinmux = <STM32_PINMUX('E', 11, ANALOG)>, /* SAI2_SD_B */
				  <STM32_PINMUX('I', 5, ANALOG)>, /* SAI2_SCK_A */ 
				 <STM32_PINMUX('I', 7, ANALOG)>, /* SAI2_FS_A */
				 <STM32_PINMUX('E', 0, ANALOG)>; /* SAI2_MCLK_A */
				
		};
	};

6.查看启动信息:
在这里插入图片描述
如果出现上述的启动打印信息,证明wm8960驱动加载成功了。接下来看看有无有出现声卡节点。

[root@stm32mp157]:~# ls /dev/snd/
by-path/   controlC0  pcmC0D0c   pcmC0D1p   timer

pcmC0D0c 是录音设备
pcmC0D1p 是播放设备

[root@stm32mp157]:~# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: wm8960audio [wm8960-audio], device 1: 4400b024.audio-controller-wm8960-hifi wm8960-hifi-1 [4400b024.audio-controller-wm8960-hifi wm8960-hifi-1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
[root@stm32mp157]:~# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: wm8960audio [wm8960-audio], device 0: 4400b004.audio-controller-wm8960-hifi wm8960-hifi-0 [4400b004.audio-controller-wm8960-hifi wm8960-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

声卡0,设备0 -->是录音设备
声卡0,设备1 -->是播放设备

7.故障问题
如果使用命令:aplay xxx.wav,一直卡在命令行不结束,没有任何的报错信息,你需要查看原理图,是否对应设备树的配置问题。
如果aplay xxx.wav ,出现以下报错信息:
[root@-stm32mp157]:~# aplay -Dhw:0.0 /usr/share/sounds/alsa/Rear_Right.wav
ALSA lib …/…/…/alsa-lib-1.2.1.2/src/pcm/pcm_hw.c:1829:(_snd_pcm_hw_open) Invalid value for card
aplay: main:828: audio open error: No such device
需要使用aplay -l 查看播放的设备号,查看/etc/asound.conf配置的是否正确。可以使用命令 aplay -Dhw:0.1 xxx.wav 来指定设备播放。

asound.conf配置文件

曾经驱动加载也成功了,就是没有声音,查了硬件和驱动都没有什么问题,alsamixer也设置了声音的高低,还是不行,发现asound.conf也会有一定的影响。

pcm.dmix_44100{
type dmix
ipc_key 5678293
ipc_key_add_uid yes
slave{
pcm "hw:0,0"
period_time 40000
buffer_time 360000
format S16_LE
rate 44100
}
}
pcm.!dsnoop_44100{
type dsnoop
ipc_key 5778293
ipc_key_add_uid yes
slave{
pcm "hw:0,1"
period_time 40000
buffer_time 360000
format S16_LE
rate 44100
}
}
pcm.asymed{
type asym
playback.pcm "dmix_44100"
capture.pcm "dsnoop_44100"
}

pcm.dsp0{
type plug
slave.pcm "asymed"
}

pcm.!default{
type plug
route_policy "average"
slave.pcm "asymed"
}

ctl.!default{
type hw
card 0
}

ctl.mixer0{
type hw
card 0
}

心得体会

当遇到问题的时候,不要急,驱动打印信息会帮你找到失败的原因,还是不行的话,可以参考别人成功的案例,在硬件电路改成一样的,看是否是硬件或者芯片的问题。

附上wm8960驱动文件和asound.conf的配置文件链接:wm8960驱动文件及asound.conf配置文件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32mp157 wm8960音频驱动调试笔记 的相关文章

  • git 添加更新子模块

    添加submodule到仓库 下载父仓库 git clone git 64 gitlab span class hljs preprocessor abc span span class hljs preprocessor com span
  • Docker容器图像界面显示到宿主机屏幕配置方法——挂载方式

    原理简介 可以把docker镜像看做一台没配显示器的电脑 xff0c 程序可以运行 xff0c 但是没地方显示 而linux目前的主流图像界面服务X11又支持 客户端 服务端 xff08 Client Server xff09 的工作模式只
  • JETSON TX2卸载原有的opencv安装opencv3.2

    参考博客 xff1a http blog csdn net u014613745 article details 78310916 http blog csdn net public669 article details 99044895
  • Ubuntu使用ros进行多电脑IP通信

    TUF Gaming是我的笔记本 xff0c master是实验室的主机 xff0c 在同学komorebi fresh xff08 https me csdn net weixin 44270815 xff09 的帮助下把我自己的笔记本和
  • Mavros与无人机

    记录一些mavros与无人机的指令 xff0c 这篇博客只是起备忘录的作用 飞控接口赋权 span class token function sudo span span class token function chmod span 77
  • Ubuntu18.04安装ax200网卡驱动以及更新内核

    Ubuntu18 04安装ax200网卡驱动以及更新内核 参考资料 xff1a https zhangyiming748 github io 2019 12 05 useAX200OnUbuntu 原来的网卡是小螃蟹的8822ce xff0
  • 笔记:QGC使用及姿态环仿真调节方式

    笔记 xff1a QGC使用及姿态环仿真调节方式 打开Gazebo及QGC 进入终端管理员权限 sudo s 在终端打开Gazebo cd Firmware make px4 sitl default gazebo 点击文件夹中的QGC x
  • PIX4飞控调参

    飞控调参
  • nano板载电脑连接无线时断时续

    在无人机上使用nano b01板载电脑 xff0c 在地面站电脑上ssh板载电脑名字及ip地址可进入地面站电脑 通过在两个电脑的 bashrc文件中加入主从节点ip xff0c 实现ros通信 xff0c 想要实现用地面站电脑控制板载电脑
  • 树莓派小车————避障篇

    避障模块的功能就是让小车能够检测到障碍物并且可以正确的避开障碍物 当然避障的方式有很多种 我选择的是超声波结合红外传感器来避障 为什么要用超声波传感器结合红外传感器 xff1f 因为硬件原因 xff0c 没有舵机 xff0c 原本超声波可以
  • 睿尔曼超轻量仿人机械臂--Realsense D435手眼标定

    目录 1 环境要求 2 概述 3 开始前准备 4 aruco ros配置 5 easy handeye配置 6 启动相关launch文件开始标定 1 环境要求 本教程主要介绍RM机械臂与Realsense D435相机手眼标定的配置及方法
  • Docker容器-------dockerfile概念简介

    文章目录 引言一 dockerfile概念二 Docker镜像的创建1 基于现有镜像创建2 基于本地模板创建3 基于dockerfile创建3 1 dockerfile结构 xff08 四部分 xff09 3 2 构建镜像命令 三 Dock

随机推荐

  • 关联github与dockerhub生成镜像

    首先登录dockerhub xff0c 按照下面的步骤 xff0c 绑定github账户 然后选择Create Create Automated build xff0c 选中指定的dockerfile项目 选中指定的Dockerfile自动
  • VSCode远程连接Gitee

    目录 1 gitee介绍2 准备3 生成ssh公钥4 添加公钥5 初始化git6 关联远程仓库7 推送更新的代码8 拉取远程仓库代码9 移除远程连接 1 gitee介绍 Gitee xff08 码云 xff09 是开源中国 xff08 OS
  • 从零开始搭建ROS下Intel RealSense D435i的使用环境(全安装流程记录)

    文章目录 一 Ubuntu16 04安装二 Ubuntu16 04下的ROS安装三 cmake升级替换四 相机SDK安装 xff08 注意 xff1a 安装时不要连接相机 xff09 五 安装对应的ROS接口六 关闭红外结构光参考文章 为了
  • 解决fp = builtins.open(filename, “w+b“)FileNotFoundError: [Errno 2] No such file or directory:

    最近在做一些关于图像处理方面的问题 xff0c 用到了python中的PIL库对图像进行保存 xff0c 代码如下 span class token comment 新建一张图片 span GroundImg span class toke
  • python-旋转图像并裁剪出黑色边框

    在进行旋转图像时 xff0c 遇到了旋转后的图像存在黑边的情况 xff0c 上网查了很多方法 xff0c 找到了这个方法是比较好的 xff0c 附上链接添加链接描述 span class token keyword def span spa
  • 解决NetworkX遇到 AttributeError: ‘Graph‘ object has no attribute ‘node‘ 问题

    学习NetworkX时 xff0c 查看结点属性时遇到了报错 xff1a AttributeError Graph object has no attribute node G span class token operator 61 sp
  • Docker的安装以及可视化图形界面的安装

    Dockerd的主要作用 xff1a 起到一个 容器 xff08 代码 43 环境 xff09 的作用 xff0c 解决了软件跨环境迁移导致的版本不兼容等问题 使用沙箱机制 xff0c 相互之间没有任何接口 xff0c 且性能开销极低 Do
  • MySQL数据库忘记密码后,如何修改密码

    MySQL修改密码 xff08 本人亲身试验可行 xff01 xff09 1 以管理员身份打开命令行 2 在命令行中进入MySQL的bin目录所在文件夹 即 xff1a 在命令行中输入 xff1a cd 路径 路径查找如下 xff1a 命令
  • 人工智能_03

    逻辑回归 xff08 用于解决分类问题的一种模型 xff0c 核心 xff1a 找到决策边界 xff09 根据数据的特征或者属性 xff0c 计算出其归属于某一类别的概率 P x P x P x
  • 人工智能_04

    无监督学习 xff08 Unsupervised Learning xff09 机器学习的一种方法 xff0c 没有给定事先标记过的训练示例 xff0c 自动对输入的数据进行分类或分群 优点 xff1a 算法不受监督信息 xff08 偏见
  • 远程连接本地以及其他机器上的Ubuntu虚拟机

    连接本机的Ubuntu虚拟机 xff1a 1 查看Ubuntu虚拟机是否安装了ssh服务 xff1a service sshd status 2 安装ssh服务 sudo apt get install openssh server 3 开
  • 注册中心Nacos

    注册中心 nacosNacos注册中心与配置中心nocos优点与缺点启动docker镜像测试linux windows下单机启动应用启动个报错nacos如何修改用户名密码 nacos Nacos注册中心与配置中心 nacos官方文档 Nac
  • git常见问题

    git常见错误 1 在git pull时遇到fatal refusing to merge unrelated histories错误 意思是 xff1a 拒绝合并不相关的分支 表示要合并的本地分支和远程分支是相互独立而不是相关联的 我的情
  • PID 控制器

    本文参考 xff1a 从不懂到会用 xff01 PID从理论到实践 哔哩哔哩 bilibili 目录 1 PID控制器入门 1 1 PID控制器的引入 1 2 PID控制器适用系统 1 3 PID控制器宏观意义 2 PID控制器的必备知识
  • Linux - 第11节 - 网络入门

    目录 1 计算机网络背景 1 1 网络发展 1 2 认识 34 协议 34 2 网络协议初识 2 1 协议分层 2 2 OSI七层模型 2 3 TCP IP五层 xff08 或四层 xff09 模型 3 网络传输基本流程 3 1 同局域网的
  • 【经典问题:汉诺塔】C语言编写程序实现汉诺塔问题——函数递归

    汉诺塔 xff08 Tower of Hanoi xff09 xff0c 又称河内塔 xff0c 是一个源于印度古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子 xff0c 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘 大梵
  • 1.语音增强技术概述

    一 语音增强发展历史 1987年 xff1a Lim和Oppenheim发表语音增强的维纳滤波方法 xff1b 1987年 xff1a Boll发表谱减法 xff1b 1980年 xff1a Maulay和Malpass提出软判决噪声一直方
  • PCB软件对比分析(AD、Pads、Allegro)

    文章目录 前言一 国内的EDA软件市场二 Altium三 Mentor四 Candence总结 前言 今天来说一说国内用的最多的三款PCB软件对比 一 国内的EDA软件市场 国内的EDA软件几乎被三家瓜分 1 Altium 2 Canden
  • (二)立创EDA之新建工程,原理图,PCB

    文章目录 前言一 界面介绍二 工程广场介绍三 新建工程3 1 修改图纸属性 四 基本的操作介绍4 1 添加器件4 2 连接导线4 3 添加插针4 4 查看封装4 5 修改封装 五 原理图转PCB5 1设置PCB高亮显示元器件5 2 布局传递
  • stm32mp157 wm8960音频驱动调试笔记

    这次调试wm8960音频驱动遇到了好多的坑 xff0c 研究好几天终于调试好了 驱动调试步骤 驱动能不能成功加载是调试的第一大步骤 xff0c 也是最关键的步骤之一 1 查看硬件原理图 2 打开对应的设备树 xff08 stm32mp157