23int _IsInUsbInterrupt = 0;
25static UDEV_DRV_T * _drivers[MAX_UDEV_DRIVER];
27static CONN_FUNC *g_conn_func, *g_disconn_func;
43 memset(_drivers, 0,
sizeof(_drivers));
46 g_disconn_func =
NULL;
72 g_conn_func = conn_func;
73 g_disconn_func = disconn_func;
78 if(udev->parent ==
NULL)
81 return udev->hc_driver->rthub_port_reset(udev->port_num - 1);
87 return udev->parent->port_reset(udev->parent, udev->port_num);
150int usbh_register_driver(UDEV_DRV_T *udrv)
154 for(i = 0; i < MAX_UDEV_DRIVER; i++)
156 if(_drivers[i] == udrv)
159 if(_drivers[i] ==
NULL)
185int usbh_ctrl_xfer(UDEV_T *udev, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex,
186 uint16_t wLength, uint8_t *buff, uint32_t *xfer_len, uint32_t timeout)
197 utr = alloc_utr(udev);
201 utr->setup.bmRequestType = bmRequestType;
202 utr->setup.bRequest = bRequest;
203 utr->setup.wValue = wValue;
204 utr->setup.wIndex = wIndex;
205 utr->setup.wLength = wLength;
208 utr->data_len = wLength;
209 utr->bIsTransferDone = 0;
210 status = udev->hc_driver->ctrl_xfer(utr);
213 udev->ep0.hw_pipe =
NULL;
219 while(utr->bIsTransferDone == 0)
225 udev->ep0.hw_pipe =
NULL;
230 status = utr->status;
234 *xfer_len = utr->xfer_len;
250int usbh_bulk_xfer(UTR_T *utr)
252 return utr->udev->hc_driver->bulk_xfer(utr);
263int usbh_int_xfer(UTR_T *utr)
265 return utr->udev->hc_driver->int_xfer(utr);
276int usbh_iso_xfer(UTR_T *utr)
278 if(utr->udev->hc_driver ==
NULL)
280 printf(
"hc_driver - 0x%x\n", (
int)utr->udev->hc_driver);
283 if(utr->udev->hc_driver->iso_xfer ==
NULL)
285 printf(
"iso_xfer - 0x%x\n", (
int)utr->udev->hc_driver->iso_xfer);
288 return utr->udev->hc_driver->iso_xfer(utr);
297int usbh_quit_utr(UTR_T *utr)
299 if(!utr || !utr->udev)
302 return utr->udev->hc_driver->quit_xfer(utr,
NULL);
313int usbh_quit_xfer(UDEV_T *udev, EP_INFO_T *ep)
315 return udev->hc_driver->quit_xfer(
NULL, ep);
319void dump_device_descriptor(DESC_DEV_T *desc)
321 USB_debug(
"\n[Device Descriptor]\n");
322 USB_debug(
"----------------------------------------------\n");
323 USB_debug(
" Length = %2d\n", desc->bLength);
324 USB_debug(
" DescriptorType = 0x%02x\n", desc->bDescriptorType);
325 USB_debug(
" USB version = %x.%02x\n",
326 desc->bcdUSB >> 8, desc->bcdUSB & 0xff);
327 USB_debug(
" Vendor:Product = %04x:%04x\n",
328 desc->idVendor, desc->idProduct);
329 USB_debug(
" MaxPacketSize0 = %d\n", desc->bMaxPacketSize0);
330 USB_debug(
" NumConfigurations = %d\n", desc->bNumConfigurations);
331 USB_debug(
" Device version = %x.%02x\n",
332 desc->bcdDevice >> 8, desc->bcdDevice & 0xff);
333 USB_debug(
" Device Class:SubClass:Protocol = %02x:%02x:%02x\n",
334 desc->bDeviceClass, desc->bDeviceSubClass, desc->bDeviceProtocol);
337void usbh_dump_interface_descriptor(DESC_IF_T *if_desc)
339 USB_debug(
"\n [Interface Descriptor]\n");
340 USB_debug(
" ----------------------------------------------\n");
341 USB_debug(
" Length = %2d\n", if_desc->bLength);
342 USB_debug(
" DescriptorType = %02x\n", if_desc->bDescriptorType);
343 USB_debug(
" bInterfaceNumber = %d\n", if_desc->bInterfaceNumber);
344 USB_debug(
" bAlternateSetting = %d\n", if_desc->bAlternateSetting);
345 USB_debug(
" bNumEndpoints = %d\n", if_desc->bNumEndpoints);
346 USB_debug(
" bInterfaceClass = 0x%02x\n", if_desc->bInterfaceClass);
347 USB_debug(
" bInterfaceSubClass = 0x%02x\n", if_desc->bInterfaceSubClass);
348 USB_debug(
" bInterfaceProtocol = 0x%02x\n", if_desc->bInterfaceProtocol);
349 USB_debug(
" iInterface = %d\n", if_desc->iInterface);
352void usbh_dump_endpoint_descriptor(DESC_EP_T *ep_desc)
354 USB_debug(
"\n [Endpoint Descriptor]\n");
355 USB_debug(
" ----------------------------------------------\n");
356 USB_debug(
" Length = %2d\n", ep_desc->bLength);
357 USB_debug(
" DescriptorType = %02x\n", ep_desc->bDescriptorType);
358 USB_debug(
" bEndpointAddress = 0x%02x\n", ep_desc->bEndpointAddress);
359 USB_debug(
" bmAttributes = 0x%02x\n", ep_desc->bmAttributes);
360 USB_debug(
" wMaxPacketSize = %d\n", ep_desc->wMaxPacketSize);
361 USB_debug(
" bInterval = %d\n", ep_desc->bInterval);
362 USB_debug(
" bRefresh = %d\n", ep_desc->bRefresh);
363 USB_debug(
" bSynchAddress = %d\n", ep_desc->bSynchAddress);
366void dump_config_descriptor(DESC_CONF_T *desc)
368 uint8_t *bptr = (uint8_t *)desc;
370 int tlen = desc->wTotalLength;
376 case USB_DT_CONFIGURATION:
377 USB_debug(
"\n[Configuration Descriptor]\n");
378 USB_debug(
"----------------------------------------------\n");
379 USB_debug(
" Length = %2d\n", desc->bLength);
380 USB_debug(
" DescriptorType = %02x\n", desc->bDescriptorType);
381 USB_debug(
" wTotalLength = %2d\n", desc->wTotalLength);
382 USB_debug(
" bNumInterfaces = %d\n", desc->bNumInterfaces);
383 USB_debug(
" bConfigurationValue = %d\n", desc->bConfigurationValue);
384 USB_debug(
" iConfiguration = %d\n", desc->iConfiguration);
385 USB_debug(
" bmAttributes = 0x%02x\n", desc->bmAttributes);
386 USB_debug(
" MaxPower = %d\n", desc->MaxPower);
389 case USB_DT_INTERFACE:
390 usbh_dump_interface_descriptor((DESC_IF_T *)bptr);
393 case USB_DT_ENDPOINT:
394 usbh_dump_endpoint_descriptor((DESC_EP_T *)bptr);
398 hdr = (DESC_HDR_T *)bptr;
399 USB_debug(
"\n!![Unknown Descriptor]\n");
400 USB_debug(
"----------------------------------------------\n");
401 USB_debug(
"Length = %2d\n", hdr->bLength);
402 USB_debug(
"DescriptorType = %02x\n", hdr->bDescriptorType);
417int usbh_set_address(UDEV_T *udev)
422 if(udev->dev_num != 0)
425 dev_num = alloc_dev_address();
430 ret = usbh_ctrl_xfer(udev, REQ_TYPE_OUT | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
431 USB_REQ_SET_ADDRESS, dev_num, 0, 0,
432 NULL, &read_len, 100);
435 free_dev_address(dev_num);
439 udev->dev_num = dev_num;
449int usbh_set_configuration(UDEV_T *udev, uint8_t conf_val)
455 if(udev->cur_conf == conf_val)
459 if(udev->cur_conf != -1)
465 ret = usbh_ctrl_xfer(udev, REQ_TYPE_OUT | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
466 USB_REQ_SET_CONFIGURATION, conf_val, 0, 0,
467 NULL, &read_len, 300);
471 udev->cur_conf = (int8_t)conf_val;
483int usbh_set_interface(IFACE_T *iface, uint16_t alt_setting)
485 ALT_IFACE_T *aif =
NULL;
489 for(i = 0; i < iface->num_alt; i++)
491 if(iface->alt[i].ifd->bAlternateSetting == alt_setting)
493 aif = &iface->alt[i];
500 ret = usbh_ctrl_xfer(iface->udev, REQ_TYPE_OUT | REQ_TYPE_STD_DEV | REQ_TYPE_TO_IFACE,
501 USB_REQ_SET_INTERFACE, alt_setting, iface->if_num, 0,
502 NULL, &xfer_len, 100);
515int usbh_get_device_descriptor(UDEV_T *udev, DESC_DEV_T *desc_buff)
521 for(retry = 0; retry < 3; retry++)
523 ret = usbh_ctrl_xfer(udev, REQ_TYPE_IN | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
524 USB_REQ_GET_DESCRIPTOR,
525 ((USB_DT_STANDARD | USB_DT_DEVICE) << 8), 0,
sizeof(DESC_DEV_T),
526 (uint8_t *)desc_buff, &read_len, timeout);
530 USB_debug(
"Get device descriptor failed - %d, retry!\n", ret);
543int usbh_get_config_descriptor(UDEV_T *udev, uint8_t *desc_buff,
int buff_len)
546 DESC_CONF_T *conf = (DESC_CONF_T *)desc_buff;
552 ret = usbh_ctrl_xfer(udev, REQ_TYPE_IN | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
553 USB_REQ_GET_DESCRIPTOR,
554 ((USB_DT_STANDARD | USB_DT_CONFIGURATION) << 8), 0, 9,
555 desc_buff, &read_len, 200);
559 if(conf->wTotalLength > buff_len)
561 USB_error(
"Device configuration %d length > %d!\n", conf->wTotalLength, buff_len);
565 read_len = conf->wTotalLength;
567 ret = usbh_ctrl_xfer(udev, REQ_TYPE_IN | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
568 USB_REQ_GET_DESCRIPTOR,
569 ((USB_DT_STANDARD | USB_DT_CONFIGURATION) << 8), 0, read_len,
570 desc_buff, &read_len, 200);
587int usbh_get_string_descriptor(UDEV_T *udev,
int index, uint8_t *desc_buff,
int buff_len)
595 ret = usbh_ctrl_xfer(udev, REQ_TYPE_IN | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
596 USB_REQ_GET_DESCRIPTOR,
597 ((USB_DT_STANDARD | USB_DT_STRING) << 8) | index, 0x0409, buff_len,
598 desc_buff, &read_len, 200);
609int usbh_clear_halt(UDEV_T *udev, uint16_t ep_addr)
613 USB_debug(
"Clear endpoint 0x%x halt.\n", ep_addr);
614 return usbh_ctrl_xfer(udev, REQ_TYPE_OUT | REQ_TYPE_STD_DEV | REQ_TYPE_TO_EP,
615 USB_REQ_CLEAR_FEATURE, 0, ep_addr, 0,
616 NULL, &read_len, 100);
619static int usbh_parse_endpoint(ALT_IFACE_T *alt,
int ep_idx, uint8_t *desc_buff,
int len)
627 ep_desc = (DESC_EP_T *)desc_buff;
629 if((len < ep_desc->bLength) || (ep_desc->bLength < 2))
631 USB_error(
"ERR DESCRIPTOR EP LEN [0x%X %d]\n", ep_desc->bDescriptorType, ep_desc->bLength);
635 if(ep_desc->bDescriptorType == USB_DT_ENDPOINT)
639 USB_vdebug(
"ignore descriptor 0x%X %d\n", ep_desc->bDescriptorType, ep_desc->bLength);
640 desc_buff += ep_desc->bLength;
641 parsed_len += ep_desc->bLength;
642 len -= ep_desc->bLength;
645 USB_vdebug(
"Descriptor Found - Alt: %d, Endpoint 0x%x, remaining len: %d\n", alt->ifd->bAlternateSetting, ep_desc->bEndpointAddress, len);
647 alt->ep[ep_idx].bEndpointAddress = ep_desc->bEndpointAddress;
648 alt->ep[ep_idx].bmAttributes = ep_desc->bmAttributes;
649 alt->ep[ep_idx].bInterval = ep_desc->bInterval;
650 pksz = ep_desc->wMaxPacketSize;
651 pksz = (pksz & 0x07ff) * (1 + ((pksz >> 11) & 3));
652 alt->ep[ep_idx].wMaxPacketSize = pksz;
653 alt->ep[ep_idx].hw_pipe =
NULL;
655 return parsed_len + ep_desc->bLength;
667static int usbh_parse_interface(UDEV_T *udev, uint8_t *desc_buff,
int len)
669 int i, matched, parsed_len = 0;
672 IFACE_T *iface =
NULL;
675 iface = usbh_alloc_mem(
sizeof(*iface));
679 iface->aif = &iface->alt[0];
681 iface->if_num = ((DESC_IF_T *)desc_buff)->bInterfaceNumber;
688 if_desc = (DESC_IF_T *)desc_buff;
690 if(if_desc->bDescriptorType != USB_DT_INTERFACE)
692 desc_buff += if_desc->bLength;
693 parsed_len += if_desc->bLength;
694 len -= if_desc->bLength;
698 if(if_desc->bInterfaceNumber != iface->if_num)
703 if(if_desc->bNumEndpoints > MAX_EP_PER_IFACE)
705 USB_error(
"IF EP LIMITE %d\n", if_desc->bNumEndpoints);
711 desc_buff += if_desc->bLength;
712 parsed_len += if_desc->bLength;
713 len -= if_desc->bLength;
714 USB_vdebug(
"Descriptor Found - Interface %d, Alt: %d, num_alt:%d, remaining len: %d\n", if_desc->bInterfaceNumber, if_desc->bAlternateSetting, iface->num_alt, len);
719 if(iface->num_alt >= MAX_ALT_PER_IFACE)
730 hdr = (DESC_HDR_T *)desc_buff;
732 if((len < hdr->bLength) || (hdr->bLength < 2))
734 USB_error(
"ERR DESCRIPTOR IF LEN [0x%X %d]\n", hdr->bDescriptorType, hdr->bLength);
739 if(hdr->bDescriptorType == USB_DT_CONFIGURATION)
742 if((hdr->bDescriptorType == USB_DT_INTERFACE) || (hdr->bDescriptorType == USB_DT_ENDPOINT))
746 USB_vdebug(
"ignore descriptor 0x%X %d\n", hdr->bDescriptorType, hdr->bLength);
747 desc_buff += hdr->bLength;
748 parsed_len += hdr->bLength;
752 iface->alt[iface->num_alt].ifd = if_desc;
758 if(hdr->bDescriptorType == USB_DT_INTERFACE)
761 USB_vdebug(
"Finding %d endpoints of interface %d, alt %d...\n", if_desc->bNumEndpoints, if_desc->bInterfaceNumber, if_desc->bAlternateSetting);
764 for(i = 0; i < if_desc->bNumEndpoints; i++)
766 ret = usbh_parse_endpoint(&iface->alt[iface->num_alt - 1], i, desc_buff, len);
773 USB_vdebug(
"EP parse remaining %d\n", len);
783 for(i = 0; i < MAX_UDEV_DRIVER; i++)
785 if((_drivers[i] !=
NULL) && (_drivers[i]->probe(iface) == 0))
794 iface->driver = _drivers[i];
798 if(udev->iface_list ==
NULL)
799 udev->iface_list = iface;
802 iface->next = udev->iface_list;
803 udev->iface_list = iface;
808 usbh_free_mem(iface,
sizeof(*iface));
815 usbh_free_mem(iface,
sizeof(*iface));
820static int usbh_parse_configuration(UDEV_T *udev, uint8_t *desc_buff)
822 DESC_CONF_T *config = (DESC_CONF_T *)desc_buff;
826 len = config->wTotalLength;
828 desc_buff += config->bLength;
829 len -= config->bLength;
831 USB_vdebug(
"Parsing CONFIG =>\n");
833 for(i = 0; i < config->bNumInterfaces; i++)
838 while(len >=
sizeof(DESC_HDR_T))
840 hdr = (DESC_HDR_T *)desc_buff;
842 if((hdr->bLength > len) || (hdr->bLength < 2))
844 USB_error(
"ERR DESCRIPTOR CONFIG [%d]\n", hdr->bLength);
848 if(hdr->bDescriptorType == USB_DT_INTERFACE)
851 USB_debug(
"ignore descriptor 0x%X %d\n", hdr->bDescriptorType, hdr->bLength);
853 desc_buff += hdr->bLength;
857 ret = usbh_parse_interface(udev, desc_buff, len);
863 USB_vdebug(
"IFACE parse remaining %d\n", len);
868 USB_debug(
"ERR DESCRIPTOR CONFIG LEN %d\n", len);
874void print_usb_string(
char *lead, uint8_t *str)
878 USB_debug(
"%s", lead);
882 USB_debug(
"%c", str[i]);
888int connect_device(UDEV_T *udev)
894 USB_debug(
"Connect device =>\n");
896 delay_us(100 * 1000);
898 usbh_get_device_descriptor(udev, &udev->descriptor);
902 delay_us(100 * 1000);
904 ret = usbh_set_address(udev);
907 USB_debug(
"Set address command failed!!\n");
911 delay_us(100 * 1000);
913 USB_debug(
"New %s device address %d assigned.\n", (udev->speed == SPEED_HIGH) ?
"high-speed" : ((udev->speed == SPEED_FULL) ?
"full-speed" :
"low-speed"), udev->dev_num);
916 ret = usbh_get_device_descriptor(udev, &udev->descriptor);
919 free_dev_address(udev->dev_num);
923#if defined(DUMP_DESCRIPTOR) && defined(ENABLE_DEBUG_MSG)
924 dump_device_descriptor(&udev->descriptor);
927 if(udev->descriptor.bNumConfigurations != 1)
929 USB_debug(
"Warning! This device has multiple configurations [%d]. \n", udev->descriptor.bNumConfigurations);
932 conf = (DESC_CONF_T *)usbh_alloc_mem(MAX_DESC_BUFF_SIZE);
935 free_dev_address(udev->dev_num);
939 udev->cfd_buff = (uint8_t *)conf;
942 ret = usbh_get_config_descriptor(udev, (uint8_t *)conf, MAX_DESC_BUFF_SIZE);
945 free_dev_address(udev->dev_num);
949#if defined(DUMP_DESCRIPTOR) && defined(ENABLE_DEBUG_MSG)
950 dump_config_descriptor(conf);
954 str_buff = (uint8_t *)usbh_alloc_mem(MAX_DESC_BUFF_SIZE);
955 if(udev->descriptor.iManufacturer != 0)
957 usbh_get_string_descriptor(udev, udev->descriptor.iManufacturer, str_buff, MAX_DESC_BUFF_SIZE);
958 print_usb_string(
"Manufactor: ", str_buff);
960 if(udev->descriptor.iProduct != 0)
962 usbh_get_string_descriptor(udev, udev->descriptor.iProduct, str_buff, MAX_DESC_BUFF_SIZE);
963 print_usb_string(
"Product: ", str_buff);
965 if(udev->descriptor.iSerialNumber != 0)
967 usbh_get_string_descriptor(udev, udev->descriptor.iSerialNumber, str_buff, MAX_DESC_BUFF_SIZE);
968 print_usb_string(
"Serial Number: ", str_buff);
970 usbh_free_mem(str_buff, MAX_DESC_BUFF_SIZE);
974 ret = usbh_set_configuration(udev, conf->bConfigurationValue);
977 USB_debug(
"Set configuration %d failed!\n", conf->bConfigurationValue);
978 free_dev_address(udev->dev_num);
983 ret = usbh_parse_configuration(udev, (uint8_t *)conf);
986 USB_debug(
"Parse configuration %d failed!\n", conf->bConfigurationValue);
987 free_dev_address(udev->dev_num);
991 if(conf->bmAttributes & (1 << 5))
994 if(usbh_ctrl_xfer(udev, REQ_TYPE_OUT | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
995 USB_REQ_SET_FEATURE, 0x01, 0x0000, 0x0000,
996 NULL, &read_len, 300) < 0)
998 USB_debug(
"Device does not accept remote wakeup enable command.\n");
1003 g_conn_func(udev, 0);
1008int usbh_reset_device(UDEV_T *udev)
1015 USB_debug(
"Reset device =>\n");
1024 g_disconn_func(udev, 0);
1026 usbh_quit_xfer(udev, &(udev->ep0));
1029 iface = udev->iface_list;
1030 while(iface !=
NULL)
1032 udev->iface_list = iface->next;
1033 iface->driver->disconnect(iface);
1034 usbh_free_mem(iface,
sizeof(*iface));
1035 iface = udev->iface_list;
1044 delay_us(100 * 1000);
1050 dev_num = udev->dev_num;
1053 ret = usbh_ctrl_xfer(udev, REQ_TYPE_OUT | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
1054 USB_REQ_SET_ADDRESS, dev_num, 0, 0,
1055 NULL, &read_len, 100);
1056 udev->dev_num = dev_num;
1060 delay_us(100 * 1000);
1067 ret = usbh_get_device_descriptor(udev, &udev->descriptor);
1075 conf = (DESC_CONF_T *)udev->cfd_buff;
1078 ret = usbh_get_config_descriptor(udev, (uint8_t *)conf, MAX_DESC_BUFF_SIZE);
1083 ret = usbh_set_configuration(udev, udev->cur_conf);
1086 USB_debug(
"Set configuration %d failed!\n", udev->cur_conf);
1091 ret = usbh_parse_configuration(udev, (uint8_t *)conf);
1094 USB_debug(
"Parse configuration %d failed!\n", conf->bConfigurationValue);
1099 if(usbh_ctrl_xfer(udev, REQ_TYPE_OUT | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
1100 USB_REQ_SET_FEATURE, 0x01, 0x0000, 0x0000,
1101 NULL, &read_len, 300) < 0)
1103 USB_debug(
"Device not accept remote wakeup enable command.\n");
1107 g_conn_func(udev, 0);
1112void disconnect_device(UDEV_T *udev)
1116 USB_debug(
"disconnect device...\n");
1119 g_disconn_func(udev, 0);
1121 usbh_quit_xfer(udev, &(udev->ep0));
1124 iface = udev->iface_list;
1125 while(iface !=
NULL)
1127 udev->iface_list = iface->next;
1128 iface->driver->disconnect(iface);
1129 usbh_free_mem(iface,
sizeof(*iface));
1130 iface = udev->iface_list;
1134 free_dev_address(udev->dev_num);
1141static int check_device(UDEV_T *udev)
1162EP_INFO_T * usbh_iface_find_ep(IFACE_T *iface, uint8_t ep_addr, uint8_t dir_type)
1164 ALT_IFACE_T *aif = iface->aif;
1169 for(i = 0; i < aif->ifd->bNumEndpoints; i++)
1171 if(((aif->ep[i].bEndpointAddress & EP_ADDR_DIR_MASK) == (dir_type & EP_ADDR_DIR_MASK)) &&
1172 ((aif->ep[i].bmAttributes & EP_ATTR_TT_MASK) == (dir_type & EP_ATTR_TT_MASK)))
1178 for(i = 0; i < aif->ifd->bNumEndpoints; i++)
1180 if(aif->ep[i].bEndpointAddress == ep_addr)
1187void usbh_dump_buff_bytes(uint8_t *buff,
int nSize)
1194 printf(
"0x%04X ", nIdx);
1195 for(i = 0; i < 16; i++)
1196 printf(
"%02x ", buff[nIdx + i]);
1198 for(i = 0; i < 16; i++)
1200 if((buff[nIdx + i] >= 0x20) && (buff[nIdx + i] < 127))
1201 printf(
"%c", buff[nIdx + i]);
1212void usbh_dump_iface(IFACE_T *iface)
1214 USB_debug(
"\n [IFACE info] (0x%x)\n", (
int)iface);
1215 USB_debug(
" ----------------------------------------------\n");
1216 USB_debug(
" udev = 0x%x\n", (
int)iface->udev);
1217 USB_debug(
" if_num = %d\n", iface->if_num);
1218 USB_debug(
" driver = 0x%x\n", (
int)iface->driver);
1219 USB_debug(
" next = 0x%x\n", (
int)iface->next);
1220 usbh_dump_interface_descriptor(iface->aif->ifd);
1223void usbh_dump_ep_info(EP_INFO_T *ep)
1225 USB_debug(
"\n [Endpoint Info] (0x%x)\n", (
int)ep);
1226 USB_debug(
" ----------------------------------------------\n");
1227 USB_debug(
" bEndpointAddress = 0x%02x\n", ep->bEndpointAddress);
1228 USB_debug(
" bmAttributes = 0x%02x\n", ep->bmAttributes);
1229 USB_debug(
" bInterval = %d\n", ep->bInterval);
1230 USB_debug(
" wMaxPacketSize = %d\n", ep->wMaxPacketSize);
1231 USB_debug(
" hw_pipe = 0x%x\n", (
int)ep->hw_pipe);
#define USBH_HcRhStatus_DRWE_Msk
#define USBH_HcRhPortStatus_PSS_Msk
#define USBH_HcMiscControl_OCAL_Msk
#define USBH_HcInterruptEnable_RD_Msk
#define USBH_HcInterruptEnable_RHSC_Msk
#define USBH_HcControl_HCFS_Pos
#define USBH_HcRhPortStatus_CCS_Msk
#define USBH_HcRhPortStatus_POCI_Msk
NuMicro peripheral access layer header file.
__IO uint32_t HcPhyControl
__IO uint32_t HcRhPortStatus[2]
__IO uint32_t HcMiscControl
__IO uint32_t HcInterruptEnable
#define USBH_ERR_SET_CONFIG
#define USBH_ERR_SET_DEV_ADDR
#define USBH_ERR_INVALID_PARAM
#define USBH_ERR_IF_EP_LIMIT
#define USBH_ERR_NOT_FOUND
#define USBH_ERR_DESCRIPTOR
#define USBH_ERR_DATA_OVERRUN
#define USBH_ERR_IF_ALT_LIMIT
#define USBH_ERR_MEMORY_OUT
void usbh_suspend()
Suspend USB Host Controller and devices.
int usbh_pooling_hubs(void)
Let USB stack polls all root hubs and downstream hubs. If there's any hub port change found,...
HIDDEN_SYMBOLS void usbh_core_init()
Initialize M471M/R1/S USB Host controller and USB stack.
void usbh_install_conn_callback(CONN_FUNC *conn_func, CONN_FUNC *disconn_func)
Install device connect and disconnect callback function.
uint32_t get_ticks(void)
A function return current tick count.
void usbh_resume(void)
Resume USB Host controller and devices.
void() CONN_FUNC(struct udev_t *udev, int param)
USB Host hub class driver header file.
USB Host library header file.
static int reset_device(UDEV_T *udev)