Răsfoiți Sursa

update(cherryusb): update to v1.5.2

Signed-off-by: sakumisu <1203593632@qq.com>
sakumisu 1 lună în urmă
părinte
comite
38499668bf
53 a modificat fișierele cu 955 adăugiri și 697 ștergeri
  1. 4 1
      components/drivers/usb/cherryusb/Kconfig.rttpkg
  2. 23 21
      components/drivers/usb/cherryusb/README_zh.md
  3. 2 0
      components/drivers/usb/cherryusb/SConscript
  4. 1 1
      components/drivers/usb/cherryusb/VERSION
  5. 16 19
      components/drivers/usb/cherryusb/cherryusb_config_template.h
  6. 1 1
      components/drivers/usb/cherryusb/class/cdc/usbh_cdc_ecm.c
  7. 1 1
      components/drivers/usb/cherryusb/class/cdc/usbh_cdc_ncm.c
  8. 26 22
      components/drivers/usb/cherryusb/class/hub/usbh_hub.c
  9. 7 73
      components/drivers/usb/cherryusb/class/msc/usbd_msc.c
  10. 1 0
      components/drivers/usb/cherryusb/class/msc/usbh_msc.c
  11. 1 1
      components/drivers/usb/cherryusb/class/mtp/usb_mtp.h
  12. 2 2
      components/drivers/usb/cherryusb/class/vendor/net/usbh_rtl8152.c
  13. 7 12
      components/drivers/usb/cherryusb/class/wireless/usbh_rndis.c
  14. 1 1
      components/drivers/usb/cherryusb/common/usb_errno.h
  15. 1 1
      components/drivers/usb/cherryusb/common/usb_hc.h
  16. 6 0
      components/drivers/usb/cherryusb/common/usb_util.h
  17. 2 2
      components/drivers/usb/cherryusb/common/usb_version.h
  18. 0 6
      components/drivers/usb/cherryusb/core/usbd_core.c
  19. 67 33
      components/drivers/usb/cherryusb/core/usbh_core.c
  20. 2 1
      components/drivers/usb/cherryusb/core/usbh_core.h
  21. 4 0
      components/drivers/usb/cherryusb/demo/video_audiov1_hid_template.c
  22. 4 0
      components/drivers/usb/cherryusb/demo/video_static_h264_template.c
  23. 4 0
      components/drivers/usb/cherryusb/demo/video_static_mjpeg_template.c
  24. 4 0
      components/drivers/usb/cherryusb/demo/video_static_yuyv_template.c
  25. 1 1
      components/drivers/usb/cherryusb/idf_component.yml
  26. 3 7
      components/drivers/usb/cherryusb/platform/rtthread/usb_check.c
  27. 10 3
      components/drivers/usb/cherryusb/platform/rtthread/usbd_serial.c
  28. 2 2
      components/drivers/usb/cherryusb/platform/rtthread/usbh_serial.c
  29. 4 0
      components/drivers/usb/cherryusb/port/chipidea/usb_dc_chipidea.c
  30. 9 9
      components/drivers/usb/cherryusb/port/dwc2/README.md
  31. 13 2
      components/drivers/usb/cherryusb/port/dwc2/usb_dc_dwc2.c
  32. 88 88
      components/drivers/usb/cherryusb/port/dwc2/usb_dwc2_param.h
  33. 4 3
      components/drivers/usb/cherryusb/port/dwc2/usb_dwc2_reg.h
  34. 1 1
      components/drivers/usb/cherryusb/port/dwc2/usb_glue_at.c
  35. 4 0
      components/drivers/usb/cherryusb/port/dwc2/usb_glue_esp.c
  36. 122 55
      components/drivers/usb/cherryusb/port/dwc2/usb_glue_kendryte.c
  37. 2 2
      components/drivers/usb/cherryusb/port/dwc2/usb_glue_st.c
  38. 188 139
      components/drivers/usb/cherryusb/port/dwc2/usb_hc_dwc2.c
  39. 10 6
      components/drivers/usb/cherryusb/port/ehci/usb_hc_ehci.c
  40. 1 1
      components/drivers/usb/cherryusb/port/ehci/usb_hc_ehci.h
  41. 1 2
      components/drivers/usb/cherryusb/port/fsdev/usb_dc_fsdev.c
  42. 1 3
      components/drivers/usb/cherryusb/port/hpmicro/usb_dc_hpm.c
  43. 3 0
      components/drivers/usb/cherryusb/port/kinetis/usb_dc_kinetis.c
  44. 4 0
      components/drivers/usb/cherryusb/port/musb/README.md
  45. 135 62
      components/drivers/usb/cherryusb/port/musb/usb_dc_musb.c
  46. 2 2
      components/drivers/usb/cherryusb/port/musb/usb_glue_bk.c
  47. 2 2
      components/drivers/usb/cherryusb/port/musb/usb_glue_es.c
  48. 2 2
      components/drivers/usb/cherryusb/port/musb/usb_glue_sunxi.c
  49. 134 86
      components/drivers/usb/cherryusb/port/musb/usb_hc_musb.c
  50. 1 1
      components/drivers/usb/cherryusb/port/nxp/README.md
  51. 1 1
      components/drivers/usb/cherryusb/port/ohci/usb_hc_ohci.h
  52. 5 9
      components/drivers/usb/cherryusb/port/rp2040/usb_dc_rp2040.c
  53. 15 10
      components/drivers/usb/cherryusb/port/rp2040/usb_hc_rp2040.c

+ 4 - 1
components/drivers/usb/cherryusb/Kconfig.rttpkg

@@ -465,12 +465,14 @@ if PKG_USING_CHERRYUSB
 
     choice
         prompt "Version"
-        default PKG_USING_CHERRYUSB_V010500
+        default PKG_USING_CHERRYUSB_V010502
         help
             Select the package version
 
         config PKG_USING_CHERRYUSB_LATEST_VERSION
             bool "latest"
+        config PKG_USING_CHERRYUSB_V010502
+            bool "v1.5.2"
         config PKG_USING_CHERRYUSB_V010501
             bool "v1.5.1"
         config PKG_USING_CHERRYUSB_V010500
@@ -488,6 +490,7 @@ if PKG_USING_CHERRYUSB
     config PKG_CHERRYUSB_VER
        string
        default "latest"    if PKG_USING_CHERRYUSB_LATEST_VERSION
+       default "v1.5.2"   if PKG_USING_CHERRYUSB_V010502
        default "v1.5.1"   if PKG_USING_CHERRYUSB_V010501
        default "v1.5.0"   if PKG_USING_CHERRYUSB_V010500
        default "v1.4.3"   if PKG_USING_CHERRYUSB_V010403

+ 23 - 21
components/drivers/usb/cherryusb/README_zh.md

@@ -40,6 +40,8 @@ CherryUSB 是一个小而美的、可移植性高的、用于嵌入式系统(
 - 长度无限制,方便对接硬件 DMA 并且发挥 DMA 的优势
 - 分包过程在中断中执行
 
+性能展示:https://cherryusb.cherry-embedded.org/show/
+
 ## 目录结构
 
 |   目录名       |  描述                          |
@@ -103,7 +105,7 @@ CherryUSB Host 协议栈当前实现以下功能:
 - 支持阻塞式传输和异步传输
 - 支持复合设备
 - 支持多级 HUB,最高可拓展到 7 级(目前测试 1拖 10 没有问题,仅支持 dwc2/ehci/xhci/rp2040)
-- 支持 Communication Device Class (CDC_ACM, CDC_ECM)
+- 支持 Communication Device Class (CDC_ACM, CDC_ECM, CDC_NCM)
 - 支持 Human Interface Device (HID)
 - 支持 Mass Storage Class (MSC)
 - Support USB Video CLASS (UVC1.0、UVC1.5)
@@ -141,7 +143,7 @@ CherryUSB Host 协议栈资源占用说明(GCC 10.2 with -O2,关闭 log)
 #define CONFIG_USBHOST_MAX_EXTHUBS          1
 #define CONFIG_USBHOST_MAX_EHPORTS          4
 #define CONFIG_USBHOST_MAX_INTERFACES       8
-#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8
+#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 2
 #define CONFIG_USBHOST_MAX_ENDPOINTS        4
 ```
 
@@ -187,24 +189,25 @@ TODO
 
 ## 示例仓库
 
-|   Manufacturer       |  CHIP or Series    | USB IP| Repo Url | Support version     | Support status |
+|   Manufacturer       |  CHIP or Series    | USB IP| Repo Url | Support version     | Note |
 |:--------------------:|:------------------:|:-----:|:--------:|:------------------:|:-------------:|
-|Bouffalolab    |  BL702/BL616/BL808 | bouffalolab/ehci|[bouffalo_sdk](https://github.com/CherryUSB/bouffalo_sdk)|<= latest | Long-term |
-|ST             |  STM32F1x/STM32F4/STM32H7 | fsdev/dwc2 |[stm32_repo](https://github.com/CherryUSB/cherryusb_stm32)|<= latest | Long-term |
-|HPMicro        |  HPM6000/HPM5000 | hpm/ehci |[hpm_sdk](https://github.com/CherryUSB/hpm_sdk)|<= latest | Long-term |
-|Essemi         |  ES32F36xx | musb |[es32f369_repo](https://github.com/CherryUSB/cherryusb_es32)|<= latest | Long-term |
-|Phytium        |  e2000 | pusb2/xhci |[phytium_repo](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk)|>=1.4.0  | Long-term |
-|Artinchip      |  d12x/d13x/d21x | aic/ehci/ohci |[luban-lite](https://gitee.com/artinchip/luban-lite)|<= latest  | Long-term |
-|Espressif      |  esp32s2/esp32s3/esp32p4 | dwc2 |[esp32_repo](https://github.com/CherryUSB/cherryusb_esp32)|<= latest | Long-term |
-|NXP            |  mcx | kinetis/chipidea/ehci |[nxp_mcx_repo](https://github.com/CherryUSB/cherryusb_mcx)|<= latest | Long-term |
-|Kendryte       |  k230 | dwc2 |[k230_repo](https://github.com/CherryUSB/k230_sdk)|v1.2.0 | Long-term |
-|Actionstech    |  ATS30xx | dwc2 |[action_zephyr_repo](https://github.com/CherryUSB/lv_port_actions_technology/tree/master/action_technology_sdk)|>=1.4.0 | Long-term |
-|Nationstech    |  n32h4x | dwc2 |[nation_repo](https://github.com/CherryUSB/cherryusb_nation)|>=1.5.0 | Long-term |
-|Raspberry pi   |  rp2040/rp2350 | rp2040 |[pico-examples](https://github.com/CherryUSB/pico-examples)|<= latest | Long-term |
-|AllwinnerTech  |  F1C100S/F1C200S | musb |[cherryusb_rtt_f1c100s](https://github.com/CherryUSB/cherryusb_rtt_f1c100s)|<= latest | the same with musb |
-|Bekencorp      |  bk7256/bk7258 | musb |[bk_idk](https://github.com/CherryUSB/bk_idk)| v0.7.0 | the same with musb |
-|Sophgo         |  cv18xx | dwc2 |[cvi_alios_open](https://github.com/CherryUSB/cvi_alios_open)| v0.7.0 | TBD |
-|WCH            |  CH32V307/ch58x | ch32_usbfs/ch32_usbhs/ch58x |[wch_repo](https://github.com/CherryUSB/cherryusb_wch)|<= v0.10.2/>=v1.5.0 | TBD |
+|Bouffalolab    |  BL702/BL616/BL808 | bouffalolab/ehci|[bouffalo_sdk](https://github.com/CherryUSB/bouffalo_sdk)|<= latest | Official |
+|ST             |  STM32F1x/STM32F4/STM32H7 | fsdev/dwc2 |[stm32_repo](https://github.com/CherryUSB/cherryusb_stm32)|<= latest | Community |
+|HPMicro        |  HPM6000/HPM5000 | hpm/ehci |[hpm_sdk](https://github.com/CherryUSB/hpm_sdk)|<= latest | Official |
+|Essemi         |  ES32F36xx | musb |[es32f369_repo](https://github.com/CherryUSB/cherryusb_es32)|<= latest | Official |
+|Phytium        |  e2000 | pusb2/xhci |[phytium_repo](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk)|>=1.4.0  | Official |
+|Artinchip      |  d12x/d13x/d21x | aic/ehci/ohci |[luban-lite](https://gitee.com/artinchip/luban-lite)|<= latest  | Official |
+|Espressif      |  esp32s2/esp32s3/esp32p4 | dwc2 |[esp32_repo](https://github.com/CherryUSB/cherryusb_esp32)|<= latest | Official ongoing |
+|Kendryte       |  k230 | dwc2 |[k230_repo](https://github.com/CherryUSB/k230_sdk)|v1.2.0 | Official |
+|Actionstech    |  ATS30xx | dwc2 |[action_zephyr_repo](https://github.com/CherryUSB/lv_port_actions_technology/tree/master/action_technology_sdk)|>=1.4.0 | Official |
+|SiFli          |  SF32LB5x | musb |[SiFli_sdk](https://github.com/OpenSiFli/SiFli-SDK)|>=1.5.0 | Official |
+|NXP            |  mcx | kinetis/chipidea/ehci |[nxp_mcx_repo](https://github.com/CherryUSB/cherryusb_mcx)|<= latest | Community |
+|Nationstech    |  n32h4x | dwc2 |[nation_repo](https://github.com/CherryUSB/cherryusb_nation)|>=1.5.0 | Official ongoing |
+|Raspberry pi   |  rp2040/rp2350 | rp2040 |[pico-sdk](https://github.com/CherryUSB/pico-sdk)|<= latest | Official ongoing |
+|AllwinnerTech  |  F1C100S/F1C200S | musb |[cherryusb_rtt_f1c100s](https://github.com/CherryUSB/cherryusb_rtt_f1c100s)|<= latest | no more update |
+|Bekencorp      |  bk7256/bk7258 | musb |[bk_idk](https://github.com/CherryUSB/bk_idk)| v0.7.0 | Official |
+|Sophgo         |  cv18xx | dwc2 |[cvi_alios_open](https://github.com/CherryUSB/cvi_alios_open)| v0.7.0 | Official |
+|WCH            |  CH32V307/ch58x | ch32_usbfs/ch32_usbhs/ch58x |[wch_repo](https://github.com/CherryUSB/cherryusb_wch)|<= v0.10.2/>=v1.5.0 | no more update |
 
 ## 软件包支持
 
@@ -228,5 +231,4 @@ CherryUSB 微信群:与我联系后邀请加入
 
 感谢以下企业支持(顺序不分先后):
 
-<img src="docs/assets/bouffalolab.jpg"  width="100" height="80"/> <img src="docs/assets/hpmicro.jpg"  width="100" height="80" /> <img src="docs/assets/eastsoft.jpg"  width="100" height="80" /> <img src="docs/assets/rtthread.jpg"  width="100" height="80" /> <img src="docs/assets/sophgo.jpg"  width="100" height="80" /> <img src="docs/assets/phytium.jpg"  width="100" height="80" /> <img src="docs/assets/thead.jpg"  width="100" height="80" /> <img src="docs/assets/nuvoton.jpg"  width="100" height="80" /> <img src="docs/assets/artinchip.jpg"  width="100" height="80" /> <img src="docs/assets/bekencorp.jpg"  width="100" height="80" /> <img src="docs/assets/nxp.png"  width="100" height="80" /> <img src="docs/assets/espressif.png"  width="100" height="80" /> <img src="docs/assets/canaan.jpg"  width="100" height="80" />
-<img src="docs/assets/actions.jpg"  width="100" height="80" /> <img src="docs/assets/nationstech.jpg"  width="100" height="80" />
+<img src="docs/assets/bouffalolab.jpg"  width="100" height="80"/> <img src="docs/assets/hpmicro.jpg"  width="100" height="80" /> <img src="docs/assets/eastsoft.jpg"  width="100" height="80" /> <img src="docs/assets/rtthread.jpg"  width="100" height="80" /> <img src="docs/assets/sophgo.jpg"  width="100" height="80" /> <img src="docs/assets/phytium.jpg"  width="100" height="80" /> <img src="docs/assets/thead.jpg"  width="100" height="80" /> <img src="docs/assets/nuvoton.jpg"  width="100" height="80" /> <img src="docs/assets/artinchip.jpg"  width="100" height="80" /> <img src="docs/assets/bekencorp.jpg"  width="100" height="80" /> <img src="docs/assets/nxp.png"  width="100" height="80" /> <img src="docs/assets/espressif.png"  width="100" height="80" /> <img src="docs/assets/canaan.jpg"  width="100" height="80" /> <img src="docs/assets/actions.jpg"  width="100" height="80" /> <img src="docs/assets/sifli.jpg"  width="100" height="80" /> <img src="docs/assets/nationstech.jpg"  width="100" height="80" />

+ 2 - 0
components/drivers/usb/cherryusb/SConscript

@@ -90,6 +90,7 @@ if GetDepend(['RT_CHERRYUSB_DEVICE']):
     if GetDepend(['RT_CHERRYUSB_DEVICE_BL']):
         src += Glob('port/bouffalolab/usb_dc_bl.c')
     if GetDepend(['RT_CHERRYUSB_DEVICE_HPM']):
+        path += [cwd + '/port/hpmicro']
         src += Glob('port/hpmicro/usb_dc_hpm.c')
         src += Glob('port/hpmicro/usb_glue_hpm.c')
     if GetDepend(['RT_CHERRYUSB_DEVICE_AIC']):
@@ -184,6 +185,7 @@ if GetDepend(['RT_CHERRYUSB_HOST']):
         src += Glob('port/ehci/usb_hc_ehci.c')
         src += Glob('port/ehci/usb_glue_bouffalo.c')
     if GetDepend(['RT_CHERRYUSB_HOST_EHCI_HPM']):
+        path += [cwd + '/port/hpmicro']
         src += Glob('port/ehci/usb_hc_ehci.c')
         src += Glob('port/hpmicro/usb_hc_hpm.c')
         src += Glob('port/hpmicro/usb_glue_hpm.c')

+ 1 - 1
components/drivers/usb/cherryusb/VERSION

@@ -1,5 +1,5 @@
 VERSION_MAJOR = 1
 VERSION_MINOR = 5
-PATCHLEVEL = 1
+PATCHLEVEL = 2
 VERSION_TWEAK = 0
 EXTRAVERSION = 0

+ 16 - 19
components/drivers/usb/cherryusb/cherryusb_config_template.h

@@ -154,7 +154,7 @@
 #define CONFIG_USBHOST_MAX_EXTHUBS          1
 #define CONFIG_USBHOST_MAX_EHPORTS          4
 #define CONFIG_USBHOST_MAX_INTERFACES       8
-#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8
+#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 2
 #define CONFIG_USBHOST_MAX_ENDPOINTS        4
 
 #define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4
@@ -250,22 +250,11 @@
 /* ================ USB Device Port Configuration ================*/
 
 #ifndef CONFIG_USBDEV_MAX_BUS
-#define CONFIG_USBDEV_MAX_BUS 1 // for now, bus num must be 1 except hpm ip
-#endif
-
-#ifndef CONFIG_USBDEV_EP_NUM
-#define CONFIG_USBDEV_EP_NUM 8
+#define CONFIG_USBDEV_MAX_BUS 1
 #endif
 
 // #define CONFIG_USBDEV_SOF_ENABLE
 
-/* When your chip hardware supports high-speed and wants to initialize it in high-speed mode,
- * the relevant IP will configure the internal or external high-speed PHY according to CONFIG_USB_HS.
- *
- * in xxx32 chips, only pb14/pb15 can support hs mode, pa11/pa12 is not supported(only a few supports, but we ignore them).
-*/
-// #define CONFIG_USB_HS
-
 /* ---------------- FSDEV Configuration ---------------- */
 //#define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 // maybe 1 or 2, many chips may have a difference
 
@@ -276,6 +265,7 @@
 // #define CONFIG_USB_DWC2_DMA_ENABLE
 
 /* ---------------- MUSB Configuration ---------------- */
+#define CONFIG_USB_MUSB_EP_NUM 8
 // #define CONFIG_USB_MUSB_SUNXI
 
 /* ================ USB Host Port Configuration ==================*/
@@ -283,15 +273,11 @@
 #define CONFIG_USBHOST_MAX_BUS 1
 #endif
 
-#ifndef CONFIG_USBHOST_PIPE_NUM
-#define CONFIG_USBHOST_PIPE_NUM 10
-#endif
-
 /* ---------------- EHCI Configuration ---------------- */
 
 #define CONFIG_USB_EHCI_HCCR_OFFSET     (0x0)
 #define CONFIG_USB_EHCI_FRAME_LIST_SIZE 1024
-#define CONFIG_USB_EHCI_QH_NUM          CONFIG_USBHOST_PIPE_NUM
+#define CONFIG_USB_EHCI_QH_NUM          10
 #define CONFIG_USB_EHCI_QTD_NUM         (CONFIG_USB_EHCI_QH_NUM * 3)
 #define CONFIG_USB_EHCI_ITD_NUM         4
 // #define CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE
@@ -302,16 +288,27 @@
 
 /* ---------------- OHCI Configuration ---------------- */
 #define CONFIG_USB_OHCI_HCOR_OFFSET (0x0)
-#define CONFIG_USB_OHCI_ED_NUM CONFIG_USBHOST_PIPE_NUM
+#define CONFIG_USB_OHCI_ED_NUM 10
 #define CONFIG_USB_OHCI_TD_NUM 3
 // #define CONFIG_USB_OHCI_DESC_DCACHE_ENABLE
 
 /* ---------------- XHCI Configuration ---------------- */
 #define CONFIG_USB_XHCI_HCCR_OFFSET (0x0)
 
+/* ---------------- DWC2 Configuration ---------------- */
+// nothing to define
+
 /* ---------------- MUSB Configuration ---------------- */
+#define CONFIG_USB_MUSB_PIPE_NUM 8
 // #define CONFIG_USB_MUSB_SUNXI
 
+/* When your chip hardware supports high-speed and wants to initialize it in high-speed mode,
+ * the relevant IP will configure the internal or external high-speed PHY according to CONFIG_USB_HS.
+ *
+ * in xxx32 chips, only pb14/pb15 can support hs mode, pa11/pa12 is not supported(only a few supports, but we ignore them).
+*/
+// #define CONFIG_USB_HS
+
 #ifndef usb_phyaddr2ramaddr
 #define usb_phyaddr2ramaddr(addr) (addr)
 #endif

+ 1 - 1
components/drivers/usb/cherryusb/class/cdc/usbh_cdc_ecm.c

@@ -121,7 +121,7 @@ get_mac:
     }
 
     memset(mac_buffer, 0, 12);
-    ret = usbh_get_string_desc(cdc_ecm_class->hport, mac_str_idx, (uint8_t *)mac_buffer);
+    ret = usbh_get_string_desc(cdc_ecm_class->hport, mac_str_idx, (uint8_t *)mac_buffer, 12);
     if (ret < 0) {
         return ret;
     }

+ 1 - 1
components/drivers/usb/cherryusb/class/cdc/usbh_cdc_ncm.c

@@ -148,7 +148,7 @@ get_mac:
     }
 
     memset(mac_buffer, 0, 12);
-    ret = usbh_get_string_desc(cdc_ncm_class->hport, mac_str_idx, (uint8_t *)mac_buffer);
+    ret = usbh_get_string_desc(cdc_ncm_class->hport, mac_str_idx, (uint8_t *)mac_buffer, 12);
     if (ret < 0) {
         return ret;
     }

+ 26 - 22
components/drivers/usb/cherryusb/class/hub/usbh_hub.c

@@ -179,15 +179,15 @@ static int parse_hub_descriptor(struct usb_hub_descriptor *desc, uint16_t length
         USB_LOG_ERR("unexpected descriptor 0x%02x\r\n", desc->bDescriptorType);
         return -2;
     } else {
-        USB_LOG_RAW("Hub Descriptor:\r\n");
-        USB_LOG_RAW("bLength: 0x%02x             \r\n", desc->bLength);
-        USB_LOG_RAW("bDescriptorType: 0x%02x     \r\n", desc->bDescriptorType);
-        USB_LOG_RAW("bNbrPorts: 0x%02x           \r\n", desc->bNbrPorts);
-        USB_LOG_RAW("wHubCharacteristics: 0x%04x \r\n", desc->wHubCharacteristics);
-        USB_LOG_RAW("bPwrOn2PwrGood: 0x%02x      \r\n", desc->bPwrOn2PwrGood);
-        USB_LOG_RAW("bHubContrCurrent: 0x%02x    \r\n", desc->bHubContrCurrent);
-        USB_LOG_RAW("DeviceRemovable: 0x%02x     \r\n", desc->DeviceRemovable);
-        USB_LOG_RAW("PortPwrCtrlMask: 0x%02x     \r\n", desc->PortPwrCtrlMask);
+        USB_LOG_DBG("Hub Descriptor:\r\n");
+        USB_LOG_DBG("bLength: 0x%02x             \r\n", desc->bLength);
+        USB_LOG_DBG("bDescriptorType: 0x%02x     \r\n", desc->bDescriptorType);
+        USB_LOG_DBG("bNbrPorts: 0x%02x           \r\n", desc->bNbrPorts);
+        USB_LOG_DBG("wHubCharacteristics: 0x%04x \r\n", desc->wHubCharacteristics);
+        USB_LOG_DBG("bPwrOn2PwrGood: 0x%02x      \r\n", desc->bPwrOn2PwrGood);
+        USB_LOG_DBG("bHubContrCurrent: 0x%02x    \r\n", desc->bHubContrCurrent);
+        USB_LOG_DBG("DeviceRemovable: 0x%02x     \r\n", desc->DeviceRemovable);
+        USB_LOG_DBG("PortPwrCtrlMask: 0x%02x     \r\n", desc->PortPwrCtrlMask);
     }
     return 0;
 }
@@ -203,14 +203,14 @@ static int parse_hub_ss_descriptor(struct usb_hub_ss_descriptor *desc, uint16_t
         USB_LOG_ERR("unexpected descriptor 0x%02x\r\n", desc->bDescriptorType);
         return -2;
     } else {
-        USB_LOG_RAW("SuperSpeed Hub Descriptor:\r\n");
-        USB_LOG_RAW("bLength: 0x%02x             \r\n", desc->bLength);
-        USB_LOG_RAW("bDescriptorType: 0x%02x     \r\n", desc->bDescriptorType);
-        USB_LOG_RAW("bNbrPorts: 0x%02x           \r\n", desc->bNbrPorts);
-        USB_LOG_RAW("wHubCharacteristics: 0x%04x \r\n", desc->wHubCharacteristics);
-        USB_LOG_RAW("bPwrOn2PwrGood: 0x%02x      \r\n", desc->bPwrOn2PwrGood);
-        USB_LOG_RAW("bHubContrCurrent: 0x%02x    \r\n", desc->bHubContrCurrent);
-        USB_LOG_RAW("DeviceRemovable: 0x%02x     \r\n", desc->DeviceRemovable);
+        USB_LOG_DBG("SuperSpeed Hub Descriptor:\r\n");
+        USB_LOG_DBG("bLength: 0x%02x             \r\n", desc->bLength);
+        USB_LOG_DBG("bDescriptorType: 0x%02x     \r\n", desc->bDescriptorType);
+        USB_LOG_DBG("bNbrPorts: 0x%02x           \r\n", desc->bNbrPorts);
+        USB_LOG_DBG("wHubCharacteristics: 0x%04x \r\n", desc->wHubCharacteristics);
+        USB_LOG_DBG("bPwrOn2PwrGood: 0x%02x      \r\n", desc->bPwrOn2PwrGood);
+        USB_LOG_DBG("bHubContrCurrent: 0x%02x    \r\n", desc->bHubContrCurrent);
+        USB_LOG_DBG("DeviceRemovable: 0x%02x     \r\n", desc->DeviceRemovable);
     }
     return 0;
 }
@@ -403,7 +403,7 @@ static int usbh_hub_connect(struct usbh_hubport *hport, uint8_t intf)
 
     for (uint8_t port = 0; port < hub->nports; port++) {
         ret = usbh_hub_get_portstatus(hub, port + 1, &port_status);
-        USB_LOG_INFO("port %u, status:0x%02x, change:0x%02x\r\n", port + 1, port_status.wPortStatus, port_status.wPortChange);
+        USB_LOG_DBG("port %u, status:0x%03x, change:0x%02x\r\n", port + 1, port_status.wPortStatus, port_status.wPortChange);
         if (ret < 0) {
             return ret;
         }
@@ -497,7 +497,7 @@ static void usbh_hub_events(struct usbh_hub *hub)
         portstatus = port_status.wPortStatus;
         portchange = port_status.wPortChange;
 
-        USB_LOG_DBG("port %u, status:0x%02x, change:0x%02x\r\n", port + 1, portstatus, portchange);
+        USB_LOG_DBG("port %u, status:0x%03x, change:0x%02x\r\n", port + 1, portstatus, portchange);
 
         /* First, clear all change bits */
         mask = 1;
@@ -532,7 +532,7 @@ static void usbh_hub_events(struct usbh_hub *hub)
                 portstatus = port_status.wPortStatus;
                 portchange = port_status.wPortChange;
 
-                USB_LOG_DBG("Port %u, status:0x%02x, change:0x%02x\r\n", port + 1, portstatus, portchange);
+                USB_LOG_DBG("Port %u, status:0x%03x, change:0x%02x\r\n", port + 1, portstatus, portchange);
 
                 if (!(portchange & HUB_PORT_STATUS_C_CONNECTION) &&
                     ((portstatus & HUB_PORT_STATUS_CONNECTION) == connection)) {
@@ -562,7 +562,7 @@ static void usbh_hub_events(struct usbh_hub *hub)
             if (portstatus & HUB_PORT_STATUS_CONNECTION) {
                 ret = usbh_hub_set_feature(hub, port + 1, HUB_PORT_FEATURE_RESET);
                 if (ret < 0) {
-                    USB_LOG_ERR("Failed to reset port %u,errorcode:%d\r\n", port, ret);
+                    USB_LOG_ERR("Failed to reset port %u, errorcode: %d\r\n", port + 1, ret);
                     continue;
                 }
 
@@ -576,11 +576,15 @@ static void usbh_hub_events(struct usbh_hub *hub)
 
                 portstatus = port_status.wPortStatus;
                 portchange = port_status.wPortChange;
+
+                USB_LOG_DBG("Port %u, status:0x%03x, change:0x%02x\r\n", port + 1, portstatus, portchange);
+
                 if (!(portstatus & HUB_PORT_STATUS_RESET) && (portstatus & HUB_PORT_STATUS_ENABLE)) {
                     if (portchange & HUB_PORT_STATUS_C_RESET) {
                         ret = usbh_hub_clear_feature(hub, port + 1, HUB_PORT_FEATURE_C_RESET);
                         if (ret < 0) {
-                            USB_LOG_ERR("Failed to clear port %u reset change, errorcode: %d\r\n", port, ret);
+                            USB_LOG_ERR("Failed to clear port %u reset change, errorcode: %d\r\n", port + 1, ret);
+                            continue;
                         }
                     }
 

+ 7 - 73
components/drivers/usb/cherryusb/class/msc/usbd_msc.c

@@ -7,9 +7,10 @@
 #include "usbd_core.h"
 #include "usbd_msc.h"
 #include "usb_scsi.h"
-#if defined(CONFIG_USBDEV_MSC_THREAD)
-#include "usb_osal.h"
-#endif
+
+#undef USB_DBG_TAG
+#define USB_DBG_TAG "usbd_msc"
+#include "usb_log.h"
 
 #define MSD_OUT_EP_IDX 0
 #define MSD_IN_EP_IDX  1
@@ -516,19 +517,14 @@ static bool SCSI_read10(uint8_t busid, uint8_t **data, uint32_t *len)
     }
 
     g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */
-    USB_LOG_DBG("lba: 0x%04x\r\n", g_usbd_msc[busid].start_sector);
-
     g_usbd_msc[busid].nsectors = GET_BE16(&g_usbd_msc[busid].cbw.CB[7]); /* Number of Blocks to transfer */
-    USB_LOG_DBG("nsectors: 0x%02x\r\n", g_usbd_msc[busid].nsectors);
 
     if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) {
         SCSI_SetSenseData(busid, SCSI_KCQIR_LBAOUTOFRANGE);
-        USB_LOG_ERR("LBA out of range\r\n");
         return false;
     }
 
     if (g_usbd_msc[busid].cbw.dDataLength != (g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN])) {
-        USB_LOG_ERR("scsi_blk_len does not match with dDataLength\r\n");
         return false;
     }
     g_usbd_msc[busid].stage = MSC_DATA_IN;
@@ -554,19 +550,14 @@ static bool SCSI_read12(uint8_t busid, uint8_t **data, uint32_t *len)
     }
 
     g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */
-    USB_LOG_DBG("lba: 0x%04x\r\n", g_usbd_msc[busid].start_sector);
-
     g_usbd_msc[busid].nsectors = GET_BE32(&g_usbd_msc[busid].cbw.CB[6]); /* Number of Blocks to transfer */
-    USB_LOG_DBG("nsectors: 0x%02x\r\n", g_usbd_msc[busid].nsectors);
 
     if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) {
         SCSI_SetSenseData(busid, SCSI_KCQIR_LBAOUTOFRANGE);
-        USB_LOG_ERR("LBA out of range\r\n");
         return false;
     }
 
     if (g_usbd_msc[busid].cbw.dDataLength != (g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN])) {
-        USB_LOG_ERR("scsi_blk_len does not match with dDataLength\r\n");
         return false;
     }
     g_usbd_msc[busid].stage = MSC_DATA_IN;
@@ -594,14 +585,10 @@ static bool SCSI_write10(uint8_t busid, uint8_t **data, uint32_t *len)
     }
 
     g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */
-    USB_LOG_DBG("lba: 0x%04x\r\n", g_usbd_msc[busid].start_sector);
-
     g_usbd_msc[busid].nsectors = GET_BE16(&g_usbd_msc[busid].cbw.CB[7]); /* Number of Blocks to transfer */
-    USB_LOG_DBG("nsectors: 0x%02x\r\n", g_usbd_msc[busid].nsectors);
 
     data_len = g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN];
     if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) {
-        USB_LOG_ERR("LBA out of range\r\n");
         return false;
     }
 
@@ -627,14 +614,10 @@ static bool SCSI_write12(uint8_t busid, uint8_t **data, uint32_t *len)
     }
 
     g_usbd_msc[busid].start_sector = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]); /* Logical Block Address of First Block */
-    USB_LOG_DBG("lba: 0x%04x\r\n", g_usbd_msc[busid].start_sector);
-
     g_usbd_msc[busid].nsectors = GET_BE32(&g_usbd_msc[busid].cbw.CB[6]); /* Number of Blocks to transfer */
-    USB_LOG_DBG("nsectors: 0x%02x\r\n", g_usbd_msc[busid].nsectors);
 
     data_len = g_usbd_msc[busid].nsectors * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN];
     if ((g_usbd_msc[busid].start_sector + g_usbd_msc[busid].nsectors) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) {
-        USB_LOG_ERR("LBA out of range\r\n");
         return false;
     }
 
@@ -646,52 +629,6 @@ static bool SCSI_write12(uint8_t busid, uint8_t **data, uint32_t *len)
     usbd_ep_start_read(busid, mass_ep_data[busid][MSD_OUT_EP_IDX].ep_addr, g_usbd_msc[busid].block_buffer, data_len);
     return true;
 }
-/* do not use verify to reduce code size */
-#if 0
-static bool SCSI_verify10(uint8_t busid, uint8_t **data, uint32_t *len)
-{
-    /* Logical Block Address of First Block */
-    uint32_t lba = 0;
-    uint32_t blk_num = 0;
-
-    if ((g_usbd_msc[busid].cbw.CB[1] & 0x02U) == 0x00U) {
-        return true;
-    }
-
-    if (((g_usbd_msc[busid].cbw.bmFlags & 0x80U) != 0x00U) || (g_usbd_msc[busid].cbw.dDataLength == 0U)) {
-        SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND);
-        return false;
-    }
-
-    if ((g_usbd_msc[busid].cbw.CB[1] & 0x02U) == 0x02U) {
-        SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDFIELDINCBA);
-        return false; /* Error, Verify Mode Not supported*/
-    }
-
-    lba = GET_BE32(&g_usbd_msc[busid].cbw.CB[2]);
-    USB_LOG_DBG("lba: 0x%x\r\n", lba);
-
-    g_usbd_msc[busid].scsi_blk_addr = lba * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN];
-
-    /* Number of Blocks to transfer */
-    blk_num = GET_BE16(&g_usbd_msc[busid].cbw.CB[7]);
-
-    USB_LOG_DBG("num (block) : 0x%x\r\n", blk_num);
-    g_usbd_msc[busid].scsi_blk_len = blk_num * g_usbd_msc[busid].scsi_blk_size[g_usbd_msc[busid].cbw.bLUN];
-
-    if ((lba + blk_num) > g_usbd_msc[busid].scsi_blk_nbr[g_usbd_msc[busid].cbw.bLUN]) {
-        USB_LOG_ERR("LBA out of range\r\n");
-        return false;
-    }
-
-    if (g_usbd_msc[busid].cbw.dDataLength != g_usbd_msc[busid].scsi_blk_len) {
-        return false;
-    }
-
-    g_usbd_msc[busid].stage = MSC_DATA_OUT;
-    return true;
-}
-#endif
 
 static bool SCSI_processRead(uint8_t busid)
 {
@@ -722,6 +659,7 @@ static bool SCSI_processRead(uint8_t busid)
 static bool SCSI_processWrite(uint8_t busid, uint32_t nbytes)
 {
     uint32_t data_len = 0;
+
     USB_LOG_DBG("write lba:%d\r\n", g_usbd_msc[busid].start_sector);
 
     if (usbd_msc_sector_write(busid, g_usbd_msc[busid].cbw.bLUN, g_usbd_msc[busid].start_sector, g_usbd_msc[busid].block_buffer, nbytes) != 0) {
@@ -804,7 +742,6 @@ static bool SCSI_CBWDecode(uint8_t busid, uint32_t nbytes)
                 ret = SCSI_write12(busid, NULL, 0);
                 break;
             case SCSI_CMD_VERIFY10:
-                //ret = SCSI_verify10(NULL, 0);
                 ret = false;
                 break;
             case SCSI_CMD_SYNCHCACHE10:
@@ -812,7 +749,6 @@ static bool SCSI_CBWDecode(uint8_t busid, uint32_t nbytes)
                 break;
             default:
                 SCSI_SetSenseData(busid, SCSI_KCQIR_INVALIDCOMMAND);
-                USB_LOG_WRN("unsupported cmd:0x%02x\r\n", g_usbd_msc[busid].cbw.CB[0]);
                 ret = false;
                 break;
         }
@@ -820,7 +756,7 @@ static bool SCSI_CBWDecode(uint8_t busid, uint32_t nbytes)
     if (ret) {
         if (g_usbd_msc[busid].stage == MSC_READ_CBW) {
             if (len2send) {
-                USB_LOG_DBG("Send info len:%d\r\n", len2send);
+                USB_LOG_DBG("Send info len: %d\r\n", len2send);
                 usbd_msc_send_info(busid, buf2send, len2send);
             } else {
                 usbd_msc_send_csw(busid, CSW_STATUS_CMD_PASSED);
@@ -837,7 +773,7 @@ void mass_storage_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes)
     switch (g_usbd_msc[busid].stage) {
         case MSC_READ_CBW:
             if (SCSI_CBWDecode(busid, nbytes) == false) {
-                USB_LOG_ERR("Command:0x%02x decode err\r\n", g_usbd_msc[busid].cbw.CB[0]);
+                USB_LOG_ERR("Command: 0x%02x decode err\r\n", g_usbd_msc[busid].cbw.CB[0]);
                 usbd_msc_bot_abort(busid);
                 return;
             }
@@ -921,7 +857,6 @@ static void usbdev_msc_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV)
         if (ret < 0) {
             continue;
         }
-        USB_LOG_DBG("event:%d\r\n", event);
         if (event == MSC_DATA_OUT) {
             if (SCSI_processWrite(busid, g_usbd_msc[busid].nbytes) == false) {
                 usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/
@@ -943,7 +878,6 @@ void usbd_msc_polling(uint8_t busid)
 
     if (event != 0) {
         g_usbd_msc[busid].event = 0;
-        USB_LOG_DBG("event:%d\r\n", event);
         if (event == MSC_DATA_OUT) {
             if (SCSI_processWrite(busid, g_usbd_msc[busid].nbytes) == false) {
                 usbd_msc_send_csw(busid, CSW_STATUS_CMD_FAILED); /* send fail status to host,and the host will retry*/

+ 1 - 0
components/drivers/usb/cherryusb/class/msc/usbh_msc.c

@@ -284,6 +284,7 @@ static int usbh_msc_connect(struct usbh_hubport *hport, uint8_t intf)
         if (ret == -USB_ERR_STALL) {
             USB_LOG_WRN("Device does not support multiple LUNs\r\n");
             g_msc_buf[msc_class->sdchar - 'a'][0] = 0;
+            ret = 0;
         } else {
             return ret;
         }

+ 1 - 1
components/drivers/usb/cherryusb/class/mtp/usb_mtp.h

@@ -644,7 +644,7 @@ struct mtp_object {
     bool in_use;
 };
 
-/*Length of template descriptor: 23 bytes*/
+/*Length of template descriptor: 30 bytes*/
 #define MTP_DESCRIPTOR_LEN (9 + 7 + 7 + 7)
 
 // clang-format off

+ 2 - 2
components/drivers/usb/cherryusb/class/vendor/net/usbh_rtl8152.c

@@ -1121,7 +1121,7 @@ static inline int usb_ocp_write(struct usbh_rtl8152 *tp, uint16_t index, uint16_
 
 static uint32_t ocp_read_dword(struct usbh_rtl8152 *tp, uint16_t type, uint16_t index)
 {
-    uint32_t data;
+    uint32_t data = 0;
 
     generic_ocp_read(tp, index, sizeof(data), &data, type);
 
@@ -2050,7 +2050,7 @@ static int usbh_rtl8152_connect(struct usbh_hubport *hport, uint8_t intf)
     }
 
     memset(mac_buffer, 0, 12);
-    ret = usbh_get_string_desc(rtl8152_class->hport, 3, (uint8_t *)mac_buffer);
+    ret = usbh_get_string_desc(rtl8152_class->hport, 3, (uint8_t *)mac_buffer, 12);
     if (ret < 0) {
         return ret;
     }

+ 7 - 12
components/drivers/usb/cherryusb/class/wireless/usbh_rndis.c

@@ -68,7 +68,7 @@ static int usbh_rndis_init_msg_transfer(struct usbh_rndis *rndis_class)
 
     ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)cmd);
     if (ret < 0) {
-        USB_LOG_ERR("rndis_initialize_msg_t send error, ret: %d\r\n", ret);
+        USB_LOG_ERR("init send error, ret: %d\r\n", ret);
         return ret;
     }
 
@@ -84,14 +84,14 @@ static int usbh_rndis_init_msg_transfer(struct usbh_rndis *rndis_class)
 
     ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)resp);
     if (ret < 0) {
-        USB_LOG_ERR("rndis_initialize_cmplt_t recv error, ret: %d\r\n", ret);
+        USB_LOG_ERR("init recv error, ret: %d\r\n", ret);
         return ret;
     }
 
     rndis_class->max_transfer_pkts = resp->MaxPacketsPerTransfer;
     rndis_class->max_transfer_size = resp->MaxTransferSize;
-    USB_LOG_INFO("MaxPacketsPerTransfer:%u\r\n", (unsigned int)resp->MaxPacketsPerTransfer);
-    USB_LOG_INFO("MaxTransferSize:%u\r\n", (unsigned int)resp->MaxTransferSize);
+    USB_LOG_INFO("MaxPacketsPerTransfer: %u\r\n", (unsigned int)resp->MaxPacketsPerTransfer);
+    USB_LOG_INFO("MaxTransferSize: %u\r\n", (unsigned int)resp->MaxTransferSize);
 
     return ret;
 }
@@ -312,14 +312,13 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf)
     if (ret < 0) {
         return ret;
     }
-    USB_LOG_INFO("rndis init success\r\n");
 
     ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_SUPPORTED_LIST, 0, tmp_buffer, &data_len);
     if (ret < 0) {
         return ret;
     }
     oid_num = (data_len / 4);
-    USB_LOG_INFO("rndis query OID_GEN_SUPPORTED_LIST success,oid num :%u\r\n", (unsigned int)oid_num);
+    USB_LOG_INFO("rndis query OID_GEN_SUPPORTED_LIST success,oid num: %u\r\n", (unsigned int)oid_num);
 
     oid_support_list = (uint32_t *)tmp_buffer;
 
@@ -380,10 +379,8 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf)
                 }
                 break;
             default:
-                USB_LOG_WRN("Ignore rndis query iod:%08x\r\n", (unsigned int)oid);
-                continue;
+                break;
         }
-        USB_LOG_INFO("rndis query iod:%08x success\r\n", (unsigned int)oid);
     }
 
     uint32_t packet_filter = 0x0f;
@@ -391,14 +388,12 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf)
     if (ret < 0) {
         return ret;
     }
-    USB_LOG_INFO("rndis set OID_GEN_CURRENT_PACKET_FILTER success\r\n");
 
     uint8_t multicast_list[6] = { 0x01, 0x00, 0x5E, 0x00, 0x00, 0x01 };
     ret = usbh_rndis_set_msg_transfer(rndis_class, OID_802_3_MULTICAST_LIST, multicast_list, 6);
     if (ret < 0) {
         return ret;
     }
-    USB_LOG_INFO("rndis set OID_802_3_MULTICAST_LIST success\r\n");
 
     USB_LOG_INFO("rndis MAC address %02x:%02x:%02x:%02x:%02x:%02x\r\n",
                  rndis_class->mac[0],
@@ -487,7 +482,7 @@ find_class:
         usbh_bulk_urb_fill(&g_rndis_class.bulkin_urb, g_rndis_class.hport, g_rndis_class.bulkin, &g_rndis_rx_buffer[g_rndis_rx_length], transfer_size, USB_OSAL_WAITING_FOREVER, NULL, NULL);
         ret = usbh_submit_urb(&g_rndis_class.bulkin_urb);
         if (ret < 0) {
-            goto find_class;
+            break;
         }
 
         g_rndis_rx_length += g_rndis_class.bulkin_urb.actual_length;

+ 1 - 1
components/drivers/usb/cherryusb/common/usb_errno.h

@@ -15,7 +15,7 @@
 #define USB_ERR_RANGE    7
 #define USB_ERR_STALL    8
 #define USB_ERR_BABBLE   9
-#define USB_ERR_NAK      10
+#define USB_ERR_NAK      10 /* only for dwc2 buffer dma mode */
 #define USB_ERR_DT       11
 #define USB_ERR_IO       12
 #define USB_ERR_SHUTDOWN 13

+ 1 - 1
components/drivers/usb/cherryusb/common/usb_hc.h

@@ -39,7 +39,7 @@ struct usbh_urb {
     struct usbh_hubport *hport;
     struct usb_endpoint_descriptor *ep;
     uint8_t data_toggle;
-    uint8_t interval;
+    uint32_t interval;
     struct usb_setup_packet *setup;
     uint8_t *transfer_buffer;
     uint32_t transfer_buffer_length;

+ 6 - 0
components/drivers/usb/cherryusb/common/usb_util.h

@@ -45,6 +45,12 @@
 #define __ALIGNED(x) __attribute__((aligned(x)))
 #endif
 #elif defined(__ICCARM__) || defined(__ICCRX__) || defined(__ICCRISCV__)
+#if (__VER__ >= 8000000)
+  #define __ICCARM_V8 1
+#else
+  #define __ICCARM_V8 0
+#endif
+
 #ifndef __USED
 #if defined(__ICCARM_V8) || defined(__ICCRISCV__)
 #define __USED __attribute__((used))

+ 2 - 2
components/drivers/usb/cherryusb/common/usb_version.h

@@ -15,7 +15,7 @@
 #undef CHERRYUSB_VERSION_STR
 #endif
 
-#define CHERRYUSB_VERSION     0x010501
-#define CHERRYUSB_VERSION_STR "v1.5.1"
+#define CHERRYUSB_VERSION     0x010502
+#define CHERRYUSB_VERSION_STR "v1.5.2"
 
 #endif

+ 0 - 6
components/drivers/usb/cherryusb/core/usbd_core.c

@@ -950,7 +950,6 @@ static int usbd_vendor_request_handler(uint8_t busid, struct usb_setup_packet *s
                     *len = desclen;
                     return 0;
                 default:
-                    USB_LOG_ERR("unknown vendor code\r\n");
                     return -1;
             }
         }
@@ -964,7 +963,6 @@ static int usbd_vendor_request_handler(uint8_t busid, struct usb_setup_packet *s
                     *len = g_usbd_core[busid].descriptors->msosv2_descriptor->compat_id_len;
                     return 0;
                 default:
-                    USB_LOG_ERR("unknown vendor code\r\n");
                     return -1;
             }
         }
@@ -980,7 +978,6 @@ static int usbd_vendor_request_handler(uint8_t busid, struct usb_setup_packet *s
                     *len = desclen;
                     return 0;
                 default:
-                    USB_LOG_ERR("unknown vendor code\r\n");
                     return -1;
             }
         }
@@ -1008,7 +1005,6 @@ static int usbd_vendor_request_handler(uint8_t busid, struct usb_setup_packet *s
                     *len = desclen;
                     return 0;
                 default:
-                    USB_LOG_ERR("unknown vendor code\r\n");
                     return -1;
             }
         }
@@ -1021,7 +1017,6 @@ static int usbd_vendor_request_handler(uint8_t busid, struct usb_setup_packet *s
                     *len = g_usbd_core[busid].msosv2_desc->compat_id_len;
                     return 0;
                 default:
-                    USB_LOG_ERR("unknown vendor code\r\n");
                     return -1;
             }
         }
@@ -1037,7 +1032,6 @@ static int usbd_vendor_request_handler(uint8_t busid, struct usb_setup_packet *s
                     *len = desclen;
                     return 0;
                 default:
-                    USB_LOG_ERR("unknown vendor code\r\n");
                     return -1;
             }
         }

+ 67 - 33
components/drivers/usb/cherryusb/core/usbh_core.c

@@ -228,12 +228,21 @@ static int parse_config_descriptor(struct usbh_hubport *hport, struct usb_config
                     cur_ep_num = intf_desc->bNumEndpoints;
                     cur_ep = 0;
 
-                    USB_ASSERT_MSG(cur_iface < CONFIG_USBHOST_MAX_INTERFACES,
-                                   "Interface num %d overflow", cur_iface);
-                    USB_ASSERT_MSG(cur_alt_setting < CONFIG_USBHOST_MAX_INTF_ALTSETTINGS,
-                                   "Interface altsetting num %d overflow", cur_alt_setting);
-                    USB_ASSERT_MSG(cur_ep_num <= CONFIG_USBHOST_MAX_ENDPOINTS,
-                                   "Endpoint num %d overflow", cur_ep_num);
+                    if (cur_iface >= CONFIG_USBHOST_MAX_INTERFACES) {
+                        USB_LOG_ERR("Interface num %d overflow\r\n", cur_iface);
+                        return -USB_ERR_NOMEM;
+                    }
+
+                    if (cur_ep_num >= CONFIG_USBHOST_MAX_ENDPOINTS) {
+                        USB_LOG_ERR("Endpoint num %d overflow\r\n", cur_ep_num);
+                        return -USB_ERR_NOMEM;
+                    }
+
+                    if (cur_alt_setting >= CONFIG_USBHOST_MAX_INTF_ALTSETTINGS) {
+                        USB_LOG_ERR("Interface altsetting num %d overflow\r\n", cur_alt_setting);
+                        return -USB_ERR_NOMEM;
+                    }
+
 #if 0
                     USB_LOG_DBG("Interface Descriptor:\r\n");
                     USB_LOG_DBG("bLength: 0x%02x            \r\n", intf_desc->bLength);
@@ -389,7 +398,11 @@ int usbh_enumerate(struct usbh_hubport *hport)
         goto errout;
     }
 
-    parse_device_descriptor(hport, (struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid], 8);
+    ret = parse_device_descriptor(hport, (struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid], 8);
+    if (ret < 0) {
+        USB_LOG_ERR("Parse device descriptor fail\r\n");
+        goto errout;
+    }
 
     /* Extract the correct max packetsize from the device descriptor */
     dev_desc = (struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid];
@@ -427,7 +440,7 @@ int usbh_enumerate(struct usbh_hubport *hport)
     }
 
     /* Wait device set address completely */
-    usb_osal_msleep(2);
+    usb_osal_msleep(10);
 
     /*Reconfigure EP0 with the correct address */
     hport->dev_addr = dev_addr;
@@ -469,7 +482,11 @@ int usbh_enumerate(struct usbh_hubport *hport)
         goto errout;
     }
 
-    parse_config_descriptor(hport, (struct usb_configuration_descriptor *)ep0_request_buffer[hport->bus->busid], USB_SIZEOF_CONFIG_DESC);
+    ret = parse_config_descriptor(hport, (struct usb_configuration_descriptor *)ep0_request_buffer[hport->bus->busid], USB_SIZEOF_CONFIG_DESC);
+    if (ret < 0) {
+        USB_LOG_ERR("Parse config descriptor fail\r\n");
+        goto errout;
+    }
 
     /* Read the full size of the configuration data */
     uint16_t wTotalLength = ((struct usb_configuration_descriptor *)ep0_request_buffer[hport->bus->busid])->wTotalLength;
@@ -494,9 +511,10 @@ int usbh_enumerate(struct usbh_hubport *hport)
 
     ret = parse_config_descriptor(hport, (struct usb_configuration_descriptor *)ep0_request_buffer[hport->bus->busid], wTotalLength);
     if (ret < 0) {
-        USB_LOG_ERR("Parse config fail\r\n");
+        USB_LOG_ERR("Parse config descriptor fail\r\n");
         goto errout;
     }
+
     USB_LOG_INFO("The device has %d interfaces\r\n", ((struct usb_configuration_descriptor *)ep0_request_buffer[hport->bus->busid])->bNumInterfaces);
     hport->raw_config_desc = usb_osal_malloc(wTotalLength + 1);
     if (hport->raw_config_desc == NULL) {
@@ -512,35 +530,47 @@ int usbh_enumerate(struct usbh_hubport *hport)
 #ifdef CONFIG_USBHOST_GET_STRING_DESC
     uint8_t string_buffer[128];
 
-    /* Get Manufacturer string */
-    memset(string_buffer, 0, 128);
-    ret = usbh_get_string_desc(hport, USB_STRING_MFC_INDEX, string_buffer);
-    if (ret < 0) {
-        USB_LOG_ERR("Failed to get Manufacturer string,errorcode:%d\r\n", ret);
-        goto errout;
+    if (hport->device_desc.iManufacturer > 0) {
+        /* Get Manufacturer string */
+        memset(string_buffer, 0, 128);
+        ret = usbh_get_string_desc(hport, USB_STRING_MFC_INDEX, string_buffer, 128);
+        if (ret < 0) {
+            USB_LOG_ERR("Failed to get Manufacturer string,errorcode:%d\r\n", ret);
+            goto errout;
+        }
+
+        USB_LOG_INFO("Manufacturer: %s\r\n", string_buffer);
+    } else {
+        USB_LOG_WRN("Do not support Manufacturer string\r\n");
     }
 
-    USB_LOG_INFO("Manufacturer: %s\r\n", string_buffer);
+    if (hport->device_desc.iProduct > 0) {
+        /* Get Product string */
+        memset(string_buffer, 0, 128);
+        ret = usbh_get_string_desc(hport, USB_STRING_PRODUCT_INDEX, string_buffer, 128);
+        if (ret < 0) {
+            USB_LOG_ERR("Failed to get Product string,errorcode:%d\r\n", ret);
+            goto errout;
+        }
 
-    /* Get Product string */
-    memset(string_buffer, 0, 128);
-    ret = usbh_get_string_desc(hport, USB_STRING_PRODUCT_INDEX, string_buffer);
-    if (ret < 0) {
-        USB_LOG_ERR("Failed to get get Product string,errorcode:%d\r\n", ret);
-        goto errout;
+        USB_LOG_INFO("Product: %s\r\n", string_buffer);
+    } else {
+        USB_LOG_WRN("Do not support Product string\r\n");
     }
 
-    USB_LOG_INFO("Product: %s\r\n", string_buffer);
+    if (hport->device_desc.iSerialNumber > 0) {
+        /* Get SerialNumber string */
+        memset(string_buffer, 0, 128);
+        ret = usbh_get_string_desc(hport, USB_STRING_SERIAL_INDEX, string_buffer, 128);
+        if (ret < 0) {
+            USB_LOG_ERR("Failed to get SerialNumber string,errorcode:%d\r\n", ret);
+            goto errout;
+        }
 
-    /* Get SerialNumber string */
-    memset(string_buffer, 0, 128);
-    ret = usbh_get_string_desc(hport, USB_STRING_SERIAL_INDEX, string_buffer);
-    if (ret < 0) {
-        USB_LOG_ERR("Failed to get get SerialNumber string,errorcode:%d\r\n", ret);
-        goto errout;
+        USB_LOG_INFO("SerialNumber: %s\r\n", string_buffer);
+    } else {
+        USB_LOG_WRN("Do not support SerialNumber string\r\n");
     }
-
-    USB_LOG_INFO("SerialNumber: %s\r\n", string_buffer);
 #endif
     /* Select device configuration 1 */
     setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_DEVICE;
@@ -703,7 +733,7 @@ int usbh_control_transfer(struct usbh_hubport *hport, struct usb_setup_packet *s
     return ret;
 }
 
-int usbh_get_string_desc(struct usbh_hubport *hport, uint8_t index, uint8_t *output)
+int usbh_get_string_desc(struct usbh_hubport *hport, uint8_t index, uint8_t *output, uint16_t output_len)
 {
     struct usb_setup_packet *setup = hport->setup;
     int ret;
@@ -729,6 +759,10 @@ int usbh_get_string_desc(struct usbh_hubport *hport, uint8_t index, uint8_t *out
     dst = output;
     len = src[0];
 
+    if (((len - 2) / 2) > output_len) {
+        return -USB_ERR_NOMEM;
+    }
+
     while (i < len) {
         dst[j] = src[i];
         i += 2;

+ 2 - 1
components/drivers/usb/cherryusb/core/usbh_core.h

@@ -255,9 +255,10 @@ int usbh_control_transfer(struct usbh_hubport *hport, struct usb_setup_packet *s
  * @param hport Pointer to the USB hub port structure.
  * @param index Index of the string descriptor to retrieve.
  * @param output Pointer to the buffer where the retrieved descriptor will be stored.
+ * @param output_len Length of the output buffer.
  * @return On success will return 0, and others indicate fail.
  */
-int usbh_get_string_desc(struct usbh_hubport *hport, uint8_t index, uint8_t *output);
+int usbh_get_string_desc(struct usbh_hubport *hport, uint8_t index, uint8_t *output, uint16_t output_len);
 
 /**
  * @brief Sets the alternate setting for a USB interface on a specific hub port.

+ 4 - 0
components/drivers/usb/cherryusb/demo/video_audiov1_hid_template.c

@@ -448,6 +448,10 @@ void usbd_video_close(uint8_t busid, uint8_t intf)
 
 void usbd_video_iso_callback(uint8_t busid, uint8_t ep, uint32_t nbytes)
 {
+    if (nbytes == 0) {
+        return;
+    }
+
     if (usbd_video_stream_split_transfer(busid, ep)) {
         /* one frame has done */
         video_iso_tx_busy = false;

+ 4 - 0
components/drivers/usb/cherryusb/demo/video_static_h264_template.c

@@ -252,6 +252,10 @@ void usbd_video_close(uint8_t busid, uint8_t intf)
 
 void usbd_video_iso_callback(uint8_t busid, uint8_t ep, uint32_t nbytes)
 {
+    if (nbytes == 0) {
+        return;
+    }
+
     if (usbd_video_stream_split_transfer(busid, ep)) {
         /* one frame has done */
         iso_tx_busy = false;

+ 4 - 0
components/drivers/usb/cherryusb/demo/video_static_mjpeg_template.c

@@ -252,6 +252,10 @@ void usbd_video_close(uint8_t busid, uint8_t intf)
 
 void usbd_video_iso_callback(uint8_t busid, uint8_t ep, uint32_t nbytes)
 {
+    if (nbytes == 0) {
+        return;
+    }
+
     if (usbd_video_stream_split_transfer(busid, ep)) {
         /* one frame has done */
         iso_tx_busy = false;

+ 4 - 0
components/drivers/usb/cherryusb/demo/video_static_yuyv_template.c

@@ -256,6 +256,10 @@ void usbd_video_close(uint8_t busid, uint8_t intf)
 
 void usbd_video_iso_callback(uint8_t busid, uint8_t ep, uint32_t nbytes)
 {
+    if (nbytes == 0) {
+        return;
+    }
+
     if (usbd_video_stream_split_transfer(busid, ep)) {
         /* one frame has done */
         iso_tx_busy = false;

+ 1 - 1
components/drivers/usb/cherryusb/idf_component.yml

@@ -1,4 +1,4 @@
-version: "1.5.1"
+version: "1.5.2"
 description: CherryUSB is a tiny and portable USB Stack (device & host) for embedded system with USB IP
 tags:
   - usb

+ 3 - 7
components/drivers/usb/cherryusb/platform/rtthread/usb_check.c

@@ -12,10 +12,9 @@
 #error must enable RT_USING_TIMER_SOFT to support timer callback in thread
 #endif
 
-#if RT_TIMER_THREAD_STACK_SIZE < 2048
-#error "RT_TIMER_THREAD_STACK_SIZE must be >= 2048"
+#if RT_TIMER_THREAD_STACK_SIZE < 1024
+#error "RT_TIMER_THREAD_STACK_SIZE must be >= 1024"
 #endif
-
 #endif
 
 #if defined(ARCH_ARM_CORTEX_M7) ||                                          \
@@ -28,9 +27,6 @@
 
 #ifdef RT_USING_CACHE
 #ifndef CONFIG_USB_DCACHE_ENABLE
-#error CONFIG_USB_DCACHE_ENABLE must be enabled
-#endif
-#if RT_ALIGN_SIZE != 32 && RT_ALIGN_SIZE != 64
-#error RT_ALIGN_SIZE must be cacheline to 32 or 64
+#warning CONFIG_USB_DCACHE_ENABLE must be enabled if you do not config nocache ram
 #endif
 #endif

+ 10 - 3
components/drivers/usb/cherryusb/platform/rtthread/usbd_serial.c

@@ -123,7 +123,7 @@ static rt_ssize_t usbd_serial_write(struct rt_device *dev,
     }
     align_buf = (rt_uint8_t *)buffer;
 
-#ifdef RT_USING_CACHE
+#ifdef CONFIG_USB_DCACHE_ENABLE
     if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) {
         align_buf = rt_malloc_align(size, CONFIG_USB_ALIGN_SIZE);
         if (!align_buf) {
@@ -190,7 +190,7 @@ rt_err_t usbd_serial_register(struct usbd_serial *serial,
     device->user_data = data;
 
     /* register a character device */
-    ret = rt_device_register(device, serial->name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE);
+    ret = rt_device_register(device, serial->name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_REMOVABLE);
 
 #ifdef RT_USING_POSIX_DEVIO
     /* set fops */
@@ -209,6 +209,13 @@ void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes)
         serial = &g_usbd_serial_cdc_acm[devno];
         if (serial->out_ep == ep) {
             rt_ringbuffer_put(&serial->rx_rb, g_usbd_serial_cdc_acm_rx_buf[serial->minor], nbytes);
+            usbd_ep_start_read(serial->busid, serial->out_ep,
+                g_usbd_serial_cdc_acm_rx_buf[serial->minor],
+                usbd_get_ep_mps(serial->busid, serial->out_ep));
+
+            if (serial->parent.rx_indicate) {
+                serial->parent.rx_indicate(&serial->parent, nbytes);
+            }
             break;
         }
     }
@@ -269,4 +276,4 @@ void usbd_cdc_acm_serial_init(uint8_t busid, uint8_t in_ep, uint8_t out_ep)
     }
 
     USB_LOG_INFO("USB CDC ACM Serial Device %s initialized\n", serial->name);
-}
+}

+ 2 - 2
components/drivers/usb/cherryusb/platform/rtthread/usbh_serial.c

@@ -587,7 +587,7 @@ rt_err_t usbh_serial_register(struct usbh_serial *serial,
     device->user_data = data;
 
     /* register a character device */
-    ret = rt_device_register(device, serial->name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE);
+    ret = rt_device_register(device, serial->name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_REMOVABLE);
 
 #ifdef RT_USING_POSIX_DEVIO
     /* set fops */
@@ -911,4 +911,4 @@ void usbh_pl2303_stop(struct usbh_pl2303 *pl2303_class)
     serial = (struct usbh_serial *)pl2303_class->user_data;
     usbh_serial_unregister(serial);
 }
-#endif
+#endif

+ 4 - 0
components/drivers/usb/cherryusb/port/chipidea/usb_dc_chipidea.c

@@ -17,6 +17,10 @@
 #define CHIPIDEA_BITSMASK(val, offset) ((uint32_t)(val) << (offset))
 #define QTD_COUNT_EACH_ENDPOINT        (8U)
 
+#ifndef CONFIG_USBDEV_EP_NUM
+#define CONFIG_USBDEV_EP_NUM 8
+#endif
+
 /* ENDPTCTRL */
 enum {
     ENDPTCTRL_STALL = CHIPIDEA_BITSMASK(1, 0),

+ 9 - 9
components/drivers/usb/cherryusb/port/dwc2/README.md

@@ -1,10 +1,10 @@
 # Note
 
-If you are using more than one port, all ip parameters must be the same(like fifo num, endpoint num, dma support and so on), otherwise give up using multi ports.
+Please note that host must support dma mode.
 
 ## Support Chip List
 
-## STM32
+### STM32
 
 **有且仅有 PB14/PB15 引脚支持 host 模式, 部分 F7/H7 可能 PA11/PA12 也支持**。
 
@@ -16,13 +16,13 @@ If you are using more than one port, all ip parameters must be the same(like fif
 - STM32L4xx
 - STM32U5xx
 
-## AT32
+### AT32
 
 **有且仅有 AT32F405xx PB14/PB15引脚支持 host 模式**。
 
 - AT32F402xx、AT32F405xx、AT32F415xx、AT32F423xx、AT32F425xx、AT32F435xx、AT32F437xx
 
-## GD32
+### GD32
 
 **由于无法读取 DWC2 配置信息,并且有部分寄存器是非标准的,因此暂时无法支持 GD 系列**。
 
@@ -30,22 +30,22 @@ If you are using more than one port, all ip parameters must be the same(like fif
 - GD32F405、GD32F407
 - GD32F350、GD32F450
 
-## HC32
+### HC32
 
 - HC32F4A0
 
-## Espressif
+### Espressif
 
 - ESP32S2、ESP32S3、ESP32P4
 
-## Sophgo
+### Sophgo
 
 - CV18xx
 
-## Kendryte
+### Kendryte
 
 - K230
 
-## Nationstech
+### Nationstech
 
 - N32H4X

+ 13 - 2
components/drivers/usb/cherryusb/port/dwc2/usb_dc_dwc2.c

@@ -172,7 +172,12 @@ static inline void dwc2_set_mode(uint8_t busid, uint8_t mode)
         USB_OTG_GLB->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD;
     }
 
-    usbd_dwc2_delay_ms(50);
+    while (1) {
+        if ((USB_OTG_GLB->GINTSTS & 0x1U) == USB_OTG_MODE_DEVICE) {
+            break;
+        }
+        usbd_dwc2_delay_ms(10);
+    }
 }
 
 static inline int dwc2_flush_rxfifo(uint8_t busid)
@@ -777,6 +782,7 @@ int usbd_ep_set_stall(uint8_t busid, const uint8_t ep)
     }
 
     if ((ep_idx == 0) && g_dwc2_udc[busid].user_params.device_dma_enable) {
+        usb_dcache_invalidate((uintptr_t)&g_dwc2_udc[busid].setup, USB_ALIGN_UP(8, CONFIG_USB_ALIGN_SIZE));
         dwc2_ep0_start_read_setup(busid, (uint8_t *)&g_dwc2_udc[busid].setup);
     }
 
@@ -877,8 +883,12 @@ int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, ui
             USB_OTG_INEP(ep_idx)->DIEPCTL &= ~USB_OTG_DIEPCTL_SODDFRM;
             USB_OTG_INEP(ep_idx)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM;
         }
+    }
+
+    if (g_dwc2_udc[busid].in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS ||
+        g_dwc2_udc[busid].in_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_INTERRUPT) {
         USB_OTG_INEP(ep_idx)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_MULCNT);
-        USB_OTG_INEP(ep_idx)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_MULCNT & (1U << 29));
+        USB_OTG_INEP(ep_idx)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_MULCNT & ((usbd_get_ep_mult(busid, ep) + 1) << 29));
     }
 
     if (g_dwc2_udc[busid].user_params.device_dma_enable) {
@@ -943,6 +953,7 @@ int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t
     }
 
     if (g_dwc2_udc[busid].user_params.device_dma_enable) {
+        usb_dcache_invalidate((uintptr_t)data, USB_ALIGN_UP(data_len, CONFIG_USB_ALIGN_SIZE));
         USB_OTG_OUTEP(ep_idx)->DOEPDMA = (uint32_t)data;
     }
     if (g_dwc2_udc[busid].out_ep[ep_idx].ep_type == USB_ENDPOINT_TYPE_ISOCHRONOUS) {

+ 88 - 88
components/drivers/usb/cherryusb/port/dwc2/usb_dwc2_param.h

@@ -14,102 +14,102 @@
 #define dwc2_readl(addr) \
     (*(volatile uint32_t *)(addr))
 
-#define GUID_OFFSET HSOTG_REG(0x003c)
+#define GUID_OFFSET HSOTG_REG(0x003C)
 
 #define GSNPSID_OFFSET  HSOTG_REG(0x0040)
-#define GSNPSID_ID_MASK 0xffff0000
+#define GSNPSID_ID_MASK (0xFFFF0000UL)
 
 #define GHWCFG1_OFFSET HSOTG_REG(0x0044)
 
 #define GHWCFG2_OFFSET                        HSOTG_REG(0x0048)
-#define GHWCFG2_OTG_ENABLE_IC_USB             (1U << 31)
-#define GHWCFG2_DEV_TOKEN_Q_DEPTH_MASK        (0x1f << 26)
-#define GHWCFG2_DEV_TOKEN_Q_DEPTH_SHIFT       26
-#define GHWCFG2_HOST_PERIO_TX_Q_DEPTH_MASK    (0x3 << 24)
-#define GHWCFG2_HOST_PERIO_TX_Q_DEPTH_SHIFT   24
-#define GHWCFG2_NONPERIO_TX_Q_DEPTH_MASK      (0x3 << 22)
-#define GHWCFG2_NONPERIO_TX_Q_DEPTH_SHIFT     22
-#define GHWCFG2_MULTI_PROC_INT                (1 << 20)
-#define GHWCFG2_DYNAMIC_FIFO                  (1 << 19)
-#define GHWCFG2_PERIO_EP_SUPPORTED            (1 << 18)
-#define GHWCFG2_NUM_HOST_CHAN_MASK            (0xf << 14)
-#define GHWCFG2_NUM_HOST_CHAN_SHIFT           14
-#define GHWCFG2_NUM_DEV_EP_MASK               (0xf << 10)
-#define GHWCFG2_NUM_DEV_EP_SHIFT              10
-#define GHWCFG2_FS_PHY_TYPE_MASK              (0x3 << 8)
-#define GHWCFG2_FS_PHY_TYPE_SHIFT             8
-#define GHWCFG2_FS_PHY_TYPE_NOT_SUPPORTED     0
-#define GHWCFG2_FS_PHY_TYPE_DEDICATED         1
-#define GHWCFG2_FS_PHY_TYPE_SHARED_UTMI       2
-#define GHWCFG2_FS_PHY_TYPE_SHARED_ULPI       3
-#define GHWCFG2_HS_PHY_TYPE_MASK              (0x3 << 6)
-#define GHWCFG2_HS_PHY_TYPE_SHIFT             6
-#define GHWCFG2_HS_PHY_TYPE_NOT_SUPPORTED     0
-#define GHWCFG2_HS_PHY_TYPE_UTMI              1
-#define GHWCFG2_HS_PHY_TYPE_ULPI              2
-#define GHWCFG2_HS_PHY_TYPE_UTMI_ULPI         3
-#define GHWCFG2_POINT2POINT                   (1 << 5)
-#define GHWCFG2_ARCHITECTURE_MASK             (0x3 << 3)
-#define GHWCFG2_ARCHITECTURE_SHIFT            3
-#define GHWCFG2_SLAVE_ONLY_ARCH               0
-#define GHWCFG2_EXT_DMA_ARCH                  1
-#define GHWCFG2_INT_DMA_ARCH                  2
-#define GHWCFG2_OP_MODE_MASK                  (0x7 << 0)
-#define GHWCFG2_OP_MODE_SHIFT                 0
-#define GHWCFG2_OP_MODE_HNP_SRP_CAPABLE       0
-#define GHWCFG2_OP_MODE_SRP_ONLY_CAPABLE      1
-#define GHWCFG2_OP_MODE_NO_HNP_SRP_CAPABLE    2
-#define GHWCFG2_OP_MODE_SRP_CAPABLE_DEVICE    3
-#define GHWCFG2_OP_MODE_NO_SRP_CAPABLE_DEVICE 4
-#define GHWCFG2_OP_MODE_SRP_CAPABLE_HOST      5
-#define GHWCFG2_OP_MODE_NO_SRP_CAPABLE_HOST   6
-#define GHWCFG2_OP_MODE_UNDEFINED             7
-
-#define GHWCFG3_OFFSET                       HSOTG_REG(0x004c)
-#define GHWCFG3_DFIFO_DEPTH_MASK             (0xffff << 16)
-#define GHWCFG3_DFIFO_DEPTH_SHIFT            16
-#define GHWCFG3_OTG_LPM_EN                   (1 << 15)
-#define GHWCFG3_BC_SUPPORT                   (1 << 14)
-#define GHWCFG3_OTG_ENABLE_HSIC              (1 << 13)
-#define GHWCFG3_ADP_SUPP                     (1 << 12)
-#define GHWCFG3_SYNCH_RESET_TYPE             (1 << 11)
-#define GHWCFG3_OPTIONAL_FEATURES            (1 << 10)
-#define GHWCFG3_VENDOR_CTRL_IF               (1 << 9)
-#define GHWCFG3_I2C                          (1 << 8)
-#define GHWCFG3_OTG_FUNC                     (1 << 7)
-#define GHWCFG3_PACKET_SIZE_CNTR_WIDTH_MASK  (0x7 << 4)
-#define GHWCFG3_PACKET_SIZE_CNTR_WIDTH_SHIFT 4
-#define GHWCFG3_XFER_SIZE_CNTR_WIDTH_MASK    (0xf << 0)
-#define GHWCFG3_XFER_SIZE_CNTR_WIDTH_SHIFT   0
+#define GHWCFG2_OTG_ENABLE_IC_USB             (0x01UL << 31U)
+#define GHWCFG2_DEV_TOKEN_Q_DEPTH_MASK        (0x1FUL << 26U)
+#define GHWCFG2_DEV_TOKEN_Q_DEPTH_SHIFT       (26U)
+#define GHWCFG2_HOST_PERIO_TX_Q_DEPTH_MASK    (0x03UL << 24U)
+#define GHWCFG2_HOST_PERIO_TX_Q_DEPTH_SHIFT   (24U)
+#define GHWCFG2_NONPERIO_TX_Q_DEPTH_MASK      (0x03UL << 22U)
+#define GHWCFG2_NONPERIO_TX_Q_DEPTH_SHIFT     (22U)
+#define GHWCFG2_MULTI_PROC_INT                (0x01UL << 20U)
+#define GHWCFG2_DYNAMIC_FIFO                  (0x01UL << 19U)
+#define GHWCFG2_PERIO_EP_SUPPORTED            (0x01UL << 18U)
+#define GHWCFG2_NUM_HOST_CHAN_MASK            (0x0FUL << 14U)
+#define GHWCFG2_NUM_HOST_CHAN_SHIFT           (14U)
+#define GHWCFG2_NUM_DEV_EP_MASK               (0x0FUL << 10U)
+#define GHWCFG2_NUM_DEV_EP_SHIFT              (10U)
+#define GHWCFG2_FS_PHY_TYPE_MASK              (0x03UL << 8U)
+#define GHWCFG2_FS_PHY_TYPE_SHIFT             (8U)
+#define GHWCFG2_FS_PHY_TYPE_NOT_SUPPORTED     (0x00UL)
+#define GHWCFG2_FS_PHY_TYPE_DEDICATED         (0x01UL)
+#define GHWCFG2_FS_PHY_TYPE_SHARED_UTMI       (0x02UL)
+#define GHWCFG2_FS_PHY_TYPE_SHARED_ULPI       (0x03UL)
+#define GHWCFG2_HS_PHY_TYPE_MASK              (0x03UL << 6U)
+#define GHWCFG2_HS_PHY_TYPE_SHIFT             (6U)
+#define GHWCFG2_HS_PHY_TYPE_NOT_SUPPORTED     (0x00UL)
+#define GHWCFG2_HS_PHY_TYPE_UTMI              (0x01UL)
+#define GHWCFG2_HS_PHY_TYPE_ULPI              (0x02UL)
+#define GHWCFG2_HS_PHY_TYPE_UTMI_ULPI         (0x03UL)
+#define GHWCFG2_POINT2POINT                   (0x01UL << 5U)
+#define GHWCFG2_ARCHITECTURE_MASK             (0x03UL << 3U)
+#define GHWCFG2_ARCHITECTURE_SHIFT            (3U)
+#define GHWCFG2_SLAVE_ONLY_ARCH               (0x00UL)
+#define GHWCFG2_EXT_DMA_ARCH                  (0x01UL)
+#define GHWCFG2_INT_DMA_ARCH                  (0x02UL)
+#define GHWCFG2_OP_MODE_MASK                  (0x07UL << 0U)
+#define GHWCFG2_OP_MODE_SHIFT                 (0U)
+#define GHWCFG2_OP_MODE_HNP_SRP_CAPABLE       (0x00UL)
+#define GHWCFG2_OP_MODE_SRP_ONLY_CAPABLE      (0x01UL)
+#define GHWCFG2_OP_MODE_NO_HNP_SRP_CAPABLE    (0x02UL)
+#define GHWCFG2_OP_MODE_SRP_CAPABLE_DEVICE    (0x03UL)
+#define GHWCFG2_OP_MODE_NO_SRP_CAPABLE_DEVICE (0x04UL)
+#define GHWCFG2_OP_MODE_SRP_CAPABLE_HOST      (0x05UL)
+#define GHWCFG2_OP_MODE_NO_SRP_CAPABLE_HOST   (0x06UL)
+#define GHWCFG2_OP_MODE_UNDEFINED             (0x07UL)
+
+#define GHWCFG3_OFFSET                       HSOTG_REG(0x004C)
+#define GHWCFG3_DFIFO_DEPTH_MASK             (0xFFFFUL << 16U)
+#define GHWCFG3_DFIFO_DEPTH_SHIFT            (16U)
+#define GHWCFG3_OTG_LPM_EN                   (0x0001UL << 15U)
+#define GHWCFG3_BC_SUPPORT                   (0x0001UL << 14U)
+#define GHWCFG3_OTG_ENABLE_HSIC              (0x0001UL << 13U)
+#define GHWCFG3_ADP_SUPP                     (0x0001UL << 12U)
+#define GHWCFG3_SYNCH_RESET_TYPE             (0x0001UL << 11U)
+#define GHWCFG3_OPTIONAL_FEATURES            (0x0001UL << 10U)
+#define GHWCFG3_VENDOR_CTRL_IF               (0x0001UL << 9U)
+#define GHWCFG3_I2C                          (0x0001UL << 8U)
+#define GHWCFG3_OTG_FUNC                     (0x0001UL << 7U)
+#define GHWCFG3_PACKET_SIZE_CNTR_WIDTH_MASK  (0x0007UL << 4U)
+#define GHWCFG3_PACKET_SIZE_CNTR_WIDTH_SHIFT (4U)
+#define GHWCFG3_XFER_SIZE_CNTR_WIDTH_MASK    (0x000FUL << 0U)
+#define GHWCFG3_XFER_SIZE_CNTR_WIDTH_SHIFT   (0U)
 
 #define GHWCFG4_OFFSET                      HSOTG_REG(0x0050)
-#define GHWCFG4_DESC_DMA_DYN                (1U << 31)
-#define GHWCFG4_DESC_DMA                    (1 << 30)
-#define GHWCFG4_NUM_IN_EPS_MASK             (0xf << 26)
-#define GHWCFG4_NUM_IN_EPS_SHIFT            26
-#define GHWCFG4_DED_FIFO_EN                 (1 << 25)
-#define GHWCFG4_DED_FIFO_SHIFT              25
-#define GHWCFG4_SESSION_END_FILT_EN         (1 << 24)
-#define GHWCFG4_B_VALID_FILT_EN             (1 << 23)
-#define GHWCFG4_A_VALID_FILT_EN             (1 << 22)
-#define GHWCFG4_VBUS_VALID_FILT_EN          (1 << 21)
-#define GHWCFG4_IDDIG_FILT_EN               (1 << 20)
-#define GHWCFG4_NUM_DEV_MODE_CTRL_EP_MASK   (0xf << 16)
-#define GHWCFG4_NUM_DEV_MODE_CTRL_EP_SHIFT  16
-#define GHWCFG4_UTMI_PHY_DATA_WIDTH_MASK    (0x3 << 14)
-#define GHWCFG4_UTMI_PHY_DATA_WIDTH_SHIFT   14
-#define GHWCFG4_UTMI_PHY_DATA_WIDTH_8       0
-#define GHWCFG4_UTMI_PHY_DATA_WIDTH_16      1
-#define GHWCFG4_UTMI_PHY_DATA_WIDTH_8_OR_16 2
-#define GHWCFG4_ACG_SUPPORTED               (1 << 12)
-#define GHWCFG4_IPG_ISOC_SUPPORTED          (1 << 11)
-#define GHWCFG4_SERVICE_INTERVAL_SUPPORTED  (1 << 10)
-#define GHWCFG4_XHIBER                      (1 << 7)
-#define GHWCFG4_HIBER                       (1 << 6)
-#define GHWCFG4_MIN_AHB_FREQ                (1 << 5)
-#define GHWCFG4_POWER_OPTIMIZ               (1 << 4)
-#define GHWCFG4_NUM_DEV_PERIO_IN_EP_MASK    (0xf << 0)
-#define GHWCFG4_NUM_DEV_PERIO_IN_EP_SHIFT   0
+#define GHWCFG4_DESC_DMA_DYN                (0x1UL << 31U)
+#define GHWCFG4_DESC_DMA                    (0x1UL << 30U)
+#define GHWCFG4_NUM_IN_EPS_MASK             (0xFUL << 26U)
+#define GHWCFG4_NUM_IN_EPS_SHIFT            (26U)
+#define GHWCFG4_DED_FIFO_EN                 (0x1UL << 25U)
+#define GHWCFG4_DED_FIFO_SHIFT              (25U)
+#define GHWCFG4_SESSION_END_FILT_EN         (0x1UL << 24U)
+#define GHWCFG4_B_VALID_FILT_EN             (0x1UL << 23U)
+#define GHWCFG4_A_VALID_FILT_EN             (0x1UL << 22U)
+#define GHWCFG4_VBUS_VALID_FILT_EN          (0x1UL << 21U)
+#define GHWCFG4_IDDIG_FILT_EN               (0x1UL << 20U)
+#define GHWCFG4_NUM_DEV_MODE_CTRL_EP_MASK   (0xFUL << 16U)
+#define GHWCFG4_NUM_DEV_MODE_CTRL_EP_SHIFT  (16U)
+#define GHWCFG4_UTMI_PHY_DATA_WIDTH_MASK    (0x3UL << 14U)
+#define GHWCFG4_UTMI_PHY_DATA_WIDTH_SHIFT   (14U)
+#define GHWCFG4_UTMI_PHY_DATA_WIDTH_8       (0x0UL)
+#define GHWCFG4_UTMI_PHY_DATA_WIDTH_16      (0x1UL)
+#define GHWCFG4_UTMI_PHY_DATA_WIDTH_8_OR_16 (0x2UL)
+#define GHWCFG4_ACG_SUPPORTED               (0x1UL << 12U)
+#define GHWCFG4_IPG_ISOC_SUPPORTED          (0x1UL << 11U)
+#define GHWCFG4_SERVICE_INTERVAL_SUPPORTED  (0x1UL << 10U)
+#define GHWCFG4_XHIBER                      (0x1UL << 7U)
+#define GHWCFG4_HIBER                       (0x1UL << 6U)
+#define GHWCFG4_MIN_AHB_FREQ                (0x1UL << 5U)
+#define GHWCFG4_POWER_OPTIMIZ               (0x1UL << 4U)
+#define GHWCFG4_NUM_DEV_PERIO_IN_EP_MASK    (0xFUL << 0U)
+#define GHWCFG4_NUM_DEV_PERIO_IN_EP_SHIFT   (0U)
 
 /**
  * struct dwc2_hw_params - Autodetected parameters.

+ 4 - 3
components/drivers/usb/cherryusb/port/dwc2/usb_dwc2_reg.h

@@ -215,9 +215,7 @@ typedef struct
 #define USB_OTG_HCFG_FSLSS_Pos                   (2U)
 #define USB_OTG_HCFG_FSLSS_Msk                   (0x1UL << USB_OTG_HCFG_FSLSS_Pos) /*!< 0x00000004 */
 #define USB_OTG_HCFG_FSLSS                       USB_OTG_HCFG_FSLSS_Msk        /*!< FS- and LS-only support */
-#define USB_OTG_HFIR_RELOAD_CTRL_Pos             (16U)
-#define USB_OTG_HFIR_RELOAD_CTRL_Msk             (0x1UL << USB_OTG_HFIR_RELOAD_CTRL_Pos)
-#define USB_OTG_HFIR_RELOAD_CTRL                 USB_OTG_HFIR_RELOAD_CTRL_Msk
+
 /********************  Bit definition for USB_OTG_DCFG register  ********************/
 
 #define USB_OTG_DCFG_DSPD_Pos                    (0U)
@@ -335,6 +333,9 @@ typedef struct
 #define USB_OTG_HFIR_FRIVL_Pos                   (0U)
 #define USB_OTG_HFIR_FRIVL_Msk                   (0xFFFFUL << USB_OTG_HFIR_FRIVL_Pos) /*!< 0x0000FFFF */
 #define USB_OTG_HFIR_FRIVL                       USB_OTG_HFIR_FRIVL_Msk        /*!< Frame interval */
+#define USB_OTG_HFIR_RELOAD_CTRL_Pos             (16U)
+#define USB_OTG_HFIR_RELOAD_CTRL_Msk             (0x1UL << USB_OTG_HFIR_RELOAD_CTRL_Pos)
+#define USB_OTG_HFIR_RELOAD_CTRL                 USB_OTG_HFIR_RELOAD_CTRL_Msk
 
 /********************  Bit definition for USB_OTG_HFNUM register  ********************/
 #define USB_OTG_HFNUM_FRNUM_Pos                  (0U)

+ 1 - 1
components/drivers/usb/cherryusb/port/dwc2/usb_glue_at.c

@@ -68,7 +68,7 @@ const struct dwc2_user_params param_pb14_pb15 = {
         [15] = 0 },
 
     .host_dma_desc_enable = false,
-    .host_rx_fifo_size = 628,
+    .host_rx_fifo_size = 624,
     .host_nperio_tx_fifo_size = 128, // 512 byte
     .host_perio_tx_fifo_size = 256,  // 1024 byte
 

+ 4 - 0
components/drivers/usb/cherryusb/port/dwc2/usb_glue_esp.c

@@ -144,6 +144,7 @@ void usb_dc_low_level_init(uint8_t busid)
 {
     esp_err_t ret;
     void *reg_base = (void*)g_usbdev_bus[busid].reg_base;
+    (void)reg_base;
     usb_phy_config_t phy_config = {
         .controller = USB_PHY_CTRL_OTG,
         .otg_mode = USB_OTG_MODE_DEVICE,
@@ -170,6 +171,7 @@ void usb_dc_low_level_init(uint8_t busid)
 void usb_dc_low_level_deinit(uint8_t busid)
 {
     void *reg_base = (void*)g_usbdev_bus[busid].reg_base;
+    (void)reg_base;
     if (s_interrupt_handle[GET_USB_INDEX(reg_base)]) {
         esp_intr_free(s_interrupt_handle[GET_USB_INDEX(reg_base)]);
         s_interrupt_handle[GET_USB_INDEX(reg_base)] = NULL;
@@ -190,6 +192,7 @@ static void usb_hc_interrupt_cb(void *arg_pv)
 void usb_hc_low_level_init(struct usbh_bus *bus)
 {
     void *reg_base = (void*)bus->hcd.reg_base;
+    (void)reg_base;
     // Host Library defaults to internal PHY
     usb_phy_config_t phy_config = {
         .controller = USB_PHY_CTRL_OTG,
@@ -219,6 +222,7 @@ void usb_hc_low_level_init(struct usbh_bus *bus)
 void usb_hc_low_level_deinit(struct usbh_bus *bus)
 {
     void *reg_base = (void*)bus->hcd.reg_base;
+    (void)reg_base;
     if (s_interrupt_handle[GET_USB_INDEX(reg_base)]) {
         esp_intr_free(s_interrupt_handle[GET_USB_INDEX(reg_base)]);
         s_interrupt_handle[GET_USB_INDEX(reg_base)] = NULL;

+ 122 - 55
components/drivers/usb/cherryusb/port/dwc2/usb_glue_kendryte.c

@@ -27,33 +27,84 @@
 #include <rthw.h>
 #include "usbd_core.h"
 #include "usbh_core.h"
+#include "usb_dwc2_param.h"
 
+#include <riscv_io.h>
+#include "sysctl_rst.h"
+#include "ioremap.h"
+#include "mmu.h"
+#include "cache.h"
+
+extern rt_mmu_info mmu_info;
+
+#if defined(ENABLE_CHERRY_USB) || defined(PKG_USING_CHERRYUSB) || defined(RT_USING_CHERRYUSB)
 #define DEFAULT_USB_HCLK_FREQ_MHZ 200
 
 uint32_t SystemCoreClock = (DEFAULT_USB_HCLK_FREQ_MHZ * 1000 * 1000);
-uintptr_t g_usb_otg0_base = (uintptr_t)0x91500000UL;
-uintptr_t g_usb_otg1_base = (uintptr_t)0x91540000UL;
 
-static void sysctl_reset_hw_done(volatile uint32_t *reset_reg, uint8_t reset_bit, uint8_t done_bit)
-{
-    *reset_reg |= (1 << done_bit); /* clear done bit */
-    rt_thread_mdelay(1);
-
-    *reset_reg |= (1 << reset_bit); /* set reset bit */
-    rt_thread_mdelay(1);
-    /* check done bit */
-    while (*reset_reg & (1 << done_bit) == 0)
-        ;
-}
+const uintptr_t usb_dev_addr[2] = { 0x91500000UL, 0x91540000UL };
 
 #define USB_IDPULLUP0   (1 << 4)
 #define USB_DMPULLDOWN0 (1 << 8)
 #define USB_DPPULLDOWN0 (1 << 9)
 
-#ifdef PKG_CHERRYUSB_HOST
+const struct dwc2_user_params param_common = {
+    .phy_type = DWC2_PHY_TYPE_PARAM_UTMI,
+#ifdef CONFIG_USB_DWC2_DMA_ENABLE
+    .device_dma_enable = true,
+#else
+    .device_dma_enable = false,
+#endif
+    .device_dma_desc_enable = false,
+    .device_rx_fifo_size = (3016 - 16 - 256 * 8),
+    .device_tx_fifo_size = {
+        [0] = 16,  // 64 byte
+        [1] = 512, // 1024 byte, double buffer
+        [2] = 256, // 1024 byte
+        [3] = 512, // 1024 byte, double buffer
+        [4] = 256, // 1024 byte
+        [5] = 256, // 1024 byte
+        [6] = 256, // 1024 byte
+        [7] = 0,
+        [8] = 0,
+        [9] = 0,
+        [10] = 0,
+        [11] = 0,
+        [12] = 0,
+        [13] = 0,
+        [14] = 0,
+        [15] = 0 },
+
+    .host_dma_desc_enable = false,
+    .host_rx_fifo_size = 3016 - 128 * 2 - 256 * 2,
+    .host_nperio_tx_fifo_size = 128 * 2, // 512 byte, double buffer
+    .host_perio_tx_fifo_size = 256 * 2,  // 1024 byte, double buffer
+
+    .device_gccfg = 0,
+    .host_gccfg = 0
+};
+
+#ifndef CONFIG_USB_DWC2_CUSTOM_PARAM
+void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params)
+{
+    memcpy(params, &param_common, 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
+
+// USB Host
+#if defined(ENABLE_CHERRY_USB_HOST) || defined(PKG_CHERRYUSB_HOST) || defined(RT_CHERRYUSB_HOST)
 static void usb_hc_interrupt_cb(int irq, void *arg_pv)
 {
-    extern void USBH_IRQHandler(uint8_t busid);
     USBH_IRQHandler((uint8_t)(uintptr_t)arg_pv);
 }
 
@@ -62,8 +113,10 @@ void usb_hc_low_level_init(struct usbh_bus *bus)
     uint32_t *hs_reg;
     uint32_t usb_ctl3;
 
-    if (bus->hcd.hcd_id == 0) {
-        sysctl_reset_hw_done((volatile uint32_t *)0x9110103c, 0, 28);
+    if ((uintptr_t)rt_hw_mmu_v2p(&mmu_info, (void *)bus->hcd.reg_base) == usb_dev_addr[0]) {
+        if (!sysctl_reset(SYSCTL_RESET_USB0)) {
+            USB_LOG_ERR("reset usb0 fail\n");
+        }
 
         hs_reg = (uint32_t *)rt_ioremap((void *)(0x91585000 + 0x7C), 0x1000);
         usb_ctl3 = *hs_reg | USB_IDPULLUP0;
@@ -72,11 +125,13 @@ void usb_hc_low_level_init(struct usbh_bus *bus)
 
         rt_iounmap(hs_reg);
 
-        rt_hw_interrupt_install(173, usb_hc_interrupt_cb, NULL, "usbh0");
+        rt_hw_interrupt_install(173, usb_hc_interrupt_cb, (void *)(uintptr_t)bus->hcd.hcd_id, "usbh0");
         rt_hw_interrupt_umask(173);
 
     } else {
-        sysctl_reset_hw_done((volatile uint32_t *)0x9110103c, 1, 29);
+        if (!sysctl_reset(SYSCTL_RESET_USB1)) {
+            USB_LOG_ERR("reset usb1 fail\n");
+        }
 
         hs_reg = (uint32_t *)rt_ioremap((void *)(0x91585000 + 0x9C), 0x1000);
         usb_ctl3 = *hs_reg | USB_IDPULLUP0;
@@ -85,73 +140,85 @@ void usb_hc_low_level_init(struct usbh_bus *bus)
 
         rt_iounmap(hs_reg);
 
-        rt_hw_interrupt_install(174, usb_hc_interrupt_cb, 1, "usbh1");
+        rt_hw_interrupt_install(174, usb_hc_interrupt_cb, (void *)(uintptr_t)bus->hcd.hcd_id, "usbh1");
         rt_hw_interrupt_umask(174);
     }
 }
 
 void usb_hc_low_level_deinit(struct usbh_bus *bus)
 {
-    if (bus->hcd.hcd_id == 0) {
+    if ((uintptr_t)rt_hw_mmu_v2p(&mmu_info, (void *)bus->hcd.reg_base) == usb_dev_addr[0]) {
         rt_hw_interrupt_mask(173);
     } else {
         rt_hw_interrupt_mask(174);
     }
 }
+#endif // ENABLE_CHERRY_USB_HOST
 
-uint32_t usbh_get_dwc2_gccfg_conf(uint32_t reg_base)
-{
-    return 0;
-}
-#endif
-
-#ifdef PKG_CHERRYUSB_DEVICE
+// USB Device
+#if defined(ENABLE_CHERRY_USB_DEVICE) || defined(PKG_CHERRYUSB_DEVICE) || defined(RT_CHERRYUSB_DEVICE)
 static void usb_dc_interrupt_cb(int irq, void *arg_pv)
 {
-    extern void USBD_IRQHandler(uint8_t busid);
-    USBD_IRQHandler(0);
+    USBD_IRQHandler((uint8_t)(uintptr_t)arg_pv);
 }
 
-#ifdef CHERRYUSB_DEVICE_USING_USB0
 void usb_dc_low_level_init(uint8_t busid)
 {
-    sysctl_reset_hw_done((volatile uint32_t *)0x9110103c, 0, 28);
-    uint32_t *hs_reg = (uint32_t *)rt_ioremap((void *)(0x91585000 + 0x7C), 0x1000);
-    *hs_reg = 0x37;
-    rt_iounmap(hs_reg);
+    if ((uintptr_t)rt_hw_mmu_v2p(&mmu_info, (void *)g_usbdev_bus[busid].reg_base) == usb_dev_addr[0]) {
+        if (!sysctl_reset(SYSCTL_RESET_USB0)) {
+            USB_LOG_ERR("reset usb0 fail\n");
+        }
+
+        uint32_t *hs_reg = (uint32_t *)rt_ioremap((void *)(0x91585000 + 0x7C), 0x1000);
+        *hs_reg = 0x37;
+        rt_iounmap(hs_reg);
+
+        rt_hw_interrupt_install(173, usb_dc_interrupt_cb, (void *)(uintptr_t)busid, "usbd0");
+        rt_hw_interrupt_umask(173);
+    } else {
+        if (!sysctl_reset(SYSCTL_RESET_USB1)) {
+            USB_LOG_ERR("reset usb1 fail\n");
+        }
+
+        uint32_t *hs_reg = (uint32_t *)rt_ioremap((void *)(0x91585000 + 0x9C), 0x1000);
+        *hs_reg = 0x37;
+        rt_iounmap(hs_reg);
 
-    rt_hw_interrupt_install(173, usb_dc_interrupt_cb, NULL, "usbd");
-    rt_hw_interrupt_umask(173);
+        rt_hw_interrupt_install(174, usb_dc_interrupt_cb, (void *)(uintptr_t)busid, "usbd1");
+        rt_hw_interrupt_umask(174);
+    }
 }
 
 void usb_dc_low_level_deinit(uint8_t busid)
 {
-    rt_hw_interrupt_mask(173);
+    if ((uintptr_t)rt_hw_mmu_v2p(&mmu_info, (void *)g_usbdev_bus[busid].reg_base) == usb_dev_addr[0]) {
+        rt_hw_interrupt_mask(173);
+    } else {
+        rt_hw_interrupt_mask(174);
+    }
 }
-#else
-void usb_dc_low_level_init(uint8_t busid)
-{
-    sysctl_reset_hw_done((volatile uint32_t *)0x9110103c, 1, 29);
-    uint32_t *hs_reg = (uint32_t *)rt_ioremap((void *)(0x91585000 + 0x9C), 0x1000);
-    *hs_reg = 0x37;
-    rt_iounmap(hs_reg);
+#endif // ENABLE_CHERRY_USB_DEVICE
 
-    rt_hw_interrupt_install(174, usb_dc_interrupt_cb, NULL, "usbd");
-    rt_hw_interrupt_umask(174);
+void usbd_dwc2_delay_ms(uint8_t ms)
+{
+    rt_thread_mdelay(ms);
 }
 
-void usb_dc_low_level_deinit(uint8_t busid)
+#ifdef CONFIG_USB_DCACHE_ENABLE
+void usb_dcache_clean(uintptr_t addr, size_t size)
 {
-    rt_hw_interrupt_mask(174);
+    rt_hw_cpu_dcache_clean((void *)addr, size);
 }
-#endif
-uint32_t usbd_get_dwc2_gccfg_conf(uint32_t reg_base)
+
+void usb_dcache_invalidate(uintptr_t addr, size_t size)
 {
-    return 0;
+    rt_hw_cpu_dcache_invalidate((void *)addr, size);
 }
 
-void usbd_dwc2_delay_ms(uint8_t ms)
+void usb_dcache_flush(uintptr_t addr, size_t size)
 {
-    /* implement later */
+    rt_hw_cpu_dcache_clean_flush((void *)addr, size);
 }
-#endif
+#endif
+
+#endif // ENABLE_CHERRY_USB

+ 2 - 2
components/drivers/usb/cherryusb/port/dwc2/usb_glue_st.c

@@ -166,7 +166,7 @@ const struct dwc2_user_params param_pb14_pb15 = {
     .device_dma_enable = false,
 #endif
     .device_dma_desc_enable = false,
-    .device_rx_fifo_size = (1012 - 16 - 256 - 128 - 128 - 128 - 128),
+    .device_rx_fifo_size = (1006 - 16 - 256 - 128 - 128 - 128 - 128), // 1006/1012
     .device_tx_fifo_size = {
         [0] = 16,  // 64 byte
         [1] = 256, // 1024 byte
@@ -186,7 +186,7 @@ const struct dwc2_user_params param_pb14_pb15 = {
         [15] = 0 },
 
     .host_dma_desc_enable = false,
-    .host_rx_fifo_size = 628,
+    .host_rx_fifo_size = 622,
     .host_nperio_tx_fifo_size = 128, // 512 byte
     .host_perio_tx_fifo_size = 256,  // 1024 byte
 #ifdef CONFIG_USB_HS

+ 188 - 139
components/drivers/usb/cherryusb/port/dwc2/usb_hc_dwc2.c

@@ -20,7 +20,6 @@ struct dwc2_chan {
     uint32_t xferlen;
     uint8_t chidx;
     bool inuse;
-    bool dir_in;
     bool do_ssplit;
     bool do_csplit;
     uint8_t hub_addr;
@@ -136,7 +135,12 @@ static inline void dwc2_set_mode(struct usbh_bus *bus, uint8_t mode)
         USB_OTG_GLB->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD;
     }
 
-    usb_osal_msleep(50);
+    while (1) {
+        if ((USB_OTG_GLB->GINTSTS & 0x1U) == USB_OTG_MODE_HOST) {
+            break;
+        }
+        usb_osal_msleep(10);
+    }
 }
 
 static inline int dwc2_flush_rxfifo(struct usbh_bus *bus)
@@ -222,7 +226,14 @@ static inline uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t po
     }
 }
 
-static inline void dwc2_chan_char_init(struct usbh_bus *bus, uint8_t ch_num, uint8_t devaddr, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps, uint8_t speed)
+static inline void dwc2_chan_char_init(struct usbh_bus *bus,
+                                       uint8_t ch_num,
+                                       uint8_t dev_addr,
+                                       uint8_t ep_addr,
+                                       uint8_t ep_type,
+                                       uint16_t ep_mps,
+                                       uint8_t ep_mult,
+                                       uint8_t speed)
 {
     uint32_t regval;
 
@@ -230,7 +241,8 @@ static inline void dwc2_chan_char_init(struct usbh_bus *bus, uint8_t ch_num, uin
     regval = (((uint32_t)ep_mps << USB_OTG_HCCHAR_MPSIZ_Pos) & USB_OTG_HCCHAR_MPSIZ) |
              ((((uint32_t)ep_addr & 0x7FU) << USB_OTG_HCCHAR_EPNUM_Pos) & USB_OTG_HCCHAR_EPNUM) |
              (((uint32_t)ep_type << USB_OTG_HCCHAR_EPTYP_Pos) & USB_OTG_HCCHAR_EPTYP) |
-             (((uint32_t)devaddr << USB_OTG_HCCHAR_DAD_Pos) & USB_OTG_HCCHAR_DAD);
+             (((uint32_t)ep_mult << USB_OTG_HCCHAR_MC_Pos) & USB_OTG_HCCHAR_MC) |
+             (((uint32_t)dev_addr << USB_OTG_HCCHAR_DAD_Pos) & USB_OTG_HCCHAR_DAD);
 
     if ((ep_addr & 0x80U) == 0x80U) {
         regval |= USB_OTG_HCCHAR_EPDIR;
@@ -272,7 +284,14 @@ static inline void dwc2_chan_splt_init(struct usbh_bus *bus, uint8_t ch_num)
     }
 }
 
-static void dwc2_chan_init(struct usbh_bus *bus, uint8_t ch_num, uint8_t devaddr, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps, uint8_t speed)
+static void dwc2_chan_init(struct usbh_bus *bus,
+                           uint8_t ch_num,
+                           uint8_t dev_addr,
+                           uint8_t ep_addr,
+                           uint8_t ep_type,
+                           uint16_t ep_mps,
+                           uint8_t ep_mult,
+                           uint8_t speed)
 {
     /* Clear old interrupt conditions for this host channel. */
     USB_OTG_HC((uint32_t)ch_num)->HCINT = 0xFFFFFFFFU;
@@ -283,33 +302,47 @@ static void dwc2_chan_init(struct usbh_bus *bus, uint8_t ch_num, uint8_t devaddr
     /* Enable the top level host channel interrupt. */
     USB_OTG_HOST->HAINTMSK |= 1UL << (ch_num & 0xFU);
 
-    dwc2_chan_char_init(bus, ch_num, devaddr, ep_addr, ep_type, ep_mps, speed);
+    dwc2_chan_char_init(bus, ch_num, dev_addr, ep_addr, ep_type, ep_mps, ep_mult, speed);
     dwc2_chan_splt_init(bus, ch_num);
 }
 
-/* For IN channel HCTSIZ.XferSize is expected to be an integer multiple of ep_mps size.*/
 static inline void dwc2_chan_transfer(struct usbh_bus *bus, uint8_t ch_num, uint8_t ep_addr, uint8_t *buf, uint32_t size, uint16_t num_packets, uint8_t pid)
 {
     __IO uint32_t tmpreg;
     uint8_t is_oddframe;
-    struct dwc2_chan *chan;
-
-    chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[ch_num];
 
     /* Initialize the HCTSIZn register */
     USB_OTG_HC(ch_num)->HCTSIZ = (size & USB_OTG_HCTSIZ_XFRSIZ) |
                                  (((uint32_t)num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) |
                                  (((uint32_t)pid << 29) & USB_OTG_HCTSIZ_DPID);
 
-    if (!(ep_addr & 0x80)) {
-        chan->dir_in = false;
-        usb_dcache_clean((uintptr_t)buf, USB_ALIGN_UP(size, CONFIG_USB_ALIGN_SIZE));
+    /* xfer_buff MUST be 32-bits aligned */
+    USB_OTG_HC(ch_num)->HCDMA = (uint32_t)buf;
+
+    is_oddframe = (((uint32_t)USB_OTG_HOST->HFNUM & 0x01U) != 0U) ? 0U : 1U;
+    USB_OTG_HC(ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM;
+    USB_OTG_HC(ch_num)->HCCHAR |= (uint32_t)is_oddframe << 29;
+
+    /* Set host channel enable */
+    tmpreg = USB_OTG_HC(ch_num)->HCCHAR;
+    tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
+    tmpreg |= USB_OTG_HCCHAR_CHENA;
+    USB_OTG_HC(ch_num)->HCCHAR = tmpreg;
+}
+
+static inline void dwc2_chan_enable_csplit(struct usbh_bus *bus, uint8_t ch_num, bool enable)
+{
+    if (enable) {
+        USB_OTG_HC((uint32_t)ch_num)->HCSPLT |= USB_OTG_HCSPLT_COMPLSPLT;
     } else {
-        chan->dir_in = true;
+        USB_OTG_HC((uint32_t)ch_num)->HCSPLT &= ~USB_OTG_HCSPLT_COMPLSPLT;
     }
+}
 
-    /* xfer_buff MUST be 32-bits aligned */
-    USB_OTG_HC(ch_num)->HCDMA = (uint32_t)buf;
+static inline void dwc2_chan_reenable(struct usbh_bus *bus, uint8_t ch_num)
+{
+    __IO uint32_t tmpreg;
+    uint8_t is_oddframe;
 
     is_oddframe = (((uint32_t)USB_OTG_HOST->HFNUM & 0x01U) != 0U) ? 0U : 1U;
     USB_OTG_HC(ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM;
@@ -338,7 +371,6 @@ static void dwc2_halt(struct usbh_bus *bus, uint8_t ch_num)
     value = USB_OTG_HC(ch_num)->HCCHAR;
     value |= USB_OTG_HCCHAR_CHDIS;
     value |= USB_OTG_HCCHAR_CHENA;
-    value &= ~USB_OTG_HCCHAR_EPDIR;
     USB_OTG_HC(ch_num)->HCCHAR = value;
     do {
         if (++count > 200000U) {
@@ -352,6 +384,7 @@ static void dwc2_halt(struct usbh_bus *bus, uint8_t ch_num)
 static int usbh_reset_port(struct usbh_bus *bus, const uint8_t port)
 {
     __IO uint32_t hprt0 = 0U;
+    volatile uint32_t timeout = 0;
 
     hprt0 = USB_OTG_HPRT;
 
@@ -364,6 +397,14 @@ static int usbh_reset_port(struct usbh_bus *bus, const uint8_t port)
     usb_osal_msleep(10U);
 
     while (!(USB_OTG_HPRT & USB_OTG_HPRT_PENA)) {
+        if (!(USB_OTG_HPRT & USB_OTG_HPRT_PCSTS)) {
+            return -USB_ERR_NOTCONN; /* Port not connected */
+        }
+        timeout++;
+        if (timeout > 10) {
+            USB_LOG_ERR("Reset port timeout\r\n");
+            return -USB_ERR_TIMEOUT;
+        }
         usb_osal_msleep(10U);
     }
     return 0;
@@ -463,6 +504,10 @@ static void dwc2_chan_free(struct dwc2_chan *chan)
     size_t flags;
 
     flags = usb_osal_enter_critical_section();
+    if (chan->urb) {
+        chan->urb->hcpriv = NULL;
+        chan->urb = NULL;
+    }
     chan->inuse = false;
     usb_osal_leave_critical_section(flags);
 }
@@ -519,27 +564,62 @@ static void dwc2_control_urb_init(struct usbh_bus *bus, uint8_t chidx, struct us
     if (chan->ep0_state == DWC2_EP0_STATE_SETUP) /* fill setup */
     {
         chan->num_packets = dwc2_calculate_packet_num(8, 0x00, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen);
-        dwc2_chan_init(bus, chidx, urb->hport->dev_addr, 0x00, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed);
+        dwc2_chan_init(bus,
+                       chidx,
+                       urb->hport->dev_addr,
+                       0x00,
+                       USB_ENDPOINT_TYPE_CONTROL,
+                       USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize),
+                       1,
+                       urb->hport->speed);
         dwc2_chan_transfer(bus, chidx, 0x00, (uint8_t *)setup, chan->xferlen, chan->num_packets, HC_PID_SETUP);
     } else if (chan->ep0_state == DWC2_EP0_STATE_INDATA) /* fill in data */
     {
         chan->num_packets = dwc2_calculate_packet_num(datalen, 0x80, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen);
-        dwc2_chan_init(bus, chidx, urb->hport->dev_addr, 0x80, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed);
+        dwc2_chan_init(bus,
+                       chidx,
+                       urb->hport->dev_addr,
+                       0x80,
+                       USB_ENDPOINT_TYPE_CONTROL,
+                       USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize),
+                       1,
+                       urb->hport->speed);
         dwc2_chan_transfer(bus, chidx, 0x80, buffer, chan->xferlen, chan->num_packets, data_pid);
     } else if (chan->ep0_state == DWC2_EP0_STATE_OUTDATA) /* fill out data */
     {
         chan->num_packets = dwc2_calculate_packet_num(datalen, 0x00, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen);
-        dwc2_chan_init(bus, chidx, urb->hport->dev_addr, 0x00, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed);
+        dwc2_chan_init(bus,
+                       chidx,
+                       urb->hport->dev_addr,
+                       0x00,
+                       USB_ENDPOINT_TYPE_CONTROL,
+                       USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize),
+                       1,
+                       urb->hport->speed);
         dwc2_chan_transfer(bus, chidx, 0x00, buffer, chan->xferlen, chan->num_packets, data_pid);
     } else if (chan->ep0_state == DWC2_EP0_STATE_INSTATUS) /* fill in status */
     {
         chan->num_packets = dwc2_calculate_packet_num(0, 0x80, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen);
-        dwc2_chan_init(bus, chidx, urb->hport->dev_addr, 0x80, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed);
+        dwc2_chan_init(bus,
+                       chidx,
+                       urb->hport->dev_addr,
+                       0x80,
+                       USB_ENDPOINT_TYPE_CONTROL,
+                       USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize),
+                       1,
+                       urb->hport->speed);
         dwc2_chan_transfer(bus, chidx, 0x80, NULL, chan->xferlen, chan->num_packets, HC_PID_DATA1);
     } else if (chan->ep0_state == DWC2_EP0_STATE_OUTSTATUS) /* fill out status */
     {
         chan->num_packets = dwc2_calculate_packet_num(0, 0x00, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen);
-        dwc2_chan_init(bus, chidx, urb->hport->dev_addr, 0x00, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed);
+        dwc2_chan_init(bus,
+                       chidx,
+                       urb->hport->dev_addr,
+                       0x00,
+                       USB_ENDPOINT_TYPE_CONTROL,
+                       USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize),
+                       1,
+                       urb->hport->speed);
         dwc2_chan_transfer(bus, chidx, 0x00, NULL, chan->xferlen, chan->num_packets, HC_PID_DATA1);
     }
 }
@@ -562,7 +642,14 @@ static void dwc2_bulk_intr_urb_init(struct usbh_bus *bus, uint8_t chidx, struct
     }
 
     chan->num_packets = dwc2_calculate_packet_num(datalen, urb->ep->bEndpointAddress, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen);
-    dwc2_chan_init(bus, chidx, urb->hport->dev_addr, urb->ep->bEndpointAddress, USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes), USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed);
+    dwc2_chan_init(bus,
+                   chidx,
+                   urb->hport->dev_addr,
+                   urb->ep->bEndpointAddress,
+                   USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes),
+                   USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize),
+                   USB_GET_MULT(urb->ep->wMaxPacketSize) + 1,
+                   urb->hport->speed);
     dwc2_chan_transfer(bus, chidx, urb->ep->bEndpointAddress, buffer, chan->xferlen, chan->num_packets, urb->data_toggle == 0 ? HC_PID_DATA0 : HC_PID_DATA1);
 }
 
@@ -845,8 +932,7 @@ int usbh_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, u
                         dwc2_drivebus(bus, 1);
                         break;
                     case HUB_PORT_FEATURE_RESET:
-                        usbh_reset_port(bus, port);
-                        break;
+                        return usbh_reset_port(bus, port);
 
                     default:
                         return -USB_ERR_NOTSUPP;
@@ -930,11 +1016,6 @@ int usbh_submit_urb(struct usbh_urb *urb)
         return -USB_ERR_BUSY;
     }
 
-    chidx = dwc2_chan_alloc(bus);
-    if (chidx == -1) {
-        return -USB_ERR_NOMEM;
-    }
-
     if (urb->ep->bEndpointAddress & 0x80) {
         /* Check if pipe rx fifo is overflow */
         if (USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize) > (g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_rx_fifo_size * 4)) {
@@ -954,6 +1035,11 @@ int usbh_submit_urb(struct usbh_urb *urb)
         }
     }
 
+    chidx = dwc2_chan_alloc(bus);
+    if (chidx == -1) {
+        return -USB_ERR_NOMEM;
+    }
+
     flags = usb_osal_enter_critical_section();
 
     chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx];
@@ -975,6 +1061,25 @@ int usbh_submit_urb(struct usbh_urb *urb)
 
     usb_osal_leave_critical_section(flags);
 
+    if (urb->setup) {
+        usb_dcache_clean((uintptr_t)urb->setup, USB_ALIGN_UP(sizeof(struct usb_setup_packet), CONFIG_USB_ALIGN_SIZE));
+
+        if (urb->transfer_buffer) {
+            if (urb->setup->bmRequestType & 0x80) {
+                usb_dcache_invalidate((uintptr_t)urb->transfer_buffer, USB_ALIGN_UP(urb->transfer_buffer_length, CONFIG_USB_ALIGN_SIZE));
+            } else {
+                usb_dcache_clean((uintptr_t)urb->transfer_buffer, USB_ALIGN_UP(urb->transfer_buffer_length, CONFIG_USB_ALIGN_SIZE));
+            }
+        }
+    } else if (urb->transfer_buffer && (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) != USB_ENDPOINT_TYPE_ISOCHRONOUS)) {
+        if (urb->ep->bEndpointAddress & 0x80) {
+            usb_dcache_invalidate((uintptr_t)urb->transfer_buffer, USB_ALIGN_UP(urb->transfer_buffer_length, CONFIG_USB_ALIGN_SIZE));
+        } else {
+            usb_dcache_clean((uintptr_t)urb->transfer_buffer, USB_ALIGN_UP(urb->transfer_buffer_length, CONFIG_USB_ALIGN_SIZE));
+        }
+    } else {
+    }
+
     switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) {
         case USB_ENDPOINT_TYPE_CONTROL:
             chan->ep0_state = DWC2_EP0_STATE_SETUP;
@@ -1026,8 +1131,6 @@ int usbh_kill_urb(struct usbh_urb *urb)
 
     dwc2_halt(bus, chan->chidx);
 
-    chan->urb = NULL;
-    urb->hcpriv = NULL;
     urb->errorcode = -USB_ERR_SHUTDOWN;
 
     if (urb->timeout) {
@@ -1036,6 +1139,10 @@ int usbh_kill_urb(struct usbh_urb *urb)
         dwc2_chan_free(chan);
     }
 
+    if (urb->complete) {
+        urb->complete(urb->arg, urb->errorcode);
+    }
+
     usb_osal_leave_critical_section(flags);
 
     return 0;
@@ -1046,8 +1153,6 @@ static inline void dwc2_urb_waitup(struct usbh_urb *urb)
     struct dwc2_chan *chan;
 
     chan = (struct dwc2_chan *)urb->hcpriv;
-    chan->urb = NULL;
-    urb->hcpriv = NULL;
 
     if (urb->timeout) {
         usb_osal_sem_give(chan->waitsem);
@@ -1079,31 +1184,26 @@ static void dwc2_inchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num)
     if (chan_intstatus & USB_OTG_HCINT_CHH) {
         USB_OTG_HC(ch_num)->HCINT = chan_intstatus;
         if (chan_intstatus & USB_OTG_HCINT_XFRC) {
-            urb->errorcode = 0;
-
             uint32_t count = chan->xferlen - (USB_OTG_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_XFRSIZ); /* how many size has received */
-            //uint32_t has_used_packets = chan->num_packets - ((USB_OTG_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_PKTCNT) >> 19); /* how many packets have used */
+            uint8_t data_toggle = ((USB_OTG_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_DPID) >> USB_OTG_HCTSIZ_DPID_Pos);
 
             urb->actual_length += count;
             urb->transfer_buffer_length -= count;
 
-            uint8_t data_toggle = ((USB_OTG_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_DPID) >> USB_OTG_HCTSIZ_DPID_Pos);
-
             if (data_toggle == HC_PID_DATA0) {
                 urb->data_toggle = 0;
             } else {
                 urb->data_toggle = 1;
             }
 
-            if (chan->dir_in) {
-                usb_dcache_invalidate((uintptr_t)urb->transfer_buffer, USB_ALIGN_UP(count, CONFIG_USB_ALIGN_SIZE));
+            if (chan->do_csplit) {
+                chan->do_csplit = 0;
+                dwc2_chan_enable_csplit(bus, ch_num, false);
             }
 
-            chan->do_csplit = 0;
-
             if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_CONTROL) {
                 if (chan->ep0_state == DWC2_EP0_STATE_INDATA) {
-                    if (chan->do_ssplit && urb->transfer_buffer_length > 0) {
+                    if (chan->do_ssplit && urb->transfer_buffer_length > 0 && (count == USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize))) {
                         dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length);
                     } else {
                         chan->ep0_state = DWC2_EP0_STATE_OUTSTATUS;
@@ -1111,6 +1211,7 @@ static void dwc2_inchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num)
                     }
                 } else if (chan->ep0_state == DWC2_EP0_STATE_INSTATUS) {
                     chan->ep0_state = DWC2_EP0_STATE_SETUP;
+                    urb->errorcode = 0;
                     dwc2_urb_waitup(urb);
                 }
             } else if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_ISOCHRONOUS) {
@@ -1118,6 +1219,8 @@ static void dwc2_inchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num)
                 if (chan->do_ssplit && urb->transfer_buffer_length > 0 && (count == USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize))) {
                     dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length);
                 } else {
+                    usb_dcache_invalidate((uintptr_t)urb->transfer_buffer, USB_ALIGN_UP(urb->actual_length, CONFIG_USB_ALIGN_SIZE));
+                    urb->errorcode = 0;
                     dwc2_urb_waitup(urb);
                 }
             }
@@ -1129,20 +1232,20 @@ static void dwc2_inchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num)
             dwc2_urb_waitup(urb);
         } else if (chan_intstatus & USB_OTG_HCINT_NAK) {
             if (chan->do_ssplit) {
-                /*
-                 * Handle NAK for IN/OUT SSPLIT/CSPLIT transfers, bulk, control, and
-                 * interrupt. Re-start the SSPLIT transfer.
-                 */
+                /* restart ssplit transfer */
                 switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) {
                     case USB_ENDPOINT_TYPE_CONTROL:
+                    case USB_ENDPOINT_TYPE_BULK:
                         chan->do_csplit = 0;
-                        dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length);
+                        dwc2_chan_enable_csplit(bus, ch_num, false);
+                        dwc2_chan_reenable(bus, ch_num);
                         break;
-                    case USB_ENDPOINT_TYPE_BULK:
                     case USB_ENDPOINT_TYPE_INTERRUPT:
-                        chan->do_csplit = 0;
-                        dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length);
+                        dwc2_chan_enable_csplit(bus, ch_num, false);
+                        urb->errorcode = -USB_ERR_NAK;
+                        dwc2_urb_waitup(urb);
                         break;
+
                     default:
                         break;
                 }
@@ -1152,46 +1255,17 @@ static void dwc2_inchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num)
             }
         } else if (chan_intstatus & USB_OTG_HCINT_ACK) {
             if (chan->do_ssplit) {
-                /* Handle ACK on SSPLIT. ACK should not occur in CSPLIT. */
-                switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) {
-                    case USB_ENDPOINT_TYPE_CONTROL:
-                        chan->do_csplit = 1;
-                        dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length);
-                        break;
-                    case USB_ENDPOINT_TYPE_BULK:
-                    case USB_ENDPOINT_TYPE_INTERRUPT:
-                        //printf("intr ack, len:%d\r\n", urb->actual_length);
-                        chan->do_csplit = 1;
-                        chan->ssplit_frame = dwc2_get_full_frame_num(bus);
-                        dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length);
-                        break;
-                    default:
-                        break;
-                }
+                /* start ssplit transfer */
+                chan->do_csplit = 1;
+                chan->ssplit_frame = dwc2_get_full_frame_num(bus);
+                dwc2_chan_enable_csplit(bus, ch_num, true);
+                dwc2_chan_reenable(bus, ch_num);
             }
         } else if (chan_intstatus & USB_OTG_HCINT_NYET) {
             if (chan->do_ssplit) {
-                /*
-                 * NYET on CSPLIT
-                 * re-do the CSPLIT immediately on non-periodic
-                 */
-                switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) {
-                    case USB_ENDPOINT_TYPE_CONTROL:
-                        chan->do_csplit = 1;
-                        dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length);
-                        break;
-                    case USB_ENDPOINT_TYPE_BULK:
-                    case USB_ENDPOINT_TYPE_INTERRUPT:
-                        if ((dwc2_get_full_frame_num(bus) - chan->ssplit_frame) > 4) {
-                            chan->do_csplit = 0;
-                        } else {
-                            chan->do_csplit = 1;
-                        }
-                        dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length);
-                        break;
-                    default:
-                        break;
-                }
+                /* restart csplit transfer */
+                dwc2_chan_enable_csplit(bus, ch_num, true);
+                dwc2_chan_reenable(bus, ch_num);
             } else {
                 urb->errorcode = -USB_ERR_NAK;
                 dwc2_urb_waitup(urb);
@@ -1227,12 +1301,11 @@ static void dwc2_outchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num)
     if (chan_intstatus & USB_OTG_HCINT_CHH) {
         USB_OTG_HC(ch_num)->HCINT = chan_intstatus;
         if (chan_intstatus & USB_OTG_HCINT_XFRC) {
-            urb->errorcode = 0;
-
             uint32_t count = USB_OTG_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_XFRSIZ;                                          /* last packet size */
             uint32_t has_used_packets = chan->num_packets - ((USB_OTG_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_PKTCNT) >> 19); /* how many packets have used */
+            uint32_t olen = (has_used_packets - 1) * USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize) + count;              /* the same with urb->actual_length += chan->xferlen; */
+            uint8_t data_toggle = ((USB_OTG_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_DPID) >> USB_OTG_HCTSIZ_DPID_Pos);
 
-            uint32_t olen = (has_used_packets - 1) * USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize) + count; //the same with urb->actual_length += chan->xferlen;
             urb->actual_length += olen;
 
             if (chan->ep0_state == DWC2_EP0_STATE_OUTDATA || urb->setup == NULL) {
@@ -1243,15 +1316,16 @@ static void dwc2_outchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num)
                 }
             }
 
-            uint8_t data_toggle = ((USB_OTG_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_DPID) >> USB_OTG_HCTSIZ_DPID_Pos);
-
             if (data_toggle == HC_PID_DATA0) {
                 urb->data_toggle = 0;
             } else {
                 urb->data_toggle = 1;
             }
 
-            chan->do_csplit = 0;
+            if (chan->do_csplit) {
+                chan->do_csplit = 0;
+                dwc2_chan_enable_csplit(bus, ch_num, false);
+            }
 
             if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_CONTROL) {
                 if (chan->ep0_state == DWC2_EP0_STATE_SETUP) {
@@ -1273,7 +1347,9 @@ static void dwc2_outchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num)
                         dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length);
                     }
                 } else if (chan->ep0_state == DWC2_EP0_STATE_OUTSTATUS) {
+                    usb_dcache_invalidate((uintptr_t)urb->transfer_buffer, USB_ALIGN_UP(urb->actual_length - 8, CONFIG_USB_ALIGN_SIZE));
                     chan->ep0_state = DWC2_EP0_STATE_SETUP;
+                    urb->errorcode = 0;
                     dwc2_urb_waitup(urb);
                 }
             } else if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_ISOCHRONOUS) {
@@ -1281,6 +1357,7 @@ static void dwc2_outchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num)
                 if (chan->do_ssplit && urb->transfer_buffer_length > 0) {
                     dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length);
                 } else {
+                    urb->errorcode = 0;
                     dwc2_urb_waitup(urb);
                 }
             }
@@ -1292,20 +1369,20 @@ static void dwc2_outchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num)
             dwc2_urb_waitup(urb);
         } else if (chan_intstatus & USB_OTG_HCINT_NAK) {
             if (chan->do_ssplit) {
-                /*
-                 * Handle NAK for IN/OUT SSPLIT/CSPLIT transfers, bulk, control, and
-                 * interrupt. Re-start the SSPLIT transfer.
-                 */
+                /* restart ssplit transfer */
                 switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) {
                     case USB_ENDPOINT_TYPE_CONTROL:
+                    case USB_ENDPOINT_TYPE_BULK:
                         chan->do_csplit = 0;
-                        dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length);
+                        dwc2_chan_enable_csplit(bus, ch_num, false);
+                        dwc2_chan_reenable(bus, ch_num);
                         break;
-                    case USB_ENDPOINT_TYPE_BULK:
                     case USB_ENDPOINT_TYPE_INTERRUPT:
-                        chan->do_csplit = 0;
-                        dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length);
+                        dwc2_chan_enable_csplit(bus, ch_num, false);
+                        urb->errorcode = -USB_ERR_NAK;
+                        dwc2_urb_waitup(urb);
                         break;
+
                     default:
                         break;
                 }
@@ -1315,45 +1392,17 @@ static void dwc2_outchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num)
             }
         } else if (chan_intstatus & USB_OTG_HCINT_ACK) {
             if (chan->do_ssplit) {
-                /* Handle ACK on SSPLIT. ACK should not occur in CSPLIT. */
-                switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) {
-                    case USB_ENDPOINT_TYPE_CONTROL:
-                        chan->do_csplit = 1;
-                        dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length);
-                        break;
-                    case USB_ENDPOINT_TYPE_BULK:
-                    case USB_ENDPOINT_TYPE_INTERRUPT:
-                        chan->do_csplit = 1;
-                        chan->ssplit_frame = dwc2_get_full_frame_num(bus);
-                        dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length);
-                        break;
-                    default:
-                        break;
-                }
+                /* start ssplit transfer */
+                chan->do_csplit = 1;
+                chan->ssplit_frame = dwc2_get_full_frame_num(bus);
+                dwc2_chan_enable_csplit(bus, ch_num, true);
+                dwc2_chan_reenable(bus, ch_num);
             }
         } else if (chan_intstatus & USB_OTG_HCINT_NYET) {
             if (chan->do_ssplit) {
-                /*
-                 * NYET on CSPLIT
-                 * re-do the CSPLIT immediately on non-periodic
-                 */
-                switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) {
-                    case USB_ENDPOINT_TYPE_CONTROL:
-                        chan->do_csplit = 1;
-                        dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length);
-                        break;
-                    case USB_ENDPOINT_TYPE_BULK:
-                    case USB_ENDPOINT_TYPE_INTERRUPT:
-                        if ((dwc2_get_full_frame_num(bus) - chan->ssplit_frame) > 4) {
-                            chan->do_csplit = 0;
-                        } else {
-                            chan->do_csplit = 1;
-                        }
-                        dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length);
-                        break;
-                    default:
-                        break;
-                }
+                /* restart csplit transfer */
+                dwc2_chan_enable_csplit(bus, ch_num, true);
+                dwc2_chan_reenable(bus, ch_num);
             } else {
                 urb->errorcode = -USB_ERR_NAK;
                 dwc2_urb_waitup(urb);

+ 10 - 6
components/drivers/usb/cherryusb/port/ehci/usb_hc_ehci.c

@@ -99,6 +99,10 @@ static void ehci_qh_free(struct usbh_bus *bus, struct ehci_qh_hw *qh)
     size_t flags;
 
     flags = usb_osal_enter_critical_section();
+    if (qh->urb) {
+        qh->urb->hcpriv = NULL;
+        qh->urb = NULL;
+    }
     qtd = EHCI_ADDR2QTD(qh->first_qtd);
 
     while (qtd) {
@@ -616,8 +620,6 @@ static void ehci_urb_waitup(struct usbh_bus *bus, struct usbh_urb *urb)
     struct ehci_qh_hw *qh;
 
     qh = (struct ehci_qh_hw *)urb->hcpriv;
-    qh->urb = NULL;
-    urb->hcpriv = NULL;
 
     qh->remove_in_iaad = 0;
 
@@ -1335,9 +1337,7 @@ int usbh_kill_urb(struct usbh_urb *urb)
     EHCI_HCOR->usbcmd |= (EHCI_USBCMD_PSEN | EHCI_USBCMD_ASEN);
 
     qh = (struct ehci_qh_hw *)urb->hcpriv;
-    urb->hcpriv = NULL;
     urb->errorcode = -USB_ERR_SHUTDOWN;
-    qh->urb = NULL;
 
     if (urb->timeout) {
         usb_osal_sem_give(qh->waitsem);
@@ -1349,9 +1349,9 @@ int usbh_kill_urb(struct usbh_urb *urb)
         volatile uint32_t timeout = 0;
         EHCI_HCOR->usbcmd |= EHCI_USBCMD_IAAD;
         while (!(EHCI_HCOR->usbsts & EHCI_USBSTS_IAA)) {
-            usb_osal_msleep(1);
             timeout++;
-            if (timeout > 100) {
+            if (timeout > 200000) {
+                USB_LOG_ERR("iaad timeout\r\n");
                 usb_osal_leave_critical_section(flags);
                 return -USB_ERR_TIMEOUT;
             }
@@ -1359,6 +1359,10 @@ int usbh_kill_urb(struct usbh_urb *urb)
         EHCI_HCOR->usbsts = EHCI_USBSTS_IAA;
     }
 
+    if (urb->complete) {
+        urb->complete(urb->arg, urb->errorcode);
+    }
+
     usb_osal_leave_critical_section(flags);
 
     return 0;

+ 1 - 1
components/drivers/usb/cherryusb/port/ehci/usb_hc_ehci.h

@@ -19,7 +19,7 @@
 #define EHCI_ADDR2ITD(x) ((struct ehci_itd_hw *)(uintptr_t)((uint32_t)(x) & ~0x1F))
 
 #ifndef CONFIG_USB_EHCI_QH_NUM
-#define CONFIG_USB_EHCI_QH_NUM CONFIG_USBHOST_PIPE_NUM
+#define CONFIG_USB_EHCI_QH_NUM 10
 #endif
 #ifndef CONFIG_USB_EHCI_QTD_NUM
 #define CONFIG_USB_EHCI_QTD_NUM (CONFIG_USB_EHCI_QH_NUM * 3)

+ 1 - 2
components/drivers/usb/cherryusb/port/fsdev/usb_dc_fsdev.c

@@ -20,9 +20,8 @@
 #define CONFIG_USB_FSDEV_RAM_SIZE 512
 #endif
 
-#ifndef CONFIG_USBDEV_EP_NUM
+#undef CONFIG_USBDEV_EP_NUM
 #define CONFIG_USBDEV_EP_NUM 8
-#endif
 
 #define USB ((USB_TypeDef *)g_usbdev_bus[0].reg_base)
 

+ 1 - 3
components/drivers/usb/cherryusb/port/hpmicro/usb_dc_hpm.c

@@ -8,9 +8,7 @@
 #include "hpm_usb_device.h"
 #include "usb_glue_hpm.h"
 
-#ifndef USB_NUM_BIDIR_ENDPOINTS
-#define USB_NUM_BIDIR_ENDPOINTS CONFIG_USBDEV_EP_NUM
-#endif
+#define USB_NUM_BIDIR_ENDPOINTS USB_SOC_DCD_MAX_ENDPOINT_COUNT
 
 /* USBSTS, USBINTR */
 enum {

+ 3 - 0
components/drivers/usb/cherryusb/port/kinetis/usb_dc_kinetis.c

@@ -6,6 +6,9 @@
 #include "usbd_core.h"
 #include "usb_kinetis_reg.h"
 
+#undef CONFIG_USBDEV_EP_NUM
+#define CONFIG_USBDEV_EP_NUM 16
+
 #define USB_OTG_DEV ((KINETIS_TypeDef *)g_usbdev_bus[busid].reg_base)
 
 /* Endpoint state */

+ 4 - 0
components/drivers/usb/cherryusb/port/musb/README.md

@@ -17,3 +17,7 @@
 ### AllwinnerTech
 
 - F1Cxxx, F2Cxxx
+
+### SIFLI
+
+- SF325X

+ 135 - 62
components/drivers/usb/cherryusb/port/musb/usb_dc_musb.c

@@ -26,13 +26,17 @@
 #define MUSB_IE_OFFSET    0x50
 #define MUSB_EPIDX_OFFSET 0x42
 
-#define MUSB_IND_TXMAP_OFFSET   0x80
-#define MUSB_IND_TXCSRL_OFFSET  0x82
-#define MUSB_IND_TXCSRH_OFFSET  0x83
-#define MUSB_IND_RXMAP_OFFSET   0x84
-#define MUSB_IND_RXCSRL_OFFSET  0x86
-#define MUSB_IND_RXCSRH_OFFSET  0x87
-#define MUSB_IND_RXCOUNT_OFFSET 0x88
+#define MUSB_IND_TXMAP_OFFSET      0x80
+#define MUSB_IND_TXCSRL_OFFSET     0x82
+#define MUSB_IND_TXCSRH_OFFSET     0x83
+#define MUSB_IND_RXMAP_OFFSET      0x84
+#define MUSB_IND_RXCSRL_OFFSET     0x86
+#define MUSB_IND_RXCSRH_OFFSET     0x87
+#define MUSB_IND_RXCOUNT_OFFSET    0x88
+#define MUSB_IND_TXTYPE_OFFSET     0x8C
+#define MUSB_IND_TXINTERVAL_OFFSET 0x8D
+#define MUSB_IND_RXTYPE_OFFSET     0x8E
+#define MUSB_IND_RXINTERVAL_OFFSET 0x8F
 
 #define MUSB_FIFO_OFFSET 0x00
 
@@ -43,6 +47,35 @@
 #define MUSB_TXFIFOADD_OFFSET 0x92
 #define MUSB_RXFIFOADD_OFFSET 0x96
 
+#define MUSB_TXFUNCADDR0_OFFSET 0x98
+#define MUSB_TXHUBADDR0_OFFSET  0x9A
+#define MUSB_TXHUBPORT0_OFFSET  0x9B
+#define MUSB_TXFUNCADDRx_OFFSET 0x98
+#define MUSB_TXHUBADDRx_OFFSET  0x9A
+#define MUSB_TXHUBPORTx_OFFSET  0x9B
+#define MUSB_RXFUNCADDRx_OFFSET 0x9C
+#define MUSB_RXHUBADDRx_OFFSET  0x9E
+#define MUSB_RXHUBPORTx_OFFSET  0x9F
+
+#define USB_TXMAP_BASE(ep_idx)      (USB_BASE + MUSB_IND_TXMAP_OFFSET)
+#define USB_TXCSRL_BASE(ep_idx)     (USB_BASE + MUSB_IND_TXCSRL_OFFSET)
+#define USB_TXCSRH_BASE(ep_idx)     (USB_BASE + MUSB_IND_TXCSRH_OFFSET)
+#define USB_RXMAP_BASE(ep_idx)      (USB_BASE + MUSB_IND_RXMAP_OFFSET)
+#define USB_RXCSRL_BASE(ep_idx)     (USB_BASE + MUSB_IND_RXCSRL_OFFSET)
+#define USB_RXCSRH_BASE(ep_idx)     (USB_BASE + MUSB_IND_RXCSRH_OFFSET)
+#define USB_RXCOUNT_BASE(ep_idx)    (USB_BASE + MUSB_IND_RXCOUNT_OFFSET)
+#define USB_TXTYPE_BASE(ep_idx)     (USB_BASE + MUSB_IND_TXTYPE_OFFSET)
+#define USB_TXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_IND_TXINTERVAL_OFFSET)
+#define USB_RXTYPE_BASE(ep_idx)     (USB_BASE + MUSB_IND_RXTYPE_OFFSET)
+#define USB_RXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_IND_RXINTERVAL_OFFSET)
+
+#define USB_TXADDR_BASE(ep_idx)    (USB_BASE + MUSB_TXFUNCADDRx_OFFSET)
+#define USB_TXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_TXHUBADDRx_OFFSET)
+#define USB_TXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_TXHUBPORTx_OFFSET)
+#define USB_RXADDR_BASE(ep_idx)    (USB_BASE + MUSB_RXFUNCADDRx_OFFSET)
+#define USB_RXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_RXHUBADDRx_OFFSET)
+#define USB_RXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_RXHUBPORTx_OFFSET)
+
 #elif defined(CONFIG_USB_MUSB_CUSTOM)
 #include "musb_custom.h"
 #else
@@ -57,13 +90,17 @@
 
 #define MUSB_EPIDX_OFFSET 0x0E
 
-#define MUSB_IND_TXMAP_OFFSET   0x10
-#define MUSB_IND_TXCSRL_OFFSET  0x12
-#define MUSB_IND_TXCSRH_OFFSET  0x13
-#define MUSB_IND_RXMAP_OFFSET   0x14
-#define MUSB_IND_RXCSRL_OFFSET  0x16
-#define MUSB_IND_RXCSRH_OFFSET  0x17
-#define MUSB_IND_RXCOUNT_OFFSET 0x18
+#define MUSB_IND_TXMAP_OFFSET      0x10
+#define MUSB_IND_TXCSRL_OFFSET     0x12
+#define MUSB_IND_TXCSRH_OFFSET     0x13
+#define MUSB_IND_RXMAP_OFFSET      0x14
+#define MUSB_IND_RXCSRL_OFFSET     0x16
+#define MUSB_IND_RXCSRH_OFFSET     0x17
+#define MUSB_IND_RXCOUNT_OFFSET    0x18
+#define MUSB_IND_TXTYPE_OFFSET     0x1A
+#define MUSB_IND_TXINTERVAL_OFFSET 0x1B
+#define MUSB_IND_RXTYPE_OFFSET     0x1C
+#define MUSB_IND_RXINTERVAL_OFFSET 0x1D
 
 #define MUSB_FIFO_OFFSET 0x20
 
@@ -74,7 +111,38 @@
 #define MUSB_TXFIFOADD_OFFSET 0x64
 #define MUSB_RXFIFOADD_OFFSET 0x66
 
-#endif // CONFIG_USB_MUSB_SUNXI
+#define MUSB_TXFUNCADDR0_OFFSET 0x80
+#define MUSB_TXHUBADDR0_OFFSET  0x82
+#define MUSB_TXHUBPORT0_OFFSET  0x83
+#define MUSB_TXFUNCADDRx_OFFSET 0x88
+#define MUSB_TXHUBADDRx_OFFSET  0x8A
+#define MUSB_TXHUBPORTx_OFFSET  0x8B
+#define MUSB_RXFUNCADDRx_OFFSET 0x8C
+#define MUSB_RXHUBADDRx_OFFSET  0x8E
+#define MUSB_RXHUBPORTx_OFFSET  0x8F
+
+#define MUSB_TXMAP0_OFFSET          0x100
+
+// do not use EPIDX
+#define USB_TXMAP_BASE(ep_idx)      (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx)
+#define USB_TXCSRL_BASE(ep_idx)     (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 2)
+#define USB_TXCSRH_BASE(ep_idx)     (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 3)
+#define USB_RXMAP_BASE(ep_idx)      (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 4)
+#define USB_RXCSRL_BASE(ep_idx)     (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 6)
+#define USB_RXCSRH_BASE(ep_idx)     (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 7)
+#define USB_RXCOUNT_BASE(ep_idx)    (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 8)
+#define USB_TXTYPE_BASE(ep_idx)     (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0A)
+#define USB_TXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0B)
+#define USB_RXTYPE_BASE(ep_idx)     (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0C)
+#define USB_RXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0D)
+
+#define USB_TXADDR_BASE(ep_idx)    (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx)
+#define USB_TXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 2)
+#define USB_TXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 3)
+#define USB_RXADDR_BASE(ep_idx)    (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 4)
+#define USB_RXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 6)
+#define USB_RXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 7)
+#endif
 
 #define USB_FIFO_BASE(ep_idx) (USB_BASE + MUSB_FIFO_OFFSET + 0x4 * ep_idx)
 
@@ -103,8 +171,8 @@ struct musb_ep_state {
 struct musb_udc {
     volatile uint8_t dev_addr;
     __attribute__((aligned(32))) struct usb_setup_packet setup;
-    struct musb_ep_state in_ep[CONFIG_USBDEV_EP_NUM];  /*!< IN endpoint parameters*/
-    struct musb_ep_state out_ep[CONFIG_USBDEV_EP_NUM]; /*!< OUT endpoint parameters */
+    struct musb_ep_state in_ep[CONFIG_USB_MUSB_EP_NUM];  /*!< IN endpoint parameters*/
+    struct musb_ep_state out_ep[CONFIG_USB_MUSB_EP_NUM]; /*!< OUT endpoint parameters */
 } g_musb_udc;
 
 static volatile uint8_t usb_ep0_state = USB_EP0_STATE_SETUP;
@@ -342,7 +410,7 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
         return 0;
     }
 
-    USB_ASSERT_MSG(ep_idx < CONFIG_USBDEV_EP_NUM, "Ep addr %02x overflow", ep->bEndpointAddress);
+    USB_ASSERT_MSG(ep_idx < CONFIG_USB_MUSB_EP_NUM, "Ep addr %02x overflow", ep->bEndpointAddress);
 
     old_ep_idx = musb_get_active_ep();
     musb_set_active_ep(ep_idx);
@@ -357,7 +425,7 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
                        "Ep %02x fifo is overflow", ep->bEndpointAddress);
 #endif
 
-        HWREGH(USB_BASE + MUSB_IND_RXMAP_OFFSET) = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize);
+        HWREGH(USB_RXMAP_BASE(ep_idx)) = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize);
 
         //
         // Allow auto clearing of RxPktRdy when packet of size max packet
@@ -389,15 +457,15 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
             ui32Register |= USB_RXCSRH1_ISO;
         }
 
-        HWREGB(USB_BASE + MUSB_IND_RXCSRH_OFFSET) = ui32Register;
+        HWREGB(USB_RXCSRH_BASE(ep_idx)) = ui32Register;
 
         // Reset the Data toggle to zero.
-        if (HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) & USB_RXCSRL1_RXRDY)
-            HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) = (USB_RXCSRL1_CLRDT | USB_RXCSRL1_FLUSH);
+        if (HWREGB(USB_RXCSRL_BASE(ep_idx)) & USB_RXCSRL1_RXRDY)
+            HWREGB(USB_RXCSRL_BASE(ep_idx)) = (USB_RXCSRL1_CLRDT | USB_RXCSRL1_FLUSH);
         else
-            HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) = USB_RXCSRL1_CLRDT;
+            HWREGB(USB_RXCSRL_BASE(ep_idx)) = USB_RXCSRL1_CLRDT;
 
-        HWREGB(USB_BASE + MUSB_IND_TXCSRH_OFFSET) &= ~USB_TXCSRH1_MODE;
+        HWREGB(USB_TXCSRH_BASE(ep_idx)) &= ~USB_TXCSRH1_MODE;
     } else {
         g_musb_udc.in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize);
         g_musb_udc.in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes);
@@ -408,7 +476,7 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
                        "Ep %02x fifo is overflow", ep->bEndpointAddress);
 #endif
 
-        HWREGH(USB_BASE + MUSB_IND_TXMAP_OFFSET) = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize);
+        HWREGH(USB_TXMAP_BASE(ep_idx)) = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize);
 
         //
         // Allow auto setting of TxPktRdy when max packet size has been loaded
@@ -434,13 +502,13 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
             ui32Register |= USB_TXCSRH1_ISO;
         }
 
-        HWREGB(USB_BASE + MUSB_IND_TXCSRH_OFFSET) = ui32Register | USB_TXCSRH1_MODE;
+        HWREGB(USB_TXCSRH_BASE(ep_idx)) = ui32Register | USB_TXCSRH1_MODE;
 
         // Reset the Data toggle to zero.
-        if (HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) & USB_TXCSRL1_TXRDY)
-            HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = (USB_TXCSRL1_CLRDT | USB_TXCSRL1_FLUSH);
+        if (HWREGB(USB_TXCSRL_BASE(ep_idx)) & USB_TXCSRL1_TXRDY)
+            HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_TXCSRL1_CLRDT | USB_TXCSRL1_FLUSH);
         else
-            HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_TXCSRL1_CLRDT;
+            HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_TXCSRL1_CLRDT;
     }
 
     musb_set_active_ep(old_ep_idx);
@@ -464,16 +532,16 @@ int usbd_ep_set_stall(uint8_t busid, const uint8_t ep)
     if (USB_EP_DIR_IS_OUT(ep)) {
         if (ep_idx == 0x00) {
             usb_ep0_state = USB_EP0_STATE_STALL;
-            HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) |= (USB_CSRL0_STALL | USB_CSRL0_RXRDYC);
+            HWREGB(USB_TXCSRL_BASE(ep_idx)) |= (USB_CSRL0_STALL | USB_CSRL0_RXRDYC);
         } else {
-            HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) |= USB_RXCSRL1_STALL;
+            HWREGB(USB_RXCSRL_BASE(ep_idx)) |= USB_RXCSRL1_STALL;
         }
     } else {
         if (ep_idx == 0x00) {
             usb_ep0_state = USB_EP0_STATE_STALL;
-            HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) |= (USB_CSRL0_STALL | USB_CSRL0_RXRDYC);
+            HWREGB(USB_TXCSRL_BASE(ep_idx)) |= (USB_CSRL0_STALL | USB_CSRL0_RXRDYC);
         } else {
-            HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) |= USB_TXCSRL1_STALL;
+            HWREGB(USB_TXCSRL_BASE(ep_idx)) |= USB_TXCSRL1_STALL;
         }
     }
 
@@ -491,21 +559,21 @@ int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep)
 
     if (USB_EP_DIR_IS_OUT(ep)) {
         if (ep_idx == 0x00) {
-            HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_CSRL0_STALLED;
+            HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_CSRL0_STALLED;
         } else {
             // Clear the stall on an OUT endpoint.
-            HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) &= ~(USB_RXCSRL1_STALL | USB_RXCSRL1_STALLED);
+            HWREGB(USB_RXCSRL_BASE(ep_idx)) &= ~(USB_RXCSRL1_STALL | USB_RXCSRL1_STALLED);
             // Reset the data toggle.
-            HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) |= USB_RXCSRL1_CLRDT;
+            HWREGB(USB_RXCSRL_BASE(ep_idx)) |= USB_RXCSRL1_CLRDT;
         }
     } else {
         if (ep_idx == 0x00) {
-            HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_CSRL0_STALLED;
+            HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_CSRL0_STALLED;
         } else {
             // Clear the stall on an IN endpoint.
-            HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~(USB_TXCSRL1_STALL | USB_TXCSRL1_STALLED);
+            HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~(USB_TXCSRL1_STALL | USB_TXCSRL1_STALLED);
             // Reset the data toggle.
-            HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) |= USB_TXCSRL1_CLRDT;
+            HWREGB(USB_TXCSRL_BASE(ep_idx)) |= USB_TXCSRL1_CLRDT;
         }
     }
 
@@ -522,13 +590,13 @@ int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled)
     musb_set_active_ep(ep_idx);
 
     if (USB_EP_DIR_IS_OUT(ep)) {
-        if (HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) & USB_RXCSRL1_STALL) {
+        if (HWREGB(USB_RXCSRL_BASE(ep_idx)) & USB_RXCSRL1_STALL) {
             *stalled = 1;
         } else {
             *stalled = 0;
         }
     } else {
-        if (HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) & USB_TXCSRL1_STALL) {
+        if (HWREGB(USB_TXCSRL_BASE(ep_idx)) & USB_TXCSRL1_STALL) {
             *stalled = 1;
         } else {
             *stalled = 0;
@@ -553,7 +621,7 @@ int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, ui
     old_ep_idx = musb_get_active_ep();
     musb_set_active_ep(ep_idx);
 
-    if (HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) & USB_TXCSRL1_TXRDY) {
+    if (HWREGB(USB_TXCSRL_BASE(ep_idx)) & USB_TXCSRL1_TXRDY) {
         musb_set_active_ep(old_ep_idx);
         return -3;
     }
@@ -569,9 +637,9 @@ int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, ui
             } else {
                 usb_ep0_state = USB_EP0_STATE_IN_ZLP;
             }
-            HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = (USB_CSRL0_TXRDY | USB_CSRL0_DATAEND);
+            HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_CSRL0_TXRDY | USB_CSRL0_DATAEND);
         } else {
-            HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_TXCSRL1_TXRDY;
+            HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_TXCSRL1_TXRDY;
             HWREGH(USB_BASE + MUSB_TXIE_OFFSET) |= (1 << ep_idx);
         }
         musb_set_active_ep(old_ep_idx);
@@ -585,12 +653,12 @@ int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, ui
     if (ep_idx == 0x00) {
         usb_ep0_state = USB_EP0_STATE_IN_DATA;
         if (data_len < g_musb_udc.in_ep[ep_idx].ep_mps) {
-            HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = (USB_CSRL0_TXRDY | USB_CSRL0_DATAEND);
+            HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_CSRL0_TXRDY | USB_CSRL0_DATAEND);
         } else {
-            HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_TXRDY;
+            HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_TXRDY;
         }
     } else {
-        HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_TXCSRL1_TXRDY;
+        HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_TXCSRL1_TXRDY;
     }
 
     musb_set_active_ep(old_ep_idx);
@@ -634,17 +702,18 @@ int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t
 
 static void handle_ep0(void)
 {
-    uint8_t ep0_status = HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET);
+    uint8_t ep_idx = 0; // EP0 index is always 0
+    uint8_t ep0_status = HWREGB(USB_TXCSRL_BASE(ep_idx));
     uint16_t read_count;
 
     if (ep0_status & USB_CSRL0_STALLED) {
-        HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_CSRL0_STALLED;
+        HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_CSRL0_STALLED;
         usb_ep0_state = USB_EP0_STATE_SETUP;
         return;
     }
 
     if (ep0_status & USB_CSRL0_SETEND) {
-        HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_SETENDC;
+        HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_SETENDC;
     }
 
     if (g_musb_udc.dev_addr > 0) {
@@ -655,7 +724,7 @@ static void handle_ep0(void)
     switch (usb_ep0_state) {
         case USB_EP0_STATE_SETUP:
             if (ep0_status & USB_CSRL0_RXRDY) {
-                read_count = HWREGH(USB_BASE + MUSB_IND_RXCOUNT_OFFSET);
+                read_count = HWREGH(USB_RXCOUNT_BASE(ep_idx));
 
                 if (read_count != 8) {
                     return;
@@ -663,9 +732,9 @@ static void handle_ep0(void)
 
                 musb_read_packet(0, (uint8_t *)&g_musb_udc.setup, 8);
                 if (g_musb_udc.setup.wLength) {
-                    HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_RXRDYC;
+                    HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_RXRDYC;
                 } else {
-                    HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = (USB_CSRL0_RXRDYC | USB_CSRL0_DATAEND);
+                    HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_CSRL0_RXRDYC | USB_CSRL0_DATAEND);
                 }
 
                 usbd_event_ep0_setup_complete_handler(0, (uint8_t *)&g_musb_udc.setup);
@@ -686,7 +755,7 @@ static void handle_ep0(void)
             break;
         case USB_EP0_STATE_OUT_DATA:
             if (ep0_status & USB_CSRL0_RXRDY) {
-                read_count = HWREGH(USB_BASE + MUSB_IND_RXCOUNT_OFFSET);
+                read_count = HWREGH(USB_RXCOUNT_BASE(ep_idx));
 
                 musb_read_packet(0, g_musb_udc.out_ep[0].xfer_buf, read_count);
                 g_musb_udc.out_ep[0].xfer_buf += read_count;
@@ -694,10 +763,10 @@ static void handle_ep0(void)
 
                 if (read_count < g_musb_udc.out_ep[0].ep_mps) {
                     usbd_event_ep_out_complete_handler(0, 0x00, g_musb_udc.out_ep[0].actual_xfer_len);
-                    HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = (USB_CSRL0_RXRDYC | USB_CSRL0_DATAEND);
+                    HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_CSRL0_RXRDYC | USB_CSRL0_DATAEND);
                     usb_ep0_state = USB_EP0_STATE_IN_STATUS;
                 } else {
-                    HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_RXRDYC;
+                    HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_RXRDYC;
                 }
             }
             break;
@@ -718,6 +787,10 @@ void USBD_IRQHandler(uint8_t busid)
     uint8_t ep_idx;
     uint16_t write_count, read_count;
 
+    if (HWREGB(USB_BASE + MUSB_DEVCTL_OFFSET) & USB_DEVCTL_HOST) {
+        return;
+    }
+
     is = HWREGB(USB_BASE + MUSB_IS_OFFSET);
     txis = HWREGH(USB_BASE + MUSB_TXIS_OFFSET);
     rxis = HWREGH(USB_BASE + MUSB_RXIS_OFFSET);
@@ -764,8 +837,8 @@ void USBD_IRQHandler(uint8_t busid)
         if (txis & (1 << ep_idx)) {
             musb_set_active_ep(ep_idx);
             HWREGH(USB_BASE + MUSB_TXIS_OFFSET) = (1 << ep_idx);
-            if (HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) & USB_TXCSRL1_UNDRN) {
-                HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_TXCSRL1_UNDRN;
+            if (HWREGB(USB_TXCSRL_BASE(ep_idx)) & USB_TXCSRL1_UNDRN) {
+                HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_TXCSRL1_UNDRN;
             }
 
             if (g_musb_udc.in_ep[ep_idx].xfer_len > g_musb_udc.in_ep[ep_idx].ep_mps) {
@@ -785,7 +858,7 @@ void USBD_IRQHandler(uint8_t busid)
                 write_count = MIN(g_musb_udc.in_ep[ep_idx].xfer_len, g_musb_udc.in_ep[ep_idx].ep_mps);
 
                 musb_write_packet(ep_idx, g_musb_udc.in_ep[ep_idx].xfer_buf, write_count);
-                HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_TXCSRL1_TXRDY;
+                HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_TXCSRL1_TXRDY;
             }
 
             txis &= ~(1 << ep_idx);
@@ -799,11 +872,11 @@ void USBD_IRQHandler(uint8_t busid)
         if (rxis & (1 << ep_idx)) {
             musb_set_active_ep(ep_idx);
             HWREGH(USB_BASE + MUSB_RXIS_OFFSET) = (1 << ep_idx);
-            if (HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) & USB_RXCSRL1_RXRDY) {
-                read_count = HWREGH(USB_BASE + MUSB_IND_RXCOUNT_OFFSET);
+            if (HWREGB(USB_RXCSRL_BASE(ep_idx)) & USB_RXCSRL1_RXRDY) {
+                read_count = HWREGH(USB_RXCOUNT_BASE(ep_idx));
 
                 musb_read_packet(ep_idx, g_musb_udc.out_ep[ep_idx].xfer_buf, read_count);
-                HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) &= ~(USB_RXCSRL1_RXRDY);
+                HWREGB(USB_RXCSRL_BASE(ep_idx)) &= ~(USB_RXCSRL1_RXRDY);
 
                 g_musb_udc.out_ep[ep_idx].xfer_buf += read_count;
                 g_musb_udc.out_ep[ep_idx].actual_xfer_len += read_count;

+ 2 - 2
components/drivers/usb/cherryusb/port/musb/usb_glue_bk.c

@@ -94,11 +94,11 @@
 #define NANENG_PHY_FC_REG1E (0x1E * 4)
 #define NANENG_PHY_FC_REG1F (0x1F * 4)
 
-#if CONFIG_USBDEV_EP_NUM != 8
+#if CONFIG_USB_MUSB_EP_NUM != 8
 #error beken chips only support 8 endpoints
 #endif
 
-#if CONFIG_USBHOST_PIPE_NUM != 8
+#if CONFIG_USB_MUSB_PIPE_NUM != 8
 #error beken chips only support 8 pipes
 #endif
 

+ 2 - 2
components/drivers/usb/cherryusb/port/musb/usb_glue_es.c

@@ -7,11 +7,11 @@
 #include "stdint.h"
 #include "usb_musb_reg.h"
 
-#if CONFIG_USBDEV_EP_NUM != 6
+#if CONFIG_USB_MUSB_EP_NUM != 6
 #error es32 chips only support 6 endpoints
 #endif
 
-#if CONFIG_USBHOST_PIPE_NUM != 6
+#if CONFIG_USB_MUSB_PIPE_NUM != 6
 #error es32 chips only support 6 pipes
 #endif
 

+ 2 - 2
components/drivers/usb/cherryusb/port/musb/usb_glue_sunxi.c

@@ -11,11 +11,11 @@
 #error must define CONFIG_USB_MUSB_SUNXI when use sunxi chips
 #endif
 
-#if CONFIG_USBDEV_EP_NUM != 4
+#if CONFIG_USB_MUSB_EP_NUM != 4
 #error sunxi chips only support 4 endpoints
 #endif
 
-#if CONFIG_USBHOST_PIPE_NUM != 4
+#if CONFIG_USB_MUSB_PIPE_NUM != 4
 #error sunxi chips only support 4 pipes
 #endif
 

+ 134 - 86
components/drivers/usb/cherryusb/port/musb/usb_hc_musb.c

@@ -16,7 +16,7 @@
 
 #define USB_BASE (bus->hcd.reg_base)
 
-#ifdef CONFIG_USB_MUSB_SUNXI
+#if defined(CONFIG_USB_MUSB_SUNXI)
 #define MUSB_FADDR_OFFSET 0x98
 #define MUSB_POWER_OFFSET 0x40
 #define MUSB_TXIS_OFFSET  0x44
@@ -58,6 +58,18 @@
 #define MUSB_RXHUBADDRx_OFFSET  0x9E
 #define MUSB_RXHUBPORTx_OFFSET  0x9F
 
+#define USB_TXMAP_BASE(ep_idx)      (USB_BASE + MUSB_IND_TXMAP_OFFSET)
+#define USB_TXCSRL_BASE(ep_idx)     (USB_BASE + MUSB_IND_TXCSRL_OFFSET)
+#define USB_TXCSRH_BASE(ep_idx)     (USB_BASE + MUSB_IND_TXCSRH_OFFSET)
+#define USB_RXMAP_BASE(ep_idx)      (USB_BASE + MUSB_IND_RXMAP_OFFSET)
+#define USB_RXCSRL_BASE(ep_idx)     (USB_BASE + MUSB_IND_RXCSRL_OFFSET)
+#define USB_RXCSRH_BASE(ep_idx)     (USB_BASE + MUSB_IND_RXCSRH_OFFSET)
+#define USB_RXCOUNT_BASE(ep_idx)    (USB_BASE + MUSB_IND_RXCOUNT_OFFSET)
+#define USB_TXTYPE_BASE(ep_idx)     (USB_BASE + MUSB_IND_TXTYPE_OFFSET)
+#define USB_TXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_IND_TXINTERVAL_OFFSET)
+#define USB_RXTYPE_BASE(ep_idx)     (USB_BASE + MUSB_IND_RXTYPE_OFFSET)
+#define USB_RXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_IND_RXINTERVAL_OFFSET)
+
 #define USB_TXADDR_BASE(ep_idx)    (USB_BASE + MUSB_TXFUNCADDRx_OFFSET)
 #define USB_TXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_TXHUBADDRx_OFFSET)
 #define USB_TXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_TXHUBPORTx_OFFSET)
@@ -110,6 +122,21 @@
 #define MUSB_RXHUBADDRx_OFFSET  0x8E
 #define MUSB_RXHUBPORTx_OFFSET  0x8F
 
+#define MUSB_TXMAP0_OFFSET          0x100
+
+// do not use EPIDX
+#define USB_TXMAP_BASE(ep_idx)      (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx)
+#define USB_TXCSRL_BASE(ep_idx)     (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 2)
+#define USB_TXCSRH_BASE(ep_idx)     (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 3)
+#define USB_RXMAP_BASE(ep_idx)      (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 4)
+#define USB_RXCSRL_BASE(ep_idx)     (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 6)
+#define USB_RXCSRH_BASE(ep_idx)     (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 7)
+#define USB_RXCOUNT_BASE(ep_idx)    (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 8)
+#define USB_TXTYPE_BASE(ep_idx)     (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0A)
+#define USB_TXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0B)
+#define USB_RXTYPE_BASE(ep_idx)     (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0C)
+#define USB_RXINTERVAL_BASE(ep_idx) (USB_BASE + MUSB_TXMAP0_OFFSET + 0x10 * ep_idx + 0x0D)
+
 #define USB_TXADDR_BASE(ep_idx)    (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx)
 #define USB_TXHUBADDR_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 2)
 #define USB_TXHUBPORT_BASE(ep_idx) (USB_BASE + MUSB_TXFUNCADDR0_OFFSET + 0x8 * ep_idx + 3)
@@ -141,7 +168,7 @@ struct musb_hcd {
     volatile bool port_csc;
     volatile bool port_pec;
     volatile bool port_pe;
-    struct musb_pipe pipe_pool[CONFIG_USBHOST_PIPE_NUM];
+    struct musb_pipe pipe_pool[CONFIG_USB_MUSB_PIPE_NUM];
 } g_musb_hcd[CONFIG_USBHOST_MAX_BUS];
 
 /* get current active ep */
@@ -160,15 +187,15 @@ static void musb_fifo_flush(struct usbh_bus *bus, uint8_t ep)
 {
     uint8_t ep_idx = ep & 0x7f;
     if (ep_idx == 0) {
-        if ((HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) & (USB_CSRL0_RXRDY | USB_CSRL0_TXRDY)) != 0)
-            HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) |= USB_CSRH0_FLUSH;
+        if ((HWREGB(USB_TXCSRL_BASE(ep_idx)) & (USB_CSRL0_RXRDY | USB_CSRL0_TXRDY)) != 0)
+            HWREGB(USB_RXCSRL_BASE(ep_idx)) |= USB_CSRH0_FLUSH;
     } else {
         if (ep & 0x80) {
-            if (HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) & USB_TXCSRL1_TXRDY)
-                HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) |= USB_TXCSRL1_FLUSH;
+            if (HWREGB(USB_TXCSRL_BASE(ep_idx)) & USB_TXCSRL1_TXRDY)
+                HWREGB(USB_TXCSRL_BASE(ep_idx)) |= USB_TXCSRL1_FLUSH;
         } else {
-            if (HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) & USB_RXCSRL1_RXRDY)
-                HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) |= USB_RXCSRL1_FLUSH;
+            if (HWREGB(USB_RXCSRL_BASE(ep_idx)) & USB_RXCSRL1_RXRDY)
+                HWREGB(USB_RXCSRL_BASE(ep_idx)) |= USB_RXCSRL1_FLUSH;
         }
     }
 }
@@ -302,12 +329,12 @@ void musb_control_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb
     }
 
     HWREGB(USB_TXADDR_BASE(chidx)) = urb->hport->dev_addr;
-    HWREGB(USB_BASE + MUSB_IND_TXTYPE_OFFSET) = speed;
+    HWREGB(USB_TXTYPE_BASE(chidx)) = speed;
     HWREGB(USB_TXHUBADDR_BASE(chidx)) = 0;
     HWREGB(USB_TXHUBPORT_BASE(chidx)) = 0;
 
     musb_write_packet(bus, chidx, (uint8_t *)setup, 8);
-    HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_TXRDY | USB_CSRL0_SETUP;
+    HWREGB(USB_TXCSRL_BASE(chidx)) = USB_CSRL0_TXRDY | USB_CSRL0_SETUP;
     musb_set_active_ep(bus, old_ep_index);
 }
 
@@ -334,12 +361,13 @@ int musb_bulk_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb
         }
 
         HWREGB(USB_RXADDR_BASE(chidx)) = urb->hport->dev_addr;
-        HWREGB(USB_BASE + MUSB_IND_RXTYPE_OFFSET) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_BULK;
-        HWREGB(USB_BASE + MUSB_IND_RXINTERVAL_OFFSET) = 0;
+        HWREGB(USB_RXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_BULK;
+        HWREGH(USB_RXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize);
+        HWREGB(USB_RXINTERVAL_BASE(chidx)) = 0;
         HWREGB(USB_RXHUBADDR_BASE(chidx)) = 0;
         HWREGB(USB_RXHUBPORT_BASE(chidx)) = 0;
-        HWREGB(USB_BASE + MUSB_IND_TXCSRH_OFFSET) &= ~USB_TXCSRH1_MODE;
-        HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) = USB_RXCSRL1_REQPKT;
+        HWREGB(USB_TXCSRH_BASE(chidx)) &= ~USB_TXCSRH1_MODE;
+        HWREGB(USB_RXCSRL_BASE(chidx)) = USB_RXCSRL1_REQPKT;
 
         HWREGH(USB_BASE + MUSB_RXIE_OFFSET) |= (1 << chidx);
     } else {
@@ -349,8 +377,9 @@ int musb_bulk_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb
         }
 
         HWREGB(USB_TXADDR_BASE(chidx)) = urb->hport->dev_addr;
-        HWREGB(USB_BASE + MUSB_IND_TXTYPE_OFFSET) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_BULK;
-        HWREGB(USB_BASE + MUSB_IND_TXINTERVAL_OFFSET) = 0;
+        HWREGB(USB_TXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_BULK;
+        HWREGH(USB_TXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize);
+        HWREGB(USB_TXINTERVAL_BASE(chidx)) = 0;
         HWREGB(USB_TXHUBADDR_BASE(chidx)) = 0;
         HWREGB(USB_TXHUBPORT_BASE(chidx)) = 0;
 
@@ -359,8 +388,8 @@ int musb_bulk_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb
         }
 
         musb_write_packet(bus, chidx, buffer, buflen);
-        HWREGB(USB_BASE + MUSB_IND_TXCSRH_OFFSET) |= USB_TXCSRH1_MODE;
-        HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_TXCSRL1_TXRDY;
+        HWREGB(USB_TXCSRH_BASE(chidx)) |= USB_TXCSRH1_MODE;
+        HWREGB(USB_TXCSRL_BASE(chidx)) = USB_TXCSRL1_TXRDY;
 
         HWREGH(USB_BASE + MUSB_TXIE_OFFSET) |= (1 << chidx);
     }
@@ -391,12 +420,13 @@ int musb_intr_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb
         }
 
         HWREGB(USB_RXADDR_BASE(chidx)) = urb->hport->dev_addr;
-        HWREGB(USB_BASE + MUSB_IND_RXTYPE_OFFSET) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_INT;
-        HWREGB(USB_BASE + MUSB_IND_RXINTERVAL_OFFSET) = urb->ep->bInterval;
+        HWREGB(USB_RXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_INT;
+        HWREGH(USB_RXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize);
+        HWREGB(USB_RXINTERVAL_BASE(chidx)) = urb->ep->bInterval;
         HWREGB(USB_RXHUBADDR_BASE(chidx)) = 0;
         HWREGB(USB_RXHUBPORT_BASE(chidx)) = 0;
-        HWREGB(USB_BASE + MUSB_IND_TXCSRH_OFFSET) &= ~USB_TXCSRH1_MODE;
-        HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) = USB_RXCSRL1_REQPKT;
+        HWREGB(USB_TXCSRH_BASE(chidx)) &= ~USB_TXCSRH1_MODE;
+        HWREGB(USB_RXCSRL_BASE(chidx)) = USB_RXCSRL1_REQPKT;
 
         HWREGH(USB_BASE + MUSB_RXIE_OFFSET) |= (1 << chidx);
     } else {
@@ -406,8 +436,9 @@ int musb_intr_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb
         }
 
         HWREGB(USB_TXADDR_BASE(chidx)) = urb->hport->dev_addr;
-        HWREGB(USB_BASE + MUSB_IND_TXTYPE_OFFSET) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_INT;
-        HWREGB(USB_BASE + MUSB_IND_TXINTERVAL_OFFSET) = urb->ep->bInterval;
+        HWREGB(USB_TXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_INT;
+        HWREGH(USB_TXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize);
+        HWREGB(USB_TXINTERVAL_BASE(chidx)) = urb->ep->bInterval;
         HWREGB(USB_TXHUBADDR_BASE(chidx)) = 0;
         HWREGB(USB_TXHUBPORT_BASE(chidx)) = 0;
 
@@ -416,8 +447,8 @@ int musb_intr_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb
         }
 
         musb_write_packet(bus, chidx, buffer, buflen);
-        HWREGB(USB_BASE + MUSB_IND_TXCSRH_OFFSET) |= USB_TXCSRH1_MODE;
-        HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_TXCSRL1_TXRDY;
+        HWREGB(USB_TXCSRH_BASE(chidx)) |= USB_TXCSRH1_MODE;
+        HWREGB(USB_TXCSRL_BASE(chidx)) = USB_TXCSRL1_TXRDY;
 
         HWREGH(USB_BASE + MUSB_TXIE_OFFSET) |= (1 << chidx);
     }
@@ -464,7 +495,7 @@ static int musb_pipe_alloc(void)
 {
     int chidx;
 
-    for (chidx = 1; chidx < CONFIG_USBHOST_PIPE_NUM; chidx++) {
+    for (chidx = 1; chidx < CONFIG_USB_MUSB_PIPE_NUM; chidx++) {
         if (!g_musb_hcd[bus->hcd.hcd_id].pipe_pool[chidx].inuse) {
             g_musb_hcd[bus->hcd.hcd_id].pipe_pool[chidx].inuse = true;
             return chidx;
@@ -477,6 +508,10 @@ static int musb_pipe_alloc(void)
 
 static void musb_pipe_free(struct musb_pipe *pipe)
 {
+    if (pipe->urb) {
+        pipe->urb->hcpriv = NULL;
+        pipe->urb = NULL;
+    }
 #if 0
     pipe->inuse = false;
 #endif
@@ -499,14 +534,14 @@ int usb_hc_init(struct usbh_bus *bus)
     uint8_t cfg_num;
     struct musb_fifo_cfg *cfg;
 
+    usb_hc_low_level_init(bus);
+
     memset(&g_musb_hcd[bus->hcd.hcd_id], 0, sizeof(struct musb_hcd));
 
-    for (uint8_t i = 0; i < CONFIG_USBHOST_PIPE_NUM; i++) {
+    for (uint8_t i = 0; i < CONFIG_USB_MUSB_PIPE_NUM; i++) {
         g_musb_hcd[bus->hcd.hcd_id].pipe_pool[i].waitsem = usb_osal_sem_create(0);
     }
 
-    usb_hc_low_level_init(bus);
-
     cfg_num = usbh_get_musb_fifo_cfg(&cfg);
 
     for (uint8_t i = 0; i < cfg_num; i++) {
@@ -530,7 +565,7 @@ int usb_hc_init(struct usbh_bus *bus)
 
 #ifdef CONFIG_USB_MUSB_SUNXI
     musb_set_active_ep(bus, 0);
-    HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_TXRDY;
+    HWREGB(USB_TXCSRL_BASE(0)) = USB_CSRL0_TXRDY;
 #endif
     return 0;
 }
@@ -544,7 +579,7 @@ int usb_hc_deinit(struct usbh_bus *bus)
     HWREGB(USB_BASE + MUSB_POWER_OFFSET) &= ~USB_POWER_HSENAB;
     HWREGB(USB_BASE + MUSB_DEVCTL_OFFSET) &= ~USB_DEVCTL_SESSION;
 
-    for (uint8_t i = 0; i < CONFIG_USBHOST_PIPE_NUM; i++) {
+    for (uint8_t i = 0; i < CONFIG_USB_MUSB_PIPE_NUM; i++) {
         usb_osal_sem_delete(g_musb_hcd[bus->hcd.hcd_id].pipe_pool[i].waitsem);
     }
 
@@ -697,7 +732,7 @@ int usbh_submit_urb(struct usbh_urb *urb)
     } else {
         chidx = (urb->ep->bEndpointAddress & 0x0f);
 
-        if (chidx > (CONFIG_USBHOST_PIPE_NUM - 1)) {
+        if (chidx > (CONFIG_USB_MUSB_PIPE_NUM - 1)) {
             return -USB_ERR_RANGE;
         }
     }
@@ -720,12 +755,14 @@ int usbh_submit_urb(struct usbh_urb *urb)
         case USB_ENDPOINT_TYPE_BULK:
             ret = musb_bulk_urb_init(bus, chidx, urb, urb->transfer_buffer, urb->transfer_buffer_length);
             if (ret < 0) {
+                usb_osal_leave_critical_section(flags);
                 return ret;
             }
             break;
         case USB_ENDPOINT_TYPE_INTERRUPT:
             ret = musb_intr_urb_init(bus, chidx, urb, urb->transfer_buffer, urb->transfer_buffer_length);
             if (ret < 0) {
+                usb_osal_leave_critical_section(flags);
                 return ret;
             }
             break;
@@ -771,9 +808,7 @@ int usbh_kill_urb(struct usbh_urb *urb)
     flags = usb_osal_enter_critical_section();
 
     pipe = (struct musb_pipe *)urb->hcpriv;
-    urb->hcpriv = NULL;
     urb->errorcode = -USB_ERR_SHUTDOWN;
-    pipe->urb = NULL;
 
     if (urb->ep->bEndpointAddress & 0x80) {
         HWREGH(USB_BASE + MUSB_RXIE_OFFSET) &= ~(1 << (urb->ep->bEndpointAddress & 0x0f));
@@ -791,6 +826,10 @@ int usbh_kill_urb(struct usbh_urb *urb)
         musb_pipe_free(pipe);
     }
 
+    if (urb->complete) {
+        urb->complete(urb->arg, urb->errorcode);
+    }
+
     usb_osal_leave_critical_section(flags);
     return 0;
 }
@@ -820,6 +859,7 @@ static void musb_urb_waitup(struct usbh_urb *urb)
 
 void handle_ep0(struct usbh_bus *bus)
 {
+    uint8_t ep_idx = 0;
     uint8_t ep0_status;
     struct musb_pipe *pipe;
     struct usbh_urb *urb;
@@ -832,16 +872,16 @@ void handle_ep0(struct usbh_bus *bus)
     }
 
     musb_set_active_ep(bus, 0);
-    ep0_status = HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET);
+    ep0_status = HWREGB(USB_TXCSRL_BASE(ep_idx));
     if (ep0_status & USB_CSRL0_STALLED) {
-        HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_CSRL0_STALLED;
+        HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_CSRL0_STALLED;
         pipe->ep0_state = USB_EP0_STATE_SETUP;
         urb->errorcode = -USB_ERR_STALL;
         musb_urb_waitup(urb);
         return;
     }
     if (ep0_status & USB_CSRL0_ERROR) {
-        HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_CSRL0_ERROR;
+        HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_CSRL0_ERROR;
         musb_fifo_flush(bus, 0);
         pipe->ep0_state = USB_EP0_STATE_SETUP;
         urb->errorcode = -USB_ERR_IO;
@@ -849,7 +889,7 @@ void handle_ep0(struct usbh_bus *bus)
         return;
     }
     if (ep0_status & USB_CSRL0_STALL) {
-        HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_CSRL0_STALL;
+        HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_CSRL0_STALL;
         pipe->ep0_state = USB_EP0_STATE_SETUP;
         urb->errorcode = -USB_ERR_STALL;
         musb_urb_waitup(urb);
@@ -862,7 +902,7 @@ void handle_ep0(struct usbh_bus *bus)
             if (urb->transfer_buffer_length) {
                 if (urb->setup->bmRequestType & 0x80) {
                     pipe->ep0_state = USB_EP0_STATE_IN_DATA;
-                    HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_REQPKT;
+                    HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_REQPKT;
                 } else {
                     pipe->ep0_state = USB_EP0_STATE_OUT_DATA;
                     size = urb->transfer_buffer_length;
@@ -871,7 +911,7 @@ void handle_ep0(struct usbh_bus *bus)
                     }
 
                     musb_write_packet(bus, 0, urb->transfer_buffer, size);
-                    HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_TXRDY;
+                    HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_TXRDY;
 
                     urb->transfer_buffer += size;
                     urb->transfer_buffer_length -= size;
@@ -879,23 +919,23 @@ void handle_ep0(struct usbh_bus *bus)
                 }
             } else {
                 pipe->ep0_state = USB_EP0_STATE_IN_STATUS;
-                HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = (USB_CSRL0_REQPKT | USB_CSRL0_STATUS);
+                HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_CSRL0_REQPKT | USB_CSRL0_STATUS);
             }
             break;
         case USB_EP0_STATE_IN_DATA:
             if (ep0_status & USB_CSRL0_RXRDY) {
-                size = HWREGH(USB_BASE + MUSB_IND_RXCOUNT_OFFSET);
+                size = HWREGH(USB_RXCOUNT_BASE(ep_idx));
                 musb_read_packet(bus, 0, urb->transfer_buffer, size);
-                HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_CSRL0_RXRDY;
+                HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_CSRL0_RXRDY;
                 urb->transfer_buffer += size;
                 urb->transfer_buffer_length -= size;
                 urb->actual_length += size;
 
                 if ((size < USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) || (urb->transfer_buffer_length == 0)) {
                     pipe->ep0_state = USB_EP0_STATE_OUT_STATUS;
-                    HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = (USB_CSRL0_TXRDY | USB_CSRL0_STATUS);
+                    HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_CSRL0_TXRDY | USB_CSRL0_STATUS);
                 } else {
-                    HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_REQPKT;
+                    HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_REQPKT;
                 }
             }
             break;
@@ -907,14 +947,14 @@ void handle_ep0(struct usbh_bus *bus)
                 }
 
                 musb_write_packet(bus, 0, urb->transfer_buffer, size);
-                HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_TXRDY;
+                HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_CSRL0_TXRDY;
 
                 urb->transfer_buffer += size;
                 urb->transfer_buffer_length -= size;
                 urb->actual_length += size;
             } else {
                 pipe->ep0_state = USB_EP0_STATE_IN_STATUS;
-                HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = (USB_CSRL0_REQPKT | USB_CSRL0_STATUS);
+                HWREGB(USB_TXCSRL_BASE(ep_idx)) = (USB_CSRL0_REQPKT | USB_CSRL0_STATUS);
             }
             break;
         case USB_EP0_STATE_OUT_STATUS:
@@ -923,7 +963,7 @@ void handle_ep0(struct usbh_bus *bus)
             break;
         case USB_EP0_STATE_IN_STATUS:
             if (ep0_status & (USB_CSRL0_RXRDY | USB_CSRL0_STATUS)) {
-                HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~(USB_CSRL0_RXRDY | USB_CSRL0_STATUS);
+                HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~(USB_CSRL0_RXRDY | USB_CSRL0_STATUS);
                 urb->errorcode = 0;
                 musb_urb_waitup(urb);
             }
@@ -947,6 +987,10 @@ void USBH_IRQHandler(uint8_t busid)
 
     bus = &g_usbhost_bus[busid];
 
+    if (!(HWREGB(USB_BASE + MUSB_DEVCTL_OFFSET) & USB_DEVCTL_HOST)) {
+        return;
+    }
+
     is = HWREGB(USB_BASE + MUSB_IS_OFFSET);
     txis = HWREGH(USB_BASE + MUSB_TXIS_OFFSET);
     rxis = HWREGH(USB_BASE + MUSB_RXIS_OFFSET);
@@ -997,7 +1041,7 @@ void USBH_IRQHandler(uint8_t busid)
         handle_ep0(bus);
     }
 
-    for (ep_idx = 1; ep_idx < CONFIG_USBHOST_PIPE_NUM; ep_idx++) {
+    for (ep_idx = 1; ep_idx < CONFIG_USB_MUSB_PIPE_NUM; ep_idx++) {
         if (txis & (1 << ep_idx)) {
             HWREGH(USB_BASE + MUSB_TXIS_OFFSET) = (1 << ep_idx);
 
@@ -1005,45 +1049,47 @@ void USBH_IRQHandler(uint8_t busid)
             urb = pipe->urb;
             musb_set_active_ep(bus, ep_idx);
 
-            ep_csrl_status = HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET);
+            ep_csrl_status = HWREGB(USB_TXCSRL_BASE(ep_idx));
 
             if (ep_csrl_status & USB_TXCSRL1_ERROR) {
-                HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_TXCSRL1_ERROR;
+                HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_TXCSRL1_ERROR;
                 urb->errorcode = -USB_ERR_IO;
                 musb_urb_waitup(urb);
             } else if (ep_csrl_status & USB_TXCSRL1_NAKTO) {
-                HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_TXCSRL1_NAKTO;
+                HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_TXCSRL1_NAKTO;
                 urb->errorcode = -USB_ERR_NAK;
                 musb_urb_waitup(urb);
             } else if (ep_csrl_status & USB_TXCSRL1_STALL) {
-                HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_TXCSRL1_STALL;
+                HWREGB(USB_TXCSRL_BASE(ep_idx)) &= ~USB_TXCSRL1_STALL;
                 urb->errorcode = -USB_ERR_STALL;
                 musb_urb_waitup(urb);
             } else {
-                uint32_t size = urb->transfer_buffer_length;
+                if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) != USB_ENDPOINT_TYPE_ISOCHRONOUS) {
+                    uint32_t size = urb->transfer_buffer_length;
 
-                if (size > USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) {
-                    size = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize);
-                }
+                    if (size > USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) {
+                        size = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize);
+                    }
 
-                urb->transfer_buffer += size;
-                urb->transfer_buffer_length -= size;
-                urb->actual_length += size;
+                    urb->transfer_buffer += size;
+                    urb->transfer_buffer_length -= size;
+                    urb->actual_length += size;
 
-                if (urb->transfer_buffer_length == 0) {
-                    //HWREGH(USB_BASE + MUSB_TXIE_OFFSET) &= ~(1 << ep_idx);
-                    urb->errorcode = 0;
-                    musb_urb_waitup(urb);
-                } else {
-                    musb_write_packet(bus, ep_idx, urb->transfer_buffer, MIN(urb->transfer_buffer_length, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)));
-                    HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_TXCSRL1_TXRDY;
+                    if (urb->transfer_buffer_length == 0) {
+                        //HWREGH(USB_BASE + MUSB_TXIE_OFFSET) &= ~(1 << ep_idx);
+                        urb->errorcode = 0;
+                        musb_urb_waitup(urb);
+                    } else {
+                        musb_write_packet(bus, ep_idx, urb->transfer_buffer, MIN(urb->transfer_buffer_length, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)));
+                        HWREGB(USB_TXCSRL_BASE(ep_idx)) = USB_TXCSRL1_TXRDY;
+                    }
                 }
             }
         }
     }
 
     rxis &= HWREGH(USB_BASE + MUSB_RXIE_OFFSET);
-    for (ep_idx = 1; ep_idx < CONFIG_USBHOST_PIPE_NUM; ep_idx++) {
+    for (ep_idx = 1; ep_idx < CONFIG_USB_MUSB_PIPE_NUM; ep_idx++) {
         if (rxis & (1 << ep_idx)) {
             HWREGH(USB_BASE + MUSB_RXIS_OFFSET) = (1 << ep_idx); // clear isr flag
 
@@ -1051,38 +1097,40 @@ void USBH_IRQHandler(uint8_t busid)
             urb = pipe->urb;
             musb_set_active_ep(bus, ep_idx);
 
-            ep_csrl_status = HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET);
-            //ep_csrh_status = HWREGB(USB_BASE + MUSB_IND_RXCSRH_OFFSET); // todo:for iso transfer
+            ep_csrl_status = HWREGB(USB_RXCSRL_BASE(ep_idx));
+            //ep_csrh_status = HWREGB(USB_BASE + USB_RXCSRH_BASE(ep_idx)); // todo:for iso transfer
 
             if (ep_csrl_status & USB_RXCSRL1_ERROR) {
-                HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) &= ~USB_RXCSRL1_ERROR;
+                HWREGB(USB_RXCSRL_BASE(ep_idx)) &= ~USB_RXCSRL1_ERROR;
                 urb->errorcode = -USB_ERR_IO;
                 musb_urb_waitup(urb);
             } else if (ep_csrl_status & USB_RXCSRL1_NAKTO) {
-                HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) &= ~USB_RXCSRL1_NAKTO;
+                HWREGB(USB_RXCSRL_BASE(ep_idx)) &= ~USB_RXCSRL1_NAKTO;
                 urb->errorcode = -USB_ERR_NAK;
                 musb_urb_waitup(urb);
             } else if (ep_csrl_status & USB_RXCSRL1_STALL) {
-                HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) &= ~USB_RXCSRL1_STALL;
+                HWREGB(USB_RXCSRL_BASE(ep_idx)) &= ~USB_RXCSRL1_STALL;
                 urb->errorcode = -USB_ERR_STALL;
                 musb_urb_waitup(urb);
             } else if (ep_csrl_status & USB_RXCSRL1_RXRDY) {
-                size = HWREGH(USB_BASE + MUSB_IND_RXCOUNT_OFFSET);
+                if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) != USB_ENDPOINT_TYPE_ISOCHRONOUS) {
+                    size = HWREGH(USB_RXCOUNT_BASE(ep_idx));
 
-                musb_read_packet(bus, ep_idx, urb->transfer_buffer, size);
+                    musb_read_packet(bus, ep_idx, urb->transfer_buffer, size);
 
-                HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) &= ~USB_RXCSRL1_RXRDY;
+                    HWREGB(USB_RXCSRL_BASE(ep_idx)) &= ~USB_RXCSRL1_RXRDY;
 
-                urb->transfer_buffer += size;
-                urb->transfer_buffer_length -= size;
-                urb->actual_length += size;
+                    urb->transfer_buffer += size;
+                    urb->transfer_buffer_length -= size;
+                    urb->actual_length += size;
 
-                if ((size < USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) || (urb->transfer_buffer_length == 0)) {
-                    //HWREGH(USB_BASE + MUSB_RXIE_OFFSET) &= ~(1 << ep_idx);
-                    urb->errorcode = 0;
-                    musb_urb_waitup(urb);
-                } else {
-                    HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) = USB_RXCSRL1_REQPKT;
+                    if ((size < USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) || (urb->transfer_buffer_length == 0)) {
+                        //HWREGH(USB_BASE + MUSB_RXIE_OFFSET) &= ~(1 << ep_idx);
+                        urb->errorcode = 0;
+                        musb_urb_waitup(urb);
+                    } else {
+                        HWREGB(USB_RXCSRL_BASE(ep_idx)) = USB_RXCSRL1_REQPKT;
+                    }
                 }
             }
         }

+ 1 - 1
components/drivers/usb/cherryusb/port/nxp/README.md

@@ -12,6 +12,6 @@ Modify USB_NOCACHE_RAM_SECTION
 
 - MCXN9XX/MCXN236 (chipidea + EHCI)
 
-## IMRT
+### IMRT
 
 - IMRT10XX/IMRT11XX (chipidea + EHCI)

+ 1 - 1
components/drivers/usb/cherryusb/port/ohci/usb_hc_ohci.h

@@ -17,7 +17,7 @@
 #define OHCI_ADDR2TD(x) ((struct ohci_td_hw *)(uintptr_t)((uint32_t)(x) & ~0x0F))
 
 #ifndef CONFIG_USB_OHCI_ED_NUM
-#define CONFIG_USB_OHCI_ED_NUM CONFIG_USBHOST_PIPE_NUM
+#define CONFIG_USB_OHCI_ED_NUM 10
 #endif
 #ifndef CONFIG_USB_OHCI_TD_NUM
 #define CONFIG_USB_OHCI_TD_NUM 3

+ 5 - 9
components/drivers/usb/cherryusb/port/rp2040/usb_dc_rp2040.c

@@ -15,10 +15,6 @@
 #define usb_hw_set   hw_set_alias(usb_hw)
 #define usb_hw_clear hw_clear_alias(usb_hw)
 
-#ifndef CONFIG_USBDEV_EP_NUM
-#define CONFIG_USBDEV_EP_NUM 16
-#endif
-
 #ifndef FORCE_VBUS_DETECT
 #define FORCE_VBUS_DETECT 1
 #endif
@@ -43,8 +39,8 @@ struct rp2040_ep_state {
 /* Driver state */
 struct rp2040_udc {
     volatile uint8_t dev_addr;
-    struct rp2040_ep_state in_ep[CONFIG_USBDEV_EP_NUM];  /*!< IN endpoint parameters*/
-    struct rp2040_ep_state out_ep[CONFIG_USBDEV_EP_NUM]; /*!< OUT endpoint parameters */
+    struct rp2040_ep_state in_ep[USB_NUM_ENDPOINTS];  /*!< IN endpoint parameters*/
+    struct rp2040_ep_state out_ep[USB_NUM_ENDPOINTS]; /*!< OUT endpoint parameters */
     struct usb_setup_packet setup;                       /*!< Setup package that may be used in interrupt processing (outside the protocol stack) */
 } g_rp2040_udc;
 
@@ -125,7 +121,7 @@ int usb_dc_init(uint8_t busid)
     g_rp2040_udc.out_ep[0].endpoint_control = NULL;
     g_rp2040_udc.out_ep[0].data_buffer = &usb_dpram->ep0_buf_a[0];
 
-    for (uint32_t i = 0; i < CONFIG_USBDEV_EP_NUM; i++) {
+    for (uint32_t i = 0; i < USB_NUM_ENDPOINTS; i++) {
         g_rp2040_udc.in_ep[i].buffer_control = &usb_dpram->ep_buf_ctrl[i].in;
         g_rp2040_udc.out_ep[i].buffer_control = &usb_dpram->ep_buf_ctrl[i].out;
 
@@ -137,7 +133,7 @@ int usb_dc_init(uint8_t busid)
 
     next_buffer_ptr = &usb_dpram->epx_data[0];
 
-    for (uint32_t i = 1; i < CONFIG_USBDEV_EP_NUM; i++) {
+    for (uint32_t i = 1; i < USB_NUM_ENDPOINTS; i++) {
         g_rp2040_udc.in_ep[i].data_buffer = next_buffer_ptr;
         if (i == 1) {
             next_buffer_ptr += 1024; /* for iso video */
@@ -541,7 +537,7 @@ void USBD_IRQHandler(uint8_t busid)
 
         usb_hw->dev_addr_ctrl = 0;
 
-        for (uint8_t i = 0; i < CONFIG_USBDEV_EP_NUM - 1; i++) {
+        for (uint8_t i = 0; i < USB_NUM_ENDPOINTS - 1; i++) {
             /*!< Start at ep1 */
             usb_dpram->ep_ctrl[i].in = 0;
             usb_dpram->ep_ctrl[i].out = 0;

+ 15 - 10
components/drivers/usb/cherryusb/port/rp2040/usb_hc_rp2040.c

@@ -42,7 +42,7 @@ struct rp2040_hcd {
     volatile bool port_pec;
     volatile bool port_pe;
     usb_osal_mutex_t ep0_mutex;
-    struct rp2040_pipe pipe_pool[1 + CONFIG_USBHOST_PIPE_NUM];
+    struct rp2040_pipe pipe_pool[1 + USB_HOST_INTERRUPT_ENDPOINTS];
 } g_rp2040_hcd[CONFIG_USBHOST_MAX_BUS];
 
 void rp2040_usbh_irq(void);
@@ -53,7 +53,7 @@ static int rp2040_pipe_alloc(struct usbh_bus *bus)
     int chidx;
 
     flags = usb_osal_enter_critical_section();
-    for (chidx = 1; chidx <= CONFIG_USBHOST_PIPE_NUM; chidx++) {
+    for (chidx = 1; chidx <= USB_HOST_INTERRUPT_ENDPOINTS; chidx++) {
         if (!g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[chidx].inuse) {
             g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[chidx].inuse = true;
             usb_osal_leave_critical_section(flags);
@@ -69,6 +69,10 @@ static void rp2040_pipe_free(struct rp2040_pipe *pipe)
     size_t flags;
 
     flags = usb_osal_enter_critical_section();
+    if (pipe->urb) {
+        pipe->urb->hcpriv = NULL;
+        pipe->urb = NULL;
+    }
     pipe->inuse = false;
     usb_osal_leave_critical_section(flags);
 }
@@ -286,7 +290,7 @@ int usb_hc_init(struct usbh_bus *bus)
 
     memset(&g_rp2040_hcd[bus->hcd.hcd_id], 0, sizeof(struct rp2040_hcd));
 
-    for (uint8_t i = 0; i <= CONFIG_USBHOST_PIPE_NUM; i++) {
+    for (uint8_t i = 0; i <= USB_HOST_INTERRUPT_ENDPOINTS; i++) {
         g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i].waitsem = usb_osal_sem_create(0);
         if (g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i].waitsem == NULL) {
             USB_LOG_ERR("Failed to create waitsem\r\n");
@@ -307,7 +311,7 @@ int usb_hc_init(struct usbh_bus *bus)
 
     next_buffer_ptr = &usb_dpram->epx_data[64 * 2];
 
-    for (uint8_t i = 1; i <= CONFIG_USBHOST_PIPE_NUM; i++) {
+    for (uint8_t i = 1; i <= USB_HOST_INTERRUPT_ENDPOINTS; i++) {
         g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i].chidx = i;
         g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i].endpoint_control = &usbh_dpram->int_ep_ctrl[i - 1].ctrl;
         g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i].buffer_control = &usbh_dpram->int_ep_buffer_ctrl[i - 1].ctrl;
@@ -359,7 +363,7 @@ int usb_hc_deinit(struct usbh_bus *bus)
     // Remove shared irq if it was previously added so as not to fill up shared irq slots
     irq_remove_handler(USBCTRL_IRQ, rp2040_usbh_irq);
 
-    for (uint8_t i = 0; i <= CONFIG_USBHOST_PIPE_NUM; i++) {
+    for (uint8_t i = 0; i <= USB_HOST_INTERRUPT_ENDPOINTS; i++) {
         usb_osal_sem_delete(g_rp2040_hcd[bus->hcd.hcd_id].pipe_pool[i].waitsem);
     }
 
@@ -587,9 +591,8 @@ int usbh_kill_urb(struct usbh_urb *urb)
     flags = usb_osal_enter_critical_section();
 
     pipe = (struct rp2040_pipe *)urb->hcpriv;
-    urb->hcpriv = NULL;
     urb->errorcode = -USB_ERR_SHUTDOWN;
-    pipe->urb = NULL;
+
     usb_hw_clear->int_ep_ctrl = 1 << pipe->chidx;
     usb_hw_clear->buf_status = 1 << (pipe->chidx * 2 + 0);
     usb_hw_clear->buf_status = 1 << (pipe->chidx * 2 + 1);
@@ -602,6 +605,10 @@ int usbh_kill_urb(struct usbh_urb *urb)
         rp2040_pipe_free(pipe);
     }
 
+    if (urb->complete) {
+        urb->complete(urb->arg, urb->errorcode);
+    }
+
     usb_osal_leave_critical_section(flags);
 
     return 0;
@@ -612,8 +619,6 @@ static void rp2040_urb_waitup(struct usbh_urb *urb)
     struct rp2040_pipe *pipe;
 
     pipe = (struct rp2040_pipe *)urb->hcpriv;
-    pipe->urb = NULL;
-    urb->hcpriv = NULL;
 
     if (urb->timeout) {
         usb_osal_sem_give(pipe->waitsem);
@@ -697,7 +702,7 @@ static void rp2040_handle_buffer_status(struct usbh_bus *bus)
         }
     }
 
-    for (uint8_t i = 1; remaining_buffers && i <= CONFIG_USBHOST_PIPE_NUM; i++) {
+    for (uint8_t i = 1; remaining_buffers && i <= USB_HOST_INTERRUPT_ENDPOINTS; i++) {
         for (uint8_t j = 0; j < 2; j++) {
             bit = 1 << (i * 2 + j);
             if (remaining_buffers & bit) {