uboot/drivers/usb/usbdcore.c
<<
>>
Prefs
   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
  38int maxstrings = 20;
  39
  40/* Global variables ************************************************************************** */
  41
  42struct usb_string_descriptor **usb_strings;
  43
  44int usb_devices;
  45
  46extern struct usb_function_driver ep0_driver;
  47
  48int registered_functions;
  49int registered_devices;
  50
  51char *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
  71char *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
  82char *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
  98char *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
 110char *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 */
 127struct 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 */
 146static struct usb_configuration_instance *usbd_device_configuration_instance (struct usb_device_instance *device,
 147                unsigned int port, unsigned int configuration)
 148{
 149        if (configuration >= device->configurations)
 150                return NULL;
 151
 152        return device->configuration_instance_array + configuration;
 153}
 154
 155
 156/* *
 157 * usbd_device_interface_instance
 158 * @device:
 159 * @configuration: index to configuration, 0 - N-1
 160 * @interface: index to interface
 161 *
 162 * Return the specified interface descriptor for the specified device.
 163 */
 164struct usb_interface_instance *usbd_device_interface_instance (struct usb_device_instance *device, int port, int configuration, int interface)
 165{
 166        struct usb_configuration_instance *configuration_instance;
 167
 168        if ((configuration_instance = usbd_device_configuration_instance (device, port, configuration)) == NULL) {
 169                return NULL;
 170        }
 171        if (interface >= configuration_instance->interfaces) {
 172                return NULL;
 173        }
 174        return configuration_instance->interface_instance_array + interface;
 175}
 176
 177/* *
 178 * usbd_device_alternate_descriptor_list
 179 * @device:
 180 * @configuration: index to configuration, 0 - N-1
 181 * @interface: index to interface
 182 * @alternate: alternate setting
 183 *
 184 * Return the specified alternate descriptor for the specified device.
 185 */
 186struct usb_alternate_instance *usbd_device_alternate_instance (struct usb_device_instance *device, int port, int configuration, int interface, int alternate)
 187{
 188        struct usb_interface_instance *interface_instance;
 189
 190        if ((interface_instance = usbd_device_interface_instance (device, port, configuration, interface)) == NULL) {
 191                return NULL;
 192        }
 193
 194        if (alternate >= interface_instance->alternates) {
 195                return NULL;
 196        }
 197
 198        return interface_instance->alternates_instance_array + alternate;
 199}
 200
 201
 202/* *
 203 * usbd_device_device_descriptor
 204 * @device: which device
 205 * @configuration: index to configuration, 0 - N-1
 206 * @port: which port
 207 *
 208 * Return the specified configuration descriptor for the specified device.
 209 */
 210struct usb_device_descriptor *usbd_device_device_descriptor (struct usb_device_instance *device, int port)
 211{
 212        return (device->device_descriptor);
 213}
 214
 215
 216/**
 217 * usbd_device_configuration_descriptor
 218 * @device: which device
 219 * @port: which port
 220 * @configuration: index to configuration, 0 - N-1
 221 *
 222 * Return the specified configuration descriptor for the specified device.
 223 */
 224struct usb_configuration_descriptor *usbd_device_configuration_descriptor (struct
 225                                                                           usb_device_instance
 226                                                                           *device, int port, int configuration)
 227{
 228        struct usb_configuration_instance *configuration_instance;
 229        if (!(configuration_instance = usbd_device_configuration_instance (device, port, configuration))) {
 230                return NULL;
 231        }
 232        return (configuration_instance->configuration_descriptor);
 233}
 234
 235
 236/**
 237 * usbd_device_interface_descriptor
 238 * @device: which device
 239 * @port: which port
 240 * @configuration: index to configuration, 0 - N-1
 241 * @interface: index to interface
 242 * @alternate: alternate setting
 243 *
 244 * Return the specified interface descriptor for the specified device.
 245 */
 246struct usb_interface_descriptor *usbd_device_interface_descriptor (struct usb_device_instance
 247                                                                   *device, int port, int configuration, int interface, int alternate)
 248{
 249        struct usb_interface_instance *interface_instance;
 250        if (!(interface_instance = usbd_device_interface_instance (device, port, configuration, interface))) {
 251                return NULL;
 252        }
 253        if ((alternate < 0) || (alternate >= interface_instance->alternates)) {
 254                return NULL;
 255        }
 256        return (interface_instance->alternates_instance_array[alternate].interface_descriptor);
 257}
 258
 259/**
 260 * usbd_device_endpoint_descriptor_index
 261 * @device: which device
 262 * @port: which port
 263 * @configuration: index to configuration, 0 - N-1
 264 * @interface: index to interface
 265 * @alternate: index setting
 266 * @index: which index
 267 *
 268 * Return the specified endpoint descriptor for the specified device.
 269 */
 270struct usb_endpoint_descriptor *usbd_device_endpoint_descriptor_index (struct usb_device_instance
 271                                                                       *device, int port, int configuration, int interface, int alternate, int index)
 272{
 273        struct usb_alternate_instance *alternate_instance;
 274
 275        if (!(alternate_instance = usbd_device_alternate_instance (device, port, configuration, interface, alternate))) {
 276                return NULL;
 277        }
 278        if (index >= alternate_instance->endpoints) {
 279                return NULL;
 280        }
 281        return *(alternate_instance->endpoints_descriptor_array + index);
 282}
 283
 284
 285/**
 286 * usbd_device_endpoint_transfersize
 287 * @device: which device
 288 * @port: which port
 289 * @configuration: index to configuration, 0 - N-1
 290 * @interface: index to interface
 291 * @index: which index
 292 *
 293 * Return the specified endpoint transfer size;
 294 */
 295int usbd_device_endpoint_transfersize (struct usb_device_instance *device, int port, int configuration, int interface, int alternate, int index)
 296{
 297        struct usb_alternate_instance *alternate_instance;
 298
 299        if (!(alternate_instance = usbd_device_alternate_instance (device, port, configuration, interface, alternate))) {
 300                return 0;
 301        }
 302        if (index >= alternate_instance->endpoints) {
 303                return 0;
 304        }
 305        return *(alternate_instance->endpoint_transfersize_array + index);
 306}
 307
 308
 309/**
 310 * usbd_device_endpoint_descriptor
 311 * @device: which device
 312 * @port: which port
 313 * @configuration: index to configuration, 0 - N-1
 314 * @interface: index to interface
 315 * @alternate: alternate setting
 316 * @endpoint: which endpoint
 317 *
 318 * Return the specified endpoint descriptor for the specified device.
 319 */
 320struct usb_endpoint_descriptor *usbd_device_endpoint_descriptor (struct usb_device_instance *device, int port, int configuration, int interface, int alternate, int endpoint)
 321{
 322        struct usb_endpoint_descriptor *endpoint_descriptor;
 323        int i;
 324
 325        for (i = 0; !(endpoint_descriptor = usbd_device_endpoint_descriptor_index (device, port, configuration, interface, alternate, i)); i++) {
 326                if (endpoint_descriptor->bEndpointAddress == endpoint) {
 327                        return endpoint_descriptor;
 328                }
 329        }
 330        return NULL;
 331}
 332
 333/**
 334 * usbd_endpoint_halted
 335 * @device: point to struct usb_device_instance
 336 * @endpoint: endpoint to check
 337 *
 338 * Return non-zero if endpoint is halted.
 339 */
 340int usbd_endpoint_halted (struct usb_device_instance *device, int endpoint)
 341{
 342        return (device->status == USB_STATUS_HALT);
 343}
 344
 345
 346/**
 347 * usbd_rcv_complete - complete a receive
 348 * @endpoint:
 349 * @len:
 350 * @urb_bad:
 351 *
 352 * Called from rcv interrupt to complete.
 353 */
 354void usbd_rcv_complete(struct usb_endpoint_instance *endpoint, int len, int urb_bad)
 355{
 356        if (endpoint) {
 357                struct urb *rcv_urb;
 358
 359                /*usbdbg("len: %d urb: %p\n", len, endpoint->rcv_urb); */
 360
 361                /* if we had an urb then update actual_length, dispatch if neccessary */
 362                if ((rcv_urb = endpoint->rcv_urb)) {
 363
 364                        /*usbdbg("actual: %d buffer: %d\n", */
 365                        /*rcv_urb->actual_length, rcv_urb->buffer_length); */
 366
 367                        /* check the urb is ok, are we adding data less than the packetsize */
 368                        if (!urb_bad && (len <= endpoint->rcv_packetSize)) {
 369                          /*usbdbg("updating actual_length by %d\n",len); */
 370
 371                                /* increment the received data size */
 372                                rcv_urb->actual_length += len;
 373
 374                        } else {
 375                                usberr(" RECV_ERROR actual: %d buffer: %d urb_bad: %d\n",
 376                                       rcv_urb->actual_length, rcv_urb->buffer_length, urb_bad);
 377
 378                                rcv_urb->actual_length = 0;
 379                                rcv_urb->status = RECV_ERROR;
 380                        }
 381                } else {
 382                        usberr("no rcv_urb!");
 383                }
 384        } else {
 385                usberr("no endpoint!");
 386        }
 387
 388}
 389
 390/**
 391 * usbd_tx_complete - complete a transmit
 392 * @endpoint:
 393 * @resetart:
 394 *
 395 * Called from tx interrupt to complete.
 396 */
 397void usbd_tx_complete (struct usb_endpoint_instance *endpoint)
 398{
 399        if (endpoint) {
 400                struct urb *tx_urb;
 401
 402                /* if we have a tx_urb advance or reset, finish if complete */
 403                if ((tx_urb = endpoint->tx_urb)) {
 404                        int sent = endpoint->last;
 405                        endpoint->sent += sent;
 406                        endpoint->last -= sent;
 407
 408                        if( (endpoint->tx_urb->actual_length - endpoint->sent) <= 0 ) {
 409                                tx_urb->actual_length = 0;
 410                                endpoint->sent = 0;
 411                                endpoint->last = 0;
 412
 413                                /* Remove from active, save for re-use */
 414                                urb_detach(tx_urb);
 415                                urb_append(&endpoint->done, tx_urb);
 416                                /*usbdbg("done->next %p, tx_urb %p, done %p", */
 417                                /*       endpoint->done.next, tx_urb, &endpoint->done); */
 418
 419                                endpoint->tx_urb = first_urb_detached(&endpoint->tx);
 420                                if( endpoint->tx_urb ) {
 421                                        endpoint->tx_queue--;
 422                                        usbdbg("got urb from tx list");
 423                                }
 424                                if( !endpoint->tx_urb ) {
 425                                        /*usbdbg("taking urb from done list"); */
 426                                        endpoint->tx_urb = first_urb_detached(&endpoint->done);
 427                                }
 428                                if( !endpoint->tx_urb ) {
 429                                        usbdbg("allocating new urb for tx_urb");
 430                                        endpoint->tx_urb = usbd_alloc_urb(tx_urb->device, endpoint);
 431                                }
 432                        }
 433                }
 434        }
 435}
 436
 437/* URB linked list functions ***************************************************** */
 438
 439/*
 440 * Initialize an urb_link to be a single element list.
 441 * If the urb_link is being used as a distinguished list head
 442 * the list is empty when the head is the only link in the list.
 443 */
 444void urb_link_init (urb_link * ul)
 445{
 446        if (ul) {
 447                ul->prev = ul->next = ul;
 448        }
 449}
 450
 451/*
 452 * Detach an urb_link from a list, and set it
 453 * up as a single element list, so no dangling
 454 * pointers can be followed, and so it can be
 455 * joined to another list if so desired.
 456 */
 457void urb_detach (struct urb *urb)
 458{
 459        if (urb) {
 460                urb_link *ul = &urb->link;
 461                ul->next->prev = ul->prev;
 462                ul->prev->next = ul->next;
 463                urb_link_init (ul);
 464        }
 465}
 466
 467/*
 468 * Return the first urb_link in a list with a distinguished
 469 * head "hd", or NULL if the list is empty.  This will also
 470 * work as a predicate, returning NULL if empty, and non-NULL
 471 * otherwise.
 472 */
 473urb_link *first_urb_link (urb_link * hd)
 474{
 475        urb_link *nx;
 476        if (NULL != hd && NULL != (nx = hd->next) && nx != hd) {
 477                /* There is at least one element in the list */
 478                /* (besides the distinguished head). */
 479                return (nx);
 480        }
 481        /* The list is empty */
 482        return (NULL);
 483}
 484
 485/*
 486 * Return the first urb in a list with a distinguished
 487 * head "hd", or NULL if the list is empty.
 488 */
 489struct urb *first_urb (urb_link * hd)
 490{
 491        urb_link *nx;
 492        if (NULL == (nx = first_urb_link (hd))) {
 493                /* The list is empty */
 494                return (NULL);
 495        }
 496        return (p2surround (struct urb, link, nx));
 497}
 498
 499/*
 500 * Detach and return the first urb in a list with a distinguished
 501 * head "hd", or NULL if the list is empty.
 502 *
 503 */
 504struct urb *first_urb_detached (urb_link * hd)
 505{
 506        struct urb *urb;
 507        if ((urb = first_urb (hd))) {
 508                urb_detach (urb);
 509        }
 510        return urb;
 511}
 512
 513
 514/*
 515 * Append an urb_link (or a whole list of
 516 * urb_links) to the tail of another list
 517 * of urb_links.
 518 */
 519void urb_append (urb_link * hd, struct urb *urb)
 520{
 521        if (hd && urb) {
 522                urb_link *new = &urb->link;
 523
 524                /* This allows the new urb to be a list of urbs, */
 525                /* with new pointing at the first, but the link */
 526                /* must be initialized. */
 527                /* Order is important here... */
 528                urb_link *pul = hd->prev;
 529                new->prev->next = hd;
 530                hd->prev = new->prev;
 531                new->prev = pul;
 532                pul->next = new;
 533        }
 534}
 535
 536/* URB create/destroy functions ***************************************************** */
 537
 538/**
 539 * usbd_alloc_urb - allocate an URB appropriate for specified endpoint
 540 * @device: device instance
 541 * @endpoint: endpoint
 542 *
 543 * Allocate an urb structure. The usb device urb structure is used to
 544 * contain all data associated with a transfer, including a setup packet for
 545 * control transfers.
 546 *
 547 * NOTE: endpoint_address MUST contain a direction flag.
 548 */
 549struct urb *usbd_alloc_urb (struct usb_device_instance *device,
 550                            struct usb_endpoint_instance *endpoint)
 551{
 552        struct urb *urb;
 553
 554        if (!(urb = (struct urb *) malloc (sizeof (struct urb)))) {
 555                usberr (" F A T A L:  malloc(%zu) FAILED!!!!",
 556                        sizeof (struct urb));
 557                return NULL;
 558        }
 559
 560        /* Fill in known fields */
 561        memset (urb, 0, sizeof (struct urb));
 562        urb->endpoint = endpoint;
 563        urb->device = device;
 564        urb->buffer = (u8 *) urb->buffer_data;
 565        urb->buffer_length = sizeof (urb->buffer_data);
 566
 567        urb_link_init (&urb->link);
 568
 569        return urb;
 570}
 571
 572/**
 573 * usbd_dealloc_urb - deallocate an URB and associated buffer
 574 * @urb: pointer to an urb structure
 575 *
 576 * Deallocate an urb structure and associated data.
 577 */
 578void usbd_dealloc_urb (struct urb *urb)
 579{
 580        if (urb) {
 581                free (urb);
 582        }
 583}
 584
 585/* Event signaling functions ***************************************************** */
 586
 587/**
 588 * usbd_device_event - called to respond to various usb events
 589 * @device: pointer to struct device
 590 * @event: event to respond to
 591 *
 592 * Used by a Bus driver to indicate an event.
 593 */
 594void usbd_device_event_irq (struct usb_device_instance *device, usb_device_event_t event, int data)
 595{
 596        usb_device_state_t state;
 597
 598        if (!device || !device->bus) {
 599                usberr("(%p,%d) NULL device or device->bus", device, event);
 600                return;
 601        }
 602
 603        state = device->device_state;
 604
 605        usbinfo("%s", usbd_device_events[event]);
 606
 607        switch (event) {
 608        case DEVICE_UNKNOWN:
 609                break;
 610        case DEVICE_INIT:
 611                device->device_state = STATE_INIT;
 612                break;
 613
 614        case DEVICE_CREATE:
 615                device->device_state = STATE_ATTACHED;
 616                break;
 617
 618        case DEVICE_HUB_CONFIGURED:
 619                device->device_state = STATE_POWERED;
 620                break;
 621
 622        case DEVICE_RESET:
 623                device->device_state = STATE_DEFAULT;
 624                device->address = 0;
 625                break;
 626
 627        case DEVICE_ADDRESS_ASSIGNED:
 628                device->device_state = STATE_ADDRESSED;
 629                break;
 630
 631        case DEVICE_CONFIGURED:
 632                device->device_state = STATE_CONFIGURED;
 633                break;
 634
 635        case DEVICE_DE_CONFIGURED:
 636                device->device_state = STATE_ADDRESSED;
 637                break;
 638
 639        case DEVICE_BUS_INACTIVE:
 640                if (device->status != USBD_CLOSING) {
 641                        device->status = USBD_SUSPENDED;
 642                }
 643                break;
 644        case DEVICE_BUS_ACTIVITY:
 645                if (device->status != USBD_CLOSING) {
 646                        device->status = USBD_OK;
 647                }
 648                break;
 649
 650        case DEVICE_SET_INTERFACE:
 651                break;
 652        case DEVICE_SET_FEATURE:
 653                break;
 654        case DEVICE_CLEAR_FEATURE:
 655                break;
 656
 657        case DEVICE_POWER_INTERRUPTION:
 658                device->device_state = STATE_POWERED;
 659                break;
 660        case DEVICE_HUB_RESET:
 661                device->device_state = STATE_ATTACHED;
 662                break;
 663        case DEVICE_DESTROY:
 664                device->device_state = STATE_UNKNOWN;
 665                break;
 666
 667        case DEVICE_FUNCTION_PRIVATE:
 668                break;
 669
 670        default:
 671                usbdbg("event %d - not handled",event);
 672                break;
 673        }
 674        /*usbdbg("%s event: %d oldstate: %d newstate: %d status: %d address: %d",
 675                device->name, event, state,
 676                device->device_state, device->status, device->address); */
 677
 678        /* tell the bus interface driver */
 679        if( device->event ) {
 680                /* usbdbg("calling device->event"); */
 681                device->event(device, event, data);
 682        }
 683}
 684