25int _IsInUsbInterrupt = 0;
27static UDEV_DRV_T * _drivers[MAX_UDEV_DRIVER];
29static CONN_FUNC *g_conn_func, *g_disconn_func;
31static int _ovc_active_high = 0;
49 memset(_drivers, 0,
sizeof(_drivers));
52 g_disconn_func =
NULL;
93 _ovc_active_high = ovc_alv;
106 g_conn_func = conn_func;
107 g_disconn_func = disconn_func;
112 if (udev->parent ==
NULL)
115 return udev->hc_driver->rthub_port_reset(udev->port_num-1);
121 return udev->parent->port_reset(udev->parent, udev->port_num);
126static uint32_t ehci_UCMDR;
164 ehci_UCMDR = _ehci->
UCMDR;
182 USB_error(
"usbh_suspend - RUN/HCHalted error!\n");
216 _ehci->
UCMDR = ehci_UCMDR;
222 _ehci->
UPSCR[0] &= ~HSUSBH_UPSCR_FPR_Msk;
241int usbh_register_driver(UDEV_DRV_T *udrv)
245 for (i = 0; i < MAX_UDEV_DRIVER; i++)
247 if (_drivers[i] == udrv)
250 if (_drivers[i] ==
NULL)
276int usbh_ctrl_xfer(UDEV_T *udev, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex,
277 uint16_t wLength, uint8_t *buff, uint32_t *xfer_len, uint32_t timeout)
288 utr = alloc_utr(udev);
292 utr->setup.bmRequestType = bmRequestType;
293 utr->setup.bRequest = bRequest;
294 utr->setup.wValue = wValue;
295 utr->setup.wIndex = wIndex;
296 utr->setup.wLength = wLength;
299 utr->data_len = wLength;
300 utr->bIsTransferDone = 0;
301 status = udev->hc_driver->ctrl_xfer(utr);
304 udev->ep0.hw_pipe =
NULL;
310 while (utr->bIsTransferDone == 0)
316 udev->ep0.hw_pipe =
NULL;
321 status = utr->status;
325 *xfer_len = utr->xfer_len;
341int usbh_bulk_xfer(UTR_T *utr)
343 return utr->udev->hc_driver->bulk_xfer(utr);
354int usbh_int_xfer(UTR_T *utr)
356 return utr->udev->hc_driver->int_xfer(utr);
367int usbh_iso_xfer(UTR_T *utr)
369 if (utr->udev->hc_driver ==
NULL)
371 printf(
"hc_driver - 0x%x\n", (
int)utr->udev->hc_driver);
374 if (utr->udev->hc_driver->iso_xfer ==
NULL)
376 printf(
"iso_xfer - 0x%x\n", (
int)utr->udev->hc_driver->iso_xfer);
379 return utr->udev->hc_driver->iso_xfer(utr);
388int usbh_quit_utr(UTR_T *utr)
390 if (!utr || !utr->udev)
393 return utr->udev->hc_driver->quit_xfer(utr,
NULL);
404int usbh_quit_xfer(UDEV_T *udev, EP_INFO_T *ep)
406 return udev->hc_driver->quit_xfer(
NULL, ep);
410void dump_device_descriptor(DESC_DEV_T *desc)
412 USB_debug(
"\n[Device Descriptor]\n");
413 USB_debug(
"----------------------------------------------\n");
414 USB_debug(
" Length = %2d\n", desc->bLength);
415 USB_debug(
" DescriptorType = 0x%02x\n", desc->bDescriptorType);
416 USB_debug(
" USB version = %x.%02x\n",
417 desc->bcdUSB >> 8, desc->bcdUSB & 0xff);
418 USB_debug(
" Vendor:Product = %04x:%04x\n",
419 desc->idVendor, desc->idProduct);
420 USB_debug(
" MaxPacketSize0 = %d\n", desc->bMaxPacketSize0);
421 USB_debug(
" NumConfigurations = %d\n", desc->bNumConfigurations);
422 USB_debug(
" Device version = %x.%02x\n",
423 desc->bcdDevice >> 8, desc->bcdDevice & 0xff);
424 USB_debug(
" Device Class:SubClass:Protocol = %02x:%02x:%02x\n",
425 desc->bDeviceClass, desc->bDeviceSubClass, desc->bDeviceProtocol);
428void usbh_dump_interface_descriptor(DESC_IF_T *if_desc)
430 USB_debug(
"\n [Interface Descriptor]\n");
431 USB_debug(
" ----------------------------------------------\n");
432 USB_debug(
" Length = %2d\n", if_desc->bLength);
433 USB_debug(
" DescriptorType = %02x\n", if_desc->bDescriptorType);
434 USB_debug(
" bInterfaceNumber = %d\n", if_desc->bInterfaceNumber);
435 USB_debug(
" bAlternateSetting = %d\n", if_desc->bAlternateSetting);
436 USB_debug(
" bNumEndpoints = %d\n", if_desc->bNumEndpoints);
437 USB_debug(
" bInterfaceClass = 0x%02x\n", if_desc->bInterfaceClass);
438 USB_debug(
" bInterfaceSubClass = 0x%02x\n", if_desc->bInterfaceSubClass);
439 USB_debug(
" bInterfaceProtocol = 0x%02x\n", if_desc->bInterfaceProtocol);
440 USB_debug(
" iInterface = %d\n", if_desc->iInterface);
443void usbh_dump_endpoint_descriptor(DESC_EP_T *ep_desc)
445 USB_debug(
"\n [Endpoint Descriptor]\n");
446 USB_debug(
" ----------------------------------------------\n");
447 USB_debug(
" Length = %2d\n", ep_desc->bLength);
448 USB_debug(
" DescriptorType = %02x\n", ep_desc->bDescriptorType);
449 USB_debug(
" bEndpointAddress = 0x%02x\n", ep_desc->bEndpointAddress);
450 USB_debug(
" bmAttributes = 0x%02x\n", ep_desc->bmAttributes);
451 USB_debug(
" wMaxPacketSize = %d\n", ep_desc->wMaxPacketSize);
452 USB_debug(
" bInterval = %d\n", ep_desc->bInterval);
453 USB_debug(
" bRefresh = %d\n", ep_desc->bRefresh);
454 USB_debug(
" bSynchAddress = %d\n", ep_desc->bSynchAddress);
457void dump_config_descriptor(DESC_CONF_T *desc)
459 uint8_t *bptr = (uint8_t *)desc;
461 int tlen = desc->wTotalLength;
467 case USB_DT_CONFIGURATION:
468 USB_debug(
"\n[Configuration Descriptor]\n");
469 USB_debug(
"----------------------------------------------\n");
470 USB_debug(
" Length = %2d\n", desc->bLength);
471 USB_debug(
" DescriptorType = %02x\n", desc->bDescriptorType);
472 USB_debug(
" wTotalLength = %2d\n", desc->wTotalLength);
473 USB_debug(
" bNumInterfaces = %d\n", desc->bNumInterfaces);
474 USB_debug(
" bConfigurationValue = %d\n", desc->bConfigurationValue);
475 USB_debug(
" iConfiguration = %d\n", desc->iConfiguration);
476 USB_debug(
" bmAttributes = 0x%02x\n", desc->bmAttributes);
477 USB_debug(
" MaxPower = %d\n", desc->MaxPower);
480 case USB_DT_INTERFACE:
481 usbh_dump_interface_descriptor((DESC_IF_T *)bptr);
484 case USB_DT_ENDPOINT:
485 usbh_dump_endpoint_descriptor((DESC_EP_T *)bptr);
489 hdr = (DESC_HDR_T *)bptr;
490 USB_debug(
"\n!![Unknown Descriptor]\n");
491 USB_debug(
"----------------------------------------------\n");
492 USB_debug(
"Length = %2d\n", hdr->bLength);
493 USB_debug(
"DescriptorType = %02x\n", hdr->bDescriptorType);
508int usbh_set_address(UDEV_T *udev)
513 if (udev->dev_num != 0)
516 dev_num = alloc_dev_address();
521 ret = usbh_ctrl_xfer(udev, REQ_TYPE_OUT | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
522 USB_REQ_SET_ADDRESS, dev_num, 0, 0,
523 NULL, &read_len, 100);
526 free_dev_address(dev_num);
530 udev->dev_num = dev_num;
540int usbh_set_configuration(UDEV_T *udev, uint8_t conf_val)
546 if (udev->cur_conf == conf_val)
550 if (udev->cur_conf != -1)
556 ret = usbh_ctrl_xfer(udev, REQ_TYPE_OUT | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
557 USB_REQ_SET_CONFIGURATION, conf_val, 0, 0,
558 NULL, &read_len, 300);
562 udev->cur_conf = (int8_t)conf_val;
574int usbh_set_interface(IFACE_T *iface, uint16_t alt_setting)
576 ALT_IFACE_T *aif =
NULL;
580 for (i = 0; i < iface->num_alt; i++)
582 if (iface->alt[i].ifd->bAlternateSetting == alt_setting)
584 aif = &iface->alt[i];
591 ret = usbh_ctrl_xfer(iface->udev, REQ_TYPE_OUT | REQ_TYPE_STD_DEV | REQ_TYPE_TO_IFACE,
592 USB_REQ_SET_INTERFACE, alt_setting, iface->if_num, 0,
593 NULL, &xfer_len, 100);
606int usbh_get_device_descriptor(UDEV_T *udev, DESC_DEV_T *desc_buff)
612 for (retry = 0; retry < 3; retry++)
614 ret = usbh_ctrl_xfer(udev, REQ_TYPE_IN | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
615 USB_REQ_GET_DESCRIPTOR,
616 ((USB_DT_STANDARD | USB_DT_DEVICE) << 8), 0,
sizeof(DESC_DEV_T),
617 (uint8_t *)desc_buff, &read_len, timeout);
621 USB_debug(
"Get device descriptor failed - %d, retry!\n", ret);
634int usbh_get_config_descriptor(UDEV_T *udev, uint8_t *desc_buff,
int buff_len)
637 DESC_CONF_T *conf = (DESC_CONF_T *)desc_buff;
643 ret = usbh_ctrl_xfer(udev, REQ_TYPE_IN | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
644 USB_REQ_GET_DESCRIPTOR,
645 ((USB_DT_STANDARD | USB_DT_CONFIGURATION) << 8), 0, 9,
646 desc_buff, &read_len, 200);
650 if (conf->wTotalLength > buff_len)
652 USB_error(
"Device configuration %d length > %d!\n", conf->wTotalLength, buff_len);
656 read_len = conf->wTotalLength;
658 ret = usbh_ctrl_xfer(udev, REQ_TYPE_IN | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
659 USB_REQ_GET_DESCRIPTOR,
660 ((USB_DT_STANDARD | USB_DT_CONFIGURATION) << 8), 0, read_len,
661 desc_buff, &read_len, 200);
678int usbh_get_string_descriptor(UDEV_T *udev,
int index, uint8_t *desc_buff,
int buff_len)
686 ret = usbh_ctrl_xfer(udev, REQ_TYPE_IN | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
687 USB_REQ_GET_DESCRIPTOR,
688 ((USB_DT_STANDARD | USB_DT_STRING) << 8) | index, 0x0409, buff_len,
689 desc_buff, &read_len, 200);
700int usbh_clear_halt(UDEV_T *udev, uint16_t ep_addr)
704 USB_debug(
"Clear endpoint 0x%x halt.\n", ep_addr);
705 return usbh_ctrl_xfer(udev, REQ_TYPE_OUT | REQ_TYPE_STD_DEV | REQ_TYPE_TO_EP,
706 USB_REQ_CLEAR_FEATURE, 0, ep_addr, 0,
707 NULL, &read_len, 100);
710static int usbh_parse_endpoint(ALT_IFACE_T *alt,
int ep_idx, uint8_t *desc_buff,
int len)
718 ep_desc = (DESC_EP_T *)desc_buff;
720 if ((len < ep_desc->bLength) || (ep_desc->bLength < 2))
722 USB_error(
"ERR DESCRIPTOR EP LEN [0x%X %d]\n", ep_desc->bDescriptorType, ep_desc->bLength);
726 if (ep_desc->bDescriptorType == USB_DT_ENDPOINT)
730 USB_vdebug(
"ignore descriptor 0x%X %d\n", ep_desc->bDescriptorType, ep_desc->bLength);
731 desc_buff += ep_desc->bLength;
732 parsed_len += ep_desc->bLength;
733 len -= ep_desc->bLength;
736 USB_vdebug(
"Descriptor Found - Alt: %d, Endpoint 0x%x, remaining len: %d\n", alt->ifd->bAlternateSetting, ep_desc->bEndpointAddress, len);
738 alt->ep[ep_idx].bEndpointAddress = ep_desc->bEndpointAddress;
739 alt->ep[ep_idx].bmAttributes = ep_desc->bmAttributes;
740 alt->ep[ep_idx].bInterval = ep_desc->bInterval;
741 pksz = ep_desc->wMaxPacketSize;
742 pksz = (pksz & 0x07ff) * (1 + ((pksz >> 11) & 3));
743 alt->ep[ep_idx].wMaxPacketSize = pksz;
744 alt->ep[ep_idx].hw_pipe =
NULL;
746 return parsed_len + ep_desc->bLength;
758static int usbh_parse_interface(UDEV_T *udev, uint8_t *desc_buff,
int len)
760 int i, matched, parsed_len = 0;
763 IFACE_T *iface =
NULL;
766 iface = usbh_alloc_mem(
sizeof(*iface));
770 iface->aif = &iface->alt[0];
772 iface->if_num = ((DESC_IF_T *)desc_buff)->bInterfaceNumber;
779 if_desc = (DESC_IF_T *)desc_buff;
781 if (if_desc->bDescriptorType != USB_DT_INTERFACE)
783 desc_buff += if_desc->bLength;
784 parsed_len += if_desc->bLength;
785 len -= if_desc->bLength;
789 if (if_desc->bInterfaceNumber != iface->if_num)
794 if (if_desc->bNumEndpoints > MAX_EP_PER_IFACE)
796 USB_error(
"IF EP LIMITE %d\n", if_desc->bNumEndpoints);
802 desc_buff += if_desc->bLength;
803 parsed_len += if_desc->bLength;
804 len -= if_desc->bLength;
805 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);
810 if (iface->num_alt >= MAX_ALT_PER_IFACE)
821 hdr = (DESC_HDR_T *)desc_buff;
823 if ((len < hdr->bLength) || (hdr->bLength < 2))
825 USB_error(
"ERR DESCRIPTOR IF LEN [0x%X %d]\n", hdr->bDescriptorType, hdr->bLength);
830 if (hdr->bDescriptorType == USB_DT_CONFIGURATION)
833 if ((hdr->bDescriptorType == USB_DT_INTERFACE) || (hdr->bDescriptorType == USB_DT_ENDPOINT))
837 USB_vdebug(
"ignore descriptor 0x%X %d\n", hdr->bDescriptorType, hdr->bLength);
838 desc_buff += hdr->bLength;
839 parsed_len += hdr->bLength;
843 iface->alt[iface->num_alt].ifd = if_desc;
849 if (hdr->bDescriptorType == USB_DT_INTERFACE)
852 USB_vdebug(
"Finding %d endpoints of interface %d, alt %d...\n", if_desc->bNumEndpoints, if_desc->bInterfaceNumber, if_desc->bAlternateSetting);
855 for (i = 0; i < if_desc->bNumEndpoints; i++)
857 ret = usbh_parse_endpoint(&iface->alt[iface->num_alt-1], i, desc_buff, len);
864 USB_vdebug(
"EP parse remaining %d\n", len);
874 for (i = 0; i < MAX_UDEV_DRIVER; i++)
876 if ((_drivers[i] !=
NULL) && (_drivers[i]->probe(iface) == 0))
885 iface->driver = _drivers[i];
889 if (udev->iface_list ==
NULL)
890 udev->iface_list = iface;
893 iface->next = udev->iface_list;
894 udev->iface_list = iface;
899 usbh_free_mem(iface,
sizeof(*iface));
906 usbh_free_mem(iface,
sizeof(*iface));
911static int usbh_parse_configuration(UDEV_T *udev, uint8_t *desc_buff)
913 DESC_CONF_T *config = (DESC_CONF_T *)desc_buff;
917 len = config->wTotalLength;
919 desc_buff += config->bLength;
920 len -= config->bLength;
922 USB_vdebug(
"Parsing CONFIG =>\n");
924 for (i = 0; i < config->bNumInterfaces; i++)
929 while (len >=
sizeof(DESC_HDR_T))
931 hdr = (DESC_HDR_T *)desc_buff;
933 if ((hdr->bLength > len) || (hdr->bLength < 2))
935 USB_error(
"ERR DESCRIPTOR CONFIG [%d]\n", hdr->bLength);
939 if (hdr->bDescriptorType == USB_DT_INTERFACE)
942 USB_debug(
"ignore descriptor 0x%X %d\n", hdr->bDescriptorType, hdr->bLength);
944 desc_buff += hdr->bLength;
948 ret = usbh_parse_interface(udev, desc_buff, len);
954 USB_vdebug(
"IFACE parse remaining %d\n", len);
959 USB_debug(
"ERR DESCRIPTOR CONFIG LEN %d\n", len);
965void print_usb_string(
char *lead, uint8_t *str)
969 USB_debug(
"%s", lead);
973 USB_debug(
"%c", str[i]);
979int connect_device(UDEV_T *udev)
985 USB_debug(
"Connect device =>\n");
987 delay_us(100 * 1000);
989 usbh_get_device_descriptor(udev, &udev->descriptor);
993 delay_us(100 * 1000);
995 ret = usbh_set_address(udev);
998 USB_debug(
"Set address command failed!!\n");
1002 delay_us(100 * 1000);
1004 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);
1007 ret = usbh_get_device_descriptor(udev, &udev->descriptor);
1010 free_dev_address(udev->dev_num);
1014#if defined(DUMP_DESCRIPTOR) && defined(ENABLE_DEBUG_MSG)
1015 dump_device_descriptor(&udev->descriptor);
1018 if (udev->descriptor.bNumConfigurations != 1)
1020 USB_debug(
"Warning! This device has multiple configurations [%d]. \n", udev->descriptor.bNumConfigurations);
1023 conf = (DESC_CONF_T *)usbh_alloc_mem(MAX_DESC_BUFF_SIZE);
1026 free_dev_address(udev->dev_num);
1030 udev->cfd_buff = (uint8_t *)conf;
1033 ret = usbh_get_config_descriptor(udev, (uint8_t *)conf, MAX_DESC_BUFF_SIZE);
1036 free_dev_address(udev->dev_num);
1040#if defined(DUMP_DESCRIPTOR) && defined(ENABLE_DEBUG_MSG)
1041 dump_config_descriptor(conf);
1045 str_buff = (uint8_t *)usbh_alloc_mem(MAX_DESC_BUFF_SIZE);
1046 if (udev->descriptor.iManufacturer != 0)
1048 usbh_get_string_descriptor(udev, udev->descriptor.iManufacturer, str_buff, MAX_DESC_BUFF_SIZE);
1049 print_usb_string(
"Manufactor: ", str_buff);
1051 if (udev->descriptor.iProduct != 0)
1053 usbh_get_string_descriptor(udev, udev->descriptor.iProduct, str_buff, MAX_DESC_BUFF_SIZE);
1054 print_usb_string(
"Product: ", str_buff);
1056 if (udev->descriptor.iSerialNumber != 0)
1058 usbh_get_string_descriptor(udev, udev->descriptor.iSerialNumber, str_buff, MAX_DESC_BUFF_SIZE);
1059 print_usb_string(
"Serial Number: ", str_buff);
1061 usbh_free_mem(str_buff, MAX_DESC_BUFF_SIZE);
1065 ret = usbh_set_configuration(udev, conf->bConfigurationValue);
1068 USB_debug(
"Set configuration %d failed!\n", conf->bConfigurationValue);
1069 free_dev_address(udev->dev_num);
1074 ret = usbh_parse_configuration(udev, (uint8_t *)conf);
1077 USB_debug(
"Parse configuration %d failed!\n", conf->bConfigurationValue);
1078 free_dev_address(udev->dev_num);
1082 if (conf->bmAttributes & (1<<5))
1085 if (usbh_ctrl_xfer(udev, REQ_TYPE_OUT | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
1086 USB_REQ_SET_FEATURE, 0x01, 0x0000, 0x0000,
1087 NULL, &read_len, 300) < 0)
1089 USB_debug(
"Device does not accept remote wakeup enable command.\n");
1094 g_conn_func(udev, 0);
1099int usbh_reset_device(UDEV_T *udev)
1106 USB_debug(
"Reset device =>\n");
1115 g_disconn_func(udev, 0);
1117 usbh_quit_xfer(udev, &(udev->ep0));
1120 iface = udev->iface_list;
1121 while (iface !=
NULL)
1123 udev->iface_list = iface->next;
1124 iface->driver->disconnect(iface);
1125 usbh_free_mem(iface,
sizeof(*iface));
1126 iface = udev->iface_list;
1135 delay_us(100 * 1000);
1141 dev_num = udev->dev_num;
1144 ret = usbh_ctrl_xfer(udev, REQ_TYPE_OUT | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
1145 USB_REQ_SET_ADDRESS, dev_num, 0, 0,
1146 NULL, &read_len, 100);
1147 udev->dev_num = dev_num;
1151 delay_us(100 * 1000);
1158 ret = usbh_get_device_descriptor(udev, &udev->descriptor);
1166 conf = (DESC_CONF_T *)udev->cfd_buff;
1169 ret = usbh_get_config_descriptor(udev, (uint8_t *)conf, MAX_DESC_BUFF_SIZE);
1174 ret = usbh_set_configuration(udev, udev->cur_conf);
1177 USB_debug(
"Set configuration %d failed!\n", udev->cur_conf);
1182 ret = usbh_parse_configuration(udev, (uint8_t *)conf);
1185 USB_debug(
"Parse configuration %d failed!\n", conf->bConfigurationValue);
1190 if (usbh_ctrl_xfer(udev, REQ_TYPE_OUT | REQ_TYPE_STD_DEV | REQ_TYPE_TO_DEV,
1191 USB_REQ_SET_FEATURE, 0x01, 0x0000, 0x0000,
1192 NULL, &read_len, 300) < 0)
1194 USB_debug(
"Device not accept remote wakeup enable command.\n");
1198 g_conn_func(udev, 0);
1203void disconnect_device(UDEV_T *udev)
1207 USB_debug(
"disconnect device...\n");
1210 g_disconn_func(udev, 0);
1212 usbh_quit_xfer(udev, &(udev->ep0));
1215 iface = udev->iface_list;
1216 while (iface !=
NULL)
1218 udev->iface_list = iface->next;
1219 iface->driver->disconnect(iface);
1220 usbh_free_mem(iface,
sizeof(*iface));
1221 iface = udev->iface_list;
1225 free_dev_address(udev->dev_num);
1232static int check_device(UDEV_T *udev)
1253EP_INFO_T * usbh_iface_find_ep(IFACE_T *iface, uint8_t ep_addr, uint8_t dir_type)
1255 ALT_IFACE_T *aif = iface->aif;
1260 for (i = 0; i < aif->ifd->bNumEndpoints; i++)
1262 if (((aif->ep[i].bEndpointAddress & EP_ADDR_DIR_MASK) == (dir_type & EP_ADDR_DIR_MASK)) &&
1263 ((aif->ep[i].bmAttributes & EP_ATTR_TT_MASK) == (dir_type & EP_ATTR_TT_MASK)))
1269 for (i = 0; i < aif->ifd->bNumEndpoints; i++)
1271 if (aif->ep[i].bEndpointAddress == ep_addr)
1278void usbh_dump_buff_bytes(uint8_t *buff,
int nSize)
1285 printf(
"0x%04X ", nIdx);
1286 for (i = 0; i < 16; i++)
1287 printf(
"%02x ", buff[nIdx + i]);
1289 for (i = 0; i < 16; i++)
1291 if ((buff[nIdx + i] >= 0x20) && (buff[nIdx + i] < 127))
1292 printf(
"%c", buff[nIdx + i]);
1303void usbh_dump_iface(IFACE_T *iface)
1305 USB_debug(
"\n [IFACE info] (0x%x)\n", (
int)iface);
1306 USB_debug(
" ----------------------------------------------\n");
1307 USB_debug(
" udev = 0x%x\n", iface->udev);
1308 USB_debug(
" if_num = %d\n", iface->if_num);
1309 USB_debug(
" driver = 0x%x\n", (
int)iface->driver);
1310 USB_debug(
" next = 0x%x\n", (
int)iface->next);
1311 usbh_dump_interface_descriptor(iface->aif->ifd);
1314void usbh_dump_ep_info(EP_INFO_T *ep)
1316 USB_debug(
"\n [Endpoint Info] (0x%x)\n", (
int)ep);
1317 USB_debug(
" ----------------------------------------------\n");
1318 USB_debug(
" bEndpointAddress = 0x%02x\n", ep->bEndpointAddress);
1319 USB_debug(
" bmAttributes = 0x%02x\n", ep->bmAttributes);
1320 USB_debug(
" bInterval = %d\n", ep->bInterval);
1321 USB_debug(
" wMaxPacketSize = %d\n", ep->wMaxPacketSize);
1322 USB_debug(
" hw_pipe = 0x%x\n", (
int)ep->hw_pipe);
NuMicro peripheral access layer header file.
#define NULL
NULL pointer.
#define HSUSBH_UCMDR_RUN_Msk
#define SYS_CSERVER_VERSION_Msk
#define HSUSBH_UPSCR_PE_Msk
#define USBH_HcRhStatus_DRWE_Msk
#define HSUSBH_UCMDR_ASEN_Msk
#define USBH_HcRhPortStatus_PSS_Msk
#define HSUSBH_USTSR_HCHalted_Msk
#define HSUSBH_UPSCR_SUSPEND_Msk
#define USBH_HcMiscControl_OCAL_Msk
#define USBH_HcInterruptEnable_RD_Msk
#define HSUSBH_UCMDR_PSEN_Msk
#define USBH_HcInterruptEnable_RHSC_Msk
#define USBH_HcControl_HCFS_Pos
#define USBH_HcRhPortStatus_CCS_Msk
#define USBH_HcRhPortStatus_POCI_Msk
#define HSUSBH_UPSCR_FPR_Msk
#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 M480 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.
void usbh_core_init_ex(int ovc_alv)
Initialize M480 USB Host controller and USB stack.
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.
__IO uint32_t HcRhPortStatus[2]
__IO uint32_t HcMiscControl
__IO uint32_t HcInterruptEnable
USB Host library header file.
static int reset_device(UDEV_T *udev)