*参照元 [#pb5fc51f] #backlinks *説明 [#v7b2bce4] せつめい -これはなに? *とりあえずメモ領域 [#wff83999] *snd-soc-core.ko [#f31d8674] **SoC のサウンドカードドライバが使う共通モジュール。 [#l720faab] -/lib/modules/current/kernel/sound/soc/snd-soc-core.ko にインストールされる。 --中心となるのは [[linux-2.6.33/sound/soc/soc-core.c]] など。 **謎な点 [#obdf1200] -snd_soc_new_pcms()? --AC97 限定なのか?? --sound/soc/codecs/ の下でしか呼ばれないのはなぜ? -snd_soc_register_dai()? --これも AC97 絡み?? -snd_soc_register_platform()? **デバイス追加時の動き [#xb5b7cce] -snd-soc-core は init 時に "soc-audio" という名前のドライバを platform バスに登録する。 --[[linux-2.6.33/snd_soc_init()]] -SoC 用サウンドカードドライバなどが、 platform バスに "soc-audio" ドライバを使う platform デバイスを追加したとき、 snd-soc-core の soc_probe 関数(probe コールバック)が呼ばれる。 --/sys/bus/platform/drivers にて platform バスのドライバ一覧が見られる。 --[[linux-2.6.33/soc_probe()]] デバイスの追加の仕方(SoC 用サウンドカードドライバ側の init などで行う) ------------------------------------------------------------------------ struct snd_soc_device soc_dev = { ... }; static int __init xxxx_soc_init(void) { dev = platform_device_alloc("soc-audio", -1); //★1 platform_set_drvdata(dev, &soc_dev); //★2 soc_dev.dev = &dev->dev; //★3 ret = platform_device_add(dev); (...) } -説明 --★1: "soc-audio" ドライバを使う platform デバイスを作成する。 --★2: platform デバイスに snd_soc_device へのポインタを持たせる。 --★3: snd_soc_device の dev メンバは、platform デバイスが持っている dev メンバと同じデバイス構造体を指す。 -soc_probe 以降は下記のような処理が行われる。 --[[linux-2.6.33/soc_probe()]] --[[linux-2.6.33/snd_soc_register_card()]] --[[linux-2.6.33/snd_soc_instantiate_cards()]] --[[linux-2.6.33/snd_soc_instantiate_card()]] ** snd_soc_instantiate_card での処理 [#pfe8fd41] -card の probe コールバック --snd_soc_card の probe 関数ポインタをコールバックする。 --[[linux-2.6.33/snd_soc_card]] -cpu_dai の probe コールバック --snd_soc_card の dai_link(snd_soc_dai_link 型の配列へのポインタ)の全要素に対して、 cpu_dai(snd_soc_dai 型)の probe 関数ポインタをコールバックする。 --[[linux-2.6.33/snd_soc_dai_link]] --[[linux-2.6.33/snd_soc_dai]] -device の probe コールバック --snd_soc_device の codec_dev(snd_soc_codec_device 型のポインタ)の probe 関数ポインタをコールバックする。 --[[linux-2.6.33/snd_soc_device]] --[[linux-2.6.33/snd_soc_codec_device]] -platform の probe コールバック --snd_soc_platform の probe 関数ポインタをコールバックする。 --snd_soc_card が要求している platform と一致する platform が ALSA に登録されていることが前提。 登録された platform の一覧は platform_list にある。 --[[linux-2.6.33/snd_soc_platform]] --[[linux-2.6.33/platform_list(global)]] -dai_link の init コールバック --snd_soc_card の dai_link(snd_soc_dai_link 型の配列へのポインタ)の全要素に対して、 init 関数ポインタをコールバックする。 *コメント [#g357d405]