一、背景

近期项目中有个DMIC调试的需求,搁置了较长时间,现今着手调试,遂作记录。

二、开发环境

OS:Android14

Platform:RK3576

Linux Version:6.1.99

SDK Version:android-14.0-mid-rkr6

三、开发资料

DIMC选取:LMD2718T261-OA1

  

硬件实物以及封装可在立创商城中查看

LMD2718T261-OA1中文资料_最新报价_数据手册下载_LinkMems(聆麦声学)-MEMS麦克风-立创商城

首先我们先了解一下什么是数字麦(DMIC)。传统上两类常见的麦克风分为模拟麦(AMIC)和数字麦(DMIC)。根据信号处理方式和工作原理,将声波转换为模拟电信号(电压变化)为模拟麦,这个需要外接ADC才能被数字设备处理;而直接将声波转换为数字信号的则是数字麦,其通过内置ADC模数转换芯片来实现功能。当然,除了这两类,麦克风还有各种各样的类型,诸如光学麦克风、铝带麦克风、碳粒麦克风等等,有兴趣者可以了解一下。本次使用的LMD2718T261-OA1则是DMIC类。

LMD2718T MEMS麦克风采用集成化专用前置放大ASIC芯片设计,通过电容式音频传感器实现高灵敏度、高信噪比(SNR)的信号输出。该产品采用表面贴装(SMT)封装,支持高温回流焊工艺,并输出单比特PDM(脉冲密度调制)格式数字信号。

详细的内容,可以在网上找到其对应的数据手册:

LMD2718T261-OA1 -PDF数据手册-参考资料-立创商城

在数据手册中查找,可以看到该芯片硬件连接简单原理如下图所示:

鉴于保密原则,这里不展示具体实际的硬件原理图。其中我们实际接到RK主板CPU上的两路引脚为CLK和DATA引脚,直连主板PDM接口。可见,这是以纯PDM麦的方式来做适配,在逻辑上可以较为简化一些。

四、软件调试

既然是作为纯PDM麦来调试,那配置上则可以则能简化不少的步骤。在下的配置如下所示:

pdmics: dummy-codec {status = "okay";compatible = "rockchip,dummy-codec";#sound-dai-cells = <0>;};pdm_mic_array: pdm-mic-array {status = "okay";compatible = "simple-audio-card";simple-audio-card,name = "rockchip,pdm-mic-array";simple-audio-card,cpu {sound-dai = <&pdm1>;};simple-audio-card,codec {sound-dai = <&pdmics>;};};&pdm1 {status = "okay";rockchip,path-map = <1 0 2 3>;pinctrl-names = "default";pinctrl-0 = <&pdm1m1_sdi1&pdm1m1_clk0>;};

由于采用纯PDM麦,不经过解码芯片而是直连主板CPU,那么我们直接使用RK自带的PCM编解码,声卡上使用默认声卡即可。而芯片的DATA和CLK引脚则是连到接到主板的pdm1m1_sdi1和
pdm1m1_clk0,记得在pdm1节点中使能。

之后,编译代码并烧录镜像,发现PDM声卡已经配置出来了:

使用tinycap工具来录音,如下

tinycap /sdcard/rec.wav -D 1 -d 0 -c 2 -r 44100 -b 16 -p 1024 -n 3

各参数说明如下:

# -D 声卡序号/声卡名
# -d 设备名
# -c 声道数量,一般为偶数
# -r 采样率
# -b 位深
# -p 周期
# -n 跳过周期数
# -T 录音时间,单位秒;缺省后时间无限延长

录音期间,通过Ctrl+C来结束

音频文件保存之后,使用tinyplay工具播放:

tinyplay /sdcard/rec.wav -D 1 -d 0 -p 1024

当然,简单点的话也可以直接使用系统自带的录音机来试试看,正常配置成功的话使用是没有问题的。

此时发现一个问题,录出来的音频文件播放没有声音,改用8声道来录制,也没有。

通过与原厂沟通后,需合入如下补丁,把pdm的音量设置加上:

diff --git a/kernel-6.1/sound/soc/rockchip/rockchip_pdm_v2.c b/kernel-6.1/sound/soc/rockchip/rockchip_pdm_v2.c
--- a/kernel-6.1/sound/soc/rockchip/rockchip_pdm_v2.c
+++ b/kernel-6.1/sound/soc/rockchip/rockchip_pdm_v2.c
@@ -821,6 +821,14 @@ static int rockchip_pdm_v2_probe(struct platform_device *pdev)*/pdm->version = (pdm->version >> 16) & 0xffff;+       if (pdm->version == RK3506_PDM) {
+               regmap_update_bits(pdm->regmap, PDM_V2_GAIN_CTRL,
+                       PDM_V2_GAIN_CTRL_MSK, PDM_V2_GAIN_CTRL_0DB);
+       } else if (pdm->version == RK3576_PDM) {
+               regmap_update_bits(pdm->regmap, PDM_V2_FILTER_CTRL,
+                       PDM_V2_GAIN_MSK,PDM_V2_GAIN_0DB);
+       }
+ret = rockchip_pdm_v2_path_parse(pdm, node);if (ret != 0 && ret != -ENOENT)goto err_hclk;
diff --git a/kernel-6.1/sound/soc/rockchip/rockchip_pdm_v2.h b/kernel-6.1/sound/soc/rockchip/rockchip_pdm_v2.h
index 86bf17918e1..c2def866da2 100644
--- a/kernel-6.1/sound/soc/rockchip/rockchip_pdm_v2.h
+++ b/kernel-6.1/sound/soc/rockchip/rockchip_pdm_v2.h
@@ -150,5 +150,6 @@#define PDM_V2_GAIN_CTRL_SHIFT         1#define PDM_V2_GAIN_CTRL_MIN           0#define PDM_V2_GAIN_CTRL_MAX           0x7f
+#define PDM_V2_GAIN_CTRL_0DB (175 << 0)#endif

之后我们重新编译验证,发现DMIC的录音功能可以正常使用了。

至此,基本完成了这个DMIC的调试,后续有何问题,则继续补充。

五、参考资料:

模拟mic和数字mic有什么区别? mems属于哪一种? - 知乎https://zhuanlan.zhihu.com/p/631940614【嵌入式】AMIC和DMIC(什么是数字麦和模拟麦)_dmic和amic区别-CSDN博客https://blog.csdn.net/tangta789/article/details/127383734?ops_request_misc=%257B%2522request%255Fid%2522%253A%25225463db69a12347742cc3a030bd0d5803%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=5463db69a12347742cc3a030bd0d5803&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-127383734-null-null.nonecase&utm_term=%E4%BB%80%E4%B9%88%E6%98%AF%E6%95%B0%E5%AD%97%E9%BA%A6&spm=1018.2226.3001.4450

RK3568平台 麦克风PDM接口录音_rk pdm配置_rk3568 pdm-CSDN博客https://blog.csdn.net/2401_83817122/article/details/137404144?ops_request_misc=%257B%2522request%255Fid%2522%253A%252236f10c4ea5447fb2cd1c55d2bd095366%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=36f10c4ea5447fb2cd1c55d2bd095366&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-3-137404144-null-null.nonecase&utm_term=RK3568%20PDM%E9%85%8D%E7%BD%AE&spm=1018.2226.3001.4450RK3568平台(音频篇)麦克风PDM接口录音_rk3568 支持pdm数字mic-CSDN博客https://blog.csdn.net/weixin_49303682/article/details/135875205?ops_request_misc=%257B%2522request%255Fid%2522%253A%252236f10c4ea5447fb2cd1c55d2bd095366%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=36f10c4ea5447fb2cd1c55d2bd095366&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-4-135875205-null-null.nonecase&utm_term=RK3568%20PDM%E9%85%8D%E7%BD%AE&spm=1018.2226.3001.4450

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

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

相关文章

使用 Prometheus 监控 Spring Boot 应用

SpringBoot+Prometheus+Grafana实现监控 逻辑如图 应用程序在生产环境中运行时,监控其运行状况是非常必要的。通过实时了解应用程序的运行状况,才能在问题出现之前得到警告,也可以通监控应用系统的运行状况,优化性能,提高运行效率。 一、监控 Spring Boot 应用 下面我们…

简易计算器 Python 实现

目录 一、代码逐步分析&#xff08;适合刚入门的朋友看&#xff09; 1.定义了一个名为simple_calculator的函数&#xff0c;封装了整个计算器的逻辑。 二、深入分析代码块&#xff0c;用更加官方的语词来说&#xff08;适合想要深入学习的朋友&#xff09; 主循环结构 退出…

开源编译器介绍

文章目录 基本构成传统编译器编译器的发展历史&#xff08;History of Compiler&#xff09;GCC 编译过程与原理&#xff08;GCC Process and Principle&#xff09;LLVM/Clang 编译过程与原理&#xff08;LLVM/Clang Process and Principle&#xff09;GCC与与 LLVM/Clang 的对…

C++ String知识点

当然可以&#xff01;下面我将以系统全面、通俗易懂、深入浅出的方式&#xff0c;为你讲解 C 中非常核心但也容易被低估的内容 —— std::string。 &#x1f31f; C std::string 全面详解 &#x1f4cc; 一、string 是什么&#xff1f; C 的 std::string 是 C 标准库中封装好…

全新NVIDIA Llama Nemotron Nano视觉语言模型在OCR基准测试中准确率夺冠

全新NVIDIA Llama Nemotron Nano视觉语言模型在OCR基准测试中准确率夺冠 PDF、图表、图形和仪表板等文档是丰富的数据源&#xff0c;当这些数据被提取和整理后&#xff0c;能够为决策制定提供有价值的洞察。从自动化财务报表处理到改进商业智能工作流程&#xff0c;智能文档处…

gradle的 build时kaptDebugKotlin 处理数据库模块

gradle的 build时输出&#xff1a; Task :app:kaptDebugKotlin 注: Processing class HDCoinBean 注: Processing class HDCurrencyBean 注: Processing class HDSelfAddCoin 注: Processing class MN 注: Creating DefaultRealmModule <—> 80% EXECUTING [7m 56s] IDLE…

二叉树的节点操作算法

235. 二叉搜索树的最近公共祖先 力扣题目链接(opens new window) 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大…

【ubuntu驱动安装】安装nvidia驱动和cuda环境

1、安装驱动 首先查看环境和显卡&#xff1a; 更新apt 查看nouveau是否禁用 如果有返回值禁用nouveau(nouveau是通用的驱动程序)&#xff08;必须&#xff09;&#xff0c;两种文件&#xff0c;22.04是下面那个 添加如下&#xff1a; 终端输入后更新 重启电脑sudo reboo…

力扣HOT100之终章:一些随笔

今天终于把力扣HOT100系列给刷完了&#xff0c;每一道题都记录了自己的思考过程和解题过程中参考的一些题解和视频&#xff0c;方便自己以后再刷的时候快速复习&#xff0c;从2025年3月4日写下第一篇博客&#xff0c;到2025年6月12日完成最后一题并写下最后一篇博客&#xff0c…

榕壹云家政系统:基于Spring Boot与UniApp的智能家政服务解决方案

在数字化浪潮下&#xff0c;传统家政行业正面临效率与服务质量的升级挑战。榕壹云公司依托前沿技术&#xff0c;推出了一款用户端与师傅端二合一的家政服务小程序&#xff0c;通过整合预约上门、分销、储值、优惠券等功能&#xff0c;为家政服务行业提供了一套高效、灵活的数字…

CSRF扩展 JSONP劫持

介绍&#xff1a;JOSNP&#xff08;JSONP with Override Security Negotiation Protocol&#xff09;劫持是一种利用JSONP &#xff08;JSON with Padding&#xff09;跨域数据获取机制的安全漏洞&#xff0c;攻击者通过篡改或伪造JSONP回调函数窃 取用户敏感数据。由于JSONP…

HTTP/HTTPS 协议解析

前言 在当今互联网时代&#xff0c;HTTP/HTTPS 协议作为 Web 通信的基石&#xff0c;承载着几乎所有的网络内容传输。对于我们而言&#xff0c;深入理解这些协议不仅是技术素养的体现&#xff0c;更是构建高性能、安全、可靠 Web 应用的必要条件。 为什么我们需要深入了解 HT…

Flask-login 处理授权逻辑

认证 vs 授权&#xff1a; 在 Web 应用程序的安全机制中&#xff0c;认证&#xff08;Authentication&#xff09; 和 授权&#xff08;Authorization&#xff09; 是两个核心概念&#xff0c;它们虽然紧密相关&#xff0c;但职责和作用不同。 认证&#xff08;Authenticatio…

xenomai3+linux构建linux实时操作系统-基于X86_64和arm

简介&#xff1a; Xenomai是一个实时性解决方案&#xff0c;通过在Linux上添加实时内核Cobalt来增强实时性能。它有三个主要部分&#xff1a;libcobalt&#xff08;用户空间实时库&#xff09;、Cobalt&#xff08;内核空间实时内核&#xff09;和硬件架构特定层&#xff08;ip…

Linux核心文件(core file)详解

一、核心文件&#xff08;core file&#xff09;概述 1.1 什么是核心文件 核心文件&#xff08;core file&#xff09;是Linux操作系统在程序崩溃时生成的一种转储文件。它包含了程序崩溃时的内存内容、寄存器状态和执行状态。通过分析核心文件&#xff0c;开发者可以找到程序…

java中跨域问题及解决方案

1. 什么是跨域 从不同的地址访问另外一个地址就是跨域 2.跨域一定会有异常吗 跨域异常只会在前端发生&#xff0c;后端跨域不会产生异常 因为浏览器有一个叫做同源策略的东西&#xff0c;它发现不同域之间的访问是不安全的行为&#xff0c;会禁止&#xff0c;所以会抛出异常…

网络层协议 IP 协议介绍 -- IP 协议,网段划分,私有 IP 和 公网 IP,路由

目录 1 IP 协议 1.1 IP 协议格式 2. 网段划分 2.1 网络号和主机号 2.2 传统 IP 地址分类和 CIDR 技术 2.3 特殊的 IP 地址 2.4 IP 地址的数量限制 2.5 私有 IP 和公网 IP 3. 路由 网络层主要作用是实现不同局域网之间的通信连接&#xff0c;并为数据在复杂网络环境中的…

【案例分享】KMDA-7611-S001--高性能嵌入式电脑助力双臂轮式人形机器人应用

智能制造时代&#xff0c;双臂轮式机器人需求浮出水面 随着制造业、物流业和电子商务的飞速发展&#xff0c;智能搬运机器人正成为行业降本增效的核心工具。它们不仅解决了传统物流中效率低、成本高、安全性差等痛点&#xff0c;更通过智能化与可扩展性设计&#xff0c;通过自主…

iOS App上线前的安全防线:项目后期如何用Ipa Guard与其他工具完成高效混淆部署

对大多数iOS开发者来说&#xff0c;安全并不是开发早期就能解决的问题。尤其在项目逐步进入上线准备阶段后&#xff0c;才开始集中考虑逆向破解、资源泄露等安全隐患的解决方案。这个阶段往往时间紧张、结构复杂&#xff0c;再要重构源码或引入大规模修改几乎不现实。因此&…

技术佃农时代:当云计算成为新型地主经济

技术佃农时代:当云计算成为新型地主经济 导语:当算力成为生产资料,云账单背后的「数字佃租」正悄然重塑IT生产关系——我们是否在用自己的代码为云厂商开垦数字荒地? 一、揭开云计算的「佃租算法」面纱 // 云经济体的核心收割逻辑 public class CloudLandlord {public sta…