baseport/syborg/svpframebuffer/svpframebuffer.cpp
author emilioc
Wed, 27 Jan 2010 14:42:12 +0000
branchphonesim-integ
changeset 38 33dfab4ab0fc
child 46 b6935a90ca64
permissions -rw-r--r--
PDD Display Driver for Syborg
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
     1
/*
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
     3
* All rights reserved.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
     4
* This component and the accompanying materials are made available
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
     6
* which accompanies this distribution, and is available
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
     8
*
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
     9
* Initial Contributors:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    11
*
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    12
* Contributors:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    13
*
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    14
* Description: Minimalistic frame buffer driver
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    15
*
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    16
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    17
#include <videodriver.h>
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    18
#include "platform.h"
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    19
#include <nkern.h>
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    20
#include <kernel/kernel.h>
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    21
#include <kernel/kern_priv.h>
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    22
#include <kernel/kpower.h>
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    23
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    24
#include <syborg_priv.h>
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    25
#include "svpframebuffer.h"
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    26
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    27
DLcdPowerHandler	*  DLcdPowerHandler::pLcd			= NULL;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    28
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    29
TPhysAddr Syborg::VideoRamPhys;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    30
TPhysAddr Syborg::VideoRamPhysSecure;		// Secure display memory
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    31
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    32
TPhysAddr TSyborg::VideoRamPhys()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    33
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    34
  __KTRACE_OPT(KEXTENSION,Kern::Printf("TSyborg::VideoRamPhys: VideoRamPhys=0x%x", Syborg::VideoRamPhys));
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    35
  return Syborg::VideoRamPhys;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    36
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    37
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    38
TPhysAddr TSyborg::VideoRamPhysSecure()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    39
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    40
  return Syborg::VideoRamPhysSecure;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    41
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    42
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    43
LOCAL_C TInt DoHalFunction(TAny* aPtr, TInt aFunction, TAny* a1, TAny* a2)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    44
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    45
  DLcdPowerHandler* pH=(DLcdPowerHandler*)aPtr;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    46
  return pH->HalFunction(aFunction,a1,a2);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    47
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    48
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    49
static void rxMsg(TAny* aPtr)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    50
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    51
  DLcdPowerHandler& h=*(DLcdPowerHandler*)aPtr;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    52
  TMessageBase* pM = h.iMsgQ.iMessage;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    53
  if(pM)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    54
	h.HandleMsg(pM);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    55
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    56
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    57
static void power_up_dfc(TAny* aPtr)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    58
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    59
  ((DLcdPowerHandler*)aPtr)->PowerUpDfc();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    60
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    61
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    62
void power_down_dfc(TAny* aPtr)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    63
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    64
  ((DLcdPowerHandler*)aPtr)->PowerDownDfc();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    65
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    66
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    67
void DLcdPowerHandler::DisplayOn()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    68
{ 
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    69
  PowerUpLcd(iSecureDisplay);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    70
  iDisplayOn = ETrue;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    71
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    72
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    73
void DLcdPowerHandler::DisplayOff()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    74
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    75
  PowerDownLcd();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    76
  iDisplayOn = EFalse;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    77
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    78
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    79
void DLcdPowerHandler::SwitchDisplay(TBool aSecure)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    80
 {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    81
   if(aSecure)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    82
	 {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    83
	   if(!iSecureDisplay)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    84
		 {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    85
		   DisplayOff();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    86
		   iSecureDisplay = ETrue;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    87
		   DisplayOn();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    88
		 }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    89
	 }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    90
   else
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    91
	 {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    92
	   if(iSecureDisplay)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    93
		 {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    94
		   DisplayOff();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    95
		   iSecureDisplay = EFalse;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    96
		   DisplayOn();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    97
		 }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    98
	 }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
    99
 }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   100
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   101
void DLcdPowerHandler::PowerUpDfc()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   102
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   103
  DisplayOn();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   104
  PowerUpDone();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   105
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   106
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   107
void DLcdPowerHandler::PowerDownDfc()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   108
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   109
  DisplayOff();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   110
  PowerDownDone();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   111
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   112
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   113
void DLcdPowerHandler::PowerDown(TPowerState)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   114
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   115
  iPowerDownDfc.Enque();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   116
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   117
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   118
void DLcdPowerHandler::PowerUp()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   119
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   120
  iPowerUpDfc.Enque();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   121
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   122
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   123
void DLcdPowerHandler::PowerUpLcd(TBool aSecure)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   124
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   125
#if 1
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   126
  WriteReg(iPortAddr, FB_ENABLED, 0);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   127
  WriteReg(iPortAddr, FB_BASE, aSecure ? iSecurevRamPhys : ivRamPhys);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   128
  WriteReg(iPortAddr, FB_WIDTH, iVideoInfo.iSizeInPixels.iWidth);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   129
  WriteReg(iPortAddr, FB_BLANK, 0);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   130
  WriteReg(iPortAddr, FB_BPP, 32);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   131
  WriteReg(iPortAddr, FB_COLOR_ORDER, 0);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   132
  WriteReg(iPortAddr, FB_BYTE_ORDER, 0);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   133
  WriteReg(iPortAddr, FB_PIXEL_ORDER, 0);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   134
  WriteReg(iPortAddr, FB_INT_MASK, 0);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   135
  WriteReg(iPortAddr, FB_ENABLED, 1);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   136
  WriteReg(iPortAddr, FB_HEIGHT, iVideoInfo.iSizeInPixels.iHeight);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   137
#endif
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   138
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   139
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   140
void DLcdPowerHandler::PowerDownLcd()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   141
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   142
  WriteReg(iPortAddr, FB_BLANK, 1);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   143
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   144
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   145
DLcdPowerHandler::DLcdPowerHandler()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   146
	:	DPowerHandler(KLitLcd),
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   147
		iMsgQ(rxMsg,this,NULL,1),
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   148
		iPowerUpDfc(&power_up_dfc,this,6),
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   149
		iPowerDownDfc(&power_down_dfc,this,7)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   150
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   151
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   152
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   153
void DLcdPowerHandler::ScreenInfo(TScreenInfoV01& anInfo)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   154
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   155
  anInfo.iWindowHandleValid = EFalse;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   156
  anInfo.iWindowHandle = NULL;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   157
  anInfo.iScreenAddressValid = ETrue;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   158
  anInfo.iScreenAddress = (TAny *)(iChunk->LinearAddress());
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   159
  anInfo.iScreenSize.iWidth = iVideoInfo.iSizeInPixels.iWidth;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   160
  anInfo.iScreenSize.iHeight = iVideoInfo.iSizeInPixels.iHeight;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   161
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   162
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   163
void DLcdPowerHandler::HandleMsg(TMessageBase* aMsg)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   164
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   165
  if(aMsg->iValue)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   166
	DisplayOn();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   167
  else
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   168
	DisplayOff();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   169
  aMsg->Complete(KErrNone,ETrue);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   170
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   171
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   172
void DLcdPowerHandler::WsSwitchOnScreen()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   173
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   174
  TThreadMessage& m = Kern::Message();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   175
  m.iValue = ETrue;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   176
  m.SendReceive(&iMsgQ);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   177
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   178
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   179
void DLcdPowerHandler::WsSwitchOffScreen()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   180
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   181
  TThreadMessage& m = Kern::Message();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   182
  m.iValue = EFalse;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   183
  m.SendReceive(&iMsgQ);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   184
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   185
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   186
TInt DLcdPowerHandler::GetCurrentDisplayModeInfo(TVideoInfoV01& aInfo, TBool aSecure)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   187
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   188
  NKern::FMWait(&iLock);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   189
  if(aSecure)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   190
	aInfo = iSecureVideoInfo;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   191
  else
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   192
	aInfo = iVideoInfo;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   193
  NKern::FMSignal(&iLock);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   194
  return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   195
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   196
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   197
TInt DLcdPowerHandler::GetSpecifiedDisplayModeInfo(TInt aMode, TVideoInfoV01& aInfo)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   198
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   199
  if(aMode < 0 || aMode >= KConfigLcdNumberOfDisplayModes)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   200
	return KErrArgument;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   201
  
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   202
  NKern::FMWait(&iLock);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   203
  aInfo = iVideoInfo;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   204
  NKern::FMSignal(&iLock);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   205
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   206
  if(aMode != aInfo.iDisplayMode)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   207
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   208
	  aInfo.iOffsetToFirstPixel = KCOnfigOffsetToFirstPixel;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   209
	  aInfo.iIsPalettized       = KConfigIsPalettized;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   210
	  aInfo.iOffsetBetweenLines = KCOnfigOffsetBetweenLines;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   211
	  aInfo.iBitsPerPixel       = KConfigBitsPerPixel;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   212
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   213
  return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   214
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   215
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   216
TInt DLcdPowerHandler::AllocateFrameBuffer()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   217
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   218
	// Allocate physical RAM for video
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   219
	TInt vSize = TSyborg::VideoRamSize();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   220
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   221
	NKern::ThreadEnterCS();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   222
	TInt r = Epoc::AllocPhysicalRam(vSize,Syborg::VideoRamPhys);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   223
	if (r != KErrNone)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   224
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   225
	        NKern::ThreadLeaveCS();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   226
		Kern::Fault("AllocVideoRam",r);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   227
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   228
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   229
	// Map the video RAM
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   230
	ivRamPhys = TSyborg::VideoRamPhys();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   231
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   232
	r = DPlatChunkHw::New(iChunk,ivRamPhys,vSize,EMapAttrUserRw|EMapAttrBufferedC);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   233
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   234
	NKern::ThreadLeaveCS();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   235
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   236
	if(r != KErrNone)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   237
	  return r;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   238
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   239
	TUint* pV = (TUint*)iChunk->LinearAddress();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   240
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   241
	// Allocate physical RAM for secure display
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   242
	NKern::ThreadEnterCS();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   243
	r = Epoc::AllocPhysicalRam(vSize,Syborg::VideoRamPhysSecure);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   244
	if (r != KErrNone)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   245
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   246
	        NKern::ThreadLeaveCS();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   247
		Kern::Fault("AllocVideoRam 2",r);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   248
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   249
	iSecurevRamPhys = ivRamPhys + vSize;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   250
	TInt r2 = DPlatChunkHw::New(iSecureChunk,iSecurevRamPhys,vSize,EMapAttrUserRw|EMapAttrBufferedC);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   251
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   252
	NKern::ThreadLeaveCS();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   253
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   254
	if(r2 != KErrNone)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   255
	  return r2;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   256
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   257
	TUint* pV2 = (TUint*)iSecureChunk->LinearAddress();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   258
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   259
	iVideoInfo.iSizeInPixels.iWidth  = KConfigLcdWidth;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   260
	iVideoInfo.iSizeInPixels.iHeight = KConfigLcdHeight;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   261
	iVideoInfo.iDisplayMode = KConfigLcdDisplayMode;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   262
	iVideoInfo.iOffsetToFirstPixel = KCOnfigOffsetToFirstPixel;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   263
	iVideoInfo.iOffsetBetweenLines = KCOnfigOffsetBetweenLines;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   264
	iVideoInfo.iIsPalettized = KConfigIsPalettized;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   265
	iVideoInfo.iBitsPerPixel = KConfigBitsPerPixel;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   266
	iVideoInfo.iSizeInTwips.iWidth = KConfigLcdWidthInTwips;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   267
	iVideoInfo.iSizeInTwips.iHeight = KConfigLcdHeightInTwips;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   268
	iVideoInfo.iIsMono = KConfigIsMono;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   269
	iVideoInfo.iVideoAddress = (TInt)pV;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   270
	iVideoInfo.iIsPixelOrderLandscape = KConfigPixelOrderLandscape;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   271
	iVideoInfo.iIsPixelOrderRGB = KConfigPixelOrderRGB;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   272
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   273
	iSecureVideoInfo = iVideoInfo;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   274
	iSecureVideoInfo.iVideoAddress = (TInt)pV2;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   275
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   276
	// Alloc Physical RAM for the Composition Buffers used by the GCE
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   277
	iSize = 4*480*640;//FRAME_BUFFER_SIZE( iVideoInfo.iBitsPerPixel, iVideoInfo.iSizeInPixels.iWidth, iVideoInfo.iSizeInPixels.iHeight);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   278
	__GCE_DEBUG_PRINT2("DLcdPowerHandler.iSize  = %d\n", iSize );
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   279
	// double and round the page size
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   280
	TUint round = 2*Kern::RoundToPageSize(iSize);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   281
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   282
	r=Epoc::AllocPhysicalRam(round , iCompositionPhysical);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   283
	if(r!=KErrNone)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   284
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   285
		return r;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   286
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   287
	
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   288
	return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   289
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   290
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   291
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   292
TInt DLcdPowerHandler::SetDisplayMode(TInt aMode)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   293
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   294
  if(aMode < 0 || aMode >= KConfigLcdNumberOfDisplayModes)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   295
	return KErrArgument;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   296
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   297
  // store the current mode
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   298
  iVideoInfo.iDisplayMode = aMode;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   299
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   300
  // store the current mode for secure screen
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   301
  iSecureVideoInfo.iDisplayMode = aMode;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   302
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   303
  return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   304
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   305
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   306
TInt DLcdPowerHandler::HalFunction(TInt aFunction, TAny* a1, TAny* a2)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   307
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   308
  TInt r=KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   309
  switch(aFunction)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   310
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   311
	case EDisplayHalScreenInfo:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   312
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   313
		TPckgBuf<TScreenInfoV01> vPckg;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   314
		ScreenInfo(vPckg());
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   315
		Kern::InfoCopy(*(TDes8*)a1,vPckg);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   316
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   317
	  }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   318
	case EDisplayHalWsRegisterSwitchOnScreenHandling:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   319
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   320
		iWsSwitchOnScreen=(TBool)a1;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   321
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   322
	  }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   323
	case EDisplayHalWsSwitchOnScreen:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   324
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   325
		WsSwitchOnScreen();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   326
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   327
	  }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   328
	case EDisplayHalModeCount:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   329
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   330
		TInt ndm = KConfigLcdNumberOfDisplayModes;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   331
		kumemput32(a1, &ndm, sizeof(ndm));
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   332
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   333
	  }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   334
	case EDisplayHalSetMode:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   335
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   336
		__KTRACE_OPT(KEXTENSION,Kern::Printf("EDisplayHalSetMode"));
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   337
		__SECURE_KERNEL(
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   338
						if(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetMode")))
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   339
						return KErrPermissionDenied;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   340
						)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   341
		  r = SetDisplayMode((TInt)a1);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   342
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   343
	  }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   344
	case EDisplayHalMode:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   345
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   346
		kumemput32(a1, &iVideoInfo.iDisplayMode, sizeof(iVideoInfo.iDisplayMode));
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   347
		r = KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   348
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   349
	  }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   350
	case EDisplayHalSetPaletteEntry:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   351
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   352
		__SECURE_KERNEL(
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   353
						if(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetPaletteEntry")))
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   354
						return KErrPermissionDenied;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   355
						)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   356
		  r = KErrNotSupported;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   357
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   358
	  }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   359
	case EDisplayHalPaletteEntry:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   360
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   361
		TInt entry;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   362
		kumemget32(&entry, a1, sizeof(TInt));
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   363
		r = KErrNotSupported;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   364
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   365
	  }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   366
	case EDisplayHalSetState:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   367
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   368
		__SECURE_KERNEL(
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   369
						if(!Kern::CurrentThreadHasCapability(ECapabilityPowerMgmt,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetState")))
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   370
						return KErrPermissionDenied;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   371
						)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   372
		  if((TBool)a1)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   373
			WsSwitchOnScreen();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   374
		  else
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   375
			WsSwitchOffScreen();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   376
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   377
	  }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   378
	case EDisplayHalState:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   379
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   380
		kumemput32(a1, &iDisplayOn, sizeof(TBool));
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   381
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   382
	  }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   383
	case EDisplayHalColors:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   384
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   385
		TInt mdc = 1<<24;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   386
		kumemput32(a1, &mdc, sizeof(mdc));
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   387
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   388
	  }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   389
	case EDisplayHalCurrentModeInfo:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   390
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   391
		TPckgBuf<TVideoInfoV01> vPckg;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   392
		r = GetCurrentDisplayModeInfo(vPckg(), (TBool)a2);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   393
		if(KErrNone == r)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   394
		  Kern::InfoCopy(*(TDes8*)a1,vPckg);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   395
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   396
	  }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   397
	case EDisplayHalSpecifiedModeInfo:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   398
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   399
		TPckgBuf<TVideoInfoV01> vPckg;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   400
		TInt mode;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   401
		kumemget32(&mode, a1, sizeof(mode));
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   402
		r = GetSpecifiedDisplayModeInfo(mode, vPckg());
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   403
		if(KErrNone == r)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   404
		  Kern::InfoCopy(*(TDes8*)a2,vPckg);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   405
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   406
	  }	
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   407
	case EDisplayHalSecure:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   408
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   409
		kumemput32(a1, &iSecureDisplay, sizeof(TBool));
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   410
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   411
	  }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   412
	case EDisplayHalSetSecure:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   413
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   414
		__SECURE_KERNEL(
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   415
						if(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetSecure")))
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   416
						return KErrPermissionDenied;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   417
						)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   418
		  SwitchDisplay((TBool)a1);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   419
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   420
	  }
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   421
	default:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   422
	  {
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   423
		r = KErrNotSupported;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   424
		break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   425
	  }			
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   426
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   427
  return r;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   428
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   429
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   430
TInt DLcdPowerHandler::Create()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   431
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   432
	__KTRACE_OPT(KEXTENSION ,Kern::Printf("DLcdPowerHandler::Create") );
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   433
	pLcd			= this;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   434
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   435
	iPortAddr = KHwBaseClcd;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   436
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   437
	iVideoInfo.iSizeInPixels.iWidth  = KConfigLcdWidth;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   438
	iVideoInfo.iSizeInPixels.iHeight = KConfigLcdHeight;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   439
	iVideoInfo.iDisplayMode = KConfigLcdDisplayMode;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   440
	iVideoInfo.iOffsetToFirstPixel = KCOnfigOffsetToFirstPixel;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   441
	iVideoInfo.iOffsetBetweenLines = KCOnfigOffsetBetweenLines;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   442
	iVideoInfo.iIsPalettized = KConfigIsPalettized;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   443
	iVideoInfo.iBitsPerPixel = KConfigBitsPerPixel;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   444
	iVideoInfo.iSizeInTwips.iWidth = KConfigLcdWidthInTwips;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   445
	iVideoInfo.iSizeInTwips.iHeight = KConfigLcdHeightInTwips;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   446
	iVideoInfo.iIsMono = KConfigIsMono;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   447
	// !@!	iVideoInfo.iVideoAddress = (TInt)pV;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   448
	iVideoInfo.iIsPixelOrderLandscape = KConfigPixelOrderLandscape;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   449
	iVideoInfo.iIsPixelOrderRGB = KConfigPixelOrderRGB;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   450
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   451
	iSecureVideoInfo = iVideoInfo;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   452
	// !@! iSecureVideoInfo.iVideoAddress = (TInt)pV2;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   453
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   454
	TInt r = AllocateFrameBuffer();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   455
	if(r == KErrNone)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   456
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   457
		r = Kern::AddHalEntry(EHalGroupDisplay,DoHalFunction,this);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   458
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   459
	    
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   460
	if(r != KErrNone)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   461
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   462
		__KTRACE_OPT(KEXTENSION ,Kern::Printf("DLcdPowerHandler::Create failed %d", r) );
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   463
		return r;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   464
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   465
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   466
	iPowerUpDfc.SetDfcQ(iDfcQ);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   467
	iPowerDownDfc.SetDfcQ(iDfcQ);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   468
	iMsgQ.SetDfcQ(iDfcQ);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   469
	iMsgQ.Receive();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   470
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   471
	Add();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   472
	DisplayOn();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   473
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   474
	return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   475
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   476
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   477
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   478
 * Register the call back function.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   479
 * Components interested in receiving notification of the Vsync interrupt should register a callback function.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   480
 */
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   481
EXPORT_C TInt DLcdPowerHandler::RegisterCallback(TLcdUserCallBack* aCbPtr)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   482
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   483
	__KTRACE_OPT(KEXTENSION ,Kern::Printf("DLcdPowerHandler::RegisterCallBack %08x\n",aCbPtr->iCbFn) );
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   484
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   485
	TInt irq=__SPIN_LOCK_IRQSAVE(callbackLock);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   486
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   487
	if(aCbPtr != NULL)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   488
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   489
		if ( pLcd->iAppCallBk[0] == NULL  )
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   490
			{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   491
			pLcd->iAppCallBk[0] = aCbPtr;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   492
			}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   493
		else
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   494
			{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   495
			if((pLcd->iAppCallBk[1] == NULL) && (pLcd->iAppCallBk[0]->iCbFn != aCbPtr->iCbFn))
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   496
				{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   497
				pLcd->iAppCallBk[1] = aCbPtr;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   498
				}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   499
			else
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   500
				{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   501
				__SPIN_UNLOCK_IRQRESTORE(callbackLock,irq);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   502
				return KErrInUse;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   503
				}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   504
			}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   505
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   506
		__SPIN_UNLOCK_IRQRESTORE(callbackLock,irq);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   507
		__KTRACE_OPT(KEXTENSION ,Kern::Printf("<DLcdPowerHandler::RegisterCallBack ok %08x\n",aCbPtr->iCbFn) );
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   508
		return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   509
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   510
	else
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   511
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   512
		__SPIN_UNLOCK_IRQRESTORE(callbackLock,irq);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   513
		__KTRACE_OPT(KEXTENSION, Kern::Printf("Error: The supplied listener's callback is NULL"));
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   514
		return KErrArgument;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   515
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   516
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   517
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   518
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   519
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   520
 *DeRegister the call back function
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   521
 */
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   522
EXPORT_C void DLcdPowerHandler::DeRegisterCallback(TLcdUserCallBack* aCbPtr)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   523
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   524
	__KTRACE_OPT(KEXTENSION ,Kern::Printf("DLcdPowerHandler::DeRegisterCallBack %08x\n ",aCbPtr->iCbFn)  );
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   525
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   526
	TInt irq=__SPIN_LOCK_IRQSAVE(callbackLock);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   527
	if(aCbPtr != NULL)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   528
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   529
	    if( pLcd->iAppCallBk[0] != NULL)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   530
			{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   531
			if ( (pLcd->iAppCallBk[0]->iDataPtr == aCbPtr->iDataPtr) && (pLcd->iAppCallBk[0]->iCbFn == aCbPtr->iCbFn) )
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   532
				{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   533
				pLcd->iAppCallBk[0] = NULL;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   534
				}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   535
			}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   536
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   537
		if( pLcd->iAppCallBk[1] != NULL)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   538
			{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   539
			if ( (pLcd->iAppCallBk[1]->iDataPtr == aCbPtr->iDataPtr) && (pLcd->iAppCallBk[1]->iCbFn == aCbPtr->iCbFn) )
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   540
				{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   541
				pLcd->iAppCallBk[1] = NULL;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   542
				}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   543
			}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   544
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   545
	__SPIN_UNLOCK_IRQRESTORE(callbackLock,irq);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   546
	__KTRACE_OPT(KEXTENSION ,Kern::Printf("<DLcdPowerHandler::DeRegisterCallBack %08x\n ",aCbPtr->iCbFn)  );
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   547
}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   548
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   549
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   550
	Constructor
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   551
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   552
DDisplayPddSyborg::DDisplayPddSyborg():
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   553
	iPendingBuffer(NULL),
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   554
	iActiveBuffer(NULL),
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   555
	iChunk(NULL),
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   556
	iLcdCallback(NULL),
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   557
	iVSyncDfc(&VSyncDfcFn, this, KVSyncDfcPriority)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   558
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   559
	__GCE_DEBUG_PRINT("DDisplayPddSyborg::DDisplayPddSyborg\n");
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   560
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   561
	iPostFlag = EFalse;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   562
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   563
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   564
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   565
	Destructor
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   566
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   567
DDisplayPddSyborg::~DDisplayPddSyborg()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   568
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   569
	__GCE_DEBUG_PRINT("DDisplayPddSyborg::~DDisplayPddSyborg()  \n");
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   570
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   571
	if(iLcdCallback)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   572
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   573
		DLcdPowerHandler::pLcd->DeRegisterCallback(iLcdCallback) ;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   574
		delete iLcdCallback;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   575
		iLcdCallback = NULL;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   576
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   577
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   578
	//The DFC Queue is owned by DLcdPowerHandler so we shouldn't call Destroy() at this point.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   579
	if (iDfcQ)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   580
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   581
		iDfcQ=NULL;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   582
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   583
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   584
	DChunk* chunk = (DChunk*) __e32_atomic_swp_ord_ptr(&iChunk, 0);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   585
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   586
	if(chunk)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   587
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   588
		Kern::ChunkClose(chunk);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   589
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   590
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   591
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   592
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   593
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   594
    Set the Legacy Mode by setting the appropriate Frame control value.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   595
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   596
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   597
TInt DDisplayPddSyborg::SetLegacyMode()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   598
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   599
	__GCE_DEBUG_PRINT("DDisplayPddSyborg::SetLegacyMode()\n");
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   600
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   601
    return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   602
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   603
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   604
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   605
    Set the GCE mode by posting a composition buffer.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   606
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   607
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   608
TInt DDisplayPddSyborg::SetGceMode()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   609
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   610
	__GCE_DEBUG_PRINT("DDisplayPddSyborg::SetGceMode()\n");
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   611
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   612
    PostCompositionBuffer(&iLdd->iCompositionBuffer[0]);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   613
    return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   614
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   615
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   616
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   617
	@param	aDegOfRot  The requested rotation
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   618
	@return KErrNone
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   619
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   620
TInt DDisplayPddSyborg::SetRotation(TInt aDegOfRot)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   621
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   622
	return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   623
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   624
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   625
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   626
    Remove any previous post operations, set the appropriate layer as the next layer to be displayed( This value is updated in synchronization
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   627
    with V Sync so it will take affect in the next V Sync after that) and also set the buffer provided as the buffer to
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   628
    be posted next. Layer 3 is associated with user buffers.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   629
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   630
	@param	aNode  Pointer to the User buffer to post.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   631
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   632
TInt DDisplayPddSyborg::PostUserBuffer(TBufferNode* aNode)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   633
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   634
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   635
	__GCE_DEBUG_PRINT2("DDisplayPddSyborg::PostUserBuffer :  aNode->iAddress = %08x\n", aNode->iAddress);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   636
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   637
	if(iPendingBuffer)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   638
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   639
		iPendingBuffer->iState = EBufferFree;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   640
		if (!(iPendingBuffer->iType == EBufferTypeUser) )
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   641
			{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   642
			iPendingBuffer->iFree  = ETrue;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   643
			}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   644
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   645
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   646
	aNode->iState   = EBufferPending;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   647
	iPendingBuffer	= aNode;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   648
	iPostFlag		= ETrue;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   649
	
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   650
  	// Activate the posted buffer
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   651
	TUint32 physicalAddress = Epoc::LinearToPhysical( aNode->iAddress );
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   652
  	WriteReg(DLcdPowerHandler::pLcd->iPortAddr, DLcdPowerHandler::FB_BASE, physicalAddress );
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   653
	/* Queue a DFC to complete the request*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   654
	iVSyncDfc.Enque();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   655
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   656
	return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   657
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   658
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   659
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   660
    Remove any previous post operations, set the appropriate layer as the next layer to be displayed( This value is updated in synchronization
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   661
    with V Sync so it will take affect in the next V Sync after that) and also set the buffer provided as the buffer to
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   662
    be posted next. Layer 1 and 2 are associated with composition buffers 0 and 1 respectively.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   663
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   664
	@param	aNode  Pointer to the Composition buffer to post.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   665
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   666
TInt DDisplayPddSyborg::PostCompositionBuffer(TBufferNode* aNode)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   667
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   668
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   669
	__GCE_DEBUG_PRINT2("DDisplayPddSyborg::PostCompositionBuffer :  aNode->iAddress = %08x\n", aNode->iAddress);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   670
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   671
	if(iPendingBuffer)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   672
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   673
		iPendingBuffer->iState = EBufferFree;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   674
		if (iPendingBuffer->iType == EBufferTypeUser)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   675
			{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   676
			RequestComplete(RDisplayChannel::EReqPostUserBuffer, KErrCancel);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   677
			}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   678
		else
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   679
			{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   680
			iPendingBuffer->iFree  = ETrue;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   681
			}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   682
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   683
	aNode->iState	= EBufferPending;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   684
	aNode->iFree	= EFalse;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   685
	iPendingBuffer	= aNode;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   686
	iPostFlag		= ETrue;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   687
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   688
  	// Activate the posted buffer
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   689
	TUint32 physicalAddress = Epoc::LinearToPhysical( aNode->iAddress );
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   690
  	WriteReg(DLcdPowerHandler::pLcd->iPortAddr, DLcdPowerHandler::FB_BASE, physicalAddress );
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   691
	
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   692
	/* Queue a DFC to complete the request*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   693
	iVSyncDfc.Enque();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   694
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   695
	return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   696
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   697
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   698
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   699
    Remove any previous post operations, set the appropriate layer as the next layer to be displayed( This value is updated in synchronization
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   700
    with V Sync so it will take affect in the next V Sync after that) and also set the Legacy Buffer as the buffer to
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   701
    be posted next.Layer 0 is associated with legacy buffer.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   702
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   703
	@param	aNode  Pointer to the Composition buffer to post.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   704
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   705
TInt DDisplayPddSyborg::PostLegacyBuffer()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   706
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   707
	__GCE_DEBUG_PRINT("DDisplayPddSyborg::PostLegacyBuffer() \n");
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   708
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   709
	if(iPendingBuffer)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   710
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   711
		iPendingBuffer->iState = EBufferFree;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   712
		if (iPendingBuffer->iType == EBufferTypeUser)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   713
			{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   714
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   715
			RequestComplete(RDisplayChannel::EReqPostUserBuffer, KErrCancel);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   716
			}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   717
		else
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   718
			{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   719
			iPendingBuffer->iFree  = ETrue;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   720
			}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   721
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   722
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   723
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   724
	iLdd->iLegacyBuffer[0].iState		= EBufferPending;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   725
	iLdd->iLegacyBuffer[0].iFree		= EFalse;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   726
	iPendingBuffer						= &iLdd->iLegacyBuffer[0];
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   727
	iPostFlag		= ETrue;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   728
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   729
  	// Activate the posted buffer
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   730
  	WriteReg(DLcdPowerHandler::pLcd->iPortAddr, DLcdPowerHandler::FB_BASE, TSyborg::VideoRamPhys() );
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   731
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   732
	/* Queue a DFC to complete the request*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   733
	iVSyncDfc.Enque();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   734
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   735
	return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   736
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   737
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   738
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   739
    Handles device specific operations when a close message has been sent to the Logical Channel.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   740
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   741
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   742
TInt DDisplayPddSyborg::CloseMsg()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   743
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   744
	__GCE_DEBUG_PRINT("DDisplayPddSyborg::CloseMsg()\n");
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   745
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   746
	iPendingBuffer  = NULL;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   747
	iActiveBuffer	= NULL;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   748
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   749
	iVSyncDfc.Cancel();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   750
    return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   751
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   752
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   753
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   754
    Called by the LDD's DoCreate function to handle the device specific part of opening the channel.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   755
    (DoCreate is called by RDisplayChannel::Open)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   756
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   757
	@param aUnit	The screen unit
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   758
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   759
    @return KErrNone if successful; or one of the other system wide error codes.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   760
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   761
TInt DDisplayPddSyborg::CreateChannelSetup(TInt aUnit)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   762
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   763
	__GCE_DEBUG_PRINT("DDisplayPddSyborg::CreateChannelSetup\n");
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   764
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   765
	iScreenInfo = DLcdPowerHandler::pLcd->iVideoInfo;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   766
	iLdd->iUnit = aUnit;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   767
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   768
	iLdd->iDisplayInfo.iAvailableRotations			= RDisplayChannel::ERotationNormal;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   769
	iLdd->iDisplayInfo.iNormal.iOffsetBetweenLines	= iScreenInfo.iOffsetBetweenLines;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   770
	iLdd->iDisplayInfo.iNormal.iHeight				= iScreenInfo.iSizeInPixels.iHeight;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   771
	iLdd->iDisplayInfo.iNormal.iWidth				= iScreenInfo.iSizeInPixels.iWidth;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   772
	iLdd->iDisplayInfo.iNumCompositionBuffers		= KDisplayCBMax;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   773
	iLdd->iDisplayInfo.iBitsPerPixel				= iScreenInfo.iBitsPerPixel;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   774
    iLdd->iDisplayInfo.iRefreshRateHz = 60;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   775
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   776
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   777
	switch (iScreenInfo.iBitsPerPixel)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   778
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   779
		case 16:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   780
			iLdd->iDisplayInfo.iPixelFormat = EUidPixelFormatRGB_565;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   781
			break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   782
		case 24:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   783
			iLdd->iDisplayInfo.iPixelFormat = EUidPixelFormatRGB_888;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   784
			break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   785
		case 32:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   786
			iLdd->iDisplayInfo.iPixelFormat = EUidPixelFormatARGB_8888;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   787
			break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   788
		default:
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   789
			iLdd->iDisplayInfo.iPixelFormat = EUidPixelFormatUnknown;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   790
			break;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   791
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   792
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   793
	iLdd->iCurrentRotation = RDisplayChannel::ERotationNormal;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   794
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   795
	// Open shared chunk to the composition framebuffer
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   796
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   797
	DChunk* chunk = 0;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   798
	TLinAddr chunkKernelAddr  = 0;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   799
	TUint32 chunkMapAttr = 0;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   800
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   801
	// round to twice the page size
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   802
	TUint round  =  2*Kern::RoundToPageSize(DLcdPowerHandler::pLcd->iSize);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   803
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   804
	__GCE_DEBUG_PRINT2("DDisplayPddSyborg::CreateChannelSetup DLcdPowerHandler::pLcd->iSize  = %d\n", DLcdPowerHandler::pLcd->iSize );
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   805
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   806
	TChunkCreateInfo info;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   807
	info.iType					 = TChunkCreateInfo::ESharedKernelMultiple;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   808
	info.iMaxSize				 = round;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   809
	info.iMapAttr				 = EMapAttrFullyBlocking;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   810
	info.iOwnsMemory			 = EFalse;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   811
	info.iDestroyedDfc			 = 0;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   812
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   813
	TInt r = Kern::ChunkCreate(info, chunk, chunkKernelAddr, chunkMapAttr);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   814
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   815
	__GCE_DEBUG_PRINT2("CreateChannelSetup:ChunkCreate called for composition chunk. Set iChunkKernelAddr  = %08x\n", chunkKernelAddr );
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   816
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   817
	if( r == KErrNone)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   818
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   819
		// map our chunk
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   820
		r = Kern::ChunkCommitPhysical(chunk, 0,round , DLcdPowerHandler::pLcd->iCompositionPhysical);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   821
		__GCE_DEBUG_PRINT2("Mapping chunk %d", r);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   822
		if(r != KErrNone)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   823
			{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   824
			Kern::ChunkClose(chunk);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   825
			}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   826
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   827
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   828
	if ( r!= KErrNone)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   829
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   830
		return r;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   831
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   832
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   833
	iChunk	= chunk;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   834
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   835
	// init CB 0
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   836
	iLdd->iCompositionBuffer[0].iType			= EBufferTypeComposition;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   837
	iLdd->iCompositionBuffer[0].iBufferId		= 0;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   838
	iLdd->iCompositionBuffer[0].iFree			= ETrue;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   839
	iLdd->iCompositionBuffer[0].iState			= EBufferFree;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   840
	iLdd->iCompositionBuffer[0].iAddress		= chunkKernelAddr;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   841
	iLdd->iCompositionBuffer[0].iPhysicalAddress = Epoc::LinearToPhysical(chunkKernelAddr);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   842
	iLdd->iCompositionBuffer[0].iChunk			= chunk;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   843
	iLdd->iCompositionBuffer[0].iHandle			= 0;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   844
	iLdd->iCompositionBuffer[0].iOffset			= 0;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   845
	iLdd->iCompositionBuffer[0].iSize			= DLcdPowerHandler::pLcd->iSize;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   846
	iLdd->iCompositionBuffer[0].iPendingRequest = 0;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   847
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   848
	// init CB 1
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   849
	iLdd->iCompositionBuffer[1].iType			= EBufferTypeComposition;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   850
	iLdd->iCompositionBuffer[1].iBufferId		= 1;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   851
	iLdd->iCompositionBuffer[1].iFree			= ETrue;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   852
	iLdd->iCompositionBuffer[1].iState			= EBufferFree;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   853
	iLdd->iCompositionBuffer[1].iAddress		= chunkKernelAddr + DLcdPowerHandler::pLcd->iSize;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   854
	iLdd->iCompositionBuffer[1].iPhysicalAddress = Epoc::LinearToPhysical(chunkKernelAddr + DLcdPowerHandler::pLcd->iSize);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   855
	iLdd->iCompositionBuffer[1].iChunk			= chunk;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   856
	iLdd->iCompositionBuffer[1].iHandle			= 0;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   857
	iLdd->iCompositionBuffer[1].iOffset			= DLcdPowerHandler::pLcd->iSize;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   858
	iLdd->iCompositionBuffer[1].iSize			= DLcdPowerHandler::pLcd->iSize;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   859
	iLdd->iCompositionBuffer[1].iPendingRequest = 0;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   860
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   861
	iLdd->iCompositionBuffIdx					= 0;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   862
	//Use the same DFC queue created by the DLcdPowerHandler so all hardware accesses are executed under the same DFC thread.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   863
	iDfcQ= DLcdPowerHandler::pLcd->iDfcQ;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   864
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   865
	// Set the Post DFC.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   866
	iVSyncDfc.SetDfcQ(iDfcQ);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   867
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   868
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   869
	return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   870
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   871
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   872
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   873
Detect whether a post operation is pending
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   874
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   875
TBool DDisplayPddSyborg::PostPending()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   876
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   877
	return (iPendingBuffer != NULL);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   878
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   879
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   880
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   881
	Return the DFC queue to be used for this device.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   882
 */
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   883
TDfcQue * DDisplayPddSyborg::DfcQ(TInt aUnit)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   884
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   885
	return iDfcQ;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   886
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   887
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   888
void DDisplayPddSyborg::VSyncDfcFn(TAny* aChannel)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   889
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   890
	DDisplayPddSyborg * channel =(DDisplayPddSyborg*)aChannel;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   891
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   892
	if (channel->iPostFlag)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   893
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   894
		 channel->iPostFlag = EFalse;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   895
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   896
		if (channel->iActiveBuffer)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   897
			{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   898
			//When a User buffer is registered its iFree member becomes EFalse and Deregister sets it
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   899
			//back to ETrue. Composition and Legacy buffers are not free when they are in the pending or
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   900
			//active state.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   901
			if (channel->iActiveBuffer->iType == EBufferTypeUser)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   902
				{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   903
				channel->RequestComplete(RDisplayChannel::EReqPostUserBuffer, KErrNone);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   904
				}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   905
			else
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   906
				{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   907
				channel->iActiveBuffer->iFree	= ETrue;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   908
				}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   909
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   910
			channel->iActiveBuffer->iState		= EBufferFree;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   911
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   912
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   913
			//If no buffer was available during a call to GetCompositionBuffer the active buffer has
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   914
			//been returned as the next available one, so we must set the buffer to the proper state before we
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   915
			//send the notification.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   916
			if(channel->iLdd->iPendingReq[RDisplayChannel::EReqGetCompositionBuffer].iStatus)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   917
				{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   918
				channel->iActiveBuffer->iState	= EBufferCompose;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   919
				channel->RequestComplete(RDisplayChannel::EReqGetCompositionBuffer, KErrNone);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   920
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   921
				}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   922
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   923
			channel->iActiveBuffer				= NULL;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   924
			}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   925
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   926
		if (channel->iPendingBuffer)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   927
			{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   928
			__GCE_DEBUG_PRINT2("DDisplayPddSyborg::VSyncDfcFn moving pending buffer at address %08x to the active state\n", channel->iPendingBuffer->iAddress);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   929
			channel->iActiveBuffer			= channel->iPendingBuffer;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   930
			channel->iActiveBuffer->iState	= EBufferActive;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   931
			channel->iPendingBuffer			= NULL;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   932
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   933
			channel->RequestComplete(RDisplayChannel::EReqWaitForPost,  KErrNone);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   934
			}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   935
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   936
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   937
//*****************************************************************
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   938
//DDisplayPddFactory
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   939
//*****************************************************************/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   940
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   941
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   942
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   943
	Constructor
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   944
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   945
DDisplayPddFactory::DDisplayPddFactory()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   946
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   947
	__GCE_DEBUG_PRINT("DDisplayPddFactory::DDisplayPddFactory()\n");
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   948
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   949
	iVersion		= TVersion(KDisplayChMajorVersionNumber,
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   950
                      KDisplayChMinorVersionNumber,
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   951
                      KDisplayChBuildVersionNumber);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   952
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   953
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   954
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   955
	PDD factory function. Creates a PDD object.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   956
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   957
	@param  aChannel  A pointer to an PDD channel object which will be initialised on return.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   958
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   959
	@return KErrNone  if object successfully allocated, KErrNoMemory if not.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   960
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   961
TInt DDisplayPddFactory::Create(DBase*& aChannel, TInt aUnit, const TDesC8* aInfo, const TVersion& aVer)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   962
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   963
	DDisplayPddSyborg *device= new DDisplayPddSyborg() ;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   964
	aChannel=device;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   965
	if (!device)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   966
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   967
		return KErrNoMemory;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   968
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   969
	return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   970
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   971
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   972
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   973
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   974
    Set the Pdd name and return error code
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   975
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   976
TInt DDisplayPddFactory::Install()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   977
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   978
	__GCE_DEBUG_PRINT("DDisplayPddFactory::Install() \n");
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   979
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   980
	TBuf<32> name(RDisplayChannel::Name());
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   981
	_LIT(KPddExtension,".pdd");
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   982
	name.Append(KPddExtension);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   983
	return SetName(&name);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   984
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   985
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   986
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   987
void DDisplayPddFactory::GetCaps(TDes8& /*aDes*/) const
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   988
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   989
	//Not supported
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   990
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   991
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   992
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   993
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   994
    Validate version and number of units.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   995
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   996
TInt DDisplayPddFactory::Validate(TInt aUnit, const TDesC8* /*anInfo*/, const TVersion& aVer)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   997
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   998
	if (!Kern::QueryVersionSupported(iVersion,aVer))
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
   999
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1000
		return KErrNotSupported;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1001
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1002
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1003
	if (aUnit != 0)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1004
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1005
		return KErrNotSupported;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1006
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1007
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1008
	return KErrNone;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1009
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1010
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1011
DECLARE_EXTENSION_PDD()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1012
/**
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1013
	"Standard PDD" entrypoint.Creates PDD factory when Kern::InstallPhysicalDevice is called
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1014
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1015
	@return pointer to the PDD factory object.
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1016
*/
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1017
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1018
	__GCE_DEBUG_PRINT("DECLARE_EXTENSION_PDD()\n");
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1019
	return new DDisplayPddFactory ;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1020
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1021
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1022
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1023
DECLARE_STANDARD_EXTENSION()
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1024
{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1025
  TInt r = KErrNoMemory;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1026
  DLcdPowerHandler* pH=new DLcdPowerHandler;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1027
  if(pH)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1028
	{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1029
	r = pH->Create();
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1030
	if ( r == KErrNone)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1031
		{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1032
		pH->iDfcQ = Kern::DfcQue0();	// use low priority DFC queue for this driver 
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1033
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1034
		DDisplayPddFactory * device = new DDisplayPddFactory;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1035
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1036
		if (device==NULL)
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1037
			{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1038
			r=KErrNoMemory;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1039
			}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1040
		else
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1041
			{
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1042
			r=Kern::InstallPhysicalDevice(device);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1043
			}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1044
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1045
		#ifdef CPU_AFFINITY_ANY
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1046
        NKern::ThreadSetCpuAffinity((NThread*) pH->iDfcQ->iThread, KCpuAffinityAny);
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1047
		#endif
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1048
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1049
		__KTRACE_OPT(KEXTENSION,Kern::Printf("Installing the display device from the kernel extension returned with error code %d",r));
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1050
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1051
		}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1052
	}
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1053
  
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1054
  return r;
33dfab4ab0fc PDD Display Driver for Syborg
emilioc
parents:
diff changeset
  1055
}