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