--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/examples/camera1/camera1_dev.h Thu Dec 17 09:24:54 2009 +0200
@@ -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
+