- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Please find attached firmware that can bind to WinUSB driver.
Best Regards,
AliAsgar
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
@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.. 😞
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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_1191636 in 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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Please find attached firmware that can bind to WinUSB driver.
Best Regards,
AliAsgar