内核资料好多好多,一个人摸索真的很难。
最近又卡住了,没办法向前进了。声卡,资料真的好多。没有一个系统的视频或者学习资料真的感觉无从下手。
只能用时间耗了,先堆一些枯燥的资料。等我哪天茅塞顿开了,再来写心得吧!
Master clock:每一个音频子系统都需要一个主时钟,通常被称作MCLK或者SYSCLK,主时钟可以来自外部晶振,锁相环或者CPU系统时钟.某些时钟源是
可以配置的,通常为了省电会降低系统的工作频率.
DAI(digital audio interface) Clocks:通常由BCLK驱动(bit clock),主要用来驱动CPU和codec之间的数据链路.
同时 DAI 在每个audio封包的开始也有一个帧时钟.这个时钟也常被成为 LRCLK(左右声道时钟).这个时钟的频率和采样率频率相同.
BCLK的产生:
BCLK = MCLK / x 或者 BCLK = LRC * x 或者 BCLK = LRC * Channels * Word Size
这个时钟和CPU与codec关系比较大.一般来说尽可能降低你的BCLK,为了省电。
如果IC支持:常常可以看到我们用codec来驱动 audio clock,因为它的采样率通常都会被CPU准很多
ASoC Platform Driver:
1.一个ASoC平台驱动可以分为 音频DMA 和DAI 的配置和控制.它只针对CPU进行实现,绝不包含任何单板相关内容.
a.Audio DMA
一般 可支持ALSA(advanced linux sound arch)操作:
/* SoC audio ops */
struct snd_soc_ops {
int (*startup)(struct snd_pcm_substream *);
void (*shutdown)(struct snd_pcm_substream *);
int (*hw_params)(struct snd_pcm_substream *, struct snd_pcm_hw_params *);
int (*hw_free)(struct snd_pcm_substream *);
int (*prepare)(struct snd_pcm_substream *);
int (*trigger)(struct snd_pcm_substream *, int);
};
主要数据结构:
struct snd_soc_platform_driver {
char *name;
int (*probe)(struct platform_device *pdev);
int (*remove)(struct platform_device *pdev);
int (*suspend)(struct platform_device *pdev, struct snd_soc_cpu_dai *cpu_dai);
int (*resume)(struct platform_device *pdev, struct snd_soc_cpu_dai *cpu_dai);
/* pcm creation and destruction */
int (*pcm_new)(struct snd_card *, struct snd_soc_codec_dai *, struct snd_pcm *);
void (*pcm_free)(struct snd_pcm *);
/*
* For platform caused delay reporting.
* Optional.
*/
snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *,
struct snd_soc_dai *);
/* platform stream ops */
struct snd_pcm_ops *pcm_ops;
};
参考:http://www.alsa-project.org/~tiwai/writing-an-alsa-driver/
b.SoC DAI Drivers
每个DAI 必须提供以下描述信息:
1) 数字音频接口的描述信息
2) 数字音频接口的配置信息
3) PCM的相关描述说明
4) SYSCLK 的配置
5) Suspend(挂起) and resume(恢复) (可选)
ASoC 的DAI目前支持三种接口:AC97,I2S,PCM
1.AC97(Audio Codec97)
在便携式设备的声卡上比较常见的一种五线式接口.
有一个复位线和分时多路复用的SDATA_OUT(playback)和SDATA_IN(capture)
BCLK通常由codec驱动(通常12.288MHZ).帧率(48KHZ)总是由控制器驱动
每个AC97帧长12us,被分为13个时间间隙
早期的ISA声卡由于集成度不高,声卡上散布了大量元器件,后来随着技术和工艺水平的发展,出现了单芯片的声卡,只用一块芯片就可以完成声卡所有的功能。
但是由于声卡的数字部分和模拟部分集成在一起,很难降低电磁干扰对模拟部分的影响,使得ISA声卡信噪比并不理想。
AC97标准则提出“双芯片”结构,即将声卡的数字与模拟两部分分开,每个部分单独使用一块芯片。AC97标准结合了数字处理和模拟处理两方面的优点,一方面减少
了由模拟线路转换至数字线路时可能会出现的噪声,营造出了更加纯净的音质;另一方面,将音效处理集成到芯片组后