Community Translated by JuIn_1625121 Version: **
Translation - English: DMA Channel in Override Mode in FX3/CX3 - KBA229098
質問 1:
FX3/CX3でオーバーライドモードのDMAチャネルを構成する必要があるのはなぜですか?
回答:
オーバーライドモードでのDMAチャネルのアプリケーション/使用例
DMA チャネルは、ユーザー定義バッファが DMA チャネルを介して転送されるデータと一緒に送信される場合、オーバーライドモードで使用することができます。
オーバーライドモードでDMAチャネルを構成することは、DMAチャネルのコンシューマソケットとプロデューサソケットとの間で、それぞれユーザ定義バッファの内容を送受信することを意味します。
プロセッサインタフェースブロック(PIB)からUSBインタフェースブロック(UIB)にDMAチャネルを構成し、PIBソケットからではないデータをUIBに送信したい場合を考えます。この場合、このDMAチャネルをオーバーライドモードに設定することで、ユーザー定義バッファを送信することができます。
オーバーライドモードでの DMA チャネルの他のアプリケーションは、GPIF II のステートマシンを変更せずにヘッダとフッタ用の独立したバッファを送信したい場合、USB Video Class Device アプリケーションになります。同様のアプリケーションについては、スレッド、https://community.cypress.com/thread/49788、https://community.cypress.com/thread/50601 を参照してください。
SDKのマスストレージクラスの例では、オーバーライドモードでもDMAチャネルを実装しています。
質問 2:
FX3/CX3でオーバーライドモードのDMAチャネルを構成するにはどうすればよいですか?
回答:
DMA チャネルは、プロデューサソケットとコンシューマソケットの間に作成されます。DMA チャネルは、以下の DMA ステートのいずれかです。
表1. オーバーライドモードでDMAチャネルを構成するためのAPI
API | 解説 |
---|---|
CyU3PDmaChannelSetupRecvBuffer (CyU3PDmaChannel *handle, CyU3PDmaBuffer_t * buffer_p) CyU3PDmaMultiChannelSetupRecvBuffer (CyU3PDmaMultiChannel *handle, CyU3PDmaBuffer_t * buffer_p, uint16_t multiSckOffset) | この関数は、DMA プロデューサからユーザー定義バッファに入力されるデータの読み出しを開始します。 |
CyU3PDmaChannelSetupSendBuffer (CyU3PDmaChannel *handle, CyU3PDmaBuffer_t *buffer_p) CyU3PDmaMultiChannelSetupSendBuffer (CyU3PDmaMultiChannel *handle, CyU3PDmaBuffer_t * buffer_p, uint16_t multiSckOffset) | この関数は、ユーザが提供するバッファの内容を DMA チャネルのコンシューマに送信します。 |
注:これらのAPIの詳細については、SDKで利用可能なFX3APIGuideを参照してください。
注:
表2. オーバーライドモードでデータ転送の完了を確認するためのAPI
API | 解説 |
---|---|
CyU3PDmaMultiChannelWaitForCompletion (CyU3PDmaMultiChannel * handle, uint32_t waitOption ) CyU3PDmaChannelWaitForCompletion (CyU3PDmaChannel _ handle, uint32_t waitOption ) | この関数は、現在の DMA トランザクションが完了するまで待機します。 |
CyU3PDmaChannelWaitForRecvBuffer (CyU3PDmaChannel *handle, CyU3PDmaBuffer_t *buffer_p, uint32_t waitOption ) CyU3PDmaMultiChannelWaitForRecvBuffer (CyU3PDmaMultiChannel *handle, CyU3PDmaBuffer_t * buffer_p, uint32_t waitOption ) | この関数は、オーバーライドの読み出し操作が完了するまで待機します。 |
注:これらのAPIの詳細については、SDKで利用可能なFX3APIGuideを参照してください。
CY_U3P_DMA_CB_SEND_CPLTorCY_U3P_DMA_CB_RECV_CPLTコールバックイベントは、DMAチャンネル作成時にDMAチャンネル構成に登録することができます。これらのイベントはコールバック関数で処理することができ、それぞれSendBuffer、ReceiveBuffer(transfer)呼び出しが完了した時に呼び出されます。
質問3:
オーバーライドモードでDMAチャンネルを設定するFX3の実例はありますか?
回答:
このknowledge base article(KBA)に添付されているGpifToUsbが実例となります。ここでは通常のデータ転送に加えて、DMAチャネルをオーバーライドして、GPIFブロックからUSBブロックにユーザー定義のバッファを送信しています。
この実例の機能は、GPIF から USB への通常のデータ転送中に、オーバーライドモードで DMA チャネルを介してユーザー定義のバッファを送信することです。
CY_U3P_DMA_TYPE_MANUALチャネルは、PIB ブロックと UIB ブロックの間に作成されます。PIB ソケットはプロデューサとして構成され、UIB ソケットはコンシューマとして構成されます。
ユーザー定義バッファは、CyU3PDmaChannelSetXfer APIを呼び出す前にSendDebugMessage()関数を呼び出すことで送信されます。
CyU3PDmaChannelSetXferおよびCyU3PDmaMultiChannelSetXfer APIの2番目のパラメータは、選択されたDMAモードに関連付けられた単位で、希望するトランザクションサイズを示します。指定されたデータ量が転送されると、チャネルはアイドル状態に戻ります。
これらのAPIの実装には違いがあります:
CY_U3P_DMA_CB_SEND_CPLTを使用して、ユーザー定義バッファ内のデータの転送完了を確認することができます。このイベントはコールバックに登録されます。これは、ユーザー提供バッファが送信されたときにコールバックを登録することになります。このイベントを受信すると、 CyU3PDmaChannelSetXfer APIが一定のデータ転送量(32)で呼び出されます。
CyFxAppThread_Entry関数では、DMA_Override変数をトラッキングしています。DMA チャネルが DMA オーバーライド モードから通常モードに切り替わると、CyU3PDmaChannelWaitForCompletion API が呼び出され、CyU3PDmaChannelSetXfer API を介した転送が完了するのを待ちます。これらの転送が完了すると、SendDebugMessage()関数を呼び出すことで、DMAチャネルがDMAオーバーライドモードに切り替わります。
詳細は、DMA チャネルをオーバーライドモードで実装した msc_examples を参照してください。msc_examples は、C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\firmware\msc_examples.にあります。