diff -r 2925e6e5efd7 -r 33dfab4ab0fc baseport/syborg/svpframebuffer/svpframebuffer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/baseport/syborg/svpframebuffer/svpframebuffer.h Wed Jan 27 14:42:12 2010 +0000 @@ -0,0 +1,297 @@ +/* +* Copyright (c) 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: Minimalistic frame buffer driver +* +*/ + +#ifndef _SVPFRAMEBUFFER_H +#define _SVPFRAMEBUFFER_H + +#include + +#include +#include + +#define __SVPFRAMEBUFFER_DEBUG + +#ifdef __SVPFRAMEBUFFER_DEBUG + +#define __GCE_DEBUG_PRINT(a) Kern::Printf(a) +#define __GCE_DEBUG_PRINT2(a,b) Kern::Printf(a,b) + +#else + +#define __GCE_DEBUG_PRINT(a) +#define __GCE_DEBUG_PRINT2(a,b) + +#endif + +// Macro to calculate the screen buffer size +// aBpp is the number of bits-per-pixel, aPpl is the number of pixels per line and aLpp number of lines per panel +#define FRAME_BUFFER_SIZE(aBpp,aPpl,aLpp) ((aBpp/8)*aPpl*aLpp) + +_LIT(KLitLcd,"SYBORG_FB"); + +const TUint KConfigLcdWidth = 640; +const TUint KConfigLcdHeight = 480; +const TInt KConfigLcdWidthInTwips = 9638; +const TInt KConfigLcdHeightInTwips = 7370; +const TBool KConfigIsMono = 0; +const TBool KConfigIsPalettized = 0; +const TInt KCOnfigOffsetToFirstPixel = 0; +const TBool KConfigPixelOrderRGB = 0; +const TBool KConfigPixelOrderLandscape = 1; +const TInt KConfigLcdDisplayMode = 2; +//const TInt KConfigLcdDisplayMode = 1; +const TInt KConfigLcdNumberOfDisplayModes = 3; + + +const TInt KConfigBitsPerPixel = 24; +const TInt KCOnfigOffsetBetweenLines = 2560; + +const TInt KVSyncDfcPriority = 7 ; //priority of DFC within the queue (0 to 7, where 7 is highest) + +/********************************************************************/ +/* Class Definition */ +/********************************************************************/ +/** + * This class defines a callback mechanism that is used by a resource user to specify its callback. It contains a + * function pointer and data pointer. The function pointer specifies the user callback function to be invoked by the + * resource while the data pointer specifies the data to be passed to the callback function. + */ +class TLcdUserCallBack + { +public: + // The constructor for the callback mechanism. + TLcdUserCallBack(TInt (*aFunction)(TUint aResID, TAny* aPtr), TAny* aPtr) + + { + iCbFn = aFunction; + iDataPtr = aPtr; + } + +public: + // The callback function pointer. + TInt (*iCbFn)(TUint aResID, TAny* aPtr); + + // Pointer to the data structure to be passed to the callback function. + TAny *iDataPtr; + }; + +class DLcdPowerHandler : public DPowerHandler +{ +public: // from DPowerHandler + void PowerDown(TPowerState); + void PowerUp(); +public: // to prevent a race condition with WServer trying to power up/down at the same time + void PowerUpDfc(); + void PowerDownDfc(); +public: + DLcdPowerHandler(); + TInt Create(); + void DisplayOn(); + void DisplayOff(); + TInt HalFunction(TInt aFunction, TAny* a1, TAny* a2); + + void PowerUpLcd(TBool aSecure); + void PowerDownLcd(); + + void ScreenInfo(TScreenInfoV01& aInfo); + void WsSwitchOnScreen(); + void WsSwitchOffScreen(); + void HandleMsg(TMessageBase* aMsg); + void SwitchDisplay(TBool aSecure); + +private: + TInt GetCurrentDisplayModeInfo(TVideoInfoV01& aInfo, TBool aSecure); + TInt GetSpecifiedDisplayModeInfo(TInt aMode, TVideoInfoV01& aInfo); + TInt SetDisplayMode(TInt aMode); + TInt AllocateFrameBuffer(); + +public: + IMPORT_C static TInt RegisterCallback(TLcdUserCallBack* aCbPtr); + IMPORT_C static void DeRegisterCallback(TLcdUserCallBack* aCbPtr); + +private: + TBool iDisplayOn; + DPlatChunkHw* iChunk; + DPlatChunkHw* iSecureChunk; + TBool iWsSwitchOnScreen; + TBool iSecureDisplay; + +public: + TDfcQue* iDfcQ; + TMessageQue iMsgQ; // to prevent a race condition with Power Manager trying to power up/down at the same time + TDfc iPowerUpDfc; + TDfc iPowerDownDfc; + +private: + NFastMutex iLock; + TPhysAddr ivRamPhys; + TPhysAddr iSecurevRamPhys; + TLcdUserCallBack * iAppCallBk[2]; + +public: + TVideoInfoV01 iVideoInfo; + TVideoInfoV01 iSecureVideoInfo; + TInt iSize; + TLinAddr iPortAddr; + TPhysAddr iCompositionPhysical; + static DLcdPowerHandler * pLcd; + +enum { + FB_ID = 0, + FB_BASE = 1, + FB_HEIGHT = 2, + FB_WIDTH = 3, + FB_ORIENTATION = 4, + FB_BLANK = 5, + FB_INT_MASK = 6, + /* begin new interface */ + FB_INTERRUPT_CAUSE = 7, + FB_BPP = 8, + FB_COLOR_ORDER = 9, + FB_BYTE_ORDER = 10, + FB_PIXEL_ORDER = 11, + FB_ROW_PITCH = 12, + FB_ENABLED = 13, + FB_PALETTE_START = 0x400 >> 2, + FB_PALETTE_END = FB_PALETTE_START+256-1, + /* end new interface */ + }; + +#define FB_INT_VSYNC (1U << 0) +#define FB_INT_BASE_UPDATE_DONE (1U << 1) + +}; + +class DDisplayPddSyborg : public DDisplayPdd + { + + public: + DDisplayPddSyborg(); + ~DDisplayPddSyborg(); + + /** + 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(); + + /** + 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(); + + /** + 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(TInt aRotation); + + /** + 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); + + /** + 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); + + /** + 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(); + + /** + 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(); + + /** + 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); + + /** + 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(); + + /** + 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); + +public: + static void VSyncDfcFn(TAny* aChannel); + +private: + TDfcQue* iDfcQ; + + //generic display info + TVideoInfoV01 iScreenInfo; + + //Pointer to a buffer in the Pending state + TBufferNode* iPendingBuffer; + + //Pointer to a buffer in the Active state + TBufferNode* iActiveBuffer; + + DChunk * iChunk; + TLcdUserCallBack* iLcdCallback; + + public: + TDfc iVSyncDfc; + }; + + +/** + PDD Factory class + */ + +class DDisplayPddFactory : public DPhysicalDevice + { +public: + DDisplayPddFactory(); + + virtual TInt Install(); + virtual void GetCaps(TDes8& aDes) const; + virtual TInt Create(DBase*& aChannel, TInt aUnit, const TDesC8* aInfo, const TVersion& aVer); + virtual TInt Validate(TInt aDeviceType, const TDesC8* anInfo, const TVersion& aVer); + }; + +#endif