case HOST_STATE_Addressed:\r
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);\r
\r
- if (CDC_Host_ConfigurePipes(&VirtualSerial_CDC_Interface, 512) != CDC_ENUMERROR_NoError)\r
+ uint16_t ConfigDescriptorSize;\r
+ uint8_t ConfigDescriptorData[512];\r
+\r
+ if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)\r
{\r
- printf("Attached device is not a valid CDC device.\r\n");\r
+ printf("Error Retrieving Device Descriptor.\r\n");\r
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
+ break;\r
+ }\r
\r
+ if (ConfigDescriptorSize > 512)\r
+ {\r
+ printf("Device Descriptor Too Large To Process.\r\n");\r
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
+ break;\r
+ }\r
+ \r
+ USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData);\r
+\r
+ if (CDC_Host_ConfigurePipes(&VirtualSerial_CDC_Interface,\r
+ ConfigDescriptorSize, ConfigDescriptorData) != CDC_ENUMERROR_NoError)\r
+ {\r
+ printf("Attached Device Not a Valid CDC Class Device.\r\n");\r
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
break;\r
if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)\r
{\r
printf("Error Setting Device Configuration.\r\n");\r
-\r
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
break;\r
}\r
-\r
+ \r
printf("CDC Device Enumerated.\r\n");\r
USB_HostState = HOST_STATE_Configured;\r
break;\r
case HOST_STATE_Addressed:\r
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);\r
\r
- if (HID_Host_ConfigurePipes(&Mouse_HID_Interface, 512) != HID_ENUMERROR_NoError)\r
+ uint16_t ConfigDescriptorSize;\r
+ uint8_t ConfigDescriptorData[512];\r
+\r
+ if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)\r
+ {\r
+ printf("Error Retrieving Device Descriptor.\r\n");\r
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
+ break;\r
+ }\r
+ \r
+ if (ConfigDescriptorSize > 512)\r
{\r
- printf("Attached device is not a valid Mouse.\r\n");\r
- \r
+ printf("Device Descriptor Too Large To Process.\r\n");\r
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
+ break;\r
+ }\r
+ \r
+ USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData);\r
+\r
+ if (HID_Host_ConfigurePipes(&Mouse_HID_Interface,\r
+ ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)\r
+ {\r
+ printf("Attached Device Not a Valid Mouse.\r\n");\r
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
break;\r
if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)\r
{\r
printf("Error Setting Device Configuration.\r\n");\r
-\r
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
break;\r
#define INCLUDE_FROM_CDC_CLASS_HOST_C\r
#include "CDC.h"\r
\r
-uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t MaxConfigBufferSize)\r
+uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t ConfigDescriptorSize,\r
+ uint8_t* ConfigDescriptorData)\r
{\r
- uint8_t* ConfigDescriptorData;\r
- uint16_t ConfigDescriptorSize;\r
uint8_t FoundEndpoints = 0;\r
\r
- if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)\r
- return CDC_ENUMERROR_ControlError;\r
- \r
- if (ConfigDescriptorSize > MaxConfigBufferSize)\r
- return CDC_ENUMERROR_DescriptorTooLarge;\r
- \r
- ConfigDescriptorData = alloca(ConfigDescriptorSize);\r
-\r
- USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData);\r
- \r
if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)\r
- return CDC_ENUMERROR_InvalidConfigDataReturned;\r
+ return CDC_ENUMERROR_InvalidConfigDescriptor;\r
\r
if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,\r
DComp_CDC_Host_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)\r
enum\r
{\r
CDC_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully */\r
- CDC_ENUMERROR_ControlError = 1, /**< A control request to the device failed to complete successfully */\r
- CDC_ENUMERROR_DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */\r
- CDC_ENUMERROR_InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */\r
- CDC_ENUMERROR_NoCDCInterfaceFound = 4, /**< A compatible CDC interface was not found in the device's Configuration Descriptor */\r
- CDC_ENUMERROR_EndpointsNotFound = 5, /**< Compatible CDC endpoints were not found in the device's CDC interface */\r
+ CDC_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor */\r
+ CDC_ENUMERROR_NoCDCInterfaceFound = 2, /**< A compatible CDC interface was not found in the device's Configuration Descriptor */\r
+ CDC_ENUMERROR_EndpointsNotFound = 3, /**< Compatible CDC endpoints were not found in the device's CDC interface */\r
} CDCHost_EnumerationFailure_ErrorCodes_t;\r
\r
/* Function Prototypes: */\r
void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);\r
- uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t MaxConfigBufferSize);\r
-\r
+ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t ConfigDescriptorLength,\r
+ uint8_t* DeviceConfigDescriptor);\r
+ \r
void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);\r
\r
uint8_t CDC_Host_SetLineEncoding(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);\r
#define INCLUDE_FROM_HID_CLASS_HOST_C\r
#include "HID.h"\r
\r
-uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t MaxConfigBufferSize)\r
+uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t ConfigDescriptorSize,\r
+ uint8_t* ConfigDescriptorData)\r
{\r
- uint8_t* ConfigDescriptorData;\r
- uint16_t ConfigDescriptorSize;\r
uint8_t FoundEndpoints = 0;\r
\r
- if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)\r
- return HID_ENUMERROR_ControlError;\r
- \r
- if (ConfigDescriptorSize > MaxConfigBufferSize)\r
- return HID_ENUMERROR_DescriptorTooLarge;\r
- \r
- ConfigDescriptorData = alloca(ConfigDescriptorSize);\r
-\r
- USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData);\r
- \r
if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)\r
- return HID_ENUMERROR_InvalidConfigDataReturned;\r
+ return HID_ENUMERROR_InvalidConfigDescriptor;\r
\r
do\r
{\r
}\r
} while (HIDInterfaceInfo->Config.MatchInterfaceProtocol &&\r
DESCRIPTOR_PCAST(ConfigDescriptorData,\r
- USB_Descriptor_Interface_t)->HIDInterfaceProtocol != HIDInterfaceInfo->Config.Protocol);\r
+ USB_Descriptor_Interface_t)->Protocol != HIDInterfaceInfo->Config.HIDInterfaceProtocol);\r
\r
while (FoundEndpoints != ((1 << HID_FOUND_DATAPIPE_IN) | (1 << HID_FOUND_DATAPIPE_OUT)))\r
{\r
enum\r
{\r
HID_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully */\r
- HID_ENUMERROR_ControlError = 1, /**< A control request to the device failed to complete successfully */\r
- HID_ENUMERROR_DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */\r
- HID_ENUMERROR_InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */\r
- HID_ENUMERROR_NoHIDInterfaceFound = 4, /**< A compatible HID interface was not found in the device's Configuration Descriptor */\r
- HID_ENUMERROR_EndpointsNotFound = 5, /**< Compatible HID endpoints were not found in the device's CDC interface */\r
+ HID_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor */\r
+ HID_ENUMERROR_NoHIDInterfaceFound = 2, /**< A compatible HID interface was not found in the device's Configuration Descriptor */\r
+ HID_ENUMERROR_EndpointsNotFound = 3, /**< Compatible HID endpoints were not found in the device's CDC interface */\r
} CDCHost_EnumerationFailure_ErrorCodes_t;\r
\r
/* Function Prototypes: */\r
void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo);\r
- uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t MaxConfigBufferSize);\r
+ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t ConfigDescriptorLength,\r
+ uint8_t* DeviceConfigDescriptor);\r
\r
/* Private Interface - For use in library only: */\r
#if !defined(__DOXYGEN__)\r