USB开发步骤之软件篇

上传人:s9****2 文档编号:489876354 上传时间:2023-02-12 格式:DOC 页数:11 大小:191.50KB
返回 下载 相关 举报
USB开发步骤之软件篇_第1页
第1页 / 共11页
USB开发步骤之软件篇_第2页
第2页 / 共11页
USB开发步骤之软件篇_第3页
第3页 / 共11页
USB开发步骤之软件篇_第4页
第4页 / 共11页
USB开发步骤之软件篇_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《USB开发步骤之软件篇》由会员分享,可在线阅读,更多相关《USB开发步骤之软件篇(11页珍藏版)》请在金锄头文库上搜索。

1、USB开发步骤之软件篇我这里重点的介绍如何写驱动程序,对于一些应用程序我就不做介绍了,因为我对于那些高层的东西写得很少。倘若再讲,有班门弄斧之嫌,呵呵!作为WIN98和WIN2K推荐的一项新技术来说,USB的驱动程序和以往的直接跟硬件打交道的WIN95的VXD的方式的驱动程序不同,它应该是WDM类型的。USB的 WD接口框图如下(这个图可以说是USB软件总体框图)HIDCLASS.SYSOtherUSB DriverUSBDriverInterfaceHIDUS0.SYSclientsUSBHUB.SYSUSBD SYSUSB Driver StackUHCD.SYSOpenHCl.SYSPC

2、I EnumeratorUSB Bus对于HID的设备,就可以采用上图左上边的结构,其它类的话采用右上的结构,其实右边的结构可以又细分成两层,一层是Class Driver ,一层是Miniport Driver。而倒数第三行的 UHCDffi OpenHCI分别是由INTEL和COMPA两位老大定的一个和硬件有关的底层驱动程序标准,各位可以根据所需要的选择。对于USB的驱动程序,大家还得去了解WDM区动程序的写法,或者早些时候的NT驱动程序,其实 WDME动程序可以看做是 NT驱动程序的一个update,只是增加了一些新的特性。“写驱动程序是一个很漫长和繁琐的工作,在此之前,你最好要熟悉硬件

3、,熟悉C/C+,还要用过DDK会用一些调试程序,如SOFTICE和WINDBG之类。如果一切就绪,你就可以开始写驱动程序,工作的进程有时侯会取决于你的运气”。(这是一位留美的朋友对我说的,我写岀来和大家共享) 下面是我从一个朋友那里得到的一篇文章的摘要:NT驱动程序的分层结构驱动程序是指管理某个外围设备的一段程序代码。NT采用更灵活的分层驱动方法,允许杂应用程序和硬件之间存在几个驱动程序层次。分层机制 允许NT更加广泛地定义驱动程序,包括文件系统、逻辑卷管理器和各种网络组件,各种物理设备驱动程序等等。1、设备驱动程序 这些是管理实际数据传输和控制特定类型的物理设备的操作的驱动程序,包括开始和完

4、成 I/O 操作,处理中断和执行特定的设备要求的任何差错处 理。2、中间驱动程序NT允许在物理设备驱动程序上分层任意数目的中间驱动程序。这些中间层次提供扩展I/O系统的功能一种方法,而不必修改底层的驱动程序。这也是微软鼓吹的他们的系统灵活的一面!实际上我觉得这样反而牺牲了一些效率上的东西。3、文件系统驱动程序 (FSD)FSD是一类比较特殊的驱动程序,通常负责维护各种文件系统所需要的磁盘结构。注意我们并不能使用DDK来开发FSD而必须使用Microsoft的文件系统开发人员工具包。一般比较少写中间过滤驱动程序,过滤驱动程序它截获和修改高层发送给类驱动程序的请求。这样就允许利用现有类驱动程序的功

5、能,而不必从头 开始写所有程序。NT内核模式对象在我们的实际开发过程中的对象是设备,由于端口驱动程序已经隐藏了硬件控制操作,因此我在这里不讲述跟 硬件相关的部份。如果今后的开发对象不同,需要对硬件进行操作的时候,可能会对中断、DMA等有比较详细的了解,这些内容可以参考DDK帮助。NT使用对象技术管理所有的数据,下面分别对一般驱动程序所涉及的一些对象做一介绍。不过在介绍这些对象之前,有必要先对驱动程序的结构 做一介绍。驱动程序结构NT驱动程序和一般的 DOS/Windows C语言程序不一样,它没有 main()或者WinMain()函数入口。和DLL类似地,它向操作系统显露一个名称为Drive

6、rEntry() 的函数,在启动驱动程序的时候,操作系统将调用这个入口。DriverEntry 除了做一些必 要的设备初始化工作外,还初始化一些 Dispatch例程入口。我们知道,NT应用和设备驱动程序打交道主要是通过CreateFile、ReadFile、WriteFile 和DeviceloControl 等 Win32 API来进行 的。这些 API 其实都对应着驱动程序的一些 Dispatch 例程。而驱动程序除了 DriverEntry 以外,主要就是由这些 Dispatch 例 程组成的。例如 调用Win32 API CreateFile的时候,操作系统最终转化为对驱动程序IRP

7、_MJ_CREAT功能代码所对应的 Dispatch 例程的调用,如果驱动程序没有提供该例程, CreateFile 调用就会失败。NT中一些常用的功能代码和 Win32 API的对象关系如下所示。功能代码说明IRP_MJ_CREATE IRP_MJ_CLEANUP /O 请求 CloseHandle IRP_MJ_CLOSE打开设备 CreateFile在关闭设备时,取消挂起的 I关闭设备 CloseHandle从设备获得数据 Rea向设备发送IRP_MJ_READ dFileIRP_MJ_WRITE数据 WriteFileIRP_MJ_DEVICE_CONTROLoControl对用户模式

8、或内核模式客户程序可用的控制操作DeviceIIRP_MJ_INTERNAL_DEVICE_CONTROLIRP_MJ_QUERY_INFORMATIONIRP_MJ_SET_INFORMATIONIRP_MJ_FLUSH_BUFFERSFlushFileBuffersFlushConsoleInputBufferPurgeCommIRP_MJ_SHUTDOWN只对内核模式客户程序可用的控制操作得到文件的长度 GetFileLength 设置文件的长度 SetFileLength 写输出缓冲区或丢弃输入缓冲区系统关闭 InitialSystemShutdown和上面的驱动程序支持的功能代码相对

9、应,一般的驱动程序看起来就象下面的样子。DriverEntry( )/驱动程序入口DeviceObject-MajorFunctionIRP_MJ_CREATE = XXDriverCreateClose; /XX DeviceObject-MajorFunctionIRP_MJ_CLOSE = XXDriverCreateClose; DeviceObject-MajorFunctionIRP_MJ_READ = XXDriverReadWrite; DeviceObject-MajorFunctionIRP_MJ_WRITE = XXDriverReadWrite;对应的是你自己给你的驱动

10、程序的命名XXDriverCreateClose()对应 IRP_MJ_CREAT和 IRP_MJ_CLOS的例程 / .XXDrive rDeviceControl()对应 IRP_MJ_DEVICE_CONTRO1例程/ .XXDriverReadWrite()/ 对应 IRP_MJ_REA併口 IRP_MJ_WRIT啲例程/ .一个驱动程序并不需要支持所有的功能代码,比如如果一个驱动程序根本就不必要与用户模式客户程序交互,那么就不用支持IRP_MJ_CREAT和 IRP_MJ_CLOSE又如设备不支持设备读写,就不用支持IRP_MJ_READ口 IRP_MJ_WRITE 驱动程序对象是在

11、操作系统启动驱动程序、在调用驱动程序入口 DriverEntry 之前就已经创建好了的,并且作为 DriverEntry 函数的参数传递给驱动程序。如果驱动程序启动失败,操作 系统将删除该 对象。该对象的数据结构如下。注意下表并不是完整地列出了ntddk.h中的DEVICE_OBJEC结构体的所有数 据项,这里仅列出了一般驱动程序可能使用到的数据项Driver对象数据项说明PDEVICE_OBJECT DeviceObject由本驱动程序创建的 Device对象的链表ULONG FlagsPDRIVER_INITIALIZE DriverInit驱动程序初始化例程(一般较少用)PDRIVER_

12、STARTIO DriverStartIoStartIo 例程入口,一般该例程对低层设备驱动程序用得较多,高层驱动程序较少使用本例程。PDRIVER_UNLOADDriverUnload卸载驱动程序例程,如果想在控制面版的设备里停止该设备,应该提供 本例程。PDRIVER_DISPATCH MajorFunctionIRP_MJ_MAXIMUM_FUNCTION + 1驱动程序的Dispatch例程表在上面提到过驱动程序是管理同类型的所有设备,所以上面的结构中DeviceObject指向的就不是单个的设备对象,而是一个对象链表,这个链表的维护在下面介绍 Device对象时可以看到。Device

13、对象与Device Extension驱动程序在调用loCreateDevice 函数成功后就创建了一个Device对象。下面对Device对象几个比较重要的数据做一介绍。Device对象数据项说明PVOID DeviceExtension指向Device Extension 结构的指针PDRIVER_OBJECT DriverObject指向这个设备的Driver对象的指针,IoCreateDevice 会自动填写本数据。ULONG Flags指定这个设备的缓冲策略PDEVICE_OBJECT NextDevice指向属于这个驱动程序的下一个设备对象,依靠本数据来维护设备对象链表CCHAR

14、StackSize发送到这个设备的IRP需要的I/O堆栈单元的最小数目,一般对分层驱动程序来说,本数据应该比其下层设 备的大1ULONG AlignmentRequirement缓冲区要求的内存对齐,一般对分层驱动程序来说,本值应该和其下层设备的对齐一致Device记录着设备的特徵和状态信息,对系统上的每个虚拟的、逻辑的和物理的设备都有一个Device对象。例如对一个硬盘驱动程序,对一个物理硬盘有一个名称为 Partition。 的Device对象,对应整个物理磁盘,同时对硬盘的每个分区,也都有一个Device对象,它们的名称分别为 PartitionX(X 从1开始,每个分区对应一个数字)。

15、Device Extension是连接到Device对象的一个很重要的数据结构,它的数据结构是由驱动程序设计者自己来确定的,在调用IoCreateDevice 的时候应该指定它的大小,Device Extension其实是由操作系统在非份页内存池中为每个Device对象分配的一块内存。由于驱动程序必须是完全可重入的,因此使用任何全局变量和静态变量都不是好的办法,一般来说和设备有关的任何需要保持的信息都应该放到Device Extension 里去。设备的缓冲策略也必须提一下,这里的 Flag的缓冲策略主要决定设备读写(功能代码IRP_MJ_REA和 IRP_MJ_WRITE时候的缓冲策略,另外功能代码IRP_MJ_DEVICE_CON

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号