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 HID 4 IN endpoints Problems

Hi All,
I followed http://www.keil.com/forum/docs/thread11649.asp
to try add 4 in endpoints with 64 byte data length on my MCB2300(LPC2368)board, But it can not be recognized. I can not fig it out what mistaks I made. My modified codes here based on the example USB_HID.

1.usbdesc.c

#include "type.h"

#include "usb.h"
#include "hid.h"
#include "usbcfg.h"
#include "usbdesc.h"

#define INREPORT_SIZE    64
#define OUTREPORT_SIZE  64
/* HID Report Descriptor */
const BYTE HID_ReportDescriptor0[] = {
  HID_UsagePageVendor(0x00),
  HID_Usage(0x01),
  HID_Collection(HID_Application),
    HID_UsagePage(HID_USAGE_PAGE_BUTTON),
    HID_UsageMin(1),
    HID_UsageMax(3),
    HID_LogicalMin(0),
    HID_LogicalMax(1),
    //HID_ReportCount(3),
    //HID_ReportSize(1),
        HID_ReportCount( INREPORT_SIZE ),   // bytes
    HID_ReportSize(8),                  // bits
    HID_Input(HID_Data | HID_Variable | HID_Absolute),
    //HID_ReportCount(1),
    //HID_ReportSize(5),
    //HID_Input(HID_Constant),
    HID_UsagePage(HID_USAGE_PAGE_LED),
    HID_Usage(HID_USAGE_LED_GENERIC_INDICATOR),
    HID_LogicalMin(0),
    HID_LogicalMax(1),
    HID_ReportCount(OUTREPORT_SIZE),
    HID_ReportSize(8),
    HID_Output(HID_Data | HID_Variable | HID_Absolute),
  HID_EndCollection,
};
const BYTE HID_ReportDescriptor1[] = {
  HID_UsagePageVendor(0x00),
  HID_Usage(0x01),
  HID_Collection(HID_Application),
    HID_UsagePage(HID_USAGE_PAGE_BUTTON),
    HID_UsageMin(1),
    HID_UsageMax(3),
    HID_LogicalMin(0),
    HID_LogicalMax(1),
    //HID_ReportCount(3),
    //HID_ReportSize(1),
        HID_ReportCount( INREPORT_SIZE ),   // bytes
    HID_ReportSize(8),                  // bits
    HID_Input(HID_Data | HID_Variable | HID_Absolute),
    //HID_ReportCount(1),
    //HID_ReportSize(5),
    //HID_Input(HID_Constant),
    HID_UsagePage(HID_USAGE_PAGE_LED),
    HID_Usage(HID_USAGE_LED_GENERIC_INDICATOR),
    HID_LogicalMin(0),
    HID_LogicalMax(1),
    HID_ReportCount(OUTREPORT_SIZE),
    HID_ReportSize(8),
    HID_Output(HID_Data | HID_Variable | HID_Absolute),
  HID_EndCollection,
};

Parents
  • Hi Tsuneo,
    I modified my code to make 4 endpoint sending data to PC first, but my firware just sends 64 byte endpoint1 data(data is genrated in GetInReport1()), other 3 endpoint data can not be sent, it looks like GetInReport2() GetInReport3()GetInReport4() are not called.following are waht I modified:

    //usbcfg.h
    #define USB_IF_NUM          5
    #define USB_EP_EVENT        0x493// endpoint 0,1,4,7 10???
    
    //usbcore.c
     switch (SetupPacket.bmRequestType.BM.Recipient) {
                case REQUEST_TO_INTERFACE:
    #if USB_HID
                  if ((SetupPacket.wIndex.WB.L == USB_HID_IF_NUM0)||
                                            (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM1)||
                                            (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM2)||
                                            (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM3)) {
                    switch (SetupPacket.bRequest) {
                      case HID_REQUEST_GET_REPORT:
                        if (HID_GetReport()) {
                          EP0Data.pData = EP0Buf;
                          USB_DataInStage();
                          goto class_ok;
                        }
                        break;
      ...
    
     //hiduser.c
     BOOL HID_GetReport (void) {
    
      int i;
      /* ReportID = SetupPacket.wValue.WB.L; */
      switch (SetupPacket.wValue.WB.H) {
        case HID_REPORT_INPUT:
            if (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM0){
                      GetInReport1();
                  for(i=0;i<INREPORT_SIZE;i++)
                            EP0Buf[i] = InReport1[i]; }
            else if(SetupPacket.wIndex.WB.L == USB_HID_IF_NUM1)     {
                      GetInReport2();
                  for(i=0;i<INREPORT_SIZE;i++)
                            EP0Buf[i] = InReport2[i];  }
            else if(SetupPacket.wIndex.WB.L == USB_HID_IF_NUM2){
                      GetInReport3();
                  for(i=0;i<INREPORT_SIZE;i++)
                            EP0Buf[i] = InReport3[i];}
            else if(SetupPacket.wIndex.WB.L == USB_HID_IF_NUM3){
                      GetInReport3();
                  for(i=0;i<INREPORT_SIZE;i++)
                            EP0Buf[i] = InReport3[i]; }
            break;
        case HID_REPORT_OUTPUT:
          return (FALSE);          /* Not Supported */
        case HID_REPORT_FEATURE:
          /* EP0Buf[] = ...; */
          /* break; */
          return (FALSE);          /* Not Supported */
      }
      return (TRUE);
    }
    
    void USB_EndPoint1 (DWORD event) {
    
      switch (event) {
        case USB_EVT_IN:
                    GetInReport1();
            USB_WriteEP(0x81, InReport1, sizeof(InReport1));
          break;
      }
    }
    
    void USB_EndPoint4 (DWORD event) {
         switch (event) {
             case USB_EVT_IN:
                    GetInReport2();
            USB_WriteEP(0x84, InReport2, sizeof(InReport2));
          break;
              }
    }
    
    void USB_EndPoint7 (DWORD event) {
            switch (event) {
            case USB_EVT_IN:
                    GetInReport3();
            USB_WriteEP(0x87, InReport3, sizeof(InReport3));
          break;
              }
    }
    
    void USB_EndPoint10 (DWORD event) {
            switch (event)
            {case USB_EVT_IN:
                    GetInReport4();
            USB_WriteEP(0x8A, InReport4, sizeof(InReport4));
          break;
              }
    }
    
    
    
    Thank you very much!
    
    Jack
    
    
    

Reply
  • Hi Tsuneo,
    I modified my code to make 4 endpoint sending data to PC first, but my firware just sends 64 byte endpoint1 data(data is genrated in GetInReport1()), other 3 endpoint data can not be sent, it looks like GetInReport2() GetInReport3()GetInReport4() are not called.following are waht I modified:

    //usbcfg.h
    #define USB_IF_NUM          5
    #define USB_EP_EVENT        0x493// endpoint 0,1,4,7 10???
    
    //usbcore.c
     switch (SetupPacket.bmRequestType.BM.Recipient) {
                case REQUEST_TO_INTERFACE:
    #if USB_HID
                  if ((SetupPacket.wIndex.WB.L == USB_HID_IF_NUM0)||
                                            (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM1)||
                                            (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM2)||
                                            (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM3)) {
                    switch (SetupPacket.bRequest) {
                      case HID_REQUEST_GET_REPORT:
                        if (HID_GetReport()) {
                          EP0Data.pData = EP0Buf;
                          USB_DataInStage();
                          goto class_ok;
                        }
                        break;
      ...
    
     //hiduser.c
     BOOL HID_GetReport (void) {
    
      int i;
      /* ReportID = SetupPacket.wValue.WB.L; */
      switch (SetupPacket.wValue.WB.H) {
        case HID_REPORT_INPUT:
            if (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM0){
                      GetInReport1();
                  for(i=0;i<INREPORT_SIZE;i++)
                            EP0Buf[i] = InReport1[i]; }
            else if(SetupPacket.wIndex.WB.L == USB_HID_IF_NUM1)     {
                      GetInReport2();
                  for(i=0;i<INREPORT_SIZE;i++)
                            EP0Buf[i] = InReport2[i];  }
            else if(SetupPacket.wIndex.WB.L == USB_HID_IF_NUM2){
                      GetInReport3();
                  for(i=0;i<INREPORT_SIZE;i++)
                            EP0Buf[i] = InReport3[i];}
            else if(SetupPacket.wIndex.WB.L == USB_HID_IF_NUM3){
                      GetInReport3();
                  for(i=0;i<INREPORT_SIZE;i++)
                            EP0Buf[i] = InReport3[i]; }
            break;
        case HID_REPORT_OUTPUT:
          return (FALSE);          /* Not Supported */
        case HID_REPORT_FEATURE:
          /* EP0Buf[] = ...; */
          /* break; */
          return (FALSE);          /* Not Supported */
      }
      return (TRUE);
    }
    
    void USB_EndPoint1 (DWORD event) {
    
      switch (event) {
        case USB_EVT_IN:
                    GetInReport1();
            USB_WriteEP(0x81, InReport1, sizeof(InReport1));
          break;
      }
    }
    
    void USB_EndPoint4 (DWORD event) {
         switch (event) {
             case USB_EVT_IN:
                    GetInReport2();
            USB_WriteEP(0x84, InReport2, sizeof(InReport2));
          break;
              }
    }
    
    void USB_EndPoint7 (DWORD event) {
            switch (event) {
            case USB_EVT_IN:
                    GetInReport3();
            USB_WriteEP(0x87, InReport3, sizeof(InReport3));
          break;
              }
    }
    
    void USB_EndPoint10 (DWORD event) {
            switch (event)
            {case USB_EVT_IN:
                    GetInReport4();
            USB_WriteEP(0x8A, InReport4, sizeof(InReport4));
          break;
              }
    }
    
    
    
    Thank you very much!
    
    Jack
    
    
    

Children
No data