[Linux Audio Driver] Android 10 machine driver probe函数分析

[蓝牙] 1、蓝牙核心技术了解(蓝牙协议、架构、硬件和软件笔记)     声明:这篇文章是楼主beautifulzzzz学习网上关于蓝牙的相关知识的笔记,其中比较多的受益于xubin341719的蓝牙系列文章,同时还有其他网上作者的资料。由于有些文章只做参考或统计不足,如涉及版权请在下面留言~。同时我也在博客分类中新建一个蓝牙通信分类,用来研究分享蓝牙相关技术。   主要参考资料的来源:xubin341719[下面是该前辈的BT系列文章]下载连接:Blu... 阅读详情

0. 背景

平台:Qualcomm 5G SM6350、android10、kernel version: msm-4.19。

本文重点分析machine driver里面的msm_asoc_machine_probe函数,这个是machie驱动的核心代码,涉及声卡解析注册,CPU dai和codec dai绑定,麦克偏置解析配置routing、耳机麦克检测(欧-美标兼容)、MI2S主、从模式配置,以及新增的LPASS音频投票机制。

此外,msm_asoc_machine_probe函数也可以说就干了一件事:
实例化结构体snd_soc_card。

那个,兄弟们转载博客还是希望附上我的转载链接啊,不要直接copy,也是尊重人不是 -_-。
在这里插入图片描述

1. msm_asoc_machine_probe

代码位置:

./vendor/qcom/opensource/audio-kernel/asoc/kona.c

msm_asoc_machine_probe整个函数如下:

static int msm_asoc_machine_probe(struct platform_device *pdev)
{
   
   
	struct snd_soc_card *card = NULL;
	struct msm_asoc_mach_data *pdata = NULL;
	const char *mbhc_audio_jack_type = NULL;
	int ret = 0;
	uint index = 0;
	struct clk *lpass_audio_hw_vote = NULL;

	if (!pdev->dev.of_node) {
   
   
		dev_err(&pdev->dev, "%s: No platform supplied from device tree\n", __func__);
		return -EINVAL;
	}

	pdata = devm_kzalloc(&pdev->dev,
			sizeof(struct msm_asoc_mach_data), GFP_KERNEL);
	if (!pdata)
		return -ENOMEM;

	of_property_read_u32(pdev->dev.of_node,
				"qcom,lito-is-v2-enabled",
				&pdata->lito_v2_enabled);


	card = populate_snd_card_dailinks(&pdev->dev);
	if (!card) {
   
   
		dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__);
		ret = -EINVAL;
		goto err;
	}

	card->dev = &pdev->dev;
	platform_set_drvdata(pdev, card);
	snd_soc_card_set_drvdata(card, pdata);

	ret = snd_soc_of_parse_card_name(card, "qcom,model");
	if (ret) {
   
   
		dev_err(&pdev->dev, "%s: parse card name failed, err:%d\n",
			__func__, ret);
		goto err;
	}


	ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing");
	if (ret) {
   
   
		dev_err(&pdev->dev, "%s: parse audio routing failed, err:%d\n",
			__func__, ret);
		goto err;
	}


	ret = msm_populate_dai_link_component_of_node(card);
	if (ret) {
   
   
		ret = -EPROBE_DEFER;
		goto err;
	}


	ret = msm_init_aux_dev(pdev, card);
	if (ret)
		goto err;


	ret = devm_snd_soc_register_card(&pdev->dev, card);
	if (ret == -EPROBE_DEFER) {
   
   
		if (codec_reg_done)
			ret = -EINVAL;
		goto err;
	} else if (ret) {
   
   
		dev_err(&pdev->dev, "%s: snd_soc_register_card failed (%d)\n",
			__func__, ret);
		goto err;
	}
	dev_err(&pdev->dev, "%s: Sound card %s registered\n", __func__, card->name);


	kona_parse_aw87xx_mode(pdev, pdata);
	pdata->spk_ext_pa_gpio_p = of_parse_phandle(pdev->dev.of_node, 
	"qcom,msm-spk-ext-pa-gpios", 0);
	if (!pdata->spk_ext_pa_gpio_p) {
   
   
		pr_err("%s: property %s not detected in node %s\n", __func__, 
		"qcom,msm-spk-ext-pa-gpios", pdev->dev.of_node->full_name);
	}else{
   
   
		ret = msm_cdc_pinctrl_select_sleep_state(pdata->spk_ext_pa_gpio_p);
		if (ret < 0) {
   
   
			pr_err("%s: gpio set cannot be activated %s\n", __func__, "speaker_pa_gpio");
			return ret;
		}
	}

	ret = of_property_read_u32(pdev->dev.of_node, "qcom,tdm-max-slots",
				   &pdata->tdm_max_slots);
	if (ret) {
   
   
		dev_err(&pdev->dev, "%s: No DT match for tdm max slots\n",
			__func__);
	}
	if ((pdata->tdm_max_slots <= 0) || (pdata->tdm_max_slots >
	    TDM_MAX_SLOTS)) {
   
   
		pdata->tdm_max_slots = TDM_MAX_SLOTS;
		dev_err(&pdev->dev, "%s: Using default tdm max slot: %d\n",
			__func__, pdata->tdm_max_slots);
	}

	pdata->hph_en1_gpio_p = of_parse_phandle(pdev->dev.of_node,
						"qcom,hph-en1-gpio", 0);
	if (!pdata->hph_en1_gpio_p) {
   
   
		dev_dbg(&pdev->dev, "%s: property %s not detected in node %s\n",
			__func__, "qcom,hph-en1-gpio",
			pdev->dev.of_node->full_name);
	}

	pdata->hph_en0_gpio_p = of_parse_phandle(pdev->dev.of_node,
						"qcom,hph-en0-gpio", 0);
	if (!pdata->hph_en0_gpio_p) {
   
   
		dev_dbg(&pdev->dev, 
ASoC音频驱动开发实战:从Codec注册到DAPM调试 在嵌入式Linux系统中,音频子系统通过ASoC框架实现SoC与Codec的解耦。其核心原理是将音频系统拆分为Platform、Codec和Machine三层,利用DAPM实现动态电源管理,并通过kcontrol提供用户空间控制接口。这种架构显著提升了驱动复用性和可维护性,广泛应用于智能音箱、车载娱乐等场景。理解寄存器访问、DAPM widget与route配置,是解决音频驱动调试问题的关键。 阅读详情

相关推荐

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

【Qualcomm高通音频】MSM8953安卓7如何配置QUIN MI2S为从模式?

1. pinctrl配置 高通平台配置一组I2S一般对应四个或者六个GPIO, QUIN MI2S对应GPIO88 GPIO91 GPIO92 GPIO93 对应代码文件为:kernel/msm-3.18/arch/arm/boot/dts/qcom/msm8953-pinctrl.dtsi pri-tlmm-lines { pri_tlmm_lines_act: pri_tl...

crow_ch的博客 3904

车载音频开发实战:从ALSA/ASoC驱动到虚拟声卡实现

音频子系统是现代嵌入式系统中连接应用与硬件的关键软件层,其核心在于管理音频数据的输入、输出与处理流程。其工作原理基于分层架构,通过硬件抽象层(HAL)和内核驱动框架(如ALSA/ASoC)实现硬件与应用的解耦,从而提供统一的音频服务接口。这一设计具有重要的技术价值,它确保了系统的可移植性与可维护性,使得上层应用无需关心底层芯片差异。在车载信息娱乐系统等对可靠性、低延迟和多音源管理有严苛要求的应用场景中,一个稳定高效的音频驱动栈至关重要。本文聚焦于车载音频开发,通过剖析ALSA与ASoC框架,并提供一个完整的

weixin_30596343的博客 345

嵌入式Linux ASoC音频驱动开发:Codec控件与DAPM通路全解析

在嵌入式Linux系统中,音频设备驱动开发往往涉及复杂的总线拓扑与电源管理约束。ASoC(ALSA System on Chip)框架通过Machine、Platform、Codec三块拆分,将芯片能力与板级接线解耦,使得Codec驱动可以独立复用。其中音频控件(kcontrol)用于暴露音量、路由等控制项,DAPM则根据音频通路动态管理电源,降低功耗并避免爆音。理解这些基础机制后,开发者可借助设备树与Machine驱动快速完成音频链路适配,并通过tinymix、debugfs等工具排查无声、噪声等问题。本

weixin_34268169的博客 783

RK3576+Android14集成RG200U-CN 5G模组全栈适配指南

5G模组集成是嵌入式Android系统开发的关键技术环节,其本质是跨层协同:从内核PCIe/USB设备枚举与电源管理,到HAL层QMI协议栈实现与RIL状态机设计,再到Framework对CarrierConfigService和信号强度解析的深度适配。随着Android 14强制启用RIL HAL v3.0、Rockchip RK3576引入独立PCIe PHY与USB 3.1 Gen2控制器,传统‘驱动移植+RIL补丁’模式已失效。本文聚焦RK3576平台与RG200U-CN模组的真实工程实践,覆盖PC

weixin_33895657的博客 423

嵌入式Linux ASoC音频驱动开发:Codec驱动、kcontrol与DAPM实战

在嵌入式Linux系统中,音频子系统通过ASoC(ALSA System on Chip)框架实现分层解耦,将音频芯片驱动(Codec)、SoC控制器驱动(Platform)和板级绑定(Machine)分离。其核心原理在于通过kcontrol控件映射用户空间与寄存器,并借助DAPM动态电源管理按需上电,从而降低功耗、提升系统稳定性。这一机制在智能音箱、车载娱乐、工业HMI等场景中至关重要。然而,开发者常因控件注册错误、DAPM路由缺失或时钟配置不当导致无声、杂音或录音失败。本文聚焦Codec驱动开发,深入拆

weixin_34174322的博客 609

SM6350 死机分析(一)

1.通过QCAP解析dump可知: 从dmesg来看不确定是串口导致的死机还是蓝牙固件导致的死机,先规避下,屏蔽串口一直打印的log。根本原因待分析。 高通这块很恶心,SPI,uart,i2c这些个总线全放在QUPV,封装了固件看不到源码,高通FAE都看不到,封装到TZ里面,美其名曰为了安全,这块的研发好像在印度。。。 可以看看RTB是哪个cpu在哪出的问题 ...

墨染天玑的博客 1096

Auto.js实战:从解锁手机到自动阅读的全流程避坑指南(MIUI系统适配版)

本文详细介绍了Auto.js在MIUI系统下的自动化操作全流程优化指南,包括设备唤醒、应用启动、界面交互等关键环节的实战技巧。特别针对MIUI系统的变速检测机制和电源管理策略,提供了有效的避坑方案和性能优化建议,帮助开发者实现从解锁手机到自动阅读的稳定运行。

醉三国 246

量化金融笔记1-股票量化基础

股票量化基础 文章目录什么是股票股票的定义及其诞生所解决的问题股票的主体和流通股票的常规分类股票价格收益率什么是股票价格的收益率股票价格收益率计算在python中的实现两种收益率算法的特点及应用场合股票交易规则场内交易与场外交易A股、B股、H股国内多层次的资本市场股票交易指令和撮合机制股票交易时间股票交易成本股票复权股票数据介绍与提取行业分类和指数行情数据因子数据标的数据基本面数据 什么是股票 股票的定义及其诞生所解决的问题 股票的定义:股票是一种有价证券,是股份有限公司公开发行的用以证明投资者的股东身份

折桂狂人的博客 2395

win10+conda+pytorch-gpu安装

pytorch 官网上只有linux和Mac的程序包,没有windows系统的,但是windows系统还是可以用pytorch的。  github: https://github.com/peterjc123/pytorch-scripts 首先要安装anaconda: 推荐清华镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ ...

一摩尔自由的博客 1万+

AUTOSAR AP平台开发避坑指南:基于华为MDC的接口配置与数据通道实战

本文详细解析了AUTOSAR AP平台与华为MDC的协同开发实践,涵盖接口配置、数据通道优化及资源分配策略。通过实战案例展示如何解决传感器接入、通信协议栈优化等常见问题,提升智能驾驶系统性能。特别针对MDC平台特性,提供执行管理、调试调优及安全设计的专业指导,助力开发者高效完成ADAS/AD系统开发。

julia4scientist的博客 1139

【AUTOSAR-COM】-10.5-APP CAN Frame/PDU“发送周期不准“的影响因素

一个Tx PDU在COM模块中的数据流; Tx APP CAN Frame/PDU"发送周期不准"的影响因素;

「汽车电子助手」的博客 2386

探索gtwr of mgtwr in python

代码】探索gtwr of GWmodel in python。

m0_46268055的博客 3388

【AN7581】AN7581 SDK编译环境搭建操作说明

安装编译需要的工具包。

wgl307293845的博客 338

【Python深度学习】做深度学习训练时,如果数据集太大,无法一次性加载进GPU,应该如何做?

方法核心思想优点缺点适用场景实现复杂度小批量训练(Mini-Batch Training)与数据加载器(DataLoader)将数据集划分为小批量,每次只加载一个小批量到GPU中进行训练。- 易于实现- 是深度学习的标准做法- 支持多进程加载- 内存可能成为瓶颈- 需要调整批量大小避免内存不足适用于大部分场景低数据分片与分布式训练(Data Sharding & Distributed Training)将数据集分片,每个GPU或节点处理其中一部分数据,分布式训练。

若北辰 1143

精雕软件(JDpaint) 5.5 绿色版

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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

计算机控制技术及应用

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: [Linux Audio Driver] 高通平台麦克偏置电压取值范围
下一篇: [Linux Camera Driver] 开机之后获取camera型号方法
1byte ≠ 8bit
博客等级 码龄8年 7242粉丝 170原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值