[应用相关]简单几步,让自定义USB设备也能免驱动运行(转载)
- 冰雪庆典
- 2025-10-02 03:39:35
- 4716
[应用相关]
简单几步,让自定义USB设备也能免驱动运行(转载)
[复制链接]
10648|59
电梯直达
楼主
楼主|
xtoolbox
发表于 2019-2-11 10:42
|
只看该作者
|只看大图
|倒序浏览
|阅读模式
USB, win, 编写, pi, 驱动程序
本帖最后由 xtoolbox 于 2019-2-11 10:38 编辑
原文地址:http://blog.xtoolbox.org/custom_usb_device_without_driver
做过USB设备开发的人,对USB中的自定义HID设备一定不陌生。很多时候为了通过USB接口与上位机进行通讯,都会采用自定义HID设备的方式。采用这种方式的通讯设备,优点是不需要写驱动程序,Windows上也有相应的API进行操作。这种方式的缺点是通讯速率比较慢,因为HID设备采用中断方式传输数据,对全速设备而言最快一秒钟只能传64K字节数据。而USB全速设备的理论带宽能达到1M字节每秒,连10%的性能都没有达到。
如果采用Bulk传输,则可以达到理论最大带宽,榨干USB总线的性能。但是采用Bulk传输的时候,设备要么做成串口这样的标准设备,免去驱动的编写,这样设备就不是自定义的,使用起来不如自定义设备那么方便。要么做成Bulk传输的自定义设备,但是这样就得写编写驱动程序,而驱动开发也是一个大坑。
那么能不能既能获得自定义的好处,又不进行驱动开发呢?答案是肯定的。
为了省掉自定义设备的驱动开发,微软操碎了心。在Win8或更高版本的系统中,微软集成了WinUSB的WCID设备。WinUSB是微软提供的一个USB设备的通用驱动程序,这个驱动早在XP SP2就开始提供了。使用这个驱动用户不需要编写内核层的驱动程序就能访问USB设备。WCID则是USB驱动一种新的匹配机制,在2012年左右引入的。通常USB设备都是通过VID和PID来进行匹配的,而使用了WCID之后,设备不通过VID和PID来匹配驱动,而是通过一个叫做兼容ID(Windows Compatible ID)的东西来匹配,这样就不用为每一个VID和PID不同的设备编写INF文件了。
需要说明的是,这里说的免驱动有两层含义:一层是不需要编写驱动程序,系统自带了驱动程序,只需写一个inf文件,如USB串口;另一层是不需要编写inf文件,系统会根据设备类型来安装驱动,这需要操作系统的支持。
对于WinUSB设备而言,在Win8之前不用编写驱动程序,但是需要编写inf文件,匹配设备。在Win8之后,如果设备支持WCID,连inf也不用编写。
下面将介绍如何在设备中增加对WCID的支持,让在能在Win8之后的系统上实在真正的即插即用。
首先得要有一个能用起来的自定义设备,在这个设备的设备描述符中,USB版本号设置为2.00,在这个设备的基础之上进行如下的修改:
第一步
响应ID为0xEE的字符描述符请求,字符描述的内容为:
复制{
0x12, /* bLength */
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
'M', 0x00, /* wcChar0 */
'S', 0x00, /* wcChar1 */
'F', 0x00, /* wcChar2 */
'T', 0x00, /* wcChar3 */
'1', 0x00, /* wcChar4 */
'0', 0x00, /* wcChar5 */
'0', 0x00, /* wcChar6 */
0x17, /* bVendorCode */
0x00, /* bReserved */
}
这一步是为了让Windows将我们的设备识别为WCID设备,以便进行下一步操作
第二步
响应请求号为0x17并且index为4的厂商自定义请求,返回内容为:
复制{
0x28, 0x00, 0x00, 0x00, /* dwLength */
0x00, 0x01, /* bcdVersion */
0x04, 0x00, /* wIndex */
0x01, /* bCount */
0,0,0,0,0,0,0, /* Reserved */
/* WCID Function */
0x00, /* bFirstInterfaceNumber */
0x01, /* bReserved */
/* CID */
'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00,
/* sub CID */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0,0,0,0,0,0, /* Reserved */
};
这一步是为了向Windows上报我们设备的WCID值,因为我们需要的是WinUSB的驱动,所以上报的内容就是WinUSB驱动的WCID:“WINUSB”。
上述内容添加完成后,将你的设备插入电脑,会发现设备能够自动安装上WinUSB驱动程序,如下图所示:
649725c60d98ded6fb.png (443.32 KB, 下载次数: 0)
下载附件
2019-2-11 10:10 上传
现在问题又来了,设备管理器中确实看到设备驱动已经安装,并且能正常使用,但是要怎么用呢。
微软为了让这个WinUSB能用起来,提供了对应的API。不过这个API用起来不是那么方便,libusb对WinUSB做了进一步的封装,提供了Windows和Linux上访问USB设备的统一接口。笔者对libusb按照Qt的风格又做了一次封装,封装成了QLibUsb。
QLibUsb用起来会更方便一些了。先用enumDevices枚举设备,枚举时可以指定VID和PID,也可以不指定。然后调用open打开设备。打开成功后通过readEndpoints得到设备所有的IN端点号,通过writeEndpoints得到设备所有的OUT端点号。调用write函数向指定的OUT端点写数据。当有IN端点收到数据时,会触发设备的epDataReady信号,在这个信号中对收到的数据进行处理。QLibUsb代码地址:https://github.com/xtoolbox/qtlua/tree/master/src/qlibusb
运行XToolbox.exe后,在USB View框中填入VID和PID后点击【Refresh】按钮搜索设备,在下拉框中选中需要测试的设备后点击Open打开设备。设备打开成功后会在下方显示输入端点和输出端点,选中一个输出端点,填入一些数据后,点击【send】按钮发送数据。当接收到数据时,会在对应的输入端点栏中显示。如下图:
上图中USB设备测试工具下载地址:Github镜像,21ic镜像
如果要在Win8以前的系统中支持WinUSB设备,还是需要编写inf文件,生成inf文件的工具下载:Github镜像,21ic镜像
关于WCID免驱动设备的更多内容在这里:https://github.com/xtoolbox/TeenyUSB/wiki/WCID-Device。
更多关于STM32上USB设备开发的资料也可以阅读《STM32 USB设备开发指南》,此书还在编写中。下载地址:Github镜像,21ic镜像
完整的免驱动自定义设备代码在code.tusb.org,也包括上述测试工具的源代码
回复
收藏5
举报
评分
参与人数 1威望 +3
收起
理由
forrest11
+ 3
很给力!
查看全部评分
相关帖子
• 有源晶振的线路图引脚图
• CW32L011直流无刷电机驱动无霍尔测试
• n32h760xxxx有内置高速usb phy吗
• STM32CubeIDE:如何避免丢失中间件代码更改USB
• 看看串口的最大波特率是多少
• HC32F0653+OLED显示测评
• CIU32F003小家电接口调试
• 37岁1200亿富豪,新赛道,新神话
• 关于英飞凌快充芯片CYPD7172-39BFXQT支持协议情况
• Traveo引脚分配工具
沙发
mmuuss586
发表于 2019-2-11 11:59
|
只看该作者
感谢分享
回复
收藏5
举报
板凳
WoodData
发表于 2019-2-11 14:27
|
只看该作者
好东西啊
回复
收藏5
举报
地板
zhifeng
发表于 2019-2-13 09:56
|
只看该作者
好东西,有时间研究下
回复
收藏5
举报
5楼
楼主|
xtoolbox
发表于 2019-2-13 10:17
|
只看该作者
zhifeng 发表于 2019-2-13 09:56
好东西,有时间研究下
其实很简单,只需要响应两个特殊的描述符请求就可以了
如果你的下载器采用这种方式,在新的Windows操作系统上就不用担心驱动签名的问题了
而且可以采用Bulk传输,速率会比HID的快很多
回复
收藏5
举报
6楼
guanjiaer
发表于 2019-3-3 12:33
|
只看该作者
非常感谢楼主分享
回复
收藏5
举报
7楼
heimaojingzhang
发表于 2019-3-3 12:41
|
只看该作者
非常感谢楼主分享
回复
收藏5
举报
8楼
keaibukelian
发表于 2019-3-3 12:52
|
只看该作者
看着确实很简单啊
回复
收藏5
举报
9楼
labasi
发表于 2019-3-3 13:01
|
只看该作者
太感谢分享了 这个资料很哟用
回复
收藏5
举报
10楼
paotangsan
发表于 2019-3-3 13:14
|
只看该作者
免驱动这个很有吸引力
回复
收藏5
举报
11楼
renzheshengui
发表于 2019-3-3 13:42
|
只看该作者
看起来很容易操作啊
回复
收藏5
举报
12楼
wowu
发表于 2019-3-3 13:59
|
只看该作者
非常感谢楼主分享
回复
收藏5
举报
13楼
xiaoqizi
发表于 2019-3-3 14:20
|
只看该作者
大赞楼主 好资料
回复
收藏5
举报
14楼
liulangmao
发表于 2020-6-2 16:34
|
只看该作者
楼主,为什么我的设备没有接收到 index 0xee 的字符串请求呢?
另外再请教一下,usb 3.0的设备支持WCID这种方式吗?
回复
收藏5
举报
15楼
Wxy8030
发表于 2020-6-2 22:34
来自手机
|
只看该作者
这个要标记一下。
回复
收藏5
举报
16楼
jemy00
发表于 2020-6-3 10:44
|
只看该作者
mark
回复
收藏5
举报
17楼
N_EMBED
发表于 2020-6-3 12:22
|
只看该作者
F723的高速跑TeenyUSB,速度能到40MB/s吗?
能否分享TeenyUSB在F407实现自定义设备批量传输的MDK例程呢?
回复
收藏5
举报
18楼
uiint
发表于 2020-6-3 19:49
|
只看该作者
什么是HID规范的USB设备
回复
收藏5
举报
19楼
hellosdc
发表于 2020-6-3 19:49
|
只看该作者
自制USB设备免驱问题?
回复
收藏5
举报
20楼
mituzu
发表于 2020-6-3 19:49
|
只看该作者
回复
收藏5
举报