From a81a7475f55feb33116a9101c9c24f9568f28678 Mon Sep 17 00:00:00 2001 From: AJM Date: Mon, 19 Apr 2010 16:44:20 -0400 Subject: Added the virtual com port descriptors based on the LUFA/MYUsb model (which was great). Still need to flesh out quite a few macros that were referenced but never defined. --- core/usb/descriptors.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++++ core/usb/descriptors.h | 88 +++++++++++++++++++++++++++++++++++ 2 files changed, 210 insertions(+) create mode 100644 core/usb/descriptors.c create mode 100644 core/usb/descriptors.h (limited to 'core') diff --git a/core/usb/descriptors.c b/core/usb/descriptors.c new file mode 100644 index 0000000..eca3f3f --- /dev/null +++ b/core/usb/descriptors.c @@ -0,0 +1,122 @@ +/* insert license */ + +#include "descriptors.h" + +USB_Descriptor_Device usbVcomDescriptor_Device = { + bLength: sizeof(USB_Descriptor_Device), + bDescriptorType: USB_DESCRIPTOR_TYPE_DEVICE, + bcdUSB: 0x0200, + bDeviceClass: USB_DEVICE_CLASS_CDC, + bDeviceSubClass: USB_DEVICE_SUBCLASS_CDC, + bDeviceProtocol: 0x00, + bMaxPacketSize0: 0x40, + idVendor: VCOM_ID_VENDOR, + idProduct: VCOM_ID_PRODUCT, + bcdDevice: 0x0200, + iManufacturer: 0x00, + iProduct: 0x00, + iSerialNumber: 0x00, + bNumConfigurations: 0x01 +}; + +USB_Descriptor_Configuration usbVcomDescriptor_Config = { + Header: + { + bLength: sizeof(USB_Descriptor_Config_Header), + bDescriptorType: USB_DESCRIPTOR_TYPE_CONFIGURATION, + wTotalLength: sizeof(USB_Descriptor_Configuration), + bNumInterfaces: 0x02, + bConfigurationValue: 0x01, + iConfiguration: 0x00, + bmAttributes: (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATT_SELF_POWERED), + bMaxPower: USB_CONFIG_POWER_MA(100) + }, + + CCI_Interface: + { + bLength: sizeof(USB_Descriptor_Interface), + bDescriptorType: USB_DESCRIPTOR_TYPE_INTERFACE, + bInterfaceNumber: 0x00, + bAlternateSetting: 0x00, + bNumEndpoints: 0x01, + bInterfaceClass: 0x02, + bInterfaceSubClass: 0x02, + bInterfaceProtocol: 0x01, + iInterface: 0x00 + }, + + CDC_Functional_IntHeader: + { + bLength: sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), + bDescriptorType: 0x24, + SubType: 0x00, + Data: {0x01, 0x10} + }, + + CDC_Functional_CallManagement: + { + bLength: sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), + bDescriptorType: 0x24, + SubType: 0x01, + Data: {0x03, 0x01} + }, + + CDC_Functional_ACM: + { + bLength: sizeof(CDC_FUNCTIONAL_DESCRIPTOR(1)), + bDescriptorType: 0x24, + SubType: 0x02, + Data: {0x06} + }, + + CDC_Functional_Union: + { + bLength: sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), + bDescriptorType: 0x24, + SubType: 0x06, + Data: {0x00, 0x01} + }, + + ManagementEndpoint: + { + bLength: sizeof(USB_Descriptor_Endpoint), + bDescriptorType: USB_DESCRIPTOR_TYPE_ENDPOINT, + bEndpointAddress: CDC_NOTIFICATION_EPNUM, + bmAttributes: EP_TYPE_INTERRUPT, + wMaxPacketSize: CDC_NOTIFICATION_EPSIZE, + bInterval: 0xFF + }, + + DCI_Interface: + { + bLength: sizeof(USB_Descriptor_Interface), + bDescriptorType: USB_DESCRIPTOR_TYPE_INTERFACE, + bInterfaceNumber: 0x01, + bAlternateSetting: 0x00, + bNumEndpoints: 0x02, + bInterfaceClass: 0x0A, + bInterfaceSubClass: 0x00, + bInterfaceProtocol: 0x00, + iInterface: 0x00 + }. + + DataOutEndpoint: + { + bLength: sizeof(USB_Descriptor_Endpoint), + bDescriptorType: USB_DESCRIPTOR_TYPE_ENDPOINT, + bEndpointAddress: VCOM_RX_EPNUM, + bmAttributes: EP_TYPE_BULK, + wMaxPacketSize: VCOM_RX_EPSIZE, + bInterval: 0x00 + }, + + DataInPoiint: + { + bLength: sizeof(USB_Descriptor_Endpoint), + bDescriptorType: USB_DESCRIPTOR_TYPE_ENDPOINT, + bEndpointAddress: VCOM_TX_EPNUM, + bmAttributes: EP_TYPE_BULK, + wMaxPacketSize: VCOM_TX_EPSIZE, + bInterval: 0x00 + }, +}; diff --git a/core/usb/descriptors.h b/core/usb/descriptors.h new file mode 100644 index 0000000..1463221 --- /dev/null +++ b/core/usb/descriptors.h @@ -0,0 +1,88 @@ +/* insert license */ +#ifndef __DESCRIPTORS_H +#define __DESCRIPTORS_H + + +#include "usb_lib.h" + +#if defined(__cplusplus) + extern "C" { +#endif + +#define CDC_FUCNTIONAL_DESCRIPTOR(DataSize) \ + struct \ + { \ + uint8 bLength; \ + uint8 bDescriptorType; \ + uint8 SubType; \ + uint8 Data[DataSize]; \ + } + +typedef struct { + uint8 bLength; + uint8 bDescriptorType; + uint16 bcdUSB; + uint8 bDeviceClass; + uint8 bDeviceSubClass; + uint8 bDeviceProtocol; + uint8 bMaxPacketSize0; + uint16 idVendor; + uint16 idProduct; + uint16 bcdDevice; + uint8 iManufacturer; + uint8 iProduct; + uint8 iSerialNumber; + uint8 bNumConfigurations; +} USB_Descriptor_Device; + +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; +} USB_Descriptor_Config_Header; + +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; +} USB_Descriptor_Interface; + +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; +} USB_Descriptor_Endpoint; + +typedef struct { + USB_Descriptor_Config_Header Header; + USB_Descriptor_Interface CCI_Interface; + CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_IntHeader; + CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_CallManagement; + CDC_FUNCTIONAL_DESCRIPTOR(1) CDC_Functional_ACM; + CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_Union; + USB_Descriptor_Endpoint ManagementEndpoint; + USB_Descriptor_Interface DCI_Interface; + USB_Descriptor_Endpoint DataOutEndpoint; + USB_Descriptor_Endpoint DataInEndpoint; +} USB_Descriptor_Configuration; + + +#if defined(__cplusplus) + } +#endif + +#endif // __DESCRIPTORS_H -- cgit v1.2.3