Commit c8942ef4 authored by Dean Camera's avatar Dean Camera
Browse files

Fixed LowLevel JoystickHostWithParser demo not saving the chosen HID...

Fixed LowLevel JoystickHostWithParser demo not saving the chosen HID interface's report descriptor size.

Simplified low level Host demo configuration descriptor parser routines.
parent d36c96d6
...@@ -51,8 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -51,8 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void)
void* CurrConfigLocation = ConfigDescriptorData; void* CurrConfigLocation = ConfigDescriptorData;
uint16_t CurrConfigBytesRem; uint16_t CurrConfigBytesRem;
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL; USB_Descriptor_Interface_t* HIDInterface = NULL;
USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL; USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
/* Retrieve the entire configuration descriptor into the allocated buffer */ /* Retrieve the entire configuration descriptor into the allocated buffer */
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
...@@ -66,19 +67,12 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -66,19 +67,12 @@ uint8_t ProcessConfigurationDescriptor(void)
default: default:
return ControlError; return ControlError;
} }
/* 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 NoCompatibleInterfaceFound;
}
while (!(DataINEndpoint) || !(DataOUTEndpoint)) while (!(DataINEndpoint) || !(DataOUTEndpoint))
{ {
/* Get the next HID interface's data endpoint descriptor */ /* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (!(HIDInterface) ||
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextHIDInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextHIDInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
{ {
/* Not all HID devices have an OUT endpoint - if we've reached the end of the HID descriptor /* Not all HID devices have an OUT endpoint - if we've reached the end of the HID descriptor
...@@ -86,9 +80,6 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -86,9 +80,6 @@ uint8_t ProcessConfigurationDescriptor(void)
if (DataINEndpoint) if (DataINEndpoint)
break; break;
/* Clear any found endpoints */
DataOUTEndpoint = NULL;
/* Get the next HID interface from the configuration descriptor */ /* Get the next HID interface from the configuration descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextHIDInterface) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextHIDInterface) != DESCRIPTOR_SEARCH_COMP_Found)
...@@ -97,6 +88,12 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -97,6 +88,12 @@ uint8_t ProcessConfigurationDescriptor(void)
return NoCompatibleInterfaceFound; return NoCompatibleInterfaceFound;
} }
/* Save the interface in case we need to refer back to it later */
HIDInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
/* Clear any found endpoints */
DataOUTEndpoint = NULL;
/* Skip the remainder of the loop as we have not found an endpoint yet */ /* Skip the remainder of the loop as we have not found an endpoint yet */
continue; continue;
} }
......
...@@ -51,7 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -51,7 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void)
void* CurrConfigLocation = ConfigDescriptorData; void* CurrConfigLocation = ConfigDescriptorData;
uint16_t CurrConfigBytesRem; uint16_t CurrConfigBytesRem;
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL; USB_Descriptor_Interface_t* HIDInterface = NULL;
USB_Descriptor_HID_t* HIDDescriptor = NULL;
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
/* Retrieve the entire configuration descriptor into the allocated buffer */ /* Retrieve the entire configuration descriptor into the allocated buffer */
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
...@@ -65,19 +67,12 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -65,19 +67,12 @@ uint8_t ProcessConfigurationDescriptor(void)
default: default:
return ControlError; return ControlError;
} }
/* Get the first HID interface from the configuration descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextJoystickInterface) != DESCRIPTOR_SEARCH_COMP_Found)
{
/* Descriptor not found, error out */
return NoCompatibleInterfaceFound;
}
while (!(DataINEndpoint)) while (!(DataINEndpoint))
{ {
/* Get the next HID interface's data endpoint descriptor */ /* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (!(HIDInterface) ||
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextJoystickInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextJoystickInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
{ {
/* Get the next HID interface from the configuration descriptor */ /* Get the next HID interface from the configuration descriptor */
...@@ -88,6 +83,20 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -88,6 +83,20 @@ uint8_t ProcessConfigurationDescriptor(void)
return NoCompatibleInterfaceFound; return NoCompatibleInterfaceFound;
} }
/* Save the interface in case we need to refer back to it later */
HIDInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
/* Get the HID descriptor from the configuration descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextHID) != DESCRIPTOR_SEARCH_COMP_Found)
{
/* Descriptor not found, error out */
return NoCompatibleInterfaceFound;
}
/* Save the HID descriptor for later use */
HIDDescriptor = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_HID_t);
/* Skip the remainder of the loop as we have not found an endpoint yet */ /* Skip the remainder of the loop as we have not found an endpoint yet */
continue; continue;
} }
...@@ -104,7 +113,10 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -104,7 +113,10 @@ uint8_t ProcessConfigurationDescriptor(void)
Pipe_ConfigurePipe(JOYSTICK_DATA_IN_PIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN, Pipe_ConfigurePipe(JOYSTICK_DATA_IN_PIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN,
DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE); DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);
Pipe_SetInterruptPeriod(DataINEndpoint->PollingIntervalMS); Pipe_SetInterruptPeriod(DataINEndpoint->PollingIntervalMS);
/* Get the HID report size from the HID report descriptor */
HIDReportSize = HIDDescriptor->HIDReportLength;
/* Valid data found, return success */ /* Valid data found, return success */
return SuccessfulConfigRead; return SuccessfulConfigRead;
} }
......
...@@ -51,7 +51,8 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -51,7 +51,8 @@ uint8_t ProcessConfigurationDescriptor(void)
void* CurrConfigLocation = ConfigDescriptorData; void* CurrConfigLocation = ConfigDescriptorData;
uint16_t CurrConfigBytesRem; uint16_t CurrConfigBytesRem;
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL; USB_Descriptor_Interface_t* HIDInterface = NULL;
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
/* Retrieve the entire configuration descriptor into the allocated buffer */ /* Retrieve the entire configuration descriptor into the allocated buffer */
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
...@@ -66,18 +67,11 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -66,18 +67,11 @@ uint8_t ProcessConfigurationDescriptor(void)
return ControlError; return ControlError;
} }
/* Get the first HID interface from the configuration descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextKeyboardInterface) != DESCRIPTOR_SEARCH_COMP_Found)
{
/* Descriptor not found, error out */
return NoCompatibleInterfaceFound;
}
while (!(DataINEndpoint)) while (!(DataINEndpoint))
{ {
/* Get the next HID interface's data endpoint descriptor */ /* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (!(HIDInterface) ||
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextKeyboardInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextKeyboardInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
{ {
/* Get the next HID interface from the configuration descriptor */ /* Get the next HID interface from the configuration descriptor */
...@@ -88,6 +82,9 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -88,6 +82,9 @@ uint8_t ProcessConfigurationDescriptor(void)
return NoCompatibleInterfaceFound; return NoCompatibleInterfaceFound;
} }
/* Save the interface in case we need to refer back to it later */
HIDInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
/* Skip the remainder of the loop as we have not found an endpoint yet */ /* Skip the remainder of the loop as we have not found an endpoint yet */
continue; continue;
} }
......
...@@ -51,7 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -51,7 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void)
void* CurrConfigLocation = ConfigDescriptorData; void* CurrConfigLocation = ConfigDescriptorData;
uint16_t CurrConfigBytesRem; uint16_t CurrConfigBytesRem;
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL; USB_Descriptor_Interface_t* HIDInterface = NULL;
USB_Descriptor_HID_t* HIDDescriptor = NULL;
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
/* Retrieve the entire configuration descriptor into the allocated buffer */ /* Retrieve the entire configuration descriptor into the allocated buffer */
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
...@@ -65,30 +67,12 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -65,30 +67,12 @@ uint8_t ProcessConfigurationDescriptor(void)
default: default:
return ControlError; return ControlError;
} }
/* Get the first HID interface from the configuration descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextKeyboardInterface) != DESCRIPTOR_SEARCH_COMP_Found)
{
/* Descriptor not found, error out */
return NoCompatibleInterfaceFound;
}
/* Get the HID descriptor from the configuration descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextHID) != DESCRIPTOR_SEARCH_COMP_Found)
{
/* Descriptor not found, error out */
return NoCompatibleInterfaceFound;
}
/* Save the HID report size for later use */
HIDReportSize = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_HID_t)->HIDReportLength;
while (!(DataINEndpoint)) while (!(DataINEndpoint))
{ {
/* Get the next HID interface's data endpoint descriptor */ /* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (!(HIDInterface) ||
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextKeyboardInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextKeyboardInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
{ {
/* Get the next HID interface from the configuration descriptor */ /* Get the next HID interface from the configuration descriptor */
...@@ -99,6 +83,9 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -99,6 +83,9 @@ uint8_t ProcessConfigurationDescriptor(void)
return NoCompatibleInterfaceFound; return NoCompatibleInterfaceFound;
} }
/* Save the interface in case we need to refer back to it later */
HIDInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
/* Get the HID descriptor from the configuration descriptor */ /* Get the HID descriptor from the configuration descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextHID) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextHID) != DESCRIPTOR_SEARCH_COMP_Found)
...@@ -107,9 +94,9 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -107,9 +94,9 @@ uint8_t ProcessConfigurationDescriptor(void)
return NoCompatibleInterfaceFound; return NoCompatibleInterfaceFound;
} }
/* Save the HID report size for later use */ /* Save the HID descriptor for later use */
HIDReportSize = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_HID_t)->HIDReportLength; HIDDescriptor = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_HID_t);
/* Skip the remainder of the loop as we have not found an endpoint yet */ /* Skip the remainder of the loop as we have not found an endpoint yet */
continue; continue;
} }
...@@ -127,6 +114,9 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -127,6 +114,9 @@ uint8_t ProcessConfigurationDescriptor(void)
DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE); DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);
Pipe_SetInterruptPeriod(DataINEndpoint->PollingIntervalMS); Pipe_SetInterruptPeriod(DataINEndpoint->PollingIntervalMS);
/* Get the HID report size from the HID report descriptor */
HIDReportSize = HIDDescriptor->HIDReportLength;
/* Valid data found, return success */ /* Valid data found, return success */
return SuccessfulConfigRead; return SuccessfulConfigRead;
} }
......
...@@ -51,8 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -51,8 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void)
void* CurrConfigLocation = ConfigDescriptorData; void* CurrConfigLocation = ConfigDescriptorData;
uint16_t CurrConfigBytesRem; uint16_t CurrConfigBytesRem;
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL; USB_Descriptor_Interface_t* MIDIInterface = NULL;
USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL; USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
/* Retrieve the entire configuration descriptor into the allocated buffer */ /* Retrieve the entire configuration descriptor into the allocated buffer */
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
...@@ -67,24 +68,13 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -67,24 +68,13 @@ uint8_t ProcessConfigurationDescriptor(void)
return ControlError; return ControlError;
} }
/* Get the first MIDI interface from the configuration descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextMIDIStreamingInterface) != DESCRIPTOR_SEARCH_COMP_Found)
{
/* Descriptor not found, error out */
return NoCompatibleInterfaceFound;
}
while (!(DataINEndpoint) || !(DataOUTEndpoint)) while (!(DataINEndpoint) || !(DataOUTEndpoint))
{ {
/* Get the next MIDI interface's data endpoint descriptor */ /* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (!(MIDIInterface) ||
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextMIDIStreamingDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextMIDIStreamingDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
{ {
/* Clear any found endpoints */
DataINEndpoint = NULL;
DataOUTEndpoint = NULL;
/* Get the next Mass Storage interface from the configuration descriptor */ /* Get the next Mass Storage interface from the configuration descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextMIDIStreamingInterface) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextMIDIStreamingInterface) != DESCRIPTOR_SEARCH_COMP_Found)
...@@ -93,6 +83,13 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -93,6 +83,13 @@ uint8_t ProcessConfigurationDescriptor(void)
return NoCompatibleInterfaceFound; return NoCompatibleInterfaceFound;
} }
/* Save the interface in case we need to refer back to it later */
MIDIInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
/* Clear any found endpoints */
DataINEndpoint = NULL;
DataOUTEndpoint = NULL;
/* Skip the remainder of the loop as we have not found an endpoint yet */ /* Skip the remainder of the loop as we have not found an endpoint yet */
continue; continue;
} }
...@@ -102,7 +99,7 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -102,7 +99,7 @@ uint8_t ProcessConfigurationDescriptor(void)
/* If the endpoint is a IN type endpoint */ /* If the endpoint is a IN type endpoint */
if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
DataINEndpoint = EndpointData; DataINEndpoint = EndpointData;
else else
DataOUTEndpoint = EndpointData; DataOUTEndpoint = EndpointData;
} }
......
...@@ -51,8 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -51,8 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void)
void* CurrConfigLocation = ConfigDescriptorData; void* CurrConfigLocation = ConfigDescriptorData;
uint16_t CurrConfigBytesRem; uint16_t CurrConfigBytesRem;
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL; USB_Descriptor_Interface_t* MSInterface = NULL;
USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL; USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
/* Retrieve the entire configuration descriptor into the allocated buffer */ /* Retrieve the entire configuration descriptor into the allocated buffer */
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
...@@ -66,25 +67,14 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -66,25 +67,14 @@ uint8_t ProcessConfigurationDescriptor(void)
default: default:
return ControlError; return ControlError;
} }
/* Get the first Mass Storage interface from the configuration descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextMSInterface) != DESCRIPTOR_SEARCH_COMP_Found)
{
/* Descriptor not found, error out */
return NoCompatibleInterfaceFound;
}
while (!(DataINEndpoint) || !(DataOUTEndpoint)) while (!(DataINEndpoint) || !(DataOUTEndpoint))
{ {
/* Get the next Mass Storage interface's data endpoint descriptor */ /* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (!(MSInterface) ||
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextMSInterfaceBulkDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextMSInterfaceBulkDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
{ {
/* Clear any found endpoints */
DataINEndpoint = NULL;
DataOUTEndpoint = NULL;
/* Get the next Mass Storage interface from the configuration descriptor */ /* Get the next Mass Storage interface from the configuration descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextMSInterface) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextMSInterface) != DESCRIPTOR_SEARCH_COMP_Found)
...@@ -93,6 +83,13 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -93,6 +83,13 @@ uint8_t ProcessConfigurationDescriptor(void)
return NoCompatibleInterfaceFound; return NoCompatibleInterfaceFound;
} }
/* Save the interface in case we need to refer back to it later */
MSInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
/* Clear any found endpoints */
DataINEndpoint = NULL;
DataOUTEndpoint = NULL;
/* Skip the remainder of the loop as we have not found an endpoint yet */ /* Skip the remainder of the loop as we have not found an endpoint yet */
continue; continue;
} }
...@@ -102,7 +99,7 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -102,7 +99,7 @@ uint8_t ProcessConfigurationDescriptor(void)
/* If the endpoint is a IN type endpoint */ /* If the endpoint is a IN type endpoint */
if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
DataINEndpoint = EndpointData; DataINEndpoint = EndpointData;
else else
DataOUTEndpoint = EndpointData; DataOUTEndpoint = EndpointData;
} }
......
...@@ -51,7 +51,8 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -51,7 +51,8 @@ uint8_t ProcessConfigurationDescriptor(void)
void* CurrConfigLocation = ConfigDescriptorData; void* CurrConfigLocation = ConfigDescriptorData;
uint16_t CurrConfigBytesRem; uint16_t CurrConfigBytesRem;
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL; USB_Descriptor_Interface_t* HIDInterface = NULL;
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
/* Retrieve the entire configuration descriptor into the allocated buffer */ /* Retrieve the entire configuration descriptor into the allocated buffer */
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
...@@ -65,19 +66,12 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -65,19 +66,12 @@ uint8_t ProcessConfigurationDescriptor(void)
default: default:
return ControlError; return ControlError;
} }
/* 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 NoCompatibleInterfaceFound;
}
while (!(DataINEndpoint)) while (!(DataINEndpoint))
{ {
/* Get the next HID interface's data endpoint descriptor */ /* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (!(HIDInterface) ||
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextMouseInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextMouseInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
{ {
/* Get the next HID interface from the configuration descriptor */ /* Get the next HID interface from the configuration descriptor */
...@@ -88,6 +82,9 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -88,6 +82,9 @@ uint8_t ProcessConfigurationDescriptor(void)
return NoCompatibleInterfaceFound; return NoCompatibleInterfaceFound;
} }
/* Save the interface in case we need to refer back to it later */
HIDInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
/* Skip the remainder of the loop as we have not found an endpoint yet */ /* Skip the remainder of the loop as we have not found an endpoint yet */
continue; continue;
} }
......
...@@ -51,7 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -51,7 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void)
void* CurrConfigLocation = ConfigDescriptorData; void* CurrConfigLocation = ConfigDescriptorData;
uint16_t CurrConfigBytesRem; uint16_t CurrConfigBytesRem;
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL; USB_Descriptor_Interface_t* HIDInterface = NULL;
USB_Descriptor_HID_t* HIDDescriptor = NULL;
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
/* Retrieve the entire configuration descriptor into the allocated buffer */ /* Retrieve the entire configuration descriptor into the allocated buffer */
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData))) switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
...@@ -66,29 +68,11 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -66,29 +68,11 @@ uint8_t ProcessConfigurationDescriptor(void)
return ControlError; return ControlError;
} }
/* 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 NoCompatibleInterfaceFound;
}
/* Get the HID descriptor from the configuration descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextHID) != DESCRIPTOR_SEARCH_COMP_Found)
{
/* Descriptor not found, error out */
return NoCompatibleInterfaceFound;
}
/* Save the HID report size for later use */
HIDReportSize = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_HID_t)->HIDReportLength;
while (!(DataINEndpoint)) while (!(DataINEndpoint))
{ {
/* Get the next HID interface's data endpoint descriptor */ /* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (!(HIDInterface) ||
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,