ALSA总结之platform简析


前言

前文ALSA总结中提到,ASOC中的框架有三部分,Machine、Platform以及Codec,Machine主要是注册声卡实体,Codec是针对数模设备,本文主要针对ALSA 中Platform部分简要分析。

一、Platform/cpu

一般来说,Platform driver部分主要针对dma的初始化,cpu driver主要针对I2S的初始化,但是在驱动的注册过程中,一般将这两部分的初始化放在一起进行。

static int snd_afe_i2s_sc_probe(struct platform_device *pdev)
{
   
	//节选如下部分代码
	struct device *dev = &pdev->dev;
	struct sdrv_afe_i2s_sc *afe;
	int ret;
	struct resource *res;
	unsigned int irq_id, value;
	
	afe = devm_kzalloc(dev, sizeof(struct sdrv_afe_i2s_sc), GFP_KERNEL);
	if (afe == NULL){
   
		return -ENOMEM;
	}
	platform_set_drvdata(pdev, afe);//将pdev中的私有指针保存afe结构
	/* Get register and print */
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);//获取设备树中I2S的资源
	afe->regs = devm_ioremap_resource(afe->dev, res);//将物理地址转化为虚拟地址
	
	/* Get irq and setting */
	irq_id = platform_get_irq(pdev, 0);
	devm_request_irq(afe->dev, irq_id, sdrv_i2s_sc_irq_handler, 0, pdev->name, (void *)afe);

	devm_snd_dmaengine_pcm_register(dev, &sdrv_dmaengine_pcm_config, 0);//重点函数  Platform端 dma的初始化
	
	memcpy(&afe->dai_drv, &snd_afe_dai_template, sizeof(struct snd_soc_dai_driver));
	devm_snd_soc_register_component(dev, &snd_afe_soc_component,&afe->dai_drv,1);//重点函数   cpu端的初始化
	
	afe_i2s_sc_config(afe);
	return 0;
}

在前文中有提到,在声卡的注册过程中,会去配对已经注册的组件,则soc_probe_link_componentssoc_probe_link_dais二个配对函数,在soc_probe_link_components中会调用platform->probe,soc_probe_link_dais中会调用cpu->probe,这二个probe则在上面代码注释中的二个重点函数中进行注册。

二、devm_snd_dmaengine_pcm_register注册函数

int devm_snd_dmaengine_pcm_register(struct device *dev,
	const struct snd_dmaengine_pcm_config *config, unsigned int flags)
{
   
	struct device **ptr;
	int ret;

	ptr = devres_alloc(devm_dmaengine_pcm_release, sizeof(*ptr), GFP_KERNEL);
	if (!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值