80

帖子

0

TA的资源

一粒金砂(初级)

41
 
引用 10 楼 xumercury 的回复:
寄存器值需要修改下。。行场同步的特别要关注。


此为正解!!
摄像头的图像和你放入显示存中的图像的行与场要一致

回复

79

帖子

0

TA的资源

一粒金砂(初级)

42
 
请问google man,我的摄像头驱动导出函数中为什么会有PIN_Init等函数,不是CAM_Init就可以了吗?请问PIN是指什么呢?
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

43
 
引用 41 楼 daigua04 的回复:
请问google man,我的摄像头驱动导出函数中为什么会有PIN_Init等函数,不是CAM_Init就可以了吗?请问PIN是指什么呢?


PIN还是CAM完全是自己随便写的,没有实际意义。只要和注册表对应即可。

 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

44
 
引用 41 楼 daigua04 的回复:
请问google man,我的摄像头驱动导出函数中为什么会有PIN_Init等函数,不是CAM_Init就可以了吗?请问PIN是指什么呢?

个人觉得  wince6 摄像头实际上就是两个驱动CAm 和Pin,在6410下做过类似的工作,2440还没有,刚查了Display_Cam_Image这个函数在6410下没有。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

45
 
请教jinlking,
我的camera驱动导出函数中,
EXPORTS
    DllMain
    CAM_Init
    CAM_Deinit
    CAM_Open
    CAM_Close
    CAM_IOControl
    PIN_Init
    PIN_Deinit
    PIN_Open
    PIN_Close
    PIN_IOControl

CAM_IOControl函数中有IOCTL_CS_PROPERTY的分支,这个是wince6.0下的camera驱动吧?我的应用环境是wince5.0,还需要两个驱动(CAM和PIN)吗?PIN驱动是干什么的呢?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

46
 
哦,你看看注册表里面有什么吧。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

47
 
uping
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

48
 
引用 44 楼 daigua04 的回复:
请教jinlking,
我的camera驱动导出函数中,
EXPORTS
DllMain
CAM_Init
CAM_Deinit
CAM_Open
CAM_Close
CAM_IOControl
PIN_Init
PIN_Deinit
PIN_Open
PIN_Close
PIN_IOControl

CAM_IOControl函数中有IOCTL_CS_PROPERTY的分支,这个是wince6.0下的camera驱动吧?我的应用环境是wince5.0,还需要两个驱动(CAM和PIN)吗?PIN驱动是干什么的呢?

The overall camera architecture is composed of several interrelated elements. The following terms and concepts are used to describe the camera hardware, the software that controls it, and the captured data flowing from it.

Device driver
The layer of software that controls the physical camera hardware. A single camera driver can control multiple cameras.

Device instance
A single complete physical set of camera hardware. A camera device driver can support multiple device instances.

Adapter
The logical representation of a device instance in software.

Pin
The camera driver architecture uses the concept of a pin as defined by the DirectShow middleware. For more information, see Pins. Pins are used to transmit data in and out of a device and are always in one of three states: stopped, paused, and playing.   A camera driver can support up to three types of pins: preview, capture, still. Each pin can support a number of media formats. The DirectShow middleware manages the process matching media formats from camera output pins with pins on downstream filters. For more information, see Video Format Negotiation.

Pin driver
Software used to control a pin. A pin driver can support multiple pins.

Pin instance
A single pin on an adapter.

Pin handle
A unique identifier that provides a means of locating a single specific pin.

Stream
Data that flows out of an adapter's pin and to the application.

参见MSDN,主要是因为驱动要往DShow框架靠拢,其实如果抛开DShow,摄像头驱动就和一般的驱动一样的,但是为了在DShow中调用,你必须按照微软这套CAM和Pin的框架来写驱动。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

49
 
[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}"  

[HKEY_LOCAL_MACHINE\Drivers\Capture\Mainstone_ii]
   "MemoryModel"=dword:2
   "PinCount"=dword:2

[HKEY_LOCAL_MACHINE\Software\Microsoft\Pictures\Camera\OEM\WhiteBalance]
"OptionNum"=dword:0

[HKEY_LOCAL_MACHINE\System\Pictures\Camera\OEM]
   "SoundFile"="\\windows\\ShutterSound.wav"
   "ForceShutterSound"=dword:1
   "ShutterSoundVolume"=dword:8000
   "TimerSoundFile"="\\windows\\TimerSound.wav"
   "ForceTimerSound"=dword:1
   "TimerSoundVolume"=dword:8000

[HKEY_LOCAL_MACHINE\Software\Microsoft\Pictures\Camera\OEM]
...

注册表又这样的项...
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

50
 
PIN  和 CAM 关系应该是并列的,但是必须要先有CAM 然后才有PIN
可以看看他们的Init函数:
在Cam_Init中
CAM_Init(
    VOID * pContext
    )
{   
    CAMERADEVICE * pCamDev = NULL;
    DEBUGMSG(ZONE_INIT, (_T("CAM_Init: context %s\n"), pContext));
   
    pCamDev = new CAMERADEVICE;

//这里新建了一个CAMERADEVICE的类。然后这个函数返回这个类的指针
    ………………
}

在Pin_Init中
DWORD
PIN_Init(
    LPCTSTR Context,
    LPVOID lpvBusContext
    )
{   
    DEBUGMSG( ZONE_INIT, ( _T("PIN_Init: context %s\n"), Context ) );
    PPININITHANDLE pPinInitDev = NULL;

    pPinInitDev = new PININITHANDLE;
//这个结构体就是一个CAMERADEVICE的指针
//typedef struct CPinInitHandle
//{
//   PCAMERADEVICE pCamDevice;
//} PININITHANDLE, * PPININITHANDLE;
//如果CAMERADEVICE不存在,PIN_INIT就会失败
   
    if ( NULL != pPinInitDev )
    {
        pPinInitDev->pCamDevice = reinterpret_cast( lpvBusContext );

        if ( NULL == pPinInitDev->pCamDevice )
        {
            SetLastError( ERROR_INVALID_HANDLE );
            SAFEDELETE( pPinInitDev );
            DEBUGMSG( ZONE_INIT|ZONE_ERROR, ( _T("PIN_Init: Initialization Failed") ) );
        }
    }
    else
    {
        SetLastError( ERROR_OUTOFMEMORY );
    }

    …………
}
在Pin_Open的时候,把这个CameraDevice的指针给了他的一个成员:
DWORD
PIN_Open(
    DWORD Context,
    DWORD Access,
    DWORD ShareMode
    )
{
…………
if ( false == pPinDevice->InitializeSubDevice( pPinInit->pCamDevice ) )
//InitializeSubDevice这个函数就是一个简单的set函数,给成员函数赋值
        {
            SAFEDELETE( pPinDevice );
            DEBUGMSG( ZONE_INIT|ZONE_ERROR, ( _T("PIN_Init: Initialization Failed") ) );
        }
……………………
}
在处理IOContro的时候:
在处理Pin驱动上面的IOCTL_CS_PROPERTY的时候会调用下面的一个函数
DWORD
CPinDevice::PinHandleCustomRequests(
    PUCHAR pInBuf,              // Warning: This is an unsafe buffer, access with care
    DWORD  InBufLen,
    PUCHAR pOutBuf,             // Warning: This is an unsafe buffer, access with care
    DWORD  OutBufLen,
    PDWORD pdwBytesTransferred  // Warning: This is an unsafe buffer, access with care
    )
{
    return m_pCamAdapter->PDDHandlePinCustomProperties( m_ulPinId, pInBuf, InBufLen, pOutBuf, OutBufLen, pdwBytesTransferred );
//这里这个m_pCamAdapter成员  其实就是PCAMERADEVICE,上面在Pin Open的时候已经赋值
}


EXTERN_C
BOOL
CAM_IOControl(
    DWORD   dwContext,
    DWORD   Ioctl,
    UCHAR * pInBufUnmapped,
    DWORD   InBufLen,
    UCHAR * pOutBufUnmapped,
    DWORD   OutBufLen,
    DWORD * pdwBytesTransferred
   )
{
………………
         case IOCTL_CS_PROPERTY:
        {
            DEBUGMSG( ZONE_IOCTL, ( _T("CAM_IOControl(%08x): IOCTL_CS_PROPERTY\r\n"), dwContext ) );

            __try
            {
                dwErr = pCamDevice->AdapterHandleCustomRequests( pInBuf,InBufLen, pOutBuf, OutBufLen, pdwBytesTransferred );
………………
}

两个驱动都可以访问同一个PCAMERADEVICE的指针。但是对于Pin的驱动来说,他自己还有一个PinDevice。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

51
 
上面的是6410bsp的摄像头框架的代码
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

52
 
引用 50 楼 jinlking 的回复:
上面的是6410bsp的摄像头框架的代码


有6410 搞,羡慕中。

哦,原来6410的 camera比较正规了!
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

53
 
时序问题可能性较大,主要是延时。能读id并不代表时序就一定正确,特别是其他寄存器的写入。建议你每设置一个寄存器,马上再读出来比较一下。
camera本身是source filter一部分,是一定要有pin的,一般是3个。驱动写成怎样和ce的dx版本很有关系,ce5你做成这样也是媚眼给瞎子看,ce6和wm才有用。6410 camera只不过回归到伟大的dx架构下而已,兼容多个版本。三星很喜欢这样的代码复用,甚至ce6的bsp都是兼容wm的,很强。
 
 
 

回复

44

帖子

0

TA的资源

一粒金砂(初级)

54
 
引用 37 楼 gooogleman 的回复:
在这里我想问个弱智问题
————————————————————————————
LCD怎么填上八位的图像数据就可以显示了? ——搞错了ScreenBitmap是十六位的
memcpy((void *)IMAGE_FRAMEBUFFER_UA_BASE, ScreenBitmap, LCD_ARRAY_SIZE_TFT_16BIT);
这个LCD是16位的RGB565格式啊,对这个不了解。


我的图像是直接拷贝到LCD 显示的,和上面的原理相同! ——这里明白了,是把RGB565 分成两个bit,如果是三个bit就浪费了
memcpy((void *)(IMAGE_FRAMEBUFFER_UA_BASE+ (240*2*pos_y + pos_x*2) + y*240*2),
  (void *)buffer_rgb,
  (size_x*2));



C/C++ code
// 在这个函数里面,把RGB分为四帧来传送。为什么会是四帧呢?还有,这是RGB565的LCD,怎么一次性传送八位而已呢
void Display_Cam_Image(U32 pos_x, U32 pos_y, U32 size_x, U32 size_y, U8 port)
{
    U8 *buffer_rgb;//这是RGB565的LCD,怎么一次性传送八位而已呢——这里理解错了,这样定义代表这个数据以一字节来访问

    U32 y;
    int temp;
   
    //unsigned short *ptr = (unsigned short *)(FRAMEBUF_BASE+0x5dc0);
   
    static unsigned short transfer_data[QCIF_XSIZE*QCIF_YSIZE];
    static unsigned int time,old_time;
   
    RETAILMSG(1,(_T("Display_Cam_Image()\r\n")));
   
    //if (port)
    {
        temp = (s2440CAM->rCIPRSTATUS>>26)&3;//Preview path status
        temp = (temp + 2) % 4;
        
        switch (temp)
        {
        case 0:
            buffer_rgb = (U8 *)s2440CAM->rCIPRCLRSA1;//RGB 1st frame start address for preview DMA
            break;
        case 1:
            buffer_rgb = (U8 *)s2440CAM->rCIPRCLRSA2;//RGB 2nd frame start address for preview DMA
            break;
        case 2:
            buffer_rgb = (U8 *)s2440CAM->rCIPRCLRSA3;//
            break;
        case 3:
            buffer_rgb = (U8 *)s2440CAM->rCIPRCLRSA4;//RGB 4th frame start address for preview DMA
            break;
        default :
            buffer_rgb = (U8 *)s2440CAM->rCIPRCLRSA1;
            break;
        }
    }
//四个frame start address 是轮流使用的,从后面显示可以看出来,每个地址存放两个RGB565 数据
    RETAILMSG(1,(_T("preview buf index = %d\r\n"), temp));

#if (DOTNET_DRIVER)
    SetKMode(TRUE);
#endif

    RETAILMSG(1,(_T("preview buf index = %x\r\n"), buffer_rgb));
    buffer_rgb += VIRTUAL_OFFSET;
    RETAILMSG(1,(_T("preview buf index = %x\r\n"), buffer_rgb));
//    time = GetTickCount();
//    RETAILMSG(1,(TEXT("+:%d\r\n"),(time - old_time)));


#if 1
    for (y=0;y<(size_y-2);y++) //rgb format
    {
        //memcpy((void *)(FRAMEBUF_BASE+0x5e00+y*240*2),(void *)buffer_rgb,(QCIF_XSIZE)*2);
        //memcpy((void *)(FRAMEBUF_BASE+ (240*pos_y + pos_x) + y*240*2),(void *)buffer_rgb,(QCIF_XSIZE)*2);

        //our LCD vbuff is xsize = 480 ysize = 320 QCIF_XSIZE = 240
        //copy one line
        //RETAILMSG(1,(_T("IMAGE_FRAMEBUFFER_UA_BASE(1)\r\n")));
        //void *memcpy( void *dest, const void *src, size_t count );
        //Display_Cam_Image(0,0, 240, 240, PORT_A);
        memcpy((void *)(IMAGE_FRAMEBUFFER_UA_BASE+ (240*2*pos_y + pos_x*2) + y*240*2),
               (void *)buffer_rgb,
               (size_x*2));
        //RETAILMSG(1,(_T("IMAGE_FRAMEBUFFER_UA_BASE(2)\r\n")));
        //跳到图像的下一行开始指针
        buffer_rgb += (QCIF_XSIZE*2);
    }
#endif

#if (DOTNET_DRIVER)
    SetKMode(FALSE);
#endif

    old_time = GetTickCount();
    //RETAILMSG(1,(TEXT("-:%d\r\n"),(old_time - time)));

}



哎,理解这些数据格式了。现在感觉,俺的C语言就是一个字,菜!
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

55
 
jinlking、clementzhao英雄,不好意思借用googleman的地盘,我新建了个帖子,恳请光临,http://topic.eeworld.net/u/20090706/17/0e663687-8903-406d-8654-2b5d06505f79.html?3062,有分的!呵呵!
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

56
 
本来以为今天可以开展调试显示问题了,

但是我发现了个严重的错误,我把Display_Cam_Image放错地方了,
我改正后,放到
if (cam_intr == BIT_SUB_CAM_P)
{
RETAILMSG(1, (TEXT(" Camera interrupt.....BIT_SUB_CAM_P\r\n")));
Display_Cam_Image(0,0, 240, 240, PORT_A);// 2009.07.07
//Buffer_preview_info_update();
}

居然信息不打印,了,图像也不显示了,
这个说明P通道中断(用来显示图像的)根本没有产生中断,所以以前显示条纹很正常了。哎,真是可怜人哦。
这个程序是根据OV9650 修改而来, 也是能打开的,没有想到居然会这样子,真是不知道为什么了。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(高级)

57
 
嘿嘿,终于出图像了,不过200W摄像头的图像,效果比130W的OV9652 还要差。不知道怎么回事呢。真晕啊。
汗死我了。
大家帮我看看是什么原因,对于这方面的经验,实在是太少了。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

58
 
应用程序是基于DShow写的吧
像素差  要改变Capture filter的配置
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

59
 
引用 57 楼 jinlking 的回复:
应用程序是基于DShow写的吧
像素差  要改变Capture filter的配置


DShow 改善不大的,我看过别人的,也是直接显示在LCD上的,非常清晰。
现在我位置校正了,下次找FAE来配置寄存器就可以了。

哈哈,总算完成任务了。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

60
 
发个好点的正常位置看看吧。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表