usb驱动程序开发系列-基本步骤

二.USB驱动程序开发

USB驱动程序开发和其他设备驱动不同,USB设备驱动不直接与底层硬件进行通信,而是先建立一个称为USB请求块(USB request blocks,URB)的数据结构,把它发送给父级驱动,父级驱动根据URB中的信息对底层硬件进行相应操作,这里父级驱动通常就是指USB总线驱动。发送URB可以使用主功能码为IRP_MJ_INTERNAL_DEVICE_CONTROL的IRP来实现,也可以直接调用父级驱动提供的接口调用函数来实现。

1.设备和驱动程序的层次结构

设备和驱动程序的层次结构图

WDM模型使用了如图所示的层次结构。图中右边是一个设备对象堆栈。设备对象是系统为帮助软件管理硬件而创建的数据结构。一个物理硬件可以有多个这样的数据结构。

在WDM中引入了功能设备对象(FDO)和物理设备对象(PDO)来描述硬件。一个PDO对应一个真实硬件,一个硬件只允许有一个PDO,却可以有多个FDO。在驱动程序中直接操作的不是硬件设备,而是相应的PDO和FDO。PDO和FDO都处于堆栈的最低层。在FDO的上面和下面还会有一些过滤器设备对象(filter device object)。位于FDO上面的过滤器设备对象称为上层过滤器,位于FDO下面(但仍在PDO之上)的过滤器设备对象称为下层过滤器。在用户态和内核态通信方面,系统为每一个用户请求打包形成一个IRP结构,将其发送至驱动程序,并通过识别IRP中的PDO来区分是发送给哪一个设备的。

2.编写USB 驱动程序开发的基本步骤

(1) 首先编写一个DriverEntry例程。

在这个USB 驱动程序开发例程中必须设置一系列的回调例程来处理IRP. DriverEntry是内核模式驱动程序主入口点常用的名字。该例程的主要工作是把各种函数指针填入驱动程序对象。这些指针为操作系统指明了驱动程序容器中各种子例程的位置。

(2)编写一个AddDevice例程。

它的基本功能是创建一个设备对象并把它连接到堆栈底部为pdo的设备堆栈中。相关步骤如下:调用IoCreateDevice创建设备对象,并建立一个私有的设备扩展对象;寄存一个或多个设备接口,以便应用程序能知道设备的存在,另外,还可以给出设备名并创建符号连接;初始化设备扩展和设备对象的Flag成员;调用IoAttachDeviceToDeviceStack函数把新设备对象放到堆栈上。

(3)编译连接USB驱动程序。

BUILD实际上是一个相当简单的程序。大部分的build过程被一系列标准的BUILD传递给NMAKE的命令文件控制。这些文件包含所有的创建BUILD工程需要的平台特殊的规则和选择设定,通过在分开的文件中存储这些规则﹐就有少的版本依赖。
BUILD使用的几个命令文件(在DDK的二进制路径\BIN)﹕

  • 1. MAKEFILES.DEF是主控制文件﹐它参考其它文件来执行它的工作﹒
  • 2. MAKEFILE.PLT为创建操作选择目标平台﹒
  • 3. i386MK.INC﹐ALPHAMK.INC和ia64mk.inc包含平台特殊的编译器和调试器开关﹐例如﹐Intel﹐Alpha﹐64-bit Intel Itanium processors等等﹒

BUILD通过按照不同的平台类型的二进制文件帮助管理多平台的工程,不同的路径对应不同的平台,只要有交叉的编译器和连接器可以使用。一个单一的BUILD过程可以为所有的支持的平台产生二进制文件,注意﹐BUILD为调试版本和自由版本使用不同的路径,DBG符号在执行调试版本时被定义为1。

(4)测试驱动程序。

此条目发表在 windows驱动开发 分类目录,贴了 , 标签。将固定链接加入收藏夹。

发表评论