- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
We developed a custom camera and created a CX3 project using the Eclipse project wizard. This is a custom raw data bulk streaming project and is not a UVC project. Watching the USB transactions with a USB protocol analyzer, we never see EP3 bursting. All the transactions deliver a data payload of 1024 bytes only.
Below are snippets of the CX3's channel create function, and the USB descriptor for bursting (I have replaced the manifest constants with the actual values):
dmaCfg.size = 0x8000;
dmaCfg.count = 3;
status = CyU3PDmaMultiChannelCreate (&glChHandleUVCStream, CY_U3P_DMA_TYPE_MANUAL_MANY_TO_ONE , &dmaCfg);
// Super Speed Endpoint Companion Descriptor
0x06, // Descriptor size
CY_U3P_SS_EP_COMPN_DESCR, // SS Endpoint Companion Descriptor Type
0x0F, // Max number of packets per burst: 16
0x00, // Attribute: Streams not defined
0x00, // No meaning for bulk
0x00
As a reference, we have a FX3 product that we tested on the exact same USB port. With our FX3 product we see bursts of 16KB for the data payload. The FX3 DMA configuration is the same as the CX3 except that the FX3 is a one-to-one socket DMA channel, and it's also setup as CY_U3P_DMA_TYPE_AUTO.
Questions:
- What would prevent the CX3 transactions from bursting over USB?
Thank you.
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
The endpoint burst was working from the beginning, but there was an issue in the host application which was decoding the incoming transactions as packets of 1024 (or Packet View) in the analyzer software.
Since there is no need for UVC header addition, the channel can be changed to AUTO channel from MANUAL channel to gain better throughput and inturn remove CPU intervention -> NON-UVC device.
Regards,
Yashwant
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
"This is a custom raw data bulk streaming project and is not a UVC project."
=> Can you please let know which driver the device is binding to? Is it a vendor driver or a Cypress driver or binds to the UVC driver while you use a custom host application to decode the RAW video?
"Watching the USB transactions with a USB protocol analyzer, we never see EP3 bursting."
=> Can you please let me know if you are using a hardware protocol analyzer or a software analyzer (like Wireshark)?
Along with the descriptor and channel create, can you please share the endpoint config (the structure that goes for the CyU3PSetEpConfig() API) as well?
Also, can you confirm if the device is enumerating properly as a SuperSpeed device when programmed with the firmware?
Regards,
Yashwant
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for getting back me. I'm sorry for pasting the descriptors into the body of the message. I would have just attached the USB descriptor file, but I couldn't figure out how to add a file to this message.
Best,
Motz
=> Can you please let know which driver the device is binding to? Is it a vendor driver or a Cypress driver or binds to the UVC driver while you use a custom host application to decode the RAW video?
We use our own vendor driver. But it’s roots are the EZ-USB WDM driver, but it has been evolved over the years (bug fixes, USB compliancy, etc…). The current driver is Windows 10 compatible and built with the latest Microsoft WDK. It’s a very simple IO control driver that makes only bulk requests to the Windows 10 USB stack. The USB request our windows 10 application is making, is for EP3 of the CX3 to fill a 2MB buffer (using Direct I/O). As I mentioned above, we do this with the FX3 and have always been successful doing 16KB bursts over USB with this driver.
=> Can you please let me know if you are using a hardware protocol analyzer or a software analyzer (like Wireshark)?
I’m using a Total Phase Beagle USB 5000 v2 Ultimate hardware protocol analyzer.
=> Can you confirm if the device is enumerating properly as a SuperSpeed device when programmed with the firmware?
Yes, were running at Super-Speed. Our hardware protocol analyzer shows we are connected at SS, and the software application USB device Tree Viewer states that we are connected at SS.
=> Along with the descriptor and channel create, can you please share the endpoint config (the structure that goes for the CyU3PSetEpConfig() API) as well?
(I have removed the manifest constant and substituted the actual values used [unless it's part of the standard Cypress library])
// Channel Create:
- dmaCfg.size = 0x8000;
- dmaCfg.count = 3;
- dmaCfg.validSckCount = 2;
- dmaCfg.prodSckId[0] = CY_U3P_PIB_SOCKET_0;
- dmaCfg.prodSckId[1] = CY_U3P_PIB_SOCKET_1;
- dmaCfg.consSckId[0] = CY_U3P_UIB_SOCKET_CONS_3;
- dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE;
- dmaCfg.notification = CY_U3P_DMA_CB_PROD_EVENT | CY_U3P_DMA_CB_CONS_EVENT;
- dmaCfg.cb = CyCx3UvcAppDmaCallback;
- dmaCfg.prodHeader = 0x0000;
- dmaCfg.prodFooter = 0x0000;
- dmaCfg.consHeader = 0;
- dmaCfg.prodAvailCount = 0;
status = CyU3PDmaMultiChannelCreate (&glChHandleUVCStream, CY_U3P_DMA_TYPE_MANUAL_MANY_TO_ONE , &dmaCfg);
// Endpoint Config:
- endPointConfig.enable = CyTrue;
- endPointConfig.epType = CY_U3P_USB_EP_BULK;
- endPointConfig.isoPkts = 0;
- endPointConfig.streams = 0;
- endPointConfig.pcktSize = 0x400;
- endPointConfig.burstLen = 0x10;
status = CyU3PSetEpConfig(0x83, &endPointConfig);
// USB Descriptors:
/* This file contains the USB enumeration descriptors for the CX3 Video Streaming application example.
* The descriptor arrays must be 32 byte aligned if the D-cache is turned on. If the linker
* used is not capable of supporting the aligned feature for this, then dynamically allocated
* buffer must be used, and the descriptor must be loaded into it. */
#include "cycx3_uvc.h"
#include "cyu3mipicsi.h"
const uint8_t CyCx3USB30DeviceDscr[] =
{
0x12, // Descriptor size
CY_U3P_USB_DEVICE_DESCR, // Device descriptor type
0x00, 0x03, // USB 3.0
0x00, // Device class
0x00, // Device Sub-class
0x00, // Device protocol
0x09, // Maxpacket size for EP0 : 2^9
0x99,0x10, // Vendor ID.
0x23,0x2D, // Product ID.
0x06,0x00, // Device release number.
0x01, // Manufacture string index
0x02, // Product string index
0x00, // Serial number string index
0x01 // Number of configurations
};
// Standard Device Descriptor for USB 2
const uint8_t CyCx3USB20DeviceDscr[] =
{
0x12, // Descriptor size
CY_U3P_USB_DEVICE_DESCR, // Device descriptor type
0x10, 0x02, // USB 2.1 */
0x00, // Device class
0x00, // Device Sub-class
0x00, // Device protocol */
0x40, // Maxpacket size for EP0 : 64 bytes
0x99,0x10, // Vendor ID.
0x23,0x2D, // Product ID.
0x03,0x00, // Device release number.
0x01, // Manufacture string index
0x02, // Product string index
0x00, // Serial number string index
0x01 // Number of configurations
};
const uint8_t CyCx3USBBOSDscr[] =
{
0x05, // Descriptor size
CY_U3P_BOS_DESCR, // Device descriptor type
0x16, 0x00, // Length of this descriptor and all sub descriptors
0x02, // Number of device capability descriptors
// USB 2.0 Extension
0x07, // Descriptor size
CY_U3P_DEVICE_CAPB_DESCR, // Device capability type descriptor
CY_U3P_USB2_EXTN_CAPB_TYPE, // USB 2.1 extension capability type
0x1E,0x64,0x00,0x00, // Supported device level features: LPM support, BESL supported, Baseline BESL=400 us, Deep BESL=1000 us.
// SuperSpeed Device Capability
0x0A, // Descriptor size
CY_U3P_DEVICE_CAPB_DESCR, // Device capability type descriptor
CY_U3P_SS_USB_CAPB_TYPE, // SuperSpeed device capability type
0x00, // Supported device level features
0x0E, 0x00, // Speeds supported by the device : SS, HS and FS
0x03, // Functionality support.
0x00, // U1 device exit latency
0x00, 0x00 // U2 device exit latency
};
// Standard Device Qualifier Descriptor
const uint8_t CyCx3USBDeviceQualDscr[] =
{
0x0A, // descriptor size
CY_U3P_USB_DEVQUAL_DESCR, // Device qualifier descriptor type
0x00, 0x02, // USB 2.0
0x00, // Device class
0x00, // Device sub-class
0x00, // Device protocol
0x40, // Maxpacket size for EP0 : 64 bytes
0x01, // Number of configurations
0x00 // Reserved
};
// Standard Super Speed Configuration Descriptor
const uint8_t CyCx3USBSSConfigDscr[] =
{
// Configuration Descriptor
0x09, // Descriptor Size
CY_U3P_USB_CONFIG_DESCR, // Configuration Descriptor Type
0x39, 0x00, // Length of this descriptor and all sub descriptors
0x01, // Number of interfaces
0x01, // Configuration number
0x00, // Configuration string index
0x80, // Config characteristics - Self Powered
0x32, // Max power consumption of device (in 8mA unit) : 96mA
// Interface descriptor
0x09, // Descriptor size
CY_U3P_USB_INTRFC_DESCR, // Interface Descriptor type
0x00, // Interface number
0x00, // Alternate setting number
0x03, // Number of endpoints
0xFF, // Interface class, 0xFF = vendor-specific
0x00, // Interface sub class
0x00, // Interface protocol code
0x00, // Interface descriptor string index
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// SOC USB EP1 Stuff
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Endpoint descriptor for producer EP
0x07, // Descriptor size
CY_U3P_USB_ENDPNT_DESCR, // Endpoint descriptor type
0x01, // Endpoint address and description
CY_U3P_USB_EP_BULK, // Bulk endpoint type
0x00,0x04, // Max packet size = 1024 bytes
0x00, // Servicing interval for data transfers : 0 for bulk
// Super speed endpoint companion descriptor for producer EP
0x06, // Descriptor size
CY_U3P_SS_EP_COMPN_DESCR, // SS endpoint companion descriptor type
0, // Max no. of packets in a burst: i.e. 0=burst 1 packet at a time. Non-streaming. Motz Debug!!!
0x00, // Max streams for bulk EP = 0 (No streams)
0x00,0x00, // Service interval for the EP : 0 for bulk
// Endpoint descriptor for consumer EP
0x07, // Descriptor size
CY_U3P_USB_ENDPNT_DESCR, // Endpoint descriptor type
0x81, // Endpoint address and description
CY_U3P_USB_EP_BULK, // Bulk endpoint type
0x00,0x04, // Max packet size = 1024 bytes
0x00, // Servicing interval for data transfers : 0 for Bulk
// Super speed endpoint companion descriptor for consumer EP
0x06, // Descriptor size
CY_U3P_SS_EP_COMPN_DESCR, // SS endpoint companion descriptor type
0, // Max no. of packets in a burst: i.e. 0=burst 1 packet at a time. Non-streaming. Motz Debug!!!
0x00, // Max streams for bulk EP = 0 (No streams)
0x00,0x00, // Service interval for the EP : 0 for bulk
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Endpoint Descriptor for BULK Streaming Video Data
0x07, // Descriptor size
CY_U3P_USB_ENDPNT_DESCR, // Endpoint Descriptor Type
0x83, // Endpoint address and description: EP 3 IN
CY_U3P_USB_EP_BULK, // BULK End point
0x00,0x04, // Max packet size = 1024 bytes
0x00, // Servicing interval for data transfers
// Super Speed Endpoint Companion Descriptor
0x06, // Descriptor size
CY_U3P_SS_EP_COMPN_DESCR, // SS Endpoint Companion Descriptor Type
0x0F, // Max number of packets per burst: 16
0x00, // Attribute: Streams not defined
0x00, // No meaning for bulk
0x00
};
// Standard High Speed Configuration Descriptor
const uint8_t CyCx3USBHSConfigDscr[] =
{
// Configuration descriptor
0x09, // Descriptor size
CY_U3P_USB_CONFIG_DESCR, // Configuration descriptor type
0x27,0x00, // Length of this descriptor and all sub descriptors
0x01, // Number of interfaces
0x01, // Configuration number
0x00, // COnfiguration string index
0x80, // Config characteristics - bus powered
0x32, // Max power consumption of device (in 2mA unit) : 100mA
// Interface descriptor
0x09, // Descriptor size
CY_U3P_USB_INTRFC_DESCR, // Interface Descriptor type
0x00, // Interface number
0x00, // Alternate setting number
0x03, // Number of endpoints
0xFF, // Interface class
0x00, // Interface sub class
0x00, // Interface protocol code
0x00, // Interface descriptor string index
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// SOC USB EP1 Stuff
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Endpoint descriptor for producer EP1
0x07, // Descriptor size
CY_U3P_USB_ENDPNT_DESCR, // Endpoint descriptor type
0x01, // Endpoint address and description
CY_U3P_USB_EP_BULK, // Bulk endpoint type
0x00,0x02, // Max packet size = 512 bytes
0x00, // Servicing interval for data transfers : 0 for bulk
// Endpoint descriptor for consumer EP1
0x07, // Descriptor size
CY_U3P_USB_ENDPNT_DESCR, // Endpoint descriptor type
0x81, // Endpoint address and description
CY_U3P_USB_EP_BULK, // Bulk endpoint type
0x00,0x02, // Max packet size = 512 bytes
0x00, // Servicing interval for data transfers : 0 for bulk
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Endpoint descriptor for Bulk streaming video data
0x07, // Descriptor size
CY_U3P_USB_ENDPNT_DESCR, // Endpoint Descriptor Type
0x83, // Endpoint address and description: EP 3 IN
CY_U3P_USB_EP_BULK, // BULK End point
0x00, // Packet Size: 512 bytes
0x02,
0x00 // Servicing interval for data transfers
};
// Standard Full Speed Configuration Descriptor
const uint8_t CyCx3USBFSConfigDscr[] =
{
// Configuration descriptor
0x09, // Descriptor size
CY_U3P_USB_CONFIG_DESCR, // Configuration descriptor type
0x27,0x00, // Length of this descriptor and all sub descriptors
0x01, // Number of interfaces
0x01, // Configuration number
0x00, // COnfiguration string index
0x80, // Config characteristics - bus powered
0x32, // Max power consumption of device (in 2mA unit) : 100mA
// Interface descriptor
0x09, // Descriptor size
CY_U3P_USB_INTRFC_DESCR, // Interface descriptor type
0x00, // Interface number
0x00, // Alternate setting number
0x03, // Number of endpoints
0xFF, // Interface class
0x00, // Interface sub class
0x00, // Interface protocol code
0x00, // Interface descriptor string index
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// SOC USB EP1 Stuff
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Endpoint descriptor for producer EP
0x07, // Descriptor size
CY_U3P_USB_ENDPNT_DESCR, // Endpoint descriptor type
0x01, // Endpoint address and description
CY_U3P_USB_EP_BULK, // Bulk endpoint type
0x40,0x00, // Max packet size = 64 bytes
0x00, // Servicing interval for data transfers : 0 for bulk
// Endpoint descriptor for consumer EP
0x07, // Descriptor size
CY_U3P_USB_ENDPNT_DESCR, // Endpoint descriptor type
0x81, // Endpoint address and description
CY_U3P_USB_EP_BULK, // Bulk endpoint type
0x40,0x00, // Max packet size = 64 bytes
0x00, // Servicing interval for data transfers : 0 for bulk
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Endpoint descriptor for producer EP
0x07, // Descriptor size
CY_U3P_USB_ENDPNT_DESCR, // Endpoint descriptor type
0x83, // Endpoint address and description
CY_U3P_USB_EP_BULK, // Bulk endpoint type
0x40,0x00, // Max packet size = 64 bytes
0x00, // Servicing interval for data transfers : 0 for bulk
};
// Standard product string descriptor
const uint8_t CyCx3USBProductDscr[] =
{
0x16, // Descriptor Size
CY_U3P_USB_STRING_DESCR, // Device descriptor type
'C', 0x00, // Product Descriptor String
'X', 0x00,
'3', 0x00,
'-', 0x00,
'V', 0x00,
'E', 0x00,
'N', 0x00,
'D', 0x00,
'O', 0x00,
'R', 0x00
};
// Standard language ID string descriptor
const uint8_t CyCx3USBStringLangIDDscr[] =
{
0x04, // Descriptor size
CY_U3P_USB_STRING_DESCR, // Device descriptor type
0x09,0x04 // Language ID supported
};
// Standard manufacturer string descriptor
const uint8_t CyCx3USBManufactureDscr[] =
{
0x10, // Descriptor size
CY_U3P_USB_STRING_DESCR, // Device descriptor type
'C',0x00, // Manufacturer String
'y',0x00,
'p',0x00,
'r',0x00,
'e',0x00,
's',0x00,
's',0x00
};
// Standard product string descriptor
const uint8_t CyCx3USBConfigSSDscr[] =
{
0x10, // Descriptor Size
CY_U3P_USB_STRING_DESCR, // Device descriptor type
'U', 0x00, // Super-Speed Configuration Descriptor
'S', 0x00,
'B', 0x00,
'-', 0x00,
'3', 0x00,
'.', 0x00,
'0', 0x00
};
// Standard product string descriptor
const uint8_t CyCx3USBConfigHSDscr[] =
{
0x10, // Descriptor Size
CY_U3P_USB_STRING_DESCR, // Device descriptor type
'U', 0x00, // High-Speed Configuration Descriptor
'S', 0x00,
'B', 0x00,
'-', 0x00,
'2', 0x00,
'.', 0x00,
'1', 0x00
};
// Standard product string descriptor
const uint8_t CyCx3USBConfigFSDscr[] =
{
0x10, // Descriptor Size
CY_U3P_USB_STRING_DESCR, // Device descriptor type
'U', 0x00, // Full-Speed Configuration Descriptor
'S', 0x00,
'B', 0x00,
'-', 0x00,
'1', 0x00,
'.', 0x00,
'1', 0x00
};
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello Motz,
" I would have just attached the USB descriptor file, but I couldn't figure out how to add a file to this message."
=> Please click on the Use advanced editor option in the top right of the interaction window, and then click on Attach (placed in the bottom right corner) to attach the files in future.
Can you please try using Cypress Driver in your application and try streaming from your device and see if you still face the issue?
Also, can you share Wireshark traces for both the cases, using your custom driver and using Cypress driver?
Regards,
Yashwant
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
The endpoint burst was working from the beginning, but there was an issue in the host application which was decoding the incoming transactions as packets of 1024 (or Packet View) in the analyzer software.
Since there is no need for UVC header addition, the channel can be changed to AUTO channel from MANUAL channel to gain better throughput and inturn remove CPU intervention -> NON-UVC device.
Regards,
Yashwant