490 uint32_t status = USBD->GINTSTS;
493 if (status & USBD_GINTSTS_USBIF_Msk)
495 uint32_t bus_state = USBD->BUSINTSTS;
497 if (bus_state & USBD_BUSINTSTS_SOFIF_Msk)
503 if (bus_state & USBD_BUSINTSTS_RSTIF_Msk)
507 USBD->CEPINTEN = USBD_CEPINTEN_SETUPPKIEN_Msk;
508 USBD->BUSINTEN = USBD_BUSINTEN_RSTIEN_Msk | USBD_BUSINTEN_RESUMEIEN_Msk | USBD_BUSINTEN_SUSPENDIEN_Msk | USBD_BUSINTEN_DMADONEIEN_Msk;
509 USBD->CEPINTSTS = 0x1ffc;
515 if (bus_state & USBD_BUSINTSTS_RESUMEIF_Msk)
517 USBD->BUSINTEN = USBD_BUSINTEN_RSTIEN_Msk | USBD_BUSINTEN_SUSPENDIEN_Msk | USBD_BUSINTEN_DMADONEIEN_Msk;
521 if (bus_state & USBD_BUSINTSTS_SUSPENDIF_Msk)
523 USBD->BUSINTEN = USBD_BUSINTEN_RSTIEN_Msk | USBD_BUSINTEN_RESUMEIEN_Msk | USBD_BUSINTEN_DMADONEIEN_Msk;
527 if (bus_state & USBD_BUSINTSTS_HISPDIF_Msk)
529 USBD->CEPINTEN = USBD_CEPINTEN_SETUPPKIEN_Msk;
532 if (bus_state & USBD_BUSINTSTS_DMADONEIF_Msk)
539 uint16_t available_bytes = USBD->DMACNT & USBD_DMACNT_DMACNT_Msk;
553 if (bus_state & USBD_BUSINTSTS_VBUSDETIF_Msk)
555 if (USBD->PHYCTL & USBD_PHYCTL_VBUSDET_Msk)
558 USBD->PHYCTL |= USBD_PHYCTL_PHYEN_Msk | USBD_PHYCTL_DPPUEN_Msk;
563 USBD->PHYCTL &= ~USBD_PHYCTL_DPPUEN_Msk;
567 USBD->BUSINTSTS = bus_state & (USBD_BUSINTSTS_SOFIF_Msk | USBD_BUSINTSTS_RSTIF_Msk | USBD_BUSINTSTS_RESUMEIF_Msk | USBD_BUSINTSTS_SUSPENDIF_Msk | USBD_BUSINTSTS_HISPDIF_Msk | USBD_BUSINTSTS_DMADONEIF_Msk | USBD_BUSINTSTS_PHYCLKVLDIF_Msk | USBD_BUSINTSTS_VBUSDETIF_Msk);
570 if (status & USBD_GINTSTS_CEPIF_Msk)
572 uint32_t cep_state = USBD->CEPINTSTS & USBD->CEPINTEN;
574 if (cep_state & USBD_CEPINTSTS_SETUPPKIF_Msk)
577 uint8_t setup_packet[8];
578 setup_packet[0] = (uint8_t)(USBD->SETUP1_0 >> 0);
579 setup_packet[1] = (uint8_t)(USBD->SETUP1_0 >> 8);
580 setup_packet[2] = (uint8_t)(USBD->SETUP3_2 >> 0);
581 setup_packet[3] = (uint8_t)(USBD->SETUP3_2 >> 8);
582 setup_packet[4] = (uint8_t)(USBD->SETUP5_4 >> 0);
583 setup_packet[5] = (uint8_t)(USBD->SETUP5_4 >> 8);
584 setup_packet[6] = (uint8_t)(USBD->SETUP7_6 >> 0);
585 setup_packet[7] = (uint8_t)(USBD->SETUP7_6 >> 8);
588 else if (cep_state & USBD_CEPINTSTS_INTKIF_Msk)
590 USBD->CEPINTSTS = USBD_CEPINTSTS_TXPKIF_Msk;
592 if (!(cep_state & USBD_CEPINTSTS_STSDONEIF_Msk))
594 USBD->CEPINTEN = USBD_CEPINTEN_TXPKIEN_Msk;
596 for (
int count = 0; count < bytes_now; count++)
599 USBD_START_CEP_IN(bytes_now);
603 USBD->CEPINTEN = USBD_CEPINTEN_TXPKIEN_Msk | USBD_CEPINTEN_STSDONEIEN_Msk;
606 else if (cep_state & USBD_CEPINTSTS_TXPKIF_Msk)
608 USBD->CEPINTSTS = USBD_CEPINTSTS_STSDONEIF_Msk;
609 USBD_SET_CEP_STATE(USB_CEPCTL_NAKCLR);
617 USBD->CEPINTSTS = USBD_CEPINTSTS_INTKIF_Msk;
618 USBD->CEPINTEN = USBD_CEPINTEN_INTKIEN_Msk;
623 if (0 ==
ctrl_in_xfer.total_bytes) USBD->CEPCTL = USBD_CEPCTL_ZEROLEN_Msk;
625 USBD->CEPINTSTS = USBD_CEPINTSTS_STSDONEIF_Msk;
626 USBD->CEPINTEN = USBD_CEPINTEN_SETUPPKIEN_Msk | USBD_CEPINTEN_STSDONEIEN_Msk;
629 else if (cep_state & USBD_CEPINTSTS_STSDONEIF_Msk)
638 if (USBD->EP[ep_index].EPCFG & USBD_EPCFG_EPEN_Msk) USBD->EP[ep_index].EPRSPCTL = USBD_EPRSPCTL_TOGGLE_Msk;
642 USBD->CEPINTEN = USBD_CEPINTEN_SETUPPKIEN_Msk;
645 USBD->CEPINTSTS = cep_state;
650 if (status & (USBD_GINTSTS_EPAIF_Msk | USBD_GINTSTS_EPBIF_Msk | USBD_GINTSTS_EPCIF_Msk | USBD_GINTSTS_EPDIF_Msk | USBD_GINTSTS_EPEIF_Msk | USBD_GINTSTS_EPFIF_Msk | USBD_GINTSTS_EPGIF_Msk | USBD_GINTSTS_EPHIF_Msk | USBD_GINTSTS_EPIIF_Msk | USBD_GINTSTS_EPJIF_Msk | USBD_GINTSTS_EPKIF_Msk | USBD_GINTSTS_EPLIF_Msk))
663 uint32_t ep_state = ep->EPINTSTS & ep->EPINTEN;
668 xfer->dma_requested =
true;
671 uint16_t
const available_bytes = ep->EPDATCNT & USBD_EPDATCNT_DATCNT_Msk;
681 for (
int count = 0; (count < available_bytes) && (
xfer->out_bytes_so_far <
xfer->total_bytes); count++,
xfer->out_bytes_so_far++)
683 *
xfer->data_ptr++ = ep->EPDAT_BYTE;
695 else if (ep_state & USBD_EPINTSTS_BUFEMPTYIF_Msk)
700 else if (ep_state & USBD_EPINTSTS_TXPKIF_Msk)
707 ep->EPINTSTS = ep_state;