当前位置:首页 > 心得体会 > [基于单片机的USB转并口设备的驱动程序设计]单片机可以做什么
 

[基于单片机的USB转并口设备的驱动程序设计]单片机可以做什么

发布时间:2019-02-21 04:13:12 影响了:

  [摘 要]本文研究并设计了基于单片机的USB转并口设备,并利用该模块研究了USB 设备驱动程序的设计方法。   [关键词]USB ECP Driver Studio 设备驱动程序
  [中图分类号]TP[文献标识码]A[文章编号]1007-9416(2010)02-0029-02
  
  1 引言
  由于现在大多数计算机没有并行口而具有多个USB接口,因此很多并行口设备无法和计算机直接连接使用。利用基于单片机STC11F32XE的USB 转 ECP 模式并行口可以连接其他ECP模式并口设备,以达到让具有ECP接口的设备可以和没有并口的PC进行数据通信的目的。并口采用的是IEEE 1284-A接口, USB 接口驱动芯片采用Philips 半导体公司的PDIUSBD12,该芯片的数据端口D0-D7接单片机的P0 口,引脚WR_N、RD_N、及A0 分别接单片机的P3.6、P3.7、P3.5 引脚。整个硬件电路图如图 1 所示。当 USB 设备硬件设计完成之后,接着就必须根据硬件特点和需要完成的功能,设计出合乎产品的USB驱动程序,否则,设备将无法被PC机识别,不能正常使用。
  2 WDM型的USB驱动程序结构
  USB设备的驱动程序是一种典型的WDM驱动程序。WDM驱动程序是分层的。对于USB设备驱动程序来说,其驱动程序包括两个层次:设备(功能)驱动程序层和总线(底层)驱动程序层。USB底层驱动程序由操作系统提供,不要开发者自己编写,它位于USB功能驱动程序的下面,负责与实际的USB硬件打交道,实现复杂而繁琐的底层通信;USB功能驱动程序必须要由开发者编写,它不与实际的USB硬件打交道,是把包含URB(USB Request Block,USB 请求块)的IRP发送到USB底层驱动程序,来实现对USB设备信息的发送和接收。(图2) 给出了USB 驱动程序的结构模型。
  3 USB驱动开发编程环境的建立
  开发一个WMD 驱动程序,必须要搭建合适的开发环境以此来减小开发难度。对于WDM 驱动的开发,一般必须使用的软件是VC++6.0和DDk (Driver Development Kit,驱动程序开发工具包)。但为了进一步降低开发难度,选择使用了第三方驱动开发工具--Driver Studio。它以类的方式对DDK 进行封装,可以十分容易地利用它提供的向导来产生一个必需的驱动程序框架。
  一般首先安装VC++6.0,接着安装DDK,如果需要的话,还可以安装Windows SDK 来辅助开发,最后安装Driver Studio 3.2。因为Driver Studio的类库要使用DDK库函数,所以在安装好Driver Studio 之后必须首先要编译出一个库文件,否则会提示找不到库文件vdw_wdm.lib 等错误。编译该库文件的步骤如下:启动VC++6.0,找到并打开Driver Studio3.2 安装目录下的vdwLibs.dsw工程文件,然后选择DriverStudio->DDK Build Settings,在弹出的对话框中设置DDK的安装路径和运行的操作系统。然后选择菜单Build->Batch Build,要根据驱动运行的平台来选择对应的工程文件,这里选择了x86对应的工程,正确选择之后,单击Rebuild All 按钮,开始编译库文件。这个类库只需编译一次,以后开发其他的驱动就不必再次编译了。
  4 USB驱动创建方法及步骤
  该驱动程序的主要功能包括:端点0采用控制传输,可以保证传输过程中的数据的完整性和正确性,主要负责USB枚举过程中的数据的读写。另外,又增加了端点1和端点2。端点1采用中断传输,这种传输主要用在数据量不大,但对时间要求较严格的设备中。因此,模块满足了实时性的特点;端点2采用批量传输,该种传输通常用在数据量大、对数据的实时性要求不高的场合中,利用该方式可以完成大量数据的快速传输,可以与高速的ECP并行口相匹配,因此,模块满足了高速数据传输的要求。
  单击VC菜单栏下的DriverStudio菜单项,选择Driver Wizard菜单,会出现一个驱动向导对话框。单击Start a new Driver Project 将创建一个新的驱动工程。然后按照向导生成该驱动程序的框架。具体步骤如下:①设置工程名和路径。在弹出的对话框中,设置工程名为UsbToECP、路径为D:\。②选择驱动工程的类型。在对话框中选择 WDM Driver,驱动框架选择DriverWorks C++ Framework。③选择WDM驱动类型。在弹出的对话框中选择 WDM Function Driver。④选择驱动总线的类型。在对话框中选择为 USB 总线,然后在分别设定USB Vendor ID 和USB Product ID。 ⑤设置USB 的端点资源。单击Add增加端点。这里增加 4 个端点,Pipe Name 分别是Ep1_In、Ep1_Out、Ep2_In和Ep2_Out。其中Ep1_In和Ep1_Out选择中断传输,端点地址均为1,传输方向分别为输入和输出,最大包长为8字节,最大传输大小为 4096字节。Ep2_In和Ep2_Out选择批量传输,端点地址均为2,传输方向分别为输入和输出,最大包长为64字节,最大传输大小为 40960字节。⑥选择需要处理请求类型。这里选择IRP_MJ_DEVICE_CONTROL、IRP_MJ_READ和IRP_MJ_WRITE。它们分别与API函数 DeviceIoControl、ReadFile和WriteFile一一对应。⑦设备I/O操作方式。配置IRP_MJ_READ和IRP_MJ_WRITE的缓冲方式分别为Buffered。另外还需要增加4个IO Control 的控制代码:EP1_READ、EP1_WRITE、EP2_READ、EP2_WRITE。打开方式选择Interface。⑧添加注册表项。可以根据自己需要增加,这里增加了一个设备名称。⑨设置电源管理。选择Device requires an inrush of power at startup,说明该设备启动时需要大电流,这样做的目的是防止相同的设备同时上电,减少对电源的冲击。步骤10-13按默认配置即可。
  5 驱动的编程
  USB驱动程序的编程最主要的就是编写端点1和端点2的数据处理函数,其中主要编写的是UsbToECPDevice类成员函数Read()、Write()、及DeviceControl()中调用的4 个IoControl()函数。
  Read()函数对应着WIN32 API的ReadFile函数,其参数通过KIrp I传递过来。因为端点1指定的缓冲方式为Buffered 方式,所以调用KIrp类的成员函数I.BufferedReadDest()来获取保存数据的缓冲区地址,调用I.ReadSize()来获取读到的数据长度。如果获取到的缓冲区地址为NULL,则说明参数无效,则以USB_STATUS_INVALID_PARAMETER来完成该IRP,然后返回USB_STATUS_INVALID_PARAMETER。若读取的字节数是0,就直接完成该IRP,不需要进行数据处理。接着创建一个URB来完成数据的处理。因为端点1采用的是中断传输,所以必须创建一个中断传输的 URB并提交它,端点管道KUsbPipe类提供一个创建中断传输URB的函数BuildInterruptTransfer。这样底层的USB 总线驱动程序就会负责从端点 1 读取数据,当完成数据的读取后,提交相应URB的函数就会返回。当URB创建成功后,利用KUsbPipe类的成员函数SubmitUrb()来提交这个URB,否则返回资源不足的错误信息。SubmitUrb()函数返回后,可以用URB的成员变量TransferBufferLength来获取实际读到的字节数,最后删除创建的URB。
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文   Write()函数的处理方法与Read()函数的方法非常相似,不同之处在于利用KIrp类I的成员函数 BufferedWriteSource()和WriteSize()来分别获取缓冲区的地址和传输的字节数。另外,函数EP1_READ_Handler()和EP1_WRITE_Handler()的实现与Read()和Write()函数基本是一样的,略有不同。
  端点2 的EP2_READ_Handler(KIrp I)和EP2_WRITE_Handler(KIrp I)与端点 1的EP1_READ_Handler(KIrp I)和EP1_WRITE_Handler(KIrp I)处理方式几乎是一样的,主要的不同是在创建URB时要用到创建批量传输URB 的函数BuildBulkTransfer(),其参数及意义与BuildInterruptTransfer()相同。
  6 驱动的安装
  在对端点1和端点2编程完成之后,然后对其进行编译,如果没有错误,可以看到编译报告中有一行“MODULE=.\objfre\i386\UsbToECP.sys”,这个就是所要的驱动文件,另外,在目录下还产生一个inf文件,其也是安装驱动时需要的一个重要的文件,它里面有一些重要的安装信息,可以根据需要进行修改。一般主要是对inf的Stings 进行修改,表1给出了该驱动的Strings 段的几个重要属性的修改。
  将该设备与PC机连接,系统会提示安装驱动,首先指定驱动安装所要使用的inf文件所在的位置,该inf文件可以在驱动工程目录的driver目录下找到,是由向导自动生成的。然后选择安装驱动所需要的UsbToECP.sys文件,该文件在D:\ UsbToECP\driver\objfre\i386下。正确安装驱动之后,打开计算机的设备管理器,将会看到该USB设备。如下图3所示。打开图3中的Class for BinBinUsb devices下的BinBinUsb Device属性,选择相应标签,将会看到如下图4的驱动信息。
  7 结语
  USB设备驱动的开发是设备开发过程中必不可少的一项任务。通过研究利用VC++、DDK和Driver Studio对USB驱动程序的设计方法,成功地设计了基于单片机的USB转并口设备的驱动程序。通过测试,使用该驱动的USB转并口设备运行稳定,达到了预期的效果。这种USB驱动的设计方法简化了开发难度,开发的驱动稳定可靠,必将受到USB设备开发者的广泛关注,同时也给其他的基于WDM驱动的开发提供一个新途径。
  
  [参考文献]
  [1] 荣佳波,常明志,井科伟,杨少勇.USB 设备的WDM驱动程序设计[J].应用科技,2004,31(3);39-41.
  [2] 武安河.Windows2000/XP WDM 设备驱动程序开发(第2版)[M].电子工业出版社,2005.
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3