IMX8Nano カーネル 5.15 カスタム ボードを使用していますが、SAI5 の TDM16 に問題があります
問題は、TDM 16 ストリームの場合、チャンネルがランダムに 8 チャンネルずつ切り替わることです。カーネルトレースを追加し、fsl_saiドライバーから次のデバッグを確認します
if (フラグ & FSL_SAI_CSR_FEF) {
dev_dbg(dev, "isr: 送信アンダーランを検出しました\n");
ドライバーはこの状態で FIFO リセットを実行する必要がありますが、これは発生しないか、効果がありません。
次にアンダーランが発生したときに、16 チャンネル構成で常に 8 チャンネルアウトのステップインとして、チャンネルは再調整されます。
SAI はスレーブ モードであり、送信回線のみがアクティブになっています。
&sai5 {
#sound-dai-cells = <0>;
pinctrl-names = "デフォルト";
ピンctrl-0 = <&pinctrl_sai5>;
fsl,dataline = <0 0x00 0xff>;
DMas = <&sdma2 8 24 0>, <&sdma2 9 24 0>;
fsl,txmasterflag = <1>;
status = "大丈夫";
};
simpl-audio-card f の使用
出力1 {
compatible = "シンプルオーディオカード";
simple-audio-card,name = "SAI51";
シンプルオーディオカード、ステータス="大丈夫";
シンプルオーディオカード、ビットクロックマスター= <&spdif_codec1>;
シンプルオーディオカード、フレームマスター= <&spdif_codec1>;
シンプルオーディオカード、フォーマット= "left_j";
CPU1:シンプルオーディオカード、CPU {
sound-dai = <&sai5>;
dai-tdm-slot-num = <16>;
dai-tdm-slot-width = <32>;
};
spdif_codec1: simple-audio-card,codec {
サウンドダイ= <&codec_out1>;
};
};
codec_out1: 1output_txcodec {
#sound-dai-cells = <0>;
#address セル= <0>;
#size セル= <0>;
compatible = "linux,spdif-dit";
サウンド名プレフィックス= "spdif_codec1";
status = "大丈夫";
};
私たちは、オンライン上のさまざまな投稿からこれに対するいくつかの修正を試しましたが、成功しませんでした。
他の誰かがそのような問題を見ましたか?このアンダーランは、インターアップが早期に発生したため、すべてのチャネルのDMAに十分なデータがないと想定しています。
また、再生ログにエラーはなく、TDM8モードにもエラーはありません。
どんな助けでも大歓迎です。
私たちは問題を脇に押しやった。しかし、dtsの観点から他の人と共有するために、ここで学んだいくつかの重要な教訓があります。
fsl,dataline = <0 0x00 0xff>;
ピン マッピングで複数のデータ行を指定した場合は、この設定に注意してください。この構成を次のものと組み合わせます。
CPU1:シンプルオーディオカード、CPU {
sound-dai = <&sai5>;
dai-tdm-slot-num = <16>;
dai-tdm-slot-width = <32>;
};
これにより、スロット番号は SAI インターフェイスのチャネルの総数ではなく、データ ラインごとに必要なチャネル数を参照する必要があるため、32 チャネル インターフェイスが作成されます。
したがって、これは基本的に32チャネル操作であり、16しか必要としなかったため、64ビットのDMAが表示されていました。
次のように 4 X TDM4 構成に切り替えました。
4データライン
pinctrl_sai5: sai5grp {
FSL、ピン = <
MX8MN_IOMUXC_SAI2_MCLK_SAI5_MCLK 0xd6
MX8MN_IOMUXC_SAI2_RXC_SAI5_TX_BCLK 0xd6
MX8MN_IOMUXC_SAI2_RXFS_SAI5_TX_SYNC 0xd6
MX8MN_IOMUXC_SAI2_RXD0_SAI5_TX_DATA0 0xd6
MX8MN_IOMUXC_SAI2_TXFS_SAI5_TX_DATA1 0xd6
MX8MN_IOMUXC_SAI2_TXC_SAI5_TX_DATA2 0xd6
MX8MN_IOMUXC_SAI2_TXD0_SAI5_TX_DATA3 0xd6
>;
};
サイ5
&sai5 {
#sound-dai-cells = <0>;
pinctrl-names = "デフォルト";
ピンctrl-0 = <&pinctrl_sai5>;
fsl,dataline = <0 0x00 0xff>;
DMas = <&sdma2 8 24 0>, <&sdma2 9 24 0>;
fsl,txmasterflag = <1>;
/delete-property/ fsl,shared-interrupt;
status = "大丈夫";
};
カードとコーデック
出力1 {
compatible = "シンプルオーディオカード";
simple-audio-card,name = "SAI51";
シンプルオーディオカード、ステータス="大丈夫";
シンプルオーディオカード、ビットクロックマスター= <&spdif_codec1>;
シンプルオーディオカード、フレームマスター= <&spdif_codec1>;
シンプルオーディオカード、フォーマット= "left_j";
CPU1:シンプルオーディオカード、CPU {
sound-dai = <&sai5>;
dai-tdm-slot-num = <4>;
dai-tdm-slot-width = <32>;
};
spdif_codec1: simple-audio-card,codec {
サウンドダイ= <&codec_out1>;
};
};
codec_out1: 1output_txcodec {
#sound-dai-cells = <0>;
#address セル= <0>;
#size セル= <0>;
compatible = "linux,spdif-dit";
サウンド名プレフィックス= "spdif_codec1";
status = "大丈夫";
};
スロー番号が 4 であることに注意してください。各データラインには、現在4つのデータチャネルがあります。ALSA を使用して、これらをマッピングする必要があります。dmixを使用して8つのステレオを作成しますが、マッピングは次のとおりです。
C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15
0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 15
チャネル数は、fls、マルチレーン、および共有割り込みを無効にしなかったため、このようなものです
これが他の誰かを助けることを願っています。
Hello,
更新していただきありがとうございます。
確認のため、SAI Transmit Configuration 3 Register (TCR3) の送信チャネル イネーブル ビットがデザインでイネーブルになっていることを確認してください。
よろしくお願いいたします。
そのため、16ビットオーディオでテストしましたが、これまでのところエラーはありません。まだ数時間しか経っていないため、テストはソークで実行し続けます。これを本番環境で使用することはできませんが、興味深いテストです。
DMAコントローラーは32ビットなので、16chの32ビットオーディオデータの場合、サンプルあたり64ビットのオーディオについて話しており、2つのDMAスロットを使用し、アンダーランの場合、FIFOは1で同期しなくなり、データの半分を表すため、8チャンネルスイッチになります。
ここで、アンダーランが発生したときの32ビットモードでのfifoリセットについて理解する必要がありますが、これは32ビットのデータのみをクリアし、フルサンプルに関連する64ビットはクリアしないため、これが影響しない理由だと思います。また、これらのアンダーランが発生する理由と、DMA割り込みがシステムに追いつかない理由についても説明します。
DMIXのような他のAlsaプラグインでも発生するため、DMIX自体を除外しました
この現在のテスト環境では、alsa 経由でパイプされるオーディオが固定されており、受信側コーデック (clck src) も固定されているため、ビット レートを下げることはできません。別の方法で試してみます。
アップデートとして、マスター モードでクロックを設定しましたが、スレーブ モードではクロックの安定性に関連している可能性があると考えていましたが、これは影響しませんでした。
私たちはalsaで16chと8 X 2chを混在させるdmixプラグインを実行しており、現在調査中です。
alsa再生ログにエラーはなく、TDM8モードにもエラーはありません。