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