ASoC Machine 驅動

ASoC machine (或板) 驅動程式是將所有元件驅動程式(例如,編解碼器、平臺和 DAI)粘合在一起的程式碼。 它還描述了每個元件之間的關係,包括音訊路徑、GPIO、中斷、時鐘、插孔和穩壓器。

machine 驅動程式可以包含編解碼器和平臺特定的程式碼。 它將音訊子系統註冊到核心,作為一個平臺裝置,並由以下結構表示:-

/* SoC machine */
struct snd_soc_card {
      char *name;

      ...

      int (*probe)(struct platform_device *pdev);
      int (*remove)(struct platform_device *pdev);

      /* the pre and post PM functions are used to do any PM work before and
       * after the codec and DAIs do any PM work. */
      int (*suspend_pre)(struct platform_device *pdev, pm_message_t state);
      int (*suspend_post)(struct platform_device *pdev, pm_message_t state);
      int (*resume_pre)(struct platform_device *pdev);
      int (*resume_post)(struct platform_device *pdev);

      ...

      /* CPU <--> Codec DAI links  */
      struct snd_soc_dai_link *dai_link;
      int num_links;

      ...
};

probe()/remove()

probe/remove 是可選的。 在這裡進行任何 machine 相關的探測。

suspend()/resume()

machine 驅動程式具有 suspend 和 resume 的 pre 和 post 版本,以處理在編解碼器、DAI 和 DMA 掛起和恢復之前或之後必須完成的任何 machine 音訊任務。 可選。

Machine DAI 配置

machine DAI 配置將所有編解碼器和 CPU DAI 粘合在一起。 它也可以用於設定 DAI 系統時鐘以及任何 machine 相關的 DAI 初始化,例如,machine 音訊對映可以連線到編解碼器音訊對映,未連線的編解碼器引腳可以設定為這樣。

struct snd_soc_dai_link 用於設定你的 machine 中的每個 DAI。 例如:

/* corgi digital audio interface glue - connects codec <--> CPU */
static struct snd_soc_dai_link corgi_dai = {
      .name = "WM8731",
      .stream_name = "WM8731",
      .cpu_dai_name = "pxa-is2-dai",
      .codec_dai_name = "wm8731-hifi",
      .platform_name = "pxa-pcm-audio",
      .codec_name = "wm8713-codec.0-001a",
      .init = corgi_wm8731_init,
      .ops = &corgi_ops,
};

在上面的結構中,dai 是使用名稱註冊的,但你可以傳遞 dai 名稱或裝置樹節點,但不能同時傳遞兩者。 此外,此處用於 cpu/codec/platform dais 的名稱應該是全域性唯一的。

此外,可以使用以下示例宏來註冊 cpu、編解碼器和平臺 dai

SND_SOC_DAILINK_DEFS(wm2200_cpu_dsp,
      DAILINK_COMP_ARRAY(COMP_CPU("samsung-i2s.0")),
      DAILINK_COMP_ARRAY(COMP_CODEC("spi0.0", "wm0010-sdi1")),
      DAILINK_COMP_ARRAY(COMP_PLATFORM("samsung-i2s.0")));

然後,struct snd_soc_card 使用其 DAI 設定 machine。 例如:

/* corgi audio machine driver */
static struct snd_soc_card snd_soc_corgi = {
      .name = "Corgi",
      .dai_link = &corgi_dai,
      .num_links = 1,
};

在此之後,可以使用 devm_snd_soc_register_card 來註冊音效卡。 在註冊期間,會探測各個元件,例如編解碼器、CPU 和平臺。 如果所有這些元件都成功探測,則音效卡將被註冊。

Machine 電源對映

machine 驅動程式可以選擇擴充套件編解碼器電源對映,併成為音訊子系統的音訊電源對映。 這允許自動開啟/關閉揚聲器/HP 放大器等。 編解碼器引腳可以在 machine 初始化函式中連線到 machine 的插孔插座。

Machine 控制

可以在 DAI 初始化函式中新增 machine 特定的音訊混音器控制。

時鐘控制

如前所述,時鐘配置在 machine 驅動程式中處理。 有關 machine 驅動程式可以用於設定的時鐘 API 的詳細資訊,請參閱 音訊時鐘。 但是,回撥需要由 CPU/編解碼器/平臺驅動程式註冊,以配置相應裝置操作所需的時鐘。