阅读:4547回复:23
好文推荐!--用WinDriver开发适合多平台的硬件设备驱动程序
用WinDriver开发适合多平台的硬件设备驱动程序
■南京理工大学 吕琦鹏 顾红 苏卫民 ――――――――――――――――――――――――――――――――――――――― ――――――――――――――――――――――――――――――――――――――― 关键词 驱动程序,WinDriver,VC, 多平台,分发 ――――――――――――――――――――――――――――――――――――――― 引言 电子工程师们在设计完毕硬件电路后,面临的最大问题莫过于开发硬件设备的驱动程序。但是开发驱动程序涉及到较多的系统内核知识,编程难度较大,而且不同的操作平台可能需要不同格式的驱动文件,如Win98下的虚拟驱动程序.vxd不适用于Win2000/NT,Windows的驱动程序又不适合Linux等平台。因此如何在短时间内针对自制硬件开发易用、兼容性好的驱动程序是开发人员的重要课题。为此,我们选择了美国Jungo公司的WinDriver开发包,为自己的PCI插卡开发了实用的驱动程序。 1 WinDriver开发包简介 WinDriver是美国Jungo公司出品的用于编写硬件驱动程序的一种工具软件,主要针对ISA插卡、PCI插卡和USB这些硬件的设备驱动程序进行开发的。其主要优点如下: • 不需要太多专门的操作系统和驱动程序方面的知识; • 功能强大的向导Driver Wizard,帮助开发者进行硬件诊断和自动生成代码; • “Kernel PlugIn” 允许在内核级运行代码来获取更好的性能; • 支持I/O、中断控制和访问板卡映射的存储器; • 支持中断、DMA和即插即用等功能; • 支持C, C++, VB和Delphi等多种编译器; • 同样的代码能运行于Windows 9X、 NT、 2000、 XP、CE, Solaris, Linux, VxWorks 等多种平台; • 支持一些PCI和IP芯片厂商,如PLX, Altera, AMCC, Galileo, V3, PLDA等; • WinDriver 调试监视器允许当驱动程序运行时监视内核模式的行为; 2 利用WinDriver向导开发设备驱动程序的流程: (1)打开Driver Wizard,在Card Information的设备列表中选中自己的设备,点击“Generate .INF file”生成设备安装信息文件,再点击“OK”进入资源栏“Recourses”; (2)调试列出的I/O、内存等资源,确定硬件设计的正确性; 图 1 读写内存资源 (3)定义程序中必要的工作寄存器,如PCI卡上的一些配置寄存器; 图 2 定义工作寄存器 (4)指定一个已定义的寄存器给该设备分配的中断号以监听中断,对于ISA设备要在定义时选中“Edge Triggered”,对于PCI设备则选中“Level Sensitive”,定义完毕后点击“Listen to Interrupts”进行监听。图3显示了收到28个中断的结果; 图 3 监听中断及其日志结果 (5)点击“Generate Code”,选择VC编译器作为自己的开发语言,此时将生成针对你的硬件的文件,包括代码文件、说明文件以及适用于VC编译器的项目文件。 利用Driver Wizard可以很快产生一个较为完善的程序框架,具备设备检测、配置寄存器读写、自定义寄存器读写、I/O和Memory空间访问等功能,甚至还可以访问EEPROM。此时你也可以用产生的.INF文件按常规步骤来安装你的硬件驱动,由WinDriver提供的内核文件接管你的设备,下面要做的工作己转入基于WinDriver的应用程序开发。 3 用VC实现其中的应用程序部分 假设刚才定义了自己的硬件设备为YourDevice,并生成了相应的程序框架,下面我们用VC打开刚生成的YourDevice.dsw项目文件,你会发现WinDriver已经针对你的硬件产生了特定的API函数,如: YourDevice_Open()YourDevice _ //打开该设备句柄 YourDevice_Close() //关闭该设备句柄 YourDevice_WriteReg() //写寄存器 YourDevice_ReadReg() //读寄存器 YourDevice_Interrupt_Enable() //中断使能 YourDevice_Interrupt_Disable() //中断禁止 YourDevice_Interrupt_HandlerRoutine() //中断处理代码 结合这些函数和WinDriver自带的一些API函数便可以在此驱动程序的框架上开发应用程序的功能。下面给出在main()函数和另外两个函数中增加的实现中断的程序片断: If (hPlx) {…… YourDevice_WriteReg (hPlx, YourDevice_INTCSR,251730176); //写入f011900H,允许产生Local Bus中断 YourDevice_WriteReg (hPlx, New_Register0, 10); //假设刚才定义的New_Register0是可以引发中断的邮箱寄存器,改变它的值产生中断 ……} BOOL YourDevice_Interrupt_Enable (YourDevice_HANDLE hPlx, YourDevice_INT_HANDLER funcIntHandler) {…… printf(\"写控制寄存器清中断源,准备打开中断线程 \\n\"); dwCntrlStatus = YourDevice_ReadReg(hPlx, YourDevice_CNTRL); dwCntrlStatus = 0x10064006 ;//这里的值由不同情况而不定 YourDevice_WriteReg (hPlx, YourDevice_CNTRL,dwCntrlStatus); ……} void WINAPI YourDevice_Interrupt_HandlerRoutine (YourDevice_HANDLE hPlx, YourDevice_INT_RESULT *intResult) {DWORD dwCntrlStatus; DWORD dwIntStatus; //清除中断源 dwCntrlStatus = YourDevice_ReadReg(hPlx, YourDevice_CNTRL); dwCntrlStatus = 0x10064006 ;//这里的值由不同情况而不定 YourDevice_WriteReg (hPlx, YourDevice_CNTRL, dwCntrlStatus); //下面添加中断处理程序,intResult->dwCounter是WinDriver提供的中断计数器 printf(\"\\n 这是第 %d 次中断 \\n\",intResult->dwCounter); ……} 开发好应用程序部分后,即可以生成最终的驱动程序,并发布到目标机中。 4 驱动程序的分发 分发的意思是能够在其他计算机上以安装标准设备的方式安装自己的硬件设备,而且不需要目标机上安装WinDriver。首先你需要购买一个合法的license,否则你只能使用30天的评估版WinDriver。需要注意的是评估期过后,不仅WinDriver会失效,而且所开发的驱动程序也会随之失效。 当你成为注册用户后,可以按以下步骤进行分发: (1) 注册WinDriver 应当在自己的程序启动时调用一下注册函数RegisterWinDriver(),这样是为了向系统注册WinDriver的内核,否则必须先启动一下Driver Wizard再关掉才能使用自己的程序。使用VC、VB、Delphi、C++Builder的用户都可以在Form或Dialog的初始程序中调用一下RegisterWinDriver()。该函数内容如下: void RegisterWinDriver() { HANDLE hWD; WD_LICENSE lic; hWD = WD_Open(); if (hWD!=INVALID_HANDLE_VALUE) { strcpy(lic.cLicense, \"此处填入自己的注册码\"); WD_License(hWD, &lic); WD_Close(hWD); } } (2) 将.vxd或.sys文件拷贝到要安装的计算机中 一般在DriverWizard自动生成的inf文件的[PLX_9054.Files.Ext]一节中会已列出默认的拷贝文件windrvr.sys和wdpnp.sys。如果它们没有被注释掉,即前面没有分号,这说明添加新硬件安装驱动时将拷贝这两个文件。若没有列出或被注释掉了,则需手工添加如下: 对于Windows 98/Me/NT/2000/XP:将WINDRVR.SYS拷贝到 [Windows 安装目录]\\SYSTEM32\\DRIVERS中; 对于Windows 98/Me/2000/XP:将WDPNP.SYS 拷贝到 [Windows 安装目录]\\SYSTEM32\\DRIVERS中; 对于Windows 95:将WINDRVR.VXD 拷贝到C:\\WIN95\\SYSTEM\\VMM32中; 注意: WINDRVR.SYS 也可以用于 Windows98/ME,但由于Windows 98/ME的限制,不能动态加载这个文件,必须要重启动计算机。如果想要不重启计算机的话,可以用WINDRVR.VXD 代替(仅限于windows 9x/me)。另外注意不要用旧版的windrvr.sys或 windrvr.vxd覆盖新版的文件。 (3) 动态加载驱动程序 动态加载的作用仅是不必重启计算机。在\\WinDriver\\samples\\wdreg目录中,WinDriver提供了注册内核驱动的程序代码,你可以用VC等编译器将之生成可执行程序WDREG.exe。需要注意的是这个程序是一个命令行程序,后面可以有多种参数选择,常用的如下: 选项参数: -startup 仅对WinNT有效(可以设置startup的层次: boot, system, automatic, manual, disabled) -name 指定驱动程序的名字(缺省是WinDriver) -file 指定驱动程序文件名 -vxd 加载一个vxd文件到Win98中(缺省是sys文件) 行为参数: create 产生驱动程序的注册表项目 start 启用这个驱动程序 install 等于create和start的共同作用 delete 删除驱动程序的注册表项目 stop 启用这个驱动程序 remove 等于stop和delete的共同作用 例如要加载一个名为Data Collection的驱动,它有两个文件分别是DC.VXD ,DC.SYS,那么可以按如下使用参数: WDREG -name \"Data Collection\" -file DC -startup manual create start 或: WDREG -name \"Data Collection\" -file DC -startup manual install 要卸载缺省的核心驱动(即WinDriver)并将之从注册表中删除,则为: WDREG stop delete 或: WDREG remove 通过命令行参数输入的方法进行加载卸载总是有些不太方便,我们可以修改\\WinDriver\\samples\\wdreg\\wdreg.cpp,对加载、卸载核心驱动分别固定其中的参数值,生成不同的可执行文件,或直接嵌入用户程序中,这样就不必再输入参数。 5 结束语 在Windows98/2000,VC++6.0, WinDriver5.03的环境中,我们在较短的时间里为自己的PCI插卡开发了驱动程序和应用程序,实现了检测、资源访问、中断等功能。但是应该指出前面开发的程序是工作在CPU三环保护模型中的Ring3级(用户层),*.exe是开发结果的形式体现。开发者在目标机上安装硬件时不需要安装WinDriver,但会用到WinDriver提供的Windrvr.sys、wdpnp.sys和前面生成的inf文件。其作用便是指定WinDriver的内核作为应用程序访问硬件的桥梁,这样开发者便可以更好地把精力集中到应用程序开发中。如果开发者有高性能的特别要求,可以使用WinDriver开发包中的Kernel Driver工具再进行深入开发,生成Ring0级(内核层)形如.sys、.vxd的驱动。 参 考 文 献 1 刘晖等译. PCI系统结构(第四版). 北京:电子工业出版社,2000 2 黄讯等,孙政顺. 利用WinDriver开发PCI设备驱动程序. 电子技术应用,2001(3) 3 WinDriver V5 User’s Guide. Jungo公司,2001 4 彭礼孝编. 虚拟设备驱动程序开发起步与进阶. 人民邮电出版社,2000 作者简介: 吕琦鹏,男,1978年9月生,南京理工大学通信与信息系统硕士研究生,1998年毕业于东南大学电气工程系电力系统及其自动化专业。研究方向:数据采集与处理,驱动程序开发。 |
|
最新喜欢:jeanye
|
沙发#
发布于:2003-11-03 10:05
是很方便,但看过以前很多得介绍,都说,效率不高,做ISA得还可以,如果是PCI得话,还是用DDK和DS好些
|
|
|
板凳#
发布于:2003-11-03 11:21
对于我们这些新手
真是在好不过了 gxgx!! |
|
地板#
发布于:2003-11-04 09:38
我在南理工读的本科。 |
|
|
地下室#
发布于:2003-11-11 15:20
怎么打不开附件???
|
|
5楼#
发布于:2003-11-11 16:04
附件好像是被虑掉了。有想要的朋友留个mail吧
|
|
|
6楼#
发布于:2003-11-11 18:59
Email: bule_spiter@163.com
谢谢!!! |
|
7楼#
发布于:2003-11-12 10:14
我要一个:谢谢了!
xinyancode@163.com |
|
8楼#
发布于:2003-11-12 11:20
给我也发一份吧!
e-mail: yajan_cl@btamail.net.cn |
|
9楼#
发布于:2003-11-12 12:59
不好意思,地址写错了,应该是
blue_spiter@163.com |
|
10楼#
发布于:2003-11-13 13:49
我也要一个:yymusic1213@163.com
谢谢! |
|
11楼#
发布于:2003-11-13 19:33
mail给我! thank u !
liqian_zhang@sina.com |
|
12楼#
发布于:2003-11-13 21:08
flyoung:
发了吗?怎么我还没收到? |
|
13楼#
发布于:2003-11-17 21:35
谢谢:
jessibeier@hotmail.com |
|
|
14楼#
发布于:2003-11-25 12:23
发给了一下朋友,请查收。
blue_spiter@163.com,xinyancode@163.com,yajan_cl@btamail.net.cn,yymusic1213@163.com,liqian_zhang@sina.com,jessibeier@hotmail.com |
|
|
15楼#
发布于:2003-11-26 16:31
偶,收到,谢谢!
|
|
|
16楼#
发布于:2003-11-29 00:24
谢谢
shiefoor2@hotmail.com 有礼先 |
|
|
17楼#
发布于:2004-05-01 10:34
谁有附件给我发一份呀,谢谢
pyli@gms.phy.pku.edu.cn |
|
18楼#
发布于:2004-05-03 12:25
好东西,对我这个初学者很有帮助,顶!
有附件的兄弟能否发一份给我,多谢:) email:seabird0813@tom.com |
|
19楼#
发布于:2004-05-09 16:36
好东西,能否发一份给我,多谢
email:ymd1023@tom.com |
|
|
上一页
下一页