diff options
Diffstat (limited to 'Demos/Host/LowLevel/RNDISEthernetHost')
4 files changed, 58 insertions, 79 deletions
diff --git a/Demos/Host/LowLevel/RNDISEthernetHost/ConfigDescriptor.c b/Demos/Host/LowLevel/RNDISEthernetHost/ConfigDescriptor.c index 97a38b4ac..0db576f72 100644 --- a/Demos/Host/LowLevel/RNDISEthernetHost/ConfigDescriptor.c +++ b/Demos/Host/LowLevel/RNDISEthernetHost/ConfigDescriptor.c @@ -50,7 +50,10 @@ uint8_t ProcessConfigurationDescriptor(void) uint8_t ConfigDescriptorData[512]; void* CurrConfigLocation = ConfigDescriptorData; uint16_t CurrConfigBytesRem; - uint8_t FoundEndpoints = 0; + + USB_Descriptor_Endpoint_t* DataINEndpoint = NULL; + USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL; + USB_Descriptor_Endpoint_t* NotificationEndpoint = NULL; /* Retrieve the entire configuration descriptor into the allocated buffer */ switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) @@ -65,104 +68,80 @@ uint8_t ProcessConfigurationDescriptor(void) return ControlError; } - /* Get the CDC control interface from the configuration descriptor */ + /* Get the first RNDIS control interface from the configuration descriptor */ if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, DComp_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) { /* Descriptor not found, error out */ - return NoRNDISInterfaceFound; + return NoCompatibleInterfaceFound; } - /* Get the IN and OUT data and IN notification endpoints for the RNDIS interface */ - while (FoundEndpoints != ((1 << RNDIS_NOTIFICATIONPIPE) | (1 << RNDIS_DATAPIPE_IN) | (1 << RNDIS_DATAPIPE_OUT))) + while (!(DataINEndpoint) || !(DataOUTEndpoint) || !(NotificationEndpoint)) { - /* Fetch the next bulk or interrupt endpoint from the current RNDIS interface */ + /* Get the next RNDIS interface's endpoint descriptor */ if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, DComp_NextCDCDataInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) { - /* Check to see if the control interface's notification pipe has been found, if so search for the data interface */ - if (FoundEndpoints & (1 << RNDIS_NOTIFICATIONPIPE)) + /* Check if we have already found the control interface's notification endpoint or not */ + if (NotificationEndpoint) { - /* Get the next CDC data interface from the configuration descriptor (RNDIS class has two CDC interfaces) */ - if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, - DComp_NextCDCDataInterface) != DESCRIPTOR_SEARCH_COMP_Found) + /* Get the next RNDIS data interface from the configuration descriptor */ + if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + DComp_NextCDCDataInterface) != DESCRIPTOR_SEARCH_COMP_Found) { /* Descriptor not found, error out */ - return NoRNDISInterfaceFound; - } + return NoCompatibleInterfaceFound; + } + + /* Clear any found endpoints */ + DataINEndpoint = NULL; + DataOUTEndpoint = NULL; } else { - /* Clear the found endpoints mask, since any already processed endpoints aren't in the CDC interface we need */ - FoundEndpoints = 0; - - /* Disable any already configured pipes from the invalid RNDIS interfaces */ - Pipe_SelectPipe(RNDIS_NOTIFICATIONPIPE); - Pipe_DisablePipe(); - Pipe_SelectPipe(RNDIS_DATAPIPE_IN); - Pipe_DisablePipe(); - Pipe_SelectPipe(RNDIS_DATAPIPE_OUT); - Pipe_DisablePipe(); - - /* Get the next CDC control interface from the configuration descriptor (CDC class has two CDC interfaces) */ + /* Get the next RNDIS control interface from the configuration descriptor */ if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, - DComp_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) + DComp_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) { /* Descriptor not found, error out */ - return NoRNDISInterfaceFound; + return NoCompatibleInterfaceFound; } - } - /* Fetch the next bulk or interrupt endpoint from the current CDC interface */ - if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, - DComp_NextCDCDataInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) - { - /* Descriptor not found, error out */ - return NoEndpointFound; + /* Clear any found endpoints */ + NotificationEndpoint = NULL; } } + /* Retrieve the endpoint address from the endpoint descriptor */ USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t); - /* Check if the found endpoint is a interrupt or bulk type descriptor */ - if ((EndpointData->Attributes & EP_TYPE_MASK) == EP_TYPE_INTERRUPT) + /* If the endpoint is a IN type endpoint */ + if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) { - /* If the endpoint is a IN type interrupt endpoint */ - if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) - { - /* Configure the notification pipe */ - Pipe_ConfigurePipe(RNDIS_NOTIFICATIONPIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN, - EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE); - - Pipe_SetInterruptPeriod(EndpointData->PollingIntervalMS); - - /* Set the flag indicating that the notification pipe has been found */ - FoundEndpoints |= (1 << RNDIS_NOTIFICATIONPIPE); - } + /* Check if the found endpoint is a interrupt or bulk type descriptor */ + if ((EndpointData->Attributes & EP_TYPE_MASK) == EP_TYPE_INTERRUPT) + NotificationEndpoint = EndpointData; + else + DataINEndpoint = EndpointData; } else { - /* Check if the endpoint is a bulk IN or bulk OUT endpoint */ - if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) - { - /* Configure the data IN pipe */ - Pipe_ConfigurePipe(RNDIS_DATAPIPE_IN, EP_TYPE_BULK, PIPE_TOKEN_IN, - EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE); - - /* Set the flag indicating that the data IN pipe has been found */ - FoundEndpoints |= (1 << RNDIS_DATAPIPE_IN); - } - else - { - /* Configure the data OUT pipe */ - Pipe_ConfigurePipe(RNDIS_DATAPIPE_OUT, EP_TYPE_BULK, PIPE_TOKEN_OUT, - EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE); - - /* Set the flag indicating that the data OUT pipe has been found */ - FoundEndpoints |= (1 << RNDIS_DATAPIPE_OUT); - } + DataOUTEndpoint = EndpointData; } } + + /* Configure the RNDIS data IN pipe */ + Pipe_ConfigurePipe(RNDIS_DATA_IN_PIPE, EP_TYPE_BULK, PIPE_TOKEN_IN, + DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE); + + /* Configure the RNDIS data OUT pipe */ + Pipe_ConfigurePipe(RNDIS_DATA_OUT_PIPE, EP_TYPE_BULK, PIPE_TOKEN_OUT, + DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PIPE_BANK_SINGLE); + + /* Configure the RNDIS notification pipe */ + Pipe_ConfigurePipe(RNDIS_NOTIFICATION_PIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN, + NotificationEndpoint->EndpointAddress, NotificationEndpoint->EndpointSize, PIPE_BANK_SINGLE); + Pipe_SetInterruptPeriod(NotificationEndpoint->PollingIntervalMS); /* Valid data found, return success */ return SuccessfulConfigRead; diff --git a/Demos/Host/LowLevel/RNDISEthernetHost/ConfigDescriptor.h b/Demos/Host/LowLevel/RNDISEthernetHost/ConfigDescriptor.h index 0f8c99247..834493742 100644 --- a/Demos/Host/LowLevel/RNDISEthernetHost/ConfigDescriptor.h +++ b/Demos/Host/LowLevel/RNDISEthernetHost/ConfigDescriptor.h @@ -60,6 +60,15 @@ /** Interface Class value for the CDC data protocol. */ #define CDC_DATA_PROTOCOL 0x00 + /** Pipe number for the RNDIS data IN pipe. */ + #define RNDIS_DATA_IN_PIPE 1 + + /** Pipe number for the RNDIS data OUT pipe. */ + #define RNDIS_DATA_OUT_PIPE 2 + + /** Pipe number for the RNDIS notification pipe. */ + #define RNDIS_NOTIFICATION_PIPE 3 + /* Enums: */ /** Enum for the possible return codes of the \ref ProcessConfigurationDescriptor() function. */ enum RNDISHost_GetConfigDescriptorDataCodes_t @@ -68,8 +77,7 @@ ControlError = 1, /**< A control request to the device failed to complete successfully */ DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */ InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */ - NoRNDISInterfaceFound = 4, /**< A compatible RNDIS interface was not found in the device's Configuration Descriptor */ - NoEndpointFound = 5, /**< Compatible RNDIS endpoints were not found in the device's RNDIS interface */ + NoCompatibleInterfaceFound = 4, /**< A compatible interface with the required endpoints was not found */ }; /* Function Prototypes: */ diff --git a/Demos/Host/LowLevel/RNDISEthernetHost/Lib/RNDISCommands.c b/Demos/Host/LowLevel/RNDISEthernetHost/Lib/RNDISCommands.c index ec018bf3a..64cfc3ce6 100644 --- a/Demos/Host/LowLevel/RNDISEthernetHost/Lib/RNDISCommands.c +++ b/Demos/Host/LowLevel/RNDISEthernetHost/Lib/RNDISCommands.c @@ -281,7 +281,7 @@ uint8_t RNDIS_GetPacketLength(uint16_t* const PacketLength) { uint8_t ErrorCode; - Pipe_SelectPipe(RNDIS_DATAPIPE_IN); + Pipe_SelectPipe(RNDIS_DATA_IN_PIPE); Pipe_SetPipeToken(PIPE_TOKEN_IN); Pipe_Unfreeze(); diff --git a/Demos/Host/LowLevel/RNDISEthernetHost/Lib/RNDISCommands.h b/Demos/Host/LowLevel/RNDISEthernetHost/Lib/RNDISCommands.h index 0c4af3aed..56b4946e6 100644 --- a/Demos/Host/LowLevel/RNDISEthernetHost/Lib/RNDISCommands.h +++ b/Demos/Host/LowLevel/RNDISEthernetHost/Lib/RNDISCommands.h @@ -44,6 +44,7 @@ #include <LUFA/Drivers/USB/USB.h> #include "RNDISConstants.h" + #include "../RNDISEthernetHost.h" /* Type Defines: */ /** Type define for a RNDIS message header, sent before RNDIS messages. */ @@ -186,15 +187,6 @@ /** Implemented RNDIS Version Minor. */ #define REMOTE_NDIS_VERSION_MINOR 0x00 - - /** Pipe number for the RNDIS data IN pipe. */ - #define RNDIS_DATAPIPE_IN 1 - - /** Pipe number for the RNDIS data OUT pipe. */ - #define RNDIS_DATAPIPE_OUT 2 - - /** Pipe number for the RNDIS notification pipe. */ - #define RNDIS_NOTIFICATIONPIPE 3 /** Additional error code for RNDIS functions when a device returns a logical command failure. */ #define RNDIS_COMMAND_FAILED 0xC0 |