ALSA学习(6)——ASoC架构中的platform

本文详细解释了ASoC架构中Platform驱动(特别是snd_soc_platform_driver和snd_soc_dai_driver)的作用,以及它们在音频数据传输中的DMA操作,包括DMA缓冲区的管理、时钟配置、格式设置和中断处理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博客:https://blog.csdn.net/DroidPhone/article/details/7316061

一、Platform驱动在ASoC中的作用

前面几章内容已经说过,ASoC被分为Machine,Platform和Codec三大部件,Platform驱动的主要作用是完成音频数据的管理,最终通过CPU的数字音频接口(DAI)把音频数据传送给Codec进行处理,最终由Codec输出驱动耳机或者是喇叭的音信信号。在具体实现上,ASoC有把Platform驱动分为两个部分:snd_soc_platform_driver和snd_soc_dai_driver。其中,platform_driver负责管理音频数据,把音频数据通过dma或其他操作传送至cpu dai中,dai_driver则主要完成cpu一侧的dai的参数配置,同时也会通过一定的途径把必要的dma等参数与snd_soc_platform_driver进行交互。

二、snd_soc_platform_driver的注册

通常,ASoC把snd_soc_platform_driver注册为一个系统的platform_driver,不要被这两个相像的术语所迷惑,前者只是针对ASoC子系统的,后者是来自Linux的设备驱动模型。我们要做的就是:
定义一个snd_soc_platform_driver结构的实例;
在platform_driver的probe回调中利用ASoC的API:snd_soc_register_platform()注册上面定义的实例;
实现snd_soc_platform_driver中的各个回调函数;
以kernel3.3中的/sound/soc/samsung/dma.c为例:

static struct snd_soc_platform_driver samsung_asoc_platform = {
   
	.ops		= &dma_ops,
	.pcm_new	= dma_new,
	.pcm_free	= dma_free_dma_buffers,
};
 
static int __devinit samsung_asoc_platform_probe(struct platform_device *pdev)
{
   
	return snd_soc_register_platform(&pdev->dev, &samsung_asoc_platform);
}
 
static int __devexit samsung_asoc_platform_remove(struct platform_device *pdev)
{
   
	snd_soc_unregister_platform(&pdev->dev);
	return 0;
}
 
static struct platform_driver asoc_dma_driver = {
   
	.driver = {
   
		.name = "samsung-audio",
		.owner = THIS_MODULE,
	},
 
	.probe = samsung_asoc_platform_probe,
	.remove = __devexit_p(samsung_asoc_platform_remove),
};
 
module_platform_driver(asoc_dma_driver);

snd_soc_register_platform() 该函数用于注册一个snd_soc_platform,只有注册以后,它才可以被Machine驱动使用。它的代码已经清晰地表达了它的实现过程:
为snd_soc_platform实例申请内存;
从platform_device中获得它的名字,用于Machine驱动的匹配工作;
初始化snd_soc_platform的字段;
把snd_soc_platform实例连接到全局链表platform_list中;
调用snd_soc_instantiate_cards,触发声卡的machine、platform、codec、dai等的匹配工作;

三、cpu的snd_soc_dai driver驱动的注册

dai驱动通常对应cpu的一个或几个I2S/PCM接口,与snd_soc_platform一样,dai驱动也是实现为一个platform driver,实现一个dai驱动大致可以分为以下几个步骤:

  1. 定义一个snd_soc_dai_driver结构的实例;
  2. 在对应的platform_driver中的probe回调中通过API:snd_soc_register_dai或者snd_soc_register_dais,注册snd_soc_dai实例;
  3. 实现snd_soc_dai_driver结构中的probe、suspend等回调;
  4. 实现snd_soc_dai_driver结构中的snd_soc_dai_ops字段中的回调函数;
    snd_soc_register_dai 这个函数在上一篇介绍codec驱动的博文中已有介绍,请参考:ALSA学习(6)——:ASoC架构中的Codec。
  5. snd_soc_dai 该结构在snd_soc_register_dai函数中通过动态内存申请获得, 简要介绍一下几个重要字段:
  6. driver 指向关联的snd_soc_dai_driver结构,由注册时通过参数传入;
  7. playback_dma_data 用于保存该dai播放stream的dma信息,例如dma的目标地址,dma传送单元大小和通道号等;
    capture_dma_data 同上,用于录音stream;
  8. platform 指向关联的snd_soc_platform结构;
  9. snd_soc_dai_driver 该结构需要自己根据不同的soc芯片进行定义,关键字段介绍如下:
  10. probe、remove 回调函数,分别在声卡加载和卸载时被调用;
  11. suspend、resume 电源管理回调函数;
  12. ops 指向snd_soc_dai_ops结构,用于配置和控制该dai;
  13. playback snd_soc_pcm_stream结构,用于指出该dai支持的声道数,码率,数据格式等能力;
  14. capture snd_soc_pcm_stream结构,用于指出该dai支持的声道数,码率,数据格式等能力;

四、snd_soc_dai_driver中的ops字段

ops字段指向一个snd_soc_dai_ops结构,该

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永不秃头的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值