Forum Discussion
USB Device Issue on Cyclone V / HPS
- 26 days ago
@FabricNS
Please ignore above issue that wasn't it.
I played some more with the tinyusb code and finally found the problem. It seems the old dwc2 USB controller receive fifo size must be set to a minimum of 119 words. The fix is to edit the tinyusb/src/portable/synopsys/dwc2/dcd_dwc2.c file at the function calc_device_grxfsiz().
The original code is:
TU_ATTR_ALWAYS_INLINE static inline uint16_t calc_device_grxfsiz(uint16_t largest_ep_size, uint8_t ep_count) { return (uint16_t)(13 + 1 + 2 * ((largest_ep_size / 4) + 1) + 2 * ep_count); }I changed it to this:
TU_ATTR_ALWAYS_INLINE static inline uint16_t calc_device_grxfsiz(uint16_t largest_ep_size, uint8_t ep_count) { // Altera Cyclone V SoC DWC2 bug, the minimum grzfsiz is 119 words, i.e. 4*119 = 476 bytes #if defined(TUP_USBIP_DWC2_CV) && TU_CHECK_MCU(OPT_MCU_CV) uint16_t words = (uint16_t)(13 + 1 + 2 * ((largest_ep_size / 4) + 1) + 2 * ep_count); if(words < 119) words = 119; return words; #else return (uint16_t)(13 + 1 + 2 * ((largest_ep_size / 4) + 1) + 2 * ep_count); #endif }You will also need to add OPT_MCU_CV into tinyusb/src/common/tusb_mcu.h:
...... //--------------------------------------------------------------------+ // Geehy //--------------------------------------------------------------------+ #elif TU_CHECK_MCU(OPT_MCU_APM32F0XX) #define TUP_USBIP_FSDEV #define TUP_USBIP_FSDEV_APM32 #define CFG_TUSB_FSDEV_PMA_SIZE 1024u //--------------------------------------------------------------------+ // Altera Cyclone V SoC //--------------------------------------------------------------------+ #elif TU_CHECK_MCU(OPT_MCU_CV) #define TUP_USBIP_DWC2 #define TUP_USBIP_DWC2_CV #define TUP_DCD_ENDPOINT_MAX 16 #endifand also ensure to set it in your tusb_config.h:
#ifndef CFG_TUSB_MCU #define CFG_TUSB_MCU OPT_MCU_CV #endif
I think the problem might be the hwlib alt_usb.h file. If I remember from many years ago, I noticed that some (but not all) registers have the wrong address offset. Perhaps these registers are affected DOEPCTL0 and DOEPTSIZ0 , so basically you could be writing to incorrect registers.
Thank you for your comment. Let me check on my side, and I'll get back to you with an update.