原创 USB自定义设备驱动01

2010-5-7 21:35 7005 16 17 分类: MCU/ 嵌入式

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

 


一、USB设备驱动入门


1、学习目的


1)了解windows系统硬件驱动的一些基本知识。从应用程序给出要求、驱动程序如果处理、底层硬件工作的大致情况有个基本了解。


2)使用自定义的应用程序、自定义的驱动程序来控制与设备的交互。


 


2、学习工具


我手边有去年买的一本windows驱动开发技术详解》,这本书写的挺好的。不过去年我买的时候,看着像天书。到现在,反复看了两遍以后,心里对windows底层的工作原理已经有了那么一点点概念了。


PCIUSB类型的设备,都是属于WDM驱动模型。特点是即插即用、分层、面向对象、数据驱动(IRP)。


 


3WDM驱动特征分析


1)即插即用


比如对一个USB设备来说,就能够做到即插即用。


USB主机控制器是PCI总线上的一个设备,在windows启动的时候就已经安装好的驱动。系统可以驱动USB HC,其下游端口有设备接入的时候,HCD也有相应的程序进行处理。


比如现在插入一个u盘,在主机的根集线器端口。它向HC报告了这个事件后,有一个叫做即插即用管理器的组件,根据USB总线驱动对象创建一个PDO设备对象。


然后总线驱动获取设备的VIDPID、设备类型等信息,这是通过设备枚举取得的。根据这些信息,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=8888PID=<?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”。


将设备的VIDPID改为“8888”和“1111”。


HID类描述符删除。


将报告描述符删除。


 


编译、下载,windows弹出安装驱动的界面。安装好以后,在设备管理器可以看到如下设备。


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


 

点击看大图


 


 


 


 


 


 

文章评论1条评论)

登录后参与讨论

用户289449 2010-9-8 14:49

1.“使用端点1的中断输入、中断输出”?一个端点不是只可以是输入或者输出吗?是不是“使用端点1的中断输入、使用端点1中断输出”? 2.设备固件的修改:将报告描述符删除。 这样会报错的,是不是将报告描述符={0};? 3.驱动编译好后,在安装驱动程序过程中就死机了(电脑反映巨慢,查看发现system进程占cpu:100%) 殷切希望楼主可以分享(固件+驱动+上位)工程,xizonghu@163.com,顶楼主。
相关推荐阅读
nthq2004 2010-05-08 20:04
USB自定义设备驱动02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  本来还想编写应用程序测试一下自定...
nthq2004 2010-05-04 21:01
智林开发板上实现自定义的USB HID设备
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、自定义HID设备的相关概念1...
nthq2004 2010-05-01 21:58
U盘例程在智林开发板上的移植
 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 一、移植前的准备工作1、有哪些操...
nthq2004 2010-04-30 19:19
U盘实现流程跟踪分析02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   二、追踪USB大容量设备的实现...
nthq2004 2010-04-27 21:51
U盘实现流程跟踪分析01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   一、追踪USB大容量设备的实现...
我要评论
1
16
关闭 站长推荐上一条 /2 下一条