mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-06-13 20:34:17 +00:00
Change Host mode class driver Pipe configuration routines -- better to let the application fetch the configuration descriptors once, and then pass them to each class driver in turn.
This commit is contained in:
parent
5251bc6e4e
commit
84c3c4a3d9
@ -74,10 +74,31 @@ int main(void)
|
|||||||
case HOST_STATE_Addressed:
|
case HOST_STATE_Addressed:
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
||||||
|
|
||||||
if (CDC_Host_ConfigurePipes(&VirtualSerial_CDC_Interface, 512) != CDC_ENUMERROR_NoError)
|
uint16_t ConfigDescriptorSize;
|
||||||
{
|
uint8_t ConfigDescriptorData[512];
|
||||||
printf("Attached device is not a valid CDC device.\r\n");
|
|
||||||
|
|
||||||
|
if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)
|
||||||
|
{
|
||||||
|
printf("Error Retrieving Device Descriptor.\r\n");
|
||||||
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ConfigDescriptorSize > 512)
|
||||||
|
{
|
||||||
|
printf("Device Descriptor Too Large To Process.\r\n");
|
||||||
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData);
|
||||||
|
|
||||||
|
if (CDC_Host_ConfigurePipes(&VirtualSerial_CDC_Interface,
|
||||||
|
ConfigDescriptorSize, ConfigDescriptorData) != CDC_ENUMERROR_NoError)
|
||||||
|
{
|
||||||
|
printf("Attached Device Not a Valid CDC Class Device.\r\n");
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
@ -86,7 +107,6 @@ int main(void)
|
|||||||
if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
|
if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
printf("Error Setting Device Configuration.\r\n");
|
printf("Error Setting Device Configuration.\r\n");
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
|
@ -76,10 +76,31 @@ int main(void)
|
|||||||
case HOST_STATE_Addressed:
|
case HOST_STATE_Addressed:
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
||||||
|
|
||||||
if (HID_Host_ConfigurePipes(&Mouse_HID_Interface, 512) != HID_ENUMERROR_NoError)
|
uint16_t ConfigDescriptorSize;
|
||||||
{
|
uint8_t ConfigDescriptorData[512];
|
||||||
printf("Attached device is not a valid Mouse.\r\n");
|
|
||||||
|
|
||||||
|
if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)
|
||||||
|
{
|
||||||
|
printf("Error Retrieving Device Descriptor.\r\n");
|
||||||
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ConfigDescriptorSize > 512)
|
||||||
|
{
|
||||||
|
printf("Device Descriptor Too Large To Process.\r\n");
|
||||||
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData);
|
||||||
|
|
||||||
|
if (HID_Host_ConfigurePipes(&Mouse_HID_Interface,
|
||||||
|
ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
|
||||||
|
{
|
||||||
|
printf("Attached Device Not a Valid Mouse.\r\n");
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
@ -88,7 +109,6 @@ int main(void)
|
|||||||
if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
|
if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
|
||||||
{
|
{
|
||||||
printf("Error Setting Device Configuration.\r\n");
|
printf("Error Setting Device Configuration.\r\n");
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||||
break;
|
break;
|
||||||
|
@ -34,24 +34,13 @@
|
|||||||
#define INCLUDE_FROM_CDC_CLASS_HOST_C
|
#define INCLUDE_FROM_CDC_CLASS_HOST_C
|
||||||
#include "CDC.h"
|
#include "CDC.h"
|
||||||
|
|
||||||
uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t MaxConfigBufferSize)
|
uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t ConfigDescriptorSize,
|
||||||
|
uint8_t* ConfigDescriptorData)
|
||||||
{
|
{
|
||||||
uint8_t* ConfigDescriptorData;
|
|
||||||
uint16_t ConfigDescriptorSize;
|
|
||||||
uint8_t FoundEndpoints = 0;
|
uint8_t FoundEndpoints = 0;
|
||||||
|
|
||||||
if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)
|
|
||||||
return CDC_ENUMERROR_ControlError;
|
|
||||||
|
|
||||||
if (ConfigDescriptorSize > MaxConfigBufferSize)
|
|
||||||
return CDC_ENUMERROR_DescriptorTooLarge;
|
|
||||||
|
|
||||||
ConfigDescriptorData = alloca(ConfigDescriptorSize);
|
|
||||||
|
|
||||||
USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData);
|
|
||||||
|
|
||||||
if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
|
if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
|
||||||
return CDC_ENUMERROR_InvalidConfigDataReturned;
|
return CDC_ENUMERROR_InvalidConfigDescriptor;
|
||||||
|
|
||||||
if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
|
if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
|
||||||
DComp_CDC_Host_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
DComp_CDC_Host_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
|
@ -108,16 +108,15 @@
|
|||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
CDC_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully */
|
CDC_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully */
|
||||||
CDC_ENUMERROR_ControlError = 1, /**< A control request to the device failed to complete successfully */
|
CDC_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor */
|
||||||
CDC_ENUMERROR_DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */
|
CDC_ENUMERROR_NoCDCInterfaceFound = 2, /**< A compatible CDC interface was not found in the device's Configuration Descriptor */
|
||||||
CDC_ENUMERROR_InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */
|
CDC_ENUMERROR_EndpointsNotFound = 3, /**< Compatible CDC endpoints were not found in the device's CDC interface */
|
||||||
CDC_ENUMERROR_NoCDCInterfaceFound = 4, /**< A compatible CDC interface was not found in the device's Configuration Descriptor */
|
|
||||||
CDC_ENUMERROR_EndpointsNotFound = 5, /**< Compatible CDC endpoints were not found in the device's CDC interface */
|
|
||||||
} CDCHost_EnumerationFailure_ErrorCodes_t;
|
} CDCHost_EnumerationFailure_ErrorCodes_t;
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);
|
void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);
|
||||||
uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t MaxConfigBufferSize);
|
uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t ConfigDescriptorLength,
|
||||||
|
uint8_t* DeviceConfigDescriptor);
|
||||||
|
|
||||||
void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);
|
void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);
|
||||||
|
|
||||||
|
@ -34,24 +34,13 @@
|
|||||||
#define INCLUDE_FROM_HID_CLASS_HOST_C
|
#define INCLUDE_FROM_HID_CLASS_HOST_C
|
||||||
#include "HID.h"
|
#include "HID.h"
|
||||||
|
|
||||||
uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t MaxConfigBufferSize)
|
uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t ConfigDescriptorSize,
|
||||||
|
uint8_t* ConfigDescriptorData)
|
||||||
{
|
{
|
||||||
uint8_t* ConfigDescriptorData;
|
|
||||||
uint16_t ConfigDescriptorSize;
|
|
||||||
uint8_t FoundEndpoints = 0;
|
uint8_t FoundEndpoints = 0;
|
||||||
|
|
||||||
if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)
|
|
||||||
return HID_ENUMERROR_ControlError;
|
|
||||||
|
|
||||||
if (ConfigDescriptorSize > MaxConfigBufferSize)
|
|
||||||
return HID_ENUMERROR_DescriptorTooLarge;
|
|
||||||
|
|
||||||
ConfigDescriptorData = alloca(ConfigDescriptorSize);
|
|
||||||
|
|
||||||
USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData);
|
|
||||||
|
|
||||||
if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
|
if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
|
||||||
return HID_ENUMERROR_InvalidConfigDataReturned;
|
return HID_ENUMERROR_InvalidConfigDescriptor;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@ -62,7 +51,7 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint
|
|||||||
}
|
}
|
||||||
} while (HIDInterfaceInfo->Config.MatchInterfaceProtocol &&
|
} while (HIDInterfaceInfo->Config.MatchInterfaceProtocol &&
|
||||||
DESCRIPTOR_PCAST(ConfigDescriptorData,
|
DESCRIPTOR_PCAST(ConfigDescriptorData,
|
||||||
USB_Descriptor_Interface_t)->HIDInterfaceProtocol != HIDInterfaceInfo->Config.Protocol);
|
USB_Descriptor_Interface_t)->Protocol != HIDInterfaceInfo->Config.HIDInterfaceProtocol);
|
||||||
|
|
||||||
while (FoundEndpoints != ((1 << HID_FOUND_DATAPIPE_IN) | (1 << HID_FOUND_DATAPIPE_OUT)))
|
while (FoundEndpoints != ((1 << HID_FOUND_DATAPIPE_IN) | (1 << HID_FOUND_DATAPIPE_OUT)))
|
||||||
{
|
{
|
||||||
|
@ -85,16 +85,15 @@
|
|||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
HID_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully */
|
HID_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully */
|
||||||
HID_ENUMERROR_ControlError = 1, /**< A control request to the device failed to complete successfully */
|
HID_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor */
|
||||||
HID_ENUMERROR_DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */
|
HID_ENUMERROR_NoHIDInterfaceFound = 2, /**< A compatible HID interface was not found in the device's Configuration Descriptor */
|
||||||
HID_ENUMERROR_InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */
|
HID_ENUMERROR_EndpointsNotFound = 3, /**< Compatible HID endpoints were not found in the device's CDC interface */
|
||||||
HID_ENUMERROR_NoHIDInterfaceFound = 4, /**< A compatible HID interface was not found in the device's Configuration Descriptor */
|
|
||||||
HID_ENUMERROR_EndpointsNotFound = 5, /**< Compatible HID endpoints were not found in the device's CDC interface */
|
|
||||||
} CDCHost_EnumerationFailure_ErrorCodes_t;
|
} CDCHost_EnumerationFailure_ErrorCodes_t;
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo);
|
void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo);
|
||||||
uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t MaxConfigBufferSize);
|
uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t ConfigDescriptorLength,
|
||||||
|
uint8_t* DeviceConfigDescriptor);
|
||||||
|
|
||||||
/* Private Interface - For use in library only: */
|
/* Private Interface - For use in library only: */
|
||||||
#if !defined(__DOXYGEN__)
|
#if !defined(__DOXYGEN__)
|
||||||
|
Loading…
Reference in New Issue
Block a user