首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

WinCE平台USB摄像头驱动开发流程 02

WinCE平台USB摄像头驱动开发流程 02

在上一段描述中我们提到自动加载的概念,这是从驱动加载时间来区分的。主要分为两种:一是系统启动时自动加载;二是需要时才加载。一般来说,本地驱动都是在启动时自动加载的。而需要时才加载的方式,顾名思义就是想加载时才加载、想卸载时就可卸载。USB设备的驱动加载都是属于需要时才加载的驱动,例如USB摄像头的驱动程序。而从驱动的接口来看,USB摄像头驱动又属于流驱动接口。但相对于普通的流驱动接口,它增加了几个特有的接口函数:如USBDeviceAttach()、USBInstallDriver()、USBUnInstallDriver()等。在这次项目的调试中,我们发现需要时才加载的驱动程序有一个非常实用的好处,就是能在不修改嵌入式内核系统的情况下,应用程序可以动态加载该驱动以完成对硬件的操作,而操作完成后又可卸载其驱动程序以节省有限的内存。
    (3)USB设备驱动程序入口点函数分析
    大部分USB外围设备由于功能性的原因会更适合使用流接口驱动结构,所以一般都会采用加载式流接口驱动程序模型来开发USB设备驱动程序。流驱动是指通过流接口函数来实现驱动外围设备的。因此,编写流驱动程序实际上就是对各种流函数进行调用。
    又由于USB摄像头驱动程序主要是和USBD打交道,所以我们必须详细的了解USBD提供的函数。让人感到幸运的是在WinCE下微软已经提供了通用串行总线驱动程序(USBD)模块、USBD接口函数全集、样本主机控制器驱动程序(HCD)模块。所以,我们只需要根据USB摄像头的硬件特性,利用USBD提供的不同函数就能实现流接口函数与外围摄像头设备的交互。就能大大的节省开发时间,从而能更快速地进行嵌入式开发。
    二.USB摄像头流驱动的实现过程
    WinCE系统下的 USB 摄像头驱动程序的编写不同于在 Windows系统下的编写,因为在WinCE中对USB设备驱动开发只提供了底层支持。所以,在 WinCE系统下必须要根据所选择的USB摄像头的硬件特性自行编写驱动程序。根据我在这次项目中得到的实践经验,具体可以分为以下三个步骤:
    (1)创建USBD函数控制模块
    从上述的WinCE USB设备驱动模型及结构分析图中,我们可以清晰的看到主机和USB外设之间的实现方式。因此,我们首先需要编写USB Client Driver。也就是说,我们首先需要利用USBD提供的接口针对特定的物理设备来完成USB摄像头客户端驱动程序。虽然WinCE 没有提供USBD的标准机制,但是编写USBD 可供采用的方法有:①是使用流接口函数;②是使用现有的WinCE 应用程序编程接口(API);③是创建用户指定的API。
    根据在这个项目的多次实践经验,我在编写 USB摄像头驱动时采用了流接口驱动模式,该驱动程序的位置是位于 USBD 协议栈层上,属于控制具体设备功能的客户端驱动程序。然后,我把流接口驱动程序的流接口函数设计为匹配系统的文件系统API函数形式。通过这种机制方式,USB摄像头就可在流接口的管理下通过文件系统API暴露给应用层,这样应用层就可把USB摄像头作为一种特殊的文件进行操作,从而达到对USB摄像头的控制。
    (2)创建控制USB摄像头的各种流接口函数
    从结构分析我们可知,所有的USB设备驱动程序必须在它们的DLL库设置一定的入口点函数与USBD模块进行适当的交互。设置入口点函数有两个作用:一是使得 USBD 模块能与外部设备交互;二是使得驱动程序能创建和管理任何可能需要的注册键。
    因此,在编写USB摄像头驱动程序时有一个重要的步骤,就是要创建和实现三个入口函数 USBDeviceAttach(),USBInstallDriver(),USBUninstallDriver()。实现这三个入口函数的主要目的是为了使客户端驱动与系统的 USBD协议栈进行联系。因为在USB摄像头接到主机后,USBD模块会调用这个函数来初始化USB设备,取得USB设备信息和配置USB设备,并且申请必需的资源。USBInstallDrive是在第一次加载USB设备驱动程序时首先被调用,它使得驱动程序能创建需要的注册键。但需要值得注意的是,USB设备驱动程序不是使用标准的注册表函数,而是使用RegisterClientDriverID()、RegisterClientSettings()函数来注册相应的设备信息。USBUninstallDriver则是在用户删除USB设备驱动程序时调用,负责删除注册键并释放其它相关资源。同样,它是通过调用UnRegisterClientSettings()和UnRegisterClientDriverID()函数来删除由驱动程序的USBInstallDriver()函数创建的所有注册键。因此,我们在驱动程序中需要严格按照这三个函数的原型来实现,否则就不能为设备管理器所识别。
    (3)在注册表中配置USB摄像头驱动信息
    USB摄像头一般是使用需要时才加载的方式来加载的,因此在设备加载时会先检查设备的相关信息。在WinCE系统中,这些相关的设备配置信息都是存储在系统注册表中的。所以,内核系统会先访问注册表以获得必要的相关信息。例如,USBD模块会使用一组跟踪驱动程序和设备的注册键来定位正确的驱动程序。如果注册表信息与 USB 设备信息符合,USBD就会加载此驱动程序,否则 USBD 就不会加载此程序。因此,编写USB摄像头驱动程序的最后一个关键步骤,就是要正确的在注册表中配置相关的USB 摄像头驱动信息。
返回列表