Windows下USB百科
+ -

Windows下的USB驱动程序开发步骤?

2021-05-22 1256 0

USB是通用串行总线的英文缩写,进行USB驱动的开发就是进行USB设备驱动的开发。

USB规范义了很多的USB设备类型,如用于大容量存储的设备类型(如U盘),用于视频传输的设备类型(如UVC摄像头),这些设备使用USB总线协议与主机进行通讯,实现USB设备定义的功能。

进行USB驱动的开发,实际上就是在不同的操作系统下实现USB固件信息在主机端的正常枚举和数据通讯。为里我们以Windows环境下的USB驱动开发为例。

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

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 篇笔记 写笔记

Windows下的USB驱动程序开发步骤?
USB是通用串行总线的英文缩写,进行USB驱动的开发就是进行USB设备驱动的开发。USB规范义了很多的USB设备类型,如用于大容量存储的设备类型(如U盘),用于视频传输的设备类型(如UVC摄像头),这些设备使用USB总线协议与主机进行通讯,实现USB设备定义的功能。进行USB驱动的开发,实际上就是在......
Windows下USB驱动SET_INTERFAC失败 bad pipe flags
最近在调试一个UVC摄像头,由于项目的原因,需要在驱动下对UVC协议进行模拟,以实现在驱支层打下固件,从而读取数据的要求。本以为这是一个很简单的事,没想到还是耽搁了一点时间,花了一点小功夫。打开USB摄像头,对UVC协议的模拟主要是是USB特定类请求的模拟,通过我们的基础知识可知道,上层应用或驱动......
同样的soc板子用的同一个USB驱动设备名称,厂商和产品ID都一样,使用什么方法来区别?
今天在本站USB中文网 http://www.usbzh.com 的技术交流群中有位同学提问:各位老铁,我们自己的soc板子用的usb一个驱动,那么usb设备名称,厂商和产品ID就一样了,这个是没有方法来区别下比如一个PC同时插入我们的3块USB对于这个问题,就是典型的多个相同的板板接入电脑......
Windows下USB驱动同步URB转IRP请求函数代码
URB和IRP类似,只不过一个应用于通用的Windows驱动,一个专职于USB。USB的URB的负载是IRP,其通过负载到IRP时,然后使用通用的Windows IRP请求发向下层目标USB设备。USB与IRP的关联是通过IRP的IO_STACK_LOCATION的 IoStack->Para......
Windows下USB驱动获取USB设备各种描述符代码函数封装
USB设备的一个种要的概念就是各种描述符,如设备描述符,配置描述符,字符串描述符等等。在设备驱动驱动开发中,通过读取这些描述符可以知道该USB设备的相关信息。这里我们对在Windows驱动开发过程的获取USB设备的描述符进行代码封装成函数GetDescriptor。NTSTATUS GetDesc......
Windows下USB驱动异步URB转IRP请求函数代码
URB有同步请求,也有异步请求。这里微软官方提供了一个异步请求URB的代码示例// The SubmitUrbASync routine submits an URB asynchronously.//// Parameters://// Parameters:// Devic......
Windows下USB驱动同步URB转IRP请求函数代码-改进版
URB的同步调用一般使用:Windows下USB驱动同步URB转IRP请求函数代码 http://www.usbzh.com/article/detail-547.html但是,在某些特定的情况下,有时会因为下底设备并没有完成而挂死。这里提供一种超时取消IRP的方法,同时考虑到了线和切换的情况。这里......
Windows下USB驱动安装设备丢失inf文件中ClassGuid出现未分类
今天同事突然报了一个情况,说安装了驱动之后设备为什么在基它分类中,打开设备管理器中可以看到:按设备树的方式显示:从上面的的图中可以看到,根设备驱动归为其它设备分类中了。我们知道,设备的分类可以通过INF文件中的ClassGuid来进行分类,我记得我在INF文件中有指定其为USB分类啊,通过设备管理......
Window系统USB驱动提交URB并超时示例代码
Windows系统自带的USB驱动URB会设置一个超时,这个时间大概是5秒钟。源代码可以参考如下实现:NTSTATUSUSBAudioCancelCompleteSynch( IN PDEVICE_OBJECT DeviceObject, IN PIRP ......
Windows系统下USB驱动分类介绍
BTHUSB.SYSUSB蓝牙设备-0xe0USBCCID.sysUSB芯片智能卡接口设备-0x0BWDF WUDFUsbccidDriver.dllUSBhub.sysUSB集线器-0x09Usbhub3.sysSuperSpeed (USB 3.0) USB 集线器的UsbNcm.......
window主机USB驱动
WindowsXP最高支持USB2.0高速,所以向下兼容USB1.0,USB1.1。根据USB主机控制分类,USB1.0/1.1一般为OHCI,UHCI,USB2.0为EHCI。具体详见:https://www.usbzh.com/article/detail-74.html由于USB主机控制器分......
Windows系统USB驱动
Windows系统USB驱动栈主机端这里主要介绍以下两种:DeviceUSBFDO-X这里的X是指的是数字USBFDO这里主要指定的USB主机控制器的FDO.DeviceUSBPDO-X这里主要包括两种PDO设备第一种是USB主机控制器创建的USB根集线器的PDO第二种是USB根集线......
USB驱动数据结构usb_device/usb_host_config/usb_interface/usb_host_interface/usb_host_endpoint
相对于USB规范中的USB相关描述符,Linux定义了几个相关的结构体。这几个结构体可在以下位置查看:https://elixir.bootlin.com/linux/v5.5-rc2/source/include/linux/usb.h以下介绍的USB结构体关系如下:struct usb_de......
LINUX&USB驱动urb
USB规范定义了USB的四种数据传输模式,但他们都是依赖于一个叫的URB的东西,全称USB Request BLOCK.作为一名Windows驱动开发人员,其URB中通过其IRP结构体PIO_STACK_LOCATION的一个指针指向其内存的。一般的代码如下: PURB Urb; P......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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