WinUSB
+ -

CH569设备USB2.0支持WCID-WINUSB-基于MSOS-V2.0

2025-09-04 0 0

由于MSOS1.0是通过0xee的字符串触发的,且需要设备描述符bcdUSB的值设为0x200,在获取信息时需要:

  • 获取字符串描述符(0xee),解析出vendorId
  • 发送vendor控制请求,Index=04 00 获取兼容ID的内容
  • 发送vendor控制请求,Index=05 00 获取Winusb驱动设备的DeviceInterfaceGUIDs(实际好像不发生)

对于MSOS-V2.0,其流程如下:

BOS描述符内容如下:

 const uint8_t WINUSB20_WCIDBOS [33] = 
 {
    ///////////////////////////////////////
    /// WCID20 BOS descriptor
    ///////////////////////////////////////
    0x05,                                             /* bLength */
    0x0f,                                /* bDescriptorType */
    0x21, 0x00,                                       /* wTotalLength */
    0x01,                                             /* bNumDeviceCaps */

    ///////////////////////////////////////
    /// WCID20 device capability descriptor
    ///////////////////////////////////////
    0x1c,                                             /* bLength */
    0x10,                                             /* bDescriptorType */
    0x05,                                             /* bDevCapabilityType 平台描描述符 */
    0x00,                                             /* bReserved */
    0xdf, 0x60, 0xdd, 0xd8, 0x89, 0x45, 0xc7, 0x4c,   /* bPlatformCapabilityUUID_16 */
    0x9c, 0xd2, 0x65, 0x9d, 0x9e, 0x64, 0x8a, 0x9f,   /* bPlatformCapabilityUUID_16 */
    0x00, 0x00, 0x03, 0x06,                           /* dwWindowsVersion */
    sizeof(WINUSB20_WCIDDescriptorSet) & 0xff, (sizeof(WINUSB20_WCIDDescriptorSet)>>8) &0xff ,/* wDescriptorSetTotalLength */
    1,                                 /* bVendorCode */
    0x00,                                             /* bAltEnumCode */
};

171159391611
通过BUSHOUND模拟:
17153444176

然后系统解析BOS中的平台描述符,解析出vendorid(这里为1),OS2.0描述符集总长度。
然后系统通过index=07 00 下发vendor请求
171418334006

通过BUSHOUND模拟请求:
171618812786

const uint8_t WINUSB20_WCIDDescriptorSet [162] =
 {
    ///////////////////////////////////////
    /// WCID20 descriptor set descriptor
    ///////////////////////////////////////
    0x0a, 0x00,                                       /* wLength */
    0x00, 0x00,                                       /* wDescriptorType */
    0x00, 0x00, 0x03, 0x06,                           /* dwWindowsVersion */
    0xa2, 0x00,                                       /* wDescriptorSetTotalLength */
    ///////////////////////////////////////
    /// WCID20 compatible ID descriptor
    ///////////////////////////////////////
    0x14, 0x00,                                       /* wLength */
    0x03, 0x00,                                       /* wDescriptorType */
    /* WINUSB */
    'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00,         /* cCID_8 */
    /*  */
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   /* cSubCID_8 */
    ///////////////////////////////////////
    /// WCID20 registry property descriptor
    ///////////////////////////////////////
    0x84, 0x00,                                       /* wLength */
    0x04, 0x00,                                       /* wDescriptorType */
    0x07, 0x00,                                       /* wPropertyDataType */
    0x2a, 0x00,                                       /* wPropertyNameLength */
    /* DeviceInterfaceGUIDs */
    'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00,       /* wcPropertyName_21 */
    'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00,       /* wcPropertyName_21 */
    't', 0x00, 'e', 0x00, 'r', 0x00, 'f', 0x00,       /* wcPropertyName_21 */
    'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00,       /* wcPropertyName_21 */
    'U', 0x00, 'I', 0x00, 'D', 0x00, 's', 0x00,       /* wcPropertyName_21 */
    0x00, 0x00,                                       /* wcPropertyName_21 */
    0x50, 0x00,                                       /* wPropertyDataLength */
    /* {1D4B2365-4749-48EA-B38A-7C6FDDDD7E26} */
    '{', 0x00, '1', 0x00, 'D', 0x00, '4', 0x00,       /* wcPropertyData_40 */
    'B', 0x00, '2', 0x00, '3', 0x00, '6', 0x00,       /* wcPropertyData_40 */
    '5', 0x00, '-', 0x00, '4', 0x00, '7', 0x00,       /* wcPropertyData_40 */
    '4', 0x00, '9', 0x00, '-', 0x00, '4', 0x00,       /* wcPropertyData_40 */
    '8', 0x00, 'E', 0x00, 'A', 0x00, '-', 0x00,       /* wcPropertyData_40 */
    'B', 0x00, '3', 0x00, '8', 0x00, 'A', 0x00,       /* wcPropertyData_40 */
    '-', 0x00, '7', 0x00, 'C', 0x00, '6', 0x00,       /* wcPropertyData_40 */
    'F', 0x00, 'D', 0x00, 'D', 0x00, 'D', 0x00,       /* wcPropertyData_40 */
    'D', 0x00, '7', 0x00, 'E', 0x00, '2', 0x00,       /* wcPropertyData_40 */
    '6', 0x00, '}', 0x00, 0x00, 0x00, 0x00, 0x00,     /* wcPropertyData_40 */
};

这里的 {1D4B2365-4749-48EA-B38A-7C6FDDDD7E26}为设备接口GUID.
通过WINOBJ可以看到:
171802238541

查看设备注册表信息:
172109381473

相关代码修改:

UINT16 GetDesc()
{
    UINT16 SetupLen = 0;
    switch( UsbSetupBuf->wValueH )
    {
        case USB_DESCR_TYP_DEVICE:
            pDescr = (UINT8 *)hs_device_descriptor;
            SetupLen = ( SetupReqLen > sizeof(hs_device_descriptor) )? sizeof(hs_device_descriptor):SetupReqLen;
            break;
        case USB_DESCR_TYP_CONFIG:
            pDescr = (UINT8 *)hs_config_descriptor;
            SetupLen = (SetupReqLen > sizeof(hs_config_descriptor) )? sizeof(hs_config_descriptor):SetupReqLen;
            break;
        case 0xf:
            pDescr = (UINT8 *)WINUSB20_WCIDBOS;
            SetupLen = (SetupReqLen > sizeof(WINUSB20_WCIDBOS) )? sizeof(WINUSB20_WCIDBOS):SetupReqLen;
            break;
            ...
    }
    ...
}
UINT16 U20_NonStandard_Request_Deal()
{   
    UINT8 endp_dir;

    SetupLen = UsbSetupBuf->wLength;
    endp_dir = UsbSetupBuf->bRequestType & 0x80;
    UINT16 len = 0;

    SetupLen = USB_DESCR_UNSUPPORTED;
    switch(SetupReq)
    {
        case 0x01://vendor id
            switch(UsbSetupBuf->wIndexL)
            {
                case 0x04: //兼容ID
                    pDescr = (UINT8 *)CompactId20;
                    SetupLen = ( SetupReqLen > sizeof(CompactId20) )? sizeof(CompactId20):SetupReqLen;
                   break;
                case 0x05: //接口GUID
                    pDescr = (UINT8 *)COMP_IF3_WCIDProperties;
                    SetupLen = sizeof(COMP_IF3_WCIDProperties);
                    break;
                case 0x07:
                    pDescr = (UINT8 *)WINUSB20_WCIDDescriptorSet;
                    SetupLen = sizeof(WINUSB20_WCIDDescriptorSet);;
                    break;
               default:
                   break;
               }
               break;
        default:
            break;
    }

  if( (SetupLen != USB_DESCR_UNSUPPORTED) && (SetupLen != 0))
  {
      len = (SetupLen >= U20_UEP0_MAXSIZE ) ? U20_UEP0_MAXSIZE : SetupLen;
      if(endp_dir)
      {
          memcpy(endp0RTbuff, pDescr, len );
          pDescr += len;
      }
      SetupLen -= len;
  }

   printf("SetupLen=%d\r\n",SetupLen);

   return len;
}
HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

USB3.2超高速 BOS描述符
USB3.2规范新增加了一个灵活且可扩展的框架,用于描述设备级功能特性。BOS(Binary Device Object Store)是与配置描述符类似的一个根描述符。使用该描述符,可以访问一系列相关描述符的基本描述符。和配置描述符一样,主机通过读取BOS描述符的wTotalLength字段中获......
USB WCID设备中特殊字符描述符
WCID全称”Windows Compatible ID,中文名为“Windows兼容ID”。 WCID设备是一种向Windows系统提供额外信息的USB设备,以便于自动安装驱动程序,并在某些情况下允许立即访问。USB设备驱动的匹配安装一般是以VID/PID进行驱动匹配的,但WCID设备却是根据C......
使用WinUSB读写USB设备
Windows为WinUSB设备提供了API,主要通过以下几个步骤访问设备。通过扩展描述符中的GUID查看接口的路径用接口的路径作为参数,调用CreateFile打开接口使用WinUsb_Initialize得到WinUSB句柄通过WinUsb_WritePipe和WinUsb_ReadPipe对......
使用微软系统描述符1.0制作免驱动自定义USB设备
本文作者XTOOLBOX,本站得到了作者本人的转载授权。本文介绍如何使用微软的操作系统描述符来实现自定义USB设备在Windows系统上的免驱动使用。前言在Linux上开发USB设备是不需要特别的驱动的,Linux内核的USB驱动会将USB设备的基本操作都暴露到应用层,由应用层来完成实际的业......
使用微软系统描述符2.0制作免驱动自定义USB设备
本文作者XTOOLBOX,本站得到了作者本人的转载授权。前言在《使用微软系统描述符1.0制作免驱动自定义USB设备》一文中,介绍了如何使用1.0版本的系统描述符来制作免驱动设备,这里将介绍如何使用2.0版本的系统描述符来制作免驱动设备。无论是1.0还是2.0,都是为了让系统给设备安装WinUS......
简单几步,让自定义USB设备也能免驱动运行
本文作者XTOOLBOX,本站得到了作者本人的转载授权。更完整的说明见《使用微软系统描述符1.0制作免驱动自定义USB设备》和《使用微软系统描述符2.0制作免驱动自定义USB设备》做过USB设备开发的人,对USB中的自定义HID设备一定不陌生。很多时候为了通过USB接口与上位机进行通讯,都会......
UVC红外相机的枚举过程及BOS数据包解析
UVC红外相机和普通的相机在枚举过程中其实并特别的区别。可能惟一的区别就是一般的普通彩色相机并没有获取到BOS描述符,而红外相机必定含有BOS描述符,并且由于BOS描述符的引入,使得基于UVC规范的基础上实现了红外相机。通过上图可以看到,除过BOS之外,其它的和普通的UVC彩色相机的枚举过程是一致的......
USB WCID 设备开发
什么是 WCID 设备?WCID 代表的是“Windows Compatible ID”,即Windows 兼容 ID。它是一种向 Windows 系统提供额外信息的 USB 设备,以便于自动安装驱动程序,在大多数情况下即插即用。在通常的情况下,除非是人体学输入设备 (HID) 或是大容量存储设备......
CH569设备USB2.0支持WCID-WINUSB-基于MSOS-V1.0
CH569是USB3.0设备,WCH给的示例CH372Device本身USB3.0是支持WINUSB的,但是USB2.0不支持(不是不支持,是代码没有写)。故这里对USB2.0代码完善支持,让其通过微软系统描述符1.0支持WINUSB.关于微软系统描述符1.0详见https://www.usbzh......
CH569设备USB2.0支持WCID-WINUSB-基于MSOS-V2.0
由于MSOS1.0是通过0xee的字符串触发的,且需要设备描述符bcdUSB的值设为0x200,在获取信息时需要:获取字符串描述符(0xee),解析出vendorId发送vendor控制请求,Index=04 00 获取兼容ID的内容发送vendor控制请求,Index=05 00 获取Winu......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!