打印

USB设备驱动程序开发

[复制链接]
1970|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yan3388764|  楼主 | 2010-12-10 11:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  引言
  USB总线是1995年微软、IBM等公司推出的一种新型通信标准总线,特点是速度快、价格低、独立供电、支持热插拔等,其版本从早期的1.0、1.1已经发展到目前的2.0版本,2.0版本的最高数据传输速度达到480Mbit/s,能满足包括视频在内的多种高速外部设备的数据传输要求,由于其众多的优点,USB接口越来越多的被应用到计算机与外设的接口中,芯片厂家也提供了多种USB接口芯片供设计者使用,为了开发出功能强大的USB设备,设计者往往需要自己开发USB设备驱动程序,驱动程序开发一直是Windows开发中较难的一个方面,但是通过使用专门的驱动程序开发包能减小开发的难度,提高工作效率,本文使用Compuware Numega公司的DriverStudio3.2开发包,开发了基于NXP公司USB2.0控制芯片ISP1581的USB设备驱动程序。
  USB设备驱动程序的模型
  USB设备驱动程序是一种典型的WDM(Windows Driver Model)驱动程序,其程序模型如图1所示。用户应用程序工作在Windows操作系统的用户模式层,它不能直接访问USB设备,当需要访问时,通过调用操作系统的API(Application programming interface)函数生成I/O请求信息包(IRP),IRP被传输到工作于内核模式层的设备驱动程序,并通过驱动程序完成与UBS外设通信。设备驱动程序包括两层:函数驱动程序层和总线驱动程序层,函数驱动程序一方面通过IRP及API函数与应用程序通信,另一方面调用相应的总线驱动程序,总线驱动程序完成和外设硬件通信。USB总线驱动程序已经由操作系统提供,驱动程序开发的重点是函数驱动程序。
  USB设备驱动程序的设计
  使用DriverStudio3.2开发USB设备驱动程序
  该驱动程序的主要功能包括:从控制端点0读取规定个数的数据、向端点0发出控制命令、从端点2批量读数据、向端点2批量写数据,驱动程序的开发采用DriverStudio3.2驱动程序开发包及VC++6.0,使用开发包中的向导程序DriverWizard就可以方便的生成驱动程序框架、模块及部分程序源代码,开发者只需要在功能模块中加入自己的实现程序就能完成复杂的USB设备驱动程序设计,下面介绍使用DriverWizard生成ISP1581驱动程序的过程:
  (1)启动DriverWizard,选择DriverWorks Project创造一个名为USBDIO的VC++项目;
  (2)在驱动程序类型中选择WDM Driver,WDM Function Driver,在硬件设备所支持的总线类型中选择USB(WDM Only),在USB Vendor ID(厂商识别码)中填写0741,在USB Product ID(产品识别码)中填写0821;
  (3)增加USB设备端点,设置端点2为批量输入/输出传输方式;
  (4)在驱动程序支持的功能项中选择Read、Write、Device Control、Cleanup;
  (5)选择自动产生批量读及批量写程序代码;
  (6)在I/O请求IRP处理方式中选择None,即IRP不排队;
  (7)在接口的打开方式中选择Symbolic link:UsbdioDevice,即应用程序以符号链接名打开设备;
  (8)定义应用程序调用DeviceIo Control 函数对WDM驱动程序通信的控制命令,结果如图2所示。
  (9)最后选择完成并确认生成新的项目信息,向导程序就会在usbdio目录中生成一个名为USBDIO的项目文件,其中包括了ISP1581驱动程序框架、模块及部分源代码。
USB设备驱动程序的编程
  在使用DriverWizard生成驱动程序框架、模块及部分程序源代码后,开发者只需完成图2中三个控制代码所对应的三个功能模块的编程:模块USBDIO_IOCTL_ ID_CODE_Handler的功能是从控制端点0读取数据,模块USBDIO_IOCTL_ TEST_COMMAND_Handler的功能是向控制端点0发送一个控制命令,模块USBDIO_IOCTL_DMA_COMMAND _Handler的功能是向控制端点0发送一个要求USB设备进行DMA传输的控制命令,下面是第一个模块的编程实例。
  NTSTATUS USBDIODevice::USBDIO
  _IOCTL_ID_CODE_Handler(KIrp I)
  {
  NTSTATUS status =STATUS_
  SUCCESS;
  t << "Entering USBDIODevice
  ::USBDIO _IOCTL_ID_ CODE_
  Handler, " << I << EOL;
  PURB pUrb;
  ULONG numData;
  numData=*(PUCHAR)I.IoctlBuffer();
  //设置读取的数据个数
  pUrb=m_Lower.BuildVendorRequest(
  (PUCHAR)I.IoctlBuffer(),//驱动程
  序存放读取的数据的内存区
  numData,//wLength,读取的数据个数
  0,
  0x0c,//bRequest 0,//wValue
  TRUE,//input
  TRUE,
  NULL,
  0x0472,//wIndex,传输到固件程序
  的读数命令码
  URB_FUNCTION_VENDOR_ENDPOINT,
  NULL
  );
  if(pUrb==NULL)
  {
  I.Information() =0;
  status=STATUS_INSUFFICIENT_
  RESOURCES;
  }
  else
  {
  I.Information() =numData;
  tatus=m_Lower.SubmitUrb(pUrb,NULL,
  NULL,0);
  delete pUrb;
  }
  return status;
  }

相关帖子

沙发
cyber211| | 2011-5-12 09:46 | 只看该作者
编写的不好的驱动程序,拿出去买,害死人。

使用特权

评论回复
板凳
xupeng11223| | 2011-5-12 09:48 | 只看该作者
支持楼上的

使用特权

评论回复
地板
yiandragon| | 2011-5-24 14:10 | 只看该作者
支持

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://blog.ednchina.com/0078/1969387/message.aspx

0

主题

36

帖子

1

粉丝