参考文章
https://winddoing.github.io/post/50356.html
https://zhuanlan.zhihu.com/p/491104374
ALSA总体框图
ASoC 被分为 Machine、Platform 和 Codec 三大部分。
其中的 Machine 驱动负责 Platform 和 Codec 之间的耦合和设备或板子特定的代码。Platform 驱动的主要作用是完成音频数据的管理,最终通过 CPU 的数字音频接口(DAI)把音频数据传送给 Codec 进行处理,最终由 Codec 输出驱动耳机或者是喇叭的音信信号。
platform驱动:
platform驱动为cpu部分的控制代码,其抽象出两个结构体snd_soc_dai_driver和snd_soc_platform_driver;
platform用于实现平台相关的 DMA 驱动和音频接口等。
它只关心 CPU 本身,不关心 Codec。主要处理两个问题:DMA引擎 和 SoC集成的PCM、I2S或AC '97数字接口控制。主要作用是完成音频数据的管理,最终通过 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 进行交互。
codec驱动:
codec驱动是编解码器部分的控制代码,其抽象出两个结构体分别为snd_soc_dai_driver和snd_soc_codec_driver;
用于实现平台无关的功能,如寄存器读写接口,音频接口,各 widgets 的控制接口和 DAPM 的实现等。
codec的作用可以归纳为以下4种:
- DAC
- ADC
- 音频通路控制
- 音频信号处理:音量控制,功率放大,EQ控制等;
machine驱动:
用于描述设备组件信息和特定的控制如耳机 / 外放等。machine是指某一款机器,可以是某款设备,某款开发板,又或者是某款智能手机,由此可以看出 Machine 几乎是不可重用的,每个 Machine 上的硬件实现可能都不一样,CPU 不一样,Codec 不一样,音频的输入、输出设备也不一样,Machine 为 CPU、Codec、输入输出设备提供了一个载体。
这一部分将平台驱动和 Codec 驱动绑定在一起,描述了板级的硬件特征。主要负责 Platform 和 Codec 之间的耦合以及部分和设备或板子特定的代码。Machine 驱动负责处理机器特有的一些控件和音频事件(例如,当播放音频时,需要先行打开一个放大器);单独的 Platform 和 Codec 驱动是不能工作的,它必须由 Machine 驱动把它们结合在一起才能完成整个设备的音频处理工作。ASoC 的一切都从 Machine 驱动开始,包括声卡的注册,绑定 Platform 和 Codec 驱动等等。
machine驱动是控制管理platform和codec之间的连接匹配,管理控件(controls)、部件(widgets)以及routes,其抽象的结构体为snd_soc_card。
https://zhuanlan.zhihu.com/p/491104374
ASoc结构图
ASoC 对于 Alsa 来说,就是分别注册 PCM/CONTROL 类型的 snd_device 设备,并实现相应的操作方法集。
- Codec 驱动向 ASoC 注册 snd_soc_codec 和 snd_soc_dai 设备。
- Platform 驱动向 ASoC 注册 snd_soc_platform 和 snd_soc_dai 设备。
- Machine 驱动通过 snd_soc_dai_link 绑定 codec/dai/platform.
https://winddoing.github.io/post/50356.html