summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2022-06-29 22:16:42 +0800
committersakumisu <[email protected]>2022-06-29 22:22:29 +0800
commitb8e7b0fb178b91a60eb0a2556a452c7bb8e5f5be (patch)
tree4c197cb7693858a279d303259c310a401d74932b
parented37802600241a08c55c77c99f0f242428508d67 (diff)
add dwc2 hs support,fix fifo read write
-rw-r--r--port/dwc2/usb_dc_dwc2.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/port/dwc2/usb_dc_dwc2.c b/port/dwc2/usb_dc_dwc2.c
index aa813d0b..09946a42 100644
--- a/port/dwc2/usb_dc_dwc2.c
+++ b/port/dwc2/usb_dc_dwc2.c
@@ -1,5 +1,6 @@
#include "usbd_core.h"
#include "usb_dwc2_reg.h"
+#include "cmsis_compiler.h"
#define FS_PORT 0
#define HS_PORT 1
@@ -154,17 +155,27 @@ static inline int dwc2_core_init(void)
{
int ret;
#if defined(CONFIG_USB_HS)
+ USB_OTG_GLB->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN);
+ /* Init The ULPI Interface */
+ USB_OTG_GLB->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL);
+
+ /* Select vbus source */
+ USB_OTG_GLB->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI);
+
+ //USB_OTG_GLB->GUSBCFG |= USB_OTG_GUSBCFG_ULPIEVBUSD;
+
+ /* Reset after a PHY select */
+ ret = dwc2_reset();
#else
/* Select FS Embedded PHY */
USB_OTG_GLB->GUSBCFG |= USB_OTG_GUSBCFG_PHYSEL;
-#endif
+
/* Reset after a PHY select */
ret = dwc2_reset();
-
/* Activate the USB Transceiver */
USB_OTG_GLB->GCCFG |= USB_OTG_GCCFG_PWRDWN;
-
+#endif
return ret;
}
@@ -672,6 +683,7 @@ int usbd_ep_is_stalled(const uint8_t ep, uint8_t *stalled)
int usbd_ep_write(const uint8_t ep, const uint8_t *data, uint32_t data_len, uint32_t *ret_bytes)
{
uint8_t ep_idx = USB_EP_GET_IDX(ep);
+ uint32_t *pdest = (uint32_t *)data;
uint32_t len32b;
uint32_t pktcnt;
@@ -724,7 +736,8 @@ int usbd_ep_write(const uint8_t ep, const uint8_t *data, uint32_t data_len, uint
}
for (uint8_t i = 0U; i < len32b; i++) {
- USB_OTG_FIFO(ep_idx) = ((uint32_t *)data)[i];
+ USB_OTG_FIFO(ep_idx) = __UNALIGNED_UINT32_READ(pdest);
+ pdest++;
}
if (ret_bytes) {
@@ -739,8 +752,8 @@ int usbd_ep_read(const uint8_t ep, uint8_t *data, uint32_t max_data_len, uint32_
uint8_t ep_idx = USB_EP_GET_IDX(ep);
uint32_t *pdest = (uint32_t *)data;
uint32_t len32b;
+ //uint32_t pktcnt;
uint32_t read_count;
- uint32_t pktcnt;
if (!data && max_data_len) {
return -1;
@@ -756,11 +769,11 @@ int usbd_ep_read(const uint8_t ep, uint8_t *data, uint32_t max_data_len, uint32_
* pktcnt = N
* xfersize = N * maxpacket
*/
- pktcnt = (uint16_t)((max_data_len + g_dwc2_udc.out_ep[ep_idx].ep_mps - 1U) / g_dwc2_udc.out_ep[ep_idx].ep_mps);
+ //pktcnt = (uint16_t)((max_data_len + g_dwc2_udc.out_ep[ep_idx].ep_mps - 1U) / g_dwc2_udc.out_ep[ep_idx].ep_mps);
USB_OTG_OUTEP(ep_idx)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT);
USB_OTG_OUTEP(ep_idx)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ);
- USB_OTG_OUTEP(ep_idx)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1 << 19));
- USB_OTG_OUTEP(ep_idx)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & g_dwc2_udc.out_ep[ep_idx].ep_mps * pktcnt);
+ //USB_OTG_OUTEP(ep_idx)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1 << 19));
+ //USB_OTG_OUTEP(ep_idx)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & g_dwc2_udc.out_ep[ep_idx].ep_mps);
/* EP enable */
USB_OTG_OUTEP(ep_idx)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA);
}
@@ -775,7 +788,7 @@ int usbd_ep_read(const uint8_t ep, uint8_t *data, uint32_t max_data_len, uint32_
len32b = ((uint32_t)read_count + 3U) / 4U;
for (uint8_t i = 0U; i < len32b; i++) {
- *pdest = USB_OTG_FIFO(0U);
+ __UNALIGNED_UINT32_WRITE(pdest, USB_OTG_FIFO(0));
pdest++;
}