ALSA Documentation:Codec_txt

ASoC Codec驱动程序

编解码器类驱动程序是通用且独立于硬件的代码,用于配置编解码器、FM、MODEM、BT 或外部 DSP 以提供音频播放和录音。它不应包含特定于目标平台或机器的代码。所有平台和机器特定代码都应添加到平台中。
Codec驱动所在的目录: sound/soc/codecs/

每个编解码器类驱动程序必须提供以下功能:

  1. Codec DAI 和 PCM的 配置
  2. Codec 控制 IO,使用 RegMap API
  3. 混音器和音频控制
  4. Codec音频操作
  5. DAPM 说明。
  6. DAPM 事件处理程序。

可选项:
7. DAC 数字mute控制。

Codec DAI 和 PCM 配置

由 struct snd_soc_dai_driver 来定义它的 DAI 和PCM 功能和操作。这个结构被导出被导出后内核注册。

e.g

static struct snd_soc_dai_ops wm8731_dai_ops = {
	.prepare = wm8731_pcm_prepare,
	.hw_params = wm8731_hw_params,
	.shutdown = wm8731_shutdown,
	.digital_mute = wm8731_mute,
	.set_sysclk = wm8731_set_dai_sysclk,
    .set_fmt = wm8731_set_dai_fmt,
 };

struct snd_soc_dai_driver wm8731_dai = {
    .name = "wm8731-hifi",
    .playback = {
    .stream_name = "Playback",
    .channels_min = 1,
    .channels_max = 2,
    .rates = WM8731_RATES,
    .formats = WM8731_FORMATS,},
    .capture = {
    .stream_name = "Capture",
    .channels_min = 1,
    .channels_max = 2,
    .rates = WM8731_RATES,
    .formats = WM8731_FORMATS,},
    .ops = &wm8731_dai_ops,
    .symmetry_rates = 1,
};

Codec控制

Codec通常可以通过 I2C 或 SPI 接口进行控制(AC97 将结合控制数据和音频合并起来)。Codec驱动程序应使用所有Codec IO 的 Regmap API。可见 include/linux/regmap.h 和目录下的Codec驱动程序,借鉴regmap 用法。

混音器和音频控制

所有Codec混音器和音频控件都可以使用soc.h 中定义的宏。
#define SOC_SINGLE(xname, reg, shift, mask, invert) ​
定义单个控件如下:
xname = Control name e.g. "Playback Volume" reg = codec寄存器 shift = 寄存器中的控制位偏移 mask = 控制位大小,例如7 = 3 位掩码 invert = 控制反转 ​

其他宏定义:

#define SOC_DOUBLE(xname, reg, shift_left, shift_right, mask, invert)

立体声控制

#define SOC_DOUBLE_R(xname, reg_left, reg_right, shift, mask, invert)

跨越 2 个寄存器的立体声控制

#define SOC_ENUM_SINGLE(xreg, xshift, xmask, xtexts)

定义单个枚举控件如下:

   xreg = 注册
   xshift = 寄存器中的控制位偏移
   xmask = 控制位大小
   xtexts = 指向描述每个设置的字符串数组的指针

   #define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xtexts)

Codec音频操作

编解码器驱动程序还支持以下 ALSA PCM 操作:

  /* 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 *);
  };

有关详细信息,请参阅 ALSA 驱动程序 PCM 文档。
http://www.alsa-project.org/~iwai/writing-an-alsa-driver/

DAPM 说明

动态音频电源管理描述了Codec电源组件及其关系和到 ASoC core的寄存器。具体再请阅读 dapm.txt。

DAPM 事件处理程序

该函数是一个回调,处理了Codec PM 调用和系统 PM 调用(例如挂起和恢复)。
电源状态:

	SNDRV_CTL_POWER_D0: /* full On */
	/* vref/mid, clk and osc on, active */

	SNDRV_CTL_POWER_D1: /* partial On */
	SNDRV_CTL_POWER_D2: /* partial On */

	SNDRV_CTL_POWER_D3hot: /* Off, with power */
	/* everything off except vref/vmid, inactive */

	SNDRV_CTL_POWER_D3cold: /* Everything Off, without power */

Codec DAC 数字静音控制

大多数Codec在 DAC 之前都有一个数字静音,可用于尽量减少任何系统噪音。Mute操作阻止任何数字数据进入 DAC。

可以为每个编解码器 DAI 创建一个由核心调用的回调当mute被使用或释放。

static int wm8974_mute(struct snd_soc_dai *dai, int mute)
{
	struct snd_soc_codec *codec = dai->codec;
	u16 mute_reg = snd_soc_read(codec, WM8974_DAC) & 0xffbf;

	if (mute)
		snd_soc_write(codec, WM8974_DAC, mute_reg | 0x40);
	else
		snd_soc_write(codec, WM8974_DAC, mute_reg);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值