- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Art icles f rom LinkSprite学学习习中中心心
Linux ALSA声声卡卡驱驱动动之之七七 ::ASoC架架构构 中中的的Codec
2014- 03- 08 17:03:31 z o u , baoz hu
1. Codec简简介介
在移动设备中 ,Codec的作用可以归结为4种 ,分别 :
对PCM等信号进行D/A转换 ,把数字的音频信号转换为模拟信号
对Mic 、Linein或者其他输入源的模拟信号进行A/D转换 ,把模拟的声音信号
转变CPU能够处理的数字信号
对音频通路进行控制 ,比如播放音乐 ,收听调频收音机 ,又或者接听电话
时 ,音频信号在codec内的流通路线 不一样的
对音频信号做出相应的处理 ,例如音量控制 ,功率放大 ,E 控制等等
ASoC对Codec的这些功能都定义好了一些列相应的接口 ,以方便地对Codec进行
控制。ASoC对Codec驱动的一个基本要求 :驱动程序的代码必须要做到平台无
关性 ,以方便同一个Codec的代码不经修改即可用在不同的平台上。以下的讨论基
于wolf son的Codec芯片WM8994 ,kernel的版本3.3.x 。
2. ASoC中中对对 Codec的的数数据据抽抽象象
描述Codec的最主要的几个数据结构分别 :
snd_soc_codec ,snd_soc_codec_driver ,snd_soc_dai ,snd_soc_dai_driver ,
其中的snd_soc_dai和snd_soc_dai_driver在ASoC的Plat f orm驱动中也会使用
到 ,Plat f orm和Codec的DA I通过snd_soc_dai_link结构 ,在Machine驱动中进行绑
定连接。下面我们先看看这几个结构的定义 ,这里我只贴出我要关注的字段 ,详细
的定义请参照 :/include/sound/soc.h。
snd_soc_codec :
/* SoC Audio Codec device */
struct snd_soc_codec {
const char *name; /* Codec的名字*/
struct device *dev; /* 指向Codec设备的指针 */
const struct snd_soc_codec_driver *driver; /* 指向该codec的驱动的指针 */
struct snd_soc_card *card; /* 指向Machine驱动的card实例 */
int num_dai; /* 该Codec数字接口的个数,目前越来越多的Codec带有多个I2S或者是PCM接口 */
int (*volatile_register)( ); /* 用于判 某一寄存器是否是volatile */
int (*readable_register)( ); /* 用于判 某一寄存器是否可读 */
int (*writable_register)( ); /* 用于判 某一寄存器是否可写 */
/* runtime */
/* codec IO */
void *control_data; /* 该指针指向的结构用于对codec的控制,通常和read,write字段联合使用 */
enum snd_soc_control_type control_type;/* 可以是SND_SOC_SPI,SND_SOC_I2C,SND_SOC_REGMAP中的一种 */
unsigned int (*read)(struct snd_soc_codec *, unsigned int); /* 读取Codec寄存器的函数 */
int (*write)(struct snd_soc_codec *, unsigned int, unsigned int); /* 写入Codec寄存器的函数 */
/* dapm */
struct snd_soc_dapm_context dapm; /* 用于DAPM控件 */
};
snd_soc_codec_driver:
/* codec driver */
struct snd_soc_codec_driver {
/* driv
文档评论(0)