From fe3c001eeb8ca51978c91ef976f93265b2c1ce46 Mon Sep 17 00:00:00 2001 From: Johann Fischer Date: Wed, 28 May 2025 15:55:36 +0200 Subject: [PATCH] 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 --- include/zephyr/usb/usbd.h | 4 ++++ subsys/usb/device_next/usbd_ch9.c | 8 ++++++++ subsys/usb/device_next/usbd_desc.c | 22 ++++++++++++++++++---- subsys/usb/device_next/usbd_device.c | 18 ++++++++++++------ 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/include/zephyr/usb/usbd.h b/include/zephyr/usb/usbd.h index 333e1406432..fd731c98f5a 100644 --- a/include/zephyr/usb/usbd.h +++ b/include/zephyr/usb/usbd.h @@ -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, \ + )) \ } /** diff --git a/subsys/usb/device_next/usbd_ch9.c b/subsys/usb/device_next/usbd_ch9.c index 14eaa30279c..c9f806960d7 100644 --- a/subsys/usb/device_next/usbd_ch9.c +++ b/subsys/usb/device_next/usbd_ch9.c @@ -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; diff --git a/subsys/usb/device_next/usbd_desc.c b/subsys/usb/device_next/usbd_desc.c index 8693207eae9..f30e4f197cd 100644 --- a/subsys/usb/device_next/usbd_desc.c +++ b/subsys/usb/device_next/usbd_desc.c @@ -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: diff --git a/subsys/usb/device_next/usbd_device.c b/subsys/usb/device_next/usbd_device.c index 624dc6440a9..bb011e0731c 100644 --- a/subsys/usb/device_next/usbd_device.c +++ b/subsys/usb/device_next/usbd_device.c @@ -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);