/* Function: USBD_ConfigureEndpoint Configures an endpoint according to its Endpoint Descriptor. Parameters: descriptor - Pointer to an Endpoint descriptor. */ void USBD_ConfigureEndpoint(const USBEndpointDescriptor *descriptor) { Endpoint *endpoint; unsigned char eptnum; unsigned char type; unsigned char direction; // NULL descriptor -> Control endpoint 0 if (descriptor == 0) { eptnum = 0; endpoint = &(endpoints[eptnum]); type = USBEndpointDescriptor_CONTROL; direction = 0; endpoint->size = BOARD_USB_ENDPOINTS_MAXPACKETSIZE(0); } else { eptnum = USBEndpointDescriptor_GetNumber(descriptor); endpoint = &(endpoints[eptnum]); type = USBEndpointDescriptor_GetType(descriptor); direction = USBEndpointDescriptor_GetDirection(descriptor); endpoint->size = USBEndpointDescriptor_GetMaxPacketSize(descriptor); } // Abort the current transfer is the endpoint was configured and in // Write or Read state if ((endpoint->state == UDP_ENDPOINT_RECEIVING) || (endpoint->state == UDP_ENDPOINT_SENDING)) { UDP_EndOfTransfer(eptnum, USBD_STATUS_RESET); } endpoint->state = UDP_ENDPOINT_IDLE; // Reset Endpoint Fifos AT91C_BASE_UDP->UDP_RSTEP |= (1 << eptnum); AT91C_BASE_UDP->UDP_RSTEP &= ~(1 << eptnum); // Configure endpoint SET_CSR(eptnum, AT91C_UDP_EPEDS | (type << 8) | (direction << 10)); if (type == USBEndpointDescriptor_CONTROL) { AT91C_BASE_UDP->UDP_IER = (1 << eptnum); } TRACE_INFO( "\r\n# CfgEpt%d ", eptnum); }
} PACKED ADM8511ConfigurationDescriptors; //------------------------------------------------------------------------------ // Exported variables //------------------------------------------------------------------------------ /// Standard USB device descriptor static const USBDeviceDescriptor deviceDescriptor = { sizeof(USBDeviceDescriptor), USBGenericDescriptor_DEVICE, USBDeviceDescriptor_USB2_00, ADM8511_CLASS, ADM8511_SUBCLASS, ADM8511_PROTOCOL, BOARD_USB_ENDPOINTS_MAXPACKETSIZE(0), ADM8511_VENDORID, ADM8511_PRODUCTID, ADM8511_RELEASE, 0, // No string descriptor for manufacturer 1, // Index of product string descriptor is #1 0, // No string descriptor for serial number 1 // Device has 1 possible configuration }; /// Standard USB configuration descriptor static const ADM8511ConfigurationDescriptors configurationDescriptors = { // Standard configuration descriptor { sizeof(USBConfigurationDescriptor),