diff -r 000000000000 -r a41df078684a kerneltest/e32test/examples/camera1/camera1_dev.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/examples/camera1/camera1_dev.h Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,152 @@ +// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// its implementation. +// +// + +/** + @file Kernel side interfaces to example camera device driver which uses Shared Chunks in + @publishedPartner + @prototype 9.1 +*/ + +#ifndef __CAMERA1_DEV_H__ +#define __CAMERA1_DEV_H__ + +/** + Logical Device (factory class) for 'Camera1' +*/ +class DCamera1Factory : public DLogicalDevice + { +public: + DCamera1Factory(); + ~DCamera1Factory(); + // Inherited from DLogicalDevice + virtual TInt Install(); + virtual void GetCaps(TDes8& aDes) const; + virtual TInt Create(DLogicalChannelBase*& aChannel); + }; + +/** + Class representing a single image buffer +*/ +class DImageBuffer + { +public: + DImageBuffer(); + ~DImageBuffer(); + TInt Create(DChunk* aChunk, TInt aOffset, TInt aSize); +public: + TInt iChunkOffset; /**< Offset, in bytes, of buffer start within the chunk */ + TInt iSize; /**< Size of buffer n bytes */ + TPhysAddr iPhysicalAddress; /**< Physical address of buffer. KPhysAddrInvalid if buffer not physically contiguous */ + TPhysAddr* iPhysicalPages; /**< List of physical addresses for buffer pages. 0 if buffer is physically contiguous */ + }; + +/** + Class representing all of the image buffers +*/ +class DCaptureBuffers : public DBase + { +public: + static DCaptureBuffers* New(TInt aNumBuffers,TInt aBufferSize); + void Open(); + void Close(); + void Reset(); + void Purge(DImageBuffer* aBuffer); + DImageBuffer* ImageForClient(); + DImageBuffer* ImageCaptured(); + DImageBuffer* ImageRelease(TInt aChunkOffset); + DImageBuffer* InUseImage(TInt aChunkOffset); +private: + DCaptureBuffers(); + ~DCaptureBuffers(); + TInt Create(TInt aNumBuffers,TInt aBufferSize); + static DImageBuffer* Remove(DImageBuffer** aList); + static DImageBuffer* Add(DImageBuffer** aList,DImageBuffer* aBuffer); +public: + DChunk* iChunk; /**< The chunk which contains the buffers */ + TLinAddr iChunkBase; /**< Linear address in kernel process for the start of the chunk */ + TUint32 iChunkMapAttr; /**< MMU mapping attributes for chunk */ + TInt iNumBuffers; /**< Number of buffers */ + DImageBuffer* iImageBuffer; /**< Array of iNumBuffers buffer objects */ + // + DImageBuffer* iCurrentBuffer; /**< The buffer currently being filled by image capture */ + DImageBuffer* iNextBuffer; /**< The buffer to use for next image capture */ + DImageBuffer** iFreeBuffers; /**< NULL terminated list of free buffers */ + DImageBuffer** iCompletedBuffers; /**< NULL terminated list of buffers containing captured images */ + DImageBuffer** iInUseBuffers; /**< NULL terminated list of buffers currently being used by client */ +private: + TInt iAccessCount; /**< Access count for this object */ + TAny* iBufferLists; /**< Memory holding lists iFreeBuffers, iCompletedBuffers and iInUseBuffers */ + }; + +/** + Logical Channel class for 'Camera1' +*/ +class DCamera1Channel : public DLogicalChannelBase + { +public: + DCamera1Channel(); + virtual ~DCamera1Channel(); + // Inherited from DLogicalChannelBase + virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer); + virtual TInt Request(TInt aReqNo, TAny* a1, TAny* a2); +private: + // Implementation for the differnt kinds of messages sent through RBusLogicalChannel + TInt DoControl(TInt aFunction, TAny* a1, TAny* a2); + TInt DoRequest(TInt aNotReqNo, TAny* a1, TAny* a2); + TInt DoCancel(TUint aMask); + // Methods for configuration + TInt GetConfig(TDes8* aConfigBuf); + TInt SetConfig(const TDesC8* aConfigBuf); + // Methods for capturing images + TInt StartCapture(); + TInt EndCapture(); + void CaptureImage(TRequestStatus* aRequestStatus,TInt aReleaseImage); + void CaptureImageCancel(); + TInt ImageRelease(TInt aChunkOffset); + static void CaptureDfcTrampoline(TAny* aSelf); + void CaptureDfc(); + void StateChange(TBool aNewState); + static void StateChangeDfcTrampoline(TAny* aSelf); + void StateChangeDfc(); + // Methods which program the camera hardware + void DoStartCapture(); + void DoEndCapture(); + void DoNextCapture(); +private: + NFastMutex iCaptureMutex; /**< Mutex to protect access to driver state */ + + DCaptureBuffers* iCaptureBuffers; /**< The image buffers */ + + TRequestStatus* iCaptureRequestStatus; /**< The request status for client CaptureImage request */ + DThread* iCaptureRequestThread; /**< The client thread which issued a CaptureImage request */ + + TDfcQue* iDfcQ; /**< The DFC queue used for driver functions */ + TDfc iStateChangeDfc; /**< DFC queued when Start/EndCapture requests are performed */ + TBool iNewState; /**< True if state change DFC should start image capture, false to stop capture */ + DMutex* iStateChangeMutex; /**< Mutex which protect Start/EndCapture requests from reenty */ + NFastSemaphore iStateChangeSemaphore; /**< Semaphore signaled when state change DFC completes */ + + RCamera1::TConfig iConfig; /**< The driver configuration information */ + TBool iCapturing; /**< Flag which is True when image capture is in progress */ + + TInt iCaptureCounter; /**< Frame counter incremented on each image captured */ + NTimer iCaptureTimer; /**< Timer used to emulate image capture hardware */ + TInt iCaptureRateTicks; /**< Number of timer ticks for iCaptureTimer */ + }; + +#endif +