`
long_yu2
  • 浏览: 333976 次
社区版块
存档分类
最新评论

(含代码)WinCE6.0 Camera驱动的挂载,使应用层能使用DirctShow访问

阅读更多
引用于 http://blog.csdn.net/chenyujing1234

BSP SubProject 代码:

http://www.rayfile.com/zh-cn/files/3e467cab-8de6-11e1-a3c9-0015c55db73d/



我的代码参考了:(将Windows Embedded CE 6.0 USB Camera Driver.msi文件解压后得到的\cpp  .h文件组成工程)

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=19512

参考文章了:

http://jazka.blog.51cto.com/809003/707027





学习Camera驱动的过程中,发现网上的资料较少,而且偏向于5.0版本的。在自己研究了一段时间后发现出现这种情况也比较正常。因为5.0以前的版本都是流接口驱动结构的,而6.0的Camera驱动则向DirectShow架构靠拢了很多,所以无法从应用程序的调用到底层的操作都看的很清楚,除非对DirectShow架构非常熟悉。

       WinCE6.0的Camera的驱动依然是流接口驱动,以dll的形式提供各种流接口,MDD/PDD的分层驱动结构图如下:

     
      应用层中包括两部分DirectShow和DeviceManager,一般应用程序就通过调用这两个接口来对Camera驱动进行操作。
       Camera驱动有两个流接口CAM_XXX和PIN_XXX,在软件中通过3种对象和Camera设备进行交互:Adapter、Pin、Stream。Adapter是Camera具体设备的抽象,对应于CAM_XXX的流接口,Pin是DShow捕获视频数据时使用的设备,Stream代表流过的数据。
       DShow操作Camera流接口驱动也是通过CreateFile,DeviceIOControl等API进行的,其中最主要的就是各种IOControlCode,对应于不同的属性,如能力、状态以及设置等。
       CAM_IoControl的控制码大多数是IOCTL_CS_PROPERTY,数据缓冲也基本都是CS PROPERTY类似的结构,驱动通过这些数据读取应用程序提供的信息,判别操作的类型,调用MDD不同的处理函数完成。
       PIN_IoControl的控制码可能是PROPERTY、BUFFERS、INSTANTIATE,分别用来设置Pin、管理Pin的Buffer或者设置指定Pin的数据流的类型。

      MDD层主要完成Sensor状态的控制、Video的处理和内存的管理。内存的管理如buffer是由驱动分配还是应用程序分配以及如何分配。MDD中只有一个API被PDD调用,就是MDD_HandleIO函数。
      PDD层是对硬件功能的封装,主要包含以下七大类功能:
       (1)初始化函数:PDD_Init、PDD_DeInit;
      (2)Camera信息:PDD_GetAdapterInfo;
       (3)电源管理:PDD_SetPowerState;
       (4)内存管理:PDD_AllocateBuffer、PDD_DeAllocateBuffer、PDD_RegisterClientBuffer、PDD_UnRegisterClientBuffer;
       (5)Sensor管理:PDD_GetSensorModeInfo、PDD_SetSensorModeFormat、PDD_InitSensorMode、;PDD_DeInitSensorMode、PDD_SetSensorState;
       (6)数据捕获:PDD_TakeStillPicture、PDD_FillBuffer;
       (7)属性管理:PDD_HandleVidProcAmpChanges、PDD_HandleCamControlChanges、PDD_HandleViedoControlCapsChanges;

      Camera驱动的加载和调用过程大致如下:
       (1)device.exe根据注册表信息加载Camera驱动,调用CAM_Init;
       (2)CAM_Init调用PDD_Init和PDD_GetAdapterInfo,完成硬件的初始化,返回Camera能力的一些信息,如支持的Pin的个数、对电源状态的支持和Sensor的属性,此时加载完成;
       (3)FindFirstDevice找到设备名称,如CAM1;
       (4)通过CreateFile打开CAM1设备;
       (5)调用DeviceIoControl查找Pin的个数(Pin分为Preview预览、Still静态捕获、Capture视频捕获);
       (6)获得Pin的个数等信息之后,通过CreateFile操作PIN1设备,对每个Pin进行初始化、分配内存;
       (7)用户选择预览、拍照、录像等操作,都会选择一个相应的Pin进行传递数据。传数据之前通过IOControl StreamInstance将准备好的MsgQueue的句柄传递给Pin,MsgQueue将用来在DShow和驱动之间进行异步传递数据,这些数据包括标记装载实际图像数据的缓冲。在IOControl完成之后,根据当前是预览、拍照还是录像的不同状态,调用PDD里面的Sensor管理函数或者数据捕获函数来控制Camera的状态,进行视频的捕获。
      (8)在DShow当中,一个Pin的状态通常包括RUN、STOP、PAUSE三种,这些状态之间的切换是:RUNà PAUSEà STOPà PAUSEà RUN。



       最后转载MSDN里面关于DirectShow结构的Camera驱动的初始化过程:
Initialization Sequence for Camera Drivers


camera设备的初始化序列是如下:
1、所有的Camera必须被注册到同样的GUID。

以下注册表显示一个camera驱动的流接口设备注册表入口

[cpp] view plaincopy
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\CameraDriver]     
"Prefix"="<Driver prefix>"      
"Dll"="<Driver DLL name>"      
"Order"=dword:10      
"Index"=dword:1      
"IClass"=multi_sz: "{CB998A05-122C-4166-846A-933E4D7E3C86}" 
2、WCE设备管理器加载Camera设备并调用驱动的入口点,CAM_Init..

一旦接收到调用,camera设备驱动检测并初始化硬件,允许并初始化它的数据结构体并返回设备实例标识符。

此设备标识符将在CAM_Open 中被用.

3、DirectShow用适当的设备名调用CreateFile.

应用程序应该用FindFirstDevice来接收基于适当设备类GUID的真实的名字。

4、DirectShow用CSPROPERTY_PIN_CTYPES查询Camera驱动,以获得它支持的pin数量.

  也可以用CSPROENTRY_PIN_CATEGORY查询类型 (预览、捕获、静止图片)

5、DirectShow用CSPROPERTY_PIN_DEVICENAME查询Camera驱动, 以获得pin设备的名字。

这个名字通常是PIN1:。但是驱动也有可能用其它名字。

6、DirectShow为每个Pin类型在PIN驱动上调用CreateFile

7、驱动通过设置它的特性和数据格式初始化流,并为它分配buffers

8、客户端用IOCTL_STREAM_INSTANTIATE(传递进来pin标识符和消息队列的句柄,此句柄用于在驱动和Direct中间层传递异步包)为给出的pin句柄设置流类型

比如,如果CSPROPERTY_PIN_CTYPES返回3,且如果CSPROPERTY_PIN_CATEGORY(假如Id = 0)返回PINNAME_VIDEO_PREVIEW,

之后它调用IOCTL_STREAM_INSTANTIATE(用Id = 0)把给定的句柄绑定到流中.

9、通过Pin开始流数据
分享到:
评论

相关推荐

    wince 6.0 开发环境搭建 以及 wince6.0 流驱动开发的2种方法

    Wince 6.0 开发环境搭建及流驱动开发的2种方法 一、Wince 6.0 开发环境搭建 Wince 6.0 开发环境搭建...Wince 6.0 开发环境搭建和流驱动开发是 Wince 6.0 应用程序开发的基础,需要认真地学习和掌握相关的技术和知识。

    wince6.0下可用应用程序

    10. **压缩包子文件的文件名称列表**:“wince6.0可用软件”可能是包含了在WinCE 6.0环境下可以正常运行的应用程序或库文件。这些文件可能包括了系统必备的实用工具、游戏、开发工具等,对于用户来说,是提升WinCE ...

    wince6.0 USB WIFI 驱动(ARM)

    标题中的“wince6.0 USB WIFI 驱动(ARM)”指的是为Windows CE 6.0操作系统设计的一个特定的USB WiFi驱动程序,适用于基于ARM架构的处理器,特别是ARM Cortex-A9核心的CPU。Windows CE是微软开发的一个嵌入式操作...

    wince6.0 摄像头驱动

    在Windows CE 6.0(简称WinCE6.0)操作系统中,摄像头驱动的开发和集成是一项关键任务,尤其对于那些需要使用USB摄像头的设备。WinCE6.0是一款嵌入式实时操作系统,广泛应用于各种工业和消费电子产品,如PDA、车载...

    WinCE6.0下的驱动调试助手

    《WinCE6.0驱动调试助手详解》 在嵌入式系统开发领域,Windows CE(简称WinCE)作为一款小巧而强大的操作系统,被广泛应用在各种嵌入式设备中,特别是ARM架构的硬件平台上。其中,驱动程序的调试是开发过程中的关键...

    wince6.0 音频播放器

    "wince6.0 音频播放器"的标题表明我们要讨论的是一个专为WinCE 6.0设计的音频播放应用程序,它支持MP3和WAV这两种常见的音频格式。 首先,让我们深入了解一下WinCE 6.0。这是一个基于微内核的操作系统,由微软开发...

    wince6.0下IIC接口电容式触屏驱动

    wince6.0下IIC接口电容式触屏驱动wince6.0下IIC接口电容式触屏驱动 有问题请QQ51669830

    WINCE6.0_CHS_SDK.zip

    1. **环境设置**:安装`WINCE6.0_CHS_SDK.msi`文件,完成WinCE 6.0中文SDK的安装。 2. **创建Platform**:在Platform Builder中定义设备硬件特性,创建一个操作系统映像。 3. **编写应用程序**:使用Visual Studio...

    vm wince6.0 虚拟机

    vm wince6.0 虚拟机vm wince6.0 虚拟机vm wince6.0 虚拟机vm wince6.0 虚拟机vm wince6.0 虚拟机vm wince6.0 虚拟机vm wince6.0 虚拟机vm wince6.0 虚拟机vm wince6.0 虚拟机

    wince6.0模拟器_WINCE6.0_CHS_SDK

    WINCE6.0_CHS_SDK包含了一系列的开发工具、文档、示例代码和库,帮助开发者构建针对Windows CE 6.0平台的应用程序。SDK中的主要组件可能包括: 1. **Visual Studio Integration**:与Microsoft Visual Studio的集成...

    车机导航系统WinCE6.0下Wceload工具软件

    用于安装CAB文件,WinCE6.0下Wceload工具软件。 用于车机导航系统WINCE6.0,无法在文本框中输入任何文字,需要安装输入法,但系统没有CAB包安装程序wceload.exe ,也许是被精简掉了,这个时候就需要下载wceload.exe...

    WinCE6.0开发资料及源码

    调试WinCE6.0应用程序通常使用Remote Debugger,它允许你在主机上调试运行在目标设备上的代码。部署则可以通过Platform Builder生成的部署工具,将系统映像烧录到目标设备的存储介质上,或者通过网络进行远程部署。 ...

    SD接口 AR6102 wince6.0 wifi 驱动

    标题 "SD接口 AR6102 wince6.0 wifi 驱动" 指的是一个专门针对Windows CE 6.0操作系统设计的无线网络驱动程序,它适用于使用SD接口连接的AR6102无线网络模块。在Windows CE(简称WinCE)这个嵌入式操作系统中,驱动...

    WinCE6.0 R3离线安装包

    ### WinCE 6.0 R3离线安装包解析及应用 #### 一、概述 随着信息技术的发展,嵌入式操作系统在智能设备领域扮演着越来越重要的角色。Microsoft Windows Embedded Compact (WinCE)作为一款功能强大的嵌入式操作系统...

    WinCE 6.0 VNC远程桌面工具

    Windows CE 6.0(简称WinCE 6.0)是一款由微软开发的嵌入式操作系统,广泛应用于各种工业设备、移动设备和手持设备中。VNC(Virtual Network Computing)则是一种远程桌面协议,允许用户通过网络访问并控制另一台...

    WinCE6.0中文模拟器

    通过使用WinCE6.0中文模拟器,开发者可以预览和测试应用在Windows CE 6.0设备上的表现,无需物理设备即可完成大部分开发和调试工作。这对于节约成本和提高开发效率至关重要。同时,由于支持.NET Compact Framework和...

    wince6.0 触摸屏校准程序

    本压缩包提供的“wince6.0 触摸屏校准程序”正是为了解决这个问题,它允许用户调整和优化触摸屏的坐标映射,确保点击屏幕的位置与屏幕上显示的指针位置一致。 触摸屏校准程序通常基于WinCE 6.0系统提供的API(应用...

    wince6.0下GPIO驱动实现

    在本文中,我们将深入探讨如何在WinCE 6.0下实现针对Mini2440 GPIO口的驱动程序,以及如何使用提供的GPI.dll库来控制GPB1口的高低电平输出。 首先,GPIO驱动是操作系统与硬件之间的一层软件接口,它使得操作系统...

    wince6.0 流驱动调试助手

    该资源我也是从网上下的,感觉特别好用,特意跟大家分享一下。他能支持wince6.0的流驱动调试,可以动态加载编译好的驱动,这样就不需要每次都烧写内核。里面有视频,可以教你怎样使用该软件。如果版权侵犯,请谅解。

Global site tag (gtag.js) - Google Analytics