参照元

説明

FIXME: なにをするもの?

参考: private_data について

ALSA のコールバック API に渡ってくる構造体から、 ドライバの独自データを獲る方法について。

ALSA SoC Layer を使う場合とそうでない場合が大きく違っていて、 難しすぎだろこれ…。

ALSA SoC Layer を使わない場合

ALSA SoC Layer を使っていて、CPU/CODEC DAI の場合

ALSA SoC Layer を使っていて、Card の場合

関連モジュール

必要そうなものメモ。

包含関係

- snd_soc_platform_driver
  - snd_pcm_ops

包含関係

- snd_soc_component_driver

- snd_soc_dai_driver
  - snd_soc_dai_ops
  - snd_soc_pcm_stream

包含関係

- snd_soc_card
  - snd_soc_dai_link
    - snd_soc_dpcm_trigger
    - snd_soc_ops
    - snd_soc_compr_ops
  - snd_soc_codec_conf
  - snd_soc_kcontrol_new
  - snd_soc_dapm_widget
  - snd_soc_dapm_route

platform_bus を使う場合、

struct hoge_device {
    struct snd_soc_card card;
};

static int hoge_probe(struct platform_device *pdev)
{
    struct hoge_device *d;
    struct device *dev = &pdev->dev;
    ...
    d = devm_kzalloc(dev, sizeof(struct hoge_device));
    ...
    snd_soc_register_platform(dev, &hoge_snd_soc_platform_driver);
    ...
    snd_soc_register_component(dev, &hoge_snd_soc_component_driver,
        hoge_snd_soc_dai_drivers, ARRAY_SIZE(hoge_snd_soc_dai_drivers));
    ...
    //FIXME: 他の手立てがありそう
    d->card.dev = dev;
    snd_soc_card_set_drvdata(&d->card, d);
    snd_soc_register_card(&d->card);
    ...
    return 0;
}
static int hoge_remove(struct platform_device *pdev)
{
    struct snd_soc_card *card = platform_get_drvdata(pdev);
    struct hoge_device *d = snd_soc_card_get_drvdata(card);
    struct device *dev = &pdev->dev;
    ...
    snd_soc_unregister_card(&d->card);
    ...
    snd_soc_unregister_component(dev);
    ...
    snd_soc_unregister_platform(dev);
    ...
    return 0;
}

static struct platform_driver hoge_driver = {
    .driver = {
        .name = "hoge",
    },
    .probe = hoge_probe,
    .remove = hoge_remove,
};
module_platform_driver(hoge_driver);

コメント


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS