首页 > 技术文章 > 手机研发 > 软件 > 嵌入式系统中USB驱动程序设计

嵌入式系统中USB驱动程序设计

52RD.com 2005年6月4日 王晖            评论:2条 查看 我来说两句
 
  摘要:本文介绍了Windows2000操作系统下,符合WDM模式的USB驱动程序的体系结构及处理流程,并以一个批量数据传输的实例详细介绍了如何编写USB驱动程序。

  关键词:USB;设备驱动程序;WDM模式

  引言
  USB是1995年康柏、微软、IBM, DEC等公司为了解决传统总线的不足,而推出的一种串行总线标准。该总线已经逐渐成为现代数据传输的发展趋势,被广泛地应用于PC机及嵌入式系统上。
  目前,虽然Windows2000提供有多种通用的USB驱动程序,但并不满足本嵌入式系统的设计需求,因此本系统采用W i n d o w s DDK(Device Driver Kit)开发工具,自行开发了基于WDM模型的USB设备功能驱动程序。

  USB驱动程序
  USB驱动程序体系结构 
  运行在核心态的USB驱动程序是基于WIN32驱动程序模型WDM(Windows Driver Model)的,它采用分层驱动程序模型,由USB总线驱动程序和USB功能驱动程序两部分组成,总线驱动程序由操作系统提供,用户只需编写相应的功能驱动程序即可。

  处理流程
  因为I/O管理器把每一个设备对用户程序都抽象成文件,所以用户程序通过调用文件操作API函数就可以实现与驱动程序中某个设备的通信。
用户程序发送的请求由I/O管理器转换为具有不同主功能代码的IRP(I/O请求包)发送给功能驱动程序。功能驱动程序接收该IRP,在回调例程中根据IRP中包含的具体操作代码,构造相应的URB(USB请求块,在DDK中有URB结构的定义),把它放到一个新的IRP中,并把这个新的IRP传递给USB总线驱动程序。USB总线驱动程序根据IRP中所包含的URB执行相应操作,再将操作结果通过IRP返还给功能驱动程序。功能驱动程序接收此IRP,将操作结果通过IRP返还I/O管理器。最后,I/O管理器将此IRP中的操作结果返回给应用程序。至此,应用程序对USB设备的一次I/O操作完成,其处理流程如图1所示。

应用实例
  在本嵌人式系统中,硬件选用了Philips公司生产的USB2.0高速接口器件ISP1581,实现主机与嵌人式系统间的USB数据传输。
  为了适应各种USB外设的需要,USB提供了四种不同的传输类型。这里,为满足嵌入式系统与主机间大量、可靠的数据交换要求,数据传输选用批量传输方式。

  USB功能驱动程序的构成及实现
  本功能驱动程序主要由四个模块组成:初始化模块、I/O模块、即插即用管理模块和电源管理模块。另外,还有一个.INF文件用于驱动程序的安装。

  初始化模块
  在初始化模块中,包括有每一个设备驱动程序都有的一个初始化入口点:DriverEntry例程,每次设备驱动程序启动时该例程被系统自动调用,其最重要的功能是设置驱动程序对应于I/O请求的主功能代码(MajorFunction)的回调例程。DriverEntry例程如下所示:

  DriverEntry(IN PDRIVER_OBJECT DriverObject, …)
  //驱动程序人口
  { 
    DriverObject->DriverExtension->AddDevice=AddDevice; 
    DriverObject->DriverUnload=DriverUnload;
    DriverObject->MajorFunction[IRP_MJ_CREATE]=Create;
    DriverObject->MajorFunction[IRP_MJ_CLOSE]=Close;
    DriverObject->MajorFunction[IRP_MJ_READ]=Read;
    DriverObject->MajorFunction[IRP_MJ_WRITE]= Write; 
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=IoControl; 
    DriverObject->MajorFunction[IRP_MJ_PNP]=Pnp;
    DriverObject->MajorFunction[IRP_MJ_POWER]=ProcessPowerIrp; 
  }
  初始化模块中还包括有Create和Close两个例程,这是Win32程序获得和释放设备句柄的唯一途径;AddDevice例程在系统添加一个设备时被PnP管理器调用,其主要工作是创建并初始化设备对象;DriverUnload例程在系统卸载硬件时使用,由I/O管理器调用,释放所有资源。

  I/O模块
  I/O模块由读写例程Read、Write和设备控制例程IoControl构成。
  *读写例程
  读写两个例程用于实现批量数据传输。通过设置urb->UrbBulkOrInterruptTransfer. TransferFlags标志位可以决定数据流向,因此将它们放在同一个例程中。读  写例程主要处理流程如下:
  (1)调用IoGetCurrentIrpStackLocation(),获得指向自身I/O堆栈单元的指针;
  (2)使用构造宏UsbBuildInterruptOrBulkTransferRequest(),构造一个URB_BULK_OR_INTERRUPT_TRANSFERURB类型的URB结构;
  (3)调用IoGetNextlrp StackLocation()获得下一层驱动程序的I/O堆栈单元位置,并传递构造好的URB;
  (4)调用IoSetCompletionRoutine(),将一个I/O完成例程与IRP关联;
  (5)调用IoCallDriver() ,将请求传递给下层驱动程序处理。
  *IoControl例程
  用户程序使用DeviceIoControl函数传递一个称为I/O控制代码(IOCTL)的32位长度的参数,I/O管理器将IOCTL放在IRP的  Parameters.DeviceIoControl.IoControlCode域中,在功能驱动程序中由IoControl例程使用该参数确定应执行的功能。
  IOCTL值由CTL_CODE宏生成,CTL_CODE宏有四个宏参数。在本驱动程序中定义了两个IOCTL,分别用于复位管道和向USB固件发送一次批量传输字节数。IoControl例程对这两个IOCTL的处理流程与上面的读写例程类似,这里就不再赘述。
(52RD.com)

读取...
顶一下
 更多软件资源 到软件论坛讨论
·热门文章 HOT
·手机充电器电路原理图及充电器的安全...
·手机充电器电路原理图
·功率MOSFET(Power MOSFET)的基本知识
·RGB ,YUV, YCbCr的定义
·阻抗匹配与史密斯(Smith)圆图: 基本...
·功率放大器设计的关键:输出匹配电路...
·SD和MMC记忆卡介面技术
·uClinux下Nor Flash的JFFS2文件系统...
·手机结构设计经验总结
·新手必读:关于Linux,你所不了解的...
·手机结构总揽
·Windows Mobile 5.0 模拟器
·移动终端天线设计技巧
·手机结构设计指南之总体设计
·EMI / EMC设计(一)被动元件的隐藏...
·手机锂离子电池保护电路原理分析
·手机结构设计的一般准则
·手机中的连接器设计(二) SIM卡连接器
·智能手机:下一代嵌入式系统的界面
·Windows CE 模拟器和远程调试工具
·精彩评论 HOT
·赞助商链接 SUPPORT
·相关文章 CORRELATION
·无需重新设计就可升级到高速USB手机的方法[6-11]
·手机USB充电和过压保护解决方案[2-25]
·应对中国最新标准的手机USB充电和过压保护解决方案[2-19]
·下一代手机将集成无线USB应用[5-8]
·嵌入式系統設計中的USB OTG方案[8-10]
·特别推荐 RECOMMEND
·评  论 COMMENT
2楼 匿名 发表于 2007-12-11 20:22
  同一设备的USB驱动与USB软件之间数据传输格式是什么样的啊?
1楼 匿名 发表于 2005-11-21 20:26
  好是好,不过具体的步骤太少了。
共有评论2篇 查看所有评论
推荐朋友 打印本页