diff options
Diffstat (limited to 'Demos/Host/LowLevel/MouseHost')
-rw-r--r-- | Demos/Host/LowLevel/MouseHost/ConfigDescriptor.c | 43 | ||||
-rw-r--r-- | Demos/Host/LowLevel/MouseHost/ConfigDescriptor.h | 6 | ||||
-rw-r--r-- | Demos/Host/LowLevel/MouseHost/MouseHost.c | 2 | ||||
-rw-r--r-- | Demos/Host/LowLevel/MouseHost/MouseHost.h | 3 |
4 files changed, 34 insertions, 20 deletions
diff --git a/Demos/Host/LowLevel/MouseHost/ConfigDescriptor.c b/Demos/Host/LowLevel/MouseHost/ConfigDescriptor.c index 816c23321..02c4cd46d 100644 --- a/Demos/Host/LowLevel/MouseHost/ConfigDescriptor.c +++ b/Demos/Host/LowLevel/MouseHost/ConfigDescriptor.c @@ -50,6 +50,8 @@ uint8_t ProcessConfigurationDescriptor(void) uint8_t ConfigDescriptorData[512]; void* CurrConfigLocation = ConfigDescriptorData; uint16_t CurrConfigBytesRem; + + USB_Descriptor_Endpoint_t* DataINEndpoint = NULL; /* Retrieve the entire configuration descriptor into the allocated buffer */ switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) @@ -64,29 +66,42 @@ uint8_t ProcessConfigurationDescriptor(void) return ControlError; } - /* Get the mouse interface from the configuration descriptor */ + /* Get the first HID interface from the configuration descriptor */ if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, DComp_NextMouseInterface) != DESCRIPTOR_SEARCH_COMP_Found) { /* Descriptor not found, error out */ - return NoHIDInterfaceFound; + return NoCompatibleInterfaceFound; } - /* Get the mouse interface's data endpoint descriptor */ - if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, - DComp_NextMouseInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) + while (!(DataINEndpoint)) { - /* Descriptor not found, error out */ - return NoEndpointFound; + /* Get the next HID interface's data endpoint descriptor */ + if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + DComp_NextMouseInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) + { + /* Get the next HID interface from the configuration descriptor */ + if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + DComp_NextMouseInterface) != DESCRIPTOR_SEARCH_COMP_Found) + { + /* Descriptor not found, error out */ + return NoCompatibleInterfaceFound; + } + } + + /* Retrieve the endpoint address from the endpoint descriptor */ + USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t); + + /* If the endpoint is a IN type endpoint */ + if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) + DataINEndpoint = EndpointData; } - /* Retrieve the endpoint address from the endpoint descriptor */ - USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t); - - /* Configure the mouse data pipe */ - Pipe_ConfigurePipe(MOUSE_DATAPIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN, - EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE); - + /* Configure the HID data IN pipe */ + Pipe_ConfigurePipe(MOUSE_DATA_IN_PIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN, + DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE); + Pipe_SetInterruptPeriod(DataINEndpoint->PollingIntervalMS); + /* Valid data found, return success */ return SuccessfulConfigRead; } diff --git a/Demos/Host/LowLevel/MouseHost/ConfigDescriptor.h b/Demos/Host/LowLevel/MouseHost/ConfigDescriptor.h index 77ea6f2a3..71fbadedd 100644 --- a/Demos/Host/LowLevel/MouseHost/ConfigDescriptor.h +++ b/Demos/Host/LowLevel/MouseHost/ConfigDescriptor.h @@ -48,6 +48,9 @@ /** Interface Protocol value for a Boot Protocol Mouse compliant device. */ #define MOUSE_PROTOCOL 0x02 + /** Pipe number for the mouse data IN pipe. */ + #define MOUSE_DATA_IN_PIPE 1 + /* Enums: */ /** Enum for the possible return codes of the \ref ProcessConfigurationDescriptor() function. */ enum MouseHost_GetConfigDescriptorDataCodes_t @@ -56,8 +59,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 */ - NoHIDInterfaceFound = 4, /**< A compatible HID interface was not found in the device's Configuration Descriptor */ - NoEndpointFound = 5, /**< A compatible HID IN endpoint was not found in the device's HID interface */ + NoCompatibleInterfaceFound = 4, /**< A compatible interface with the required endpoints was not found */ }; /* Function Prototypes: */ diff --git a/Demos/Host/LowLevel/MouseHost/MouseHost.c b/Demos/Host/LowLevel/MouseHost/MouseHost.c index bf20bca52..05efa25c5 100644 --- a/Demos/Host/LowLevel/MouseHost/MouseHost.c +++ b/Demos/Host/LowLevel/MouseHost/MouseHost.c @@ -132,7 +132,7 @@ void ReadNextReport(void) uint8_t LEDMask = LEDS_NO_LEDS; /* Select mouse data pipe */ - Pipe_SelectPipe(MOUSE_DATAPIPE); + Pipe_SelectPipe(MOUSE_DATA_IN_PIPE); /* Unfreeze keyboard data pipe */ Pipe_Unfreeze(); diff --git a/Demos/Host/LowLevel/MouseHost/MouseHost.h b/Demos/Host/LowLevel/MouseHost/MouseHost.h index b9c5aeda1..8947436e6 100644 --- a/Demos/Host/LowLevel/MouseHost/MouseHost.h +++ b/Demos/Host/LowLevel/MouseHost/MouseHost.h @@ -53,9 +53,6 @@ #include "ConfigDescriptor.h" /* Macros: */ - /** Pipe number for the mouse data IN pipe. */ - #define MOUSE_DATAPIPE 1 - /** HID Class Specific request to set the report protocol mode. */ #define REQ_SetProtocol 0x0B |