achieve 4 threads data transfer between PC and FPGA

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Anonymous
Not applicable

Hello

   

In addition to add  2 threads (ep2 out/in) on the basis of fireware of your provided  to achieve four threads though the FPGA <=> FX3 GPIF2 <=> FX3 EP1 OUT/ IN, EP2 OUT/IN <=> PC ,I know how to configure the descriptor about eps, but I don't know what should i do in .c file to configure DMA pipe between ep2 and gpif2, we use DMA_AUTO_TYPE,  can i copy the DMA configuration code about ep1, just configuring endpoints and dma channel, as      

 

CyU3PEpConfig_t epCfg_1;CyU3PDmaChannelConfig_t dmaCfg_1;CyU3PEpConfig_t epCfg_2;CyU3PDmaChannelConfig_t dmaCfg_2;

   

     

      configure PIB and UIB socket 2     

0 Likes
2 Replies
Anonymous
Not applicable

 Hi,

   

Yes. You need to repeat the same peice of code for additional data paths.

   

epCfg.enable = CyTrue;     

   

    epCfg.epType = CY_U3P_USB_EP_BULK;     

   

    epCfg.burstLen = 1;     

   

    epCfg.streams = 0;     

   

    epCfg.pcktSize = size;     

   

 

   

    /* Producer endpoint configuration */     

   

    apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_PRODUCER, &epCfg);     

   

    if (apiRetStatus != CY_U3P_SUCCESS)     

   

    {     

   

        CyU3PDebugPrint (4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);     

   

        CyFxAppErrorHandler (apiRetStatus);     

   

    }     

   

 

   

    /* Consumer endpoint configuration */     

   

    apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER, &epCfg);     

   

    if (apiRetStatus != CY_U3P_SUCCESS)     

   

    {     

   

        CyU3PDebugPrint (4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);     

   

        CyFxAppErrorHandler (apiRetStatus);     

   

    }     

   

 

   

    /* Create a DMA MANUAL channel for U2P transfer.     

   

     * DMA size is set based on the USB speed. */     

   

    dmaCfg.size  = size;     

   

    dmaCfg.count = CY_FX_SLFIFO_DMA_BUF_COUNT;     

   

    dmaCfg.prodSckId = CY_FX_PRODUCER_USB_SOCKET;     

   

    dmaCfg.consSckId = CY_FX_CONSUMER_PPORT_SOCKET;     

   

    dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE;     

   

    /* Enabling the callback for produce event. */     

   

    dmaCfg.notification = CY_U3P_DMA_CB_PROD_EVENT;     

   

    dmaCfg.cb = 0;     

   

    dmaCfg.prodHeader = 0;     

   

    dmaCfg.prodFooter = 0;     

   

    dmaCfg.consHeader = 0;     

   

    dmaCfg.prodAvailCount = 0;     

   

 

   

    apiRetStatus = CyU3PDmaChannelCreate (&glChHandleSlFifoUtoP,     

   

            CY_U3P_DMA_TYPE_AUTO, &dmaCfg);     

   

    if (apiRetStatus != CY_U3P_SUCCESS)     

   

    {     

   

        CyU3PDebugPrint (4, "CyU3PDmaChannelCreate failed, Error code = %d\n", apiRetStatus);     

   

        CyFxAppErrorHandler(apiRetStatus);     

   

    }     

   

 

   

    /* Create a DMA MANUAL channel for P2U transfer. */     

   

    dmaCfg.prodSckId = CY_FX_PRODUCER_PPORT_SOCKET;     

   

    dmaCfg.consSckId = CY_FX_CONSUMER_USB_SOCKET;     

   

    dmaCfg.cb = 0;     

   

    apiRetStatus = CyU3PDmaChannelCreate (&glChHandleSlFifoPtoU,     

   

            CY_U3P_DMA_TYPE_AUTO, &dmaCfg);     

   

    if (apiRetStatus != CY_U3P_SUCCESS)     

   

    {     

   

        CyU3PDebugPrint (4, "CyU3PDmaChannelCreate failed, Error code = %d\n", apiRetStatus);     

   

        CyFxAppErrorHandler(apiRetStatus);     

   

    }     

   

 

   

    /* Flush the Endpoint memory */     

   

    CyU3PUsbFlushEp(CY_FX_EP_PRODUCER);     

   

    CyU3PUsbFlushEp(CY_FX_EP_CONSUMER);     

   

 

   

    /* Set DMA channel transfer size. */     

   

    apiRetStatus = CyU3PDmaChannelSetXfer (&glChHandleSlFifoUtoP, CY_FX_SLFIFO_DMA_TX_SIZE);     

   

    if (apiRetStatus != CY_U3P_SUCCESS)     

   

    {     

   

        CyU3PDebugPrint (4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus);     

   

        CyFxAppErrorHandler(apiRetStatus);     

   

    }     

   

    apiRetStatus = CyU3PDmaChannelSetXfer (&glChHandleSlFifoPtoU, CY_FX_SLFIFO_DMA_RX_SIZE);     

   

    if (apiRetStatus != CY_U3P_SUCCESS)     

   

    {     

   

        CyU3PDebugPrint (4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus);     

   

        CyFxAppErrorHandler(apiRetStatus);     

   

    }     

   

 

   

    

      The code highlighted in Red should be changed as per your new data path requirement.    

   

Please let me know if you need any more help from me in creating the new data paths.

   

Thanks,

   

sai krishna.

0 Likes
lock attach
Attachments are accessible only for community members.
Anonymous
Not applicable

Hi

   

    I modified my .c file as the code highlighted in Red , but after i download my modified firmware, the situation happened, the device canot display on the control center just display on device manager. does some problems with my firmware or my computer?想启用英文朗读功能吗?请先安装flash插件!

   
    epCfg.enable = CyTrue;   
   
         epCfg.epType = CY_U3P_USB_EP_BULK;   
   
         epCfg.burstLen = (usbSpeed == CY_U3P_SUPER_SPEED) ? (CY_FX_EP_BURST_LENGTH) : 1;   
   
         epCfg.streams = 0;   
   
         epCfg.pcktSize = size;   
   
        
   
         /* Producer endpoint configuration */   
   
         apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_PRODUCER_1, &epCfg);   
   
         if (apiRetStatus != CY_U3P_SUCCESS)   
   
         {   
   
             CyFxAppErrorHandler (apiRetStatus);   
   
         }   
   
        
   
         /* Consumer endpoint configuration */   
   
         apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER_1, &epCfg);   
   
         if (apiRetStatus != CY_U3P_SUCCESS)   
   
         {   
   
             CyFxAppErrorHandler (apiRetStatus);   
   
         }   
   
        
   
         /* Create a DMA MANUAL channel for U2P transfer.   
   
          * DMA size is set based on the USB speed. */   
   
         dmaCfg.size = (usbSpeed == CY_U3P_SUPER_SPEED) ? (CY_FX_EP_BURST_LENGTH*size) : size;   
   
         dmaCfg.count = CY_FX_SLFIFO_DMA_BUF_COUNT;   
   
         dmaCfg.prodSckId = CY_FX_PRODUCER_USB_SOCKET_1;   
   
         dmaCfg.consSckId = CY_FX_CONSUMER_PPORT_SOCKET_1;   
   
         dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE;   
   
         /* Enabling the callback for produce event. */   
   
         dmaCfg.notification = 0;   
   
         dmaCfg.cb = NULL;   
   
         dmaCfg.prodHeader = 0;   
   
         dmaCfg.prodFooter = 0;   
   
         dmaCfg.consHeader = 0;   
   
         dmaCfg.prodAvailCount = 0;   
   
        
   
         apiRetStatus = CyU3PDmaChannelCreate (&glChHandleSlFifoUtoP_1,   
   
                       CY_U3P_DMA_TYPE_AUTO, &dmaCfg);   
   
         if (apiRetStatus != CY_U3P_SUCCESS)   
   
         {   
   
             CyFxAppErrorHandler(apiRetStatus);   
   
         }   
   
        
   
         /* Create a DMA MANUAL channel for P2U transfer. */   
   
         dmaCfg.prodSckId = CY_FX_PRODUCER_PPORT_SOCKET_1;   
   
         dmaCfg.consSckId = CY_FX_CONSUMER_USB_SOCKET_1;   
   
         dmaCfg.cb = NULL;   
   
         apiRetStatus = CyU3PDmaChannelCreate (&glChHandleSlFifoPtoU_1,   
   
                       CY_U3P_DMA_TYPE_AUTO, &dmaCfg);   
   
         if (apiRetStatus != CY_U3P_SUCCESS)   
   
         {   
   
             CyFxAppErrorHandler(apiRetStatus);   
   
         }   
   
        
   
         /* Flush the Endpoint memory */   
   
         CyU3PUsbFlushEp(CY_FX_EP_PRODUCER_1);   
   
         CyU3PUsbFlushEp(CY_FX_EP_CONSUMER_1);   
   
        
   
             /* Set DMA channel transfer size. */   
   
         apiRetStatus = CyU3PDmaChannelSetXfer (&glChHandleSlFifoUtoP_1, CY_FX_SLFIFO_DMA_TX_SIZE);   
   
         if (apiRetStatus != CY_U3P_SUCCESS)   
   
         {   
   
             CyFxAppErrorHandler(apiRetStatus);   
   
         }   
   
         apiRetStatus = CyU3PDmaChannelSetXfer (&glChHandleSlFifoPtoU_1, CY_FX_SLFIFO_DMA_TX_SIZE);   
   
         if (apiRetStatus != CY_U3P_SUCCESS)   
   
         {   
   
             CyFxAppErrorHandler(apiRetStatus);   
   
         }   
   
        
   
         /* Update the status flag. */   
   
        glIsApplnActive = CyTrue;   
   
        
   
         //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^add ep2^^^^^^^^^^^^^^   
   
             CyU3PMemSet ((uint8_t *)&epCfg, 0, sizeof (epCfg));   
   
         epCfg.enable = CyTrue;   
   
         epCfg.epType = CY_U3P_USB_EP_BULK;   
   
         epCfg.burstLen = (usbSpeed == CY_U3P_SUPER_SPEED) ? (CY_FX_EP_BURST_LENGTH) : 1;   
   
         epCfg.streams = 0;   
   
         epCfg.pcktSize = size;   
   
         
   
         /* Producer endpoint configuration */   
   
         apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_PRODUCER_2, &epCfg);   
   
         if (apiRetStatus != CY_U3P_SUCCESS)   
   
         {   
   
                  CyFxAppErrorHandler (apiRetStatus);   
   
         }   
   
         
   
         /* Consumer endpoint configuration */   
   
         apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER_2, &epCfg);   
   
         if (apiRetStatus != CY_U3P_SUCCESS)   
   
             {   
   
             CyFxAppErrorHandler (apiRetStatus);   
   
         }   
   
         
   
         /* Create a DMA MANUAL channel for U2P transfer.   
   
          * DMA size is set based on the USB speed. */   
   
         dmaCfg.size = (usbSpeed == CY_U3P_SUPER_SPEED) ? (CY_FX_EP_BURST_LENGTH*size) : size;   
   
         dmaCfg.count = CY_FX_SLFIFO_DMA_BUF_COUNT;   
   
         dmaCfg.prodSckId = CY_FX_PRODUCER_USB_SOCKET_2;   
   
         dmaCfg.consSckId = CY_FX_CONSUMER_PPORT_SOCKET_2;   
   
         dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE;   
   
         /* Enabling the callback for produce event. */   
   
         dmaCfg.notification = 0;   
   
         dmaCfg.cb = NULL;   
   
         dmaCfg.prodHeader = 0;   
   
         dmaCfg.prodFooter = 0;   
   
         dmaCfg.consHeader = 0;   
   
         dmaCfg.prodAvailCount = 0;   
   
         
   
         apiRetStatus = CyU3PDmaChannelCreate (&glChHandleSlFifoUtoP_2,   
   
                       CY_U3P_DMA_TYPE_AUTO, &dmaCfg);   
   
         if (apiRetStatus != CY_U3P_SUCCESS)   
   
         {   
   
             CyFxAppErrorHandler(apiRetStatus);   
   
         }   
   
         
   
         /* Create a DMA MANUAL channel for P2U transfer. */   
   
         dmaCfg.prodSckId = CY_FX_PRODUCER_PPORT_SOCKET_2;   
   
         dmaCfg.consSckId = CY_FX_CONSUMER_USB_SOCKET_2;   
   
         dmaCfg.cb = NULL;   
   
         apiRetStatus = CyU3PDmaChannelCreate (&glChHandleSlFifoPtoU_2,   
   
                       CY_U3P_DMA_TYPE_AUTO, &dmaCfg);   
   
         if (apiRetStatus != CY_U3P_SUCCESS)   
   
         {   
   
             CyFxAppErrorHandler(apiRetStatus);   
   
         }   
   
         
   
         /* Flush the Endpoint memory */   
   
         CyU3PUsbFlushEp(CY_FX_EP_PRODUCER_2);   
   
         CyU3PUsbFlushEp(CY_FX_EP_CONSUMER_2);   
   
         
   
         /* Set DMA channel transfer size. */   
   
         apiRetStatus = CyU3PDmaChannelSetXfer (&glChHandleSlFifoUtoP_2, CY_FX_SLFIFO_DMA_TX_SIZE);   
   
         if (apiRetStatus != CY_U3P_SUCCESS)   
   
         {   
   
             CyFxAppErrorHandler(apiRetStatus);   
   
         }   
   
         apiRetStatus = CyU3PDmaChannelSetXfer (&glChHandleSlFifoPtoU_2, CY_FX_SLFIFO_DMA_TX_SIZE);   
   
         if (apiRetStatus != CY_U3P_SUCCESS)   
   
         {   
   
             CyFxAppErrorHandler(apiRetStatus);   
   
         }   
   
         
   
         /* Update the status flag. */   
   
         glIsApplnActive = CyTrue;   
   

 

   
         //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   
   
    }   
   
        
   
    /* This function stops the slave FIFO loop application. This shall be called   
   
     * whenever a RESET or DISCONNECT event is received from the USB host. The   
   
     * endpoints are disabled and the DMA pipe is destroyed by this function. */   
   
    void   
   
    CyFxSlFifoApplnStop (   
   
             void)   
   
    {   
   
         CyU3PEpConfig_t epCfg;   
   
         CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;   
   
        
   
         /* Update the flag. */   
   
         glIsApplnActive = CyFalse;   
   
        
   
         /* Flush the endpoint memory */   
   
         CyU3PUsbFlushEp(CY_FX_EP_PRODUCER_1);   
   
         CyU3PUsbFlushEp(CY_FX_EP_CONSUMER_1);   
   
        
   
         /* Destroy the channel */   
   
         CyU3PDmaChannelDestroy (&glChHandleSlFifoUtoP_1);   
   
         CyU3PDmaChannelDestroy (&glChHandleSlFifoPtoU_1);   
   
        
   
         /* Disable endpoints. */   
   
         CyU3PMemSet ((uint8_t *)&epCfg, 0, sizeof (epCfg));   
   
         epCfg.enable = CyFalse;   
   
        
   
         /* Producer endpoint configuration. */   
   
         apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_PRODUCER_1, &epCfg);   
   
         if (apiRetStatus != CY_U3P_SUCCESS)   
   
         {   
   
             CyFxAppErrorHandler (apiRetStatus);   
   
         }   
   
        
   
         /* Consumer endpoint configuration. */   
   
         apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER_1, &epCfg);   
   
         if (apiRetStatus != CY_U3P_SUCCESS)   
   
         {   
   
             CyFxAppErrorHandler (apiRetStatus);   
   
         }   
   
        
   
         //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^add ep2^^^^^^^^^^^^^^^^   
   
        
   
         /     * Flush the endpoint memory */   
   
            CyU3PUsbFlushEp(CY_FX_EP_PRODUCER_2);   
   
            CyU3PUsbFlushEp(CY_FX_EP_CONSUMER_2);   
   
         
   
            /* Destroy the channel */   
   
            CyU3PDmaChannelDestroy (&glChHandleSlFifoUtoP_2);   
   
            CyU3PDmaChannelDestroy (&glChHandleSlFifoPtoU_2);   
   
         
   
            /* Disable endpoints. */   
   
            CyU3PMemSet ((uint8_t *)&epCfg, 0, sizeof (epCfg));   
   
            epCfg.enable = CyFalse;   
   
         
   
            /* Producer endpoint configuration. */   
   
            apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_PRODUCER_2, &epCfg);   
   
            if (apiRetStatus != CY_U3P_SUCCESS)   
   
            {   
   
                CyFxAppErrorHandler (apiRetStatus);   
   
            }   
   
         
   
            /* Consumer endpoint configuration. */   
   
            apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER_2, &epCfg);   
   
            if (apiRetStatus != CY_U3P_SUCCESS)   
   
            {   
   
                CyFxAppErrorHandler (apiRetStatus);   
   
            }   
   
         //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   
   
    }   
0 Likes