单片机和USB接口技术

发布时间 : 星期四 文章单片机和USB接口技术更新完毕开始阅读

馈设备类、打印机类、集线器类、海量存储设备类和音频设备类等。

USB总线设备驱动程序使用标准Windows系统USB类驱动程序访问USBDI(USB驱动程序接口)。USBD.sys文件就是Windows系统中的USB类驱动程序,它使用UHCD.sys来访问通用的主控制器接口设备,或使用OHCI.sys访问开放式主控制器接口设备。USBHUB.sys是根集线器和外部集线器的USB总线驱动程序。

4.2.1 驱动程序开发工具的介绍

Windows DDK Windows DDK是Microsoft公司提供的一个开发Windows驱动程序的工具,是Microsoft出品的设备驱动程序开发工具包DDK(Device Developer Kit),它有Windows98 DDK和Windows2000 DDK两个版本。前者能够开发Windows95/98/Me/NT下的VxD, KMD和WDM驱动程序,后者可以开发Windows98/Me/NT/2000下的KMD和WDM驱动程序。利用DDK开发Windows驱动程序是一种比较传统的方法。

它要求设计者必须对Windows的体系结构、设备驱动程序的结构、虚拟机管理器(VMM)以及Intel CPU体系结构有深入的了解,而且需要保护模式的汇编语言编程经验。因此,在实际的开发过程中,DDK一般不常被人们所使用,取而代之的是另外两种工具:DriverStudio和WinDriver

DriverStudio是由Compuware公司提供的驱动程序开发工具,简化了Windows驱动程序的开发、调试和测试,完整的版本是由SoftICE , DriverWorks ,

DriverNetWorks、VtoolsD, BoundsChecker, TrueTime Driver, TrueCoverage Driver等工具组成。 WinDriver是美国KRFTech公司出品的用于编写驱动程序的另一种工具包。它包括代码生成器WinDriver Wizard, WinDriver Debugging Monitor, WinDriver发行包和一些公用程序和实例。WinDriver支持ISA, EISA, PCI, Plug&Play和DMA,它能自动地发现硬件并产生驱动程序,不需要牵涉到很低层的东西即可在很短的时间里编出驱动程序。使用WinDriver的优点是:开发者并不需要熟悉任何内部操作系统或kernel programming或DDK及任何驱动程式。WinDriver同时允许开发者能在自己所熟悉的开发环境下,利用使用者模式(User Mode)来开发出所需的驱动程序,如使用MSDEV Visual C/C++, Borland C++Builder, Delphi或任何Win32编译器。使用WinDriver所开发的驱动程式均可用于Windows XP, Windows 9x, NT/2000, CE, Linux and Solaris等平台。

4.2.2 驱动程序中的基本概念

驱动程序的五层模型

25

(1)用户应用程序:用户编写的,通过驱动程序与硬件打交道的可执行文件:

(2)I/0管理层:负责用户应用程序和驱动程序之间的数据交换,并通过IRP(IO请求包)来完成; (3)驱动程序:在装了DDK后,可以自行编写驱动程序。在驱动程序中,不同

的部分、级别都是通过IRP来交换数据的。当一个例程处理完一个IRP后,它也设置好状态信息,然后将此IRP返回;

(4)硬件抽象层(HAL ): Windows管理,这样用户在写驱动程序的时候会灵活的多,而且HAL还提供了把同一个驱动程序解释到不同平台的功能; (5)硬件:完成某种功能的外围设备。

4.2.3 USB驱动程序体系结构

为了便于对驱动程序的开发、了解,Windows对USB驱动程序体系结构进行了

详细的说明,对不同软件部分进行了十分清楚的划分,如图14所示。其中USB总线客户软件仅仅包含了用来控制不同USB总线外设的设备驱动程序。USB总线客户软件会通过一个Windows所定义的软件接口与根集线器驱动程序进行通信,而USB总线根集线器驱动程序则要通过包含在USBD中的USBD1(通用串行总线驱动程序接口)实现与通用串行总线驱动程序((USBD)的通信。然后,USBD会选择三种主控制器驱动程序之一同其下方的主控制器进行通信。最后,主控制器驱动程序会直接实现对USB物理总线的访问。

像Windows NT环境下的设备驱动程序一样,USB总线驱动程序软件堆栈内的层间通信也使用了一个称为IRP(1/O请求包)的机制。一个设备驱动程序要与另一个设备驱动程序进行通信时,它会用IRP结构来组装一个请求,并把该请求传递到下一层。下一层接受了该请求之后,会向发送方发送一个应答(ACK)握手信号。重复该过程,就可以在不同分层结构之间实现通信了。

虽然不同的软件分层通信时要使用IRP,而实际的 USB总线请求却存放在一个被Microsoft称为通用串行总线请求URP结构内。在URP内包含了不同的域,在不同的软件分层结构中,每一个分层会使用不同的域进行处理操作。

客户软件

USB客户软件也是一种设备驱动程序,位于根集线器驱动程序之上,通过定义的USB总线接口访问其下方的USB总线软件,Windows USB接口提供了一系列供访问的USB总线接口函数。具体的使用情况可参考相应版本的Windows操作系统的设备驱动程序开发包(DDK)中的文档。

26

图14 USB驱动体系 (1)根集线器驱动程序

从图14可以看出,根集线器驱动程序位于USBD之上。在一个支持USB系统主机中,都会有一个根集线器,用来提供USB总线接口。所有的USB设备,包括USB功能设备和USB集线器都必须以一定方式接入一个USB根集线器。在Windows环境中,所有的客户驱动程序都可以通过指向这一根集线器驱动程序的接口来和所有接入的USB设备进行通信。另外,还有一种方法就是客户驱动程序通过USBDI而直接与USBD进行交互。

(2) USB驱动程序(USBD)

通用串行总线驱动程序(USBD)是USB总线系统中负责管理通用串行总线的工作且位于主机上的一个软件,提供了对USB设备的抽象和USBD上的客户同USB设备上的功能模块之间所存在的数据传输的抽象。USBD负责控制所有的USB协议操作和高层中断处理控制。

USBD为客户软件(设备驱动程序)提供了访问设备的一组接口,客户软件只能通过它来访问USB总线,并构建URB通过USBDI发送下去。对客户软件而言,它就是USB总线的底层。

(3)UHCD、OHCI、EHCI

Windows为不同的USB设备供应商提供了三种管理系统中的USB主控制器的软件接口,即通用主控制器(Universal Host Controller Driver, UHCD)和开放式主控制器接口(Open Host Controller

27

Interface, OHCI)和增强式主控制器接口EHCI(Enhanced Host Controller Interface)。其中EHCI是专为针对USB2.0提出的。

HCD(Host Controller Driver)通过主控制器来实现和物理总线的通信,负责所有USB物理层的总线操作。Windows在USB总线和主控制器之间又放置了一个PCI总线枚举器,在系统中,由PCI总线枚举负责在其检测到系统中存在一个通用串行总线时装载适当的USB总线驱动程序。

4.2.4 USB设备驱动程序设计

USB设备驱动程序是支持即插即用功能的标准WDM(Windows DriverModel)驱动程序,它与VXD和NT式的驱动程序不同,它是内核态程序,采用了分层处理的方式,不需要直接和硬件打交道。当USB设备插入USB集线器时,USB集线器驱动程序会检测到一个新设备的插入。PnP管理器使用厂商ID或设备类信息选择要运行的驱动程序。一般情况下,调用驱动程序的AddDevice例程,并发出其他的PnP IRP 。USB设备驱动程序决不会收到任何硬件资源(如端口或中断),因为USB类驱动程序处理所有的低层I/O。

在编写驱动程序时,需要包含以下几个头文件:

USBl00.h:包含有USB设备驱动程序中所用到的各种常量和结构; USBioctl.h: IOCTL的定义,包括各种驱动程序通用的数据结构; USBdlib.h: URB构造和各种例程,定义了USBD所输出的服务;

USBdi.h: USBDI例程,包括URB结构、各种驱动程序通用的数据结构。 在编译驱动程序时,build将会在欲编译的驱动程序所在的目录中寻找一个叫

sources的文件,这个文件将告诉编译程序,应该怎么做。在该文件中,以下五个内容是必须包含的: (1) TARGETNAME:表示编译出的结果名称;

(2) TARGETTYPE:表示编译出的结果类型(例如驱动程序);

(3) TARGETPATH:表示在当前目录(sources文件所在的目录)中建立一个什么名称的子目录来保存中间结果;

(4)TARGETLIBS:表示编译过程中需要那些库; (5) SOURCE:表示需要编译那些文件。 在本系统的驱动程序开发中,主要的分发例程有:

DriverEntry():是驱动程序的入口,主要完成各种初始化操作,同时把注册表复制到一个全局变量中,并告诉系统那些IRP由哪个例程处理,这部分被I/O系统直接调用。

28

联系合同范文客服:xxxxx#qq.com(#替换为@)