X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/071e02c6b6b4837fa9cf0b6d4c749994e02638d7..a8871c7fba73307226bd13e2cad4c840c850e6f1:/Demos/Host/LowLevel/MIDIHost/ConfigDescriptor.c diff --git a/Demos/Host/LowLevel/MIDIHost/ConfigDescriptor.c b/Demos/Host/LowLevel/MIDIHost/ConfigDescriptor.c index 0c2ddfa92..7feb31251 100644 --- a/Demos/Host/LowLevel/MIDIHost/ConfigDescriptor.c +++ b/Demos/Host/LowLevel/MIDIHost/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_Interface_t* MIDIInterface = NULL; + 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,47 +68,49 @@ uint8_t ProcessConfigurationDescriptor(void) return ControlError; } - /* Get the MIDI Audio Streaming interface from the configuration descriptor */ - if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, - DComp_NextMIDIStreamingInterface) != DESCRIPTOR_SEARCH_COMP_Found) - { - /* Descriptor not found, error out */ - return NoCDCInterfaceFound; - } - - /* Get the IN and OUT data endpoints for the MIDI interface */ - while (FoundEndpoints != ((1 << MIDI_DATAPIPE_IN) | (1 << MIDI_DATAPIPE_OUT))) + while (!(DataINEndpoint) || !(DataOUTEndpoint)) { - /* Fetch the next bulk endpoint from the current MIDI streaming interface */ - if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + /* See if we've found a likely compatible interface, and if there is an endpoint within that interface */ + if (!(MIDIInterface) || + USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, DComp_NextMIDIStreamingDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) { - /* Descriptor not found, error out */ - return NoEndpointFound; + /* Get the next Mass Storage interface from the configuration descriptor */ + if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, + DComp_NextMIDIStreamingInterface) != DESCRIPTOR_SEARCH_COMP_Found) + { + /* Descriptor not found, error out */ + 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 */ + continue; } + /* Retrieve the endpoint address from the endpoint descriptor */ USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t); - /* Check if the endpoint is a bulk IN or bulk OUT endpoint */ + /* If the endpoint is a IN type endpoint */ if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN) - { - /* Configure the data IN pipe */ - Pipe_ConfigurePipe(MIDI_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 << MIDI_DATAPIPE_IN); - } + DataINEndpoint = EndpointData; else - { - /* Configure the data OUT pipe */ - Pipe_ConfigurePipe(MIDI_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 << MIDI_DATAPIPE_OUT); - } + DataOUTEndpoint = EndpointData; } + + /* Configure the MIDI data IN pipe */ + Pipe_ConfigurePipe(MIDI_DATA_IN_PIPE, EP_TYPE_BULK, PIPE_TOKEN_IN, + DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE); + + /* Configure the MIDI data OUT pipe */ + Pipe_ConfigurePipe(MIDI_DATA_OUT_PIPE, EP_TYPE_BULK, PIPE_TOKEN_OUT, + DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PIPE_BANK_SINGLE); /* Valid data found, return success */ return SuccessfulConfigRead;