当前位置: 首页 > news >正文

RK3576 Android14 DMIC调制

一、背景

近期项目中有个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.xdnf.cn/news/1015021.html

相关文章:

  • 前端构建工具Webapck、Vite——>前沿字节开源Rspack详解——2023D2大会
  • 打卡第44天:无人机数据集分类
  • android过渡动画
  • 【Pytorch】(1)Pytorch环境安装-①创建虚拟环境
  • NB-IoT-下行同步、广播信道和信号
  • Volta 管理 Node 版本最佳实践教程
  • 【CATIA的二次开发28】抽象对象Document涉及应用程序连接的属性
  • python中的面向对象:继承、封装、多态
  • 中小企业数字化转型:如何选择靠谱的软件开发服务商?
  • 【知识图谱构建系列2】LLM4KGC项目安装运行
  • Profinet转Modbus网关:破解热处理炉协议壁垒的温控通讯密码
  • Python图片格式转换工具深度解析[附源码】
  • Blender 4.4.3三维动画建模和渲染软件Win/Mac双端资源下载
  • RDMA简介7之RoCE v2可靠传输
  • 包含11个整套APP移动端UI的psd适用于旅行聊天交友相关的社交应用程序
  • 机器学习中的数据准备关键技术
  • iOS性能调试完整流程实录:工具组合下的问题定位与修复实践(含keymob)
  • 云端求解热方程:源于傅里叶的洞察-AI云计算数值分析和代码验证
  • 前端处理后端对象类型时间格式通用方法封装,前端JS处理JSON 序列化后的格式 java.time 包中的日期时间类
  • TensorFlow 与 PyTorch区别
  • 新书速览|大模型核心技术与开发实践:基于Transformer、PyTorch及Hugging Face
  • 哈希表三种数据结构在leetcode中的使用情况分析
  • 【Linux】进程创建、终止、等待、替换
  • 精品可编辑PPT | 基于人工智能及大数据的综合智能交通管理平台AI大数据平替智慧交通
  • Text2SQL、Text2API基础
  • Windows安装Oracle19
  • Linux服务器如何诊断和解决网络问题
  • 应用探析|千眼狼高速摄像机、sCMOS相机、DIC测量、PIV测量在光学领域的应用
  • 04 - CoordAttention模块
  • 职业技能大赛视角下:高职院校课堂教学破局与提质之路