This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

USB GamePad Problem

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.

Parents
  • 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);
    }
    

Reply
  • 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);
    }
    

Children
No data