Commit fe3c001e authored by Johann Fischer's avatar Johann Fischer Committed by Fabio Baltieri
Browse files

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: default avatarJohann Fischer <johann.fischer@nordicsemi.no>
parent 8457f502
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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,			\
		))							\
	}

/**
+8 −0
Original line number Diff line number Diff line
@@ -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;
+18 −4
Original line number Diff line number Diff line
@@ -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:
			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:
			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:
			if (USBD_SUPPORTS_HIGH_SPEED) {
				hs_desc->iSerialNumber = desc_nd->str.idx;
			}

			fs_desc->iSerialNumber = desc_nd->str.idx;
			break;
		default:
+12 −6
Original line number Diff line number Diff line
@@ -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);

	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);

	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);

	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);