2399767_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2399767_ja-JP

2399767_ja-JP

i.MX 8M Mini SAI: BCLKが停止する前にI2Cコーデック制御を実行する場所(PREEMPT_RT)
We are developing a system using an i.MX 8M Mini connected to an external audio codec (controlled via I2C) through SAI (I2S), running a kernel with the PREEMPT_RT configuration.

We need to perform codec operations (I2C) before the I2S BCLK stops.
Where would be the best place to insert this I2C handling?
Re: i.MX 8M Mini SAI: Where to perform I2C codec control before BCLK stops (PREEMPT_RT)

最適な場所:FSL-SAI CPU DAIトリガー(STOP)が実行される前にASoCの停止パスに「必須実行」操作を配置してください。できればコーデック/コンポーネントのストップトリガーコールバック、またはCPUのDAI停止前に注文されたマシン-ドライバリンク/コンポーネントトリガーコールバックとして。

なぜか:8M Mini i.MX NXP fsl_sai_trigger()はFIFO DMA要求や割り込みを無効にし、その後fsl_sai_config_disable()を呼び出してFSL_SAI_CSR_TEREをクリアし、現在のフレームが完成するまで待つことで処理SNDRV_PCM_TRIGGER_STOP。マスターモードではSAIブロックをリセットします。それは、SAIによって生成されたBCLKが停止/無効化される時点です。i.MX8MM SAIドライバーはDAI操作で.trigger = fsl_sai_trigger、.hw_free = fsl_sai_hw_freeとして登録されているhw_freeため、「BCLKが停止する前に」という要件はすでに遅すぎます。

ボード固有のBSPハックでない限り、fsl_sai_trigger()の中にコーデックI2Cを直接追加することは避けるべきです。汎用CPU-DAIドライバーを1つのコーデック/ボードポリシーに結合させます。Linux/NXP ASoCの分割は、コーデック制御I/Oをコーデックドライバに、CPUインターフェース制御をプラットフォーム/CPU DAIドライバに保持することを意図しています。NXPのドキュメントでは、I2Cを経由したコーデック制御I/OをASoC DAI操作を通じてエクスポートするコーデック・ドライバ機能として説明しています。

2つの実用的な実装パターン:

  • コーデック DAI .trigger() /コンポーネント .trigger() STOP 用
    • SNDRV_PCM_TRIGGER_STOP / SUSPEND / PAUSE_PUSH にコーデックレジスタ書き込みを追加します。
    • このコールバックが CPU DAI fsl_sai_trigger(STOP の前に実行されるようにしてください。
    • 現在のASoCでは、デフォルトのストップオーダーはDAI -> コンポーネント->リンクであり、DAIの反復はCPUのDAIの次にコーデックDAIなので、CPUのDAIが先の場合はコーデックDAIトリガーが遅すぎる可能性があります。
    • コンポーネントトリガーを使い、保持/デフォルト停止順序を保持すると、コンポーネント停止はリンクコールバックの前、DAI後はデフォルト順序でのみ実行されます。あるいは、カーネルが対応しているならDAIリンクのtrigger_stop順序を適切に設定することもできます。
  • マシンドライバー snd_soc_ops.trigger()/ リンクトリガー
    • 停止コマンド用に、マシンドライバの.trigger()にボード固有のコーデックI2Cシーケンスを入れます。
    • ASoCトリガーのご注文を使い、リンクレベルのストップがDAIストップの前に実行されるようにします。カーネルは、停止順序 Component -> DAI -> Link として文書化された SND_SOC_TRIGGER_ORDER_LDC を公開し、デフォルトの停止順序は DAI -> Component -> Link です。選択したコールバックを fsl_sai_trigger(STOP) の前に配置するように順序を選択してください。
    • シーケンスが一般的なコーデックの動作ではなく、ボード/システムのポリシーである場合、ここが最もクリーンな場所となることが多い。

重要なPREEMPT_RT:通常のI2C転送はタスクコンテキスト操作であり、カーネルI2Cのドキュメントによると、I2Cプロトコル操作はタスクコンテキストでのみ使用可能であり、特別な遅延シャットダウンケース向けにオプションのアトミック転送フックが用意されています。したがって、PCM/ASoCパスが非アトミックとして構成され、カーネル内でコールバックコンテキストが検証されている場合を除き、アトミックPCMトリガーパスからブロッキングI2Cを実行しないでください。トリガーパスがアトミックな場合は、より安全なアーキテクチャを使用してください。コーデックの状態を早めに準備するか、BCLKを連続/ゲート状態に後から維持するか、CPU DAIトリガーで生のI2Cを実行するのではなく、スリープ可能な順序付きストップパスに操作を移動してください。

タグ(1)
評価なし
バージョン履歴
最終更新日:
水曜日
更新者: