diff options
author | Dean Camera <[email protected]> | 2010-09-30 06:23:38 +0000 |
---|---|---|
committer | Dean Camera <[email protected]> | 2010-09-30 06:23:38 +0000 |
commit | 158afe910947739b1df00000628c1e758bdf0812 (patch) | |
tree | daf6fc80de05c9ed748599bc01c24b1578455dc2 /Demos/Host/LowLevel/GenericHIDHost | |
parent | a509729b2d92b03a3d33ab0e1e1950ff65a96a09 (diff) | |
download | qmk_firmware-158afe910947739b1df00000628c1e758bdf0812.tar.gz qmk_firmware-158afe910947739b1df00000628c1e758bdf0812.zip |
Reverted Endpoint/Pipe non-sequential configuration hack, placed restriction on the configuration order instead to ensure maximum reliability.
Altered all low level device and host mode demos to ensure that endpoints and pipes are configured in ascending order properly.
Rewrote all low level host mode demos' configuration descriptor parser code to ensure that pipes are enumerated in ascending order, and to ensure maximum compatibility with devices.
Incremented all device mode demo's device descriptor revision numbers to ensure that any descriptor changes are re-fetched on machines which have enumerated previous versions.
Diffstat (limited to 'Demos/Host/LowLevel/GenericHIDHost')
-rw-r--r-- | Demos/Host/LowLevel/GenericHIDHost/ConfigDescriptor.c | 55 | ||||
-rw-r--r-- | Demos/Host/LowLevel/GenericHIDHost/ConfigDescriptor.h | 11 | ||||
-rw-r--r-- | Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.h | 6 |
3 files changed, 41 insertions, 31 deletions
diff --git a/Demos/Host/LowLevel/GenericHIDHost/ConfigDescriptor.c b/Demos/Host/LowLevel/GenericHIDHost/ConfigDescriptor.c index f5d8e5cd54..40bc98e2dd 100644 --- a/Demos/Host/LowLevel/GenericHIDHost/ConfigDescriptor.c +++ b/Demos/Host/LowLevel/GenericHIDHost/ConfigDescriptor.c @@ -50,7 +50,9 @@ 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; /* Retrieve the entire configuration descriptor into the allocated buffer */ switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) @@ -65,15 +67,15 @@ uint8_t ProcessConfigurationDescriptor(void) return ControlError; } - /* Get the HID interface from the configuration descriptor */ + /* Get the first HID interface from the configuration descriptor */ if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, DComp_NextHIDInterface) != DESCRIPTOR_SEARCH_COMP_Found) { /* Descriptor not found, error out */ - return NoHIDInterfaceFound; + return NoCompatibleInterfaceFound; } - while (FoundEndpoints != ((1 << HID_DATA_IN_PIPE) | (1 << HID_DATA_OUT_PIPE))) + while (!(DataINEndpoint) || !(DataOUTEndpoint)) { /* Get the next HID interface's data endpoint descriptor */ if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, @@ -81,11 +83,19 @@ uint8_t ProcessConfigurationDescriptor(void) { /* Not all HID devices have an OUT endpoint - if we've reached the end of the HID descriptor * but only found the mandatory IN endpoint, it's safe to continue with the device enumeration */ - if (FoundEndpoints == (1 << HID_DATA_IN_PIPE)) + if (DataINEndpoint) break; - - /* Descriptor not found, error out */ - return NoEndpointFound; + + /* Clear any found endpoints */ + DataOUTEndpoint = NULL; + + /* Get the next HID interface from the configuration descriptor */ + if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + DComp_NextHIDInterface) != DESCRIPTOR_SEARCH_COMP_Found) + { + /* Descriptor not found, error out */ + return NoCompatibleInterfaceFound; + } } /* Retrieve the endpoint address from the endpoint descriptor */ @@ -93,22 +103,23 @@ uint8_t ProcessConfigurationDescriptor(void) /* If the endpoint is a IN type endpoint */ if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) - { - /* Configure the HID data IN pipe */ - Pipe_ConfigurePipe(HID_DATA_IN_PIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN, - EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE); - - FoundEndpoints |= (1 << HID_DATA_IN_PIPE); - } + DataINEndpoint = EndpointData; else - { - /* Configure the HID data OUT pipe */ - Pipe_ConfigurePipe(HID_DATA_OUT_PIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_OUT, - EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE); - - FoundEndpoints |= (1 << HID_DATA_OUT_PIPE); - } + DataOUTEndpoint = EndpointData; } + + /* Configure the HID data IN pipe */ + Pipe_ConfigurePipe(HID_DATA_IN_PIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN, + DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE); + Pipe_SetInterruptPeriod(DataINEndpoint->PollingIntervalMS); + + /* Check if the HID interface contained an optional OUT data endpoint */ + if (DataOUTEndpoint) + { + /* Configure the HID data OUT pipe */ + Pipe_ConfigurePipe(HID_DATA_OUT_PIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_OUT, + DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PIPE_BANK_SINGLE); + } /* Valid data found, return success */ return SuccessfulConfigRead; diff --git a/Demos/Host/LowLevel/GenericHIDHost/ConfigDescriptor.h b/Demos/Host/LowLevel/GenericHIDHost/ConfigDescriptor.h index b284b7bd88..e5a39479da 100644 --- a/Demos/Host/LowLevel/GenericHIDHost/ConfigDescriptor.h +++ b/Demos/Host/LowLevel/GenericHIDHost/ConfigDescriptor.h @@ -43,7 +43,13 @@ /* Macros: */ /** Interface Class value for the Human Interface Device class. */ - #define HID_CLASS 0x03 + #define HID_CLASS 0x03 + + /** Pipe number for the HID data IN pipe. */ + #define HID_DATA_IN_PIPE 1 + + /** Pipe number for the HID data OUT pipe. */ + #define HID_DATA_OUT_PIPE 2 /* Enums: */ /** Enum for the possible return codes of the \ref ProcessConfigurationDescriptor() function. */ @@ -53,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/GenericHIDHost/GenericHIDHost.h b/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.h index 89ac01958e..489fba8961 100644 --- a/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.h +++ b/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.h @@ -53,12 +53,6 @@ #include "ConfigDescriptor.h" /* Macros: */ - /** Pipe number for the HID data IN pipe. */ - #define HID_DATA_IN_PIPE 1 - - /** Pipe number for the HID data OUT pipe. */ - #define HID_DATA_OUT_PIPE 2 - /** HID Class specific request to send a HID report to the device. */ #define REQ_SetReport 0x09 |