summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2024-03-22 19:31:47 +0800
committersakumisu <[email protected]>2024-03-22 19:31:47 +0800
commitf4a0ba9839ebd9c0bcdcd0e6686279f84b13eb2b (patch)
tree5daa346796da246d19b4abfd4752ea7ed0a97bc0
parent26e2436847cca311cce1f40b7e567473367c46b5 (diff)
dwc2:get next toggle from HCTSIZ
-rw-r--r--port/dwc2/usb_hc_dwc2.c34
1 files changed, 16 insertions, 18 deletions
diff --git a/port/dwc2/usb_hc_dwc2.c b/port/dwc2/usb_hc_dwc2.c
index 64acf2a7..cafe36cf 100644
--- a/port/dwc2/usb_hc_dwc2.c
+++ b/port/dwc2/usb_hc_dwc2.c
@@ -409,7 +409,7 @@ static void dwc2_bulk_intr_urb_init(struct usbh_bus *bus, uint8_t chidx, struct
chan->num_packets = dwc2_calculate_packet_num(buflen, 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_transfer(bus, chidx, urb->ep->bEndpointAddress, (uint32_t *)buffer, chan->xferlen, chan->num_packets, urb->data_toggle);
+ dwc2_chan_transfer(bus, chidx, urb->ep->bEndpointAddress, (uint32_t *)buffer, chan->xferlen, chan->num_packets, urb->data_toggle == 0 ? HC_PID_DATA0 : HC_PID_DATA1);
}
static void dwc2_iso_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, struct usbh_iso_frame_packet *iso_packet)
@@ -479,6 +479,9 @@ int usb_hc_init(struct usbh_bus *bus)
/* Restart the Phy Clock */
USB_OTG_PCGCCTL = 0U;
+ dwc2_drivebus(bus, 1);
+ usb_osal_msleep(200);
+
/* Set default Max speed support */
USB_OTG_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSS);
@@ -509,9 +512,6 @@ int usb_hc_init(struct usbh_bus *bus)
USB_OTG_GLB->GINTMSK |= (USB_OTG_GINTMSK_PRTIM | USB_OTG_GINTMSK_HCIM |
USB_OTG_GINTSTS_DISCINT);
- dwc2_drivebus(bus, 1);
- usb_osal_msleep(200);
-
USB_OTG_GLB->GAHBCFG |= USB_OTG_GAHBCFG_GINT;
return ret;
@@ -867,13 +867,12 @@ static void dwc2_inchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num)
urb->actual_length += count;
- if ((has_used_packets % 2) == 1) /* toggle in odd numbers */
- {
- if (urb->data_toggle == HC_PID_DATA0) {
- urb->data_toggle = HC_PID_DATA1;
- } else {
- urb->data_toggle = HC_PID_DATA0;
- }
+ 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 (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_CONTROL) {
@@ -937,14 +936,13 @@ static void dwc2_outchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num)
uint32_t has_used_packets = chan->num_packets - ((USB_OTG_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_PKTCNT) >> 19); /* how many packets have used */
urb->actual_length += (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);
- if (has_used_packets % 2) /* toggle in odd numbers */
- {
- if (urb->data_toggle == HC_PID_DATA0) {
- urb->data_toggle = HC_PID_DATA1;
- } else {
- urb->data_toggle = HC_PID_DATA0;
- }
+ if (data_toggle == HC_PID_DATA0) {
+ urb->data_toggle = 0;
+ } else {
+ urb->data_toggle = 1;
}
if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_CONTROL) {