diff --git a/port/dwc2/usb_dwc2_param.h b/port/dwc2/usb_dwc2_param.h index cd988a32..a3ed7781 100644 --- a/port/dwc2/usb_dwc2_param.h +++ b/port/dwc2/usb_dwc2_param.h @@ -281,6 +281,15 @@ struct dwc2_user_params { uint32_t total_fifo_size; }; +struct usb_dwc2_user_fifo_config { + /* (5 * number of control endpoints + 8) + ((largest USB packet used / 4) + 1 for + * status information) + (2 * number of OUT endpoints) + 1 for Global NAK + */ + uint16_t device_rx_fifo_size; + /* IN Endpoints Max packet Size / 4 */ + uint16_t device_tx_fifo_size[MAX_EPS_CHANNELS]; +}; + static inline void dwc2_get_hwparams(uint32_t reg_base, struct dwc2_hw_params *hw) { unsigned int width; @@ -353,5 +362,6 @@ static inline void dwc2_get_hwparams(uint32_t reg_base, struct dwc2_hw_params *h } void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params); +void dwc2_get_user_fifo_config(uint32_t reg_base, struct usb_dwc2_user_fifo_config *config); #endif \ No newline at end of file diff --git a/port/dwc2/usb_glue_esp.c b/port/dwc2/usb_glue_esp.c index 57dcdd83..bc85e7a5 100644 --- a/port/dwc2/usb_glue_esp.c +++ b/port/dwc2/usb_glue_esp.c @@ -225,6 +225,17 @@ void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params) memcpy(params, ¶m_fs, sizeof(struct dwc2_user_params)); } #endif +#ifdef CONFIG_USB_DWC2_CUSTOM_FIFO + struct usb_dwc2_user_fifo_config s_dwc2_fifo_config; + + dwc2_get_user_fifo_config(reg_base, &s_dwc2_fifo_config); + + params->device_rx_fifo_size = s_dwc2_fifo_config.device_rx_fifo_size; + for (uint8_t i = 0; i < MAX_EPS_CHANNELS; i++) + { + params->device_tx_fifo_size[i] = s_dwc2_fifo_config.device_tx_fifo_size[i]; + } +#endif } void usbd_dwc2_delay_ms(uint8_t ms) diff --git a/port/dwc2/usb_glue_st.c b/port/dwc2/usb_glue_st.c index fad70c67..324a600a 100644 --- a/port/dwc2/usb_glue_st.c +++ b/port/dwc2/usb_glue_st.c @@ -7,6 +7,8 @@ #include "usbh_core.h" #include "usb_dwc2_param.h" +#ifndef CONFIG_USB_DWC2_CUSTOM_PARAM + #if __has_include("stm32f1xx_hal.h") #include "stm32f1xx_hal.h" @@ -545,6 +547,8 @@ const struct dwc2_user_params param_pb14_pb15 = { 0 }; // do not support #endif #endif +#endif // CONFIG_USB_DWC2_CUSTOM_PARAM + #if !defined(HAL_HCD_MODULE_ENABLED) && !defined(HAL_PCD_MODULE_ENABLED) #error please define HAL_HCD_MODULE_ENABLED or HAL_PCD_MODULE_ENABLED in stm32xxx_hal_conf.h #endif @@ -686,6 +690,7 @@ void usb_hc_low_level_deinit(struct usbh_bus *bus) } #endif +#ifndef CONFIG_USB_DWC2_CUSTOM_PARAM void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params) { if (reg_base == 0x40040000UL) { // USB_OTG_HS_PERIPH_BASE @@ -693,7 +698,19 @@ void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params) } else { memcpy(params, ¶m_pa11_pa12, sizeof(struct dwc2_user_params)); } +#ifdef CONFIG_USB_DWC2_CUSTOM_FIFO + struct usb_dwc2_user_fifo_config s_dwc2_fifo_config; + + dwc2_get_user_fifo_config(reg_base, &s_dwc2_fifo_config); + + params->device_rx_fifo_size = s_dwc2_fifo_config.device_rx_fifo_size; + for (uint8_t i = 0; i < MAX_EPS_CHANNELS; i++) + { + params->device_tx_fifo_size[i] = s_dwc2_fifo_config.device_tx_fifo_size[i]; + } +#endif } +#endif extern uint32_t SystemCoreClock;