lpcware

Composte device on LPC1765

Discussion created by lpcware Employee on Jun 15, 2016
Latest reply on Jun 15, 2016 by lpcware
Content originally posted in LPCWare by kempsun on Sun Jul 22 00:54:29 MST 2012
Hi all,

  I composted a HID keyboard and CDC in the descriptor,and enumeration seems work find on WIN7 64bit.
  But I can only receive from the PC, send to HOST is not working, both HID and CDC bulk in.

  EP macros:
#define KEYBOARD_EPNUM                 1

/** Endpoint number of the CDC device-to-host notification IN endpoint. */
#define CDC_NOTIFICATION_EPNUM         2

/** Endpoint number of the CDC device-to-host data IN endpoint. */
#define CDC_TX_EPNUM                   3

/** Endpoint number of the CDC host-to-device data OUT endpoint. */
#define CDC_RX_EPNUM                   4

  Descriptor:

  const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
{
.Config =
{
.Header                 = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},

.TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
.TotalInterfaces        = 3,

.ConfigurationNumber    = 1,
.ConfigurationStrIndex  = NO_DESCRIPTOR,

.ConfigAttributes       = (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELFPOWERED),

.MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)
},

.HID_Interface =
{
.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},

.InterfaceNumber        = 0x00,
.AlternateSetting       = 0x00,

.TotalEndpoints         = 1,

.Class                  = HID_CSCP_HIDClass,
.SubClass               = HID_CSCP_BootSubclass,
.Protocol               = HID_CSCP_KeyboardBootProtocol,

.InterfaceStrIndex      = NO_DESCRIPTOR
},

.HID_KeyboardHID =
{
.Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},

.HIDSpec                = VERSION_BCD(01.11),
.CountryCode            = 0x00,
.TotalReportDescriptors = 1,
.HIDReportType          = HID_DTYPE_Report,
.HIDReportLength        = sizeof(KeyboardReport)
},

.HID_ReportINEndpoint =
{
.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},

.EndpointAddress        = (ENDPOINT_DIR_IN | KEYBOARD_EPNUM),
.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
.EndpointSize           = KEYBOARD_EPSIZE,
.PollingIntervalMS      = 0x10
},

.IAD =
{
.Header                  = {.Size = sizeof(USB_Descriptor_Interface_Association_t), .Type = DTYPE_InterfaceAssociation},

.FirstInterfaceIndex     = 1,
.TotalInterfaces         = 2,

.Class                   = 0x02,
.SubClass                = 0x02,
.Protocol                = 0x00,
.IADStrIndex             = NO_DESCRIPTOR
},

.CDC_CCI_Interface =
{
.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},

.InterfaceNumber        = 1,
.AlternateSetting       = 0,

.TotalEndpoints         = 1,

.Class                  = CDC_CSCP_CDCClass,
.SubClass               = CDC_CSCP_ACMSubclass,
.Protocol               = CDC_CSCP_ATCommandProtocol,

.InterfaceStrIndex      = NO_DESCRIPTOR
},

.CDC_Functional_Header =
{
.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface},
.Subtype                = CDC_DSUBTYPE_CSInterface_Header,

.CDCSpecification       = VERSION_BCD(01.10),
},

.CDC_Functional_ACM =
{
.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface},
.Subtype                = CDC_DSUBTYPE_CSInterface_ACM,

.Capabilities           = 0x06,
},

.CDC_Functional_Union =
{
.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface},
.Subtype                = CDC_DSUBTYPE_CSInterface_Union,

.MasterInterfaceNumber  = 1,
.SlaveInterfaceNumber   = 2,
},

.CDC_NotificationEndpoint =
{
.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},

//.EndpointAddress        = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_NOTIFICATION_EPNUM),
.EndpointAddress        = (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM),
.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
.EndpointSize           = CDC_NOTIFICATION_EPSIZE,
.PollingIntervalMS      = 0xFF
},

.CDC_DCI_Interface =
{
.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},

.InterfaceNumber        = 2,
.AlternateSetting       = 0,

.TotalEndpoints         = 2,

.Class                  = CDC_CSCP_CDCDataClass,
.SubClass               = CDC_CSCP_NoDataSubclass,
.Protocol               = CDC_CSCP_NoDataProtocol,

.InterfaceStrIndex      = NO_DESCRIPTOR
},

.CDC_DataOutEndpoint =
{
.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},

//.EndpointAddress        = (ENDPOINT_DESCRIPTOR_DIR_OUT | CDC_RX_EPNUM),
.EndpointAddress        = (ENDPOINT_DIR_OUT | CDC_RX_EPNUM),
.Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
.EndpointSize           = CDC_TXRX_EPSIZE,
.PollingIntervalMS      = 0x01
},

.CDC_DataInEndpoint =
{
.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},

//.EndpointAddress        = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_TX_EPNUM),
.EndpointAddress        = (ENDPOINT_DIR_IN | CDC_TX_EPNUM),
.Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
.EndpointSize           = CDC_TXRX_EPSIZE,
.PollingIntervalMS      = 0x01
}
};

 
  Anyone has any idea?

  I'm blandly new of embed development. Thanks for help.

Outcomes