1. 程式人生 > >ASoC Codec類驅動程式

ASoC Codec類驅動程式

ASoC Codec類驅動程式

編解碼器類驅動程式是通用的,與硬體無關的程式碼,用於配置編解碼器,FM,MODEM,BT或外部DSP,以提供音訊捕獲和回放。它不應包含特定於目標平臺或計算機的程式碼。應將所有平臺和機器特定程式碼分別新增到平臺和機器驅動程式中。

每個編解碼器類驅動程式必須提供以下功能: -

  1. 編解碼器DAI和PCM配置
  2. 編解碼器控制IO - 使用RegMap API
  3. 調音臺和音訊控制
  4. 編解碼器音訊操作
  5. DAPM描述。
  6. DAPM事件處理程式。

可選的,編解碼器驅動程式還可以提供: -

  1. DAC數字靜音控制。

最好將本指南與sound / soc / codecs /中的現有編解碼器驅動程式程式碼結合使用

ASoC Codec驅動程式故障

編解碼器DAI和PCM配置

每個編解碼器驅動程式必須具有struct snd_soc_dai_driver來定義其DAI和PCM功能和操作。匯出此結構,以便您的計算機驅動程式可以將其註冊到核心。

例如

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,
      .symmetric_rates = 1,
};

編解碼器控制IO

編解碼器通常可以通過I2C或SPI樣式介面進行控制(AC97將控制與DAI中的資料相結合)。編解碼器驅動程式應該將Regmap API用於所有編解碼器IO。請參閱include / linux / regmap.h和現有的編解碼器驅動程式,例如regmap用法。

調音臺和音訊控制

所有編解碼器混音器和音訊控制元件都可以使用soc.h中定義的便利巨集來定義。

#define SOC_SINGLE(xname,reg,shift,mask,invert)

定義單個控制元件如下: -

xname = Control name e.g. "Playback Volume"
reg = codec register
shift = control bit(s) offset in register
mask = control bit size(s) e.g. mask of 7 = 3 bits
invert = the control is inverted

其他巨集包括: -

#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)

定義單個列舉控制元件,如下所示: -

xname = Control name e.g. "Playback Volume"
reg = codec register
shift = control bit(s) offset in register
mask = control bit size(s) e.g. mask of 7 = 3 bits
invert = the control is inverted

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

定義立體聲列舉控制元件

編解碼器音訊操作

編解碼器驅動程式還支援以下ALSA PCM操作: -

/ * SoC音訊操作* /
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描述

動態音訊電源管理描述描述了編解碼器電源元件及其與ASoC核心的關係和暫存器。有關構建描述的詳細資訊,請閱讀dapm.txt。

另請參閱其他編解碼器驅動程式中的示例。

DAPM事件處理程式

此函式是一個回撥函式,用於處理編解碼器域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數字靜音控制

大多數編解碼器在DAC之前都有數字靜音,可用於最小化任何系統噪聲。靜音可以阻止任何數字資料進入DAC。

當應用或釋放靜音時,可以為每個編解碼器DAI建立一個由核心呼叫的回撥。

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;
}