Hello,
I have used mcb1768 board and OHCI stack for keil HID USB examples. Both keyboard and mouse functions have been run perfectly. But when I connect Gamepad to usb the program is locked. I have changed Endpoint type in USB_core.c from "USB_ENDPOINT_TYPE_CONTROL" to "USB_ENDPOINT_TYPE_BULK" program seems not locked but I havent seen usb datas on LCD.
try to make subclass, device and protocol type NONE instead of BOOT in USBH_HID_Configure part in (usbh_hid.c)
USBH_ERROR USBH_HID_Configure (U8 dev_adr, U8 dev_spd, USB_CONFIGURATION_DESCRIPTOR *ptrCfgDesc) { USB_INTERFACE_DESCRIPTOR *ptrIntfcDesc; HID_DESCRIPTOR *ptrHIDDesc; USB_ENDPOINT_DESCRIPTOR *ptrEPDesc; U8 num; ptrIntfcDesc = (USB_INTERFACE_DESCRIPTOR *)((U32)ptrCfgDesc + ptrCfgDesc->bLength); num = ptrIntfcDesc->bNumEndpoints; /* Number of endpoints */ printf ("\nK:%1d",num); switch (ptrIntfcDesc->bInterfaceClass) { case USB_DEVICE_CLASS_HUMAN_INTERFACE: switch (ptrIntfcDesc->bInterfaceSubClass) { case HID_SUBCLASS_NONE: /* Interface Subclass else than mouse and keyboard*/ HID[0].DevAdr = dev_adr; HID[0].DevSpd = dev_spd; printf ("\t M:%1d",HID[0].DevAdr); // printf ("\n M:%1d",HID[0].DevSpd); /* HID Descriptor */ ptrHIDDesc = (HID_DESCRIPTOR *)((U32)ptrIntfcDesc + ptrIntfcDesc->bLength); HID[0].ReportDescTyp = ptrHIDDesc->DescriptorList[0].bDescriptorType; HID[0].ReportDescLen = ptrHIDDesc->DescriptorList[0].wDescriptorLength; if (ptrIntfcDesc->bInterfaceProtocol == HID_PROTOCOL_NONE) { HID[0].DevTyp = HID_PROTOCOL_NONE; printf ("\t D:%1x",ptrEPDesc->bmAttributes); /* Interrupt IN Endpoint */ ptrEPDesc = (USB_ENDPOINT_DESCRIPTOR *)((U32)ptrHIDDesc + ptrHIDDesc->bLength); printf ("\t C:%1x",ptrEPDesc->bEndpointAddress); while (num--) { if ((ptrEPDesc->bmAttributes & 3) == 3) { /* Interrupt EP */ if (ptrEPDesc->bEndpointAddress & 0x80) { /* IN Endpoint */ HID[0].HndlIntIn = HCD.USBH_HCD_EP_Add(dev_adr, dev_spd, ptrEPDesc); HID[0].ReportInDataLen = ptrEPDesc->wMaxPacketSize; if (!HID[0].HndlIntIn) return (USBH_EP_NOT_AVAILABLE_ERROR); } } ptrEPDesc++; } } if (ptrIntfcDesc->bInterfaceProtocol == HID_PROTOCOL_KEYBOARD) { HID[0].DevTyp = HID_PROTOCOL_KEYBOARD; /* Interrupt IN Endpoint */ ptrEPDesc = (USB_ENDPOINT_DESCRIPTOR *)((U32)ptrHIDDesc + ptrHIDDesc->bLength); while (num--) { if ((ptrEPDesc->bmAttributes & 3) == 3) { /* Interrupt EP */ if (ptrEPDesc->bEndpointAddress & 0x80) { /* IN Endpoint */ HID[0].HndlIntIn = HCD.USBH_HCD_EP_Add(dev_adr, dev_spd, ptrEPDesc); HID[0].ReportInDataLen = ptrEPDesc->wMaxPacketSize; if (!HID[0].HndlIntIn) return (USBH_EP_NOT_AVAILABLE_ERROR); } else { /* OUT Enpoint */ HID[0].HndlIntOut = HCD.USBH_HCD_EP_Add(dev_adr, dev_spd, ptrEPDesc); HID[0].ReportOutDataLen = ptrEPDesc->wMaxPacketSize; if (!HID[0].HndlIntOut) return (USBH_EP_NOT_AVAILABLE_ERROR); } } ptrEPDesc++; } } break; } break; } return (USBH_OK); }