From 7317913efa6f9076b1c5d12b6ba810ddceafc4ca Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Fri, 26 Dec 2025 12:41:31 +0800 Subject: [PATCH] fix: fix winusb string and audio macro Signed-off-by: sakumisu <1203593632@qq.com> --- common/usb_def.h | 5 ++- .../audio_v1_mic_speaker_multichan_template.c | 12 ++--- docs/source/demo/usbd_winusb.rst | 45 ++++++++++--------- 3 files changed, 34 insertions(+), 28 deletions(-) diff --git a/common/usb_def.h b/common/usb_def.h index ef704b91..07ef435c 100644 --- a/common/usb_def.h +++ b/common/usb_def.h @@ -737,14 +737,15 @@ struct usb_desc_header { #define USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_LEN 28 #define USB_MSOSV1_STRING_DESCRIPTOR_INIT(vendor_code) \ - 0x12, /* bLength */ \ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ \ + 0x12, /* bLength */ \ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ \ 'M', 0, /* bString[0] */ \ 'S', 0, /* bString[1] */ \ 'F', 0, /* bString[2] */ \ 'T', 0, /* bString[3] */ \ '1', 0, /* bString[4] */ \ '0', 0, /* bString[5] */ \ + '0', 0, /* bString[6] */ \ vendor_code, /* bMS_VendorCode */ \ 0x00 /* bPad */ diff --git a/demo/audio_v1_mic_speaker_multichan_template.c b/demo/audio_v1_mic_speaker_multichan_template.c index 30fee1e2..5083f96b 100644 --- a/demo/audio_v1_mic_speaker_multichan_template.c +++ b/demo/audio_v1_mic_speaker_multichan_template.c @@ -123,12 +123,12 @@ AUDIO_AS_FEEDBACK_DESCRIPTOR_LEN(1)) #endif -#define AUDIO_AC_SIZ (AUDIO_SIZEOF_AC_HEADER_DESC(2) + \ - AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ - AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ +#define AUDIO_AC_SIZ (AUDIO_SIZEOF_AC_HEADER_DESC(2) + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM, 1) + \ AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC) #ifdef CONFIG_USBDEV_ADVANCE_DESC diff --git a/docs/source/demo/usbd_winusb.rst b/docs/source/demo/usbd_winusb.rst index bd790188..0a6d4de9 100644 --- a/docs/source/demo/usbd_winusb.rst +++ b/docs/source/demo/usbd_winusb.rst @@ -1,21 +1,42 @@ usbd_winusb =============== -本节主要介绍 winusb 驱动。winusb 是 windows 为了让用户友好的访问 USB 自定义类设备提供的一套通用驱动,其实本质就是 CDC ACM。 -WINUSB 版本根据 USB 版本分为 V1/V2 版本,V2 版本需要包含 BOS 描述符,V1 版本不需要。V2 版本需要在设备描述符中设置为 USB2.1 的版本号。 +本节主要介绍 winusb 驱动。winusb 是 windows 为了让用户友好的访问 USB 自定义类设备提供的一套通用驱动,其实本质就是 CDC ACM,只不过没有设置波特率的命令。 +WINUSB 版本根据 USB 版本分为 V1/V2 版本,V2 版本需要包含 BOS 描述符,V1 版本不需要。 **V2 版本需要在设备描述符中设置为 USB2.1 的版本号**。 -.. note:: 如果使用复合设备,必须使用 V2 版本的 winusb 驱动。 +.. note:: 更换 winusb 描述符任意配置可能会枚举成功但是无法识别设备,需要删除 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags 下所有注册表项,重新插拔设备后生效。 - V1 版本注册描述符 .. code-block:: C + const struct usb_descriptor winusbv1_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback, + .msosv1_descriptor = &msosv1_desc + }; + + OR + usbd_msosv1_desc_register(busid, &msosv1_desc); - V2 版本注册描述符 .. code-block:: C + const struct usb_descriptor winusbv2_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback, + .msosv2_descriptor = &msosv2_desc, + .bos_descriptor = &bos_desc, + }; + + OR + usbd_bos_desc_register(busid, &bos_desc); usbd_msosv2_desc_register(busid, &msosv2_desc); @@ -31,20 +52,4 @@ WINUSB 版本根据 USB 版本分为 V1/V2 版本,V2 版本需要包含 BOS /* Endpoint IN 1 */ USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00), -- 其余操作与 CDC ACM 相同,不再赘述 - -在 V2 版本中,WINUSB 需要提供 WCID 描述符,有两个宏,分别是 `USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_INIT` 和 `USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT`,这里需要注意, -前者用于单 WINUSB 设备(也就是接口总数只能是1),后者用于复合设备,可以使用 1 ~ 多个 WINUSB 接口的设备。因此,即使同样是 1个 WINUSB 设备,不同情况宏的配置也是不一样的,只能说,微软工程师的脑回路就是跟正常人不一样。 - -.. code-block:: C - - const uint8_t WINUSB_WCIDDescriptor[] = { - #if WINUSB_NUM == 1 - USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT(10 + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_LEN), - USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_INIT(), - #else - USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT(10 + WINUSB_NUM * USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_LEN), - USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT(0x00), - USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT(0x01), - #endif - }; \ No newline at end of file +- 读写操作与 CDC ACM 相同,不再赘述 \ No newline at end of file