Skip to content

Commit 2bc9c94

Browse files
committed
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 <[email protected]>
1 parent 67a6bcd commit 2bc9c94

File tree

4 files changed

+42
-10
lines changed

4 files changed

+42
-10
lines changed

include/zephyr/usb/usbd.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,7 @@ static inline void *usbd_class_get_private(const struct usbd_class_data *const c
497497
.iSerialNumber = 0, \
498498
.bNumConfigurations = 0, \
499499
}; \
500+
IF_ENABLED(USBD_SPEED_HS, ( \
500501
static struct usb_device_descriptor \
501502
hs_desc_##device_name = { \
502503
.bLength = sizeof(struct usb_device_descriptor), \
@@ -514,11 +515,14 @@ static inline void *usbd_class_get_private(const struct usbd_class_data *const c
514515
.iSerialNumber = 0, \
515516
.bNumConfigurations = 0, \
516517
}; \
518+
)) \
517519
static STRUCT_SECTION_ITERABLE(usbd_context, device_name) = { \
518520
.name = STRINGIFY(device_name), \
519521
.dev = udc_dev, \
520522
.fs_desc = &fs_desc_##device_name, \
523+
IF_ENABLED(USBD_SPEED_HS, ( \
521524
.hs_desc = &hs_desc_##device_name, \
525+
)) \
522526
}
523527

524528
/**

subsys/usb/device_next/usbd_ch9.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,10 @@ static int sreq_get_desc_dev(struct usbd_context *const uds_ctx,
631631
return 0;
632632
}
633633

634+
if (head == NULL) {
635+
return -EINVAL;
636+
}
637+
634638
net_buf_add_mem(buf, head, MIN(len, head->bLength));
635639

636640
return 0;
@@ -750,6 +754,10 @@ static int sreq_get_desc_bos(struct usbd_context *const uds_ctx,
750754
return 0;
751755
}
752756

757+
if (dev_dsc == NULL) {
758+
return -EINVAL;
759+
}
760+
753761
if (sys_le16_to_cpu(dev_dsc->bcdUSB) < 0x0201U) {
754762
errno = -ENOTSUP;
755763
return 0;

subsys/usb/device_next/usbd_desc.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,13 @@ int usbd_add_descriptor(struct usbd_context *const uds_ctx,
126126
usbd_device_lock(uds_ctx);
127127

128128
hs_desc = uds_ctx->hs_desc;
129+
if (USBD_SUPPORTS_HIGH_SPEED && hs_desc == NULL) {
130+
ret = -EPERM;
131+
goto add_descriptor_error;
132+
}
133+
129134
fs_desc = uds_ctx->fs_desc;
130-
if (!fs_desc || !hs_desc || usbd_is_initialized(uds_ctx)) {
135+
if (!fs_desc || usbd_is_initialized(uds_ctx)) {
131136
ret = -EPERM;
132137
goto add_descriptor_error;
133138
}
@@ -167,15 +172,24 @@ int usbd_add_descriptor(struct usbd_context *const uds_ctx,
167172
case USBD_DUT_STRING_LANG:
168173
break;
169174
case USBD_DUT_STRING_MANUFACTURER:
170-
hs_desc->iManufacturer = desc_nd->str.idx;
175+
if (USBD_SUPPORTS_HIGH_SPEED) {
176+
hs_desc->iManufacturer = desc_nd->str.idx;
177+
}
178+
171179
fs_desc->iManufacturer = desc_nd->str.idx;
172180
break;
173181
case USBD_DUT_STRING_PRODUCT:
174-
hs_desc->iProduct = desc_nd->str.idx;
182+
if (USBD_SUPPORTS_HIGH_SPEED) {
183+
hs_desc->iProduct = desc_nd->str.idx;
184+
}
185+
175186
fs_desc->iProduct = desc_nd->str.idx;
176187
break;
177188
case USBD_DUT_STRING_SERIAL_NUMBER:
178-
hs_desc->iSerialNumber = desc_nd->str.idx;
189+
if (USBD_SUPPORTS_HIGH_SPEED) {
190+
hs_desc->iSerialNumber = desc_nd->str.idx;
191+
}
192+
179193
fs_desc->iSerialNumber = desc_nd->str.idx;
180194
break;
181195
default:

subsys/usb/device_next/usbd_device.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,10 @@ int usbd_device_set_vid(struct usbd_context *const uds_ctx,
8989
fs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_FS);
9090
fs_desc->idVendor = sys_cpu_to_le16(vid);
9191

92-
hs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_HS);
93-
hs_desc->idVendor = sys_cpu_to_le16(vid);
92+
if (USBD_SUPPORTS_HIGH_SPEED) {
93+
hs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_HS);
94+
hs_desc->idVendor = sys_cpu_to_le16(vid);
95+
}
9496

9597
set_vid_exit:
9698
usbd_device_unlock(uds_ctx);
@@ -113,8 +115,10 @@ int usbd_device_set_pid(struct usbd_context *const uds_ctx,
113115
fs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_FS);
114116
fs_desc->idProduct = sys_cpu_to_le16(pid);
115117

116-
hs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_HS);
117-
hs_desc->idProduct = sys_cpu_to_le16(pid);
118+
if (USBD_SUPPORTS_HIGH_SPEED) {
119+
hs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_HS);
120+
hs_desc->idProduct = sys_cpu_to_le16(pid);
121+
}
118122

119123
set_pid_exit:
120124
usbd_device_unlock(uds_ctx);
@@ -137,8 +141,10 @@ int usbd_device_set_bcd_device(struct usbd_context *const uds_ctx,
137141
fs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_FS);
138142
fs_desc->bcdDevice = sys_cpu_to_le16(bcd);
139143

140-
hs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_HS);
141-
hs_desc->bcdDevice = sys_cpu_to_le16(bcd);
144+
if (USBD_SUPPORTS_HIGH_SPEED) {
145+
hs_desc = get_device_descriptor(uds_ctx, USBD_SPEED_HS);
146+
hs_desc->bcdDevice = sys_cpu_to_le16(bcd);
147+
}
142148

143149
set_bcd_device_exit:
144150
usbd_device_unlock(uds_ctx);

0 commit comments

Comments
 (0)