1 /* 2 * 3 * Most of this source has been derived from the Linux USB 4 * project: 5 * (C) Copyright Linus Torvalds 1999 6 * (C) Copyright Johannes Erdfelt 1999-2001 7 * (C) Copyright Andreas Gal 1999 8 * (C) Copyright Gregory P. Smith 1999 9 * (C) Copyright Deti Fliegl 1999 (new USB architecture) 10 * (C) Copyright Randy Dunlap 2000 11 * (C) Copyright David Brownell 2000 (kernel hotplug, usb_device_id) 12 * (C) Copyright Yggdrasil Computing, Inc. 2000 13 * (usb_device_id matching changes by Adam J. Richter) 14 * 15 * Adapted for U-Boot: 16 * (C) Copyright 2001 Denis Peter, MPL AG Switzerland 17 * 18 * See file CREDITS for list of people who contributed to this 19 * project. 20 * 21 * This program is free software; you can redistribute it and/or 22 * modify it under the terms of the GNU General Public License as 23 * published by the Free Software Foundation; either version 2 of 24 * the License, or (at your option) any later version. 25 * 26 * This program is distributed in the hope that it will be useful, 27 * but WITHOUT ANY WARRANTY; without even the implied warranty of 28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 29 * GNU General Public License for more details. 30 * 31 * You should have received a copy of the GNU General Public License 32 * along with this program; if not, write to the Free Software 33 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 34 * MA 02111-1307 USA 35 * 36 */ 37 38 /* 39 * How it works: 40 * 41 * Since this is a bootloader, the devices will not be automatic 42 * (re)configured on hotplug, but after a restart of the USB the 43 * device should work. 44 * 45 * For each transfer (except "Interrupt") we wait for completion. 46 */ 47 #include <common.h> 48 #include <command.h> 49 #include <asm/processor.h> 50 #include <linux/ctype.h> 51 #include <asm/byteorder.h> 52 53 #include <usb.h> 54 #ifdef CONFIG_4xx 55 #include <asm/4xx_pci.h> 56 #endif 57 58 #undef USB_DEBUG 59 60 #ifdef USB_DEBUG 61 #define USB_PRINTF(fmt,args...) printf (fmt ,##args) 62 #else 63 #define USB_PRINTF(fmt,args...) 64 #endif 65 66 #define USB_BUFSIZ 512 67 68 static struct usb_device usb_dev[USB_MAX_DEVICE]; 69 static int dev_index; 70 static int running; 71 static int asynch_allowed; 72 static struct devrequest setup_packet; 73 74 char usb_started; /* flag for the started/stopped USB status */ 75 76 /********************************************************************** 77 * some forward declerations... 78 */ 79 void usb_scan_devices(void); 80 81 int usb_hub_probe(struct usb_device *dev, int ifnum); 82 void usb_hub_reset(void); 83 84 85 /*********************************************************************** 86 * wait_ms 87 */ 88 89 void __inline__ wait_ms(unsigned long ms) 90 { 91 while(ms-->0) 92 udelay(1000); 93 } 94 /*************************************************************************** 95 * Init USB Device 96 */ 97 98 int usb_init(void) 99 { 100 int result; 101 102 running=0; 103 dev_index=0; 104 asynch_allowed=1; 105 usb_hub_reset(); 106 /* init low_level USB */ 107 printf("USB: "); 108 result = usb_lowlevel_init(); 109 /* if lowlevel init is OK, scan the bus for devices i.e. search HUBs and configure them */ 110 if(result==0) { 111 printf("scanning bus for devices... "); 112 running=1; 113 usb_scan_devices(); 114 usb_started = 1; 115 return 0; 116 } 117 else { 118 printf("Error, couldn't init Lowlevel part\n"); 119 usb_started = 0; 120 return -1; 121 } 122 } 123 124 /****************************************************************************** 125 * Stop USB this stops the LowLevel Part and deregisters USB devices. 126 */ 127 int usb_stop(void) 128 { 129 asynch_allowed=1; 130 usb_started = 0; 131 usb_hub_reset(); 132 return usb_lowlevel_stop(); 133 } 134 135 /* 136 * disables the asynch behaviour of the control message. This is used for data 137 * transfers that uses the exclusiv access to the control and bulk messages. 138 */ 139 void usb_disable_asynch(int disable) 140 { 141 asynch_allowed=!disable; 142 } 143 144 145 /*------------------------------------------------------------------- 146 * Message wrappers. 147 * 148 */ 149 150 /* 151 * submits an Interrupt Message 152 */ 153 int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe, 154 void *buffer,int transfer_len, int interval) 155 { 156 return submit_int_msg(dev,pipe,buffer,transfer_len,interval); 157 } 158 159 /* 160 * submits a control message and waits for comletion (at least timeout * 1ms) 161 * If timeout is 0, we don't wait for completion (used as example to set and 162 * clear keyboards LEDs). For data transfers, (storage transfers) we don't 163 * allow control messages with 0 timeout, by previousely resetting the flag 164 * asynch_allowed (usb_disable_asynch(1)). 165 * returns the transfered length if OK or -1 if error. The transfered length 166 * and the current status are stored in the dev->act_len and dev->status. 167 */ 168 int usb_control_msg(struct usb_device *dev, unsigned int pipe, 169 unsigned char request, unsigned char requesttype, 170 unsigned short value, unsigned short index, 171 void *data, unsigned short size, int timeout) 172 { 173 if((timeout==0)&&(!asynch_allowed)) /* request for a asynch control pipe is not allowed */ 174 return -1; 175 176 /* set setup command */ 177 setup_packet.requesttype = requesttype; 178 setup_packet.request = request; 179 setup_packet.value = cpu_to_le16(value); 180 setup_packet.index = cpu_to_le16(index); 181 setup_packet.length = cpu_to_le16(size); 182 USB_PRINTF("usb_control_msg: request: 0x%X, requesttype: 0x%X, value 0x%X index 0x%X length 0x%X\n", 183 request,requesttype,value,index,size); 184 dev->status=USB_ST_NOT_PROC; /*not yet processed */ 185 186 submit_control_msg(dev,pipe,data,size,&setup_packet); 187 if(timeout==0) { 188 return (int)size; 189 } 190 while(timeout--) { 191 if(!((volatile unsigned long)dev->status & USB_ST_NOT_PROC)) 192 break; 193 wait_ms(1); 194 } 195 if(dev->status==0) 196 return dev->act_len; 197 else { 198 return -1; 199 } 200 } 201 202 /*------------------------------------------------------------------- 203 * submits bulk message, and waits for completion. returns 0 if Ok or 204 * -1 if Error. 205 * synchronous behavior 206 */ 207 int usb_bulk_msg(struct usb_device *dev, unsigned int pipe, 208 void *data, int len, int *actual_length, int timeout) 209 { 210 if (len < 0) 211 return -1; 212 dev->status=USB_ST_NOT_PROC; /*not yet processed */ 213 submit_bulk_msg(dev,pipe,data,len); 214 while(timeout--) { 215 if(!((volatile unsigned long)dev->status & USB_ST_NOT_PROC)) 216 break; 217 wait_ms(1); 218 } 219 *actual_length=dev->act_len; 220 if(dev->status==0) 221 return 0; 222 else 223 return -1; 224 } 225 226 227 /*------------------------------------------------------------------- 228 * Max Packet stuff 229 */ 230 231 /* 232 * returns the max packet size, depending on the pipe direction and 233 * the configurations values 234 */ 235 int usb_maxpacket(struct usb_device *dev,unsigned long pipe) 236 { 237 if((pipe & USB_DIR_IN)==0) /* direction is out -> use emaxpacket out */ 238 return(dev->epmaxpacketout[((pipe>>15) & 0xf)]); 239 else 240 return(dev->epmaxpacketin[((pipe>>15) & 0xf)]); 241 } 242 243 /* 244 * set the max packed value of all endpoints in the given configuration 245 */ 246 int usb_set_maxpacket(struct usb_device *dev) 247 { 248 int i,ii,b; 249 struct usb_endpoint_descriptor *ep; 250 251 for(i=0; i<dev->config.bNumInterfaces;i++) { 252 for(ii=0; ii<dev->config.if_desc[i].bNumEndpoints; ii++) { 253 ep = &dev->config.if_desc[i].ep_desc[ii]; 254 b=ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; 255 256 if((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)==USB_ENDPOINT_XFER_CONTROL) { /* Control => bidirectional */ 257 dev->epmaxpacketout[b] = ep->wMaxPacketSize; 258 dev->epmaxpacketin [b] = ep->wMaxPacketSize; 259 USB_PRINTF("##Control EP epmaxpacketout/in[%d] = %d\n",b,dev->epmaxpacketin[b]); 260 } 261 else { 262 if ((ep->bEndpointAddress & 0x80)==0) { /* OUT Endpoint */ 263 if(ep->wMaxPacketSize > dev->epmaxpacketout[b]) { 264 dev->epmaxpacketout[b] = ep->wMaxPacketSize; 265 USB_PRINTF("##EP epmaxpacketout[%d] = %d\n",b,dev->epmaxpacketout[b]); 266 } 267 } 268 else { /* IN Endpoint */ 269 if(ep->wMaxPacketSize > dev->epmaxpacketin[b]) { 270 dev->epmaxpacketin[b] = ep->wMaxPacketSize; 271 USB_PRINTF("##EP epmaxpacketin[%d] = %d\n",b,dev->epmaxpacketin[b]); 272 } 273 } /* if out */ 274 } /* if control */ 275 } /* for each endpoint */ 276 } 277 return 0; 278 } 279 280 /******************************************************************************* 281 * Parse the config, located in buffer, and fills the dev->config structure. 282 * Note that all little/big endian swapping are done automatically. 283 */ 284 int usb_parse_config(struct usb_device *dev, unsigned char *buffer, int cfgno) 285 { 286 struct usb_descriptor_header *head; 287 int index, ifno, epno, curr_if_num; 288 int i; 289 unsigned char *ch; 290 291 ifno = -1; 292 epno = -1; 293 curr_if_num = -1; 294 295 dev->configno = cfgno; 296 head = (struct usb_descriptor_header *) &buffer[0]; 297 if(head->bDescriptorType != USB_DT_CONFIG) { 298 printf(" ERROR: NOT USB_CONFIG_DESC %x\n", head->bDescriptorType); 299 return -1; 300 } 301 memcpy(&dev->config, buffer, buffer[0]); 302 le16_to_cpus(&(dev->config.wTotalLength)); 303 dev->config.no_of_if = 0; 304 305 index = dev->config.bLength; 306 /* Ok the first entry must be a configuration entry, now process the others */ 307 head = (struct usb_descriptor_header *) &buffer[index]; 308 while(index + 1 < dev->config.wTotalLength) { 309 switch(head->bDescriptorType) { 310 case USB_DT_INTERFACE: 311 if(((struct usb_interface_descriptor *) &buffer[index])-> 312 bInterfaceNumber != curr_if_num) { 313 /* this is a new interface, copy new desc */ 314 ifno = dev->config.no_of_if; 315 dev->config.no_of_if++; 316 memcpy(&dev->config.if_desc[ifno], 317 &buffer[index], buffer[index]); 318 dev->config.if_desc[ifno].no_of_ep = 0; 319 dev->config.if_desc[ifno].num_altsetting = 1; 320 curr_if_num = dev->config.if_desc[ifno].bInterfaceNumber; 321 } else { 322 /* found alternate setting for the interface */ 323 dev->config.if_desc[ifno].num_altsetting++; 324 } 325 break; 326 case USB_DT_ENDPOINT: 327 epno = dev->config.if_desc[ifno].no_of_ep; 328 dev->config.if_desc[ifno].no_of_ep++; /* found an endpoint */ 329 memcpy(&dev->config.if_desc[ifno].ep_desc[epno], 330 &buffer[index], buffer[index]); 331 le16_to_cpus(&(dev->config.if_desc[ifno].ep_desc[epno].wMaxPacketSize)); 332 USB_PRINTF("if %d, ep %d\n", ifno, epno); 333 break; 334 default: 335 if(head->bLength == 0) 336 return 1; 337 USB_PRINTF("unknown Description Type : %x\n", head->bDescriptorType); 338 { 339 ch = (unsigned char *)head; 340 for(i = 0; i < head->bLength; i++) 341 USB_PRINTF("%02X ", *ch++); 342 USB_PRINTF("\n\n\n"); 343 } 344 break; 345 } 346 index += head->bLength; 347 head = (struct usb_descriptor_header *)&buffer[index]; 348 } 349 return 1; 350 } 351 352 /*********************************************************************** 353 * Clears an endpoint 354 * endp: endpoint number in bits 0-3; 355 * direction flag in bit 7 (1 = IN, 0 = OUT) 356 */ 357 int usb_clear_halt(struct usb_device *dev, int pipe) 358 { 359 int result; 360 int endp = usb_pipeendpoint(pipe)|(usb_pipein(pipe)<<7); 361 362 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 363 USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0, endp, NULL, 0, USB_CNTL_TIMEOUT * 3); 364 365 /* don't clear if failed */ 366 if (result < 0) 367 return result; 368 369 /* 370 * NOTE: we do not get status and verify reset was successful 371 * as some devices are reported to lock up upon this check.. 372 */ 373 374 usb_endpoint_running(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe)); 375 376 /* toggle is reset on clear */ 377 usb_settoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe), 0); 378 return 0; 379 } 380 381 382 /********************************************************************** 383 * get_descriptor type 384 */ 385 int usb_get_descriptor(struct usb_device *dev, unsigned char type, unsigned char index, void *buf, int size) 386 { 387 int res; 388 res = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 389 USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, 390 (type << 8) + index, 0, 391 buf, size, USB_CNTL_TIMEOUT); 392 return res; 393 } 394 395 /********************************************************************** 396 * gets configuration cfgno and store it in the buffer 397 */ 398 int usb_get_configuration_no(struct usb_device *dev,unsigned char *buffer,int cfgno) 399 { 400 int result; 401 unsigned int tmp; 402 struct usb_config_descriptor *config; 403 404 405 config=(struct usb_config_descriptor *)&buffer[0]; 406 result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, 8); 407 if (result < 8) { 408 if (result < 0) 409 printf("unable to get descriptor, error %lX\n",dev->status); 410 else 411 printf("config descriptor too short (expected %i, got %i)\n",8,result); 412 return -1; 413 } 414 tmp = le16_to_cpu(config->wTotalLength); 415 416 if (tmp > USB_BUFSIZ) { 417 USB_PRINTF("usb_get_configuration_no: failed to get descriptor - too long: %d\n", 418 tmp); 419 return -1; 420 } 421 422 result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, tmp); 423 USB_PRINTF("get_conf_no %d Result %d, wLength %d\n",cfgno,result,tmp); 424 return result; 425 } 426 427 /******************************************************************** 428 * set address of a device to the value in dev->devnum. 429 * This can only be done by addressing the device via the default address (0) 430 */ 431 int usb_set_address(struct usb_device *dev) 432 { 433 int res; 434 435 USB_PRINTF("set address %d\n",dev->devnum); 436 res=usb_control_msg(dev, usb_snddefctrl(dev), 437 USB_REQ_SET_ADDRESS, 0, 438 (dev->devnum),0, 439 NULL,0, USB_CNTL_TIMEOUT); 440 return res; 441 } 442 443 /******************************************************************** 444 * set interface number to interface 445 */ 446 int usb_set_interface(struct usb_device *dev, int interface, int alternate) 447 { 448 struct usb_interface_descriptor *if_face = NULL; 449 int ret, i; 450 451 for (i = 0; i < dev->config.bNumInterfaces; i++) { 452 if (dev->config.if_desc[i].bInterfaceNumber == interface) { 453 if_face = &dev->config.if_desc[i]; 454 break; 455 } 456 } 457 if (!if_face) { 458 printf("selecting invalid interface %d", interface); 459 return -1; 460 } 461 /* 462 * We should return now for devices with only one alternate setting. 463 * According to 9.4.10 of the Universal Serial Bus Specification Revision 2.0 464 * such devices can return with a STALL. This results in some USB sticks 465 * timeouting during initialization and then being unusable in U-Boot. 466 */ 467 if (if_face->num_altsetting == 1) 468 return 0; 469 470 if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 471 USB_REQ_SET_INTERFACE, USB_RECIP_INTERFACE, alternate, 472 interface, NULL, 0, USB_CNTL_TIMEOUT * 5)) < 0) 473 return ret; 474 475 return 0; 476 } 477 478 /******************************************************************** 479 * set configuration number to configuration 480 */ 481 int usb_set_configuration(struct usb_device *dev, int configuration) 482 { 483 int res; 484 USB_PRINTF("set configuration %d\n",configuration); 485 /* set setup command */ 486 res=usb_control_msg(dev, usb_sndctrlpipe(dev,0), 487 USB_REQ_SET_CONFIGURATION, 0, 488 configuration,0, 489 NULL,0, USB_CNTL_TIMEOUT); 490 if(res==0) { 491 dev->toggle[0] = 0; 492 dev->toggle[1] = 0; 493 return 0; 494 } 495 else 496 return -1; 497 } 498 499 /******************************************************************** 500 * set protocol to protocol 501 */ 502 int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol) 503 { 504 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 505 USB_REQ_SET_PROTOCOL, USB_TYPE_CLASS | USB_RECIP_INTERFACE, 506 protocol, ifnum, NULL, 0, USB_CNTL_TIMEOUT); 507 } 508 509 /******************************************************************** 510 * set idle 511 */ 512 int usb_set_idle(struct usb_device *dev, int ifnum, int duration, int report_id) 513 { 514 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 515 USB_REQ_SET_IDLE, USB_TYPE_CLASS | USB_RECIP_INTERFACE, 516 (duration << 8) | report_id, ifnum, NULL, 0, USB_CNTL_TIMEOUT); 517 } 518 519 /******************************************************************** 520 * get report 521 */ 522 int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type, unsigned char id, void *buf, int size) 523 { 524 return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 525 USB_REQ_GET_REPORT, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 526 (type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT); 527 } 528 529 /******************************************************************** 530 * get class descriptor 531 */ 532 int usb_get_class_descriptor(struct usb_device *dev, int ifnum, 533 unsigned char type, unsigned char id, void *buf, int size) 534 { 535 return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 536 USB_REQ_GET_DESCRIPTOR, USB_RECIP_INTERFACE | USB_DIR_IN, 537 (type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT); 538 } 539 540 /******************************************************************** 541 * get string index in buffer 542 */ 543 int usb_get_string(struct usb_device *dev, unsigned short langid, unsigned char index, void *buf, int size) 544 { 545 int i; 546 int result; 547 548 for (i = 0; i < 3; ++i) { 549 /* some devices are flaky */ 550 result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 551 USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, 552 (USB_DT_STRING << 8) + index, langid, buf, size, 553 USB_CNTL_TIMEOUT); 554 555 if (result > 0) 556 break; 557 } 558 559 return result; 560 } 561 562 563 static void usb_try_string_workarounds(unsigned char *buf, int *length) 564 { 565 int newlength, oldlength = *length; 566 567 for (newlength = 2; newlength + 1 < oldlength; newlength += 2) 568 if (!isprint(buf[newlength]) || buf[newlength + 1]) 569 break; 570 571 if (newlength > 2) { 572 buf[0] = newlength; 573 *length = newlength; 574 } 575 } 576 577 578 static int usb_string_sub(struct usb_device *dev, unsigned int langid, 579 unsigned int index, unsigned char *buf) 580 { 581 int rc; 582 583 /* Try to read the string descriptor by asking for the maximum 584 * possible number of bytes */ 585 rc = usb_get_string(dev, langid, index, buf, 255); 586 587 /* If that failed try to read the descriptor length, then 588 * ask for just that many bytes */ 589 if (rc < 2) { 590 rc = usb_get_string(dev, langid, index, buf, 2); 591 if (rc == 2) 592 rc = usb_get_string(dev, langid, index, buf, buf[0]); 593 } 594 595 if (rc >= 2) { 596 if (!buf[0] && !buf[1]) 597 usb_try_string_workarounds(buf, &rc); 598 599 /* There might be extra junk at the end of the descriptor */ 600 if (buf[0] < rc) 601 rc = buf[0]; 602 603 rc = rc - (rc & 1); /* force a multiple of two */ 604 } 605 606 if (rc < 2) 607 rc = -1; 608 609 return rc; 610 } 611 612 613 /******************************************************************** 614 * usb_string: 615 * Get string index and translate it to ascii. 616 * returns string length (> 0) or error (< 0) 617 */ 618 int usb_string(struct usb_device *dev, int index, char *buf, size_t size) 619 { 620 unsigned char mybuf[USB_BUFSIZ]; 621 unsigned char *tbuf; 622 int err; 623 unsigned int u, idx; 624 625 if (size <= 0 || !buf || !index) 626 return -1; 627 buf[0] = 0; 628 tbuf = &mybuf[0]; 629 630 /* get langid for strings if it's not yet known */ 631 if (!dev->have_langid) { 632 err = usb_string_sub(dev, 0, 0, tbuf); 633 if (err < 0) { 634 USB_PRINTF("error getting string descriptor 0 (error=%x)\n",dev->status); 635 return -1; 636 } else if (tbuf[0] < 4) { 637 USB_PRINTF("string descriptor 0 too short\n"); 638 return -1; 639 } else { 640 dev->have_langid = -1; 641 dev->string_langid = tbuf[2] | (tbuf[3]<< 8); 642 /* always use the first langid listed */ 643 USB_PRINTF("USB device number %d default language ID 0x%x\n", 644 dev->devnum, dev->string_langid); 645 } 646 } 647 648 err = usb_string_sub(dev, dev->string_langid, index, tbuf); 649 if (err < 0) 650 return err; 651 652 size--; /* leave room for trailing NULL char in output buffer */ 653 for (idx = 0, u = 2; u < err; u += 2) { 654 if (idx >= size) 655 break; 656 if (tbuf[u+1]) /* high byte */ 657 buf[idx++] = '?'; /* non-ASCII character */ 658 else 659 buf[idx++] = tbuf[u]; 660 } 661 buf[idx] = 0; 662 err = idx; 663 return err; 664 } 665 666 667 /******************************************************************** 668 * USB device handling: 669 * the USB device are static allocated [USB_MAX_DEVICE]. 670 */ 671 672 673 /* returns a pointer to the device with the index [index]. 674 * if the device is not assigned (dev->devnum==-1) returns NULL 675 */ 676 struct usb_device * usb_get_dev_index(int index) 677 { 678 if(usb_dev[index].devnum==-1) 679 return NULL; 680 else 681 return &usb_dev[index]; 682 } 683 684 685 /* returns a pointer of a new device structure or NULL, if 686 * no device struct is available 687 */ 688 struct usb_device * usb_alloc_new_device(void) 689 { 690 int i; 691 USB_PRINTF("New Device %d\n",dev_index); 692 if(dev_index==USB_MAX_DEVICE) { 693 printf("ERROR, too many USB Devices, max=%d\n",USB_MAX_DEVICE); 694 return NULL; 695 } 696 usb_dev[dev_index].devnum=dev_index+1; /* default Address is 0, real addresses start with 1 */ 697 usb_dev[dev_index].maxchild=0; 698 for(i=0;i<USB_MAXCHILDREN;i++) 699 usb_dev[dev_index].children[i]=NULL; 700 usb_dev[dev_index].parent=NULL; 701 dev_index++; 702 return &usb_dev[dev_index-1]; 703 } 704 705 706 /* 707 * By the time we get here, the device has gotten a new device ID 708 * and is in the default state. We need to identify the thing and 709 * get the ball rolling.. 710 * 711 * Returns 0 for success, != 0 for error. 712 */ 713 int usb_new_device(struct usb_device *dev) 714 { 715 int addr, err; 716 int tmp; 717 unsigned char tmpbuf[USB_BUFSIZ]; 718 719 dev->descriptor.bMaxPacketSize0 = 8; /* Start off at 8 bytes */ 720 dev->maxpacketsize = 0; /* Default to 8 byte max packet size */ 721 dev->epmaxpacketin [0] = 8; 722 dev->epmaxpacketout[0] = 8; 723 724 /* We still haven't set the Address yet */ 725 addr = dev->devnum; 726 dev->devnum = 0; 727 728 #undef NEW_INIT_SEQ 729 #ifdef NEW_INIT_SEQ 730 /* this is a Windows scheme of initialization sequence, with double 731 * reset of the device. Some equipment is said to work only with such 732 * init sequence; this patch is based on the work by Alan Stern: 733 * http://sourceforge.net/mailarchive/forum.php?thread_id=5729457&forum_id=5398 734 */ 735 int j; 736 struct usb_device_descriptor *desc; 737 int port = -1; 738 struct usb_device *parent = dev->parent; 739 unsigned short portstatus; 740 741 /* send 64-byte GET-DEVICE-DESCRIPTOR request. Since the descriptor is 742 * only 18 bytes long, this will terminate with a short packet. But if 743 * the maxpacket size is 8 or 16 the device may be waiting to transmit 744 * some more. */ 745 746 desc = (struct usb_device_descriptor *)tmpbuf; 747 desc->bMaxPacketSize0 = 0; 748 for (j = 0; j < 3; ++j) { 749 err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64); 750 if (err < 0) { 751 USB_PRINTF("usb_new_device: 64 byte descr\n"); 752 break; 753 } 754 } 755 dev->descriptor.bMaxPacketSize0 = desc->bMaxPacketSize0; 756 757 /* find the port number we're at */ 758 if (parent) { 759 760 for (j = 0; j < parent->maxchild; j++) { 761 if (parent->children[j] == dev) { 762 port = j; 763 break; 764 } 765 } 766 if (port < 0) { 767 printf("usb_new_device: cannot locate device's port..\n"); 768 return 1; 769 } 770 771 /* reset the port for the second time */ 772 err = hub_port_reset(dev->parent, port, &portstatus); 773 if (err < 0) { 774 printf("\n Couldn't reset port %i\n", port); 775 return 1; 776 } 777 } 778 #else 779 /* and this is the old and known way of initializing devices */ 780 err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, 8); 781 if (err < 8) { 782 printf("\n USB device not responding, giving up (status=%lX)\n",dev->status); 783 return 1; 784 } 785 #endif 786 787 dev->epmaxpacketin [0] = dev->descriptor.bMaxPacketSize0; 788 dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0; 789 switch (dev->descriptor.bMaxPacketSize0) { 790 case 8: dev->maxpacketsize = 0; break; 791 case 16: dev->maxpacketsize = 1; break; 792 case 32: dev->maxpacketsize = 2; break; 793 case 64: dev->maxpacketsize = 3; break; 794 } 795 dev->devnum = addr; 796 797 err = usb_set_address(dev); /* set address */ 798 799 if (err < 0) { 800 printf("\n USB device not accepting new address (error=%lX)\n", dev->status); 801 return 1; 802 } 803 804 wait_ms(10); /* Let the SET_ADDRESS settle */ 805 806 tmp = sizeof(dev->descriptor); 807 808 err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, sizeof(dev->descriptor)); 809 if (err < tmp) { 810 if (err < 0) 811 printf("unable to get device descriptor (error=%d)\n",err); 812 else 813 printf("USB device descriptor short read (expected %i, got %i)\n",tmp,err); 814 return 1; 815 } 816 /* correct le values */ 817 le16_to_cpus(&dev->descriptor.bcdUSB); 818 le16_to_cpus(&dev->descriptor.idVendor); 819 le16_to_cpus(&dev->descriptor.idProduct); 820 le16_to_cpus(&dev->descriptor.bcdDevice); 821 /* only support for one config for now */ 822 usb_get_configuration_no(dev,&tmpbuf[0],0); 823 usb_parse_config(dev,&tmpbuf[0],0); 824 usb_set_maxpacket(dev); 825 /* we set the default configuration here */ 826 if (usb_set_configuration(dev, dev->config.bConfigurationValue)) { 827 printf("failed to set default configuration len %d, status %lX\n",dev->act_len,dev->status); 828 return -1; 829 } 830 USB_PRINTF("new device strings: Mfr=%d, Product=%d, SerialNumber=%d\n", 831 dev->descriptor.iManufacturer, dev->descriptor.iProduct, dev->descriptor.iSerialNumber); 832 memset(dev->mf, 0, sizeof(dev->mf)); 833 memset(dev->prod, 0, sizeof(dev->prod)); 834 memset(dev->serial, 0, sizeof(dev->serial)); 835 if (dev->descriptor.iManufacturer) 836 usb_string(dev, dev->descriptor.iManufacturer, dev->mf, sizeof(dev->mf)); 837 if (dev->descriptor.iProduct) 838 usb_string(dev, dev->descriptor.iProduct, dev->prod, sizeof(dev->prod)); 839 if (dev->descriptor.iSerialNumber) 840 usb_string(dev, dev->descriptor.iSerialNumber, dev->serial, sizeof(dev->serial)); 841 USB_PRINTF("Manufacturer %s\n", dev->mf); 842 USB_PRINTF("Product %s\n", dev->prod); 843 USB_PRINTF("SerialNumber %s\n", dev->serial); 844 /* now prode if the device is a hub */ 845 usb_hub_probe(dev,0); 846 return 0; 847 } 848 849 /* build device Tree */ 850 void usb_scan_devices(void) 851 { 852 int i; 853 struct usb_device *dev; 854 855 /* first make all devices unknown */ 856 for(i=0;i<USB_MAX_DEVICE;i++) { 857 memset(&usb_dev[i],0,sizeof(struct usb_device)); 858 usb_dev[i].devnum = -1; 859 } 860 dev_index=0; 861 /* device 0 is always present (root hub, so let it analyze) */ 862 dev=usb_alloc_new_device(); 863 usb_new_device(dev); 864 printf("%d USB Device(s) found\n",dev_index); 865 /* insert "driver" if possible */ 866 #ifdef CONFIG_USB_KEYBOARD 867 drv_usb_kbd_init(); 868 USB_PRINTF("scan end\n"); 869 #endif 870 } 871 872 873 /**************************************************************************** 874 * HUB "Driver" 875 * Probes device for being a hub and configurate it 876 */ 877 878 #undef USB_HUB_DEBUG 879 880 #ifdef USB_HUB_DEBUG 881 #define USB_HUB_PRINTF(fmt,args...) printf (fmt ,##args) 882 #else 883 #define USB_HUB_PRINTF(fmt,args...) 884 #endif 885 886 887 static struct usb_hub_device hub_dev[USB_MAX_HUB]; 888 static int usb_hub_index; 889 890 891 int usb_get_hub_descriptor(struct usb_device *dev, void *data, int size) 892 { 893 return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 894 USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB, 895 USB_DT_HUB << 8, 0, data, size, USB_CNTL_TIMEOUT); 896 } 897 898 int usb_clear_hub_feature(struct usb_device *dev, int feature) 899 { 900 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 901 USB_REQ_CLEAR_FEATURE, USB_RT_HUB, feature, 0, NULL, 0, USB_CNTL_TIMEOUT); 902 } 903 904 int usb_clear_port_feature(struct usb_device *dev, int port, int feature) 905 { 906 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 907 USB_REQ_CLEAR_FEATURE, USB_RT_PORT, feature, port, NULL, 0, USB_CNTL_TIMEOUT); 908 } 909 910 int usb_set_port_feature(struct usb_device *dev, int port, int feature) 911 { 912 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 913 USB_REQ_SET_FEATURE, USB_RT_PORT, feature, port, NULL, 0, USB_CNTL_TIMEOUT); 914 } 915 916 int usb_get_hub_status(struct usb_device *dev, void *data) 917 { 918 return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 919 USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_HUB, 0, 0, 920 data, sizeof(struct usb_hub_status), USB_CNTL_TIMEOUT); 921 } 922 923 int usb_get_port_status(struct usb_device *dev, int port, void *data) 924 { 925 return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 926 USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port, 927 data, sizeof(struct usb_hub_status), USB_CNTL_TIMEOUT); 928 } 929 930 931 static void usb_hub_power_on(struct usb_hub_device *hub) 932 { 933 int i; 934 struct usb_device *dev; 935 936 dev=hub->pusb_dev; 937 /* Enable power to the ports */ 938 USB_HUB_PRINTF("enabling power on all ports\n"); 939 for (i = 0; i < dev->maxchild; i++) { 940 usb_set_port_feature(dev, i + 1, USB_PORT_FEAT_POWER); 941 USB_HUB_PRINTF("port %d returns %lX\n",i+1,dev->status); 942 wait_ms(hub->desc.bPwrOn2PwrGood * 2); 943 } 944 } 945 946 void usb_hub_reset(void) 947 { 948 usb_hub_index=0; 949 } 950 951 struct usb_hub_device *usb_hub_allocate(void) 952 { 953 if(usb_hub_index<USB_MAX_HUB) { 954 return &hub_dev[usb_hub_index++]; 955 } 956 printf("ERROR: USB_MAX_HUB (%d) reached\n",USB_MAX_HUB); 957 return NULL; 958 } 959 960 #define MAX_TRIES 5 961 962 static int hub_port_reset(struct usb_device *dev, int port, 963 unsigned short *portstat) 964 { 965 int tries; 966 struct usb_port_status portsts; 967 unsigned short portstatus, portchange; 968 969 970 USB_HUB_PRINTF("hub_port_reset: resetting port %d...\n", port); 971 for(tries=0;tries<MAX_TRIES;tries++) { 972 973 usb_set_port_feature(dev, port + 1, USB_PORT_FEAT_RESET); 974 wait_ms(200); 975 976 if (usb_get_port_status(dev, port + 1, &portsts)<0) { 977 USB_HUB_PRINTF("get_port_status failed status %lX\n",dev->status); 978 return -1; 979 } 980 portstatus = le16_to_cpu(portsts.wPortStatus); 981 portchange = le16_to_cpu(portsts.wPortChange); 982 USB_HUB_PRINTF("portstatus %x, change %x, %s\n", portstatus ,portchange, 983 portstatus&(1<<USB_PORT_FEAT_LOWSPEED) ? "Low Speed" : "High Speed"); 984 USB_HUB_PRINTF("STAT_C_CONNECTION = %d STAT_CONNECTION = %d USB_PORT_STAT_ENABLE %d\n", 985 (portchange & USB_PORT_STAT_C_CONNECTION) ? 1 : 0, 986 (portstatus & USB_PORT_STAT_CONNECTION) ? 1 : 0, 987 (portstatus & USB_PORT_STAT_ENABLE) ? 1 : 0); 988 if ((portchange & USB_PORT_STAT_C_CONNECTION) || 989 !(portstatus & USB_PORT_STAT_CONNECTION)) 990 return -1; 991 992 if (portstatus & USB_PORT_STAT_ENABLE) { 993 994 break; 995 } 996 997 wait_ms(200); 998 } 999 1000 if (tries==MAX_TRIES) { 1001 USB_HUB_PRINTF("Cannot enable port %i after %i retries, disabling port.\n", port+1, MAX_TRIES); 1002 USB_HUB_PRINTF("Maybe the USB cable is bad?\n"); 1003 return -1; 1004 } 1005 1006 usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_C_RESET); 1007 *portstat = portstatus; 1008 return 0; 1009 1010 } 1011 1012 1013 void usb_hub_port_connect_change(struct usb_device *dev, int port) 1014 { 1015 struct usb_device *usb; 1016 struct usb_port_status portsts; 1017 unsigned short portstatus, portchange; 1018 1019 /* Check status */ 1020 if (usb_get_port_status(dev, port + 1, &portsts)<0) { 1021 USB_HUB_PRINTF("get_port_status failed\n"); 1022 return; 1023 } 1024 1025 portstatus = le16_to_cpu(portsts.wPortStatus); 1026 portchange = le16_to_cpu(portsts.wPortChange); 1027 USB_HUB_PRINTF("portstatus %x, change %x, %s\n", portstatus, portchange, 1028 portstatus&(1<<USB_PORT_FEAT_LOWSPEED) ? "Low Speed" : "High Speed"); 1029 1030 /* Clear the connection change status */ 1031 usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_C_CONNECTION); 1032 1033 /* Disconnect any existing devices under this port */ 1034 if (((!(portstatus & USB_PORT_STAT_CONNECTION)) && 1035 (!(portstatus & USB_PORT_STAT_ENABLE)))|| (dev->children[port])) { 1036 USB_HUB_PRINTF("usb_disconnect(&hub->children[port]);\n"); 1037 /* Return now if nothing is connected */ 1038 if (!(portstatus & USB_PORT_STAT_CONNECTION)) 1039 return; 1040 } 1041 wait_ms(200); 1042 1043 /* Reset the port */ 1044 if (hub_port_reset(dev, port, &portstatus) < 0) { 1045 printf("cannot reset port %i!?\n", port + 1); 1046 return; 1047 } 1048 1049 wait_ms(200); 1050 1051 /* Allocate a new device struct for it */ 1052 usb=usb_alloc_new_device(); 1053 usb->slow = (portstatus & USB_PORT_STAT_LOW_SPEED) ? 1 : 0; 1054 1055 dev->children[port] = usb; 1056 usb->parent=dev; 1057 /* Run it through the hoops (find a driver, etc) */ 1058 if (usb_new_device(usb)) { 1059 /* Woops, disable the port */ 1060 USB_HUB_PRINTF("hub: disabling port %d\n", port + 1); 1061 usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_ENABLE); 1062 } 1063 } 1064 1065 1066 int usb_hub_configure(struct usb_device *dev) 1067 { 1068 unsigned char buffer[USB_BUFSIZ], *bitmap; 1069 struct usb_hub_descriptor *descriptor; 1070 struct usb_hub_status *hubsts; 1071 int i; 1072 struct usb_hub_device *hub; 1073 1074 /* "allocate" Hub device */ 1075 hub=usb_hub_allocate(); 1076 if(hub==NULL) 1077 return -1; 1078 hub->pusb_dev=dev; 1079 /* Get the the hub descriptor */ 1080 if (usb_get_hub_descriptor(dev, buffer, 4) < 0) { 1081 USB_HUB_PRINTF("usb_hub_configure: failed to get hub descriptor, giving up %lX\n",dev->status); 1082 return -1; 1083 } 1084 descriptor = (struct usb_hub_descriptor *)buffer; 1085 1086 /* silence compiler warning if USB_BUFSIZ is > 256 [= sizeof(char)] */ 1087 i = descriptor->bLength; 1088 if (i > USB_BUFSIZ) { 1089 USB_HUB_PRINTF("usb_hub_configure: failed to get hub descriptor - too long: %d\n", 1090 descriptor->bLength); 1091 return -1; 1092 } 1093 1094 if (usb_get_hub_descriptor(dev, buffer, descriptor->bLength) < 0) { 1095 USB_HUB_PRINTF("usb_hub_configure: failed to get hub descriptor 2nd giving up %lX\n",dev->status); 1096 return -1; 1097 } 1098 memcpy((unsigned char *)&hub->desc,buffer,descriptor->bLength); 1099 /* adjust 16bit values */ 1100 hub->desc.wHubCharacteristics = le16_to_cpu(descriptor->wHubCharacteristics); 1101 /* set the bitmap */ 1102 bitmap=(unsigned char *)&hub->desc.DeviceRemovable[0]; 1103 memset(bitmap,0xff,(USB_MAXCHILDREN+1+7)/8); /* devices not removable by default */ 1104 bitmap=(unsigned char *)&hub->desc.PortPowerCtrlMask[0]; 1105 memset(bitmap,0xff,(USB_MAXCHILDREN+1+7)/8); /* PowerMask = 1B */ 1106 for(i=0;i<((hub->desc.bNbrPorts + 1 + 7)/8);i++) { 1107 hub->desc.DeviceRemovable[i]=descriptor->DeviceRemovable[i]; 1108 } 1109 for(i=0;i<((hub->desc.bNbrPorts + 1 + 7)/8);i++) { 1110 hub->desc.DeviceRemovable[i]=descriptor->PortPowerCtrlMask[i]; 1111 } 1112 dev->maxchild = descriptor->bNbrPorts; 1113 USB_HUB_PRINTF("%d ports detected\n", dev->maxchild); 1114 1115 switch (hub->desc.wHubCharacteristics & HUB_CHAR_LPSM) { 1116 case 0x00: 1117 USB_HUB_PRINTF("ganged power switching\n"); 1118 break; 1119 case 0x01: 1120 USB_HUB_PRINTF("individual port power switching\n"); 1121 break; 1122 case 0x02: 1123 case 0x03: 1124 USB_HUB_PRINTF("unknown reserved power switching mode\n"); 1125 break; 1126 } 1127 1128 if (hub->desc.wHubCharacteristics & HUB_CHAR_COMPOUND) 1129 USB_HUB_PRINTF("part of a compound device\n"); 1130 else 1131 USB_HUB_PRINTF("standalone hub\n"); 1132 1133 switch (hub->desc.wHubCharacteristics & HUB_CHAR_OCPM) { 1134 case 0x00: 1135 USB_HUB_PRINTF("global over-current protection\n"); 1136 break; 1137 case 0x08: 1138 USB_HUB_PRINTF("individual port over-current protection\n"); 1139 break; 1140 case 0x10: 1141 case 0x18: 1142 USB_HUB_PRINTF("no over-current protection\n"); 1143 break; 1144 } 1145 USB_HUB_PRINTF("power on to power good time: %dms\n", descriptor->bPwrOn2PwrGood * 2); 1146 USB_HUB_PRINTF("hub controller current requirement: %dmA\n", descriptor->bHubContrCurrent); 1147 for (i = 0; i < dev->maxchild; i++) 1148 USB_HUB_PRINTF("port %d is%s removable\n", i + 1, 1149 hub->desc.DeviceRemovable[(i + 1)/8] & (1 << ((i + 1)%8)) ? " not" : ""); 1150 if (sizeof(struct usb_hub_status) > USB_BUFSIZ) { 1151 USB_HUB_PRINTF("usb_hub_configure: failed to get Status - too long: %d\n", 1152 descriptor->bLength); 1153 return -1; 1154 } 1155 1156 if (usb_get_hub_status(dev, buffer) < 0) { 1157 USB_HUB_PRINTF("usb_hub_configure: failed to get Status %lX\n",dev->status); 1158 return -1; 1159 } 1160 hubsts = (struct usb_hub_status *)buffer; 1161 USB_HUB_PRINTF("get_hub_status returned status %X, change %X\n", 1162 le16_to_cpu(hubsts->wHubStatus),le16_to_cpu(hubsts->wHubChange)); 1163 USB_HUB_PRINTF("local power source is %s\n", 1164 (le16_to_cpu(hubsts->wHubStatus) & HUB_STATUS_LOCAL_POWER) ? "lost (inactive)" : "good"); 1165 USB_HUB_PRINTF("%sover-current condition exists\n", 1166 (le16_to_cpu(hubsts->wHubStatus) & HUB_STATUS_OVERCURRENT) ? "" : "no "); 1167 usb_hub_power_on(hub); 1168 for (i = 0; i < dev->maxchild; i++) { 1169 struct usb_port_status portsts; 1170 unsigned short portstatus, portchange; 1171 1172 if (usb_get_port_status(dev, i + 1, &portsts) < 0) { 1173 USB_HUB_PRINTF("get_port_status failed\n"); 1174 continue; 1175 } 1176 portstatus = le16_to_cpu(portsts.wPortStatus); 1177 portchange = le16_to_cpu(portsts.wPortChange); 1178 USB_HUB_PRINTF("Port %d Status %X Change %X\n",i+1,portstatus,portchange); 1179 if (portchange & USB_PORT_STAT_C_CONNECTION) { 1180 USB_HUB_PRINTF("port %d connection change\n", i + 1); 1181 usb_hub_port_connect_change(dev, i); 1182 } 1183 if (portchange & USB_PORT_STAT_C_ENABLE) { 1184 USB_HUB_PRINTF("port %d enable change, status %x\n", i + 1, portstatus); 1185 usb_clear_port_feature(dev, i + 1, USB_PORT_FEAT_C_ENABLE); 1186 1187 /* EM interference sometimes causes bad shielded USB devices to 1188 * be shutdown by the hub, this hack enables them again. 1189 * Works at least with mouse driver */ 1190 if (!(portstatus & USB_PORT_STAT_ENABLE) && 1191 (portstatus & USB_PORT_STAT_CONNECTION) && (dev->children[i])) { 1192 USB_HUB_PRINTF("already running port %i disabled by hub (EMI?), re-enabling...\n", 1193 i + 1); 1194 usb_hub_port_connect_change(dev, i); 1195 } 1196 } 1197 if (portstatus & USB_PORT_STAT_SUSPEND) { 1198 USB_HUB_PRINTF("port %d suspend change\n", i + 1); 1199 usb_clear_port_feature(dev, i + 1, USB_PORT_FEAT_SUSPEND); 1200 } 1201 1202 if (portchange & USB_PORT_STAT_C_OVERCURRENT) { 1203 USB_HUB_PRINTF("port %d over-current change\n", i + 1); 1204 usb_clear_port_feature(dev, i + 1, USB_PORT_FEAT_C_OVER_CURRENT); 1205 usb_hub_power_on(hub); 1206 } 1207 1208 if (portchange & USB_PORT_STAT_C_RESET) { 1209 USB_HUB_PRINTF("port %d reset change\n", i + 1); 1210 usb_clear_port_feature(dev, i + 1, USB_PORT_FEAT_C_RESET); 1211 } 1212 } /* end for i all ports */ 1213 1214 return 0; 1215 } 1216 1217 int usb_hub_probe(struct usb_device *dev, int ifnum) 1218 { 1219 struct usb_interface_descriptor *iface; 1220 struct usb_endpoint_descriptor *ep; 1221 int ret; 1222 1223 iface = &dev->config.if_desc[ifnum]; 1224 /* Is it a hub? */ 1225 if (iface->bInterfaceClass != USB_CLASS_HUB) 1226 return 0; 1227 /* Some hubs have a subclass of 1, which AFAICT according to the */ 1228 /* specs is not defined, but it works */ 1229 if ((iface->bInterfaceSubClass != 0) && 1230 (iface->bInterfaceSubClass != 1)) 1231 return 0; 1232 /* Multiple endpoints? What kind of mutant ninja-hub is this? */ 1233 if (iface->bNumEndpoints != 1) 1234 return 0; 1235 ep = &iface->ep_desc[0]; 1236 /* Output endpoint? Curiousier and curiousier.. */ 1237 if (!(ep->bEndpointAddress & USB_DIR_IN)) 1238 return 0; 1239 /* If it's not an interrupt endpoint, we'd better punt! */ 1240 if ((ep->bmAttributes & 3) != 3) 1241 return 0; 1242 /* We found a hub */ 1243 USB_HUB_PRINTF("USB hub found\n"); 1244 ret=usb_hub_configure(dev); 1245 return ret; 1246 } 1247 1248 /* EOF */ 1249