Change Host mode class driver Pipe configuration routines -- better to let the applic...
authorDean Camera <dean@fourwalledcubicle.com>
Mon, 27 Jul 2009 10:48:55 +0000 (10:48 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Mon, 27 Jul 2009 10:48:55 +0000 (10:48 +0000)
Demos/Host/ClassDriver/CDCHost/CDCHost.c
Demos/Host/ClassDriver/MouseHost/MouseHost.c
LUFA/Drivers/USB/Class/Host/CDC.c
LUFA/Drivers/USB/Class/Host/CDC.h
LUFA/Drivers/USB/Class/Host/HID.c
LUFA/Drivers/USB/Class/Host/HID.h

index 4479e4f..b74c394 100644 (file)
@@ -74,10 +74,31 @@ int main(void)
                        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
@@ -86,12 +107,11 @@ int main(void)
                                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
index 88518a8..c2850cf 100644 (file)
@@ -76,10 +76,31 @@ int main(void)
                        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
@@ -88,7 +109,6 @@ int main(void)
                                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
index d648ec2..4402f33 100644 (file)
 #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
index e9518fe..5e0e469 100644 (file)
                        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
index 4f013d5..8639b48 100644 (file)
 #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
@@ -62,7 +51,7 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint
                }\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
index 9ae1f14..1959fd2 100644 (file)
                        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