小弟的开发环境: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、这么写应用就要参考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驱动吗?
“... 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。
2、不支持。具体原因忘记了,反正无法正确连接filter。
#4
wince5下不需要遵从,结果是上层的应用就不能用DShow架构了,必须全部自己写。
驱动层可以跳过PIN,直接作为流驱动来使用。应用层仍然全部是自己写。
驱动层可以跳过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触摸屏上实时显示视频预览、照片保存呢?
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缓冲区拷贝到应用程序缓冲,然后再写入图片文件?
恳请英雄指点啊...
1、应用程序进入视频预览时,怎么样实现将图像动态显示在界面上,而且只是占用主界面的一部分(如上贴图)?驱动程序DMA启动后,每次中断都会有新的图像数据填充到某段缓冲区,应用程序怎么控制将这些缓冲区的数据显示在界面上?
2、EVC++实现视频预览的方法是?驱动中留给上层的接口只有CAM_IOControl等几个函数。
3、拍照时,是不是通过DeviceIoControl函数将驱动中的DMA缓冲区拷贝到应用程序缓冲,然后再写入图片文件?
恳请英雄指点啊...
#10
楼主打开所有调试信息,看看应用做了什么。
其实wince5下的大多数camera驱动都是直接显示了,和LCD logo显示原理相同。
多看代码,丰衣足食。
其实wince5下的大多数camera驱动都是直接显示了,和LCD logo显示原理相同。
多看代码,丰衣足食。
#11
我暂时没有类似健全的代码啊!
请问摄像头驱动怎么获取LCD驱动的帧缓冲地址呢?我看我的LCD驱动源码,帧缓冲首地址好像是动态申请的:
g_DisplayBaseVirtual = (DWORD)HalAllocateCommonBuffer(&Adapter, DISPLAY_BUFFER_SIZE, &PhysAddr, FALSE);
g_DisplayBasePhysical = PhysAddr.LowPart;
而且我的BSP中也没有logo的代码...
请问摄像头驱动怎么获取LCD驱动的帧缓冲地址呢?我看我的LCD驱动源码,帧缓冲首地址好像是动态申请的:
g_DisplayBaseVirtual = (DWORD)HalAllocateCommonBuffer(&Adapter, DISPLAY_BUFFER_SIZE, &PhysAddr, FALSE);
g_DisplayBasePhysical = PhysAddr.LowPart;
而且我的BSP中也没有logo的代码...
#12
应用程序可以把缓冲区的数据取出来 用 CreateBitmap 构造一个bitmap
再用bitblt刷到要显示的区域,这样做法效率不如驱动中直接写framebuffer,但是灵活性更好点
再用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);
}
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、这么写应用就要参考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驱动吗?
“... 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。
2、不支持。具体原因忘记了,反正无法正确连接filter。
#4
wince5下不需要遵从,结果是上层的应用就不能用DShow架构了,必须全部自己写。
驱动层可以跳过PIN,直接作为流驱动来使用。应用层仍然全部是自己写。
驱动层可以跳过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触摸屏上实时显示视频预览、照片保存呢?
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缓冲区拷贝到应用程序缓冲,然后再写入图片文件?
恳请英雄指点啊...
1、应用程序进入视频预览时,怎么样实现将图像动态显示在界面上,而且只是占用主界面的一部分(如上贴图)?驱动程序DMA启动后,每次中断都会有新的图像数据填充到某段缓冲区,应用程序怎么控制将这些缓冲区的数据显示在界面上?
2、EVC++实现视频预览的方法是?驱动中留给上层的接口只有CAM_IOControl等几个函数。
3、拍照时,是不是通过DeviceIoControl函数将驱动中的DMA缓冲区拷贝到应用程序缓冲,然后再写入图片文件?
恳请英雄指点啊...
#10
楼主打开所有调试信息,看看应用做了什么。
其实wince5下的大多数camera驱动都是直接显示了,和LCD logo显示原理相同。
多看代码,丰衣足食。
其实wince5下的大多数camera驱动都是直接显示了,和LCD logo显示原理相同。
多看代码,丰衣足食。
#11
我暂时没有类似健全的代码啊!
请问摄像头驱动怎么获取LCD驱动的帧缓冲地址呢?我看我的LCD驱动源码,帧缓冲首地址好像是动态申请的:
g_DisplayBaseVirtual = (DWORD)HalAllocateCommonBuffer(&Adapter, DISPLAY_BUFFER_SIZE, &PhysAddr, FALSE);
g_DisplayBasePhysical = PhysAddr.LowPart;
而且我的BSP中也没有logo的代码...
请问摄像头驱动怎么获取LCD驱动的帧缓冲地址呢?我看我的LCD驱动源码,帧缓冲首地址好像是动态申请的:
g_DisplayBaseVirtual = (DWORD)HalAllocateCommonBuffer(&Adapter, DISPLAY_BUFFER_SIZE, &PhysAddr, FALSE);
g_DisplayBasePhysical = PhysAddr.LowPart;
而且我的BSP中也没有logo的代码...
#12
应用程序可以把缓冲区的数据取出来 用 CreateBitmap 构造一个bitmap
再用bitblt刷到要显示的区域,这样做法效率不如驱动中直接写framebuffer,但是灵活性更好点
再用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);
}
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
来顶帖一下。嘿嘿。