WDM驱动程序设计之USB总线支持类

USB(Universal Serial Bus)总线支持类
包括三个类:KUsbLowerDevice类、KUsbInterface类和KUsbPipe类,这三个类都只能在WDM模式下使用。
本文只做概要性介绍,以后三篇文章将分别介绍这三个类的封装结构。
【Overview】
DriverWorks支持USB客户端驱动开发,比如需要通过USB向某个设备发送请求的驱动程序。
从客户端驱动的开发者角度来看,任何USB设备概念上都是由三个类组件组成的:Logical Device,Interfaces和Endpoints。
以下分别讲述:
(1)Logical Device
这 是一个逻辑组件,USB总线驱动通过这个组件对设备进行配置和控制。它相当于USB规格说明书中描述的默认控制管道(the default control pipe)或"endpoint 0"。所有的USB设备都支持一个函数集合,这些函数通过向USB协议栈的逻辑设备层发送命令的方式完成自己的功能。这些功能包括控制设备描述符和设置配 置空间。
类KUsbLowerDevice抽象了这个函数集合。通过实例化这个类,一个设备驱动创建了一个系统USB总线驱动的上层接口。
(2)Interfaces
所 有USB设备都有一个或多个接口。一个接口就是一组提供特殊功能的设备端点(这个在概念上和COM接口相似,因为接口就象征着一个特殊的,定义良好的操作 集合)。一个设备的每个接口呈现了设备功能的不同子集。假如设备驱动不使用相同的端点,那么他们就可以使能一个设备的多个接口。
USB规格说明书 中提出了如下的例子作为对接口功能的说明:一个ISDN设备(综合业务数字网络设备)可以配置两个接口,每个接口提供64KB/s的数据通道,在主机上他 们有分离的数据源或者接收方。另一个配置可以使ISDN设备呈现为单个接口,事实上是把两个通道结合成了一个128KB/s双向通道。
类KUsbInterface抽象了这个函数集合。一个驱动为每个接口创建了一个此类的实例,用它进行相互作用(interact)。
(3)Endpoints
端 点是物理设备上个别的数据提供者和使用者。从物理上将,这可以将IO寄存器映射到设备上。端点和驱动间的联系被成为pipe。USB规格说明书定义了四种 类型的管道:Control,Interrupt,Bulk和Isochronous。设备驱动程序管理的每个数据传输都利用了一个特殊的管道。
类KUsbPipe抽象了这个函数集合。一个驱动为每个管道(pipe)创建这个类实例,需要通过它进行数据传输。然而,驱动不会为默认控制管道(endpoint 0)创建实例。KUsbLowerDevice抽象了这个管道。

 

class KUsbLowerDevice
【Overview】
KUsbLowerDevice类是实现一个USB客户端驱动的 核心类。它使驱动能够控制一个USB设备的默认控制管道(the default control pipe),能够配置设备,并且能够向设备传递各种控制请求和状态请求。这个类相当于USB协议栈的逻辑设备层(logical device layer),为USB和设备端点(device endpoints)之间的路由通信负责。
KUsbLowerDevice类是KPnpLowerDevice类的子类,因此继承了它的成员函数。这个基类提供了对底层物理设备属性的控制。
一个KUsbLowerDevice类实例(或者是它的子类)就象征着endpoint 0(控制管道the control pipe)。所以你不用为endpoint 0实例化一个KUsbPipe类。
当系统检测到一个USB设备,它会创建一个设备对象来表示系统中的这个物理设备。这个设备对象被称为物理设备对象(PDO)。系统决定了为设备负责的驱动程序,并且调用那个驱动的AddDevice 入口函数,传递一个指向PDO的指针作为参数。
一般来说,AddDevice 创建一个功能设备对象(FDO),就相当于传进来的PDO。FDO的角色只是使应用程序和更高层的驱动程序能够通过客户端驱动发送IO请求(I/O requests)。FDO是一个KPnpDevice派生类的实例。
要 创建FDO和PDO之间的连接(biding),FDO嵌入一个KUsbLowerDevice类型的数据成员。在construction 函数或者Initialize函数中,FDO和PDO联系起来,因此FDO把自己插入驱动程序栈里并开始为PDO操作IRPs(IO请求包I/O request packets)。
对于怎样使用KUsbLowerDevice的成员函数进行USB设备的配置,参见下面的【Configuring a USB Device】部分,这在DriverWorks里是以链接方式给出的一个专题。

【Configuring a USB Device】
下面是构造一个能够控制USB设备的驱动程序的几个要点说明(keys):
(1)USB 驱动必须是WDM驱动程序。这意味着你在继承KDriver的类里需要一个AddDevice函数。你的function.h文件必须有宏定 义#define DRIVER_FUNCTION_ADD_DEVICE,DRIVER_FUNCTION_PNP和DRIVER_FUNCTION_POWER。
(2)USB 设备通常是支持即插即用的。从KPnpDevice派生一个类。这个类必须有一个KUsbLowerDevice类型的数据成员。而且对于每种配置的每个 接口,都要声明一个KUsbInterface类型的数据成员。对每个USB端点(endpoint),要声明一个KUsbPipe类型的数据成员。
(3)你的设备类必须重写,至少重写OnStartDevice 和 OnStopDevice函数。可能还有其他你需要重写的成员函数,但是系统需要的很多PnP(即插即用)和Power(电源管理)功能是由它的基类KPnpDevice实现了的。
(4) 在设备构造函数里,你必须首先通过调用KUsbLowerDevice类的Initialize函数对它进行初始化。然后调用每个 KUsbInterface类的Initialize对它们分别进行初始化。要保证调用这些函数的新形式(new forms)。遗留的形式之所以存在仅仅是为了保持对老式设备驱动的兼容。然后调用SetLowerDevice, SetPnpPolicy和SetPowerPolicy三个函数。
(5)在你的设备类的OnStartDevice函数里,调用 KUsbLowerDevice::ActivateConfiguration来配置设备。这个函数将建立KUsbPipe、 KUsbInterface对象和当前USB管道(pipes)、接口之间的联系(biding)。
(6)在OnStopDevice函数里,调用KUsbLowerDevice::DeActivateConfiguration函数。
具体请参考安装目录../DriverWorks/examples/wdm下的示例程序USBTHERM,或者使用DriverWizard生成一个定制的USB客户端驱动程序。

【Member Functions】
1、KUsbLowerDevice - Constructor (2 forms)构造函数。运行于PASSIVE_LEVEL中断级别上。
FORM 1:

KUsbLowerDevice(
   KDevice* AttachingDevice,
   PDEVICE_OBJECT PhysicalDeviceObject,
   NTSTATUS* pStatus
);

FORM 2:

KUsbLowerDevice(void);

FORM 3:

KUsbLowerDevice(
   PDEVICE_OBJECT TopOfStackDevice,
   PDEVICE_OBJECT PhysicalDeviceObject,
   NTSTATUS* pStatus
);
如果用Form2,就必须提前调用Initialize函数。

2、Initia

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值