//------------------------------------------------------------------------------ /// Configures the device by setting it into the Configured state and /// initializing all endpoints. /// \param pDriver Pointer to a USBDDriver instance. /// \param cfgnum Configuration number to set. //------------------------------------------------------------------------------ static void SetConfiguration(USBDDriver *pDriver, unsigned char cfgnum) { USBEndpointDescriptor *pEndpoints[BOARD_USB_NUMENDPOINTS+1]; const USBConfigurationDescriptor *pConfiguration; pConfiguration = pDriver->pDescriptors->pFsConfiguration; // Set & save the desired configuration USBD_SetConfiguration(cfgnum); pDriver->cfgnum = cfgnum; // If the configuration is not 0, configure endpoints if (cfgnum != 0) { // Parse configuration to get endpoint descriptors USBConfigurationDescriptor_Parse(pConfiguration, 0, pEndpoints, 0); // Configure endpoints int i = 0; while (pEndpoints[i] != 0) { USBD_ConfigureEndpoint(pEndpoints[i]); i++; } } // Should be done before send the ZLP USBDDriverCallbacks_ConfigurationChanged(cfgnum); // Acknowledge the request USBD_Write(0, // Endpoint #0 0, // No data buffer 0, // No data buffer (TransferCallback) 0, (void *) 0); }
/** * Configures the device by setting it into the Configured state and * initializing all endpoints. * \param pDriver Pointer to a USBDDriver instance. * \param cfgnum Configuration number to set. */ static void SetConfiguration(USBDDriver *pDriver, uint8_t cfgnum) { USBEndpointDescriptor *pEndpoints[17]; const USBConfigurationDescriptor *pConfiguration; /* Use different descriptor depending on device speed */ if ( USBD_HAL_IsHighSpeed() && pDriver->pDescriptors->pHsConfiguration) { pConfiguration = pDriver->pDescriptors->pHsConfiguration; } else { pConfiguration = pDriver->pDescriptors->pFsConfiguration; } /* Set & save the desired configuration */ USBD_SetConfiguration(cfgnum); pDriver->cfgnum = cfgnum; pDriver->isRemoteWakeUpEnabled = ((pConfiguration->bmAttributes & 0x20) > 0); /* If the configuration is not 0, configure endpoints */ if (cfgnum != 0) { /* Parse configuration to get endpoint descriptors */ USBConfigurationDescriptor_Parse(pConfiguration, 0, pEndpoints, 0); /* Configure endpoints */ int i = 0; while (pEndpoints[i] != 0) { USBD_ConfigureEndpoint(pEndpoints[i]); i++; } } /* Should be done before send the ZLP */ if (NULL != USBDDriverCallbacks_ConfigurationChanged) USBDDriverCallbacks_ConfigurationChanged(cfgnum); /* Acknowledge the request */ USBD_Write(0, /* Endpoint #0 */ 0, /* No data buffer */ 0, /* No data buffer */ (TransferCallback) 0, (void *) 0); }
//------------------------------------------------------------------------------ /// Configures the device by setting it into the Configured state and /// initializing all endpoints. /// \param pDriver Pointer to a USBDDriver instance. /// \param cfgnum Configuration number to set. //------------------------------------------------------------------------------ static void SetConfiguration(USBDDriver *pDriver, unsigned char cfgnum) { USBEndpointDescriptor *pEndpoints[BOARD_USB_NUMENDPOINTS+1]; const USBConfigurationDescriptor *pConfiguration; // Use different descriptor depending on device speed if (USBD_IsHighSpeed()) { pConfiguration = pDriver->pDescriptors->pHsConfiguration; } else { pConfiguration = pDriver->pDescriptors->pFsConfiguration; } // Set & save the desired configuration USBD_SetConfiguration(cfgnum); pDriver->cfgnum = cfgnum; // If the configuration is not 0, configure endpoints if (cfgnum != 0) { // Parse configuration to get endpoint descriptors USBConfigurationDescriptor_Parse(pConfiguration, 0, pEndpoints, 0); // Configure endpoints int i = 0; while (pEndpoints[i] != 0) { USBD_ConfigureEndpoint(pEndpoints[i]); i++; } } // Acknowledge the request USBD_Write(0, // Endpoint #0 0, // No data buffer 0, // No data buffer (TransferCallback) USBDDriverCallbacks_ConfigurationChanged, (void *) (unsigned int) cfgnum); }