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

[RK3308H_Linux] 关于8+2(8路模拟麦克风 + 2路es7243e回采)的调试心得

问题描述

RK3308H 使用8路个模拟麦克风录音,2路用es7243e做回采


解决方案:

首先先调8路模拟麦克风,根据原理图确定使用的是哪路I2S。
以下为dts配置,acodec的属性注释附上。

&acodec {status = "okay";rockchip,micbias1;rockchip,micbias2;// 该属性表明在系统休眠的时候 CODEC 不进入低功耗模式,以适应更快速的响应需求,// 适合对功耗不是很在意的场景。rockchip,no-deep-low-power;// 该属性可以让指定的 ADC group 打开一次之后就常开,主要应用于与 VAD 配合的场// 景,即在休眠的时候不关闭与 VAD 相关的 ADC,达到快速响应的功能。rockchip,en-always-grps = <0 1 2 3>;// 0 MIC1,MIC2// 1 MIC3,MIC4// 2 MIC5,MIC6// 3 MIC7,MIC8rockchip,adc-grps-route = <0 1 2 3>;// CODEC 就不会去使能 hp-det 的功能。如果目标板硬件上没有用 CODEC// 的耳机检测功能,CODEC hp-det pin 悬空,该属性强烈建议加上,否则会引起耳机插入// 误报的现象。rockchip,no-hp-det;// 选用的 PA 的启动时延不同。该属性指定了打开回采后,需要----// 等待的稳定时延才重新打开对应的 ADC,避免回采数据抖动。// rockchip,delay-loopback-handle-ms= <200>;rockchip,delay-start-play-ms = <200>;// 指定的是模拟 PA 对应的连接的 ADC group,通过这个属性,codec driver// 会在合适的时间打开回采,以节省功耗。// rockchip,loopback-grp = <1>;// 指定了控制喇叭通路的 gpio pin。在喇叭通路使能下,播放/关闭音乐的时候// #spk-ctl-gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
};acodec_sound: acodec-sound {compatible = "rockchip,multicodecs-card";rockchip,card-name = "rockchip,rk3308-acodec";rockchip,codec-hp-det;rockchip,mclk-fs = <256>;rockchip,cpu = <&i2s_8ch_2>;rockchip,codec = <&acodec>;status = "okay";
};&i2s_8ch_2 {status = "okay";
};

按照以上配置,使用cat /proc/asound/cards查看声卡是否注册成功,如果没有注册成功,使用dmesg | grep acodec进一步查询未注册成功的原因。
在这里插入图片描述
可以看到我这里是已经注册成功了。然后使用arecord -D hw:0,0 -c 8 -r 16000 -f S16_LE /oem/output.wav命令进行录音。将生成的wav文件通过adb pull出来。使用Audacity音频软件查看。
在这里插入图片描述
可以看到8个声道都能正常录制到声音。

调试过程中遇到问题有:
a.麦克风全是电流声音
b.1/3/5/7路麦克风无声音
c.8/路麦克风声音小
a问题需要让硬件检查麦克风小板的电路电阻
b/c问题是因为我们麦克风小板是手帖非机贴,贴坏了。更换之后就能正常录制到8路声音了

然后需要调试2路走es7243e_sound的回采通路,这里我按照其他dts相关配置配置es7243e_sound,

es7243_sound: es7243-sound {status = "okay";compatible = "simple-audio-card";simple-audio-card,name = "rockchip,es7243e";simple-audio-card,format = "i2s";simple-audio-card,mclk-fs = <256>;simple-audio-card,cpu {sound-dai = <&i2s_2ch_0>;};simple-audio-card,codec {sound-dai = <&es7243>;};
};&i2s_2ch_0{status = "okay";
};&i2c2 {status = "okay";es7243e: es7243e@10 {status = "okay";#sound-dai-cells = <0>;compatible = "ES7243E_MicArray_0";reg = <0x10>;};es7243e_11: es7243e@11 {status = "okay";#sound-dai-cells = <0>;compatible = "ES7243E_MicArray_1";reg = <0x11>;};es7243e_12: es7243e@12 {status = "okay";#sound-dai-cells = <0>;compatible = "ES7243E_MicArray_2";reg = <0x12>;};
};

使用 cat /proc/asound/cards发现声卡已经挂上
在这里插入图片描述
但是I2C2地址全是XX
在这里插入图片描述
这明显不对,从I2C错误码看,并没有识别到正常工作的设备或者从机地址。
然后经过曲折的示波器/逻辑分析仪排查,发现XX贴的是已经停产的es7243而非es7243e。这就很尴尬。然后等新的es7243e样品到了更换之后,I2C通信就正常了。
在这里插入图片描述
I2C通信就正常后,发现rockchip_es7243e声卡可以挂上,但是es7243e驱动在es7243e_read和es7243e_write时还是会报错误
在这里插入图片描述
这是需要找es7243e芯片顺芯FAE那边要5.10版本的7243驱动。按照提供的文档配置dts和es7243l.h。驱动一直打印找不到MCLK
在这里插入图片描述
这是在es7243l_probe里加上这个:
es7243l->sysclk = 12288000;
然后在这里加上system-clock-frequency这个属性,然后录音需要使用48k采样率。

    simple-audio-card,cpu {sound-dai = <&i2s3_2ch>;system-clock-frequency = <12288000>; };simple-audio-card,codec {sound-dai = <&dummy_codec>;system-clock-frequency = <12288000>;};

驱动不提示MCL错误了。使用arecord -D hw:1,0 -c 2 -r 48000 -f S16_LE /oem/es7243.wav命令录制出来的音频无声音。然后各种排查,各种示波器量波形,发现录音时 I2S0压根没任何波形。

最后经过排查原来用的i2s_8ch_0而非i2s_2ch_0,一直以为2路用的是2ch,原来只是使用了8ch里面的2路而已,这里调试这个浪费了很多时间,也希望大家引以为戒,先根据原理图确定到底用的是哪个I2S0
最后附上可以成功使用的dts配置

    es7243e_sound: es7243e-sound {status = "okay";compatible = "rockchip,multicodecs-card";rockchip,card-name = "rockchip,es7243e";rockchip,mclk-fs = <256>;rockchip,format = "i2s";rockchip,cpu = <&i2s_8ch_0>;rockchip,codec = <&es7243l>;};// es7243_sound: es7243-sound {// 	status = "okay";// 	compatible = "simple-audio-card";// 	simple-audio-card,name = "rockchip,es7243e";// 	simple-audio-card,format = "i2s";// 	simple-audio-card,mclk-fs = <256>;// 	simple-audio-card,cpu {// 		sound-dai = <&i2s_8ch_0>;// 	};// 	simple-audio-card,codec {// 		sound-dai = <&es7243l>;// 	};// };&i2s_8ch_0 {status = "okay";#sound-dai-cells = <0>;assigned-clocks = <&cru SCLK_I2S0_8CH_RX>;assigned-clock-parents = <&cru SCLK_I2S0_8CH_TX_MUX>;rockchip,clk-trcm = <1>;pinctrl-names = "default";pinctrl-0 = <&i2s_8ch_0_sclktx&i2s_8ch_0_lrcktx&i2s_8ch_0_sdi0&i2s_8ch_0_sdo0>;
};&i2c2 {status = "okay";es7243l: es7243l@10 {status = "okay";#sound-dai-cells = <0>;compatible = "MicArray_0";reg = <0x10>;clocks = <&cru SCLK_I2S0_8CH_TX_OUT>;clock-names = "mclk";pinctrl-names = "default";pinctrl-0 = <&i2s_8ch_0_mclk>;};
};

其中simple-audio-card和multicodecs-card2个配置都是可以正常录音的。
用TDM格式,单line传输多通道数据的话,就用simple-audio-card
用I2S格式,多line同时使用,并且每条line传输2ch的话,就用multicodecs-card

最后es7243e驱动部分需要注意es7243l.h

#define ES7243l_CHANNELS_MAX    AIN_2_CH
#define VDDA_VOLTAGE	VDDA_3V3

ES7243l_CHANNELS_MAX属性需要根据自己的声道选择,不让会跑飞。
es7243e需要将VDDA_VOLTAGE 改为VDDA_3V3。

es7243l.c驱动部分需要修改

es7243l->sysclk = 12288000;

在es7243l_probe中添加以上属性


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • UKP3D的局域网授权程序问题
  • PDF 中图表的解析探究
  • 数电票真伪查验接口、发票查验接口
  • C语言方法学习 std::vector<double> 转化double[]或double *
  • tkinter的iconbitmap默认图标
  • 彻底开源,免费商用,上海AI实验室把大模型门槛打下来
  • 实现线程同步
  • SpringMVC的架构有什么优势?——表单和数据校验(四)
  • [Vue3 + TS + Vite] 获取网页选中内容的字符串格式或HTML格式
  • android 添加一个水平线
  • 【ceph】ceph-mon重新选举的情况
  • 开发不认可bug策略
  • 在 Linux 上设置 RAID 阵列的全面指南
  • bash: redi-cli: 未找到命令...
  • Centos系统内磁盘分区
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • JavaScript标准库系列——Math对象和Date对象(二)
  • mysql_config not found
  • React组件设计模式(一)
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 第十八天-企业应用架构模式-基本模式
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 通过几道题目学习二叉搜索树
  • 异常机制详解
  • 正则学习笔记
  • # 数据结构
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #数据结构 笔记三
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (+4)2.2UML建模图
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (3)nginx 配置(nginx.conf)
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (四) Graphivz 颜色选择
  • (一) 初入MySQL 【认识和部署】
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)插入排序
  • (转)ObjectiveC 深浅拷贝学习
  • ***监测系统的构建(chkrootkit )
  • ... 是什么 ?... 有什么用处?
  • .Net Core 笔试1
  • .NET Standard 的管理策略
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET6实现破解Modbus poll点表配置文件
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @AliasFor注解
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [000-01-018].第3节:Linux环境下ElasticSearch环境搭建
  • [12] 使用 CUDA 进行图像处理
  • [2024-06]-[大模型]-[Ollama] 0-相关命令
  • [AIGC] SpringBoot的自动配置解析