利用WinDriver开发PCI设备驱动程序

上传人:s9****2 文档编号:513683773 上传时间:2024-01-18 格式:DOCX 页数:4 大小:37.08KB
返回 下载 相关 举报
利用WinDriver开发PCI设备驱动程序_第1页
第1页 / 共4页
利用WinDriver开发PCI设备驱动程序_第2页
第2页 / 共4页
利用WinDriver开发PCI设备驱动程序_第3页
第3页 / 共4页
利用WinDriver开发PCI设备驱动程序_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《利用WinDriver开发PCI设备驱动程序》由会员分享,可在线阅读,更多相关《利用WinDriver开发PCI设备驱动程序(4页珍藏版)》请在金锄头文库上搜索。

1、摘 要:WinDriver是一套PCI驱动程序开发包。它改变了传统驱动程序开发的方法与思路,极在地简化了驱动 程序的编制;同时,又没有牺牲驱动程序的性能,是一套高效、快捷的PCI驱动程序开发软件包。特别适合专业 硬件人员的使用。关键词:设备驱动程序 WinDriver PCIWinDriver是Jungo公司出版的一个设备驱动程序开发组件,它可以大大加速PCI设备驱动程序的开发。作者在 实际的项目中采用了 WinDriver来开发设备驱动程序,取得了相当好的运行效果。从目前国内的资料上来看,大 多数设计人员还是在用 DDK、 Wtools 开发设备驱动程序,因而作者觉得有必要向大家介绍与推荐这

2、个软件。WinDriver是一套设备驱动程序开发组件,它的目的就是方便Windows程序员快速开发出PCI/ISA设备的Wind ows驱动程序(目前最新的版本V4.32还支持PCMCIA、USB设备的驱动程序的开发,并且除了支持Windows 9X/NT系统外,还有支持Unix、Windows CE的版本推出)。利用WinDriver开发设备驱动程序,不需要熟悉 操作系统的内核,整个驱动程序中的所有函数都是工作在用户态下的,通过与WinDriver的.Vxd或者.Sys文件交 互来达到驱动硬件的目的。由于是一个用户态程序,效率的高低也就成了人们选择WinDriver时关心的一个问题。 大量实

3、践数据表明,WinDriver并没有通过牺牲系统性能来换取驱动程序的快速开发,的确是一个“像开发用户态 程序那样简单,像核心态程序那样高效”1的开发工具。图1是WinDriver的体系结构图。1 WinDriver 主要特征提供了从用户层访问硬件的简单方法;能够方便地将性能要求特别苛刻的部分通过Windriver提供的API插入到核心态模式运行,提高执行效率;对主流PCI接口芯片(AMCC、PLX、V3系列)提供了很好的支持;可以利用常见的软件开发平台(Visual C+、Borland C+、VB4、Java、Delphi);支持I/O、DMA、中断处理,支持PCI、ISA、EISA设备的开

4、发;无需DDK以及核心态程序开发的经验。2 开发步骤a根据WinDriver的文档,建议开发步骤如下:修改代码,加入定制功能;在用户态执行与调试代码;将性能苛刻部分插入到核心态;b.我们在实际编写驱动程序的过程中发现,完全用WinDriver提供API来写驱动程序比在Wizard生成的框架代 码上修改更为灵活。一般来说, PCI 驱动程序分成 3个部分:初始化部分,对硬件资源的访问函数库、具体调用 部分。其中,后面两个部分对于不同的硬件都是基本一致的。比如说,我们先后开发的基于AMCC5933与PLX 9052的PCI接口卡,对于他们的硬件资源访问,用的都是WinDriver下面相同的API;

5、两者开发的不同只在于 初始化时对于硬件资源的锁定。所以只要开发出了针对一种接口芯片的系统的驱动代码后,以后一般只要修改接 口芯片的 ID 值及一些寄存器的偏移值,就能够移植了,比每次生成不同的框架代码再改动也许要更简便。3 实例分析整个驱动程序的结构大致如下:打开WinDriver设备;查找我们要访问的PCI设备;枚举该设备的资源(内存、I/O、中断);锁定该设备的资源只能为我们所用,不能被其他程序访问;访问板上的资源;解锁资源;咲闭WinDriver设备。以下为一段使用WinDriver开发的AMCC5933DMA的驱动代码,利用这个程序来演示WinDriver的程序结构。这个程序只要稍加修

6、改,就可以用来作为其他PCI卡的驱动程序的一部分,例如PLX9050、9054。为了节省篇 幅,省略了变量说明部分。程序中出现的变量大都由其名称可以反映含义,具体可以参见WinDriver的设计文档 中的说明。hWD=WD_Open(); /打开 WinDriver 设备,每次使用前必须调用;pciScan.searched.dwVendorId=0x10e8; /AMCC 公司供货号pciScan.searched.dwDeviceId=0x4750; /AMCC5933 的设备号WD_PciScanCards (hWD,&pciSxcan); /枚举 PCI 槽上的设备pciSlot =p

7、ciScan.cardSilt0; /假设只有我们一个设备得到设备槽的号码pciCardInfo.pciSlot=pciSlot;WD_PciGetCardInfo(hWD,&pciCardInfo); /得到该设备槽上的设备信息Card=pciCardInfo.Card; /Card 为一个反映 PCI 卡上资源的结构cardReg.Card=Card;WD_CardRegister(hWD,&cardReg); /向核心态登记,锁定卡上资源Item=Card.Item2; /将卡上的号为 2 的资源赋给 Itemif(Item.item=ITEM_MEMORY)regAddr=Item.I

8、.Mem.dwUserDirectAddr; /得到 PCI 卡上的内存映射到用户态的地址Dma1.dwBytes=4*dwDWord;Dma1.pUserAddr=pBuffer1;Dma1.dwOptions=0;WD_DMALock(hWD,&Dma1); 锁定用于DMA的内存资源至此与PCI卡上的内存进行DMA传输的准备已经完成,下面只要写相应的控制字就可以启动DMA操作了。4 常见问题的解答(1)评估版本的功能限制及其解决评估版本除了 30天的限制外,与正式版本相比还有3个限制。其中影响最大的是所有的关闭函数(DMA锁定内 存的解锁,资源的关闭)都加了延时。这样我们在做数据采集卡的驱

9、动程序时就要注意,最好只分配一次资源。 比如说做DMA操作,不要反复地锁定内存,这样会在解锁时损失效率。一个折衷的方法是锁定DMA内存后, 一旦这块内存写满后,就将其中数据拷到用户态程序分配的大内存中去。(2)用 WinDriver 开的程序效率在使用WinDriver或者VxdTools这类工具时,大家最关心的一个问题可能就是效率问题。从实践与分析来看,WinDriver生成的驱动代码的效率相当地高。比如PCI卡的高速数据采集涉及到DMA的应用,WinDriver提供相 应的 API 来将卡上的内存映射到用户态程序所能直接访问的地址空间中,然后直接对这个映射后得到的地址进行 DMA操作。也就

10、是说,与用DDK来直接编写驱动程序的区别就在于地址映射的操作上,在这部分工作上面,用 WinDriver的API肯定没有直接用DDK写的专门面向特定硬件优化的代码来得高效。但是这部分代码实际上属 于初始化工作,这部分的效率高低事实上并不会影响总体上的效率。实际中,用WinDriver编写的PCI驱动程序在赛扬466、64M内存的机器上,在8位模式下可以稳定地采集4 8Mbytes/s的数据。而且随着硬件设计的改变,肯定还有提高余地。经过实际应用,发现WinDriver这个软件使用快速,无论是开发效率还是实际达到的性能指标都相当令人满意。 特别对于硬件开发人员来说,可以不必了解繁琐的操作系统的内核知识,就可以快速地开发出驱动程序,对于调 试硬件是一个很好的帮助工具。

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

当前位置:首页 > 学术论文 > 其它学术论文

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