Looking for FX3 descriptors that work with WinUSB

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

cross mob
dablc_1191636
Level 1
Level 1
First like received

Hi,

   

We are looking to use our FX3 device through Windows' built-in WinUSB driver. 

   

We currently have the FX3 up and running as a "Cypress USB StreamerExample" device with 4 endpoints.

   

Is there any FX3 firmware example available of how I would need to change the descriptors to get it to identify with WinUSB?

   

Would all these changes be limited to the descriptor file "cyfxslfifousbdscr.c"?

   

If at all possible, we would like a WinUSB solution that works across Windows XP, 7, 8 and 10.

   

Kind regards,

   

Daniel

1 Solution
lock attach
Attachments are accessible only for community members.

Hi @OlDu_1860321

Please find attached firmware that can bind to WinUSB driver.

Best Regards,
AliAsgar

View solution in original post

0 Likes
12 Replies
Anonymous
Not applicable

Hi,

   

You need to add the Microsoft OS String descriptor, Extended Compat ID Descritptor and Extended Properties Descriptor. Ref: https://msdn.microsoft.com/en-in/library/windows/hardware/ff537430(v=vs.85).aspx

   

Regards,

   

-Madhu Sudhan

0 Likes

After a lot of debugging, we finally got the FX3 to work with WinUsb on both Windows 7 and 8. I listed our code additions below. Hope this helps someone!

   

- cyfxslfifosync.h:

   

 

   
/* attempt at WinUSB support */ extern const uint8_t CyFxUsbOSDscr[]; extern const uint8_t CyFxUsbExtCompatIdOSFeatureDscr[]; extern const uint8_t CyFxUsbExtPropertiesOSFeatureDscr[];
   

 

   

- cyfxslfifousbdscr.c:

   

 

   
    
/* OS descriptor as per WinUSB requirement */ const uint8_t CyFxUsbOSDscr[] __attribute__ ((aligned (32))) = {     0x12,                           /* bLength: Length of the descriptor */     CY_U3P_USB_STRING_DESCR,        /* bDescriptorType: Descriptor type */     'M',0x00,                        /* qwSignature: Signature field */     'S',0x00,     'F',0x00,     'T',0x00,     '1',0x00,     '0',0x00,     '0',0x00,     0x00,                           /* bMS_VendorCode: Vendor code */     0x00                            /* bPad: Pad field */ };  /* Extended Compat ID OS Feature Descriptor as per WinUSB requirement */ const uint8_t CyFxUsbExtCompatIdOSFeatureDscr[] __attribute__ ((aligned (32))) = {     // Header Section     0x28,0x00,0x00,0x00,                     /* dwLength: 40 = 16 + 24 */     0x00,0x01,                               /* bcdVersion: The descriptor’s version number */     0x04,0x00,                                 /* wIndex: Extended compat ID descriptor */     0x01,                                    /* bCount: Number of function sections */     0x00,0x00,0x00,0x00,0x00,0x00,0x00,      /* RESERVED */     // Function Sections     0x00,                                    /* bFirstInterfaceNumber */     0x01,                                    /* RESERVED */     'W','I','N','U','S','B',0x00,0x00,       /* compatibleID */     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* subCompatibleID */     0x00,0x00,0x00,0x00,0x00,0x00            /* RESERVED */ };  /* Extended Properties OS Feature Descriptor as per WinUSB (USB 3.0) requirement */ const uint8_t CyFxUsbExtPropertiesOSFeatureDscr[] __attribute__ ((aligned (32))) = {     // Header Section     0x8E,0x00,0x00,0x00,                     /* dwLength: 142 = 10 + 132 */     0x00,0x01,                               /* bcdVersion: The descriptor’s version number */     0x05,0x00,                                 /* wIndex: Extended property OS descriptor */     0x01,0x00,                               /* bCount: Number of properties */     // Custom Property Section 1     0x84,0x00,0x00,0x00,                     /* dwSize: 132 = 14 + 40 + 78 */     0x01,0x00,0x00,0x00,                     /* dwPropertyDataType: A NULL-terminated Unicode String (REG_SZ) */     0x28,0x00,                               /* wPropertyNameLength: 40 */                                              /* bPropertyName: "DeviceInterfaceGUID" */     'D',0x00,'e',0x00,'v',0x00,'i',0x00,'c',0x00,'e',0x00,     'I',0x00,'n',0x00,'t',0x00,'e',0x00,'r',0x00,'f',0x00,'a',0x00,'c',0x00,'e',0x00,     'G',0x00,'U',0x00,'I',0x00,'D',0x00,     0x00,0x00,     0x4E,0x00,0x00,0x00,                     /* dwPropertyDataLength: 78 */                                              /* bPropertyData: "{01234567-2A4F-49EE-8DD3-FADEA377234A}" */     '{',0x00,     '0',0x00,'1',0x00,'2',0x00,'3',0x00,'4',0x00,'5',0x00,'6',0x00,'7',0x00,'-',0x00,     '2',0x00,'A',0x00,'4',0x00,'F',0x00,'-',0x00,     '4',0x00,'9',0x00,'E',0x00,'E',0x00,'-',0x00,     '8',0x00,'D',0x00,'D',0x00,'3',0x00,'-',0x00,     'F',0x00,'A',0x00,'D',0x00,'E',0x00,'A',0x00,'3',0x00,'7',0x00,'7',0x00,'2',0x00,'3',0x00,'4',0x00,'A',0x00,     '}',0x00,     0x00,0x00 };
   
   

 

   

- cyfxslfifosync.c, inside CyFxSlFifoApplnUSBSetupCB function:

   

1) Add variable for wLength amidst other variables:

   

 

   
    
    uint8_t  bRequest, bReqType;     uint8_t  bType, bTarget;     uint16_t wValue, wIndex, wLength;     CyBool_t isHandled = CyFalse;      /* Decode the fields from the setup request. */     bReqType = (setupdat0 & CY_U3P_USB_REQUEST_TYPE_MASK);     bType    = (bReqType & CY_U3P_USB_TYPE_MASK);     bTarget  = (bReqType & CY_U3P_USB_TARGET_MASK);     bRequest = ((setupdat0 & CY_U3P_USB_REQUEST_MASK) >> CY_U3P_USB_REQUEST_POS);     wValue   = ((setupdat0 & CY_U3P_USB_VALUE_MASK)   >> CY_U3P_USB_VALUE_POS);     wIndex   = ((setupdat1 & CY_U3P_USB_INDEX_MASK)   >> CY_U3P_USB_INDEX_POS);     wLength  = ((setupdat1 & CY_U3P_USB_LENGTH_MASK)  >> CY_U3P_USB_LENGTH_POS);
   
   

 

   

2) Add below the "if (bType == CY_U3P_USB_STANDARD_RQT) {}" section:

   

 

   
    
    else if ((bReqType == 0xC0) && (wIndex == 0x04)) {         /* Handle OS Feature Compatible IDs descriptor request. */          /* Make sure we do not send more data than requested. */         if (wLength > CyFxUsbExtCompatIdOSFeatureDscr[0])             wLength = CyFxUsbExtCompatIdOSFeatureDscr[0];          CyU3PUsbSendEP0Data (wLength, (uint8_t *)CyFxUsbExtCompatIdOSFeatureDscr);         isHandled = CyTrue;     }     //else if ((bReqType == 0xC1) && (wIndex == 0x05)) {     // attempted fix: some USB drivers incorrectly use bReqType 0xC0 to get OS Feature Extended Properties     //else if (((bReqType | 0x01) == 0xC1) && (wIndex == 0x05)) {     else if (wIndex == 0x05) {         /* Handle OS Feature Extended Properties descriptor request. */          /* Make sure we do not send more data than requested. */         if (wLength > CyFxUsbExtPropertiesOSFeatureDscr[0])             wLength = CyFxUsbExtPropertiesOSFeatureDscr[0];          CyU3PUsbSendEP0Data (wLength, (uint8_t *)CyFxUsbExtPropertiesOSFeatureDscr);         isHandled = CyTrue;      }
   
   

 

   

Edit: so much the formatting... it looked better in the editor. 

0 Likes
Anonymous
Not applicable

Daniel,

   

Excellent work. Thank you so much.

   

However, isn't there something missing? (when I tried this with my design that previously used the Cypress driver, it still loads the Cypress driver).
The MS document that was pointed to above, was referring to a required string at index 0xEE, and I was wondering where that comes into play.
Shouldn't there maybe be some calls in CyFxSlFifoApplnInit() function to 

   

CyU3PUsbSetDesc(CY_U3P_USB_SET_FS_CONFIG_DESCR, 0, (uint8_t *) ...);

   

 

   

and

   

CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 0xEE (I presume?), (uint8_t *) ...);

   

Can you provide the code for that as well?

   

Also, your formatting is just fine (if you copy, and paste your code above in a decent editor, it retains the tabs! 😉 )

Kind regards,

   

~ Paul

   

 

   

Update 1:

   

I actually added these calls:

   

    /* Extended Compat ID OS Feature Descriptor */
    apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_BOS_DESCR, 1, (uint8_t *)CyFxUsbExtCompatIdOSFeatureDscr);
 

   

    /* Extended Properties OS Feature Descriptor as per WinUSB (USB 3.0) requirement */
    apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_BOS_DESCR, 2, (uint8_t *)CyFxUsbExtPropertiesOSFeatureDscr);

   

    apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 0xEE, (uint8_t *)CyFxUsbOSDscr);

   

 

   

but I get an error when adding that last string descriptor at index 0xEE: It gives me a CY_U3P_ERROR_BAD_INDEX error.

   

Do I need to pad dummy strings to get to index 0xEE?

   

Any ideas?

0 Likes

@Paul Claessen: The 0xEE ("Miscrosoft OS String") descriptor is handled in our "if (bType == CY_U3P_USB_STANDARD_RQT)" section, see below.

   

Since my previous post we also solved support for Win10 (and 8.1) by also adding MS OS 2.0 descriptors to our FX3, so I guess it's time to repost our solution:

   

Edit: code paste prevented by forum spam filter.. 😞

0 Likes
Anonymous
Not applicable

Hi,

   

Information about USB device, Enumeration behavior and Registry variables can be found https://msdn.microsoft.com/en-us/library/windows/hardware/jj649944(v=vs.85).aspx

   

​I am faced with the following reported issue : http://www.microchip.com/forums/m802958.aspx

   

Concerning the string 0xEE(238), you can handle the string descriptor request yourself in the USBSetupCB USB Setup Callback function. Look at the USB specification.

   

I use the following tools to reset the Windows registry : Device Cleanup Tool and USBOblivion. I am able to test all the enumeration process and validate that with the USB3.0/2.0 Analyzer.

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

Hi,

   

I faced an issue regarding Renesas XHCI USB 3.0 Host Controller. Some versions of the driver cause the USB Extended Property OS Feature Descriptor to be missing.

   

System information : 

   
        
  • Renesas Electronics USB 3.0 Host Controller :     
            
    • Firmware Version : 4015
    •       
    • PCIe Card : PCI\VEN_1033&DEV_0194&REV_04  PCI\VEN_1033&DEV_0194&SUBSYS_00000000&REV_04
    •      
  •     
  • Driver Tested :     
            
    • 2.0.32.0 : Ext Prop OK
    •       
    • 2.0.34.0 : Ext Prop OK
    •       
    • 2.1.28.0 : Ext Prop Missing
    •       
    • 2.1.39.0 : Ext Prop Missing
    •      
  •    
   

It is quite annoying. The workaround is to connect the device to a USB 2.0 EHCI controller so the Ext Prop can be retrieved.
I hope there is not too much other issue like this. Implementing specification is hard enough without having to deal with a challenging environment equipment.

0 Likes

Hi sbertrand,

Back when I was working on our issue, I read that some controller drivers use incorrect requests to get descriptors: e.g. wrong bType, bTarget, bRequest. If you have an USB analyzer, you can find out the details of your controller's descriptor requests. With this knowledge you can adapt your descriptor handling in the FX3, so it responds to this (incorrect) request with the expected descriptor, compensating for the controller bug?

0 Likes
Anonymous
Not applicable

Hi Daniel,

   

I looked at my analyzer recording but there is no request at all. The request for the Ext Prop are not happening with the recent driver.

   

With the analyzer, I did compensate for the request of the Ext Prop happening as a Device Request instead of a Interface Request.

   

The recent drivers are just not suitable. My card firmware may be old or not matching the driver.

0 Likes
Anonymous
Not applicable

I am facing a new issue regarding MSFT Extended Property OS Feature Descriptor and Renesas XHCI Host controller.
Unicode String Ext Prop are able to be reported correctly. I am defining DWORD Ext Prop for suspend idle configuration (DefaultIdleState, DefaultIdleTimeout, DeviceIdleEnabled, DeviceIdleIgnoreWakeEnable).

   

On Intel USB Host controllers ( EHCI and XHCI ), the registry values are correct and suspend/resume testing occurs correctly. However when the device is fully enumerated by the Renesas XHCI Host controller, the DWORD Ext Prop are reported to the system as unicode strings. My value of 500 ms of DefaultIdleTimeout shows up as "DefaultIdleTimeout"="Ǵ". "Ǵ" is 00 F4 01 or 500 in decimal.

   

Renesas Electronics USB 3.0 Host Controller Driver version 2.0.34.0.

0 Likes
OlDu_1860321
Level 1
Level 1
First like given

Hi everyone,

I'm facing the same problem, I'm unable to get the WinUSB to get install automatically by just adding those descriptor and their handling in the setup & callback functions...

It seems like most of the information (code example etc...) was filter as spam in some of the replies. I was looking for some help on this one. I already added all the descriptor in the cyfxbulkscr.c like describe by dablc_1191636in his previous post.

After that, I'm not sure how and if I have to set the descriptors in the CyFxBulkSrcSinkApplnInit function like all the others descriptors... I tried to do it, but I never received the request expected in the callback functions. Also, has mention earlier in the post, when I tried to use the 0xEE index for the M-OS descriptor, I got error from Cypress API...

I also tried to add the call to set the descriptor for the ExtCompatIDOS and the ExtPropertiesOS using CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_BOS_DESCR, ..., ...), but when I called those, I got issues in the DeviceManager (saying that it was an invalid BOS descriptors)...

I also tried to change the fast enumeration (not to use it) byt calling this function with the CyFalse variable, but same, not success to get the correct requests...

CyU3PUsbRegisterSetupCallback(CyFxBulkSrcSinkApplnUSBSetupCB, CyFalse);

Hope this thread ain't dead and someone will be able to enlight me a bit on this one.

0 Likes

For more details, I'm really trying to get the USB3.0 SuperSpeed on Windows 10. Others version of Windows doesn't need to be supported for now!

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

Hi @OlDu_1860321

Please find attached firmware that can bind to WinUSB driver.

Best Regards,
AliAsgar

0 Likes