linux audio codec driver構造

2998 ワード

本稿ではmax 98088を参照装置として行う.
私自身もaudioを勉強して、多くの交流に基づいて、互いに進歩する原則に基づいて流れを書いています.
レンガを撮ることを歓迎します.勉強中に間違ったところがあったら指摘してください.
基本構成:
cpu_dai-------はI 2 C通路を指す.
codec_dai-----codecの機能、例えば録音放音パラメータ.
codec_dev-----復号デバイス、ポイント
platform------pcmの操作関数とdmaの割り当てをしただけだと思います
1.soc-audioデバイスをファイルに登録し、soc-coreのprobeを起動する
当社の登録
  our_audio_device = snd_soc_dai_link("soc-audio", -1);
platform_set_drvdata(our_audio_device, &our_audio_device_data)


our_audio_device_dataにはcardとcodecが含まれています.dev、cardにはsnd_が含まれていますsoc_dai_link, 
snd_soc_dai_linkにcpuを含めるdai,codec_dai、これらは比較的簡単で、言うまでもない.
 
2.soc-coreのprobeに入ります.soc-audioデバイスを登録しているので、soc-coreのprobeを呼び出します.
soc_probe->snd_soc_register_card->snd_soc_instantiate_cards->snd_soc_instantiate_card
 
たくさんのジャンプがあって、みんなが知っていると思います.もう余計なことを言わないで、テーマに入ります.
3.snd_soc_instantiate_cardでplatformをマッチング
if (card->platform == platform)
 
次にcpu_をマッチングdai
if (card->dai_link[i].cpu_dai == dai)
 
さらにcodec_dai
if (card->dai_link[i].codec_dai == dai)
 
全部見つかったらcard->probeを行いますが、普通はありません.
if (card->probe)
 
さらにcpu_を行いますdaiの初期化は,i 2 sインタフェースの初期化である.
ret = cpu_dai->probe(pdev, cpu_dai);
 
codec_の再実行devのprobe、soc_codec_dev_max 98088,これに重点を置いて、後で討論します
ret = codec_dev->probe(pdev);
 
このprobeは普通もありません. 
ret = platform->probe(pdev);
 
待ち行列の初期化
INIT_DELAYED_WORK(&card->delayed_work, close_delayed_work);
 
メインイベントが来たcodec_devのprobe
1. snd_soc_new_pcmsでsnd_を呼び出すcard_createはPCMベースのサウンドカードデバイスを作成します. 
 
snd_card_createサウンドカードを作成しsnd_に入りますcard_createでは、
snd_ctl_createサウンドカードdeviceの操作方法を定義し、snd_device_newはサウンドカードデバイスを作成し、チェーンテーブルに登録します.
 
2.snd_に戻るsoc_new_pcmsでsoc_を見てnew_pcm.
 
codecとdaiをリンクし、snd_pcm_newでSNDRV_を作成するPCM_STREAM_PLAYBACKとSNDRV_PCM_STREAM_CAPTUREフロー
そしてsnd_device_Newはpcmのデバイスを作成します.
 
3.soc_に戻るnew_pcmではsoc_pcm_ops賦値とは、platformのopsをすべて指すことです.
 
4.platformのnewを呼び出し、dmaを作成する. 
ret = platform->pcm_new(codec->card, codec_dai, pcm);
これでPCMのデータロードが登録され、制御情報が登録されます.snd_kcontrol_new構造体.
 
max 98088蔵のほうが深いですね.見つけました.
max 98088_へadd_widgets(codec);
 
この登録は比較的簡単で、これ以上説明しません.
snd_soc_add_controls(codec, max98088_snd_controls,
    ARRAY_SIZE(max98088_snd_controls));
 
最後はsnd_soc_init_card、これは言うまでもなく、山積みで、最後はOKです.