Exemple #1
0
static int usb_standard_get_descriptor(usbd_device *usbd_dev,
				       struct usb_setup_data *req,
				       u8 **buf, u16 *len)
{
	int i, array_idx, descr_idx;
	struct usb_string_descriptor *sd;

	descr_idx = usb_descriptor_index(req->wValue);

	switch (usb_descriptor_type(req->wValue)) {
	case USB_DT_DEVICE:
		*buf = (u8 *) usbd_dev->desc;
		*len = MIN(*len, usbd_dev->desc->bLength);
		return USBD_REQ_HANDLED;
	case USB_DT_CONFIGURATION:
		*buf = usbd_dev->ctrl_buf;
		*len = build_config_descriptor(usbd_dev, descr_idx, *buf, *len);
		return USBD_REQ_HANDLED;
	case USB_DT_STRING:
		sd = (struct usb_string_descriptor *)usbd_dev->ctrl_buf;

		if (descr_idx == 0) {
			/* Send sane Language ID descriptor... */
			sd->wData[0] = USB_LANGID_ENGLISH_US;
			sd->bLength = sizeof(sd->bLength) + sizeof(sd->bDescriptorType) 
				+ sizeof(sd->wData[0]);

			*len = MIN(*len, sd->bLength);
		} else {
			array_idx = descr_idx - 1;

			if (!usbd_dev->strings)
				return USBD_REQ_NOTSUPP; /* Device doesn't support strings. */
			/* Check that string index is in range. */
			if (array_idx >= usbd_dev->num_strings)
				return USBD_REQ_NOTSUPP;

			/* Strings with Language ID differnet from
			 * USB_LANGID_ENGLISH_US are not supported */
			if (req->wIndex != USB_LANGID_ENGLISH_US)
				return USBD_REQ_NOTSUPP;

			/* Ths string is returned as UTF16, hence the multiplication */
			sd->bLength = strlen(usbd_dev->strings[array_idx]) * 2 +
				sizeof(sd->bLength) + sizeof(sd->bDescriptorType);

			*len = MIN(*len, sd->bLength);

			for (i = 0; i < (*len / 2) - 1; i++)
				sd->wData[i] =
					usbd_dev->strings[array_idx][i];
		}

		sd->bDescriptorType = USB_DT_STRING;
		*buf = (u8 *)sd;

		return USBD_REQ_HANDLED;
	}
	return USBD_REQ_NOTSUPP;
}
Exemple #2
0
static int usb_standard_get_descriptor(struct usb_setup_data *req,
				       u8 **buf, u16 *len)
{
	int i;
	struct usb_string_descriptor *sd;

	switch (req->wValue >> 8) {
	case USB_DT_DEVICE:
		*buf = (u8 *) _usbd_device.desc;
		*len = MIN(*len, _usbd_device.desc->bLength);
		return 1;
	case USB_DT_CONFIGURATION:
		*buf = _usbd_device.ctrl_buf;
		*len = build_config_descriptor(req->wValue & 0xff, *buf, *len);
		return 1;
	case USB_DT_STRING:
		sd = (struct usb_string_descriptor *)_usbd_device.ctrl_buf;

		if (!_usbd_device.strings)
			return 0; /* Device doesn't support strings. */

		/* Check that string index is in range. */
		for (i = 0; i <= (req->wValue & 0xff); i++)
			if (_usbd_device.strings[i] == NULL)
				return 0;

		sd->bLength = strlen(_usbd_device.strings[req->wValue & 0xff])
				* 2 + 2;
		sd->bDescriptorType = USB_DT_STRING;

		*buf = (u8 *)sd;
		*len = MIN(*len, sd->bLength);

		for (i = 0; i < (*len / 2) - 1; i++)
			sd->wData[i] =
			    _usbd_device.strings[req->wValue & 0xff][i];

		/* Send sane Language ID descriptor... */
		if ((req->wValue & 0xff) == 0)
			sd->wData[0] = 0x409;

		return 1;
	}
	return 0;
}