This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

How to enable and use DMA for USB bulk IN endpoints

Hi,

I'm using uVision 4 with the MCB2300 development board. I'm developing a software that periodically transmits data (status information) from the device to the host (as first step, the data are sent without being explicitly requested by the host as soon as a connection has been established). Thereto I've modified the USBCDC example included with uVision. The software transmits 20 bytes periodically, using USB_WriteEP (in usbhw.c, which uses the register interface). This works fine so far. Now I would like to use the DMA engine to avoid copying the bytes word by word into the register. I've enabled DMA in the USB configuration for logical IN endpoint 2 (physical endpoint 5 which is called CDC_DEP_IN in the example), and I have managed to set up DMA descriptors. But how do I trigger a DMA transfer?
I've tried several combinations of USB_DMA_Setup and USB_DMA_Enable. Manually setting the appropriate bit in DMA_REQ_SET to trigger the interrupt results in an error state. What am I doing wrong?
Could anyone please give me some hints concerning USB DMA? Thanks a lot.
I'll be back in January, after my Christmas vacation. I wish everybody a merry Christmas and a happy new year!

CC

Parents
  • is it possible to get the number of bytes which were received by the last packet to determine if the packet was a normal data packet or a command packet? Is it also possible to use USB_ReadEP() because I will also use DMA for the BULK out endpoints?

    void EndpointISR()
    {
            /* use of dma */
            if(event & USB_EVT_OUT_DMA_EOT)
            {       /* End of Transfer */
            if (USB_DMA_BufAdr(CDC_DEP_OUT) != ((unsigned int)DataBuf0 + DataIn0))
                    {       /* Data Available */
    
                            /* determine if the rxd data is a cmd or a dmx data pkt */
    
    /* is it possible to get the size of the rxd packet to determine if the packet is a data packet or a command packet?
    */
                             if(command_pkt)
                            {
                                 USB_ReadEP(CDC_DEP_OUT, &CommandReq[0]);
                                 SetupCommand(&CommandReq[0]);
                                 return;
                            }
    
                    }
            }
            if (event & (USB_EVT_OUT_DMA_EOT) | (USB_EVT_OUT_DMA_NDR))
            {       /* End of Transfer or New Descriptor Request */
    
                    DD.BufAdr  = (unsigned int)DataBuf0 + DataIn0;
                       DD.BufLen  = DATA_TX_PKT_LEN;
                       DD.MaxSize = 64;              /* 64Byte for bulk-transfer */
                    DD.Cfg.Val = 0;              /* Initial DMA Configuration */
                      USB_DMA_Setup (CDC_DEP_OUT, &DD);             /* Setup DMA */
                      USB_DMA_Enable(CDC_DEP_OUT);
    
            }
    
    
              /* 2) */
            if(event & USB_EVT_IN_DMA_NDR)
                    dmaInProgress &= ~(1 << EPAdr(CDC_DEP_IN));
    
    }
    

Reply
  • is it possible to get the number of bytes which were received by the last packet to determine if the packet was a normal data packet or a command packet? Is it also possible to use USB_ReadEP() because I will also use DMA for the BULK out endpoints?

    void EndpointISR()
    {
            /* use of dma */
            if(event & USB_EVT_OUT_DMA_EOT)
            {       /* End of Transfer */
            if (USB_DMA_BufAdr(CDC_DEP_OUT) != ((unsigned int)DataBuf0 + DataIn0))
                    {       /* Data Available */
    
                            /* determine if the rxd data is a cmd or a dmx data pkt */
    
    /* is it possible to get the size of the rxd packet to determine if the packet is a data packet or a command packet?
    */
                             if(command_pkt)
                            {
                                 USB_ReadEP(CDC_DEP_OUT, &CommandReq[0]);
                                 SetupCommand(&CommandReq[0]);
                                 return;
                            }
    
                    }
            }
            if (event & (USB_EVT_OUT_DMA_EOT) | (USB_EVT_OUT_DMA_NDR))
            {       /* End of Transfer or New Descriptor Request */
    
                    DD.BufAdr  = (unsigned int)DataBuf0 + DataIn0;
                       DD.BufLen  = DATA_TX_PKT_LEN;
                       DD.MaxSize = 64;              /* 64Byte for bulk-transfer */
                    DD.Cfg.Val = 0;              /* Initial DMA Configuration */
                      USB_DMA_Setup (CDC_DEP_OUT, &DD);             /* Setup DMA */
                      USB_DMA_Enable(CDC_DEP_OUT);
    
            }
    
    
              /* 2) */
            if(event & USB_EVT_IN_DMA_NDR)
                    dmaInProgress &= ~(1 << EPAdr(CDC_DEP_IN));
    
    }
    

Children
  • > is it possible to get the number of bytes which were received by the last packet to determine if the packet was a normal data packet or a command packet?

    The byte size of received transfer is written-back to the DD for OUT EP.

    > Is it also possible to use USB_ReadEP() because I will also use DMA for the BULK out endpoints?

    No. USB_ReadEP() is not available for the OUT EP, while DMA is enabled on the EP.

    Tsuneo