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

(含代码)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

    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_CHS_SDK.zip

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

    wince6.0模拟器_WINCE6.0_CHS_SDK

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

    wince6.0 FDT232 USB转串口驱动

    在Windows CE 6.0(简称wince6.0)操作系统中,开发和使用硬件设备驱动是关键的一环,特别是对于需要进行串行通信的场景。"wince6.0 FDT232 USB转串口驱动"是针对FTD232芯片设计的驱动程序,确保了USB接口与串行端口...

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

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

    WinCE 6.0 VNC远程桌面工具

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

    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)作为一款功能强大的嵌入式操作系统...

    wince6.0 触摸屏校准程序

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

    WinCE6.0中文模拟器

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

    wince6.0下GPIO驱动实现

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

    wince6.0 流驱动调试助手

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

Global site tag (gtag.js) - Google Analytics