WINCE 5.0 摄像头驱动(PXA270)

时间:2021-10-03 17:23:13
各位英雄:
    小弟的开发环境:PXA270+WINCE5.0,摄像头为OV9650,现在要开发驱动及测试应用程序。手上的驱动源码是ADCM2650的,而且貌似支持DirectShow,因为导出函数有:

    CAM_Init
    CAM_Deinit
    CAM_Open
    CAM_Close
    CAM_IOControl
    PIN_Init
    PIN_Deinit
    PIN_Open
    PIN_Close
    PIN_IOControl

注册表也有下列代码:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Camera] 
  "Prefix"="CAM" 
  "Dll"="camera_mainstoneii.dll" 
  "IClass"=multi_sz:"{CB998A05-122C-4166-846A-933E4D7E3C86}","{A32942B7-920C-486b-B0E6-92A702A99B35}" 

[HKEY_LOCAL_MACHINE\Software\Microsoft\DirectX\DirectShow\Capture] 
  "Prefix"="PIN" 
  "Dll"="camera_mainstoneii.dll" 
  "IClass"="{C9D092D6-827A-45E2-8144-DE1982BFC3A8}" 

小弟有几个问题想请教:
    1、WINCE5.0下开发摄像头驱动需要遵从DIRECTSHOW框架吗?我现有的符合DIRECTSHOW框架的驱动在WINCE5.0下能否工作正常?

    2、我现有的符合DIRECTSHOW框架的驱动,如果可以正常工作,上层应用程序该如何调用驱动并实现拍照、预览等操作呢?

    3、如果我要将摄像头驱动改造成和一般流接口驱动一样,是不是直接把PIN Driver相关的代码屏蔽即可?

    4、有没有英雄有OV9650摄像头的调试经验呢?

15 个解决方案

#1


1、你可以选择不按照它的框架,但是就不能在DShow下调用了,只要符合他框架的就可以调用
2、这么写应用就要参考DShow编程的了,一般就是加载Capture filter和驱动,构建IGraphBulider,构建几条RenderStream(看你是要采集还是录像),网上例子很多,水利水电出版社的一本 windows ce 嵌入式高级编程及其实例讲解上面有一节是讲这个的,比较简单。
3、应该没有这么简单吧,没有试过
4、米有

#2


clementzhao 英雄说:
“... camera本身是source filter一部分,是一定要有pin的,一般是3个。驱动写成怎样和ce的dx版本很有关系,ce5你做成这样也是媚眼给瞎子看,ce6和wm才有用。6410 camera只不过回归到伟大的dx架构下而已,兼容多个版本。三星很喜欢这样的代码复用,甚至ce6的bsp都是兼容wm的,很强。 ”

请问:
1、wince5.0不需要将camera驱动写成支持PIN(DIRECTSHOW)的架构吗?写成支持DIRECTSHOW架构的驱动,是不能在wince5.0下使用还是?

2、wince5.0包括的directshow版本,不支持使用这种camera驱动吗?
 

#3


1、对。不能。就当普通驱动做就好了
2、不支持。具体原因忘记了,反正无法正确连接filter。

#4


wince5下不需要遵从,结果是上层的应用就不能用DShow架构了,必须全部自己写。

驱动层可以跳过PIN,直接作为流驱动来使用。应用层仍然全部是自己写。

#5


uping

#6


嘿嘿,我参考的ADCM2650驱动,在WINCE5.0下实现了MDD层(public目录原本没有),其中就包括PIN驱动的实现;我先尝试下在DSHOW框架下移植到WINCE5.0下,不过先要将ADCM2650的控制部分换成OV9650,不知道有没有英雄有类似的源码可以参考?

#7


底层驱动基本完成后,就需要编写应用程序测试摄像头是否工作正常,怎样编写应用程序实现图像捕捉、视频预览或是拍照?我看def文件导出的接口函数如下: 

    CAM_Init 
    CAM_Deinit 
    CAM_Open 
    CAM_Close 
    CAM_Read 
    CAM_Write 
    CAM_Seek 
    CAM_IOControl 
    CAM_PowerUp 
    CAM_PowerDown 


应用程序应该是先调用CreateFile、OpenFile、然后调用DeviceIoControl函数。请问怎么实现在LCD触摸屏上实时显示视频预览、照片保存呢?

#8


帮助楼主顶一个先,学习ing

#9


各位英雄啊,我的问题是: 

1、应用程序进入视频预览时,怎么样实现将图像动态显示在界面上,而且只是占用主界面的一部分(如上贴图)?驱动程序DMA启动后,每次中断都会有新的图像数据填充到某段缓冲区,应用程序怎么控制将这些缓冲区的数据显示在界面上? 

2、EVC++实现视频预览的方法是?驱动中留给上层的接口只有CAM_IOControl等几个函数。 

3、拍照时,是不是通过DeviceIoControl函数将驱动中的DMA缓冲区拷贝到应用程序缓冲,然后再写入图片文件? 

恳请英雄指点啊...

#10


楼主打开所有调试信息,看看应用做了什么。
其实wince5下的大多数camera驱动都是直接显示了,和LCD logo显示原理相同。
多看代码,丰衣足食。

#11


我暂时没有类似健全的代码啊!
请问摄像头驱动怎么获取LCD驱动的帧缓冲地址呢?我看我的LCD驱动源码,帧缓冲首地址好像是动态申请的:

    g_DisplayBaseVirtual  = (DWORD)HalAllocateCommonBuffer(&Adapter, DISPLAY_BUFFER_SIZE, &PhysAddr, FALSE);
   g_DisplayBasePhysical = PhysAddr.LowPart;

而且我的BSP中也没有logo的代码...

#12


应用程序可以把缓冲区的数据取出来 用 CreateBitmap 构造一个bitmap
再用bitblt刷到要显示的区域,这样做法效率不如驱动中直接写framebuffer,但是灵活性更好点

#13


请问,模拟sccb总线时,为什么在发送完一个字节的8位数据后,还要主机发送一位(第9位)“don't care”?“don't care”不应该是从机发给主机的吗?

void __inline ov7620_sccb_writechar(unsigned char data)
{
int i = 0;

/* data */
for (i = 0; i < 8; i++ ) {
ov7620_sccb_write_bit(data & 0x80);
data <<= 1;
}

/* 9th bit - Don't care */
ov7620_sccb_write_bit(1);
}

#14


多谢分享!!!

#15


来顶帖一下。嘿嘿。

#1


1、你可以选择不按照它的框架,但是就不能在DShow下调用了,只要符合他框架的就可以调用
2、这么写应用就要参考DShow编程的了,一般就是加载Capture filter和驱动,构建IGraphBulider,构建几条RenderStream(看你是要采集还是录像),网上例子很多,水利水电出版社的一本 windows ce 嵌入式高级编程及其实例讲解上面有一节是讲这个的,比较简单。
3、应该没有这么简单吧,没有试过
4、米有

#2


clementzhao 英雄说:
“... camera本身是source filter一部分,是一定要有pin的,一般是3个。驱动写成怎样和ce的dx版本很有关系,ce5你做成这样也是媚眼给瞎子看,ce6和wm才有用。6410 camera只不过回归到伟大的dx架构下而已,兼容多个版本。三星很喜欢这样的代码复用,甚至ce6的bsp都是兼容wm的,很强。 ”

请问:
1、wince5.0不需要将camera驱动写成支持PIN(DIRECTSHOW)的架构吗?写成支持DIRECTSHOW架构的驱动,是不能在wince5.0下使用还是?

2、wince5.0包括的directshow版本,不支持使用这种camera驱动吗?
 

#3


1、对。不能。就当普通驱动做就好了
2、不支持。具体原因忘记了,反正无法正确连接filter。

#4


wince5下不需要遵从,结果是上层的应用就不能用DShow架构了,必须全部自己写。

驱动层可以跳过PIN,直接作为流驱动来使用。应用层仍然全部是自己写。

#5


uping

#6


嘿嘿,我参考的ADCM2650驱动,在WINCE5.0下实现了MDD层(public目录原本没有),其中就包括PIN驱动的实现;我先尝试下在DSHOW框架下移植到WINCE5.0下,不过先要将ADCM2650的控制部分换成OV9650,不知道有没有英雄有类似的源码可以参考?

#7


底层驱动基本完成后,就需要编写应用程序测试摄像头是否工作正常,怎样编写应用程序实现图像捕捉、视频预览或是拍照?我看def文件导出的接口函数如下: 

    CAM_Init 
    CAM_Deinit 
    CAM_Open 
    CAM_Close 
    CAM_Read 
    CAM_Write 
    CAM_Seek 
    CAM_IOControl 
    CAM_PowerUp 
    CAM_PowerDown 


应用程序应该是先调用CreateFile、OpenFile、然后调用DeviceIoControl函数。请问怎么实现在LCD触摸屏上实时显示视频预览、照片保存呢?

#8


帮助楼主顶一个先,学习ing

#9


各位英雄啊,我的问题是: 

1、应用程序进入视频预览时,怎么样实现将图像动态显示在界面上,而且只是占用主界面的一部分(如上贴图)?驱动程序DMA启动后,每次中断都会有新的图像数据填充到某段缓冲区,应用程序怎么控制将这些缓冲区的数据显示在界面上? 

2、EVC++实现视频预览的方法是?驱动中留给上层的接口只有CAM_IOControl等几个函数。 

3、拍照时,是不是通过DeviceIoControl函数将驱动中的DMA缓冲区拷贝到应用程序缓冲,然后再写入图片文件? 

恳请英雄指点啊...

#10


楼主打开所有调试信息,看看应用做了什么。
其实wince5下的大多数camera驱动都是直接显示了,和LCD logo显示原理相同。
多看代码,丰衣足食。

#11


我暂时没有类似健全的代码啊!
请问摄像头驱动怎么获取LCD驱动的帧缓冲地址呢?我看我的LCD驱动源码,帧缓冲首地址好像是动态申请的:

    g_DisplayBaseVirtual  = (DWORD)HalAllocateCommonBuffer(&Adapter, DISPLAY_BUFFER_SIZE, &PhysAddr, FALSE);
   g_DisplayBasePhysical = PhysAddr.LowPart;

而且我的BSP中也没有logo的代码...

#12


应用程序可以把缓冲区的数据取出来 用 CreateBitmap 构造一个bitmap
再用bitblt刷到要显示的区域,这样做法效率不如驱动中直接写framebuffer,但是灵活性更好点

#13


请问,模拟sccb总线时,为什么在发送完一个字节的8位数据后,还要主机发送一位(第9位)“don't care”?“don't care”不应该是从机发给主机的吗?

void __inline ov7620_sccb_writechar(unsigned char data)
{
int i = 0;

/* data */
for (i = 0; i < 8; i++ ) {
ov7620_sccb_write_bit(data & 0x80);
data <<= 1;
}

/* 9th bit - Don't care */
ov7620_sccb_write_bit(1);
}

#14


多谢分享!!!

#15


来顶帖一下。嘿嘿。