Browse Source

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>
pull/90011/merge
Johann Fischer 1 month ago committed by Fabio Baltieri
parent
commit
fe3c001eeb
  1. 4
      include/zephyr/usb/usbd.h
  2. 8
      subsys/usb/device_next/usbd_ch9.c
  3. 22
      subsys/usb/device_next/usbd_desc.c
  4. 18
      subsys/usb/device_next/usbd_device.c

4
include/zephyr/usb/usbd.h

@ -497,6 +497,7 @@ static inline void *usbd_class_get_private(const struct usbd_class_data *const c @@ -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 @@ -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, \
)) \
}
/**

8
subsys/usb/device_next/usbd_ch9.c

@ -631,6 +631,10 @@ static int sreq_get_desc_dev(struct usbd_context *const uds_ctx, @@ -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, @@ -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;

22
subsys/usb/device_next/usbd_desc.c

@ -126,8 +126,13 @@ int usbd_add_descriptor(struct usbd_context *const uds_ctx, @@ -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, @@ -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:

18
subsys/usb/device_next/usbd_device.c

@ -89,8 +89,10 @@ int usbd_device_set_vid(struct usbd_context *const uds_ctx, @@ -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, @@ -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, @@ -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…
Cancel
Save