⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pindriver.h

📁 Microsoft WinCE 6.0 BSP FINAL release source code for use with the i.MX27ADS TO2 WCE600_FINAL_MX27_S
💻 H
字号:
//-----------------------------------------------------------------------------
//
// Copyright (C) 2003-2004, MOTOROLA, INC. All Rights Reserved
// THIS SOURCE CODE IS CONFIDENTIAL AND PROPRIETARY AND MAY NOT
// BE USED OR DISTRIBUTED WITHOUT THE WRITTEN PERMISSION OF
// MOTOROLA, INC.
//
//------------------------------------------------------------------------------
//
//  Copyright (C) 2004-2006, Freescale Semiconductor, Inc. All Rights Reserved.
//  THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
//  AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//
//------------------------------------------------------------------------------
//
//  File:  PinDriver.h
//
//  Header file for PinDevice class
//
//------------------------------------------------------------------------------

#include "CameraDriver.h"

#ifndef __PIN_DD
#define __PIN_DD

#include "marshal.hpp" //helper classes to marshal/alloc embedded/async buffer

#ifdef __cplusplus
extern "C" {
#endif

//------------------------------------------------------------------------------
// Defines

#define PIN_TIMEOUT             250      //Amount of time, in milliseconds, before the WriteMsgQueue operation will time out
#define BUFFER_COUNT            4        // Increasing the buffer count from 3 to 4.
#define MAX_BUFFER_COUNT        100
#define WAIT_BUFFER_TIMEOUT     10000    //Timeout for receive a buffer from Prp module.

//------------------------------------------------------------------------------
// Types
typedef MMRESULT (WINAPI *FNTIMEKILLEVENT)(UINT);
typedef MMRESULT (WINAPI *FNTIMESETEVENT)(UINT, UINT, LPTIMECALLBACK, DWORD, UINT );

typedef enum _ImageCommands
{
    IMAGE_NTSC_EIA_100AMP_100SAT = 0,      
    IMAGE_NTSC_EIA_75AMP_100SAT,           
    IMAGE_BLACK,
    IMAGE_WHITE,
    IMAGE_GRAY_INCREASING, 
    IMAGE_LIST_TERMINATOR                  // Always keep this guy last
} IMAGECOMMAND;

typedef struct CPinInitHandle
{
    PCAMERADEVICE pCamDevice;
} PININITHANDLE, * PPININITHANDLE;

typedef UINT (*PFNBUFFERFILL)( PUCHAR pImage, PCS_VIDEOINFOHEADER pCsVideoInfoHdr, IMAGECOMMAND Command, bool FlipHorizontal, LPVOID lpParam );
//UINT BufferFill( PUCHAR pImage, PCS_VIDEOINFOHEADER pCsVideoInfoHdr, IMAGECOMMAND Command, bool FlipHorizontal, LPVOID lpParam );

typedef struct 
{
    ULONG ulBrightness;
    ULONG ulZoom;
} BUFFERFILLPARAMS, *PBUFFERFILLPARAMS;

typedef struct _tagStreamDescriptorShadow
{
    PCS_STREAM_DESCRIPTOR pCsStreamDescriptorExternal;
    CS_STREAM_DESCRIPTOR  csStreamDescriptorShadow;
    BOOL                  m_fBusy;
    MarshalledBuffer_t   *m_pMarshalledDataBuffer; //Marshalled/Async allocated data buffer when the memory model is not CSPROPERTY_BUFFER_DRIVER
    MarshalledBuffer_t   *m_pMarshalledStreamDesc; //Marshalled/Async allocated stream Desc when the memory model is not CSPROPERTY_BUFFER_DRIVER
    PCS_STREAM_DESCRIPTOR m_pUnMarshalledStreamDesc; //driver maintains the unmarshalled buffer value to instruct the client where to read data from    
} CS_STREAM_DESCRIPTOR_SHADOW, * PCS_STREAM_DESCRIPTOR_SHADOW;


typedef class CPinDevice 
{
    public:
        CPinDevice();

        ~CPinDevice();

        BOOL InitializeSubDevice(PCAMERADEVICE pCamDevice);

        DWORD StreamInstantiate(
            PCSPROPERTY_STREAMEX_S pCsPropStreamEx,
            PUCHAR                 pOutBuf,
            DWORD                  OutBufLen,
            PDWORD                 pdwBytesTransferred
        );

        DWORD PinHandleConnectionRequests( 
            PCSPROPERTY pCsProp,
            PUCHAR pOutBuf,                 // Unsafe, use with caution
            DWORD  OutBufLen,
            PDWORD pdwBytesTransferred      // Unsafe, use with caution
        );

        DWORD
        PinHandleBufferRequest(
            CSBUFFER_INFO  csBufferInfo,
            PUCHAR pOutBuf,
            DWORD  OutBufLen,
            DWORD *pdwBytesTransferred
        );

        DWORD PinSetDirectDisplayMode(BOOL bDirectDisplayMode);

        DWORD PinSetDirectCaptureMode(BOOL bDirectCaptureMode);

        void SetPowerState(CEDEVICE_POWER_STATE power_state);
    
        CEDEVICE_POWER_STATE GetPowerState();

        void HandlePinIO( );

        void FlushBufferQueue();

        DWORD SetState(
            CSSTATE   CsState,
            CSSTATE * CsPrevState
            );

        static void TimerCallBack(
            UINT uTimerID,
            UINT uMsg,
            DWORD_PTR dwUser,
            DWORD_PTR dw1,
            DWORD_PTR dw2
            ); 

        DWORD PauseStream( );

        BOOL CloseSubDevice( );

        ULONG PictureNumber( ) const;

        ULONG FramesDropped( ) const;

        ULONG FrameSize( ) const;

        UINT PinBufferFill( 
            PUCHAR pImage, 
            PCS_VIDEOINFOHEADER pCsVideoInfoHdr, 
            IMAGECOMMAND Command, 
            BOOL FlipHorizontal, 
            LPVOID lpParam 
            );

        CS_DATARANGE_VIDEO m_CsDataRangeVideo;
        CSSTATE m_CsState;
    
        bool m_fPrpChannelEnabled;
        bool m_fJustEnablePrp;
        HANDLE m_hPrPBuffFilled;
        UINT8 m_BufferFilled;

        ULONG m_ulCurrNumOfBuffers;

    private:
        BOOL CreateTimer( );

        DWORD
        AllocateBuffer( 
            PCS_STREAM_DESCRIPTOR pCsDescriptor,
            LPVOID pOutBuf,
            DWORD  OutBufLen,
            DWORD *pdwBytesTransferred
        );

        DWORD
        DeallocateBuffer(
            PCS_STREAM_DESCRIPTOR pCsDescriptor
        );

        DWORD
        EnqueueDescriptor(
            PCS_STREAM_DESCRIPTOR pCsDescriptor
        );

        BOOL RemoveBufferFromList(
            PCS_STREAM_DESCRIPTOR * ppCsStreamDesc,
            PVOID                 * ppMappedData,
            PVOID                 * ppUnmappedData
            );

        BOOL ResetBufferList( );

        BOOL AllocateDriverBuffers();
        BOOL DeleteDriverBuffers();

        DWORD PinHandleConnStateSubReqs(
            ULONG  ulReqFlags,
            PUCHAR pOutBuf,
            DWORD  OutBufLen,
            PDWORD pdwBytesTransferred
            );

        DWORD PinHandleConnDataFormatSubReqs(
            ULONG                          ulReqFlags,
            PCS_DATAFORMAT_VIDEOINFOHEADER pCsDataFormatVidInfoHdr,
            PDWORD                         pdwBytesTransferred
            );

        BOOL InitMsgQueueDescriptor(
            PCS_MSGQUEUE_BUFFER pCsMsgQBuff, 
            PCS_STREAM_DESCRIPTOR pCsStreamDesc, 
            PVOID pMappedData, 
            PVOID pUnmappedData, 
            BOOL bFillBuffer
            );

        DWORD GetIndexFromHandle( 
            DWORD  dwHandle,
            LPVOID pBuffer
            );

        DWORD CreateHandle( 
            DWORD  dwIndex, 
            LPVOID pBuffer 
            );

        DWORD HwSetupStreamDescriptor(DWORD dwIndex);

        DWORD SwSetupStreamDescriptor(
            DWORD                 dwIndex,
            PCS_STREAM_DESCRIPTOR pCsStreamDesc,
            LPVOID                pBuffer
            );

        CSPROPERTY_BUFFER_MODE GetCurrentMemoryModel();

        DWORD GetMaxBufferCount();

        BOOL ReadMemoryModelFromRegistry();

        LPVOID RemoteLocalAlloc_I(UINT uFlags, ULONG ulBytes);
        VOID RemoteLocalFree_I(LPVOID lpData);

        ULONG              m_ulPinId;
        ULONG              m_ulMaxNumOfBuffers;
        ULONG              m_ulFrameSize;
        ULONG              m_ulFramesDropped;
        ULONG              m_ulPictureNumber;

        FNTIMESETEVENT     m_pfnTimeSetEvent; 
        FNTIMEKILLEVENT    m_pfnTimeKillEvent;

        PCAMERADEVICE      m_pCamAdapter;
    
        DWORD              m_dwBufferCount;
        PCS_STREAM_DESCRIPTOR_SHADOW m_pStreamDescriptorList;

        MMRESULT           m_TimerIdentifier;
        REFERENCE_TIME     m_RtAveTimePerFrame;
        DWORD              m_msStart;
        DWORD              m_msLastPT;

        HANDLE             m_hMsgQ;
        HANDLE             m_hIOThread;
        HMODULE            m_hTimerDll;

        CRITICAL_SECTION   m_csStreamBuffer;

        BOOL               m_fClientAllocateBuffers;
        BOOL               m_fClientInitialized;
        BOOL               m_fDiscontinuity;

        BOOL               m_bStillPinActive;

        HANDLE             m_pHeap;

        // If TRUE, only return the physics address of a frame buffer to application for further processing.
        // If FALSE, return the frame buffer to application for display/capture.(default.)
        BOOL               m_bDirectMode;

        PFNBUFFERFILL      m_pfnBufferFill;
        HINSTANCE          m_hInstBuffer;

        CSPROPERTY_BUFFER_MODE m_dwMemoryModel;
} PINDEVICE, * PPINDEVICE;

//------------------------------------------------------------------------------
// Functions

#ifdef __cplusplus
}
#endif

#endif //__PIN_DD

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -