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

news2024/9/23 15:24:09

问题描述

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,MIC8
	rockchip,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中添加以上属性


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CCNA-2-V7-模块7–9:可用且可靠的网络考试答案

1.一台启用了DHCP的客户端PC刚刚启动。客户端PC在与DHCP服务器通信时,将在哪两个步骤中使用广播消息?(选两个。) DHCPDISCOVERDHCPACKDHCPOFFERDHCPREQUESTDHCPNAK 2.管理员发出命令:管理员想达到什么目的? Router(config)# interface g0/1 Router(config-if)# ip address …

智充科技营收增速放缓:经营成本飙升,应收账款大幅增长

《港湾商业观察》黄懿 6月10日&#xff0c; XCHG Limited 智能充电有限公司(下称&#xff1a;智充科技)在美国证监会(SEC)更新招股书&#xff0c;拟在美国纳斯达克上市&#xff0c;其股票代码为“XCH”。北京智充科技有限公司为其国内运营主体&#xff08;下称“北京智充科技”…

深入理解Java集合框架:构建高效、灵活的数据管理方案

深入理解Java集合框架&#xff1a;构建高效、灵活的数据管理方案 引言 Java集合框架&#xff08;Java Collections Framework, JCF&#xff09;是Java语言提供的一套用于表示和操作集合的统一架构。它包含了一系列的接口和类&#xff0c;用于存储和操作对象集合&#xff0c;如…

两个视频怎么剪辑成一个视频?3个方法分享

两个视频怎么剪辑成一个视频&#xff1f;将两个视频剪辑成一个视频&#xff0c;是现代数字内容创作中的高频需求&#xff0c;它不仅简化了素材管理&#xff0c;还能通过创意剪辑提升作品连贯性与表现力。通过精心编排&#xff0c;两个视频片段可以无缝融合&#xff0c;讲述更完…

DolphinScheduler本地安装部署与远程任务调度管理实践应用

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

MES系统与其他系统的集成:提升制造业智能化的关键路径

在当今高度竞争的制造业环境中&#xff0c;企业对于生产效率、质量控制、资源优化以及快速响应市场变化的需求日益迫切。制造执行系统&#xff08;MES&#xff09;作为连接企业计划层与车间控制层的重要桥梁&#xff0c;其在提升生产透明度和优化生产流程方面发挥着不可替代的作…

DOM元素可编辑自定义样式获取编辑后的数据

内容比较多&#xff0c;好好看看&#xff0c;收获匪浅 前言&#xff1a;有这么一个场景&#xff0c;比如一个dom元素是可以编辑的&#xff0c;并且编辑样式得自己写一下&#xff0c;这时候我们考虑单独写一套div来控制编辑样式和编辑的内容。内部有很多的span节点需要渲染&…

elasticsearch 查询超10000的解决方案

前言 默认情况下&#xff0c;Elasticsearch集群中每个分片的搜索结果数量限制为10000。这是为了避免潜在的性能问题。 但是我们 在实际工作过程中时常会遇到 需要深度分页&#xff0c;以及查询批量数据更新的情况 问题&#xff1a;当请求form size >10000 时&#xff0c…

Linux环境下Oracle 11g的离线安装与配置历程

在成功体验了 Windows 版本的Oracle 11g 后&#xff0c;这几天心血来潮&#xff0c;决定再挑战一下Linux 环境下的安装&#xff0c;特别是在考虑到部门内部虚拟机无法联网的情况下&#xff0c;我选择了在CentOS 7上进行离线安装。这次安装之旅&#xff0c;主要参考了下面大佬的…

异步日志:性能优化的金钥匙

一、背景 2024 年 4 月的一个宁静的夜晚&#xff0c;正当大家忙完一天的工作准备休息时&#xff0c;应急群里“咚咚咚”开始报警&#xff0c;提示我们余利宝业务的赎回接口成功率下降。 通过 Monitor 监控发现&#xff0c;该接口的耗时已经超过了网关配置的超时阈值(2s)&#…

【验收支撑】软件系统验收计划书(直接套用原件doc)

编写软件验收计划是软件开发过程中的一个关键步骤&#xff0c;其重要性体现在以下几个方面&#xff1a; 明确验收标准&#xff1a;软件验收计划详细列出了验收的标准、测试方法、测试环境等&#xff0c;确保所有相关人员对验收的期望和要求有清晰的认识。这有助于避免在验收阶段…

JavaWeb系列二十一: 数据交换和异步请求(JSON, Ajax)

文章目录 官方文档official documents官方文件官方文件official documentsJSON介绍JSON快速入门JSON对象和字符串对象转换应用案例注意事项和细节 JSON在java中使用说明JSON在Java中应用场景应用实例 Ajax基本介绍Ajax是什么Ajax经典应用场景 Ajax原理示意图传统的web应用Ajax原…

用微客云搭建一套外卖霸王餐系统赚CPS佣金

在当下数字化快速发展的时代&#xff0c;外卖行业作为餐饮业的重要分支&#xff0c;正在经历着前所未有的变革。为了满足市场需求&#xff0c;提高用户体验和增加商户收入&#xff0c;越来越多的外卖平台开始寻求创新&#xff0c;其中&#xff0c;搭建一套高效、稳定且功能丰富…

昇思25天学习打卡营第19天|CycleGAN图像风格迁移互换

CycleGAN图像风格迁移互换 模型介绍 模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 。该模型实现了一种在没有配对示例的情况下学习将…

jenkins打包java项目报错Error: Unable to access jarfile tlm-admin.jar

jenkins打包boot项目 自动重启脚本失败 查看了一下项目日志报错&#xff1a; Error: Unable to access jarfile tlm-admin.jar我检查了一下这个配置&#xff0c;感觉没有问题&#xff0c;包可以正常打&#xff0c; cd 到项目目录下面&#xff0c;手动执行这个sh脚本也是能正常…

本地Kali系统开启SSH服务并使用内网穿透生成公网地址实现ssh远程连接

文章目录 前言1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 前言 本文主要介绍如何在本地Kali Linux系统启动ssh服务&#xff0c;并结合cpolar内网穿透软件生成公网地址&#xff0c;轻松…

提示词工程(Prompt Engineering)是什么?

一、定义 Prompt Engineering 提示词工程&#xff08;Prompt Engineering&#xff09;是一项通过优化提示词&#xff08;Prompt&#xff09;和生成策略&#xff0c;从而获得更好的模型返回结果的工程技术。 二、System message 系统指令 System message可以被广泛应用在&am…

平凯星辰黄东旭出席 2024 全球数字经济大会 · 开放原子开源数据库生态论坛

7 月 5 日&#xff0c;以“开源生态筑基础&#xff0c;数字经济铸未来”为主题的 2024 全球数字经济大会——开放原子开源数据库生态论坛在北京成功举办。平凯星辰&#xff08;北京&#xff09;科技有限公司联合创始人黄东旭发表了题为《TiDB 助力金融行业关键业务系统实践》的…

【TS】typescript 获取函数入参类型、返回值类型、promise返回值类型

文章目录 1. 准备工作2. 获取函数入参的类型3. 获取函数返回值类型4. 获取promise返回值类型 1. 准备工作 创建 utils.ts interface User {id: number;name: string;age: number; } interface Params {method: string;url: string; }function getUserList(params: Params,other…

RocketMQ 消费者之顺序消费和流程详解附源码解析

1. 背景 本文是 RocketMQ 消费者系列的第六篇&#xff0c;上一篇主要介绍并发消费&#xff0c;而本片主要介绍 RocketMQ 顺序消费的设计和流程。 我把 RocketMQ 消费分成如下几个步骤 重平衡 消费者拉取消息 Broker 接收拉取请求后从存储中查询消息并返回 消费者消费消息 顺序…