マルチチャネル コミットバッファでの無効なシーケンスエラー – KBA218830 - Community Translated (JA)

Version 1

    Community Translated by: RyKi_1693141          Version: **

     

     

    質問:

    FX3で動画をストリーミングしているときに、"Error in CyU3PDmaMultiChannelCommitBuffer: code 71 "というメッセージがUART端末に表示されます。このエラーの原因と復旧方法を教えてください。

     

    回答:

    "Error in CyU3PDmaMultiChannelCommitBuffer: code 71 "というメッセージは、DMAバッファオーバーフローが発生したときに表示されます。code 71のエラーは「CY_U3P_ERROR_INVALID_SEQUENCE」のエラーを指します。このエラーは、UVC ホストアプリケーションが DMA バッファをクリアするために十分な速さで IN トークンを発行しなかった場合に発生することがあります。

     

    code 71のエラーから復旧するためには、以下に従ってください。

     

    I) ファームウェアに割り当てられた DMA バッファ領域を増やしてください。

     

    II) AN75779 に関連付けられたサンプル プロジェクトに以下を実装してください。

     

     1.   CyU3PDmaMultiChannelCommitBuffer() APICY_U3P_SUCCESSを返すことに失敗したとき、CyFxUvcApplnDmaCallback()関数にフラグ (例えば、commit_buffer_failure) を設定してください。

     

     2,   UVCAppThread_Entry()関数のfor(;;)ループで、このフラグがセットされているかどうかを確認してください。セットされている場合は、DMA チャネルをリセットするため、以下のプログラムコードを実装し、GPIF II ステートマシンを再起動してください。

     

    if (commit_buffer_failure == 1)

      

    {

      

       commit_buffer_failure = 0;

      

       /* Stop the GPIF state machine to stop data transfers through FX3 */

      

       CyU3PGpifDisable (CyFalse);

      

       streamingStarted = CyFalse;

      

     

       /* Place the Endpoint in NAK mode before cleaning up the pipe. */

      

        apiRetStatus = CyU3PUsbSetEpNak (CY_FX_EP_BULK_VIDEO, CyTrue);

      

        if (apiRetStatus != CY_U3P_SUCCESS)

      

        {

      

    CyU3PDebugPrint (4, "\r EP_NAK=%d\n", apiRetStatus);

      

        }

      

        /* Reset the DMA channel and flush the endpoint pipe. */

      

        apiRetStatus = CyU3PDmaMultiChannelReset (&glChHandleUVCStream);

      

        if (apiRetStatus != CY_U3P_SUCCESS)

      

        {

      

    CyU3PDebugPrint (4, "\r DMA_RESET=%d\n", apiRetStatus);

      

        }

      

        apiRetStatus = CyU3PUsbFlushEp (CY_FX_EP_BULK_VIDEO);

      

        if(apiRetStatus != CY_U3P_SUCCESS)

      

        {

      

           CyU3PDebugPrint (4, "\r EP_FLUSH=%d\n", apiRetStatus);

      

       }

      

       apiRetStatus = CyU3PDmaMultiChannelSetXfer (&glChHandleUVCStream, 0, 0);

      

       if (apiRetStatus != CY_U3P_SUCCESS)

      

       {

      

           CyU3PDebugPrint (4, "\r DMA_XFER  = %d\n", apiRetStatus);

      

       }

      

       apiRetStatus = CyU3PUsbSetEpNak (CY_FX_EP_BULK_VIDEO, CyFalse);

      

       if(apiRetStatus != CY_U3P_SUCCESS)

      

       {

      

            CyU3PDebugPrint (4, "\r EP_ACK=%d\n", apiRetStatus);

      

       }

      

    apiRetStatus = CyU3PGpifSMStart (START_SCK0, ALPHA_START_SCK0);

      

    if (apiRetStatus != CY_U3P_SUCCESS)

      

           {

      

            CyU3PDebugPrint (4, "CyU3PGpifSMStart  = %d\n", apiRetStatus);

      

    }

      

       apiRetStatus = CyU3PGpifSMSwitch (257, 0, 257, 0, 2);

      

       if (apiRetStatus != CY_U3P_SUCCESS)

      

    {

      

    CyU3PDebugPrint (4, "CyU3PGpifSMSwitch  = %d\n", apiRetStatus);

      

            }

      

            streamingStarted = CyTrue;

       }