Oops - forgot to add in LOGICAL MINIMUM and LOGICAL MAXIMUM report items into the...
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Host / CDC.c
index 7753c0e..27d4a10 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
+     Copyright (C) Dean Camera, 2011.
 
   dean [at] fourwalledcubicle [dot] com
 
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
@@ -100,31 +100,59 @@ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo
 
        for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++)
        {
 
        for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++)
        {
+               uint16_t Size;
+               uint8_t  Type;
+               uint8_t  Token;
+               uint8_t  EndpointAddress;
+               uint8_t  InterruptPeriod;
+               bool     DoubleBanked;
+
                if (PipeNum == CDCInterfaceInfo->Config.DataINPipeNumber)
                {
                if (PipeNum == CDCInterfaceInfo->Config.DataINPipeNumber)
                {
-                       Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_IN,
-                                          DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize,
-                                          CDCInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);
+                       Size            = DataINEndpoint->EndpointSize;
+                       EndpointAddress = DataINEndpoint->EndpointAddress;
+                       Token           = PIPE_TOKEN_IN;
+                       Type            = EP_TYPE_BULK;
+                       DoubleBanked    = CDCInterfaceInfo->Config.DataINPipeDoubleBank;
+                       InterruptPeriod = 0;
 
                        CDCInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize;
                }
                else if (PipeNum == CDCInterfaceInfo->Config.DataOUTPipeNumber)
                {
 
                        CDCInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize;
                }
                else if (PipeNum == CDCInterfaceInfo->Config.DataOUTPipeNumber)
                {
-                       Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_OUT,
-                                          DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize,
-                                          CDCInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);
+                       Size            = DataOUTEndpoint->EndpointSize;
+                       EndpointAddress = DataOUTEndpoint->EndpointAddress;
+                       Token           = PIPE_TOKEN_OUT;
+                       Type            = EP_TYPE_BULK;
+                       DoubleBanked    = CDCInterfaceInfo->Config.DataOUTPipeDoubleBank;
+                       InterruptPeriod = 0;
 
                        CDCInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize;
                }
                else if (PipeNum == CDCInterfaceInfo->Config.NotificationPipeNumber)
                {
 
                        CDCInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize;
                }
                else if (PipeNum == CDCInterfaceInfo->Config.NotificationPipeNumber)
                {
-                       Pipe_ConfigurePipe(PipeNum, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN,
-                                          NotificationEndpoint->EndpointAddress, NotificationEndpoint->EndpointSize,
-                                          CDCInterfaceInfo->Config.NotificationPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);
-                       Pipe_SetInterruptPeriod(NotificationEndpoint->PollingIntervalMS);
+                       Size            = NotificationEndpoint->EndpointSize;
+                       EndpointAddress = NotificationEndpoint->EndpointAddress;
+                       Token           = PIPE_TOKEN_IN;
+                       Type            = EP_TYPE_INTERRUPT;
+                       DoubleBanked    = CDCInterfaceInfo->Config.NotificationPipeDoubleBank;
+                       InterruptPeriod = NotificationEndpoint->PollingIntervalMS;
 
                        CDCInterfaceInfo->State.NotificationPipeSize = NotificationEndpoint->EndpointSize;
                }
 
                        CDCInterfaceInfo->State.NotificationPipeSize = NotificationEndpoint->EndpointSize;
                }
+               else
+               {
+                       continue;
+               }
+               
+               if (!(Pipe_ConfigurePipe(PipeNum, Type, Token, EndpointAddress, Size,
+                                        DoubleBanked ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE)))
+               {
+                       return CDC_ENUMERROR_PipeConfigurationFailed;
+               }
+               
+               if (InterruptPeriod)
+                 Pipe_SetInterruptPeriod(InterruptPeriod);
        }
 
        CDCInterfaceInfo->State.ControlInterfaceNumber = CDCControlInterface->InterfaceNumber;
        }
 
        CDCInterfaceInfo->State.ControlInterfaceNumber = CDCControlInterface->InterfaceNumber;
@@ -137,14 +165,15 @@ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo
 
 static uint8_t DCOMP_CDC_Host_NextCDCControlInterface(void* const CurrentDescriptor)
 {
 
 static uint8_t DCOMP_CDC_Host_NextCDCControlInterface(void* const CurrentDescriptor)
 {
-       if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)
+       USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+       if (Header->Type == DTYPE_Interface)
        {
        {
-               USB_Descriptor_Interface_t* CurrentInterface = DESCRIPTOR_PCAST(CurrentDescriptor,
-                                                                               USB_Descriptor_Interface_t);
+               USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
 
 
-               if ((CurrentInterface->Class    == CDC_CSCP_CDCClass)    &&
-                   (CurrentInterface->SubClass == CDC_CSCP_ACMSubclass) &&
-                   (CurrentInterface->Protocol == CDC_CSCP_ATCommandProtocol))
+               if ((Interface->Class    == CDC_CSCP_CDCClass)    &&
+                   (Interface->SubClass == CDC_CSCP_ACMSubclass) &&
+                   (Interface->Protocol == CDC_CSCP_ATCommandProtocol))
                {
                        return DESCRIPTOR_SEARCH_Found;
                }
                {
                        return DESCRIPTOR_SEARCH_Found;
                }
@@ -155,14 +184,15 @@ static uint8_t DCOMP_CDC_Host_NextCDCControlInterface(void* const CurrentDescrip
 
 static uint8_t DCOMP_CDC_Host_NextCDCDataInterface(void* const CurrentDescriptor)
 {
 
 static uint8_t DCOMP_CDC_Host_NextCDCDataInterface(void* const CurrentDescriptor)
 {
-       if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)
+       USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+       if (Header->Type == DTYPE_Interface)
        {
        {
-               USB_Descriptor_Interface_t* CurrentInterface = DESCRIPTOR_PCAST(CurrentDescriptor,
-                                                                               USB_Descriptor_Interface_t);
+               USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
 
 
-               if ((CurrentInterface->Class    == CDC_CSCP_CDCDataClass)   &&
-                   (CurrentInterface->SubClass == CDC_CSCP_NoDataSubclass) &&
-                   (CurrentInterface->Protocol == CDC_CSCP_NoDataProtocol))
+               if ((Interface->Class    == CDC_CSCP_CDCDataClass)   &&
+                   (Interface->SubClass == CDC_CSCP_NoDataSubclass) &&
+                   (Interface->Protocol == CDC_CSCP_NoDataProtocol))
                {
                        return DESCRIPTOR_SEARCH_Found;
                }
                {
                        return DESCRIPTOR_SEARCH_Found;
                }
@@ -173,20 +203,21 @@ static uint8_t DCOMP_CDC_Host_NextCDCDataInterface(void* const CurrentDescriptor
 
 static uint8_t DCOMP_CDC_Host_NextCDCInterfaceEndpoint(void* const CurrentDescriptor)
 {
 
 static uint8_t DCOMP_CDC_Host_NextCDCInterfaceEndpoint(void* const CurrentDescriptor)
 {
-       if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)
+       USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+       if (Header->Type == DTYPE_Endpoint)
        {
        {
-               USB_Descriptor_Endpoint_t* CurrentEndpoint = DESCRIPTOR_PCAST(CurrentDescriptor,
-                                                                             USB_Descriptor_Endpoint_t);
+               USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
 
 
-               uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK);
+               uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK);
 
                if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) &&
 
                if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) &&
-                   !(Pipe_IsEndpointBound(CurrentEndpoint->EndpointAddress)))
+                   !(Pipe_IsEndpointBound(Endpoint->EndpointAddress)))
                {
                        return DESCRIPTOR_SEARCH_Found;
                }
        }
                {
                        return DESCRIPTOR_SEARCH_Found;
                }
        }
-       else if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)
+       else if (Header->Type == DTYPE_Interface)
        {
                return DESCRIPTOR_SEARCH_Fail;
        }
        {
                return DESCRIPTOR_SEARCH_Fail;
        }
@@ -205,14 +236,14 @@ void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
        if (Pipe_IsINReceived())
        {
                USB_Request_Header_t Notification;
        if (Pipe_IsINReceived())
        {
                USB_Request_Header_t Notification;
-               Pipe_Read_Stream_LE(&Notification, sizeof(USB_Request_Header_t), NO_STREAM_CALLBACK);
+               Pipe_Read_Stream_LE(&Notification, sizeof(USB_Request_Header_t), NULL);
 
                if ((Notification.bRequest      == CDC_NOTIF_SerialState) &&
                    (Notification.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)))
                {
                        Pipe_Read_Stream_LE(&CDCInterfaceInfo->State.ControlLineStates.DeviceToHost,
                                            sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost),
 
                if ((Notification.bRequest      == CDC_NOTIF_SerialState) &&
                    (Notification.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)))
                {
                        Pipe_Read_Stream_LE(&CDCInterfaceInfo->State.ControlLineStates.DeviceToHost,
                                            sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost),
-                                           NO_STREAM_CALLBACK);
+                                           NULL);
 
                        Pipe_ClearIN();
 
 
                        Pipe_ClearIN();
 
@@ -292,7 +323,7 @@ uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
        Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber);
 
        Pipe_Unfreeze();
        Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber);
 
        Pipe_Unfreeze();
-       ErrorCode = Pipe_Write_Stream_LE(Data, Length, NO_STREAM_CALLBACK);
+       ErrorCode = Pipe_Write_Stream_LE(Data, Length, NULL);
        Pipe_Freeze();
 
        return ErrorCode;
        Pipe_Freeze();
 
        return ErrorCode;