kernel/eka/include/drivers/display.h
changeset 9 96e5fb8b040d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/include/drivers/display.h	Thu Dec 17 09:24:54 2009 +0200
@@ -0,0 +1,363 @@
+// Copyright (c) 1998-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:
+// os\kernelhwsrv\kernel\eka\include\drivers\display.h 
+// Interface to LDD of the Display GCE driver
+// Kernel side definitions for the GCE driver
+//
+
+/**
+ @file
+ @internalTechnology
+ @prototype
+*/
+
+
+#ifndef __DISPLAY_H__
+#define __DISPLAY_H__
+
+#include <videodriver.h>
+#include <dispchannel.h>
+#include <platform.h>
+#include <pixelformats.h>
+
+
+
+const TInt KDisplayLBMax = 2;
+const TInt KDisplayCBMax = 2;
+const TInt KDisplayUBMax = 8;
+
+
+const TInt KPendingReqArraySize  = RDisplayChannel::EReqWaitForPost +1;
+  
+const TInt KMaxQueuedRequests 	 = 3;
+
+class DDisplayChannel;
+
+
+enum TBufferType
+{
+    	EBufferTypeLegacy = 0,
+    	EBufferTypeComposition,
+    	EBufferTypeUser,
+};
+
+
+enum TBufferState
+{
+   		EBufferFree = 0,
+   		EBufferCompose,
+   		EBufferPending,
+   		EBufferActive
+};
+
+
+typedef struct
+{
+    	TInt    		iType;
+    	TInt    		iBufferId;
+	    TBool   		iFree;
+	    TInt    		iHandle;
+	    TInt    		iSize;
+	    TUint32 		iAddress;
+	    TUint32  		iPhysicalAddress; 
+	    TInt    		iOffset ;
+	    DChunk * 		iChunk ;
+	    TBufferState 	iState;
+	    TRequestStatus* iPendingRequest;
+
+} TBufferNode;
+
+
+/**
+An object encapsulating a request from the client(iOwningThread) to the GCE driver. 
+*/ 
+typedef struct
+{
+	  
+	  /** The TClientRequest object associated with the request - used to signal completion of the request and pass back a
+	   completion code. */
+	  TClientRequest*   iTClientReq;
+	  
+	  /** The thread which issued the request and which supplied the request status. */
+	  DThread* 			iOwningThread;
+	  
+} TRequestNode;
+
+
+
+class DDisplayPdd; 
+
+
+/**
+  Logical Channel factory class for 'Display Channel LDD'
+*/
+
+class DDisplayLddFactory : public DLogicalDevice
+	{
+public:
+    static DDisplayLddFactory* CreateInstance();
+	~DDisplayLddFactory();
+	//	Inherited from DLogicalDevice
+	virtual TInt Install();
+	virtual void GetCaps(TDes8& aDes) const;
+	virtual TInt Create(DLogicalChannelBase*& aChannel);
+	TBool 	IsUnitOpen(TInt aUnit);
+	TInt 	SetUnitOpen(TInt aUnit,TBool aIsOpenSetting);
+private:
+	DDisplayLddFactory();
+	
+	
+private:
+	/** Mask to keep track of which units have a channel open on them. */
+	TUint iUnitsOpenMask;				
+	/** A mutex to protect access to the unit info mask. */
+	NFastMutex iUnitInfoMutex;	
+	};
+
+
+/**
+  Logical Channel class for 'Display Channel LDD'
+*/
+class DDisplayLdd : public DLogicalChannel 
+	{
+
+public:
+    // create one instance of this object
+	static DDisplayLdd* CreateInstance();
+	virtual ~DDisplayLdd();
+	virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
+    virtual void HandleMsg(TMessageBase* aMsg);
+
+private:
+	DDisplayLdd();
+
+private:
+	// Implementation for the differnt kinds of messages sent through RBusLogicalChannel
+	TInt  			DoControl(TInt aFunction, TAny* a1, TAny* a2, DThread* aClient);
+	TInt  			DoRequest(TInt aReqNo, TAny* a1, TAny* a2,  TInt index, DThread* aClient);
+	void  			DoCancel(TUint aMask);
+	
+	TInt 		    SendRequest(TMessageBase* aMsg);
+	TInt 		    SendControl(TMessageBase* aMsg);
+	TInt 		    SendMsg(TMessageBase* aMsg);	 
+       
+    TBufferNode*  	FindUserBufferNode(TInt aBufferId);  
+    TInt 			CheckAndOpenUserBuffer(TBufferNode* aNode, TInt aHandle, TInt aOffset, DThread* aClient);         
+    TInt  			FreeUserBufferNode(TBufferNode* aNode);
+    
+    void 			CompleteRequest(DThread* aThread, TClientRequest*& aTClientReq, TInt aReason);
+          
+    DDisplayPdd * 	Pdd();  
+    	
+public: 	
+ 	virtual TInt 	RequestComplete(TInt aRequest, TInt );
+
+
+public:
+              	    
+    // display info
+    RDisplayChannel::TDisplayInfo 	iLegacyInfo;
+    RDisplayChannel::TDisplayInfo 	iDisplayInfo;
+    
+        // post counters
+    RDisplayChannel::TPostCount   	iCurrentPostCount;
+    RDisplayChannel::TPostCount   	iRequestedPostCount;
+    
+    
+    DThread*    	iClient;	
+	TInt        	iUnit;      
+    
+    // frame buffer nodes
+    TBufferNode 	iLegacyBuffer[KDisplayLBMax];
+    TBufferNode 	iCompositionBuffer[KDisplayCBMax];
+    TBufferNode 	iUserBuffer[KDisplayUBMax];
+     
+    //pending queue for asynchronous requests
+    TRequestNode 	iPendingReq[KPendingReqArraySize][KMaxQueuedRequests];
+        
+    //Queue of TClientRequest objects, one for each type of asynchronous request.
+    TClientRequest* iClientRequest[KPendingReqArraySize][KMaxQueuedRequests];
+	
+	//The index in structures iPendingReq and iClientRequest that identifies the active TClientRequest object.
+	//For each type of asynchronous request, iPendingIndex is the index of the active TClientRequest object 
+	//in iPendingReq
+	TInt			iPendingIndex[KPendingReqArraySize];
+    
+    // Protect access of iClientRequest
+    DMutex * 		 iClientRequestMutex;
+    
+     
+    // current index
+    TInt    		iLegacyBuffIdx;
+	TInt    		iCompositionBuffIdx;
+    TInt    		iUserBuffIdx;
+     
+    
+    RDisplayChannel::TDisplayRotation 	iLegacyRotation;
+    RDisplayChannel::TDisplayRotation   iCurrentRotation;
+    
+    
+    TBool    		iReady;  
+    
+    /** Used in debug builds to track that all calls to DThread::Open() are balanced with a close before the driver closes. */
+	TInt iThreadOpenCount; 
+	
+	/** Used in debug builds to track the number of asynchronous requests that are queued is equal to the number of 
+	requests that are completed, before the driver closes.*/
+	TInt iAsyncReqCount; 
+
+	/** Chunk used in UDEB only for testing user buffers. */
+	DChunk*	iChunk;
+	};
+
+
+ /**
+    Display PDD base class with GCE support.
+   */
+
+class DDisplayPdd : public DBase
+	{
+
+	public:
+    
+  	/**  
+    Called by the LDD to handle the device specific part of switching to Legacy mode.
+ 
+	@return KErrNone if successful; or one of the other system wide error codes.
+    */    
+    virtual TInt  SetLegacyMode()=0;
+        
+     /**
+     Called by the LDD to handle the device specific part of switching to GCE mode.
+     
+     @return KErrNone if successful; or one of the other system wide error codes.
+     */       
+    virtual TInt  SetGceMode()=0;
+    
+     /**
+     Called by the LDD to handle the device specific part of setting the rotation.
+     
+     @return KErrNone if successful; or one of the other system wide error codes.
+     */       
+    virtual TInt  SetRotation(RDisplayChannel::TDisplayRotation aRotation)=0;
+
+     /**
+     Called by the LDD to handle the device specific part of posting a User Buffer.
+     
+     @return KErrNone if successful; or one of the other system wide error codes.
+     */ 	
+	virtual TInt  PostUserBuffer(TBufferNode* aNode)=0;
+	
+     /**
+     Called by the LDD to handle the device specific part of posting a Composition Buffer
+     
+     @return KErrNone if successful; or one of the other system wide error codes.
+     */ 		
+	virtual TInt  PostCompositionBuffer(TBufferNode* aNode)=0;
+        
+     /**
+     Called by the LDD to handle the device specific part of posting the Legacy Buffuer
+     
+     @return KErrNone if successful; or one of the other system wide error codes.
+     */   
+    virtual TInt  PostLegacyBuffer()=0;
+    
+    /**
+     Called by the LDD to handle device specific cleanup operations when a channel is closed.
+          
+     @return KErrNone if successful; or one of the other system wide error codes.
+     */  
+    virtual TInt  CloseMsg()=0;
+            
+     /**
+     Called by the LDD to handle device specific initialisation tasks when a channel is opened.
+     
+     @param aUnit The screen/hardware unit number.
+     @return KErrNone if successful; or one of the other system wide error codes.
+     */    
+    virtual TInt  CreateChannelSetup(TInt aUnit)=0;
+          
+     /**
+     Called by the LDD in order to detect whether a post operation is pending. This type of 
+     information is specific to the actual physical device.
+     
+     @return ETrue if a Post operation is pending otherwise EFalse.
+     */       
+   	virtual TBool  PostPending()=0;
+    
+    /**
+     Called by the LDD to retrieve the DFC Queue created in the PDD.      
+     
+     @param aUnit The screen/hardware unit number.
+     @return A pointer to the TDfcQue object created in the PDD.
+     */    
+    virtual TDfcQue* DfcQ(TInt  aUnit)=0;    
+            
+     /**
+     Called by the PDD when an asynchronous request should be completed with a specific reason.
+     (Just calls the LDD's RequestComplete method)
+     
+      @param aRequest Any value from the RDisplayChannel::TRequest enumeration.
+      @param aReason  Any valid error reason.
+      
+      @return KErrNone if successful; or one of the other system wide error codes.
+     */
+    inline TInt RequestComplete(TInt aRequest, TInt aReason );
+    
+
+public:        
+  	/**
+    A pointer to the logical device driver's channel that owns this device.
+    */        
+    DDisplayLdd *iLdd;
+    /**
+	Every post operation sets this flag to true in order to identify when
+	the previsouly posted buffer is no longer in use by the display hardware. 
+    */ 
+	TBool		 iPostFlag;
+           
+	};
+
+
+inline DDisplayPdd * DDisplayLdd::Pdd()
+    { return (DDisplayPdd*) iPdd; }
+
+
+inline TInt DDisplayPdd::RequestComplete(TInt aRequest, TInt aReason)
+	{ return iLdd->RequestComplete(aRequest,aReason); }
+
+
+
+
+//#define _GCE_DISPLAY_DEBUG
+
+#ifdef _GCE_DISPLAY_DEBUG
+
+#define  __DEBUG_PRINT(a) 			Kern::Printf(a)
+#define  __DEBUG_PRINT2(a,b) 		Kern::Printf(a,b)
+#define  __DEBUG_PRINT3(a,b,c) 		Kern::Printf(a,b,c)
+#define  __DEBUG_PRINT4(a,b,c,d) 	Kern::Printf(a,b,c,d)
+#define  __DEBUG_PRINT5(a,b,c,d,e) 	Kern::Printf(a,b,c,d,e)
+
+#else
+#define  __DEBUG_PRINT(a)
+#define  __DEBUG_PRINT2(a,b)
+#define  __DEBUG_PRINT3(a,b,c)
+#define  __DEBUG_PRINT4(a,b,c,d) 
+#define  __DEBUG_PRINT5(a,b,c,d,e)
+
+#endif
+
+
+#endif	// __DISPLAY_H__