Skip to content
Snippets Groups Projects
usb.c 29.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • Wolfgang Denk's avatar
    Wolfgang Denk committed
    		return 1;
    	}
    
    
    	mdelay(10);	/* Let the SET_ADDRESS settle */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    	tmp = sizeof(dev->descriptor);
    
    
    	err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
    
    				 tmpbuf, sizeof(dev->descriptor));
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	if (err < tmp) {
    		if (err < 0)
    
    			printf("unable to get device descriptor (error=%d)\n",
    			       err);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    		else
    
    			printf("USB device descriptor short read " \
    				"(expected %i, got %i)\n", tmp, err);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    		return 1;
    	}
    
    	memcpy(&dev->descriptor, tmpbuf, sizeof(dev->descriptor));
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	/* correct le values */
    
    	le16_to_cpus(&dev->descriptor.bcdUSB);
    	le16_to_cpus(&dev->descriptor.idVendor);
    	le16_to_cpus(&dev->descriptor.idProduct);
    	le16_to_cpus(&dev->descriptor.bcdDevice);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	/* only support for one config for now */
    
    	err = usb_get_configuration_no(dev, tmpbuf, 0);
    	if (err < 0) {
    		printf("usb_new_device: Cannot read configuration, " \
    		       "skipping device %04x:%04x\n",
    		       dev->descriptor.idVendor, dev->descriptor.idProduct);
    		return -1;
    	}
    
    	usb_parse_config(dev, tmpbuf, 0);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	usb_set_maxpacket(dev);
    	/* we set the default configuration here */
    
    	if (usb_set_configuration(dev, dev->config.desc.bConfigurationValue)) {
    
    		printf("failed to set default configuration " \
    			"len %d, status %lX\n", dev->act_len, dev->status);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    		return -1;
    	}
    
    	debug("new device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
    	      dev->descriptor.iManufacturer, dev->descriptor.iProduct,
    	      dev->descriptor.iSerialNumber);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	memset(dev->mf, 0, sizeof(dev->mf));
    	memset(dev->prod, 0, sizeof(dev->prod));
    	memset(dev->serial, 0, sizeof(dev->serial));
    	if (dev->descriptor.iManufacturer)
    
    		usb_string(dev, dev->descriptor.iManufacturer,
    			   dev->mf, sizeof(dev->mf));
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	if (dev->descriptor.iProduct)
    
    		usb_string(dev, dev->descriptor.iProduct,
    			   dev->prod, sizeof(dev->prod));
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	if (dev->descriptor.iSerialNumber)
    
    		usb_string(dev, dev->descriptor.iSerialNumber,
    			   dev->serial, sizeof(dev->serial));
    
    	debug("Manufacturer %s\n", dev->mf);
    	debug("Product      %s\n", dev->prod);
    	debug("SerialNumber %s\n", dev->serial);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	/* now prode if the device is a hub */
    
    	usb_hub_probe(dev, 0);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	return 0;
    }
    
    
    int board_usb_init(int index, enum usb_init_type init)
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    /* EOF */