完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我实现这个winu***设备主要是为了弄一个DAP下载器。
虽然网上有很多CMSIS_DAP的例程,但这些例程都是用的都不是ST的u***库,但我想使用ST的u***库来实现winu***,顺带加入一个虚拟串口。我不使用CubeMX来直接生成u***代码,我在HAL库软件包的MiddlewaresSTSTM32_USB_Host_Library目录下发现ST是有u***驱动库的。 其中有一些文件有_template后缀,一看就是一个示例。 把文件一股脑添加到工程中 这是我已经修改号之后的文件,并且还另外添加了一些我自己的文件。这些文件不直接操作底层。 别忘了把这三个文件加进去 这三个文件是最底层的u***驱动文件,是用于直接操作底层的。 现在说说有那些坑吧 从上面已经可以知道我的工程的u***结构了。 使用winu***,需要使用Microsoft OS描述符,目前这个有两个版本,Microsoft OS 1.0和Microsoft OS 2.0而我使用的是Microsoft OS 2.0,版本号肯定是高的号啊。最坑的是这个,划线的部分是配置描述中的配置号。配置描述用来限制属性在哪个配置上实现的。而这个配置号应该指的是配置的编号,而USB配置的编号应该是从1开始的(如果我没有说错的话)。并且,我的配置描述符里指定的配置编号也是1,但奇怪的是,图中红色划线的那端必须要为0设备才能被识别为一个winu***设备。是这里的0代表了配置1?我也不太明白。反正设置成0就能工作了。这个问题简直有毒,因为我要实现的u***配置只有一个,图中注释的描述符不要也行,我就直接注释掉了。 顺便贴上描述符 这个描述符实现了两个winu***设备,GUID分别为{CDB3B5AD-293B-4663-AA36-1AAE46463776}(CMSIS-DAP使用)和{9DEFA478-613B-0000-0000-000000000000}(我自己实现的winu***) #define cLittleTo2Bytes(value) ((value)&0xFFU),(((value)>>8)&0xFFU) #define cLittleTo4Bytes(value) ((value)&0xFFU),(((value)>>8)&0xFFU),(((value)>>16)&0xFFU),(((value)>>24)&0xFFU) #define MS_OS_20_DescriptorSet_Size (322U) __align(4) const unsigned char MS_OS_20_DescriptorSet[MS_OS_20_DescriptorSet_Size]={ // **************** Microsoft OS 2.0 Descriptor Set Header **************** cLittleTo2Bytes(10U), /* wLength */ cLittleTo2Bytes(MS_OS_20_SET_HEADER_DESCRIPTOR), /* wDescriptorType */ cLittleTo4Bytes(0x06030000U), /* dwWindowsVersion: 0x06030000 for Windows Blue */ cLittleTo2Bytes(MS_OS_20_DescriptorSet_Size), /* wTotalLength */ // **************** Microsoft OS 2.0 configuration subset header **************** // cLittleTo2Bytes(8U), /* wLength */ // cLittleTo2Bytes(MS_OS_20_SUBSET_HEADER_CONFIGURATION), /* wDescriptorType */ // 0x00U, /* bConfigurationValue 如果启用此段 这个必须要为0(实际测试得出) 但USB只有配置1在工作 不知道是微软驱动的bug还是我有那些疏忽了 */ // 0x00U, /* bReserved */ // cLittleTo2Bytes(320U), /* wTotalLength */ // **************** Microsoft OS 2.0 function subset header **************** cLittleTo2Bytes(8U), /* wLength */ cLittleTo2Bytes(MS_OS_20_SUBSET_HEADER_FUNCTION), /* wDescriptorType */ 0x00U, /* bFirstInterface 该方法对应的第一个接口号 */ 0x00U, /* bReserved */ cLittleTo2Bytes(156U), /* wSubsetLength */ // **************** Microsoft OS 2.0 compatible ID descriptor **************** cLittleTo2Bytes(20U), /* wLength */ cLittleTo2Bytes(MS_OS_20_FEATURE_COMPATIBLE_ID), /* wDescriptorType */ 'W','I','N','U','S','B',0x00U,0x00U, /* CompatibleID */ 0x00U,0x00U,0x00U,0x00U,0x00U,0x00U,0x00U,0x00U, /* SubCompatibleID */ // **************** Microsoft OS 2.0 registry property descriptor **************** cLittleTo2Bytes(128U), /* wLength */ cLittleTo2Bytes(MS_OS_20_FEATURE_REG_PROPERTY), /* wDescriptorType */ cLittleTo2Bytes(MS_OS_20_REG_PROPERTY_PropertyDataType_REG_SZ), /* wPropertyDataType */ cLittleTo2Bytes(40U), /* wPropertyNameLength */ 'D',0x00U, 'e',0x00U, 'v',0x00U, 'i',0x00U, 'c',0x00U, 'e',0x00U, 'I',0x00U, 'n',0x00U, 't',0x00U, 'e',0x00U, 'r',0x00U, 'f',0x00U, 'a',0x00U, 'c',0x00U, 'e',0x00U, 'G',0x00U, 'U',0x00U, 'I',0x00U, 'D',0x00U, 0x00U,0x00U, /* PropertyName: "DeviceInterfaceGUID" */ cLittleTo2Bytes(78U), /* wPropertyDataLength */ '{',0x00U, 'C',0x00U, 'D',0x00U, 'B',0x00U, '3',0x00U, 'B',0x00U, '5',0x00U, 'A',0x00U, 'D',0x00U, '-',0x00U, '2',0x00U, '9',0x00U, '3',0x00U, 'B',0x00U, '-',0x00U, '4',0x00U, '6',0x00U, '6',0x00U, '3',0x00U, '-',0x00U, 'A',0x00U, 'A',0x00U, '3',0x00U, '6',0x00U, '-',0x00U, '1',0x00U, 'A',0x00U, 'A',0x00U, 'E',0x00U, '4',0x00U, '6',0x00U, '4',0x00U, '6',0x00U, '3',0x00U, '7',0x00U, '7',0x00U, '6',0x00U, '}',0x00U, 0x00U,0x00U, /* PropertyData: "{CDB3B5AD-293B-4663-AA36-1AAE46463776}" */ // **************** Microsoft OS 2.0 function subset header **************** cLittleTo2Bytes(8U), /* wLength */ cLittleTo2Bytes(MS_OS_20_SUBSET_HEADER_FUNCTION), /* wDescriptorType */ 0x01U, /* bFirstInterface 该方法对应的第一个接口号 */ 0x00U, /* bReserved */ cLittleTo2Bytes(156U), /* wSubsetLength */ // **************** Microsoft OS 2.0 compatible ID descriptor **************** cLittleTo2Bytes(20U), /* wLength */ cLittleTo2Bytes(MS_OS_20_FEATURE_COMPATIBLE_ID), /* wDescriptorType */ 'W','I','N','U','S','B',0x00U,0x00U, /* CompatibleID */ 0x00U,0x00U,0x00U,0x00U,0x00U,0x00U,0x00U,0x00U, /* SubCompatibleID */ // **************** Microsoft OS 2.0 registry property descriptor **************** cLittleTo2Bytes(128U), /* wLength */ cLittleTo2Bytes(MS_OS_20_FEATURE_REG_PROPERTY), /* wDescriptorType */ cLittleTo2Bytes(MS_OS_20_REG_PROPERTY_PropertyDataType_REG_SZ), /* wPropertyDataType */ cLittleTo2Bytes(40U), /* wPropertyNameLength */ 'D',0x00U, 'e',0x00U, 'v',0x00U, 'i',0x00U, 'c',0x00U, 'e',0x00U, 'I',0x00U, 'n',0x00U, 't',0x00U, 'e',0x00U, 'r',0x00U, 'f',0x00U, 'a',0x00U, 'c',0x00U, 'e',0x00U, 'G',0x00U, 'U',0x00U, 'I',0x00U, 'D',0x00U, 0x00U,0x00U, /* PropertyName: "DeviceInterfaceGUID" */ cLittleTo2Bytes(78U), /* wPropertyDataLength */ '{',0x00U, '9',0x00U, 'D',0x00U, 'E',0x00U, 'F',0x00U, 'A',0x00U, '4',0x00U, '7',0x00U, '8',0x00U, '-',0x00U, '6',0x00U, '1',0x00U, '3',0x00U, 'B',0x00U, '-',0x00U, '0',0x00U, '0',0x00U, '0',0x00U, '0',0x00U, '-',0x00U, '0',0x00U, '0',0x00U, '0',0x00U, '0',0x00U, '-',0x00U, '0',0x00U, '0',0x00U, '0',0x00U, '0',0x00U, '0',0x00U, '0',0x00U, '0',0x00U, '0',0x00U, '0',0x00U, '0',0x00U, '0',0x00U, '0',0x00U, '}',0x00U, 0x00U,0x00U /* PropertyData: "{9DEFA478-613B-0000-0000-000000000000}" */ }; 还有另外一个坑 还好Microsoft OS 2.0需要BOS支持,这个库文件相当于提示我需要将bcdUSB该为0x0201。(如果我是用现有的例程改的话,可能没有这个宏定义判断,怕是要被坑死在这)。 枚举成功!,由三个组成 这个图是用USBlyzer看到的,它会把属于同一个物理设备的u***设备归到一栏。如果用windows自带的设备管理器去看,会发现这三个设备这一个哪一个的,需要到处找。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1856浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 22:31 , Processed in 1.163107 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号