usb_standard: Implemented support for sending out what we have so far of a BOS descriptor
This commit is contained in:
committed by
Piotr Esden-Tempski
parent
60ff345798
commit
1bc180c639
@@ -125,6 +125,10 @@ typedef enum usbd_request_return_codes (*usbd_control_callback)(
|
|||||||
typedef void (*usbd_set_config_callback)(usbd_device *usbd_dev,
|
typedef void (*usbd_set_config_callback)(usbd_device *usbd_dev,
|
||||||
uint16_t wValue);
|
uint16_t wValue);
|
||||||
|
|
||||||
|
typedef enum usbd_request_return_codes (*usbd_microsoft_os_req_callback)(
|
||||||
|
usbd_device *usbd_dev,
|
||||||
|
struct usb_setup_data *req, uint8_t **buf, uint16_t *len);
|
||||||
|
|
||||||
typedef void (*usbd_set_altsetting_callback)(usbd_device *usbd_dev,
|
typedef void (*usbd_set_altsetting_callback)(usbd_device *usbd_dev,
|
||||||
uint16_t wIndex, uint16_t wValue);
|
uint16_t wIndex, uint16_t wValue);
|
||||||
|
|
||||||
@@ -240,4 +244,3 @@ END_DECLS
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**@}*/
|
/**@}*/
|
||||||
|
|
||||||
|
|||||||
@@ -78,6 +78,8 @@ struct _usbd_device {
|
|||||||
bool needs_zlp;
|
bool needs_zlp;
|
||||||
} control_state;
|
} control_state;
|
||||||
|
|
||||||
|
usbd_microsoft_os_req_callback microsoft_os_req_callback;
|
||||||
|
|
||||||
struct user_control_callback {
|
struct user_control_callback {
|
||||||
usbd_control_callback cb;
|
usbd_control_callback cb;
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
|
|||||||
@@ -140,6 +140,53 @@ static uint16_t build_config_descriptor(usbd_device *usbd_dev,
|
|||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This can return 0 to indicate an error in the descriptor */
|
||||||
|
static uint16_t build_devcap_platform(const usb_platform_device_capability_descriptor *const plat,
|
||||||
|
uint8_t *const buf, uint16_t len)
|
||||||
|
{
|
||||||
|
uint16_t count = MIN(len, USB_DCT_PLATFORM_SIZE);
|
||||||
|
memcpy(buf, plat, count);
|
||||||
|
len -= count;
|
||||||
|
const uint16_t total = count;
|
||||||
|
|
||||||
|
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This can return 0 to indicate an error in the descriptor */
|
||||||
|
static uint16_t build_bos_descriptor(usbd_device *usbd_dev, uint8_t *const buf, uint16_t len)
|
||||||
|
{
|
||||||
|
const usb_bos_descriptor *const bos = usbd_dev->bos;
|
||||||
|
uint16_t count = MIN(len, bos->bLength);
|
||||||
|
memcpy(buf, bos, count);
|
||||||
|
len -= count;
|
||||||
|
uint16_t total = count;
|
||||||
|
size_t offset = 0;
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < bos->bNumDeviceCaps; ++i) {
|
||||||
|
const usb_device_capability_descriptor *const dev_cap =
|
||||||
|
(const usb_device_capability_descriptor *)
|
||||||
|
(((const uint8_t *)bos->device_capability_descriptors) + offset);
|
||||||
|
|
||||||
|
switch (dev_cap->bDevCapabilityType) {
|
||||||
|
case USB_DCT_PLATFORM:
|
||||||
|
count = build_devcap_platform((const usb_platform_device_capability_descriptor *)dev_cap, buf + total, len);
|
||||||
|
offset += sizeof(usb_platform_device_capability_descriptor) + MICROSOFT_OS_DESCRIPTOR_SET_INFORMATION_SIZE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!count && len)
|
||||||
|
return 0;
|
||||||
|
len -= count;
|
||||||
|
total += count;
|
||||||
|
if (!count && !len)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
static int usb_descriptor_type(uint16_t wValue)
|
static int usb_descriptor_type(uint16_t wValue)
|
||||||
{
|
{
|
||||||
return wValue >> 8;
|
return wValue >> 8;
|
||||||
@@ -169,6 +216,12 @@ usb_standard_get_descriptor(usbd_device *usbd_dev,
|
|||||||
*buf = usbd_dev->ctrl_buf;
|
*buf = usbd_dev->ctrl_buf;
|
||||||
*len = build_config_descriptor(usbd_dev, descr_idx, *buf, *len);
|
*len = build_config_descriptor(usbd_dev, descr_idx, *buf, *len);
|
||||||
return USBD_REQ_HANDLED;
|
return USBD_REQ_HANDLED;
|
||||||
|
case USB_DT_BOS:
|
||||||
|
if (!usbd_dev->bos || descr_idx != 0)
|
||||||
|
return USBD_REQ_NOTSUPP;
|
||||||
|
*buf = usbd_dev->ctrl_buf;
|
||||||
|
*len = build_bos_descriptor(usbd_dev, *buf, *len);
|
||||||
|
return *len ? USBD_REQ_HANDLED : USBD_REQ_NOTSUPP;
|
||||||
case USB_DT_STRING:
|
case USB_DT_STRING:
|
||||||
sd = (struct usb_string_descriptor *)usbd_dev->ctrl_buf;
|
sd = (struct usb_string_descriptor *)usbd_dev->ctrl_buf;
|
||||||
|
|
||||||
@@ -634,4 +687,3 @@ _usbd_standard_request(usbd_device *usbd_dev, struct usb_setup_data *req,
|
|||||||
return USBD_REQ_NOTSUPP;
|
return USBD_REQ_NOTSUPP;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user