<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一、USB设备驱动入门
1、学习目的
(1)了解windows系统硬件驱动的一些基本知识。从应用程序给出要求、驱动程序如果处理、底层硬件工作的大致情况有个基本了解。
(2)使用自定义的应用程序、自定义的驱动程序来控制与设备的交互。
2、学习工具
我手边有去年买的一本《windows驱动开发技术详解》,这本书写的挺好的。不过去年我买的时候,看着像天书。到现在,反复看了两遍以后,心里对windows底层的工作原理已经有了那么一点点概念了。
像PCI、USB类型的设备,都是属于WDM驱动模型。特点是即插即用、分层、面向对象、数据驱动(IRP)。
3、WDM驱动特征分析
(1)即插即用
比如对一个USB设备来说,就能够做到即插即用。
USB主机控制器是PCI总线上的一个设备,在windows启动的时候就已经安装好的驱动。系统可以驱动USB HC,其下游端口有设备接入的时候,HCD也有相应的程序进行处理。
比如现在插入一个u盘,在主机的根集线器端口。它向HC报告了这个事件后,有一个叫做即插即用管理器的组件,根据USB总线驱动对象创建一个PDO设备对象。
然后总线驱动获取设备的VID、PID、设备类型等信息,这是通过设备枚举取得的。根据这些信息,windows系统查找相应的功能驱动,比如u盘就是大容量设备类驱动。然后这个驱动再创建一个FDO设备对象。这样这个设备就可以供用户使用了。
(2)分层
分层是现代操作系统的特征,也是我们编写软件时提高可读性、灵活性、可重用性的方法。
分层使得设备对用户提供了统一的操作接口。
比如用户要打卡设备,都是调用 CreateFile()函数、读写用 ReadFile()和WriteFile函数、控制用DeviceIOCtrl()函数。
这些函数都是win32子系统实现的,windows系统将这些函数调用转化为系统调用,进入windows内核。
内核服务函数调用windows的执行组件,一般设备操作是用过IO管理器完成的。IO管理器根据用户传递下来的设备名称,找到相应的驱动对象和设备对象。
IO管理器把用户的要求组合成一个用户输入输出请求包(IRP),然后利用IRP调用相应的驱动程序。这里时间上使用的回调函数的概念,根据具体请求(读、写或其它要求),调用驱动程序的相应函数进行处理。
驱动一般也是多层。上层的驱动程序完成一些工作后,将IRP传递到下一层。比如USB设备的操作,经过功能层次的处理,创建URB请求包附加到IRP中,最后由总线驱动和HCD驱动转换为USB总线上的数据包。
二、USB设备驱动开发
1、开发过程简介
这次只是了解一下windows驱动开发的过程,并没有详细学习windows驱动开发的计划,我连VC都已经不熟悉了。
本次操作是根据《圈圈教你玩USB》第九章的源程序,做一些稍微的修改,使它适合智林开发板的驱动。
主要实现按键信息的读取、led灯的控制两个内容,跟上次实现的自定义HID设备功能一样。只是现在采用自定义设备而不是HID设备类型、使用自定义的文件读写而不是从HID驱动获取的报告描述符中获取数据了。
2、驱动框架的建立
(1)编译vdw_wdm.lib
(2)根据向导建立一个USB WDM驱动程序。
工程名“usbdevice”、“WDM”类型驱动、“功能驱动”、“USB驱动”
“使用端点1的中断输入、中断输出”、“使用缓冲IO”、“VID=8888,PID=<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1111”。
(3)去掉link选项里的ntstrsafe.lib,整个工程编译成功。
3、驱动程序的修改
主要是在读写函数里修改:
//在这里构建读数据的URB
PURB pUrb = EP1_WRITE.BuildInterruptTransfer(
pBuffer, writeSize, TRUE, NULL,NULL, FALSE );
if (pUrb == NULL){
status = STATUS_INSUFFICIENT_RESOURCES;
}
else {
status = EP1_WRITE.SubmitUrb(pUrb,NULL,NULL,0);
bytesSent = pUrb->UrbInterruptTransfer.TransferBufferLength;
delete pUrb;
}
按照圈圈书里的描述进行修改,实际修改的地方很少。
4、设备固件的修改
将设备描述符里的设备类改为“0xFF”。
将设备的VID、PID改为“8888”和“1111”。
将HID类描述符删除。
将报告描述符删除。
编译、下载,windows弹出安装驱动的界面。安装好以后,在设备管理器可以看到如下设备。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
用户289449 2010-9-8 14:49