Skip to content

usb: device_next: Add Kconfig to set maximum speed #76255

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Apr 10, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions drivers/usb/udc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ menuconfig UDC_DRIVER

if UDC_DRIVER

config UDC_DRIVER_HAS_HIGH_SPEED_SUPPORT
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This commit changes too much. It should be limited to introducing the Kconfig option UDC_DRIVER_HAS_HIGH_SPEED_SUPPORT and related changes in the UDC drivers. They are independent of the stack changes. The stack changes should be done in the next commit.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

bool

config UDC_DRIVER_HIGH_SPEED_SUPPORT_ENABLED
bool "Allow High-Speed chirp"
default y if UDC_DRIVER_HAS_HIGH_SPEED_SUPPORT
help
Allow High-Speed capable device to operate at High-Speed. Disable this
option to force Full-Speed only operation.

config UDC_BUF_COUNT
int "Number of buffers in the pool"
range 16 256
Expand Down
1 change: 1 addition & 0 deletions drivers/usb/udc/Kconfig.dwc2
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ config UDC_DWC2
bool "DWC2 USB device controller driver"
default y
depends on DT_HAS_SNPS_DWC2_ENABLED
select UDC_DRIVER_HAS_HIGH_SPEED_SUPPORT
select NRFS if NRFS_HAS_VBUS_DETECTOR_SERVICE
select NRFS_VBUS_DETECTOR_SERVICE_ENABLED if NRFS_HAS_VBUS_DETECTOR_SERVICE
select EVENTS
Expand Down
2 changes: 2 additions & 0 deletions drivers/usb/udc/Kconfig.mcux
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ config UDC_NXP_EHCI
bool "NXP MCUX USB EHCI Device controller driver"
default y
depends on DT_HAS_NXP_EHCI_ENABLED
select UDC_DRIVER_HAS_HIGH_SPEED_SUPPORT
select PINCTRL
select NOCACHE_MEMORY if CPU_HAS_DCACHE
imply UDC_BUF_FORCE_NOCACHE
Expand All @@ -16,6 +17,7 @@ config UDC_NXP_IP3511
bool "NXP MCUX USB IP3511 Device controller driver"
default y
depends on DT_HAS_NXP_LPCIP3511_ENABLED
select UDC_DRIVER_HAS_HIGH_SPEED_SUPPORT
select PINCTRL
imply UDC_WORKQUEUE
help
Expand Down
1 change: 1 addition & 0 deletions drivers/usb/udc/Kconfig.skeleton
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ config UDC_SKELETON
bool "Skeleton for an USB device controller driver"
default y
depends on DT_HAS_ZEPHYR_UDC_SKELETON_ENABLED
select UDC_DRIVER_HAS_HIGH_SPEED_SUPPORT
help
Skeleton for an USB device controller driver.

Expand Down
1 change: 1 addition & 0 deletions drivers/usb/udc/Kconfig.virtual
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ config UDC_VIRTUAL
select UVB
default y
depends on DT_HAS_ZEPHYR_UDC_VIRTUAL_ENABLED
select UDC_DRIVER_HAS_HIGH_SPEED_SUPPORT
help
Virtual USB device controller driver.

Expand Down
17 changes: 11 additions & 6 deletions drivers/usb/udc/udc_dwc2.c
Original file line number Diff line number Diff line change
Expand Up @@ -2040,15 +2040,21 @@ static int udc_dwc2_init_controller(const struct device *dev)
case USB_DWC2_GHWCFG2_HSPHYTYPE_ULPI:
gusbcfg |= USB_DWC2_GUSBCFG_PHYSEL_USB20 |
USB_DWC2_GUSBCFG_ULPI_UTMI_SEL_ULPI;
dcfg |= USB_DWC2_DCFG_DEVSPD_USBHS20
<< USB_DWC2_DCFG_DEVSPD_POS;
if (IS_ENABLED(CONFIG_UDC_DRIVER_HIGH_SPEED_SUPPORT_ENABLED)) {
dcfg |= usb_dwc2_set_dcfg_devspd(USB_DWC2_DCFG_DEVSPD_USBHS20);
} else {
dcfg |= usb_dwc2_set_dcfg_devspd(USB_DWC2_DCFG_DEVSPD_USBFS20);
}
hs_phy = true;
break;
case USB_DWC2_GHWCFG2_HSPHYTYPE_UTMIPLUS:
gusbcfg |= USB_DWC2_GUSBCFG_PHYSEL_USB20 |
USB_DWC2_GUSBCFG_ULPI_UTMI_SEL_UTMI;
dcfg |= USB_DWC2_DCFG_DEVSPD_USBHS20
<< USB_DWC2_DCFG_DEVSPD_POS;
if (IS_ENABLED(CONFIG_UDC_DRIVER_HIGH_SPEED_SUPPORT_ENABLED)) {
dcfg |= usb_dwc2_set_dcfg_devspd(USB_DWC2_DCFG_DEVSPD_USBHS20);
} else {
dcfg |= usb_dwc2_set_dcfg_devspd(USB_DWC2_DCFG_DEVSPD_USBFS20);
}
hs_phy = true;
break;
case USB_DWC2_GHWCFG2_HSPHYTYPE_NO_HS:
Expand All @@ -2059,8 +2065,7 @@ static int udc_dwc2_init_controller(const struct device *dev)
gusbcfg |= USB_DWC2_GUSBCFG_PHYSEL_USB11;
}

dcfg |= USB_DWC2_DCFG_DEVSPD_USBFS1148
<< USB_DWC2_DCFG_DEVSPD_POS;
dcfg |= usb_dwc2_set_dcfg_devspd(USB_DWC2_DCFG_DEVSPD_USBFS1148);
hs_phy = false;
}

Expand Down
6 changes: 6 additions & 0 deletions include/zephyr/usb/usbd.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ extern "C" {
* @{
*/

/* 1 if USB device stack is compiled with High-Speed support */
#define USBD_SUPPORTS_HIGH_SPEED IS_EQ(CONFIG_USBD_MAX_SPEED, 1)

/* Maximum bulk max packet size the stack supports */
#define USBD_MAX_BULK_MPS COND_CODE_1(USBD_SUPPORTS_HIGH_SPEED, (512), (64))

/*
* The USB Unicode bString is encoded in UTF16LE, which means it takes up
* twice the amount of bytes than the same string encoded in ASCII7.
Expand Down
3 changes: 2 additions & 1 deletion samples/subsys/usb/common/sample_usbd_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,8 @@ struct usbd_context *sample_usbd_setup_device(usbd_msg_cb_t msg_cb)
}
/* doc add string descriptor end */

if (usbd_caps_speed(&sample_usbd) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_caps_speed(&sample_usbd) == USBD_SPEED_HS) {
err = usbd_add_configuration(&sample_usbd, USBD_SPEED_HS,
&sample_hs_config);
if (err) {
Expand Down
20 changes: 20 additions & 0 deletions subsys/usb/device_next/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,26 @@ module = USBD
module-str = usbd
source "subsys/logging/Kconfig.template.log_config"

choice USBD_MAX_SPEED_CHOICE
prompt "Max supported connection speed"
default USBD_MAX_SPEED_HIGH if UDC_DRIVER_HAS_HIGH_SPEED_SUPPORT
default USBD_MAX_SPEED_FULL

config USBD_MAX_SPEED_HIGH
bool "High-Speed"
depends on UDC_DRIVER_HAS_HIGH_SPEED_SUPPORT

config USBD_MAX_SPEED_FULL
bool "Full-Speed"
depends on !UDC_DRIVER_HIGH_SPEED_SUPPORT_ENABLED

endchoice

config USBD_MAX_SPEED
int
default 0 if USBD_MAX_SPEED_FULL
default 1 if USBD_MAX_SPEED_HIGH
Comment on lines +34 to +37
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How come this indirection is needed? Why not simple do if (IS_ENABLED(CONFIG_USBD_MAX_SPEED_HIGH) in the C code?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The choice here makes it possible to add Super-Speed support later on without much hassle. IS_ENABLED(CONFIG_USBD_MAX_SPEED_HIGH) would make things harder IMHO.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense, thanks. I'll take a closer look later today.


config USBD_SHELL
bool "USB device shell"
depends on SHELL
Expand Down
12 changes: 7 additions & 5 deletions subsys/usb/device_next/class/bt_hci.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,13 @@ static K_FIFO_DEFINE(bt_hci_tx_queue);

/*
* Transfers through three endpoints proceed in a synchronous manner,
* with maximum packet size of high speed bulk endpoint.
* with maximum packet size of max supported speed bulk endpoint.
*
* REVISE: global (bulk, interrupt, iso) specific pools would be more
* RAM usage efficient.
*/
UDC_BUF_POOL_DEFINE(bt_hci_ep_pool,
3, 512,
3, USBD_MAX_BULK_MPS,
sizeof(struct udc_buf_info), NULL);
/* HCI RX/TX threads */
static K_KERNEL_STACK_DEFINE(rx_thread_stack, CONFIG_BT_HCI_TX_STACK_SIZE);
Expand Down Expand Up @@ -138,7 +138,8 @@ static uint8_t bt_hci_get_bulk_in(struct usbd_class_data *const c_data)
struct bt_hci_data *data = usbd_class_get_private(c_data);
struct usbd_bt_hci_desc *desc = data->desc;

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
Comment on lines +141 to +142
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This does not look good and is easy to forget. I suggest adding a helper macro that could take usbd_bus_speed(), usbd_caps_speed_is_hs() or just speed as argument.

diff --git a/include/zephyr/usb/usbd.h b/include/zephyr/usb/usbd.h
index 186f79b991b..8ff45bfe678 100644
--- a/include/zephyr/usb/usbd.h
+++ b/include/zephyr/usb/usbd.h
@@ -966,6 +966,15 @@ int usbd_wakeup_request(struct usbd_context *uds_ctx);
  */
 enum usbd_speed usbd_bus_speed(const struct usbd_context *const uds_ctx);
 
+/**
+ * @brief Helper to check if speed is high speed
+ *
+ * @param[in] fspeed Parameter that expands to usbd_speed
+ *
+ * @return 1 if actual speed is high speed
+ */
+#define usbd_speed_is_hs(fspeed) \
+       (USBD_SUPPORTS_HIGH_SPEED && fspeed == USBD_SPEED_HS)

 /**
  * @brief Get highest speed supported by the controller
  *

Maybe also shorthand for usbd_bus_speed()/usbd_caps_speed()

+/**
+ * @brief Helper to check if actual device speed is high speed
+ *
+ * @param[in] uds_ctx Pointer to a device context
+ *
+ * @return 1 if actual device speed is high speed
+ */
+#define usbd_bus_speed_is_hs(uds_ctx) \
+       (usbd_speed_is_hs(usbd_bus_speed(uds_ctx)))

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tend to disagree. Hiding compile time evaluation conditions behind a macro that looks just like a function is IMHO hiding the fact that the code is supposed to go away when compiled with Full-Speed only configuration.

I won't object the macros if you submit the PR yourself, but I just don't think these are justified myself.

return desc->if0_hs_in_ep.bEndpointAddress;
}

Expand All @@ -151,7 +152,8 @@ static uint8_t bt_hci_get_bulk_out(struct usbd_class_data *const c_data)
struct bt_hci_data *data = usbd_class_get_private(c_data);
struct usbd_bt_hci_desc *desc = data->desc;

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return desc->if0_hs_out_ep.bEndpointAddress;
}

Expand Down Expand Up @@ -449,7 +451,7 @@ static void *bt_hci_get_desc(struct usbd_class_data *const c_data,
{
struct bt_hci_data *data = usbd_class_get_private(c_data);

if (speed == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
return data->hs_desc;
}

Expand Down
2 changes: 1 addition & 1 deletion subsys/usb/device_next/class/loopback.c
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ static void *lb_get_desc(struct usbd_class_data *const c_data,
{
struct lb_data *data = usbd_class_get_private(c_data);

if (speed == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
return data->hs_desc;
}

Expand Down
16 changes: 10 additions & 6 deletions subsys/usb/device_next/class/usbd_cdc_acm.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ LOG_MODULE_REGISTER(usbd_cdc_acm, CONFIG_USBD_CDC_ACM_LOG_LEVEL);

UDC_BUF_POOL_DEFINE(cdc_acm_ep_pool,
DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) * 2,
512, sizeof(struct udc_buf_info), NULL);
USBD_MAX_BULK_MPS, sizeof(struct udc_buf_info), NULL);

#define CDC_ACM_DEFAULT_LINECODING {sys_cpu_to_le32(115200), 0, 0, 8}
#define CDC_ACM_DEFAULT_INT_EP_MPS 16
Expand Down Expand Up @@ -171,7 +171,8 @@ static uint8_t cdc_acm_get_int_in(struct usbd_class_data *const c_data)
const struct cdc_acm_uart_config *cfg = dev->config;
struct usbd_cdc_acm_desc *desc = cfg->desc;

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return desc->if0_hs_int_ep.bEndpointAddress;
}

Expand All @@ -185,7 +186,8 @@ static uint8_t cdc_acm_get_bulk_in(struct usbd_class_data *const c_data)
const struct cdc_acm_uart_config *cfg = dev->config;
struct usbd_cdc_acm_desc *desc = cfg->desc;

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return desc->if1_hs_in_ep.bEndpointAddress;
}

Expand All @@ -199,7 +201,8 @@ static uint8_t cdc_acm_get_bulk_out(struct usbd_class_data *const c_data)
const struct cdc_acm_uart_config *cfg = dev->config;
struct usbd_cdc_acm_desc *desc = cfg->desc;

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return desc->if1_hs_out_ep.bEndpointAddress;
}

Expand All @@ -210,7 +213,8 @@ static size_t cdc_acm_get_bulk_mps(struct usbd_class_data *const c_data)
{
struct usbd_context *uds_ctx = usbd_class_get_ctx(c_data);

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return 512U;
}

Expand Down Expand Up @@ -350,7 +354,7 @@ static void *usbd_cdc_acm_get_desc(struct usbd_class_data *const c_data,
const struct device *dev = usbd_class_get_private(c_data);
const struct cdc_acm_uart_config *cfg = dev->config;

if (speed == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
return cfg->hs_desc;
}

Expand Down
14 changes: 9 additions & 5 deletions subsys/usb/device_next/class/usbd_cdc_ecm.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,8 @@ static uint8_t cdc_ecm_get_int_in(struct usbd_class_data *const c_data)
struct cdc_ecm_eth_data *data = dev->data;
struct usbd_cdc_ecm_desc *desc = data->desc;

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return desc->if0_hs_int_ep.bEndpointAddress;
}

Expand All @@ -120,7 +121,8 @@ static uint8_t cdc_ecm_get_bulk_in(struct usbd_class_data *const c_data)
struct cdc_ecm_eth_data *data = dev->data;
struct usbd_cdc_ecm_desc *desc = data->desc;

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return desc->if1_1_hs_in_ep.bEndpointAddress;
}

Expand All @@ -131,7 +133,8 @@ static uint16_t cdc_ecm_get_bulk_in_mps(struct usbd_class_data *const c_data)
{
struct usbd_context *uds_ctx = usbd_class_get_ctx(c_data);

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return 512U;
}

Expand All @@ -145,7 +148,8 @@ static uint8_t cdc_ecm_get_bulk_out(struct usbd_class_data *const c_data)
struct cdc_ecm_eth_data *data = dev->data;
struct usbd_cdc_ecm_desc *desc = data->desc;

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return desc->if1_1_hs_out_ep.bEndpointAddress;
}

Expand Down Expand Up @@ -475,7 +479,7 @@ static void *usbd_cdc_ecm_get_desc(struct usbd_class_data *const c_data,
const struct device *dev = usbd_class_get_private(c_data);
struct cdc_ecm_eth_data *const data = dev->data;

if (speed == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
return data->hs_desc;
}

Expand Down
14 changes: 9 additions & 5 deletions subsys/usb/device_next/class/usbd_cdc_ncm.c
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,8 @@ static uint8_t cdc_ncm_get_int_in(struct usbd_class_data *const c_data)
struct cdc_ncm_eth_data *data = dev->data;
struct usbd_cdc_ncm_desc *desc = data->desc;

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return desc->if0_hs_int_ep.bEndpointAddress;
}

Expand All @@ -263,7 +264,8 @@ static uint8_t cdc_ncm_get_bulk_in(struct usbd_class_data *const c_data)
struct cdc_ncm_eth_data *data = dev->data;
struct usbd_cdc_ncm_desc *desc = data->desc;

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return desc->if1_1_hs_in_ep.bEndpointAddress;
}

Expand All @@ -274,7 +276,8 @@ static uint16_t cdc_ncm_get_bulk_in_mps(struct usbd_class_data *const c_data)
{
struct usbd_context *uds_ctx = usbd_class_get_ctx(c_data);

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return 512U;
}

Expand All @@ -288,7 +291,8 @@ static uint8_t cdc_ncm_get_bulk_out(struct usbd_class_data *const c_data)
struct cdc_ncm_eth_data *data = dev->data;
struct usbd_cdc_ncm_desc *desc = data->desc;

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return desc->if1_1_hs_out_ep.bEndpointAddress;
}

Expand Down Expand Up @@ -1009,7 +1013,7 @@ static void *usbd_cdc_ncm_get_desc(struct usbd_class_data *const c_data,
const struct device *dev = usbd_class_get_private(c_data);
struct cdc_ncm_eth_data *const data = dev->data;

if (speed == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
return data->hs_desc;
}

Expand Down
2 changes: 1 addition & 1 deletion subsys/usb/device_next/class/usbd_hid.c
Original file line number Diff line number Diff line change
Expand Up @@ -479,7 +479,7 @@ static void *usbd_hid_get_desc(struct usbd_class_data *const c_data,
const struct device *dev = usbd_class_get_private(c_data);
const struct hid_device_config *dcfg = dev->config;

if (speed == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
return dcfg->hs_desc;
}

Expand Down
12 changes: 9 additions & 3 deletions subsys/usb/device_next/class/usbd_midi2.c
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,11 @@ static void *usbd_midi_class_get_desc(struct usbd_class_data *const class_data,

LOG_DBG("Get descriptors for %s", dev->name);

return (speed == USBD_SPEED_HS) ? config->hs_descs : config->fs_descs;
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
return config->hs_descs;
}

return config->fs_descs;
}


Expand Down Expand Up @@ -382,7 +386,8 @@ static uint8_t usbd_midi_get_bulk_in(struct usbd_class_data *const class_data)
const struct device *dev = usbd_class_get_private(class_data);
const struct usbd_midi_config *cfg = dev->config;

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return cfg->desc->if1_1_in_ep_hs.bEndpointAddress;
}

Expand All @@ -395,7 +400,8 @@ static uint8_t usbd_midi_get_bulk_out(struct usbd_class_data *const class_data)
const struct device *dev = usbd_class_get_private(class_data);
const struct usbd_midi_config *cfg = dev->config;

if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
if (USBD_SUPPORTS_HIGH_SPEED &&
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
return cfg->desc->if1_1_out_ep_hs.bEndpointAddress;
}

Expand Down
Loading