usb: device_next: disable high-speed USB device descriptor if not used
Disable the high-speed USB device descriptor if it is not in use. Add checks to the code where the high-speed descriptor may be used. Signed-off-by: Johann Fischer <johann.fischer@nordicsemi.no>
This commit is contained in:
parent
8457f50278
commit
fe3c001eeb
4 changed files with 42 additions and 10 deletions
|
@ -497,6 +497,7 @@ static inline void *usbd_class_get_private(const struct usbd_class_data *const c
|
|||
.iSerialNumber = 0, \
|
||||
.bNumConfigurations = 0, \
|
||||
}; \
|
||||
IF_ENABLED(USBD_SUPPORTS_HIGH_SPEED, ( \
|
||||
static struct usb_device_descriptor \
|
||||
hs_desc_##device_name = { \
|
||||
.bLength = sizeof(struct usb_device_descriptor), \
|
||||
|
@ -514,11 +515,14 @@ static inline void *usbd_class_get_private(const struct usbd_class_data *const c
|
|||
.iSerialNumber = 0, \
|
||||
.bNumConfigurations = 0, \
|
||||
}; \
|
||||
)) \
|
||||
static STRUCT_SECTION_ITERABLE(usbd_context, device_name) = { \
|
||||
.name = STRINGIFY(device_name), \
|
||||
.dev = udc_dev, \
|
||||
.fs_desc = &fs_desc_##device_name, \
|
||||
IF_ENABLED(USBD_SUPPORTS_HIGH_SPEED, ( \
|
||||
.hs_desc = &hs_desc_##device_name, \
|
||||
)) \
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -631,6 +631,10 @@ static int sreq_get_desc_dev(struct usbd_context *const uds_ctx,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (head == NULL) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
net_buf_add_mem(buf, head, MIN(len, head->bLength));
|
||||
|
||||
return 0;
|
||||
|
@ -750,6 +754,10 @@ static int sreq_get_desc_bos(struct usbd_context *const uds_ctx,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (dev_dsc == NULL) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (sys_le16_to_cpu(dev_dsc->bcdUSB) < 0x0201U) {
|
||||
errno = -ENOTSUP;
|
||||
return 0;
|
||||
|
|
|
@ -126,8 +126,13 @@ int usbd_add_descriptor(struct usbd_context *const uds_ctx,
|
|||
usbd_device_lock(uds_ctx);
|
||||
|
||||
hs_desc = uds_ctx->hs_desc;
|
||||
if (USBD_SUPPORTS_HIGH_SPEED && hs_desc == NULL) {
|
||||
ret = -EPERM;
|
||||
goto add_descriptor_error;
|
||||
}
|
||||
|
||||
fs_desc = uds_ctx->fs_desc;
|
||||
if (!fs_desc || !hs_desc || usbd_is_initialized(uds_ctx)) {
|
||||
if (!fs_desc || usbd_is_initialized(uds_ctx)) {
|
||||
ret = -EPERM;
|
||||
goto add_descriptor_error;
|
||||
}
|
||||
|
@ -167,15 +172,24 @@ int usbd_add_descriptor(struct usbd_context *const uds_ctx,
|
|||
case USBD_DUT_STRING_LANG:
|
||||
break;
|
||||
case USBD_DUT_STRING_MANUFACTURER:
|
||||
hs_desc->iManufacturer = desc_nd->str.idx;
|
||||
if (USBD_SUPPORTS_HIGH_SPEED) {
|
||||
hs_desc->iManufacturer = desc_nd->str.idx;
|
||||
}
|
||||
|
||||
fs_desc->iManufacturer = desc_nd->str.idx;
|
||||
break;
|
||||
case USBD_DUT_STRING_PRODUCT:
|
||||
hs_desc->iProduct = desc_nd->str.idx;
|
||||
if (USBD_SUPPORTS_HIGH_SPEED) {
|
||||
hs_desc->iProduct = desc_nd->str.idx;
|
||||
}
|
||||
|
||||
fs_desc->iProduct = desc_nd->str.idx;
|
||||
break;
|
||||
case USBD_DUT_STRING_SERIAL_NUMBER:
|
||||
hs_desc->iSerialNumber = desc_nd->str.idx;
|
||||
if (USBD_SUPPORTS_HIGH_SPEED) {
|
||||
hs_desc->iSerialNumber = desc_nd->str.idx;
|
||||
}
|
||||
|
||||
fs_desc->iSerialNumber = desc_nd->str.idx;
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -89,8 +89,10 @@ int usbd_device_set_vid(struct usbd_context *const uds_ctx,
|
|||
fs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_FS);
|
||||
fs_desc->idVendor = sys_cpu_to_le16(vid);
|
||||
|
||||
hs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_HS);
|
||||
hs_desc->idVendor = sys_cpu_to_le16(vid);
|
||||
if (USBD_SUPPORTS_HIGH_SPEED) {
|
||||
hs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_HS);
|
||||
hs_desc->idVendor = sys_cpu_to_le16(vid);
|
||||
}
|
||||
|
||||
set_vid_exit:
|
||||
usbd_device_unlock(uds_ctx);
|
||||
|
@ -113,8 +115,10 @@ int usbd_device_set_pid(struct usbd_context *const uds_ctx,
|
|||
fs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_FS);
|
||||
fs_desc->idProduct = sys_cpu_to_le16(pid);
|
||||
|
||||
hs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_HS);
|
||||
hs_desc->idProduct = sys_cpu_to_le16(pid);
|
||||
if (USBD_SUPPORTS_HIGH_SPEED) {
|
||||
hs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_HS);
|
||||
hs_desc->idProduct = sys_cpu_to_le16(pid);
|
||||
}
|
||||
|
||||
set_pid_exit:
|
||||
usbd_device_unlock(uds_ctx);
|
||||
|
@ -137,8 +141,10 @@ int usbd_device_set_bcd_device(struct usbd_context *const uds_ctx,
|
|||
fs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_FS);
|
||||
fs_desc->bcdDevice = sys_cpu_to_le16(bcd);
|
||||
|
||||
hs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_HS);
|
||||
hs_desc->bcdDevice = sys_cpu_to_le16(bcd);
|
||||
if (USBD_SUPPORTS_HIGH_SPEED) {
|
||||
hs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_HS);
|
||||
hs_desc->bcdDevice = sys_cpu_to_le16(bcd);
|
||||
}
|
||||
|
||||
set_bcd_device_exit:
|
||||
usbd_device_unlock(uds_ctx);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue