summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2025-07-07 20:28:14 +0800
committersakumisu <[email protected]>2025-07-07 20:28:14 +0800
commit5a94ed80cb4a0fa01f99b21a649f12f9d030cd85 (patch)
tree5c944d28ef861d804336191203c781e11e5957ec
parent22e150a8e61eb6aaa60c9b96d41cc31cf0645e1e (diff)
feat(port/dwc2): add user fifo config api
Signed-off-by: sakumisu <[email protected]>
-rw-r--r--port/dwc2/usb_dwc2_param.h10
-rw-r--r--port/dwc2/usb_glue_esp.c11
-rw-r--r--port/dwc2/usb_glue_st.c17
3 files changed, 38 insertions, 0 deletions
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, &param_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, &param_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;