Home | History | Annotate | Download | only in gadget
      1 // SPDX-License-Identifier: GPL-2.0+
      2 /*
      3  * (C) Copyright 2003
      4  * Gerry Hamel, geh (at) ti.com, Texas Instruments
      5  *
      6  * Based on
      7  * linux/drivers/usbd/usbd.c.c - USB Device Core Layer
      8  *
      9  * Copyright (c) 2000, 2001, 2002 Lineo
     10  * Copyright (c) 2001 Hewlett Packard
     11  *
     12  * By:
     13  *	Stuart Lynne <sl (at) lineo.com>,
     14  *	Tom Rushworth <tbr (at) lineo.com>,
     15  *	Bruce Balden <balden (at) lineo.com>
     16  */
     17 
     18 #include <malloc.h>
     19 #include <usbdevice.h>
     20 
     21 #define MAX_INTERFACES 2
     22 
     23 
     24 int maxstrings = 20;
     25 
     26 /* Global variables ************************************************************************** */
     27 
     28 struct usb_string_descriptor **usb_strings;
     29 
     30 int usb_devices;
     31 
     32 extern struct usb_function_driver ep0_driver;
     33 
     34 int registered_functions;
     35 int registered_devices;
     36 
     37 char *usbd_device_events[] = {
     38 	"DEVICE_UNKNOWN",
     39 	"DEVICE_INIT",
     40 	"DEVICE_CREATE",
     41 	"DEVICE_HUB_CONFIGURED",
     42 	"DEVICE_RESET",
     43 	"DEVICE_ADDRESS_ASSIGNED",
     44 	"DEVICE_CONFIGURED",
     45 	"DEVICE_SET_INTERFACE",
     46 	"DEVICE_SET_FEATURE",
     47 	"DEVICE_CLEAR_FEATURE",
     48 	"DEVICE_DE_CONFIGURED",
     49 	"DEVICE_BUS_INACTIVE",
     50 	"DEVICE_BUS_ACTIVITY",
     51 	"DEVICE_POWER_INTERRUPTION",
     52 	"DEVICE_HUB_RESET",
     53 	"DEVICE_DESTROY",
     54 	"DEVICE_FUNCTION_PRIVATE",
     55 };
     56 
     57 char *usbd_device_states[] = {
     58 	"STATE_INIT",
     59 	"STATE_CREATED",
     60 	"STATE_ATTACHED",
     61 	"STATE_POWERED",
     62 	"STATE_DEFAULT",
     63 	"STATE_ADDRESSED",
     64 	"STATE_CONFIGURED",
     65 	"STATE_UNKNOWN",
     66 };
     67 
     68 char *usbd_device_requests[] = {
     69 	"GET STATUS",		/* 0 */
     70 	"CLEAR FEATURE",	/* 1 */
     71 	"RESERVED",		/* 2 */
     72 	"SET FEATURE",		/* 3 */
     73 	"RESERVED",		/* 4 */
     74 	"SET ADDRESS",		/* 5 */
     75 	"GET DESCRIPTOR",	/* 6 */
     76 	"SET DESCRIPTOR",	/* 7 */
     77 	"GET CONFIGURATION",	/* 8 */
     78 	"SET CONFIGURATION",	/* 9 */
     79 	"GET INTERFACE",	/* 10 */
     80 	"SET INTERFACE",	/* 11 */
     81 	"SYNC FRAME",		/* 12 */
     82 };
     83 
     84 char *usbd_device_descriptors[] = {
     85 	"UNKNOWN",		/* 0 */
     86 	"DEVICE",		/* 1 */
     87 	"CONFIG",		/* 2 */
     88 	"STRING",		/* 3 */
     89 	"INTERFACE",		/* 4 */
     90 	"ENDPOINT",		/* 5 */
     91 	"DEVICE QUALIFIER",	/* 6 */
     92 	"OTHER SPEED",		/* 7 */
     93 	"INTERFACE POWER",	/* 8 */
     94 };
     95 
     96 char *usbd_device_status[] = {
     97 	"USBD_OPENING",
     98 	"USBD_OK",
     99 	"USBD_SUSPENDED",
    100 	"USBD_CLOSING",
    101 };
    102 
    103 
    104 /* Descriptor support functions ************************************************************** */
    105 
    106 
    107 /**
    108  * usbd_get_string - find and return a string descriptor
    109  * @index: string index to return
    110  *
    111  * Find an indexed string and return a pointer to a it.
    112  */
    113 struct usb_string_descriptor *usbd_get_string (__u8 index)
    114 {
    115 	if (index >= maxstrings) {
    116 		return NULL;
    117 	}
    118 	return usb_strings[index];
    119 }
    120 
    121 
    122 /* Access to device descriptor functions ***************************************************** */
    123 
    124 
    125 /* *
    126  * usbd_device_configuration_instance - find a configuration instance for this device
    127  * @device:
    128  * @configuration: index to configuration, 0 - N-1
    129  *
    130  * Get specifed device configuration. Index should be bConfigurationValue-1.
    131  */
    132 static struct usb_configuration_instance *usbd_device_configuration_instance (struct usb_device_instance *device,
    133 		unsigned int port, unsigned int configuration)
    134 {
    135 	if (configuration >= device->configurations)
    136 		return NULL;
    137 
    138 	return device->configuration_instance_array + configuration;
    139 }
    140 
    141 
    142 /* *
    143  * usbd_device_interface_instance
    144  * @device:
    145  * @configuration: index to configuration, 0 - N-1
    146  * @interface: index to interface
    147  *
    148  * Return the specified interface descriptor for the specified device.
    149  */
    150 struct usb_interface_instance *usbd_device_interface_instance (struct usb_device_instance *device, int port, int configuration, int interface)
    151 {
    152 	struct usb_configuration_instance *configuration_instance;
    153 
    154 	if ((configuration_instance = usbd_device_configuration_instance (device, port, configuration)) == NULL) {
    155 		return NULL;
    156 	}
    157 	if (interface >= configuration_instance->interfaces) {
    158 		return NULL;
    159 	}
    160 	return configuration_instance->interface_instance_array + interface;
    161 }
    162 
    163 /* *
    164  * usbd_device_alternate_descriptor_list
    165  * @device:
    166  * @configuration: index to configuration, 0 - N-1
    167  * @interface: index to interface
    168  * @alternate: alternate setting
    169  *
    170  * Return the specified alternate descriptor for the specified device.
    171  */
    172 struct usb_alternate_instance *usbd_device_alternate_instance (struct usb_device_instance *device, int port, int configuration, int interface, int alternate)
    173 {
    174 	struct usb_interface_instance *interface_instance;
    175 
    176 	if ((interface_instance = usbd_device_interface_instance (device, port, configuration, interface)) == NULL) {
    177 		return NULL;
    178 	}
    179 
    180 	if (alternate >= interface_instance->alternates) {
    181 		return NULL;
    182 	}
    183 
    184 	return interface_instance->alternates_instance_array + alternate;
    185 }
    186 
    187 
    188 /* *
    189  * usbd_device_device_descriptor
    190  * @device: which device
    191  * @configuration: index to configuration, 0 - N-1
    192  * @port: which port
    193  *
    194  * Return the specified configuration descriptor for the specified device.
    195  */
    196 struct usb_device_descriptor *usbd_device_device_descriptor (struct usb_device_instance *device, int port)
    197 {
    198 	return (device->device_descriptor);
    199 }
    200 
    201 /**
    202  * usbd_device_configuration_descriptor
    203  * @device: which device
    204  * @port: which port
    205  * @configuration: index to configuration, 0 - N-1
    206  *
    207  * Return the specified configuration descriptor for the specified device.
    208  */
    209 struct usb_configuration_descriptor *usbd_device_configuration_descriptor (struct
    210 									   usb_device_instance
    211 									   *device, int port, int configuration)
    212 {
    213 	struct usb_configuration_instance *configuration_instance;
    214 	if (!(configuration_instance = usbd_device_configuration_instance (device, port, configuration))) {
    215 		return NULL;
    216 	}
    217 	return (configuration_instance->configuration_descriptor);
    218 }
    219 
    220 
    221 /**
    222  * usbd_device_interface_descriptor
    223  * @device: which device
    224  * @port: which port
    225  * @configuration: index to configuration, 0 - N-1
    226  * @interface: index to interface
    227  * @alternate: alternate setting
    228  *
    229  * Return the specified interface descriptor for the specified device.
    230  */
    231 struct usb_interface_descriptor *usbd_device_interface_descriptor (struct usb_device_instance
    232 								   *device, int port, int configuration, int interface, int alternate)
    233 {
    234 	struct usb_interface_instance *interface_instance;
    235 	if (!(interface_instance = usbd_device_interface_instance (device, port, configuration, interface))) {
    236 		return NULL;
    237 	}
    238 	if ((alternate < 0) || (alternate >= interface_instance->alternates)) {
    239 		return NULL;
    240 	}
    241 	return (interface_instance->alternates_instance_array[alternate].interface_descriptor);
    242 }
    243 
    244 /**
    245  * usbd_device_endpoint_descriptor_index
    246  * @device: which device
    247  * @port: which port
    248  * @configuration: index to configuration, 0 - N-1
    249  * @interface: index to interface
    250  * @alternate: index setting
    251  * @index: which index
    252  *
    253  * Return the specified endpoint descriptor for the specified device.
    254  */
    255 struct usb_endpoint_descriptor *usbd_device_endpoint_descriptor_index (struct usb_device_instance
    256 								       *device, int port, int configuration, int interface, int alternate, int index)
    257 {
    258 	struct usb_alternate_instance *alternate_instance;
    259 
    260 	if (!(alternate_instance = usbd_device_alternate_instance (device, port, configuration, interface, alternate))) {
    261 		return NULL;
    262 	}
    263 	if (index >= alternate_instance->endpoints) {
    264 		return NULL;
    265 	}
    266 	return *(alternate_instance->endpoints_descriptor_array + index);
    267 }
    268 
    269 
    270 /**
    271  * usbd_device_endpoint_transfersize
    272  * @device: which device
    273  * @port: which port
    274  * @configuration: index to configuration, 0 - N-1
    275  * @interface: index to interface
    276  * @index: which index
    277  *
    278  * Return the specified endpoint transfer size;
    279  */
    280 int usbd_device_endpoint_transfersize (struct usb_device_instance *device, int port, int configuration, int interface, int alternate, int index)
    281 {
    282 	struct usb_alternate_instance *alternate_instance;
    283 
    284 	if (!(alternate_instance = usbd_device_alternate_instance (device, port, configuration, interface, alternate))) {
    285 		return 0;
    286 	}
    287 	if (index >= alternate_instance->endpoints) {
    288 		return 0;
    289 	}
    290 	return *(alternate_instance->endpoint_transfersize_array + index);
    291 }
    292 
    293 
    294 /**
    295  * usbd_device_endpoint_descriptor
    296  * @device: which device
    297  * @port: which port
    298  * @configuration: index to configuration, 0 - N-1
    299  * @interface: index to interface
    300  * @alternate: alternate setting
    301  * @endpoint: which endpoint
    302  *
    303  * Return the specified endpoint descriptor for the specified device.
    304  */
    305 struct usb_endpoint_descriptor *usbd_device_endpoint_descriptor (struct usb_device_instance *device, int port, int configuration, int interface, int alternate, int endpoint)
    306 {
    307 	struct usb_endpoint_descriptor *endpoint_descriptor;
    308 	int i;
    309 
    310 	for (i = 0; !(endpoint_descriptor = usbd_device_endpoint_descriptor_index (device, port, configuration, interface, alternate, i)); i++) {
    311 		if (endpoint_descriptor->bEndpointAddress == endpoint) {
    312 			return endpoint_descriptor;
    313 		}
    314 	}
    315 	return NULL;
    316 }
    317 
    318 /**
    319  * usbd_endpoint_halted
    320  * @device: point to struct usb_device_instance
    321  * @endpoint: endpoint to check
    322  *
    323  * Return non-zero if endpoint is halted.
    324  */
    325 int usbd_endpoint_halted (struct usb_device_instance *device, int endpoint)
    326 {
    327 	return (device->status == USB_STATUS_HALT);
    328 }
    329 
    330 
    331 /**
    332  * usbd_rcv_complete - complete a receive
    333  * @endpoint:
    334  * @len:
    335  * @urb_bad:
    336  *
    337  * Called from rcv interrupt to complete.
    338  */
    339 void usbd_rcv_complete(struct usb_endpoint_instance *endpoint, int len, int urb_bad)
    340 {
    341 	if (endpoint) {
    342 		struct urb *rcv_urb;
    343 
    344 		/*usbdbg("len: %d urb: %p\n", len, endpoint->rcv_urb); */
    345 
    346 		/* if we had an urb then update actual_length, dispatch if neccessary */
    347 		if ((rcv_urb = endpoint->rcv_urb)) {
    348 
    349 			/*usbdbg("actual: %d buffer: %d\n", */
    350 			/*rcv_urb->actual_length, rcv_urb->buffer_length); */
    351 
    352 			/* check the urb is ok, are we adding data less than the packetsize */
    353 			if (!urb_bad && (len <= endpoint->rcv_packetSize)) {
    354 			  /*usbdbg("updating actual_length by %d\n",len); */
    355 
    356 				/* increment the received data size */
    357 				rcv_urb->actual_length += len;
    358 
    359 			} else {
    360 				usberr(" RECV_ERROR actual: %d buffer: %d urb_bad: %d\n",
    361 				       rcv_urb->actual_length, rcv_urb->buffer_length, urb_bad);
    362 
    363 				rcv_urb->actual_length = 0;
    364 				rcv_urb->status = RECV_ERROR;
    365 			}
    366 		} else {
    367 			usberr("no rcv_urb!");
    368 		}
    369 	} else {
    370 		usberr("no endpoint!");
    371 	}
    372 
    373 }
    374 
    375 /**
    376  * usbd_tx_complete - complete a transmit
    377  * @endpoint:
    378  * @resetart:
    379  *
    380  * Called from tx interrupt to complete.
    381  */
    382 void usbd_tx_complete (struct usb_endpoint_instance *endpoint)
    383 {
    384 	if (endpoint) {
    385 		struct urb *tx_urb;
    386 
    387 		/* if we have a tx_urb advance or reset, finish if complete */
    388 		if ((tx_urb = endpoint->tx_urb)) {
    389 			int sent = endpoint->last;
    390 			endpoint->sent += sent;
    391 			endpoint->last -= sent;
    392 
    393 			if( (endpoint->tx_urb->actual_length - endpoint->sent) <= 0 ) {
    394 				tx_urb->actual_length = 0;
    395 				endpoint->sent = 0;
    396 				endpoint->last = 0;
    397 
    398 				/* Remove from active, save for re-use */
    399 				urb_detach(tx_urb);
    400 				urb_append(&endpoint->done, tx_urb);
    401 				/*usbdbg("done->next %p, tx_urb %p, done %p", */
    402 				/*	 endpoint->done.next, tx_urb, &endpoint->done); */
    403 
    404 				endpoint->tx_urb = first_urb_detached(&endpoint->tx);
    405 				if( endpoint->tx_urb ) {
    406 					endpoint->tx_queue--;
    407 					usbdbg("got urb from tx list");
    408 				}
    409 				if( !endpoint->tx_urb ) {
    410 					/*usbdbg("taking urb from done list"); */
    411 					endpoint->tx_urb = first_urb_detached(&endpoint->done);
    412 				}
    413 				if( !endpoint->tx_urb ) {
    414 					usbdbg("allocating new urb for tx_urb");
    415 					endpoint->tx_urb = usbd_alloc_urb(tx_urb->device, endpoint);
    416 				}
    417 			}
    418 		}
    419 	}
    420 }
    421 
    422 /* URB linked list functions ***************************************************** */
    423 
    424 /*
    425  * Initialize an urb_link to be a single element list.
    426  * If the urb_link is being used as a distinguished list head
    427  * the list is empty when the head is the only link in the list.
    428  */
    429 void urb_link_init (urb_link * ul)
    430 {
    431 	if (ul) {
    432 		ul->prev = ul->next = ul;
    433 	}
    434 }
    435 
    436 /*
    437  * Detach an urb_link from a list, and set it
    438  * up as a single element list, so no dangling
    439  * pointers can be followed, and so it can be
    440  * joined to another list if so desired.
    441  */
    442 void urb_detach (struct urb *urb)
    443 {
    444 	if (urb) {
    445 		urb_link *ul = &urb->link;
    446 		ul->next->prev = ul->prev;
    447 		ul->prev->next = ul->next;
    448 		urb_link_init (ul);
    449 	}
    450 }
    451 
    452 /*
    453  * Return the first urb_link in a list with a distinguished
    454  * head "hd", or NULL if the list is empty.  This will also
    455  * work as a predicate, returning NULL if empty, and non-NULL
    456  * otherwise.
    457  */
    458 urb_link *first_urb_link (urb_link * hd)
    459 {
    460 	urb_link *nx;
    461 	if (NULL != hd && NULL != (nx = hd->next) && nx != hd) {
    462 		/* There is at least one element in the list */
    463 		/* (besides the distinguished head). */
    464 		return (nx);
    465 	}
    466 	/* The list is empty */
    467 	return (NULL);
    468 }
    469 
    470 /*
    471  * Return the first urb in a list with a distinguished
    472  * head "hd", or NULL if the list is empty.
    473  */
    474 struct urb *first_urb (urb_link * hd)
    475 {
    476 	urb_link *nx;
    477 	if (NULL == (nx = first_urb_link (hd))) {
    478 		/* The list is empty */
    479 		return (NULL);
    480 	}
    481 	return (p2surround (struct urb, link, nx));
    482 }
    483 
    484 /*
    485  * Detach and return the first urb in a list with a distinguished
    486  * head "hd", or NULL if the list is empty.
    487  *
    488  */
    489 struct urb *first_urb_detached (urb_link * hd)
    490 {
    491 	struct urb *urb;
    492 	if ((urb = first_urb (hd))) {
    493 		urb_detach (urb);
    494 	}
    495 	return urb;
    496 }
    497 
    498 
    499 /*
    500  * Append an urb_link (or a whole list of
    501  * urb_links) to the tail of another list
    502  * of urb_links.
    503  */
    504 void urb_append (urb_link * hd, struct urb *urb)
    505 {
    506 	if (hd && urb) {
    507 		urb_link *new = &urb->link;
    508 
    509 		/* This allows the new urb to be a list of urbs, */
    510 		/* with new pointing at the first, but the link */
    511 		/* must be initialized. */
    512 		/* Order is important here... */
    513 		urb_link *pul = hd->prev;
    514 		new->prev->next = hd;
    515 		hd->prev = new->prev;
    516 		new->prev = pul;
    517 		pul->next = new;
    518 	}
    519 }
    520 
    521 /* URB create/destroy functions ***************************************************** */
    522 
    523 /**
    524  * usbd_alloc_urb - allocate an URB appropriate for specified endpoint
    525  * @device: device instance
    526  * @endpoint: endpoint
    527  *
    528  * Allocate an urb structure. The usb device urb structure is used to
    529  * contain all data associated with a transfer, including a setup packet for
    530  * control transfers.
    531  *
    532  * NOTE: endpoint_address MUST contain a direction flag.
    533  */
    534 struct urb *usbd_alloc_urb (struct usb_device_instance *device,
    535 			    struct usb_endpoint_instance *endpoint)
    536 {
    537 	struct urb *urb;
    538 
    539 	if (!(urb = (struct urb *) malloc (sizeof (struct urb)))) {
    540 		usberr (" F A T A L:  malloc(%zu) FAILED!!!!",
    541 			sizeof (struct urb));
    542 		return NULL;
    543 	}
    544 
    545 	/* Fill in known fields */
    546 	memset (urb, 0, sizeof (struct urb));
    547 	urb->endpoint = endpoint;
    548 	urb->device = device;
    549 	urb->buffer = (u8 *) urb->buffer_data;
    550 	urb->buffer_length = sizeof (urb->buffer_data);
    551 
    552 	urb_link_init (&urb->link);
    553 
    554 	return urb;
    555 }
    556 
    557 /**
    558  * usbd_dealloc_urb - deallocate an URB and associated buffer
    559  * @urb: pointer to an urb structure
    560  *
    561  * Deallocate an urb structure and associated data.
    562  */
    563 void usbd_dealloc_urb (struct urb *urb)
    564 {
    565 	if (urb) {
    566 		free (urb);
    567 	}
    568 }
    569 
    570 /* Event signaling functions ***************************************************** */
    571 
    572 /**
    573  * usbd_device_event - called to respond to various usb events
    574  * @device: pointer to struct device
    575  * @event: event to respond to
    576  *
    577  * Used by a Bus driver to indicate an event.
    578  */
    579 void usbd_device_event_irq (struct usb_device_instance *device, usb_device_event_t event, int data)
    580 {
    581 	usb_device_state_t state;
    582 
    583 	if (!device || !device->bus) {
    584 		usberr("(%p,%d) NULL device or device->bus", device, event);
    585 		return;
    586 	}
    587 
    588 	state = device->device_state;
    589 
    590 	usbinfo("%s", usbd_device_events[event]);
    591 
    592 	switch (event) {
    593 	case DEVICE_UNKNOWN:
    594 		break;
    595 	case DEVICE_INIT:
    596 		device->device_state = STATE_INIT;
    597 		break;
    598 
    599 	case DEVICE_CREATE:
    600 		device->device_state = STATE_ATTACHED;
    601 		break;
    602 
    603 	case DEVICE_HUB_CONFIGURED:
    604 		device->device_state = STATE_POWERED;
    605 		break;
    606 
    607 	case DEVICE_RESET:
    608 		device->device_state = STATE_DEFAULT;
    609 		device->address = 0;
    610 		break;
    611 
    612 	case DEVICE_ADDRESS_ASSIGNED:
    613 		device->device_state = STATE_ADDRESSED;
    614 		break;
    615 
    616 	case DEVICE_CONFIGURED:
    617 		device->device_state = STATE_CONFIGURED;
    618 		break;
    619 
    620 	case DEVICE_DE_CONFIGURED:
    621 		device->device_state = STATE_ADDRESSED;
    622 		break;
    623 
    624 	case DEVICE_BUS_INACTIVE:
    625 		if (device->status != USBD_CLOSING) {
    626 			device->status = USBD_SUSPENDED;
    627 		}
    628 		break;
    629 	case DEVICE_BUS_ACTIVITY:
    630 		if (device->status != USBD_CLOSING) {
    631 			device->status = USBD_OK;
    632 		}
    633 		break;
    634 
    635 	case DEVICE_SET_INTERFACE:
    636 		break;
    637 	case DEVICE_SET_FEATURE:
    638 		break;
    639 	case DEVICE_CLEAR_FEATURE:
    640 		break;
    641 
    642 	case DEVICE_POWER_INTERRUPTION:
    643 		device->device_state = STATE_POWERED;
    644 		break;
    645 	case DEVICE_HUB_RESET:
    646 		device->device_state = STATE_ATTACHED;
    647 		break;
    648 	case DEVICE_DESTROY:
    649 		device->device_state = STATE_UNKNOWN;
    650 		break;
    651 
    652 	case DEVICE_FUNCTION_PRIVATE:
    653 		break;
    654 
    655 	default:
    656 		usbdbg("event %d - not handled",event);
    657 		break;
    658 	}
    659 	debug("%s event: %d oldstate: %d newstate: %d status: %d address: %d",
    660 		device->name, event, state,
    661 		device->device_state, device->status, device->address);
    662 
    663 	/* tell the bus interface driver */
    664 	if( device->event ) {
    665 		/* usbdbg("calling device->event"); */
    666 		device->event(device, event, data);
    667 	}
    668 }
    669