现在的位置: 首页 > 综合 > 正文

USB设备驱动程序导读

2013年01月04日 ⁄ 综合 ⁄ 共 2149字 ⁄ 字号 评论关闭

随着USB设备的不断增加,我们这些开发人员也就多了对USB设备进行驱动程序开发的工作。但是对于很多初学者来说,存在以下三个困难:
一是对WinCE的驱动程序结构了解得太少,没办法得心应手的专注于驱动程序的开发工作;
二是对WinCE自带的USB驱动程序的例子没有弄懂,看到一大堆文件夹结构和源程序思维混乱;
三是几乎没有什么中文的参考资料,不知如何下手。

第三条是很多开发人员都遇到的,我也一样,很多朋友问我有没有什么资料,我也只能说抱歉,因为我也同样有这个问题,一切都靠自己的黑暗中摸索,因此本文不谈第三条。
第一条是可以找到资料的,如《Windows CE.NET系统分析及实验教程》,因此本文也不打算在此花费大量笔墨。
这样,本文的着重点就在第二条上面了,通过本文,我希望能让更多的朋友理解Windows CE下对USB设备的驱动模型及样例程序中的实现过程,以样例代码为基础理顺USB设备驱动程序的开发思路。同样,本文的读者对象预期是入门者和准备着手USB驱动开发的人员,驱动开发高手自然就当一笑吧。同时写本文的目的也是履行我半年前答应很多朋友的诺言,并向我的慵懒致歉。

好了,在看样例程序之前,我们还有些东西需要了解,我们就先来看下图:

                             

在此图中,我们可以非常清晰的看到主机和物理外设之间的结构方式,在主机端,通过USBD模块和HCD模块使用默认的PIPE访问一个通用的逻辑设备,实际上就是说USBDHCD是一组抽象出来的访问所有USB设备的逻辑接口,它们负责管理所有USB设备的连接、加载、移除、数据传输和通用的配置。其中HCD是主机控制驱动,是为USBD提供底层的功能访问服务,USBDUSB总线驱动,位于HCD的上层,利用HCD的服务提供较高层次抽象的功能。

由于HCDUSBD都是面向的一致的逻辑设备接口,那么对于各种各样的物理设备,就需要有唯一对应的设备驱动程序,这就是上图中最上层的特殊的PIPE所连接的物理设备和USB设备驱动程序。

有了对这个结构的认识,我们可以明确的是我们要写的就是最上端的USB设备驱动程序,在WINCE的样例程序中也称为USB
ClientDriver
,它是工作于USBD之上,所以实际上我们的工作就变成了利用USBD提供的接口针对特定的物理设备来完成USB设备驱动程序,而暂时与其他的部分无关。

好了,先到这,接下来就准备看一些具体的东西吧!

接下来,我们就来分析一下CE中的样例程序,我用的是4.2版本的,所以下面的内容是4.2版本中的程序。这里的程序是通过文件夹的形式组织在一起的,所以我们还是像以前学习CE的时候那样,先来了解与此相关的文件夹结构,如下图。

USB文件夹下,分成了CLASS,CLIENTS,COMMON,HCD,INC,USBD几个文件夹,其中INCCOMMON里面有一个lock.c的程序,这个程序很明显是将要被其他USB有关的驱动程序所使用的一个锁,代码很简单,只是一个类似临界区的封装体,可以保护多线程对同一内存区域的读写访问,可以先不去管它。CLIENTS文件夹可能最初微软的开发人员是用来放置设备驱动程序的,但是后来没有放,而发布的时候也没有删除,所以遗留了下来,里面是个空的文件夹,所以没用实际用处。USBDHCD是前述的底层驱动,里面含有很多子文件夹和程序,由于我们只针对USB设备驱动,因此对这两部分不做分析,不兴趣的朋友可以自己去了解。

重点就在CLASS文件夹了,展开来看,里面又包含了COMMONHIDPRINTERSTORAGE几个文件夹,同样,COMMON里面存放的源程序是为HIDPRINTERSTORAGE所共有的。HIDUSB输入设备如键盘/鼠标的样例驱动程序,PRINTERUSB打印机的样例驱动程序,STORAGEUSB存储设备如U盘的样例程序。

我们此次以USB存储设备为例,所以再来展开STORAGE文件夹,其中的INC文件夹里面是头文件,CLASSUSB存储设备的驱动程序,DISK是磁盘驱动程序。这里为什么有两个驱动程序呢,我来简要解释一下。

驱动程序工作在硬件与操作系统之间,它有两个功能,一个是将操作系统转发来的操作以符合指定硬件设备的形式控制硬件设备,另一个是向操作系统提供这个访问接口。比如说U盘,一方面驱动程序要把操作系统对U盘的识别、读、写等操作转换成U盘的动作,另一方面又告诉操作系统这是个U盘,可以当成一个文件夹或文件系统来用,能够接受标准的文件操作命令。所以此处存在两个驱动。

另外还有一个文件夹,WINCE420/PUBLIC/COMMON/DDK/INC,这里面是与设备驱动有关的头文件,对于USB设备,相关的文件有USB100.H,
USBTYPES.H, USBDI.H
,这里面前两个里面关于USB的定义是完全符合USB规范的,不是随便定义出来的,而USBDI.H文件里的内容就是USBD总线驱动程序向USB设备驱动程序提供的接口描述,在开发USB设备驱动时必须要包含此头文件,这样才可以得到USBD接口的原型。

说了这么多,还没接触到程序,不过不要着急,这些可是大的框架哦,我得休息一下,广告过后,马上回来!

抱歉!评论已关闭.