aboutsummaryrefslogtreecommitdiffstats
path: root/Demos/Host/LowLevel/VirtualSerialHost
diff options
context:
space:
mode:
Diffstat (limited to 'Demos/Host/LowLevel/VirtualSerialHost')
-rw-r--r--Demos/Host/LowLevel/VirtualSerialHost/ConfigDescriptor.c113
-rw-r--r--Demos/Host/LowLevel/VirtualSerialHost/ConfigDescriptor.h12
-rw-r--r--Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c4
-rw-r--r--Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.h9
4 files changed, 58 insertions, 80 deletions
diff --git a/Demos/Host/LowLevel/VirtualSerialHost/ConfigDescriptor.c b/Demos/Host/LowLevel/VirtualSerialHost/ConfigDescriptor.c
index 5707308ad..c35a606cc 100644
--- a/Demos/Host/LowLevel/VirtualSerialHost/ConfigDescriptor.c
+++ b/Demos/Host/LowLevel/VirtualSerialHost/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 CDC control interface from the configuration descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
{
/* Descriptor not found, error out */
- return NoCDCInterfaceFound;
+ return NoCompatibleInterfaceFound;
}
- /* Get the IN and OUT data and IN notification endpoints for the CDC interface */
- while (FoundEndpoints != ((1 << CDC_NOTIFICATIONPIPE) | (1 << CDC_DATAPIPE_IN) | (1 << CDC_DATAPIPE_OUT)))
+ while (!(DataINEndpoint) || !(DataOUTEndpoint) || !(NotificationEndpoint))
{
- /* Fetch the next bulk or interrupt endpoint from the current CDC interface */
+ /* Get the next CDC 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 << CDC_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 (CDC class has two CDC interfaces) */
- if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
- DComp_NextCDCDataInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+ /* Get the next CDC data interface from the configuration descriptor */
+ if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
+ DComp_NextCDCDataInterface) != DESCRIPTOR_SEARCH_COMP_Found)
{
/* Descriptor not found, error out */
- return NoCDCInterfaceFound;
- }
+ 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 CDC interfaces */
- Pipe_SelectPipe(CDC_NOTIFICATIONPIPE);
- Pipe_DisablePipe();
- Pipe_SelectPipe(CDC_DATAPIPE_IN);
- Pipe_DisablePipe();
- Pipe_SelectPipe(CDC_DATAPIPE_OUT);
- Pipe_DisablePipe();
-
- /* Get the next CDC control interface from the configuration descriptor (CDC class has two CDC interfaces) */
+ /* Get the next CDC 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 NoCDCInterfaceFound;
+ 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(CDC_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 << CDC_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(CDC_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 << CDC_DATAPIPE_IN);
- }
- else
- {
- /* Configure the data OUT pipe */
- Pipe_ConfigurePipe(CDC_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 << CDC_DATAPIPE_OUT);
- }
+ DataOUTEndpoint = EndpointData;
}
}
+
+ /* Configure the CDC data IN pipe */
+ Pipe_ConfigurePipe(CDC_DATA_IN_PIPE, EP_TYPE_BULK, PIPE_TOKEN_IN,
+ DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);
+
+ /* Configure the CDC data OUT pipe */
+ Pipe_ConfigurePipe(CDC_DATA_OUT_PIPE, EP_TYPE_BULK, PIPE_TOKEN_OUT,
+ DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PIPE_BANK_SINGLE);
+
+ /* Configure the CDC notification pipe */
+ Pipe_ConfigurePipe(CDC_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/VirtualSerialHost/ConfigDescriptor.h b/Demos/Host/LowLevel/VirtualSerialHost/ConfigDescriptor.h
index a6720f2cd..2e4730c55 100644
--- a/Demos/Host/LowLevel/VirtualSerialHost/ConfigDescriptor.h
+++ b/Demos/Host/LowLevel/VirtualSerialHost/ConfigDescriptor.h
@@ -60,6 +60,15 @@
/** Interface Class value for the CDC data protocol. */
#define CDC_DATA_PROTOCOL 0x00
+ /** Pipe number for the CDC data IN pipe. */
+ #define CDC_DATA_IN_PIPE 1
+
+ /** Pipe number for the CDC data OUT pipe. */
+ #define CDC_DATA_OUT_PIPE 2
+
+ /** Pipe number for the CDC notification pipe. */
+ #define CDC_NOTIFICATION_PIPE 3
+
/* Enums: */
/** Enum for the possible return codes of the \ref ProcessConfigurationDescriptor() function. */
enum CDCHost_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 */
- NoCDCInterfaceFound = 4, /**< A compatible CDC interface was not found in the device's Configuration Descriptor */
- NoEndpointFound = 5, /**< Compatible CDC endpoints were not found in the device's CDC interface */
+ NoCompatibleInterfaceFound = 4, /**< A compatible interface with the required endpoints was not found */
};
/* Function Prototypes: */
diff --git a/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c b/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c
index 4c250cd48..91775b7a4 100644
--- a/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c
+++ b/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.c
@@ -173,7 +173,7 @@ void CDC_Host_Task(void)
break;
case HOST_STATE_Configured:
/* Select the data IN pipe */
- Pipe_SelectPipe(CDC_DATAPIPE_IN);
+ Pipe_SelectPipe(CDC_DATA_IN_PIPE);
Pipe_Unfreeze();
/* Check to see if a packet has been received */
@@ -205,7 +205,7 @@ void CDC_Host_Task(void)
Pipe_Freeze();
/* Select and unfreeze the notification pipe */
- Pipe_SelectPipe(CDC_NOTIFICATIONPIPE);
+ Pipe_SelectPipe(CDC_NOTIFICATION_PIPE);
Pipe_Unfreeze();
/* Check if a packet has been received */
diff --git a/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.h b/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.h
index cf785e320..d55fa68af 100644
--- a/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.h
+++ b/Demos/Host/LowLevel/VirtualSerialHost/VirtualSerialHost.h
@@ -53,15 +53,6 @@
#include "ConfigDescriptor.h"
/* Macros: */
- /** Pipe number for the CDC data IN pipe. */
- #define CDC_DATAPIPE_IN 1
-
- /** Pipe number for the CDC data OUT pipe. */
- #define CDC_DATAPIPE_OUT 2
-
- /** Pipe number for the CDC notification pipe. */
- #define CDC_NOTIFICATIONPIPE 3
-
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1