Esempio n. 1
0
/*
 * Get mac address
 */
static int
lgue_getmac(struct lgue_softc *sc, void *buf)
{
	const usb_cdc_ethernet_descriptor_t *ced;
	usb_interface_descriptor_t *id;
	char sbuf[ETHER_ADDR_LEN * 2 + 1];
	usbd_status err;
	int i;

	id = usbd_get_interface_descriptor(sc->lgue_ctl_iface);
	if (id == NULL) goto bad;
	ced = (const usb_cdc_ethernet_descriptor_t *)usb_find_desc_if(sc->lgue_udev,
	    UDESC_CS_INTERFACE, UDESCSUB_CDC_ETHERNET, id);
	if (ced == NULL) goto bad;

	err = usbd_get_string(sc->lgue_udev, ced->iMACAddress, sbuf);
	if(err) {
		kprintf("Read MAC address failed\n");
		goto bad;
	}

	for (i = 0; i < ETHER_ADDR_LEN; ++i) {
		((uByte *)buf)[i] = (hex(sbuf[i * 2]) << 4) + hex(sbuf[(i * 2) + 1]);
	}
	return(0);
bad:
	return(-1);
}
Esempio n. 2
0
int
uhub_child_pnpinfo_str(device_t cbdev, device_t child, char *buf,
    size_t buflen)
{
	struct uhub_softc *sc = device_get_softc(cbdev);
	usbd_device_handle devhub = sc->sc_hub;
	usbd_device_handle dev;
	struct usbd_interface *iface;
	char serial[128];
	int nports;
	int port;
	int i;

	crit_enter();
	nports = devhub->hub->hubdesc.bNbrPorts;
	for (port = 0; port < nports; port++) {
		dev = devhub->hub->ports[port].device;
		if (dev && dev->subdevs) {
			for (i = 0; dev->subdevs[i]; i++) {
				if (dev->subdevs[i] == child) {
					goto found_dev;
				}
			}
		}
	}
	DPRINTFN(0,("uhub_child_pnpinfo_str: device not on hub\n"));
	buf[0] = '\0';
	crit_exit();
	return (0);

found_dev:
	/* XXX can sleep */
	(void)usbd_get_string(dev, dev->ddesc.iSerialNumber, &serial[0]);
	if (dev->ifacenums == NULL) {
		ksnprintf(buf, buflen, "vendor=0x%04x product=0x%04x "
		    "devclass=0x%02x devsubclass=0x%02x "
		    "release=0x%04x sernum=\"%s\"",
		    UGETW(dev->ddesc.idVendor), UGETW(dev->ddesc.idProduct),
		    dev->ddesc.bDeviceClass, dev->ddesc.bDeviceSubClass,
		    UGETW(dev->ddesc.bcdDevice), serial);
	} else {
		iface = &dev->ifaces[dev->ifacenums[i]];
		ksnprintf(buf, buflen, "vendor=0x%04x product=0x%04x "
		    "devclass=0x%02x devsubclass=0x%02x "
		    "release=0x%04x sernum=\"%s\" "
		    "intclass=0x%02x intsubclass=0x%02x",
		    UGETW(dev->ddesc.idVendor), UGETW(dev->ddesc.idProduct),
		    dev->ddesc.bDeviceClass, dev->ddesc.bDeviceSubClass,
		    UGETW(dev->ddesc.bcdDevice), serial,
		    iface->idesc->bInterfaceClass,
		    iface->idesc->bInterfaceSubClass);
	}
	crit_exit();
	return (0);
}
Esempio n. 3
0
static void
usbd_devinfo_vp(usbd_device_handle dev, char *v, char *p, int usedev)
{
	usb_device_descriptor_t *udd = &dev->ddesc;
	char *vendor = 0, *product = 0;

	if (dev == NULL) {
		v[0] = p[0] = '\0';
		return;
	}

	if (usedev) {
		if (usbd_get_string(dev, udd->iManufacturer, v))
			vendor = NULL;
		else
			vendor = v;
		usbd_trim_spaces(vendor);
		if (usbd_get_string(dev, udd->iProduct, p))
			product = NULL;
		else
			product = p;
		usbd_trim_spaces(product);
		if (vendor && !*vendor)
			vendor = NULL;
		if (product && !*product)
			product = NULL;
	} else {
		vendor = NULL;
		product = NULL;
	}

	if (vendor != NULL && *vendor)
		strcpy(v, vendor);
	else
		ksprintf(v, "vendor 0x%04x", UGETW(udd->idVendor));
	if (product != NULL && *product)
		strcpy(p, product);
	else
		ksprintf(p, "product 0x%04x", UGETW(udd->idProduct));
}
Esempio n. 4
0
static int ep0_get_descriptor (struct usb_device_instance *device,
                   				struct urb *urb, 
                   				int max, 
                   				int descriptor_type,
                   				int index)
{
	char *cp;
	
	urb->actual_length = 0;
	cp = (char*)urb->buffer;
	
	switch (descriptor_type) {
	case USB_DESCRIPTOR_TYPE_DEVICE:
		{
		struct usb_device_descriptor *device_descriptor;
		if (!(device_descriptor = usbd_device_device_descriptor(device)))
			return -1;
		
		copy_config(urb, device_descriptor, sizeof(struct usb_device_descriptor), max);
		}
		break;
	
	case USB_DESCRIPTOR_TYPE_CONFIGURATION:
		{
        struct usb_configuration_descriptor *configuration_descriptor;
        struct usb_device_descriptor *device_descriptor;
        
        usb_info("get configuration, index = %d\n", index);
        if (!(device_descriptor = usbd_device_device_descriptor (device)))
            return -1;

        if (index >= device_descriptor->bNumConfigurations) {
            return -1;
        }

        if (!(configuration_descriptor = usbd_device_configuration_descriptor (device, index)))
            return -1;
        copy_config (urb, configuration_descriptor,
                cpu_to_le16(configuration_descriptor->wTotalLength), max);
		}
		break;
		
	case USB_DESCRIPTOR_TYPE_STRING:
    	{
            		
        struct usb_string_descriptor *string_descriptor;
        usb_info("get string, index = %d, max = %d\n", index, max);
        string_descriptor = usbd_get_string (index);
        
//        if (!(string_descriptor))
//            return -1;
        

        copy_config (urb, string_descriptor, string_descriptor->bLength, max);
    	}
    break;
    
	case USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER:
		//TODO
	case USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONFIGURATION:
		//TODO
	case USB_DESCRIPTOR_TYPE_INTERFACE:	//should not see this
	case USB_DESCRIPTOR_TYPE_ENDPOINT:	//should not see this
	default:
		return -1;
	}
	return 0;
 }          
Esempio n. 5
0
void
usbd_fill_deviceinfo(struct usbd_device *dev, struct usb_device_info *di,
		     int usedev)
{
	struct usbd_port *p;
	int i, j, err;

	di->udi_bus = device_unit(dev->ud_bus->ub_usbctl);
	di->udi_addr = dev->ud_addr;
	di->udi_cookie = dev->ud_cookie;
	usbd_devinfo_vp(dev, di->udi_vendor, sizeof(di->udi_vendor),
	    di->udi_product, sizeof(di->udi_product), usedev, 1);
	usbd_printBCD(di->udi_release, sizeof(di->udi_release),
	    UGETW(dev->ud_ddesc.bcdDevice));
	if (usedev) {
		usbd_status uerr = usbd_get_string(dev,
		    dev->ud_ddesc.iSerialNumber, di->udi_serial);
		if (uerr != USBD_NORMAL_COMPLETION) {
			di->udi_serial[0] = '\0';
		} else {
			usbd_trim_spaces(di->udi_serial);
		}
	} else {
		di->udi_serial[0] = '\0';
		if (dev->ud_serial) {
			strlcpy(di->udi_serial, dev->ud_serial,
			    sizeof(di->udi_serial));
		}
	}

	di->udi_vendorNo = UGETW(dev->ud_ddesc.idVendor);
	di->udi_productNo = UGETW(dev->ud_ddesc.idProduct);
	di->udi_releaseNo = UGETW(dev->ud_ddesc.bcdDevice);
	di->udi_class = dev->ud_ddesc.bDeviceClass;
	di->udi_subclass = dev->ud_ddesc.bDeviceSubClass;
	di->udi_protocol = dev->ud_ddesc.bDeviceProtocol;
	di->udi_config = dev->ud_config;
	di->udi_power = dev->ud_selfpowered ? 0 : dev->ud_power;
	di->udi_speed = dev->ud_speed;

	if (dev->ud_subdevlen > 0) {
		for (i = 0, j = 0; i < dev->ud_subdevlen &&
			     j < USB_MAX_DEVNAMES; i++) {
			if (!dev->ud_subdevs[i])
				continue;
			strncpy(di->udi_devnames[j],
			    device_xname(dev->ud_subdevs[i]), USB_MAX_DEVNAMELEN);
			di->udi_devnames[j][USB_MAX_DEVNAMELEN-1] = '\0';
			j++;
		}
	} else {
		j = 0;
	}
	for (/* j is set */; j < USB_MAX_DEVNAMES; j++)
		di->udi_devnames[j][0] = 0;                 /* empty */

	if (!dev->ud_hub) {
		di->udi_nports = 0;
		return;
	}

	const int nports = dev->ud_hub->uh_hubdesc.bNbrPorts;
	for (i = 0; i < __arraycount(di->udi_ports) && i < nports; i++) {
		p = &dev->ud_hub->uh_ports[i];
		if (p->up_dev)
			err = p->up_dev->ud_addr;
		else {
			int s = UGETW(p->up_status.wPortStatus);
			if (s & UPS_PORT_ENABLED)
				err = USB_PORT_ENABLED;
			else if (s & UPS_SUSPEND)
				err = USB_PORT_SUSPENDED;
			/*
			 * Note: UPS_PORT_POWER_SS is available only
			 * on 3.x, and UPS_PORT_POWER is available
			 * only on 2.0 or 1.1.
			 */
			else if (USB_IS_SS(dev->ud_speed) &&
			    (s & UPS_PORT_POWER_SS))
				err = USB_PORT_POWERED;
			else if (s & UPS_PORT_POWER)
				err = USB_PORT_POWERED;
			else
				err = USB_PORT_DISABLED;
		}
		di->udi_ports[i] = err;
	}
	di->udi_nports = nports;
}