同学走后,再次走进图书馆,想专心啃书。但也许是一连玩了好几天,脑袋一下子放松不转了,坐了一上午,发现效率较之前更低。我想再也不能这样下去了,因为时间已经不多,只有个把月的样子就得开始写论文了。那怎么办呢?光说不练假把式。我得学着编驱动,学着用VC,用Driver Studio,只有在应用的过程中才能消化所学内容,并更系统地、更有目的性地学习新内容(接下来几天的成果验证了这句话,这也成为了我积累下的一个实践经验。当然,这是后话)。
于是,14日下午我就改呆寝室了。实战从最简单的开始。感谢薛园园的书,虽然涉及驱动的部分很少,但很能领人入门,我的第一个驱动就是《USB应用开发技术大全》第10章的例子KFileWrite。按书所说,将DriverWizard的工作一步步做完,然后输代码,最后组建。但组建的时候出了问题,是cvtres.exe捣的鬼(具体问题已在前几篇描述)。后来终于把驱动程序给build成功并生成.sys文件了,但自动生成的应用程序又挂了:build后无法执行。只好求助于baidu搜索,也在学校论坛相应版块发了贴,但都不果。顿时,感觉走入了黎明前的黑暗,是期盼,是沮丧,我也说不清楚。
4月17日 曙光篇
前几天的学习陷入了僵局,不知所措,只好看看ezusb.sys的原代码,看看Driver Studio的帮助文档。jmj同学发短信问进展,只有蔫蔫地回说没进展。晚上,不死心,继续baidu。突然看到驱网上有人针对应用程序无法执行的问题回帖说不要用VC来build,改用Driver Studio菜单下的Build with Build.exe。大喜,尝试之,不行。不过查看错误提示,“F:\java\test\app==>call D:\winddk\2600\bin\build.exe D:\Program不是内部或外部命令...”感觉这怎么有点命令行的味道,它的意思是调用不了build工具。于是,我打开cmd,输入build,也报错“build不是内部或外部命令...”。
那又该怎么办呢?对了,之前那个帖也有人说用ddk来build。想起来ddk有四个Build Environments,一直不知道有什么用。参考了一些文章,学习了其用法,原来用ddk编程时就靠它们来build的。于是打开了Win XP Checked Build Environment,出现了命令行窗口,且路径为:D:\winddk\2600。通过cd命令,进入待build的应用程序目录,如F:\test\app,然后输入build,只见窗口内容在很快地滚动,一会儿就显示"Done"。打开目录,发现里面果然有了.exe文件。双击,哈哈,不再是那句烦人的“...不是有效的应用程序”,而是和书上一模一样的用户界面。赶紧用EzDriverInstaller装入驱动程序,接着按部就班。终于,应用程序执行之后,F盘内生成了一个文本文件,内容是“a”!那一刻,我激动得喊了一声:“庆祝一下,我成功了!”
4月18日 进步篇
经历了前一个晚上的狂喜,我希望新的一天,有新的突破。昨天的成果是单纯建立在驱动程序上的,并没有实现和硬件的互动。因此,我想新建一个USB总线的Driver,让它和开发板通信。因为USB有四种传输方式,其中好像只有控制传输在Driver Studio中有封装好的函数,看了一下是BuildVendorRequest。所以决定从控制传输入手。因为开发板自带了控制输出的测试程序(点应用程序界面的相应按钮,就可以通过端点0传输相应命令代码,让数码管显示不同数字,或让数字递增、递减),我可以完全用它的固件,另外Driver Studio可以自动生成应用程序,所以我只要专心做驱动程序就OK了。在DriverWizard的步骤中,选USB总线,填上用USBViewer得到的PID和VID(在我的另外一篇帖子有提过方法),然后添加一个IOCTL(也可以添加几个,对应好几个命令。我这里只用一个,对应让数字递减的命令),等等,完成后开始修改IOCTL_800_Handler(KIrp I)内的代码,添加如下代码:
PURB pUrb = m_Lower.BuildVendorRequest(
NULL,
0,
0,
0xBC,
0,
FALSE,
FALSE,
NULL,
0
);
if (pUrb)
{
status = m_Lower.SubmitUrb(pUrb);
}
else
{
status = STATUS_INSUFFICIENT_RESOURCES;
}
return status
其中,0xBC即为命令代码,因为当固件收到这个命令后就会让数码管的数字递减。其他参数可参见Driver Studio的关于函数BuildVendorRequest的帮助文档。
好了,把驱动程序和应用程序都build通过之后,接下来的任务就是安装驱动程序了。首先用开发板的Control Panel将控制输出的固件download到芯片内,然后进入设备管理器,右击相应器件,选择“更新驱动程序”,按提示即可将自己写的驱动装入。接着打开自己的应用程序,设置后点“execute transfer”,就会看到每点一次,数码管的数字就会减一。当时的高兴劲儿,真的有点喜极而泣的感觉。不过现在写这篇东西写得好累,情绪跟不上了,呵呵,看官莫怪。
4月18日下午 回顾与前瞻
到目前为止,已熟悉了驱动程序的整个框架的建立流程,并基本掌握了控制传输的代码编写。接下来要做的就是学习如何实现其它传输了,至少批量传输是一定要掌握的。另外,还有其它细节的东西也有待完善。比如在实验过程中,发现在开发板刚上电的时候,它有一个PID和VID,Control Panel能识别它。但在利用Control Panel下载完固件后,它的PID和VID就变成了另外一个,因为我的驱动用的就是这个PID和VID,所以识别到它并绑定了,而Control Panel倒是识别不了了。不知道这是否跟二次枚举有关。
用户1532887 2009-2-8 19:34