引
原来做硬件的X老师,让我使用硬件时,采用的是调用VXD方式的WINIO库。后来,给了一个别人写的当“幌子”的驱动,那驱动不起任何作用的。
一直都觉得不是“很专业”。从9月上旬,开始实验写驱动,但一直不得法。后来给自己下了个DEADLINE,要在国庆黄金周前搞定,否则,返回使用WINIO库。时间我耗不起。DEADLINE还是有点效果的,国庆前,驱动竟然写出来,并调用成功了。
以前在C公司时,听Z老师,指点W大学的学生,如何写驱动时,“偷听”了一些(没有身受指点,有点后悔啊)。“用DDK很难,一般使用第3方工具,WINDRIVER(还是DRIVERSTUDIO)通过设置好,会自动生成”。
开始
由于以前Z老师说的,我先使用WINDRIVER,让它自动给硬件生成驱动。好象不怎么成功,不知道是软件问题,还是什么情况。通过WINDRIVER附带的一些工具软件,发现了,每个PCI硬件设备的配置信息。
改用DRIVERSTUDIO。在图书馆借了2本驱动编程的书。书中,介绍说,DDK太难了,普通快捷一些,一般使用DRIVERSTUDIO。通过向导自动生成了驱动的代码。编译老出现错误。
实践摸索
网上搜索,发现不少人有类似的情况。原来DRIVERSTUDIO算是建立在DDK上的第3方库,简化了开发难度。需要安装DDK。安装了XP DDK,还是存在一些问题。再次搜索,网上的“前辈”说,使用XP DDK要进行一些配置,而使用2003 DDK,可以省去那些配置。安装2003,加上将DRIVERSTUDIO中的内联库编译生成相关的库,驱动编译成功。驱动不像普通的程序,有DEBUG和RELEASE选项,只有FREE和CHECKED选项。我从字面理解,CHECKED是检查后的,是发行版本,测试使用的是FREE版。(后来,发现我错了!)
试图安装,安装老是失败。试着将SYS的文件,给一个别的INF文件安装,成功。说明问题在INF文件。修改INF文件,安装成功。不过,不对的地方是,在没有装硬件的电脑上驱动也是启动的。(正常的情况,应该是提示无法启动,给一个错误代码)
参考网上下载的写的基于9056的驱动源代码和DRIVERSTUDIO带的基于9054的例子源代码,我给代码中添加内存范围和中断请求。在无硬件PC上安装出现无法启动提示,而有硬件PC也出现了无法启动提示。删除中断请求,情况还是一样。
顿时,一顿迷茫。
重回WINIO,发现通过找地址方式,找到的硬件的基地址,就是最早驱动属性中资源的输入/输出范围的开始地址。结合驱动指导书中所写的“系统自动分配资源,与代码无关”。需要在代码中,添加输入/输出范围对像而不是内存范围对象。生成后,有硬件和无硬件电脑上安装,达到预期的效果。
按照指导书上的说明,通过CREATEFILE、READFILE和WRITEFILE实现通讯,DRIVERMONITOR跟踪。怎么也没办法跟踪到驱动中去,将预编译符号NDEBUG取掉,可以跟踪到驱动中的调试信息。通过跟踪到代码中,可以看到准备的数据传进去了。通过向输入/输出范围的对象,一次将所有数据写入IO端口,不成功。后来,试着,每次写4个字节的数,数据写入到了硬件中。调试成功。
总结
1、硬件中存在输入/输出或内存资源。不实例化对应的对象,驱动是成功的。可以通过在驱动的属性的资源中看硬件的输入/输出范围或内存范围,也可以通过WINDRIVER的PCI配置工具查看。必须正确实例对应的资源对象,否则会存在错误。
2、FREE是发行版,看调试信息必须使用CTRACE跟踪信息,CHECKED是调试版,可以使用CDEBUGONLYTRACE跟踪信息。
3、写数据时,要分清是缓冲,还是4字节写数据。