Windows下的USB驱动程序开发步骤?
USB是通用串行总线的英文缩写,进行USB驱动的开发就是进行USB设备驱动的开发。
USB规范义了很多的USB设备类型,如用于大容量存储的设备类型(如U盘),用于视频传输的设备类型(如UVC摄像头),这些设备使用USB总线协议与主机进行通讯,实现USB设备定义的功能。
进行USB驱动的开发,实际上就是在不同的操作系统下实现USB固件信息在主机端的正常枚举和数据通讯。为里我们以Windows环境下的USB驱动开发为例。
学习USB规范
做USB驱动开发,首先得了解USB的基本概念。如果我们对USB总线都不了解,是无法正常的进行USB驱动开发的。
USB规范至今,版本已经从USB1.0到现面的USB4,不过我们平常所开发的USB设备一般是USB2.0和少量的USB3.0设备驱动。
学习USB规范主要是学习2点。
- USB的描述符
- USB的通讯类型
USB的描述符
USB设备定义了一系列描述符,如设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,对于一些其它的设备如HID设备还会用到HID描述符,UVC/UAC设备会用到接口关联描述符和其它自定义的其它描述符。
USB设备在被插入电脑后一般是进行USB设备的枚举,这里主要是主机读取USB描述符认知USB设备的过程。
USB描述符一般第一次获取的是设备描述符,其次是配置描述符(分2次获取),第二次获取配置描述符会将其它描述符如接口描述符一并获取。最后一般是根据设备类型和定义,选择性的获取如字符串描述符等。
USB的通讯类型
USB的通读类型为四种,分别是控制传输,中断传输,同步传输和批量传输。
在USB的枚举过程中,是使用控制传输进行的。在设备的实际使用过程中,则根据端点描述符的配置使用其对应的传输类型,如大容量数据存类型为批量传输。
了解操作系统驱动架构
Windows的驱动模型使用最广泛的是WDM驱动架构,最新的驱动架构是WDF.
需要了解的关系知识点是IRP,DRIVER_OBJECT,DEVICE_OBJECT和专用于USB数据通讯的URB等结构体。当然也需要选择地了解Windows内核其它知识,如自旋锁SpinLock,KEVENT,LIST_ENTRY等。
驱动开发实践
这里是最复杂,也是最容易出成绩的地方。
Windows在其对应的驱动程序开发包中包括了一些USB驱动示例程序。不过这些工程一般只能用于学习和了解USB的基本操作。比较有意义的代码是bulkusb这个工程,有助于我们对于USB驱动程序开发的了解。
对上只是实现的是自定义设备驱动。
如果想实现标准的USB外设,如HID键盘,UVC摄像头这些标准的设备,是需要了解USB和Windows总线相关的知识的。微软关于此只提供了一个简单的虚拟总线的驱动toaster,还是一个演示工程,参考意义大于实际意义。
题外话
USB中文网在于传播USB技术,也开发了一部分USB虚拟设备,如虚拟USB-HID键盘,虚拟USB-HID鼠标,虚拟USB-UVC摄像头,虚拟USB-UAC麦克风/扬声器,虚拟USB-HID触摸屏等USB设备。后续本站将上线这些产品,用于供大家是行技术交流。
看雪提供的虚拟键鼠:https://bbs.pediy.com/thread-74327.htm