[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

Windows/Linux双平台指南:3种方法快速释放被占用的GPU内存(含任务管理器替代方案)

本文详细介绍了在Windows和Linux双平台下快速释放被占用GPU内存的3种方法,包括任务管理器替代方案。从基础操作到高阶技巧,帮助用户彻底解决GPU内存驻留问题,提升计算资源利用率。特别适用于深度学习开发者和服务器管理员处理显存泄漏等常见问题。

j0k1l2m3n的博客 262

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

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

weixin_33888907的博客 378

unity 在透明物体上投射阴影

unity版本:2019.4.16 创建一个shader,代码如下: Shader "ChuckLee/ARShadow" { Properties { _ShadowColor("Shadow Color", Color) = (0.1, 0.1, 0.1, 0.53) } SubShader { Tags{ "RenderType" = "Transparent" "Queue" = "Geometry+1" } Blend SrcAlpha OneMinusSrcAlph

Abel02的博客 2953

【Docker】如何让docker容器正常使用nvidia显卡

描述了如何在docker容器中使用英伟达显卡的过程和问题解决方法。

NameLoadingFailed的博客 8372

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

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

编程菜汝狗 4962

VS Code + EIDE + Clangd 构建 Keil/MDK 嵌入式开发新范式

嵌入式C/C++开发长期受限于传统IDE的语法理解弱、导航卡顿、跨工程复用难等问题。Clangd作为基于AST的现代语言服务器,结合EIDE对Keil uVision和ARM MDK工程文件(.uvprojx)的深度解析能力,可将编译配置、芯片型号、内存模型、扩展关键字等语义精准翻译为标准compile_commands.json,从而实现智能跳转、宏展开识别、结构体实时展开等高阶编辑体验。该方案不替换Keil/MDK编译与烧录流程,仅升级代码理解层,天然兼容STC8051、STM32 Cortex-M、G

weixin_34321753的博客 353

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

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

weixin_34159110的博客 348

思科模拟器Cisco Packet Tracer交换机的管理配置

一、交换机的管理方式:带内管理和带外管理 通过交换机的 Console 端口管理交换机属于带外管理;这种管理方式不占用交换机的网络端口,第一次配置交换机必须利用 Console 端口进行配置。 通过 Telnet、拨号等方式属于带内管理。 二、控制台配置思科交换机 1.新建拓扑图 新建拓扑,选择console线连接交换机和PC,一端接交换机的console口,一端接PC的RS 232 口(...

qq_37992321的博客 2万+

ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory解决方案

本文主要介绍了ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

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

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

编程菜汝狗 1326

Couldn‘t agree a key exchange algorithm(available:curve25519-sha256,curve25519-sha256@libssh.org解决方案

本文主要介绍了Couldn’t agree a key exchange algorithm(available:curve25519-sha256,curve25519-sha256@libssh.org解决方案,希望能对使用winscp的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 方案一 2.2 方案二

weixin_43178406的博客 4万+

高通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

英飞凌 AURIX TC3XX 系列单片机的 NVM-Flash 介绍

简单介绍英飞凌 AURIX TC3XX 系列多核单片机的 Flash,便于快速上手使用

大橙子的博客 6640

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

mixer_path.xml 研究

记录中。

jlgcumt的博客 2079

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

高通8650 MI2S 调试经验总结

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

常来看看~ 1209

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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的专栏 6157

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、付费专栏及课程。

余额充值