歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

基於mini2440的UDA1341音頻驅動架構分析

Mini2440開發板

Kernel:linux 2.6.32.2

音頻基於i2s總線接口(和l3總線接口對混音器進行設置)

Linux ASoC音頻設備驅動

ASoC驅動的組成

ASoC(ALSA System on Chip)是ALSA在SoC方面的發展和演變,它在本質上仍然屬於ALSA,但是在ALSA架構的基礎上對CPU相關的代碼和CODEC相關的代碼進行了分離。其原因是,采用傳統ALSA架構的情況下,同一型號的CODEC工作於不同的CPU時,需要不同的驅動,這不符合代碼重用的要求。

ASoC主要由3部分組成。

(1)CODEC驅動。這一部分只關心CODEC本身,與CPU平台相關的特性不由此部分操作。

(2)平台驅動。這一部分只關心CPU本身,不關心CODEC。它主要處理兩個問題:DMA引擎和SoC集成的PCM、I2S或AC’97數字接口的控制。

(3)板驅動。也稱為machine驅動,這一部分將平台驅動和CODEC驅動綁定在一起,描述了板一級的硬件特征。

在以上3部分中,1和2基本上都可以仍然是通用的驅動了,也就是說,CODEC驅動認為自己可以連接任意CPU,而CPU的I2S、PCM、或AC’97接口對應的平台驅動則認為自己可以連接任意符合接口類型的CODEC,只有3是不通用的,由特性的電路板上具體的CPU和CODEC確定,因此它很像一個插座,上面插上了CODEC和平台這兩個插頭。

在以上三部分之上的是ASoC核心層,由內核源代碼中的sound/soc/soc-core.c實現,查看其源代碼發現它完全是一個傳統的ALSA驅動。因此,對於基於ASoC架構的聲卡驅動而言,alsa-lia以及ALSA的一系列utility仍然是可用的,如amixer、aplay均無需針對ASoC進行任何改動。而ASoC的用戶編程方法也和ALSA完全一致。

內核源代碼的Documentation/sound/slsa/soc目錄包含了ASoC相關的文檔。

1.ASoC CODEC驅動

在ASoC架構下,CODEC驅動負責如下工作:

(1)CODEC DAI(Digital Audio Interfaces)和配置PCM,由結構體snd_soc_dai來描述,形容playback、capture的屬性以及DAI接口的操作。

位於內核源代碼include/sound/soc-dai.h

/*

 * Digital Audio Interface runtime data.

 *

 * Holds runtime data for a DAI.

 */

struct snd_soc_dai {

        /* DAI description */      /*DAI的描述*/

        char *name;

        unsigned int id;

        int ac97_control;

 

        struct device *dev;

        void *ac97_pdata;  /* platform_data for the ac97 codec */ /*ac97平台數據*/

 

        /* DAI callbacks */

        int (*probe)(struct platform_device *pdev,

                      struct snd_soc_dai *dai);

        void (*remove)(struct platform_device *pdev,

                        struct snd_soc_dai *dai);

        int (*suspend)(struct snd_soc_dai *dai);

        int (*resume)(struct snd_soc_dai *dai);

 

        /* ops */

        struct snd_soc_dai_ops *ops;

 

        /* DAI capabilities */        /*DAI的能力*/

        struct snd_soc_pcm_stream capture;  /*錄音*/

        struct snd_soc_pcm_stream playback;  /*放音*/

        unsigned int symmetric_rates:1;

 

        /* DAI runtime info */      /*DAI運行時的信息*/

        struct snd_pcm_runtime *runtime;

        struct snd_soc_codec *codec;

        unsigned int active;

        unsigned char pop_wait:1;

        void *dma_data;

 

        /* DAI private data */      /*DAI私有數據*/

        void *private_data;

 

        /* parent platform */      /*父平台*/

        struct snd_soc_platform *platform;

 

        struct list_head list;         /*循環、雙向鏈表*/

};

Copyright © Linux教程網 All Rights Reserved