FX3/CX3のオーバーライドモードのDMAチャネル - KBA229098 - Community Translated (JA)

Version 2

    Community Translated by  JuIn_1625121 Expert       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/49788https://community.cypress.com/thread/50601 を参照してください。

    SDKのマスストレージクラスの例では、オーバーライドモードでもDMAチャネルを実装しています。

     

    質問 2:

    FX3/CX3でオーバーライドモードのDMAチャネルを構成するにはどうすればよいですか?

     

    回答:

    DMA チャネルは、プロデューサソケットとコンシューマソケットの間に作成されます。DMA チャネルは、以下の DMA ステートのいずれかです。

    • CY_U3P_DMA_NOT_CONFIGURED: DMA チャネルが未設定です。この状態は、ステール/初期化されていないチャネル構造を使用している場合にのみ発生します。このチャネル状態は、チャネルが破壊されたときにセットされます。
    • CY_U3P_DMA_CONFIGURED: DMA チャネルは正常に構成されました。チャネルは以下の条件でこのステートになります。:
      • チャネルの作成に成功しました。
      • チャネルがリセットされました。
      • 有限の転送が正常に完了しました。
      • オーバーライドモードのいずれかが正常に終了しました。
    • CY_U3P_DMA_ACTIVE: DMAチャネルはアクティブな進行中のトランザクションを持っています。このステートには、 SetXferコールが呼び出され、転送が進行中であるときに移行します。
    • CY_U3P_DMA_ERROR: DMA チャネルでエラーが発生しました。このステートには、DMA ハードウェアエラーが検出されたときに移行します。
    • CY_U3P_DMA_IN_COMPLETION: DMAチャネルはすべてのデータが流れ切るのを待っています。プロデューサ側からの転送が完了したときにこのステートになりますが、チャネルはコンシューマ側ですべてのデータが流れ切るのを待っています。
    • CY_U3P_DMA_ABORTED: チャネルがアボートステートになっています。このステートは、アボートコールが行われたときに移行します。
    • CY_U3P_DMA_NUM_STATES: DMA チャネルのステートの数。これは有効なステートではなく、単なるプレースホルダーです。
    • CY_U3P_DMA_PROD_OVERRIDE: DMA チャネルは、プロデューサソケットオーバーライドモードで動作しています。このステートは、SetupSend 呼び出しが呼び出され、転送が進行中のときに移行します。
    • CY_U3P_DMA_CONS_OVERRIDE: コンシューマソケットオーバーライドモードで動作する DMA チャネル。この状態は、SetupRecvコールが呼び出され、転送が進行中のときに移行します。

     

    表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を参照してください。

     

    注:

    • DMA操作に使用されるバッファは、CyU3PDmaBufferAlloc呼び出しを使用して割り当てられることが予想されます。そうでない場合、バッファは、フルバッファが32バイトにアラインメントされ、サイズが32バイトの倍数になるような方法でオーバーアロケートされなければなりません。
    • 表1のAPIは、DMAチャネルがCY_U3P_DMA_CONFIGUREDステートの時にのみ呼び出すことができます。
    • これらのAPIは、CyU3PDmaChannelSetXfer/CyU3PDmaMultiChannelSetXfer APIが無限の転送用に構成されている場合、このAPIの後に呼び出すことはできず、DMAチャネルはCY_U3P_DMA_ACTIVEステートで構成されます。これらのAPIがCyU3PDmaChannelSetXfer/CyU3PDmaMultiChannelSetXfer APIの後に呼び出された場合、エラー0x44を返します。
    • CyU3PDmaChannelSetXfer/CyU3PDmaMultiChannelSetXfer APIの後にこれらのAPIを呼び出す必要がある場合、転送は有限でなければなりません。有限の転送の完了後、DMAチャネルはCY_U3P_DMA_CONFIGUREDステートになり、その後、これらのAPIを呼び出すことができます。
    • DMAチャネルは、転送が完了するまでCY_U3P_DMA_PROD_OVERRIDEステートまたはCY_U3P_DMA_CONS_OVERRIDEステートのままです。
    • DMAチャネルがオーバーライドモードにあり、転送がまだ完了していない場合、CyU3PDmaChannelSetXfer / CyU3PDmaMultiChannelSetXfer APIを呼び出すことができません。DMAチャネルがCY_U3P_DMA_CONFIGUREDステートのときにのみこのAPIを呼び出すことができるためです。DMAチャンネルが CY_U3P_DMA_CONFIGUREDステートでないときにこのAPIを呼び出すと、エラー0x44を返します。

     

    表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の実装には違いがあります:

    • CyU3PDmaChannelSetXfer: コンシューマソケットとプロデューサソケットの両方のソケットは、所望のトランザクションサイズに合わせて構成されています。
    • CyU3PDmaMultiChannelSetXfer: コンシューマソケットのみが要求サイズで構成され、プロデューサソケットはデフォルトで無限の転送用に構成されています。

    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.にあります。