[Linux Audio Driver] 高通平台MI2S总线配置

【QCA】基于高通平台简述DTS文件参数 DTS部分参数说明 阅读详情
AI摘要

本文详细记录了一位工程师在高通骁龙865平台上配置MI2S接口的过程,从初始的GPIO配置错误,到识别并解决与数字麦克风的冲突,再到最终成功配置QUIN_MI2S总线。通过设备树的修改和tinyalsa命令验证,逐步排查问题,最终实现音频总线的正确配置。过程中涉及到了GPIO配置、音频设备树的修改、冲突处理及波形验证等关键步骤。

0. 背景


hardware platform:骁龙865
android version:android10
Linux kernel version:msm-4.19

思维导图如下:

在这里插入图片描述

1. 遇到的一点坑


由于我没有拿到这个平台的MI2S高通配置文档,所以遇到了一点坑,同步也分享。

在这里插入图片描述
这个平台目前还没有具体codec器件的调试需求,但是我想验证下接口,于是找硬件,告诉我可以配置MI2S1,对应上面几个GPIO,然后我寻思,默认pri_mi2s应该是MI2S0,这个MI2S1不就应该是配置sec_mi2s嘛。
在这里插入图片描述

(我可真是大聪明,逃…)

/vendor/qcom/proprietary/devicetree-4.19/qcom/kona-pinctrl.dtsi

 		sec_mi2s_sck {
 			sec_mi2s_sck_sleep: sec_mi2s_sck_sleep {
 				mux {
-					pins = "gpio142";
+					pins = "gpio152";
 					function = "gpio";
 				};
 
 				config {
-					pins = "gpio142";
+					pins = "gpio152";
 					drive-strength = <2>;   /* 2 mA */
 					bias-pull-down;         /* PULL DOWN */
 					input-enable;
@@ -1871,12 +1871,12 @@
 
 			sec_mi2s_sck_active: sec_mi2s_sck_active {
 				mux {
-					pins = "gpio142";
+					pins = "gpio152";
 					function = "mi2s1_sck";
 				};
 
 				config {
-					pins = "gpio142";
+					pins = "gpio152";
 					drive-strength = <8>;   /* 8 mA */
 					bias-disable;           /* NO PULL */
 				};
@@ -1886,12 +1886,12 @@
 		sec_mi2s_ws {
 			sec_mi2s_ws_sleep: sec_mi2s_ws_sleep {
 				mux {
-					pins = "gpio145";
+					pins = "gpio153";
 					function = "gpio";
 				};
 
 				config {
-					pins = "gpio145";
+					pins = "gpio153";
 					drive-strength = <2>;   /* 2 mA */
 					bias-pull-down;         /* PULL DOWN */
 					input-enable;
@@ -1900,12 +1900,12 @@
 
 			sec_mi2s_ws_active: sec_mi2s_ws_active {
 				mux {
-					pins = "gpio145";
+					pins = "gpio153";
 					function = "mi2s1_ws";
 				};
 
 				config {
-					pins = "gpio145";
+					pins = "gpio153";
 					drive-strength = <8>;   /* 8 mA */
 					bias-disable;           /* NO PULL */
 				};
@@ -1915,12 +1915,12 @@
 		sec_mi2s_sd0 {
 			sec_mi2s_sd0_sleep: sec_mi2s_sd0_sleep {
 				mux {
-					pins = "gpio143";
+					pins = "gpio154";
 					function = "gpio";
 				};
 
 				config {
-					pins = "gpio143";
+					pins = "gpio154";
 					drive-strength = <2>;   /* 2 mA */
 					bias-pull-down;         /* PULL DOWN */
 					input-enable;
@@ -1929,12 +1929,12 @@
 
 			sec_mi2s_sd0_active: sec_mi2s_sd0_active {
 				mux {
-					pins = "gpio143";
+					pins = "gpio154";
 					function = "mi2s1_data0";
 				};
 
 				config {
-					pins = "gpio143";
+					pins = "gpio154";
 					drive-strength = <8>;   /* 8 mA */
 					bias-disable;           /* NO PULL */
 				};
@@ -1944,12 +1944,12 @@
 		sec_mi2s_sd1 {
 			sec_mi2s_sd1_sleep: sec_mi2s_sd1_sleep {
 				mux {
-					pins = "gpio144";
+					pins = "gpio155";
 					function = "gpio";
 				};
 
 				config {
-					pins = "gpio144";
+					pins = "gpio155";
 					drive-strength = <2>;   /* 2 mA */
 					bias-pull-down;         /* PULL DOWN */
 					input-enable;
@@ -1958,12 +1958,12 @@
 
 			sec_mi2s_sd1_active: sec_mi2s_sd1_active {
 				mux {
-					pins = "gpio144";
+					pins = "gpio155";
 					function = "mi2s1_data1";
 				};
 
 				config {
-					pins = "gpio144";
+					pins = "gpio155";
 					drive-strength = <8>;   /* 8 mA */
 					bias-disable;           /* NO PULL */
 				};

./vendor/qcom/proprietary/devicetree-4.19/qcom/kona-audio-overlay.dtsi

 	qcom,codec-aux-devs = <&wcd938x_codec>;
+	qcom,sec-mi2s-gpios = <&cdc_sec_mi2s_gpios>;
 	qcom,msm_audio_ssr_devs = <&audio_apr>, <&q6core>, <&lpi_tlmm>,
 				  <&bolero>;
 };
@@ -377,6 +378,17 @@
 		qcom,lpi-gpios;
 		qcom,tlmm-gpio = <147>;
 	};

+	cdc_sec_mi2s_gpios: cdc_sec_mi2s_clk_data_pinctrl {
+		compatible = "qcom,msm-cdc-pinctrl";
+		pinctrl-names = "aud_active", "aud_sleep";
+		pinctrl-0 = <&sec_mi2s_sck_active &sec_mi2s_ws_active &sec_mi2s_sd0_active
+			    &sec_mi2s_sd1_active>;
+		pinctrl-1 = <&sec_mi2s_sck_sleep &sec_mi2s_ws_sleep  &sec_mi2s_sd0_sleep
+			    &sec_mi2s_sd1_sleep>;
+		qcom,lpi-gpios;
+		qcom,tlmm-gpio = <152 153 154 155>;
+	};
 };

然后编译,烧录,adb shell执行tinyalsa命令录音:

tinymix "MultiMedia1 Mixer SEC_MI2S_TX" 1
tinycap /sdcard/rec.wav

发现终端录制不了:

 kona:/ # tinymix "MultiMedia1 Mixer SEC_MI2S_TX" 1
p /sdcard/rec.wavkona:/ # tinycap /sdcard/rec.wav
Unable to open PCM device (cannot set hw params: Invalid argument)
Captured 0 frames

然后串口报错log如下:

[  410.635747] bt_ioctl: BT_CMD_PWR_CTRL pwr_cntrl:1
[  410.641033] bt_vreg_enable: vreg_en successful for : qca,bt-vdd-aon
[  410.647820] bt_vreg_init: regulator_get(qca,bt-vdd-dig) failed. rc=-517
[  410.655571] bluetooth_power: bt_power vdddig config failed
[  410.661381] bt_vreg_disable: vreg_disable successful for : qca,bt-vdd-aon
[  412.117603] msm_dai_q6_mi2s_hw_params: dai_data->channels = 1 channel_mode = 0
[  412.125138] msm-dai-q6-mi2s soc:qcom,msm-dai-mi2s:qcom,msm-dai-q6-mi2s-sec:
 ASoC: can't set Secondary MI2S hw params: -22
[  412.137315]  SEC_MI2S_TX: ASoC: hw_params BE failed -22
[  412.142744]  KONA Media1: ASoC: hw_params BE failed -22
[  412.148442] q6asm_callback: cmd = 0x10bcd returned error = 0x1
[  412.155280] __q6asm_cmd: DSP returned error[ADSP_EFAILED] opcode 68557

这个报错看起来是平台info里面xml backend配置异常,但是我们当前是用tinyalsa命令抓数据,无须考虑那个info的配置,这里我怀疑是硬件搞错了MI2S GPIO(其实是我搞错了=_=)。

在这里插入图片描述

在我的再三请求下,硬件老哥帮我又检查了一遍,说gpio没有问题,我当时感觉自己麻了,没个文档都不知道gpio配的对不对,然后我问他有没有这个平台的PING定义啊,GPIO的那种表格。

在这里插入图片描述
(一番沟通之后,俺拿到了表格)

在这里插入图片描述
在这里插入图片描述

从表格里面拿到了两个重要的信息:这组MI2S是和数字麦克冲突的,gpio152对应LPI GPIO6。

这里说明下,类比已知的高通外部MI2S总线,按顺序依次是:Primary MI2S、Secondary MI2S、Tertiary MI2S、Quaternary MI2S、Quinary MI2S、 Senary MI2S。

其中,和DMIC1以及DMIC2冲突的总线应该是,quin_mi2s。

总之,之前是白捣鼓了,我们可以再看看lpi设备树来佐证想法:当前应该配置quin_mi2s。

./vendor/qcom/proprietary/devicetree-4.19/qcom/kona-lpi.dtsi

在这里插入图片描述
如我们所料,这个LPI GPIO6是QUAT总线的下一组MI2S的SCLK,即 QUIN总线的SCLK。

2. 按照上面的思维导图再进行一遍


● 获取到正确信息,明确要配置的MI2S。(已完成,明确是quin总线)

● 对应平台pinctrl dtsi里面添加MI2S相关的GPIO配置。

./vendor/qcom/proprietary/devicetree-4.19/qcom/kona-pinctrl.dtsi

+//add for test QUIN MI2S start
+
+               quin_mi2s_sck {
+                       quin_mi2s_sck_sleep: quin_mi2s_sck_sleep {
+                               mux {
+                                       pins = "gpio152";
+                                       function = "gpio";
+                               };
+
+                               config {
+                                       pins = "gpio152";
+                                       drive-strength = <2>;   /* 2 mA */
+                                       bias-pull-down;         /* PULL DOWN */
+                                       input-enable;
+                               };
+                       };
+
+                       quin_mi2s_sck_active: quin_mi2s_sck_active {
+                               mux {
+                                       pins = "gpio152";
+                                       function = "mi2s4_sck";
+                               };
+
+                               config {
+                                       pins = "gpio152";
+                                       drive-strength = <8>;   /* 8 mA */
+                                       bias-disable;           /* NO PULL */
+                               };
+                       };
+               };
+
+               quin_mi2s_ws {
+                       quin_mi2s_ws_sleep: quin_mi2s_ws_sleep {
+                               mux {
+                                       pins = "gpio153";
+                                       function = "gpio";
+                               };
+
+                               config {
+                                       pins = "gpio153";
+                                       drive-strength = <2>;   /* 2 mA */
+                                       bias-pull-down;         /* PULL DOWN */
+                                       input-enable;
+                               };
+                       };
+
+                       quin_mi2s_ws_active: quin_mi2s_ws_active {
+                               mux {
+                                       pins = "gpio153";
+                                       function = "mi2s4_ws";
+                               };
+
+                               config {
+                                       pins = "gpio153";
+                                       drive-strength = <8>;   /* 8 mA */
+                                       bias-disable;           /* NO PULL */
+                               };
+                       };
+               };
+
+               quin_mi2s_sd0 {
+                       quin_mi2s_sd0_sleep: quin_mi2s_sd0_sleep {
+                               mux {
+                                       pins = "gpio154";
+                                       function = "gpio";
+                               };
+
+                               config {
+                                       pins = "gpio154";
+                                       drive-strength = <2>;   /* 2 mA */
+                                       bias-pull-down;         /* PULL DOWN */
+                                       input-enable;
+                               };
+                       };
+
+                       quin_mi2s_sd0_active: quin_mi2s_sd0_active {
+                               mux {
+                                       pins = "gpio154";
+                                       function = "mi2s4_data0";
+                               };
+
+                               config {
+                                       pins = "gpio154";
+                                       drive-strength = <8>;   /* 8 mA */
+                                       bias-disable;           /* NO PULL */
+                               };
+                       };
+               };
+
+               quin_mi2s_sd1 {
+                       quin_mi2s_sd1_sleep: quin_mi2s_sd1_sleep {
+                               mux {
+                                       pins = "gpio155";
+                                       function = "gpio";
+                               };
+
+                               config {
+                                       pins = "gpio155";
+                                       drive-strength = <2>;   /* 2 mA */
+                                       bias-pull-down;         /* PULL DOWN */
+                                       input-enable;
+                               };
+                       };
+
+                       quin_mi2s_sd1_active: quin_mi2s_sd1_active {
+                               mux {
+                                       pins = "gpio155";
+                                       function = "mi2s4_data1";
+                               };
+
+                               config {
+                                       pins = "gpio155";
+                                       drive-strength = <8>;   /* 8 mA */
+                                       bias-disable;           /* NO PULL */
+                               };
+                       };
+               };
+
+//add for test QUIN MI2S end

● 对应平台主要的audio dtsi 里面添加调用MI2S。

./vendor/qcom/proprietary/devicetree-4.19/qcom/kona-audio-overlay.dtsi

+	qcom,codec-max-aux-devs = <0>;
+	qcom,quin-mi2s-gpios = <&cdc_quin_mi2s_gpios>;
 	qcom,codec-aux-devs = <&wcd938x_codec>;
 	qcom,msm_audio_ssr_devs = <&audio_apr>, <&q6core>, <&lpi_tlmm>,
 				  <&bolero>;
 };
 
 &q6core {
+
+
+	cdc_quin_mi2s_gpios: cdc_quin_mi2s_clk_data_pinctrl {
+		compatible = "qcom,msm-cdc-pinctrl";
+		pinctrl-names = "aud_active", "aud_sleep";
+		pinctrl-0 = <&quin_mi2s_sck_active &quin_mi2s_ws_active &quin_mi2s_sd0_active
+			    &quin_mi2s_sd1_active>;
+		pinctrl-1 = <&quin_mi2s_sck_sleep &quin_mi2s_ws_sleep  &quin_mi2s_sd0_sleep
+			    &quin_mi2s_sd1_sleep>;
+		qcom,lpi-gpios;
+		qcom,tlmm-gpio = <152 153 154 155>;
+	};

● 关闭设备树里面可能引起冲突的dtsi配置,正确启用MI2S总线,而不是其他总线,比如TDM总线。

./vendor/qcom/proprietary/devicetree-4.19/qcom/kona-audio-overlay.dtsi

 	cdc_dmic01_gpios: cdc_dmic01_pinctrl {
+		status = "disabled";
 		compatible = "qcom,msm-cdc-pinctrl";
 		pinctrl-names = "aud_active", "aud_sleep";
 		pinctrl-0 = <&cdc_dmic01_clk_active &cdc_dmic01_data_active>;
@@ -333,6 +349,7 @@
 	};
 
 	cdc_dmic23_gpios: cdc_dmic23_pinctrl {
+		status = "disabled";
 		compatible = "qcom,msm-cdc-pinctrl";
 		pinctrl-names = "aud_active", "aud_sleep";
 		pinctrl-0 = <&cdc_dmic23_clk_active &cdc_dmic23_data_active>;
@@ -341,6 +358,7 @@
 	};

 	cdc_dmic45_gpios: cdc_dmic45_pinctrl {
+		status = "disabled";
 		compatible = "qcom,msm-cdc-pinctrl";
 		pinctrl-names = "aud_active", "aud_sleep";
 		pinctrl-0 = <&cdc_dmic45_clk_active &cdc_dmic45_data_active>;
@@ -350,6 +368,7 @@
 	};

./vendor/qcom/proprietary/devicetree-4.19/qcom/kona-audio.dtsi

 		qcom,mi2s-audio-intf = <1>;
-		qcom,auxpcm-audio-intf = <1>;
-		qcom,tdm-audio-intf = <1>;
+		qcom,auxpcm-audio-intf = <0>;
+		qcom,tdm-audio-intf = <0>;

● tinyalsa命令起进程,抓波形。

编译烧录之后,adb root,adb shell,执行以下命令录音:

tinymix "MultiMedia1 Mixer QUIN_MI2S_TX" 1
tinycap /sdcard/rec.wav

在这里插入图片描述
波形一动不动=_=。

在这里插入图片描述

3. 终章


因为配置个总线就这几个步骤,没啥说的,到这步心里一点不慌(逃…),估计是哪里犯了个小错误。经过排查,发现是
gpio的引用方式不对,原因是检索dmic的配置:

./vendor/qcom/proprietary/devicetree-4.19/qcom/kona-audio-overlay.dtsi

cdc_dmic01_gpios: cdc_dmic01_pinctrl {
	status = "disabled";
	compatible = "qcom,msm-cdc-pinctrl";
	pinctrl-names = "aud_active", "aud_sleep";
	pinctrl-0 = <&cdc_dmic01_clk_active &cdc_dmic01_data_active>;
	pinctrl-1 = <&cdc_dmic01_clk_sleep &cdc_dmic01_data_sleep>;
	qcom,lpi-gpios;
};

grep -nrR “cdc_dmic01_clk_active” ./vendor/qcom/proprietary/devicetree-4.19/qcom/

在这里插入图片描述

发现dmic直接引用的平台lpi设备树的节点:kona-lpi.dtsi,那么依次类推,我们准备也直接引用lpi的节点即可。

补充以下修改:

./vendor/qcom/proprietary/devicetree-4.19/qcom/kona-audio-overlay.dtsi

+	//cdc_quin_mi2s_gpios: cdc_quin_mi2s_clk_data_pinctrl {
+	//	compatible = "qcom,msm-cdc-pinctrl";
+	//	pinctrl-names = "aud_active", "aud_sleep";
+	//	pinctrl-0 = <&quin_mi2s_sck_active &quin_mi2s_ws_active &quin_mi2s_sd0_active
+	//		    &quin_mi2s_sd1_active>;
+	//	pinctrl-1 = <&quin_mi2s_sck_sleep &quin_mi2s_ws_sleep  &quin_mi2s_sd0_sleep
+	//		    &quin_mi2s_sd1_sleep>;
+	//	qcom,lpi-gpios;
+	//	qcom,tlmm-gpio = <152 153 154 155>;
+	//};
+
+	cdc_quin_mi2s_gpios: cdc_quin_mi2s_clk_data_pinctrl {
+		compatible = "qcom,msm-cdc-pinctrl";
+		pinctrl-names = "aud_active", "aud_sleep";
+		pinctrl-0 = <&lpi_i2s1_sck_active &lpi_i2s1_ws_active &lpi_i2s1_sd0_active
+			    &lpi_i2s1_sd1_active>;
+		pinctrl-1 = <&lpi_i2s1_sck_sleep &lpi_i2s1_ws_sleep  &lpi_i2s1_sd0_sleep
+			    &lpi_i2s1_sd1_sleep>;
+		qcom,lpi-gpios;
+		//qcom,tlmm-gpio = <152 153 154 155>;
+	};

在这里插入图片描述

在这里插入图片描述
(小细节,SCLK为1.536MHz,那么周期应该为1us左右可以抓到 稳定波形)

这两个图片表明正确获取到了SCLK以及WS的波形,WS是48KHz,由于我没有在machine driver修改sclk,此时sclk应该为默认值1.536MHz :
在这里插入图片描述

总线至此配置OK,本文到此结束,篇幅过长,感谢阅读!

Qwen3-ASR音乐语音识别工作流:多语言高鲁棒性离线推理实战 语音识别(ASR)是将音频信号转化为文本的基础技术,其核心原理在于声学模型与语言模型的联合建模;在音乐场景下,传统ASR因伴奏干扰、语种混杂、低信噪比等挑战而失效,亟需面向高动态范围人声与多语言切换的专用解决方案。Qwen3-ASR通过Conformer音频编码器、Prompt驱动的音频-语言联合理解,以及vLLM优化的离线推理引擎,显著提升对抖音翻唱、B站鬼畜、海外播客等复杂音频的转录鲁棒性。本文聚焦Qwen3-ASR在真实音乐环境中的本地化部署,涵盖Spleeter人声分离、双路VAD精筛、多语言Pro 阅读详情

相关推荐

Android Qcom Audio入门学习

在devictree中可以发现有其实在PIL驱动并没有发生image加载过程,真正的加载有对应的子模块处理中,adsp就是在adsp-loader.c中通过init.qcom.rc启动时 write /sys/kernel/boot_adsp/boot 1 ,之后就会subsystem_get(“adsp”)获取并加载;其他例如slpi, 要看高通不同的平台子模块的组成,有些PIL是没有load slpi模块,sensor也是adsp中,

Android驱动开发 8623

【高通】audio bring up

一、确认硬件配置 reset、irq中断配置 I2S、I2C通信总线 二、codec调试 三、smartPA调试

weixin_42258461的博客 5137

Android audio 输出设备选择过程分析(下)

上篇的分析到audio_route,现在接个力,也算是7月的作业,再不交这个月就落下了。 audio_route_apply_and_update_path分两个过程,从函数名字都能看出来,一个是apply,一个是updata: audio_route_apply_path /* Apply an audio route path by name */ int audio_route_ap...

bberdong的专栏 1万+

高通sdm660 uart dts配置

高通sdm660平台配置uart dts配置如下 sdm660-mtp.dtsi中使能对应的uart &uartblsp2dm1 { status = “ok”; pinctrl-names = “default”; pinctrl-0 = <&psam_console_active>; }; sdm660-pinctrl.dtsi中配置对应的gpio,这边gpio使用...

weixin_32104133的博客 1885

高通开发系列 - 内核升级后音频驱动的开发和调试

高通开发系列 - 内核升级后音频驱动的开发和调试

fulinux的博客 1442

高通WLAN框架学习(11)-- 低功耗接口和Wi-Fi定位系统

本章主要介绍以下主题: ■软件架构 ■调试方法 12.1软件架构 低功耗接口及Wi-Fi定位系统软件架构如下图所示: ■LOWI:低功率Wi-Fi (WLAN)接口。 ■LPI:低功耗接口。 ■将扫描服务卸载到WLAN固件。 ■LOWI_LP (ADSP中的LOWI)直接通过QMI接口到WLAN固件,不唤醒应用程序 ■WLS提供WMI/QMI翻译 ■Wi-Fi定位系统(WLS)运行三个线程: a. wls_wlansvc_WLAN:提供WLAN服务的QMI服务器 b. wls

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 2207

linux修改dts更新到内核,kernel4.4.55内核的音频es8323驱动调试及dts配置

diff --git a/arch/arm/boot/dts/rk3288-firefly.dtsi b/arch/arm/boot/dts/rk3288-firefly.dtsiindex 1650f98455e2..9888f0816265 100644--- a/arch/arm/boot/dts/rk3288-firefly.dtsi+++ b/arch/arm/boot/dts/rk32...

weixin_36028342的博客 842

展会客流统计的客流统计系统,WiFi客流每时每客

一般展会的举行时间都在3-7天之间,展会作为市场部门一项重要工作,一直以来没有一项有效的工具能够提供数据支持。 展会最重要的是通过活动和产品来吸引参展者的参观,如何统计展会期间的客流量呢?如何通过将数据转化成为活动数据的支撑呢? 目前成熟的解决方案有,视频客流统计、WiFi客流统计、红外线客流统计等方式。由于展会通常的时间都比较短,视频、红外线客流统计采购及安装价格都比较高,需

isentech的博客 3994

Linux 4.19内核下高通MI2S与TDM总线配置对比:3个关键差异点解析

本文深入解析了Linux 4.19内核下高通平台MI2S与TDM总线在硬件架构、时钟管理和设备树配置上的3个关键差异点。通过对比物理层特性、时钟域管理和驱动实现,帮助开发者根据外设需求选择合适总线类型,并提供kona平台(骁龙865)的实战配置示例与性能优化建议。

weixin_33888907的博客 378

SurfaceControlViewHost使用介绍

可以看到,主要用途:是把一个进程的View显示到另外一个进程里面。

chadm.xiang 1287

e-puck场景搭建

可以注意到一个黑色的小窗口出现在三维视图的左上角。它显示了电子吸盘机器人的摄像头拍摄的图像。该图像将保持黑色,直到机器人的控制器明确启用相机。最后,单击右上角的“x”可以关闭它。在对话框中,选择PROTO节点(Webots项目)/robots/gctronic/e-puck/e-puck(Robot)。一个电子吸盘机器人应该出现在竞技场的中央。通过按Alt+左键单击+拖动,对机器人施加力。无法对WoodenBox节点施加力,因为默认情况下,它们没有质量,并且被视为粘在地板上。将新控制器与机器人链接。

weixin_66540163的博客 767

[Linux Audio Driver] 高通音频相关汇总(持续更新)

0. 背景 之前写了一些音频的博客,但是比较散乱,就想着汇总下写的博客,也是对自己知识结构的梳理,这个会持续更新。 1. 代码分析&总结 I2S相关介绍 ACDB文件加载流程(一) ACDB文件加载流程(二) ACDB文件加载流程(完结篇) 高通平台内部MIC_BIAS简介 从设备地址理解 Android7 外部PA Speaker代码结构 MSM8953音频部分设备树调用关系 开启音频kernel内核debug功能 声卡与XML匹配流程 SDM660平台内部CODEC tinyalsa命令总结 S

编程菜汝狗 4962

数字IC后端PPA优化实战:Innovus中Timing一致性策略与Module Region布局技巧

本文深入探讨了数字IC后端设计中PPA优化的核心挑战,重点解析了Innovus与PrimeTime之间Timing不一致的根本原因。通过实战案例,详细介绍了在Innovus中设置Timing Margin、Derate以及RC Scale Factor等关键策略,以校准时序视图。同时,文章分享了利用Module Region进行物理布局规划的技巧,将关键模块约束在最优区域,并结合Group Path等进阶方法,有效提升时序收敛效率与PPA结果的可预测性。

f9g0h的博客 2687

高通平台外部Codec调试实战:ES7243E从设备树到通路的完整指南

在嵌入式音频系统设计中,编解码器(Codec)是模拟与数字信号转换的核心器件。外部Codec因选型灵活、成本可控,在IoT设备、智能音箱等场景中广泛应用。其调试涉及I2S、I2C、MCLK等多总线协同,以及Linux内核ASoC框架与设备树的深度配合。理解Codec的基础时钟与数据通路原理,是高效定位无声、失真的关键。本文以ES7243E ADC为例,系统梳理高通平台上外部Codec从硬件检查、驱动移植、设备树配置到用户空间通路的全流程,并总结高频踩坑经验,助力音频BSP工程师快速打通录音链路。

weixin_34159110的博客 348

rk3568 RGMII KSZ8795 MAC TO MAC

参考《Rockchip_Developer_Guide_Linux_MAC_TO_MAC_CN.pdf》

明天乌儿会歌唱 6493

Origin作图——等高线图

最近做一个测试数据图,开始想通过用热图来展示,结果发现热图有很多的小方块,很难呈现出最好的效果,因为数据是有一层一层的递进效果,因此经过尝试后,发现等高线图是个好选择。 热图展示效果如下:其中有很多的小方块不适合,热图制图方法前面有记录。 下面展示等高线图制作方法。首先是导入数据,可以从excal导入,也可以直接复制进去。等方法。 选中要展示的数据,绘图----等高线图 选中箭头,确定。 双击图像,点击线,我们需要把线隐藏了. 双击图像,我们需要调色板,根据自己的选择,一般用调色板的颜色。

qq_42278015的博客 1万+

[Linux Audio Driver] PDM CLOCK导致的耳机右声道POP音问题

0. 背景 此问题现象是,当音乐播放器里面有两首歌时,正在播放一首,然后双击耳机的中间按键会出现POP音;这里会发现,直接在界面上切歌,是不会有这样的问题的; (注:如此时音乐的名字mute1,我使用两个静音文件来做测试以排除音源本身的问题) 这是由于,直接用界面切歌,会默认触发提示音,进入设置里面,把所有的提示音都关闭,此问题即可通过在音乐播放器界面切歌复现;以下开始debug. 1. 软件修...

编程菜汝狗 1326

车辆重识别/再辨识数据集: Vehicle Re-ID Datasets Collection

车辆数据库 1.VERI-Wild: A Large Dataset and a New Method for Vehicle Re-Identification in the Wild (2019-CVPR) 数据库名称:VERI-Wild 论文:链接 数据库描述: 车辆图像由一个包含174个摄像机,拍摄范围覆盖超过200平方公里的市区CCTV系统拍摄。摄像机是24小时连续拍摄30天,其长时间的...

AI炼丹师 6857

高通8xxx平台双MIC设置

dts文件修改:   qcom,audio-routing =    "RX_BIAS", "MCLK",    "LDO_H", "MCLK",    "SPK_OUT", "MCLK",    "SPK_OUT", "EXT_VDD_SPKR",    "Lineout_1 amp", "LINEOUT1",    "Lineout_2 amp", "LINEOUT2",

晒太阳 7089

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第10套模块A:网络构建 & (五)网络运维配置+(六)SDN网络配置-命令配置

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第10套模块A:网络构建 & (五)网络运维配置+(六)SDN网络配置-命令配置

君逍遥o 810

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

mixer_path.xml 研究

记录中。

jlgcumt的博客 2079

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

高通8650 MI2S 调试经验总结

这是一个测试命令,用于验证 USB 耳机的播放功能。USB 耳机需要通过上层的动态设置来配置。经过一番猜测,这可能与以下位置有关,因为默认情况下,只对CHS_1进行了TKV配置,CHS_2需要手动选择后才能发现它也需要配置。之前在未修改CHS_2配置的情况下,将这里的设置更改为2声道时,声音一直存在不连续的问题。经过以上两处修改后,问题果然得到了解决。为什么我的MI2S输入不是双声道的?代码修改太多了,找时间再贴。蓝牙也需要上层动态设置,

常来看看~ 1209

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android MI2S和PCM简要介绍

大部分高通平台提供四组MI2S(MI2S和I2S,个人理解为M可以多通路,如双MIC信号在codec内mix后输入)。其中分为两组引脚,每组引脚对应内部选择器,分为两组MI2S引脚。      而PCM和I2S使用引脚相同,但是很多配置不同,后面说到DAPM会提到dai_link和FE,BE的区别。      第一组I2S为pri_mi2s,这组一般在内部接高通的codec。      第二

u012416612的博客 8315

rk3399 LCD GPIO 兼容处理及解决蓝牙SCO通话异常

背景 由于项目需要,Rk3399需要兼容三块LCD屏,考虑到I2S0上有8个引脚,其 GPIO3_D4,GPIO3_D5,GPIO3_D6可复用为GPIO,而不影响I2S0通道上蓝牙音频的GPIO3_D3,GPIO3_D7上的输入输出。于是考虑通过配置这三个引脚的输入电平,来区分不同的LCD.但是在实际使用中发现蓝牙A2DP音频正常,通话时SCO通话无声音,问题由此展开: rk3399 LCD兼容处理及解决蓝牙SCO通话异常断导致。按道理说这三个GPIO既可以用作I2S也可复用为GPIO,应该不影.

yanhongfei268的专栏 1163

SA8255 Q+A QNX主要进程分析

基线:Snapdragon_Auto.HQX.4.5.6.0-00003.1-STD.PROD-1

kill150的专栏 6156

05-SA8155 QNX通过QUB配置GPIO/INT/SPI/I2C/SPI等

SA8155

蓝精灵的专栏 3166
上一篇: 端口不稳定抓logcat方法
下一篇: Android获取开机时间的方式(进launcher)
1byte ≠ 8bit
博客等级 码龄8年 7242粉丝 170原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值