完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我实现这个winu***设备主要是为了弄一个DAP下载器。
虽然网上有很多CMSIS_DAP的例程,但这些例程都是用的都不是ST的u***库,但我想使用ST的u***库来实现winu***,顺带加入一个虚拟串口。我不使用CubeMX来直接生成u***代码,我在HAL库软件包的MiddlewaresSTSTM32_USB_Host_Library目录下发现ST是有u***驱动库的。 把文件一股脑添加到工程中 别忘了把这三个文件加进去 这三个文件是最底层的u***驱动文件,是用于直接操作底层的。 现在说说有那些坑吧 从上面已经可以知道我的工程的u***结构了。 使用winu***,需要使用Microsoft OS描述符,目前这个有两个版本,Microsoft OS 1.0和Microsoft OS 2.0而我使用的是Microsoft OS 2.0,版本号肯定是高的号啊。 顺便贴上描述符 这个描述符实现了两个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自带的设备管理器去看,会发现这三个设备这一个哪一个的,需要到处找。 |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
3406 浏览 0 评论
3381 浏览 9 评论
3067 浏览 16 评论
3556 浏览 1 评论
9198 浏览 16 评论
1314浏览 3评论
677浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
670浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2421浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1983浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-3-5 04:57 , Processed in 1.242188 second(s), Total 77, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191