summaryrefslogtreecommitdiff
path: root/port/dwc2
diff options
context:
space:
mode:
authorsakimisu <[email protected]>2023-06-25 22:38:18 +0800
committersakimisu <[email protected]>2023-06-25 22:38:18 +0800
commit8a93ca4bce5d77e98e2fe98338c9accb50737c75 (patch)
tree6719fb95f6008ca3f750f3d844066255fbd889ee /port/dwc2
parent8968b7b3c930cf3c48a2c3e4b66450462b2f82b2 (diff)
remove dap
Diffstat (limited to 'port/dwc2')
-rw-r--r--port/dwc2/usb_hc_dwc2.c56
1 files changed, 33 insertions, 23 deletions
diff --git a/port/dwc2/usb_hc_dwc2.c b/port/dwc2/usb_hc_dwc2.c
index acc7a0fa..b56dd3c5 100644
--- a/port/dwc2/usb_hc_dwc2.c
+++ b/port/dwc2/usb_hc_dwc2.c
@@ -459,12 +459,14 @@ int usb_hc_init(void)
usb_hc_low_level_init();
USB_LOG_INFO("========== DWC2 params ==========\r\n");
- USB_LOG_INFO("CID:%08x\r\n",USB_OTG_GLB->CID);
- USB_LOG_INFO("GSNPSID:%08x\r\n",USB_OTG_GLB->GSNPSID);
- USB_LOG_INFO("GHWCFG1:%08x\r\n",USB_OTG_GLB->GHWCFG1);
- USB_LOG_INFO("GHWCFG2:%08x\r\n",USB_OTG_GLB->GHWCFG2);
- USB_LOG_INFO("GHWCFG3:%08x\r\n",USB_OTG_GLB->GHWCFG3);
- USB_LOG_INFO("GHWCFG4:%08x\r\n",USB_OTG_GLB->GHWCFG4);
+ USB_LOG_INFO("CID:%08x\r\n", USB_OTG_GLB->CID);
+ USB_LOG_INFO("GSNPSID:%08x\r\n", USB_OTG_GLB->GSNPSID);
+ USB_LOG_INFO("GHWCFG1:%08x\r\n", USB_OTG_GLB->GHWCFG1);
+ USB_LOG_INFO("GHWCFG2:%08x\r\n", USB_OTG_GLB->GHWCFG2);
+ USB_LOG_INFO("GHWCFG3:%08x\r\n", USB_OTG_GLB->GHWCFG3);
+ USB_LOG_INFO("GHWCFG4:%08x\r\n", USB_OTG_GLB->GHWCFG4);
+
+ USB_LOG_INFO("dwc2 has %d channels\r\n", ((USB_OTG_GLB->GHWCFG2 & (0x0f << 14)) >> 14) + 1);
if ((USB_OTG_GLB->GHWCFG2 & (0x3U << 3)) == 0U) {
USB_LOG_ERR("This dwc2 version does not support dma, so stop working\r\n");
@@ -747,7 +749,9 @@ int usbh_pipe_free(usbh_pipe_t pipe)
if (!chan) {
return -EINVAL;
}
+
urb = chan->urb;
+
if (urb) {
usbh_kill_urb(urb);
}
@@ -758,7 +762,7 @@ int usbh_pipe_free(usbh_pipe_t pipe)
int usbh_submit_urb(struct usbh_urb *urb)
{
- struct dwc2_pipe *chan;
+ struct dwc2_pipe *pipe;
size_t flags;
int ret = 0;
@@ -766,9 +770,9 @@ int usbh_submit_urb(struct usbh_urb *urb)
return -EINVAL;
}
- chan = urb->pipe;
+ pipe = urb->pipe;
- if (!chan) {
+ if (!pipe) {
return -EINVAL;
}
@@ -777,46 +781,46 @@ int usbh_submit_urb(struct usbh_urb *urb)
return -EINVAL;
}
- if (!chan->hport->connected) {
+ if (!pipe->hport->connected) {
return -ENODEV;
}
- if (chan->urb) {
+ if (pipe->urb) {
return -EBUSY;
}
flags = usb_osal_enter_critical_section();
- chan->waiter = false;
- chan->xfrd = 0;
- chan->urb = urb;
+ pipe->waiter = false;
+ pipe->xfrd = 0;
+ pipe->urb = urb;
urb->errorcode = -EBUSY;
urb->actual_length = 0;
if (urb->timeout > 0) {
- chan->waiter = true;
+ pipe->waiter = true;
}
usb_osal_leave_critical_section(flags);
- switch (chan->ep_type) {
+ switch (pipe->ep_type) {
case USB_ENDPOINT_TYPE_CONTROL:
- chan->ep0_state = DWC2_EP0_STATE_SETUP;
- dwc2_control_pipe_init(chan, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length);
+ pipe->ep0_state = DWC2_EP0_STATE_SETUP;
+ dwc2_control_pipe_init(pipe, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length);
break;
case USB_ENDPOINT_TYPE_BULK:
case USB_ENDPOINT_TYPE_INTERRUPT:
- dwc2_bulk_intr_pipe_init(chan, urb->transfer_buffer, urb->transfer_buffer_length);
+ dwc2_bulk_intr_pipe_init(pipe, urb->transfer_buffer, urb->transfer_buffer_length);
break;
case USB_ENDPOINT_TYPE_ISOCHRONOUS:
- chan->iso_frame_idx = 0;
- dwc2_iso_pipe_init(chan, &urb->iso_packet[chan->iso_frame_idx]);
+ pipe->iso_frame_idx = 0;
+ dwc2_iso_pipe_init(pipe, &urb->iso_packet[pipe->iso_frame_idx]);
break;
default:
break;
}
if (urb->timeout > 0) {
/* wait until timeout or sem give */
- ret = usb_osal_sem_take(chan->waitsem, urb->timeout);
+ ret = usb_osal_sem_take(pipe->waitsem, urb->timeout);
if (ret < 0) {
goto errout_timeout;
}
@@ -825,7 +829,7 @@ int usbh_submit_urb(struct usbh_urb *urb)
}
return ret;
errout_timeout:
- chan->waiter = false;
+ pipe->waiter = false;
usbh_kill_urb(urb);
return ret;
}
@@ -847,6 +851,12 @@ int usbh_kill_urb(struct usbh_urb *urb)
CLEAR_HC_INT(pipe->chidx, USB_OTG_HCINT_CHH);
pipe->urb = NULL;
+ if (pipe->waiter) {
+ pipe->waiter = false;
+ urb->errorcode = -ESHUTDOWN;
+ usb_osal_sem_give(pipe->waitsem);
+ }
+
usb_osal_leave_critical_section(flags);
return 0;