FX3 : enumeration problem on host PC boot

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

cross mob
fmo_nn6
Level 1
Level 1
5 sign-ins First like received First reply posted

Hello,

We use a FX3 controller in one of our USB products, which connects to a PC host (laptop/desktop).
Recently we had an issue with one particular customer, which is that our device is not recognized by Windows 10 after reboot of the host PC.
Windows displays either error on 'Device Descriptor Request Failed' or in some cases 'Unknown USB Device (Link in Compliance Mode)'. After a few tries/reboots though, we can get a correct enumeration and those messages do not appear (until next reboot...). So it seems to randomly fail most of the time.
When we get these errors, replugging device is enough to force re-enumeration, and device is detected by Windows. Still, for reasons specific to that customer, this operation is not acceptable if required at every reboot.

We checked the reference firmware code provided with 'EZ-USB FX3 SDK', as well as the PCB recommandations made in AN70707... On the host side we tried to disable 'USB suspension' or 'fast boot' to be sure there is no power supply issue on startup. I add that the computer is not running on battery, and that power supply (VBUS) is stable.

My question is: is there any reason why some (few) hosts would not recognize FX3 controller on startup ? Do you know about any adjustments to be made on USB interface lanes or in firmware ?

I add that our device is powered only from VBUS (no battery). In that use-case, can we let the VBATT ball floating (NC) ? This is unclear in AN70707, or we missed it.

 

0 Likes
1 Solution
AliAsgar
Moderator
Moderator
Moderator
1000 replies posted 250 solutions authored 750 replies posted

Hello,

I was able to boot from it but then I cannot load my own firmware in FX3 RAM. I am using Cypress USB center tool: once I click program the RAM, message "programming succeeded" is displayed alhough no device is detected. When I do the same operation from official bootloader it works..

>> The device is not detected as there is no renumeration happening after the application firmware is programmed on to the RAM. To force renumeration, in Fx3BootAppGcc project,  inside the usb_boot.c file,  go to myUsbBoot() function. In the code line given below, make sure the first argument is "CyFalse". This allows for force renumeration.

apiRetStatus = CyFx3BootUsbStart (CyFalse, myUsbEventCallback);

 

Is there a fix that has been implemented in the FX3 ROM bootloader in most recent chips ? I looked into this doc section 'errata' page 47. If I understand correctly the fix has not been implemented, only the provided workaround is available, which requires a dedicated EEPROM to be used to store the custom bootloader ? Is that correct ?

>> Yes, the fix has not yet been implemented. Workarounds are provided.

Best Regards

AliAsgar

View solution in original post

0 Likes
4 Replies
AliAsgar
Moderator
Moderator
Moderator
1000 replies posted 250 solutions authored 750 replies posted

Hello,

Kindly look into Question 2 of this link : https://community.cypress.com/t5/Knowledge-Base-Articles/Trouble-Shooting-Guide-for-the-FX3-FX3S-CX3... .

 

Best Regards,

AliAsgar

 

 

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

Hello,

Thank you for the reply.

I looked into section 2 of the provided link. I tried the workaround with custom bootloader loaded into external EEPROM. My issue with this is that our EEPROM is already used for other purposes... Still, I gave it a try.

I was able to boot from it but then I cannot load my own firmware in FX3 RAM. I am using Cypress USB center tool: once I click program the RAM, message "programming succeeded" is displayed alhough no device is detected. When I do the same operation from official bootloader it works...

My question for you is: is there a fix that has been implemented in the FX3 ROM bootloader in most recent chips ? I looked into this doc section 'errata' page 47. If I understand correctly the fix has not been implemented, only the provided workaround is available, which requires a dedicated EEPROM to be used to store the custom bootloader ? Is that correct ?

For information I enclose a picture of the chip reference we embed.
FX3 bootloader version seems to be "0xa9000000"  (using  request 0xA0, 0xFFFF0020 "read bootloader version").

Regards

0 Likes
AliAsgar
Moderator
Moderator
Moderator
1000 replies posted 250 solutions authored 750 replies posted

Hello,

I was able to boot from it but then I cannot load my own firmware in FX3 RAM. I am using Cypress USB center tool: once I click program the RAM, message "programming succeeded" is displayed alhough no device is detected. When I do the same operation from official bootloader it works..

>> The device is not detected as there is no renumeration happening after the application firmware is programmed on to the RAM. To force renumeration, in Fx3BootAppGcc project,  inside the usb_boot.c file,  go to myUsbBoot() function. In the code line given below, make sure the first argument is "CyFalse". This allows for force renumeration.

apiRetStatus = CyFx3BootUsbStart (CyFalse, myUsbEventCallback);

 

Is there a fix that has been implemented in the FX3 ROM bootloader in most recent chips ? I looked into this doc section 'errata' page 47. If I understand correctly the fix has not been implemented, only the provided workaround is available, which requires a dedicated EEPROM to be used to store the custom bootloader ? Is that correct ?

>> Yes, the fix has not yet been implemented. Workarounds are provided.

Best Regards

AliAsgar

0 Likes

Hello

Thanks again for the quick feedback.
I should have mentionned it in my previous post, but I already tried to force re-enumeration using CyFx3BootUsbStart(CyFalse, ...). Was not enough.

BUT I found out this morning that my firmware actually crashed when I set the serial number in USB descriptor (see screenshot). I had to add a tempo of 100µs between call to CyU3PUsbStart() and overwrite of  CyFxUSBSerialNumber, and this solved my issue. 

crash_cyfxusbserial.png

I am not sure why but delaying it did the trick in my case. To be noted that it did not happen in my 'official' firmware cause I had an I2C read in EEPROM in between to get the serial info before setting the descriptors. This operation may be equivalent in term of timing to the 100µs wait in my new firmware. 
I had to comment this I2C read as EEPROM now stores the custom bootloader and no longer holds the device serial...

Anyway I think the bootloader based on Fx3BootAppGcc with "CyFx3BootUsbStart(CyFalse, ..)" seems to work fine. I  still have one last issue preventing me to use our firmware, but it is definitely an issue on our side.

I think this case can be closed.

Thank you for the support.