WinCEUSB驱动开发:一分pk10

首页

一分pk10:随着USB2.0设备的大大减少,USB设备驱动研发在嵌入式研发中变的更加最重要。WindowsCE反对USB2.0堪称对这一波新技术浪潮产生极大的推展。近期我负责管理一个这样的项目,在WinCE下研发USB模块的外围设备驱动。当时做到这个项目花费了我相当多的时间和精力,错回头许多冤枉路使我精疲力尽。

  项目市场需求是在已调好的ARM9板子上研发USBWiFi无线网卡的驱动程序,明确拒绝是驱动程序平台是WinCE,CPU类型反对ARM构架,要能较为便利地重制到X86;驱动接口类型是USB2.0和Wlan802.11b。后来因为相连效率仍然有问题,就东改西改为,最后改为的是一塌糊涂。幸而老板较为尊重,给了我充足的时间和反对,这里将关于USB驱动研发的点滴解读与大家共享。

  1.什么是WinCE设备驱动程序?  (1)从驱动读取方式来区分  在深入探讨WindowsCE所反对的外围设备驱动程序之前,再行理解在WinCE平台上用于的两种设备:内辟设备和可加装设备。因此,从驱动读取方式来看WinCE可分成本机设备驱动(Built-InDriver)、可读取驱动(LoadableDriver)以及混合型驱动。  ①本机设备驱动  本机设备驱动即NativeDeviceDrivers。

WinCE设计成可必要用于内辟设备,这些设备由本机驱动过程控制,而本机驱动程序又与WinCE的核心组件密切连接。这些驱动对应的设备一般来说在系统启动时,在GWES的进程空间内被读取,因此它们不是以独立国家的DLL形式不存在,也因此拒绝每一个本机驱动程序都必需与称作设备驱动程序模块(DDI)的特定模块完全一致。

  本机设备是指统合入平台的设备,其中还包括表明、触碰面板、音频、串行埠、LED、电池和PC卡插座等。如果没这些本机设备整个系统就无法和用户信息交流,例如触碰面板和表明等。本机驱动程序一般设计为动态链接库,但有两个值得注意:电池和LED驱动程序由于小而设计为静态库(当创建CE图像时与GWES模块链接)。这些设备适当的驱动程序是在WinCE平台研发过程中由OEM研发的,它们储存在ROM或存储器内。

一般来说只有OEM才不会对本机设备驱动程序展开改动,其它权利设备生产商只获取可选的硬件设备,对本机设备驱动程序会有过多牵涉到。  ②可读取设备驱动  可读取设备是所指可与平台相连和分离出来的第三方模块设备,可由用户随时加装和修理。这种外围设备的驱动也被称作流驱动,这些驱动可以在系统启动时或者和启动后的任何时候由设备管理器动态读取。一般来说这类驱动是以DLL动态链接库的形式不存在,系统读取后这些驱动程序也只是以用户态的角色运营。

可读取驱动程序是通过文件操作者API来从设备管理器和应用程序取得命令。在WinCE典型的可读取驱动有:PCMCIAdriver(PCMCIA.dll)、Serialdriver(SERIAL.dll)、ATAFLASHdriver(ATA.dll)、Ethernetdriver(NE2000.dll,SMSC100FD.dll)。  与本机驱动程序有所不同的是,所有可读取流驱动程序都分享一个公用模块。

该模块由每个驱动程序内的10个功能或记录点构成,这些功能与应用程序所用的文件API中的功能给定。因此,掌控可读取设备的流模块驱动程序一般由应用程序读取,流模块驱动程序由一个类似文件来将设备功能展现出给应用程序的,该文件可被关上、加载、载入和重开。

例如,用户将一个GPS设备与平台连接后,就可启动有GPS功能的应用程序来读取并用于该设备。WinCE是用于有数的API来让应用程序读取这些驱动程序,而不是创建新的API。

  (2)从驱动程序层次上分类  一般可以分成独立国家驱动和层次型驱动两类。独立国家驱动程序是所指将驱动程序自传式同时包括ModelDeviceDriver(MDD)和PlatformDependentDriver(PDD)层的独立国家驱动。

用于独立国家驱动的益处在于可以省却MDD和PDD层驱动之间的信息传送,这一点在实时处理中十分最重要。独立国家驱动的代码还包括中断服务例程和平台涉及处理函数。另外,如果设备的操作者和MDD驱动层的模块叙述相吻合,用独立国家驱动程序可以提升处置性能。

  层次型驱动是指分成两层,较上层的MDD和较为下层的PDD。MDD构建的是和平台牵涉到的功能,它叙述了一个标准化的驱动程序框架;而PDD是和硬件以及平台涉及的代码构成。

MDD调用PDD中特定的模块来提供硬件涉及的信息。当用于层次型驱动的时候,一般只必须基于相似的样佩驱动程序,针对特定的硬件只改动PDD程序,MDD创建的框架可之后用于。

但由于层次间接口的层层调用以及消息的传送,使得处理速度相对于独立国家驱动程序要快。因此,在嵌入式动态拒绝严苛的环境下,层次型驱动变得不是很合适。  非常简单的说道,独立国家驱动是把PDD与MDD写出在一起,没做到严苛的区分,一般来说这种驱动比较简单,比如ATADISK。

至于本机驱动和读取式流驱动就是指驱动与系统其它模块(调用者)的模块形式上做的分类。所以,一个读取式驱动程序可以是独立国家的流式驱动,例如ATADISK;也可以是分层的流式驱动,例如OHCI。

也就是说,独立国家和分层是驱动构建方式上的分类,而本机和读取流式则是驱动模型上的分类。所谓本机驱动就是操作系统有保有专门的模块,而读取流式驱动是指撰写DLL文件给定各种流式接口函数的模块。

  2.USB读取式流模块驱动要点分析  为了反对有所不同类型的外围设备,WinCE平台获取了具备自定义模块的流模块驱动程序模型。因为大部分USB外围设备由于功能性更加合适流模块驱动的结构,所以一般都使用读取式流模块驱动程序模型来研发USB设备驱动程序。  (1)USB系统结构分析  WinCE下USB系统软件由两层构成:较高USB设备驱动程序层和较低的USB函数层。较低的USB函数层本身又由两部分构成:较高的标准化串行总线驱动程序(USBD)模块和较低的主控制器驱动程序(HCD)模块。

通过HCD模块功能和USBD模块构建高层的USBD接口函数,USB设备驱动程序就能与外围设备展开通讯。  在数据传输的过程中,操作者流程一般来说按下列的次序展开:①USB设备驱动程序展开数据传输的初始化,即通过USBD接口函数给USBD模块发送数据传输的催促。②USBD模块将该催促分为一些分开的事务。

③HCD模块排泄事务次序。④主控制器硬件继续执行事务。这里必须警告的是,所有的事务都就是指主机收到的,外围设备几乎是被动拒绝接受型的。

  (2)USB设备驱动程序入口点函数  从结构分析我们由此可知,所有的USB设备驱动程序必需在它们的DLL库设置一定的入口点与USBD模块展开必要的交互。设置入口点函数有两个起到:一是使得USBD模块能与外部设备交互;二是使得驱动程序能创立和管理任何有可能必须的登记键。

  下面详细讲解涉及函数的起到:USBDeviceAttach是当USB设备相连到主计算机时运营,USBD模块不会调用这个函数初始化USB设备,获得USB设备信息和配备USB设备,并且申请人必须的资源。USBInstallDrive是在第一次读取USB设备驱动程序时首先被调用,它使得驱动程序能创立必须的登记键,用作将一个驱动程序所需的注册表信息载入到HKEY_LOCAL_MACHINEDriversUSBClientDrivers目录下,例如设备名称等。必须留意的是,USB设备驱动程序不用于标准的注册表函数,而是用于RegisterClientDriverID()、RegisterClientSettings()函数来登记适当的设备信息。

  USBUninstallDriver是在用户移除USB设备驱动程序时调用,负责管理移除登记键并获释其它涉及资源。它通过调用UnRegisterClientSettings()和UnRegisterClientDriverID()函数来移除由驱动程序的USBInstallDriver()函数创立的所有登记键。

因此,我们在驱动程序中就必须严苛按照这三个函数的原型来构建,否则就无法为设备管理器所辨识。  3.USB设备流模块驱动的构建步骤  从WinCEUSB设备驱动模型及结构分析中,我们可以明晰的看见主机和外设之间的构建方式。

一分pk10

在主机末端,通过USBD模块和HCD模块用于配置文件的PIPE采访一个标准化的逻辑设备,实质上就是说USBD和HCD是一组采访所有USB设备的逻辑模块,它们负责管理所有USB设备的相连、读取、去除、数据传输和标准化配备。其中HCD是主机掌控驱动,是为USBD获取底层的功能采访服务,USBD是USB总线驱动,坐落于HCD的上层,利用HCD的服务获取较高层次的功能。因此,构建USB读取流驱动程序大体必须已完成以下步骤:  (1)自由选择代表设备的文件名后缀。

后缀十分最重要,设备管理器在注册表中通过后缀来辨识设备。同时,在流模块命名时也将这个后缀作为入口点函数的后缀,如果设备后缀为XXX,那么流模块对应为XXX_Close,XXX_Init等。  (2)设置驱动的各个入口点函数。所谓入口点是指获取给设备管理器的标准文件I/O模块。

在分解一个DLL后,就用设备文件名后缀更换名字中的XXX。因此,每个读取式流模块驱动程序必需构建XXX_Init()、XXX_IOControl()以及XXX_PowerUp()等一组标准的函数,用来已完成标准的文件I/O函数和电源管理等。

  (3)创建.DEF文件。当设备管理器初始化USB设备编译器出来的流接口函数后,还必需创建一个.def文件。

DEF文件定义了DLL要给定的模块集,而且读取式流驱动大多是以DLL形式不存在的,所以不应将DLL和DEF的文件名统一一起。DEF文件告诉他链接程序必须输入什么样的函数,最后将驱动程序编译器到内核中去,这样这个USB设备流模块驱动程序就可以被应用程序调用。  (4)在注册表中为驱动程序创建表项。在注册表中创建驱动程序入口点,这样设备管理器才能辨识和管理这个驱动。

此外,注册表中还能存储额外的信息,这些信息可以在驱动运营之后被用于到。  在这次USB驱动研发过程中,错回头许多冤枉路使我叫苦连天。

我感觉深达的是由于WinCE获取了标准化串行总线驱动程序(USBD)模块、USBD接口函数全集、样本主机控制器驱动程序(HCD)模块。所以,我们只必须根据USB设备硬件特性,利用USBD获取的有所不同函数,构建流接口函数与外围设备的交互。在没尤其的情况下,我仅次于的进账经验是把这些公用的源程序如出一辙过来,能很大的延长开发周期,从而能更加较慢地展开嵌入式研发。

【一分pk10】。

本文来源:一分pk10-www.ptaylorimages.com

此条目发表在科技分类目录。将固定链接加入收藏夹。

评论已关闭。