----------------------------------------------------------------------------------------------------------------------------
开发板 :NanoPC-T4开发板eMMC :16GBLPDDR3 :4GB显示屏 :15.6英寸HDMI接口显示屏u-boot :2023.04linux :6.3----------------------------------------------------------------------------------------------------------------------------
在上一篇博客我们介绍了ALSA子系统的软件架构,同时介绍了ALSA CORE核心数据结构和相关API。本节我们将会介绍ASoC软件体系中音频三大驱动模块(Codec、Platform 和Machine)中的Platform 。
Platform driver主要是平台相关的DMA操作以及音频管理。大概流程:
- DMA driver :先通过DMA驱动将dma buffer中的音频数据搬运到 I2S tx FIFO;
- cpu dai driver:然后再通过cpu_da驱动将音频数据从I2S tx FIFO搬运Codesc中,数据会在Codec侧进行解码的操作,最终输出到耳机/音箱中。
一、核心数据结构
DMA driver和cpu dai driver两大类功能在ASoC中主要使用4个数据结构表示:snd_soc_dai、snd_soc_dai_driver、snd_soc_component、snd_soc_component_driver;
- snd_soc_dai:描述cpu端的dai;
- snd_soc_dai_driver:描述cpu端的dai驱动;其中包括dai的配置(音频格式、clock、音量等);
- snd_soc_component:和Machine一样,使用snd_soc_component结构对ASoC中的platform设备进行统一抽象;
- snd_soc_component_driver:代表Platform使用的dma驱动。主要是数据的传输等;
1.1 struct snd_soc_component
ASoC使用snd_soc_component来描述platform设备,定义在include/sound/soc-component.h:
struct snd_soc_component {
const char *name;
int id;
const char *name_prefix;
struct device *dev;
struct snd_soc_card *card;
unsigned int active;
unsigned int suspended:1; /* is in suspend PM state */
struct list_head list;
struct list_head card_aux_list; /* for auxiliary bound components */
struct list_head card_list;