diff options
Diffstat (limited to 'drivers/serial/usbtty.c')
| -rw-r--r-- | drivers/serial/usbtty.c | 50 | 
1 files changed, 49 insertions, 1 deletions
diff --git a/drivers/serial/usbtty.c b/drivers/serial/usbtty.c index a263b2c1f..e47cb9a9e 100644 --- a/drivers/serial/usbtty.c +++ b/drivers/serial/usbtty.c @@ -133,6 +133,19 @@ static struct usb_device_descriptor device_descriptor = {  }; +#if defined(CONFIG_USBD_HS) +static struct usb_qualifier_descriptor qualifier_descriptor = { +	.bLength = sizeof(struct usb_qualifier_descriptor), +	.bDescriptorType =	USB_DT_QUAL, +	.bcdUSB =		cpu_to_le16(USB_BCD_VERSION), +	.bDeviceClass =		COMMUNICATIONS_DEVICE_CLASS, +	.bDeviceSubClass =	0x00, +	.bDeviceProtocol =	0x00, +	.bMaxPacketSize0 =	EP0_MAX_PACKET_SIZE, +	.bNumConfigurations =	NUM_CONFIGS +}; +#endif +  /*   * Static CDC ACM specific descriptors   */ @@ -638,6 +651,9 @@ static void usbtty_init_instances (void)  	memset (device_instance, 0, sizeof (struct usb_device_instance));  	device_instance->device_state = STATE_INIT;  	device_instance->device_descriptor = &device_descriptor; +#if defined(CONFIG_USBD_HS) +	device_instance->qualifier_descriptor = &qualifier_descriptor; +#endif  	device_instance->event = usbtty_event_handler;  	device_instance->cdc_recv_setup = usbtty_cdc_setup;  	device_instance->bus = bus_instance; @@ -751,6 +767,10 @@ static void usbtty_init_terminal_type(short type)  			device_descriptor.idProduct =  				cpu_to_le16(CONFIG_USBD_PRODUCTID_CDCACM); +#if defined(CONFIG_USBD_HS) +			qualifier_descriptor.bDeviceClass = +				COMMUNICATIONS_DEVICE_CLASS; +#endif  			/* Assign endpoint indices */  			tx_endpoint = ACM_TX_ENDPOINT;  			rx_endpoint = ACM_RX_ENDPOINT; @@ -779,7 +799,9 @@ static void usbtty_init_terminal_type(short type)  			device_descriptor.bDeviceClass = 0xFF;  			device_descriptor.idProduct =  				cpu_to_le16(CONFIG_USBD_PRODUCTID_GSERIAL); - +#if defined(CONFIG_USBD_HS) +			qualifier_descriptor.bDeviceClass = 0xFF; +#endif  			/* Assign endpoint indices */  			tx_endpoint = GSERIAL_TX_ENDPOINT;  			rx_endpoint = GSERIAL_RX_ENDPOINT; @@ -932,6 +954,9 @@ static int usbtty_configured (void)  static void usbtty_event_handler (struct usb_device_instance *device,  				  usb_device_event_t event, int data)  { +#if defined(CONFIG_USBD_HS) +	int i; +#endif  	switch (event) {  	case DEVICE_RESET:  	case DEVICE_BUS_INACTIVE: @@ -942,6 +967,29 @@ static void usbtty_event_handler (struct usb_device_instance *device,  		break;  	case DEVICE_ADDRESS_ASSIGNED: +#if defined(CONFIG_USBD_HS) +		/* +		 * is_usbd_high_speed routine needs to be defined by +		 * specific gadget driver +		 * It returns TRUE if device enumerates at High speed +		 * Retuns FALSE otherwise +		 */ +		for (i = 0; i < NUM_ENDPOINTS; i++) { +			if (((ep_descriptor_ptrs[i]->bmAttributes & +			      USB_ENDPOINT_XFERTYPE_MASK) == +			      USB_ENDPOINT_XFER_BULK) +			    && is_usbd_high_speed()) { + +				ep_descriptor_ptrs[i]->wMaxPacketSize = +					CONFIG_USBD_SERIAL_BULK_HS_PKTSIZE; +			} + +			endpoint_instance[i + 1].tx_packetSize = +				ep_descriptor_ptrs[i]->wMaxPacketSize; +			endpoint_instance[i + 1].rcv_packetSize = +				ep_descriptor_ptrs[i]->wMaxPacketSize; +		} +#endif  		usbtty_init_endpoints ();  	default:  |