サポートの皆様、
私はベアメタル環境で imx8mm SoC に取り組んでいます。私の目標は、SAI2 RXでSDMA2を使用することです。まず、SDMA1 と UART1 TX から始めました。一度成功した後、SDMA2 (SDMA2/3 は SAI 専用) に移行しましたが、SDMA2 のセットアップ プロセスの初期段階で失敗しました。
問題を再現するために、次のシナリオを用意しました。
1. ARM RAM にチャネル コンテキスト、チャネル制御ブロック、バッファ記述子を準備します。
2. SDMAxクロックを有効にする:
- SDMA1: PLL1/6からAHBを実行して133 MHz、ゲートなしCCGR=58を実現
- SDMA2: PLL1/2 から AUDIO_AHB を実行します。結果として400 MHz、アンゲートCCGR=59
3. SDMA レジスタの設定 (MC0PTR、DSPOVR、EVTOVR、HOSTOVR、CONFIG、CHNENBL、CHENPRI、CHN0ADDR、INTRMASK)
4. Channel0 の buffer_descriptor_0 を設定し、ChannelN のコンテキストを SDMA RAM にロードします (SETCTX ブートスクリプト コマンドを使用)
5. HSTART SDMAレジスタに書き込み、チャネル0のコンテキストのロードをトリガーする
6. STOP_STATレジスタのビット0がクリアされるまでビジー待機する
7. buffer_descriptor_0のDONEビットを観察します - このビットはクリアされる必要があります(SDMAがバッファのプロセッシングを完了したことを示します)
8. ペリフェラルインタラクションなどを進めます。
ステップ(7) はSDMA2 で失敗します - DONE ビットはクリアされないSO、SDMA2 での後続の操作は意味がありません (コンテキストが設定されていないため - GETDM などの他のコマンドも試しましたが、結果は同じでした)。INTERRUPT ビットを設定しても割り込みは発生しないため、SDMA2 バッファ記述子のプロセッシングに問題があることがさらに確認できます。STOP_STAT が 0x1 から 0x0 に変わるのを観察しました。これは、channel0 が開始されることを意味しますが、何らかの理由で buffer_descriptor_0 をスキップするようです。
結論として、上記の基本的な SDMA 使用シナリオは SDMA1 では機能しますが、SDMA2 では機能しません (SDMA3 でも機能しません)。
質問: SDMA1 と比較した場合、SDMA2/SDMA3 固有の構成が欠如していると、このような退行が生じるのでしょうか?
よろしくお願いいたします。
こんにちは@jkastelik
SDMA2/3 構成については、SAI sdma_transfer デモを参照することをお勧めします。このデモでは、SDMA2 がどのように初期化されるかを確認できます。
SDK_25_06_00_EVK-MIMX8MM\ボード\evkmimx8mm\ドライバ_examples\sai\sdma_transfer
SDKは以下からダウンロードできます。
よろしくお願いします。
ダニエル