22static qTD_T *_ghost_qtd;
23static QH_T *qh_remove_list;
25extern ISO_EP_T *iso_ep_list;
26extern int ehci_iso_xfer(UTR_T *utr);
27extern int ehci_quit_iso_xfer(UTR_T *utr, EP_INFO_T *ep);
30#pragma data_alignment=4096
31uint32_t _PFList[FL_SIZE];
38#ifdef ENABLE_ERROR_MSG
41 USB_debug(
"Dump HSUSBH(EHCI) registers:\n");
42 USB_debug(
" UCMDR = 0x%x\n", _ehci->UCMDR);
43 USB_debug(
" USTSR = 0x%x\n", _ehci->USTSR);
44 USB_debug(
" UIENR = 0x%x\n", _ehci->UIENR);
45 USB_debug(
" UFINDR = 0x%x\n", _ehci->UFINDR);
46 USB_debug(
" UPFLBAR = 0x%x\n", _ehci->UPFLBAR);
47 USB_debug(
" UCALAR = 0x%x\n", _ehci->UCALAR);
48 USB_debug(
" UASSTR = 0x%x\n", _ehci->UASSTR);
49 USB_debug(
" UCFGR = 0x%x\n", _ehci->UCFGR);
50 USB_debug(
" UPSCR = 0x%x\n", _ehci->UPSCR[0]);
51 USB_debug(
" PHYCTL0 = 0x%x\n", _ehci->USBPCR0);
52 USB_debug(
" PHYCTL1 = 0x%x\n", _ehci->USBPCR1);
57 USB_debug(
"_ehci port0=0x%x, port1=0x%x\n", _ehci->UPSCR[0], _ehci->UPSCR[1]);
60void dump_ehci_qtd(qTD_T *qtd)
62 USB_debug(
" [qTD] - 0x%08x\n", (
int)qtd);
63 USB_debug(
" 0x%08x (Next qtd Pointer)\n", qtd->Next_qTD);
64 USB_debug(
" 0x%08x (Alternate Next qtd Pointer)\n", qtd->Alt_Next_qTD);
65 USB_debug(
" 0x%08x (qtd Token) PID: %s, Bytes: %d, IOC: %d\n", qtd->Token, (((qtd->Token>>8)&0x3)==0) ?
"OUT" : ((((qtd->Token>>8)&0x3)==1) ?
"IN" :
"SETUP"), (qtd->Token>>16)&0x7FFF, (qtd->Token>>15)&0x1);
66 USB_debug(
" 0x%08x (Buffer Pointer (page 0))\n", qtd->Bptr[0]);
74void dump_ehci_asynclist(
void)
79 USB_debug(
">>> Dump EHCI Asynchronous List <<<\n");
82 USB_debug(
"[QH] - 0x%08x\n", (
int)qh);
83 USB_debug(
" 0x%08x (Queue Head Horizontal Link Pointer, Queue Head DWord 0)\n", qh->HLink);
84 USB_debug(
" 0x%08x (Endpoint Characteristics) DevAddr: %d, EP: 0x%x, PktSz: %d, Speed: %s\n", qh->Chrst, qh->Chrst & 0x7F, (qh->Chrst >> 8) & 0xF, (qh->Chrst >> 16) & 0x7FF, (((qh->Chrst>>12) & 0x3) == 0) ?
"Full" : ((((qh->Chrst >> 12) & 0x3) == 1) ?
"Low" :
"High"));
85 USB_debug(
" 0x%08x (Endpoint Capabilities: Queue Head DWord 2)\n", qh->Cap);
86 USB_debug(
" 0x%08x (Current qtd Pointer)\n", qh->Curr_qTD);
87 USB_debug(
" --- Overlay Area ---\n");
88 USB_debug(
" 0x%08x (Next qtd Pointer)\n", qh->OL_Next_qTD);
89 USB_debug(
" 0x%08x (Alternate Next qtd Pointer)\n", qh->OL_Alt_Next_qTD);
90 USB_debug(
" 0x%08x (qtd Token)\n", qh->OL_Token);
91 USB_debug(
" 0x%08x (Buffer Pointer (page 0))\n", qh->OL_Bptr[0]);
94 qtd = QTD_PTR(qh->Curr_qTD);
98 qtd = QTD_PTR(qtd->Next_qTD);
100 qh = QH_PTR(qh->HLink);
105void dump_ehci_asynclist_simple(
void)
109 USB_debug(
">>> EHCI Asynchronous List <<<\n");
110 USB_debug(
"[QH] => ");
113 USB_debug(
"0x%08x ", (
int)qh);
114 qh = QH_PTR(qh->HLink);
120void dump_ehci_period_frame_list_simple(
void)
122 QH_T *qh = _Iqh[NUM_IQH - 1];
124 USB_debug(
">>> EHCI period frame list simple <<<\n");
125 USB_debug(
"[FList] => ");
128 USB_debug(
"0x%08x ", (
int)qh);
129 qh = QH_PTR(qh->HLink);
135void dump_ehci_period_frame_list()
140 for (i = 0; i < FL_SIZE; i++)
142 USB_debug(
"!%02d: ", i);
143 qh = QH_PTR(_PFList[i]);;
147 USB_debug(
"0x%x => ", (
int)qh);
148 qh = QH_PTR(qh->HLink);
156static void init_periodic_frame_list()
159 int i, idx, interval;
161 memset(_PFList, 0,
sizeof(_PFList));
165 for (i = NUM_IQH-1; i >= 0; i--)
167 _Iqh[i] = alloc_ehci_QH();
169 _Iqh[i]->HLink = QH_HLNK_END;
170 _Iqh[i]->Curr_qTD = (uint32_t)_ghost_qtd;
171 _Iqh[i]->OL_Next_qTD = QTD_LIST_END;
172 _Iqh[i]->OL_Alt_Next_qTD = (uint32_t)_ghost_qtd;
173 _Iqh[i]->OL_Token = QTD_STS_HALT;
177 for (idx = interval - 1; idx < FL_SIZE; idx += interval)
179 if (_PFList[idx] == 0)
181 _PFList[idx] = QH_HLNK_QH(_Iqh[i]);
185 qh_p = QH_PTR(_PFList[idx]);
192 if (qh_p->HLink == QH_HLNK_END)
194 qh_p->HLink = QH_HLNK_QH(_Iqh[i]);
197 qh_p = QH_PTR(qh_p->HLink);
204static QH_T * get_int_tree_head_node(
int interval)
210 for (i = 0; i < NUM_IQH-1; i++)
216 return _Iqh[NUM_IQH-1];
219static int make_int_s_mask(
int bInterval)
224 while (bInterval > 1)
236 for (order = 0; (interval > 1); order++)
240 return (0x1 << (order % 8));
243static int ehci_init(
void)
245 int timeout = 250*1000;
261 _ghost_qtd = alloc_ehci_qTD(
NULL);
262 _ghost_qtd->Token = 0x11197B3F;
267 qh_remove_list =
NULL;
270 _H_qh = alloc_ehci_QH();
271 _H_qh->HLink = QH_HLNK_QH(_H_qh);
272 _H_qh->Chrst = QH_RCLM_LIST_HEAD;
273 _H_qh->Curr_qTD = (uint32_t)_ghost_qtd;
274 _H_qh->OL_Next_qTD = QTD_LIST_END;
275 _H_qh->OL_Alt_Next_qTD = (uint32_t)_ghost_qtd;
276 _H_qh->OL_Token = QTD_STS_HALT;
277 _ehci->UCALAR = (uint32_t)_H_qh;
284 else if (FL_SIZE == 512)
286 else if (FL_SIZE == 1024)
291 _ehci->UPFLBAR = (uint32_t)_PFList;
305 init_periodic_frame_list();
312static int ehci_reinit(
void)
314 int timeout = 250 * 1000;
317 memcpy(&ehci_backup, _ehci,
sizeof(ehci_backup));
331 _ehci->UCMDR = ehci_backup.
UCMDR & ~HSUSBH_UCMDR_IAAD_Msk;;
333 _ehci->UCALAR = ehci_backup.
UCALAR;
335 _ehci->UPFLBAR = ehci_backup.
UPFLBAR;
354static void ehci_suspend(
void)
356 if (_ehci->UPSCR[0] & 0x1)
360static void ehci_resume(
void)
362 if (_ehci->UPSCR[0] & 0x1)
366static void ehci_shutdown(
void)
371static void move_qh_to_remove_list(QH_T *qh)
391 qh->Chrst |= QH_RCLM_LIST_HEAD;
392 qh->OL_Token = (qh->OL_Token & ~QTD_STS_ACTIVE) | QTD_STS_HALT;
398 while(QH_PTR(q->HLink) != _H_qh)
400 if(QH_PTR(q->HLink) == qh)
403 q->HLink = qh->HLink;
404 qh->next = qh_remove_list;
408 q = QH_PTR(q->HLink);
414 q = _Iqh[NUM_IQH - 1];
415 while(q->HLink != QH_HLNK_END)
417 if(QH_PTR(q->HLink) == qh)
420 q->HLink = qh->HLink;
421 qh->next = qh_remove_list;
425 q = QH_PTR(q->HLink);
429static void remove_queue_head(QH_T *qh)
432 move_qh_to_remove_list(qh);
437static void append_to_qtd_list_of_QH(QH_T *qh, qTD_T *qtd)
441 if (qh->qtd_list ==
NULL)
448 while (q->next !=
NULL)
459static void write_qh(UDEV_T *udev, EP_INFO_T *ep, QH_T *qh)
468 if (udev->descriptor.bMaxPacketSize0 == 0)
470 if (udev->speed == SPEED_LOW)
471 udev->descriptor.bMaxPacketSize0 = 8;
473 udev->descriptor.bMaxPacketSize0 = 64;
475 chrst = QH_DTC | QH_NAK_RL | (udev->descriptor.bMaxPacketSize0 << 16);
476 if (udev->speed != SPEED_HIGH)
477 chrst |= QH_CTRL_EP_FLAG;
481 chrst = QH_NAK_RL | (ep->wMaxPacketSize << 16);
482 chrst |= ((ep->bEndpointAddress & 0xf) << 8);
485 if (udev->speed == SPEED_LOW)
487 else if (udev->speed == SPEED_FULL)
488 chrst |= QH_EPS_FULL;
490 chrst |= QH_EPS_HIGH;
492 chrst |= udev->dev_num;
499 if (udev->speed == SPEED_HIGH)
511 port_num = udev->port_num;
514 while ((hub !=
NULL) && (hub->iface->udev->speed != SPEED_HIGH))
516 port_num = hub->iface->udev->port_num;
517 hub = hub->iface->udev->parent;
520 cap = (port_num << QH_HUB_PORT_Pos) |
521 (hub->iface->udev->dev_num << QH_HUB_ADDR_Pos);
527static void write_qtd_bptr(qTD_T *qtd, uint32_t buff_addr,
int xfer_len)
531 qtd->xfer_len = xfer_len;
532 qtd->Bptr[0] = buff_addr;
534 buff_addr = (buff_addr + 0x1000) & ~0xFFF;
536 for (i = 1; i < 5; i++)
538 qtd->Bptr[i] = buff_addr;
543static int ehci_ctrl_xfer(UTR_T *utr)
547 qTD_T *qtd_setup, *qtd_data, *qtd_status;
553 if (utr->data_len > 0)
555 if (((uint32_t)utr->buff + utr->data_len) > (((uint32_t)utr->buff & ~0xFFF)+0x5000))
562 if (udev->ep0.hw_pipe !=
NULL)
564 qh = (QH_T *)udev->ep0.hw_pipe;
570 qh = alloc_ehci_QH();
574 udev->ep0.hw_pipe = (
void *)qh;
577 write_qh(udev,
NULL, qh);
578 utr->ep = &udev->ep0;
583 qtd_setup = alloc_ehci_qTD(utr);
585 if (utr->data_len > 0)
586 qtd_data = alloc_ehci_qTD(utr);
590 qtd_status = alloc_ehci_qTD(utr);
592 if (qtd_status ==
NULL)
595 free_ehci_qTD(qtd_setup);
597 free_ehci_qTD(qtd_data);
608 write_qtd_bptr(qtd_setup, (uint32_t)&utr->setup, 8);
609 append_to_qtd_list_of_QH(qh, qtd_setup);
610 qtd_setup->Token = (8 << 16) | QTD_ERR_COUNTER | QTD_PID_SETUP | QTD_STS_ACTIVE;
615 if (utr->data_len > 0)
617 qtd_setup->Next_qTD = (uint32_t)qtd_data;
618 qtd_data->Next_qTD = (uint32_t)qtd_status;
620 if ((utr->setup.bmRequestType & 0x80) == REQ_TYPE_OUT)
621 token = QTD_ERR_COUNTER | QTD_PID_OUT | QTD_STS_ACTIVE;
623 token = QTD_ERR_COUNTER | QTD_PID_IN | QTD_STS_ACTIVE;
627 write_qtd_bptr(qtd_data, (uint32_t)utr->buff, utr->data_len);
628 append_to_qtd_list_of_QH(qh, qtd_data);
629 qtd_data->Token = QTD_DT | (utr->data_len << 16) | token;
633 qtd_setup->Next_qTD = (uint32_t)qtd_status;
639 qtd_status->Next_qTD = (uint32_t)_ghost_qtd;
640 qtd_status->Alt_Next_qTD = QTD_LIST_END;
642 if ((utr->setup.bmRequestType & 0x80) == REQ_TYPE_OUT)
643 token = QTD_ERR_COUNTER | QTD_PID_IN | QTD_STS_ACTIVE;
645 token = QTD_ERR_COUNTER | QTD_PID_OUT | QTD_STS_ACTIVE;
649 append_to_qtd_list_of_QH(qh, qtd_status);
650 qtd_status->Token = QTD_DT | QTD_IOC | token;
656 qh->OL_Next_qTD = (uint32_t)qtd_setup;
657 qh->OL_Alt_Next_qTD = QTD_LIST_END;
665 qh->HLink = _H_qh->HLink;
666 _H_qh->HLink = QH_HLNK_QH(qh);
674static int ehci_bulk_xfer(UTR_T *utr)
677 EP_INFO_T *ep = utr->ep;
679 qTD_T *qtd, *qtd_pre;
680 uint32_t data_len, xfer_len;
687 if (ep->hw_pipe !=
NULL)
689 qh = (QH_T *)ep->hw_pipe ;
697 qh = alloc_ehci_QH();
701 write_qh(udev, ep, qh);
702 ep->hw_pipe = (
void *)qh;
708 data_len = utr->data_len;
714 qtd = alloc_ehci_qTD(utr);
722 free_ehci_qTD(qtd_pre);
732 if ((ep->bEndpointAddress & EP_ADDR_DIR_MASK) == EP_ADDR_DIR_OUT)
733 token = QTD_ERR_COUNTER | QTD_PID_OUT | QTD_STS_ACTIVE;
735 token = QTD_ERR_COUNTER | QTD_PID_IN | QTD_STS_ACTIVE;
737 if (data_len > 0x4000)
743 qtd->Next_qTD = (uint32_t)_ghost_qtd;
744 qtd->Alt_Next_qTD = QTD_LIST_END;
745 write_qtd_bptr(qtd, (uint32_t)buff, xfer_len);
746 append_to_qtd_list_of_QH(qh, qtd);
747 qtd->Token = (xfer_len << 16) | token;
750 data_len -= xfer_len;
754 qtd->Token |= QTD_IOC;
755 qtd->Next_qTD = (uint32_t)_ghost_qtd;
759 qtd_pre->Next_qTD = (uint32_t)qtd;
768 qh->OL_Next_qTD = (uint32_t)qtd;
776 memcpy(&(qh->OL_Bptr[0]), &(qtd->Bptr[0]), 20);
777 qh->Curr_qTD = (uint32_t)qtd;
781 if (utr->ep->bToggle)
782 qh->OL_Token |= QTD_DT;
784 qh->HLink = _H_qh->HLink;
785 _H_qh->HLink = QH_HLNK_QH(qh);
794static int ehci_int_xfer(UTR_T *utr)
796 UDEV_T *udev = utr->udev;
797 EP_INFO_T *ep = utr->ep;
799 qTD_T *qtd, *dummy_qtd;
802 dummy_qtd = alloc_ehci_qTD(
NULL);
803 if (dummy_qtd ==
NULL)
805 dummy_qtd->Token &= ~(QTD_STS_ACTIVE | QTD_STS_HALT);
807 if (ep->hw_pipe !=
NULL)
809 qh = (QH_T *)ep->hw_pipe ;
813 qh = alloc_ehci_QH();
816 free_ehci_qTD(dummy_qtd);
819 write_qh(udev, ep, qh);
820 qh->Chrst &= ~0xF0000000;
822 if (udev->speed == SPEED_HIGH)
824 qh->Cap = (0x1 << QH_MULT_Pos) | (qh->Cap & 0xff) | make_int_s_mask(ep->bInterval);
828 qh->Cap = (0x1 << QH_MULT_Pos) | (qh->Cap & ~(QH_C_MASK_Msk | QH_S_MASK_Msk)) | 0x7802;
830 ep->hw_pipe = (
void *)qh;
835 qtd = alloc_ehci_qTD(
NULL);
838 free_ehci_qTD(dummy_qtd);
842 qtd->Token &= ~(QTD_STS_ACTIVE | QTD_STS_HALT);
844 qh->dummy = dummy_qtd;
845 qh->OL_Next_qTD = (uint32_t)dummy_qtd;
851 if (udev->speed == SPEED_HIGH)
852 iqh = get_int_tree_head_node(ep->bInterval);
854 iqh = get_int_tree_head_node(ep->bInterval * 8);
855 qh->HLink = iqh->HLink;
856 iqh->HLink = QH_HLNK_QH(qh);
862 qtd->Next_qTD = (uint32_t)dummy_qtd;
864 qh->dummy = dummy_qtd;
870 if ((ep->bEndpointAddress & EP_ADDR_DIR_MASK) == EP_ADDR_DIR_OUT)
871 token = QTD_ERR_COUNTER | QTD_PID_OUT;
873 token = QTD_ERR_COUNTER | QTD_PID_IN;
876 qtd->Alt_Next_qTD = QTD_LIST_END;
877 write_qtd_bptr(qtd, (uint32_t)utr->buff, utr->data_len);
878 append_to_qtd_list_of_QH(qh, qtd);
879 qtd->Token = QTD_IOC | (utr->data_len << 16) | token | QTD_STS_ACTIVE;
890static int ehci_quit_xfer(UTR_T *utr, EP_INFO_T *ep)
896 if (ehci_quit_iso_xfer(utr, ep) == 0)
908 qh = (QH_T *)(utr->ep->hw_pipe);
913 remove_queue_head(qh);
914 utr->ep->hw_pipe =
NULL;
917 if ((ep !=
NULL) && (ep->hw_pipe !=
NULL))
919 qh = (QH_T *)(ep->hw_pipe);
921 remove_queue_head(qh);
931 USB_error(
"%s - IAAD lost!! UCMDR:0x%x, USTSR: 0x%x, UIENR: 0x%x\n", __func__, _ehci->UCMDR, _ehci->USTSR, _ehci->UIENR);
940static int visit_qtd(qTD_T *qtd)
942 if ((qtd->Token == 0x11197B3F) || (qtd->Token == 0x1197B3F))
947 if ((qtd->Token & QTD_STS_ACTIVE) == 0)
949 if (qtd->Token & (QTD_STS_HALT | QTD_STS_DATA_BUFF_ERR | QTD_STS_BABBLE | QTD_STS_XactErr | QTD_STS_MISS_MF))
951 USB_error(
"qTD error token=0x%x! 0x%x\n", qtd->Token, qtd->Bptr[0]);
952 if (qtd->utr->status == 0)
957 if ((qtd->Token & QTD_PID_Msk) != QTD_PID_SETUP)
959 qtd->utr->xfer_len += qtd->xfer_len - QTD_TODO_LEN(qtd->Token);
968static void scan_asynchronous_list()
971 qTD_T *q_pre, *qtd, *qtd_tmp;
974 qh = QH_PTR(_H_qh->HLink);
987 if (qtd == qh->qtd_list)
988 qh->qtd_list = qtd->next;
990 q_pre->next = qtd->next;
995 qtd_tmp->next = qh->done_list;
996 qh->done_list = qtd_tmp;
1006 qh = QH_PTR(qh->HLink);
1009 if ((qh_tmp->qtd_list ==
NULL) && utr)
1012 if (qh_tmp->OL_Token & QTD_DT)
1013 utr->ep->bToggle = 1;
1015 utr->ep->bToggle = 0;
1017 utr->bIsTransferDone = 1;
1026static void scan_periodic_frame_list()
1035 qh = _Iqh[NUM_IQH - 1];
1043 qh = QH_PTR(qh->HLink);
1053 qh->qtd_list = qtd->next;
1054 qtd->next = qh->done_list;
1055 qh->done_list = qtd;
1060 qtd = qh->done_list;
1066 if (qh->OL_Token & QTD_DT)
1067 utr->ep->bToggle = 1;
1069 utr->ep->bToggle = 0;
1071 utr->bIsTransferDone = 1;
1080 qh = QH_PTR(qh->HLink);
1087 scan_isochronous_list();
1090void iaad_remove_qh()
1099 while (qh_remove_list !=
NULL)
1101 qh = qh_remove_list;
1102 qh_remove_list = qh->next;
1106 while (qh->done_list)
1108 qtd = qh->done_list;
1109 qh->done_list = qtd->next;
1113 if (qh->qtd_list !=
NULL)
1115 utr = qh->qtd_list->utr;
1116 while (qh->qtd_list)
1119 qh->qtd_list = qtd->next;
1123 utr->bIsTransferDone = 1;
1129 free_ehci_qTD(qh->dummy);
1137 qh = QH_PTR(_H_qh->HLink);
1140 while (qh->done_list)
1142 qtd = qh->done_list;
1143 qh->done_list = qtd->next;
1146 qh = QH_PTR(qh->HLink);
1152 qh = _Iqh[NUM_IQH - 1];
1155 while (qh->done_list)
1157 qtd = qh->done_list;
1158 if (qtd == qtd->next)
1161 qh->done_list =
NULL;
1164 qh->done_list = qtd->next;
1167 qh = QH_PTR(qh->HLink);
1171void sync_remove_qtd_done()
1176 qh = _Iqh[NUM_IQH - 1];
1179 while(qh->done_list)
1181 qtd = qh->done_list;
1182 if (qtd == qtd->next)
1185 qh->done_list =
NULL;
1188 qh->done_list = qtd->next;
1191 qh = QH_PTR(qh->HLink);
1195void EHCI_IRQHandler(
void)
1199 intsts = _ehci->USTSR;
1200 _ehci->USTSR = intsts;
1213 scan_asynchronous_list();
1215 sync_remove_qtd_done();
1217 scan_periodic_frame_list();
1226static UDEV_T * ehci_find_device_by_port(
int port)
1231 while (udev !=
NULL)
1233 if ((udev->parent ==
NULL) && (udev->port_num == port) && (udev->speed == SPEED_HIGH))
1240static int ehci_rh_port_reset(
int port)
1246 reset_time = PORT_RESET_TIME_MS;
1248 for (retry = 0; retry < PORT_RESET_RETRY; retry++)
1253 while (
get_ticks() - t0 < (reset_time/10)+1) ;
1255 _ehci->UPSCR[port] &= ~HSUSBH_UPSCR_PRST_Msk;
1258 while (
get_ticks() - t0 < (reset_time/10)+1)
1262 goto port_reset_done;
1264 reset_time += PORT_RESET_RETRY_INC_MS;
1267 USB_debug(
"EHCI port %d - port reset failed!\n", port+1);
1280static int ehci_rh_polling(
void)
1284 int connect_status, t0;
1293 USB_debug(
"EHCI port1 status change: 0x%x\n", _ehci->UPSCR[0]);
1300 udev = ehci_find_device_by_port(1);
1303 disconnect_device(udev);
1311 while (
get_ticks() - t0 < HUB_DEBOUNCE_TIME/10)
1328 if (ehci_rh_port_reset(0) !=
USBH_OK)
1339 udev = alloc_device();
1343 udev->parent =
NULL;
1345 udev->speed = SPEED_HIGH;
1346 udev->hc_driver = &ehci_driver;
1348 ret = connect_device(udev);
1351 USB_error(
"connect_device error! [%d]\n", ret);
1362 udev = ehci_find_device_by_port(1);
1365 disconnect_device(udev);
1372HC_DRV_T ehci_driver =
void *__dso_handle __attribute__((weak))
NuMicro peripheral access layer header file.
#define NULL
NULL pointer.
#define HSUSBH_UCMDR_RUN_Msk
#define HSUSBH_UIENR_USBIEN_Msk
#define HSUSBH_UPSCR_PE_Msk
#define HSUSBH_USTSR_USBINT_Msk
#define HSUSBH_UCMDR_HCRST_Msk
#define HSUSBH_UCMDR_ASEN_Msk
#define HSUSBH_UIENR_HSERREN_Msk
#define HSUSBH_UCMDR_IAAD_Msk
#define HSUSBH_UPSCR_SUSPEND_Msk
#define HSUSBH_UIENR_IAAEN_Msk
#define HSUSBH_UPSCR_CSC_Msk
#define HSUSBH_UPSCR_CCS_Msk
#define HSUSBH_UPSCR_PP_Msk
#define HSUSBH_USTSR_UERRINT_Msk
#define HSUSBH_UCMDR_FLSZ_Pos
#define HSUSBH_UCMDR_PSEN_Msk
#define HSUSBH_UPSCR_PRST_Msk
#define HSUSBH_UIENR_UERRIEN_Msk
#define HSUSBH_USTSR_IAA_Msk
#define HSUSBH_UPSCR_PEC_Msk
#define HSUSBH_UPSCR_PO_Msk
#define HSUSBH_UPSCR_FPR_Msk
#define USBH_ERR_EHCI_QH_BUSY
#define USBH_ERR_EHCI_INIT
#define USBH_ERR_TRANSACTION
#define USBH_ERR_PORT_RESET
#define USBH_ERR_NOT_FOUND
#define USBH_ERR_MEMORY_OUT
#define USBH_ERR_BUFF_OVERRUN
#define USBH_ERR_DISCONNECTED
uint32_t get_ticks(void)
A function return current tick count.
USB Host hub class driver header file.
USB Host library header file.