0
|
1 |
// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
|
|
2 |
// All rights reserved.
|
|
3 |
// This component and the accompanying materials are made available
|
|
4 |
// under the terms of the License "Eclipse Public License v1.0"
|
|
5 |
// which accompanies this distribution, and is available
|
|
6 |
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
|
|
7 |
//
|
|
8 |
// Initial Contributors:
|
|
9 |
// Nokia Corporation - initial contribution.
|
|
10 |
//
|
|
11 |
// Contributors:
|
|
12 |
//
|
|
13 |
// Description:
|
|
14 |
// omap3530/beagle_drivers/lcd/lcd.cpp
|
|
15 |
// Implementation of an LCD driver.
|
|
16 |
// This file is part of the Beagle Base port
|
|
17 |
// N.B. This sample code assumes that the display supports setting the backlight on or off,
|
|
18 |
// as well as adjusting the contrast and the brightness.
|
|
19 |
//
|
|
20 |
|
|
21 |
|
|
22 |
|
|
23 |
|
|
24 |
|
|
25 |
#include <videodriver.h>
|
|
26 |
#include <platform.h>
|
|
27 |
#include <nkern.h>
|
|
28 |
#include <kernel.h>
|
|
29 |
#include <kern_priv.h>
|
|
30 |
#include <kpower.h>
|
|
31 |
#include <assp/omap3530_assp/omap3530_assp_priv.h>
|
|
32 |
#include <assp/omap3530_assp/omap3530_hardware_base.h>
|
|
33 |
#include <assp/omap3530_assp/omap3530_prcm.h>
|
|
34 |
|
|
35 |
#define DSS_SYSCONFIG 0x48050010
|
|
36 |
#define DISPC_SYSSTATUS 0x48050414
|
|
37 |
|
|
38 |
#define DISPC_SYSCONFIG 0x48050410
|
|
39 |
#define DISPC_CONFIG 0x48050444
|
|
40 |
#define DISPC_DEFAULT_COLOR0 0x4805044c
|
|
41 |
#define DISPC_TRANS_COLOR0 0x48050454
|
|
42 |
|
|
43 |
#define DISPC_TIMING_H 0x48050464
|
|
44 |
#define DISPC_TIMING_V 0x48050468
|
|
45 |
#define DISPC_POL_FREQ 0x4805046c
|
|
46 |
#define DISPC_DIVISOR 0x48050470
|
|
47 |
#define DISPC_SIZE_LCD 0x4805047c
|
|
48 |
|
|
49 |
#define DISPC_GFX_BA1 0x48050480
|
|
50 |
#define DISPC_GFX_BA2 0x48050484
|
|
51 |
#define DISPC_GFX_POSITION 0x48050488
|
|
52 |
#define DISPC_GFX_SIZE 0x4805048c
|
|
53 |
#define DISPC_GFX_ATTRIBUTES 0x480504a0
|
|
54 |
|
|
55 |
#define DISPC_GFX_FIFO_THRESHOLD 0x480504a4
|
|
56 |
#define DISPC_GFX_FIFO_SIZE_STATUS 0x480504a8
|
|
57 |
#define DISPC_GFX_ROW_INC 0x480504ac
|
|
58 |
#define DISPC_GFX_PIXEL_INC 0x480504b0
|
|
59 |
#define DISPC_GFX_WINDOW_SKIP 0x480504b4
|
|
60 |
#define DISPC_GFX_TABLE_BA 0x480504b8
|
|
61 |
|
|
62 |
#define DISPC_CONTROL 0x48050440
|
|
63 |
|
|
64 |
#define GET_REGISTER(Reg) *( (TUint *) Omap3530HwBase::TVirtual<Reg>::Value )
|
|
65 |
#define SET_REGISTER(Reg,Val) *( (TUint *) Omap3530HwBase::TVirtual<Reg>::Value ) = Val
|
|
66 |
|
|
67 |
#define _MODE_1280x1024_
|
|
68 |
//#define _MODE_1024x768_
|
|
69 |
#ifdef _MODE_800x600_
|
|
70 |
// ModeLine "800x600@60" 40.0 800 840 968 1056 600 601 605 628 +hsync +vsync
|
|
71 |
// Decoded by: http://www.tkk.fi/Misc/Electronics/faq/vga2rgb/calc.html
|
|
72 |
# define PIXEL_CLK 40000
|
|
73 |
# define H_DISP 800
|
|
74 |
# define H_FPORCH 40
|
|
75 |
# define H_SYNC 128
|
|
76 |
# define H_BPORCH 88
|
|
77 |
# define H_SYNC_POL 1
|
|
78 |
# define V_DISP 600
|
|
79 |
# define V_FPORCH 1
|
|
80 |
# define V_SYNC 4
|
|
81 |
# define V_BPORCH 23
|
|
82 |
# define V_SYNC_POL 1
|
|
83 |
# define INTERLACE_ENABLE 0
|
|
84 |
#endif
|
|
85 |
#ifdef _MODE_1024x768_
|
|
86 |
// ModeLine "1024x768@60" 65.0 1024 1048 1184 1344 768 771 777 806 -hsync -vsync
|
|
87 |
// Decoded by: http://www.tkk.fi/Misc/Electronics/faq/vga2rgb/calc.html
|
|
88 |
# define PIXEL_CLK 65000
|
|
89 |
# define H_DISP 1024
|
|
90 |
# define H_FPORCH 24
|
|
91 |
# define H_SYNC 136
|
|
92 |
# define H_BPORCH 160
|
|
93 |
# define H_SYNC_POL 0
|
|
94 |
# define V_DISP 768
|
|
95 |
# define V_FPORCH 3
|
|
96 |
# define V_SYNC 6
|
|
97 |
# define V_BPORCH 29
|
|
98 |
# define V_SYNC_POL 0
|
|
99 |
# define INTERLACE_ENABLE 0
|
|
100 |
#endif
|
|
101 |
#ifdef _MODE_1280x1024_
|
|
102 |
// ModeLine "1280x1024@60" 108.0 1280 1328 1440 1688 1024 1025 1028 1066 +hsync +vsync
|
|
103 |
// Decoded by: http://www.tkk.fi/Misc/Electronics/faq/vga2rgb/calc.html
|
|
104 |
# define PIXEL_CLK 108000
|
|
105 |
# define H_DISP 1280
|
|
106 |
# define H_FPORCH 48
|
|
107 |
# define H_SYNC 112
|
|
108 |
# define H_BPORCH 248
|
|
109 |
# define H_SYNC_POL 1
|
|
110 |
# define V_DISP 1024
|
|
111 |
# define V_FPORCH 1
|
|
112 |
# define V_SYNC 3
|
|
113 |
# define V_BPORCH 38
|
|
114 |
# define V_SYNC_POL 1
|
|
115 |
# define INTERLACE_ENABLE 0
|
|
116 |
#endif
|
|
117 |
|
|
118 |
|
|
119 |
|
|
120 |
// TO DO: (mandatory)
|
|
121 |
// If the display supports Contrast and/or Brightness control then supply the following defines:
|
|
122 |
// This is only example code... you may need to modify it for your hardware
|
|
123 |
const TInt KConfigInitialDisplayContrast = 128;
|
|
124 |
const TInt KConfigLcdMinDisplayContrast = 1;
|
|
125 |
const TInt KConfigLcdMaxDisplayContrast = 255;
|
|
126 |
const TInt KConfigInitialDisplayBrightness = 128;
|
|
127 |
const TInt KConfigLcdMinDisplayBrightness = 1;
|
|
128 |
const TInt KConfigLcdMaxDisplayBrightness = 255;
|
|
129 |
|
|
130 |
// TO DO: (mandatory)
|
|
131 |
// define a macro to calculate the screen buffer size
|
|
132 |
// This is only example code... you may need to modify it for your hardware
|
|
133 |
// aBpp is the number of bits-per-pixel, aPpl is the number of pixels per line and
|
|
134 |
// aLpp number of lines per panel
|
|
135 |
#define FRAME_BUFFER_SIZE(aBpp,aPpl,aLpp) (aBpp*aPpl*aLpp)/8
|
|
136 |
|
|
137 |
|
|
138 |
// TO DO: (mandatory)
|
|
139 |
// define the physical screen dimensions
|
|
140 |
// This is only example code... you need to modify it for your hardware
|
|
141 |
const TUint KConfigLcdWidth = 360;//640; // 640 pixels per line
|
|
142 |
const TUint KConfigLcdHeight = 640;//480; // 480 lines per panel
|
|
143 |
|
|
144 |
// TO DO: (mandatory)
|
|
145 |
// define the characteristics of the LCD display
|
|
146 |
// This is only example code... you need to modify it for your hardware
|
|
147 |
const TBool KConfigLcdIsMono = EFalse;
|
|
148 |
const TBool KConfigLcdPixelOrderLandscape = ETrue;
|
|
149 |
const TBool KConfigLcdPixelOrderRGB = ETrue;
|
|
150 |
const TInt KConfigLcdMaxDisplayColors = 65536; //24bit: 16777216;
|
|
151 |
|
|
152 |
|
|
153 |
// TO DO: (mandatory)
|
|
154 |
// define the display dimensions in TWIPs
|
|
155 |
// A TWIP is a 20th of a point. A point is a 72nd of an inch
|
|
156 |
// Therefore a TWIP is a 1440th of an inch
|
|
157 |
// This is only example code... you need to modify it for your hardware
|
|
158 |
const TInt KConfigLcdWidthInTwips = 9638;//10800; // = 6.69 inches //15*1440;
|
|
159 |
const TInt KConfigLcdHeightInTwips = 7370;//11232;//5616; // = 5.11 inches //12*1440;
|
|
160 |
|
|
161 |
// TO DO: (mandatory)
|
|
162 |
// define the available display modes
|
|
163 |
// This is only example code... you need to modify it for your hardware
|
|
164 |
const TInt KConfigLcdNumberOfDisplayModes = 1;
|
|
165 |
const TInt KConfigLcdInitialDisplayMode = 0;
|
|
166 |
struct SLcdConfig
|
|
167 |
{
|
|
168 |
TInt iMode;
|
|
169 |
TInt iOffsetToFirstVideoBuffer;
|
|
170 |
TInt iLenghtOfVideoBufferInBytes;
|
|
171 |
TInt iOffsetBetweenLines;
|
|
172 |
TBool iIsPalettized;
|
|
173 |
TInt iBitsPerPixel;
|
|
174 |
};
|
|
175 |
static const SLcdConfig Lcd_Mode_Config[KConfigLcdNumberOfDisplayModes]=
|
|
176 |
{
|
|
177 |
{
|
|
178 |
0, // iMode
|
|
179 |
0, // iOffsetToFirstVideoBuffer
|
|
180 |
FRAME_BUFFER_SIZE(16, KConfigLcdWidth, KConfigLcdHeight), // iLenghtOfVideoBufferInBytes
|
|
181 |
KConfigLcdWidth*2, // iOffsetBetweenLines
|
|
182 |
EFalse, // iIsPalettized
|
|
183 |
16 // iBitsPerPixel
|
|
184 |
}
|
|
185 |
};
|
|
186 |
|
|
187 |
|
|
188 |
|
|
189 |
_LIT(KLitLcd,"LCD");
|
|
190 |
|
|
191 |
//
|
|
192 |
// TO DO: (optional)
|
|
193 |
//
|
|
194 |
// Add any private functions and data you require
|
|
195 |
//
|
|
196 |
NONSHARABLE_CLASS(DLcdPowerHandler) : public DPowerHandler
|
|
197 |
{
|
|
198 |
public:
|
|
199 |
DLcdPowerHandler();
|
|
200 |
|
|
201 |
// from DPowerHandler
|
|
202 |
void PowerDown(TPowerState);
|
|
203 |
void PowerUp();
|
|
204 |
|
|
205 |
void PowerUpDfc();
|
|
206 |
void PowerDownDfc();
|
|
207 |
|
|
208 |
TInt Create();
|
|
209 |
void DisplayOn();
|
|
210 |
void DisplayOff();
|
|
211 |
TInt HalFunction(TInt aFunction, TAny* a1, TAny* a2);
|
|
212 |
|
|
213 |
void PowerUpLcd(TBool aSecure);
|
|
214 |
void PowerDownLcd();
|
|
215 |
|
|
216 |
void ScreenInfo(TScreenInfoV01& aInfo);
|
|
217 |
void WsSwitchOnScreen();
|
|
218 |
void WsSwitchOffScreen();
|
|
219 |
void HandleMsg();
|
|
220 |
void SwitchDisplay(TBool aSecure);
|
|
221 |
|
|
222 |
void SetBacklightState(TBool aState);
|
|
223 |
void BacklightOn();
|
|
224 |
void BacklightOff();
|
|
225 |
TInt SetContrast(TInt aContrast);
|
|
226 |
TInt SetBrightness(TInt aBrightness);
|
|
227 |
|
|
228 |
private:
|
|
229 |
TInt SetPaletteEntry(TInt aEntry, TInt aColor);
|
|
230 |
TInt GetPaletteEntry(TInt aEntry, TInt* aColor);
|
|
231 |
TInt NumberOfPaletteEntries();
|
|
232 |
TInt GetCurrentDisplayModeInfo(TVideoInfoV01& aInfo, TBool aSecure);
|
|
233 |
TInt GetSpecifiedDisplayModeInfo(TInt aMode, TVideoInfoV01& aInfo);
|
|
234 |
TInt SetDisplayMode(TInt aMode);
|
|
235 |
void SplashScreen();
|
|
236 |
TInt GetDisplayColors(TInt* aColors);
|
|
237 |
|
|
238 |
private:
|
|
239 |
TBool iIsPalettized;
|
|
240 |
TBool iDisplayOn; // to prevent a race condition with WServer trying to power up/down at the same time
|
|
241 |
DPlatChunkHw* iChunk;
|
|
242 |
DPlatChunkHw* iSecureChunk;
|
|
243 |
TBool iWsSwitchOnScreen;
|
|
244 |
TBool iSecureDisplay;
|
|
245 |
TDfcQue* iDfcQ;
|
|
246 |
TMessageQue iMsgQ;
|
|
247 |
TDfc iPowerUpDfc;
|
|
248 |
TDfc iPowerDownDfc;
|
|
249 |
TVideoInfoV01 iVideoInfo;
|
|
250 |
TVideoInfoV01 iSecureVideoInfo;
|
|
251 |
NFastMutex iLock; // protects against being preempted whilst manipulating iVideoInfo/iSecureVideoInfo
|
|
252 |
TPhysAddr ivRamPhys;
|
|
253 |
TPhysAddr iSecurevRamPhys;
|
|
254 |
|
|
255 |
TBool iBacklightOn;
|
|
256 |
TInt iContrast;
|
|
257 |
TInt iBrightness;
|
|
258 |
};
|
|
259 |
|
|
260 |
|
|
261 |
/**
|
|
262 |
HAL handler function
|
|
263 |
|
|
264 |
@param aPtr a pointer to an instance of DLcdPowerHandler
|
|
265 |
@param aFunction the function number
|
|
266 |
@param a1 an arbitrary parameter
|
|
267 |
@param a2 an arbitrary parameter
|
|
268 |
*/
|
|
269 |
LOCAL_C TInt halFunction(TAny* aPtr, TInt aFunction, TAny* a1, TAny* a2)
|
|
270 |
{
|
|
271 |
DLcdPowerHandler* pH=(DLcdPowerHandler*)aPtr;
|
|
272 |
return pH->HalFunction(aFunction,a1,a2);
|
|
273 |
}
|
|
274 |
|
|
275 |
/**
|
|
276 |
DFC for receiving messages from the power handler
|
|
277 |
@param aPtr a pointer to an instance of DLcdPowerHandler
|
|
278 |
*/
|
|
279 |
void rxMsg(TAny* aPtr)
|
|
280 |
{
|
|
281 |
DLcdPowerHandler& h=*(DLcdPowerHandler*)aPtr;
|
|
282 |
h.HandleMsg();
|
|
283 |
}
|
|
284 |
|
|
285 |
/**
|
|
286 |
DFC for powering up the device
|
|
287 |
|
|
288 |
@param aPtr aPtr a pointer to an instance of DLcdPowerHandler
|
|
289 |
*/
|
|
290 |
void power_up_dfc(TAny* aPtr)
|
|
291 |
{
|
|
292 |
((DLcdPowerHandler*)aPtr)->PowerUpDfc();
|
|
293 |
}
|
|
294 |
|
|
295 |
/**
|
|
296 |
DFC for powering down the device
|
|
297 |
|
|
298 |
@param aPtr aPtr a pointer to an instance of DLcdPowerHandler
|
|
299 |
*/
|
|
300 |
void power_down_dfc(TAny* aPtr)
|
|
301 |
{
|
|
302 |
((DLcdPowerHandler*)aPtr)->PowerDownDfc();
|
|
303 |
}
|
|
304 |
|
|
305 |
|
|
306 |
/**
|
|
307 |
Default constructor
|
|
308 |
*/
|
|
309 |
DLcdPowerHandler::DLcdPowerHandler() :
|
|
310 |
DPowerHandler(KLitLcd),
|
|
311 |
iMsgQ(rxMsg,this,NULL,1),
|
|
312 |
iPowerUpDfc(&power_up_dfc,this,6),
|
|
313 |
iPowerDownDfc(&power_down_dfc,this,7),
|
|
314 |
iBacklightOn(EFalse),
|
|
315 |
iContrast(KConfigInitialDisplayContrast),
|
|
316 |
iBrightness(KConfigInitialDisplayBrightness)
|
|
317 |
{
|
|
318 |
}
|
|
319 |
|
|
320 |
|
|
321 |
/**
|
|
322 |
Second-phase constructor
|
|
323 |
|
|
324 |
Called by factory function at ordinal 0
|
|
325 |
*/
|
|
326 |
TInt DLcdPowerHandler::Create()
|
|
327 |
{
|
|
328 |
iDfcQ=Kern::DfcQue0(); // use low priority DFC queue for this driver
|
|
329 |
|
|
330 |
// map the video RAM
|
|
331 |
|
|
332 |
//TPhysAddr videoRamPhys;
|
|
333 |
TInt vSize = Lcd_Mode_Config[KConfigLcdInitialDisplayMode].iLenghtOfVideoBufferInBytes; //KConfigLcdWidth*KConfigLcdHeight*3; //VideoRamSize();
|
|
334 |
TInt r = Epoc::AllocPhysicalRam( 2*vSize, ivRamPhys );
|
|
335 |
if ( r!=KErrNone )
|
|
336 |
{
|
|
337 |
Kern::Fault( "AllocVRam", r );
|
|
338 |
}
|
|
339 |
|
|
340 |
//TInt vSize = ((Omap3530BoardAssp*)Arch::TheAsic())->VideoRamSize();
|
|
341 |
//ivRamPhys = TOmap3530Assp::VideoRamPhys(); // EXAMPLE ONLY: assume TOmap3530Assp interface class
|
|
342 |
r = DPlatChunkHw::New(iChunk,ivRamPhys,vSize,EMapAttrUserRw|EMapAttrBufferedC);
|
|
343 |
if (r != KErrNone)
|
|
344 |
return r;
|
|
345 |
|
|
346 |
//create "secure" screen immediately after normal one
|
|
347 |
iSecurevRamPhys = ivRamPhys + vSize;
|
|
348 |
TInt r2 = DPlatChunkHw::New(iSecureChunk,iSecurevRamPhys,vSize,EMapAttrUserRw|EMapAttrBufferedC);
|
|
349 |
if (r2 != KErrNone)
|
|
350 |
return r2;
|
|
351 |
|
|
352 |
TUint* pV=(TUint*)iChunk->LinearAddress();
|
|
353 |
|
|
354 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("DLcdPowerHandler::Create: VideoRamSize=%x, VideoRamPhys=%08x, VideoRamLin=%08x",vSize,ivRamPhys,pV));
|
|
355 |
|
|
356 |
// TO DO: (mandatory)
|
|
357 |
// initialise the palette for the initial display mode
|
|
358 |
// NOTE: the palette could either be a buffer allocated in system RAM (usually contiguous to Video buffer)
|
|
359 |
// or could be offered as part of the hardware block that implemenst the lcd control
|
|
360 |
//
|
|
361 |
|
|
362 |
TUint* pV2=(TUint*)iSecureChunk->LinearAddress();
|
|
363 |
|
|
364 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("DLcdPowerHandler::Create: Secure display VideoRamSize=%x, VideoRamPhys=%08x, VideoRamLin=%08x",vSize,iSecurevRamPhys,pV2));
|
|
365 |
|
|
366 |
// TO DO: (mandatory)
|
|
367 |
// initialise the secure screen's palette for the initial display mode
|
|
368 |
//
|
|
369 |
|
|
370 |
// setup the video info structure, this'll be used to remember the video settings
|
|
371 |
iVideoInfo.iDisplayMode = KConfigLcdInitialDisplayMode;
|
|
372 |
iVideoInfo.iOffsetToFirstPixel = Lcd_Mode_Config[KConfigLcdInitialDisplayMode].iOffsetToFirstVideoBuffer;
|
|
373 |
iVideoInfo.iIsPalettized = Lcd_Mode_Config[KConfigLcdInitialDisplayMode].iIsPalettized;
|
|
374 |
iVideoInfo.iOffsetBetweenLines = Lcd_Mode_Config[KConfigLcdInitialDisplayMode].iOffsetBetweenLines;
|
|
375 |
iVideoInfo.iBitsPerPixel = Lcd_Mode_Config[KConfigLcdInitialDisplayMode].iBitsPerPixel;
|
|
376 |
|
|
377 |
iVideoInfo.iSizeInPixels.iWidth = KConfigLcdWidth;
|
|
378 |
iVideoInfo.iSizeInPixels.iHeight = KConfigLcdHeight;
|
|
379 |
iVideoInfo.iSizeInTwips.iWidth = KConfigLcdWidthInTwips;
|
|
380 |
iVideoInfo.iSizeInTwips.iHeight = KConfigLcdHeightInTwips;
|
|
381 |
iVideoInfo.iIsMono = KConfigLcdIsMono;
|
|
382 |
iVideoInfo.iVideoAddress=(TInt)pV;
|
|
383 |
iVideoInfo.iIsPixelOrderLandscape = KConfigLcdPixelOrderLandscape;
|
|
384 |
iVideoInfo.iIsPixelOrderRGB = KConfigLcdPixelOrderRGB;
|
|
385 |
|
|
386 |
iSecureVideoInfo = iVideoInfo;
|
|
387 |
iSecureVideoInfo.iVideoAddress = (TInt)pV2;
|
|
388 |
|
|
389 |
iDisplayOn = EFalse;
|
|
390 |
iSecureDisplay = EFalse;
|
|
391 |
|
|
392 |
// install the HAL function
|
|
393 |
r=Kern::AddHalEntry(EHalGroupDisplay, halFunction, this);
|
|
394 |
if (r!=KErrNone)
|
|
395 |
return r;
|
|
396 |
|
|
397 |
iPowerUpDfc.SetDfcQ(iDfcQ);
|
|
398 |
iPowerDownDfc.SetDfcQ(iDfcQ);
|
|
399 |
iMsgQ.SetDfcQ(iDfcQ);
|
|
400 |
iMsgQ.Receive();
|
|
401 |
|
|
402 |
// install the power handler
|
|
403 |
// power up the screen
|
|
404 |
Add();
|
|
405 |
DisplayOn();
|
|
406 |
|
|
407 |
SplashScreen();
|
|
408 |
|
|
409 |
return KErrNone;
|
|
410 |
}
|
|
411 |
|
|
412 |
/**
|
|
413 |
Turn the display on
|
|
414 |
May be called as a result of a power transition or from the HAL
|
|
415 |
If called from HAL, then the display may be already be on (iDisplayOn == ETrue)
|
|
416 |
*/
|
|
417 |
void DLcdPowerHandler::DisplayOn()
|
|
418 |
{
|
|
419 |
__KTRACE_OPT(KBOOT, Kern::Printf("DisplayOn %d", iDisplayOn));
|
|
420 |
if (!iDisplayOn) // may have been powered up already
|
|
421 |
{
|
|
422 |
iDisplayOn = ETrue;
|
|
423 |
PowerUpLcd(iSecureDisplay);
|
|
424 |
SetContrast(iContrast);
|
|
425 |
SetBrightness(iBrightness);
|
|
426 |
}
|
|
427 |
}
|
|
428 |
|
|
429 |
/**
|
|
430 |
Turn the display off
|
|
431 |
May be called as a result of a power transition or from the HAL
|
|
432 |
If called from Power Manager, then the display may be already be off (iDisplayOn == EFalse)
|
|
433 |
if the platform is in silent running mode
|
|
434 |
*/
|
|
435 |
void DLcdPowerHandler::DisplayOff()
|
|
436 |
{
|
|
437 |
__KTRACE_OPT(KBOOT, Kern::Printf("DisplayOff %d", iDisplayOn));
|
|
438 |
if (iDisplayOn)
|
|
439 |
{
|
|
440 |
iDisplayOn = EFalse;
|
|
441 |
PowerDownLcd();
|
|
442 |
}
|
|
443 |
}
|
|
444 |
|
|
445 |
/**
|
|
446 |
Switch between secure and non-secure displays
|
|
447 |
|
|
448 |
@param aSecure ETrue if switching to secure display
|
|
449 |
*/
|
|
450 |
void DLcdPowerHandler::SwitchDisplay(TBool aSecure)
|
|
451 |
{
|
|
452 |
if (aSecure)
|
|
453 |
{
|
|
454 |
if (!iSecureDisplay)
|
|
455 |
{
|
|
456 |
//switch to secure display
|
|
457 |
DisplayOff();
|
|
458 |
iSecureDisplay = ETrue;
|
|
459 |
DisplayOn();
|
|
460 |
}
|
|
461 |
}
|
|
462 |
else
|
|
463 |
{
|
|
464 |
if (iSecureDisplay)
|
|
465 |
{
|
|
466 |
//switch from secure display
|
|
467 |
DisplayOff();
|
|
468 |
iSecureDisplay = EFalse;
|
|
469 |
DisplayOn();
|
|
470 |
}
|
|
471 |
}
|
|
472 |
}
|
|
473 |
|
|
474 |
/**
|
|
475 |
DFC to power up the display
|
|
476 |
*/
|
|
477 |
void DLcdPowerHandler::PowerUpDfc()
|
|
478 |
{
|
|
479 |
__KTRACE_OPT(KPOWER, Kern::Printf("PowerUpDfc"));
|
|
480 |
DisplayOn();
|
|
481 |
|
|
482 |
PowerUpDone(); // must be called from a different thread than PowerUp()
|
|
483 |
}
|
|
484 |
|
|
485 |
/**
|
|
486 |
DFC to power down the display
|
|
487 |
*/
|
|
488 |
void DLcdPowerHandler::PowerDownDfc()
|
|
489 |
{
|
|
490 |
__KTRACE_OPT(KPOWER, Kern::Printf("PowerDownDfc"));
|
|
491 |
DisplayOff();
|
|
492 |
PowerDownDone(); // must be called from a different thread than PowerUp()
|
|
493 |
}
|
|
494 |
|
|
495 |
/**
|
|
496 |
Schedule the power-down DFC
|
|
497 |
*/
|
|
498 |
void DLcdPowerHandler::PowerDown(TPowerState)
|
|
499 |
{
|
|
500 |
iPowerDownDfc.Enque(); // schedules DFC to execute on this driver's thread
|
|
501 |
}
|
|
502 |
|
|
503 |
/**
|
|
504 |
Schedule the power-up DFC
|
|
505 |
*/
|
|
506 |
void DLcdPowerHandler::PowerUp()
|
|
507 |
{
|
|
508 |
iPowerUpDfc.Enque(); // schedules DFC to execute on this driver's thread
|
|
509 |
}
|
|
510 |
|
|
511 |
/**
|
|
512 |
Power up the display
|
|
513 |
|
|
514 |
@param aSecure ETrue if powering up the secure display
|
|
515 |
*/
|
|
516 |
void DLcdPowerHandler::PowerUpLcd(TBool aSecure)
|
|
517 |
{
|
|
518 |
|
|
519 |
TUint32 l = 0x0;
|
|
520 |
|
|
521 |
// Set up the Display Subsystem to control a DVI monitor
|
|
522 |
|
|
523 |
// The following four lines need to be replaced by a call to the GPIO driver which should call the PowerClock driver
|
|
524 |
// PowerClock::GpioActive(0, PowerClock::E1s, PowerClock::ECpu10, PowerClock::EBus10);
|
|
525 |
// PowerClock::GpioAccess(0, PowerClock::EAuto);
|
|
526 |
Prcm::SetClockState( Prcm::EClkGpio1_F, Prcm::EClkOn );
|
|
527 |
Prcm::SetClockState( Prcm::EClkGpio1_I, Prcm::EClkAuto );
|
|
528 |
*( (TUint *) Omap3530HwBase::TVirtual<0x48310034>::Value ) = 0xfefffedf; //GPIO1 output enable p3336
|
|
529 |
*( (TUint *) Omap3530HwBase::TVirtual<0x48310094>::Value ) = 0x01000120; //GPIO1 set data out p3336
|
|
530 |
// const TUint KCM_CLKSEL_DSS = Omap3530HwBase::TVirtual<0x48004E40>::Value;
|
|
531 |
// Prcm::Set(KCM_CLKSEL_DSS, 0xffffffffu, 0x00001006);
|
|
532 |
|
|
533 |
Prcm::SetDivider( Prcm::EClkDss1_F, 2 );
|
|
534 |
Prcm::SetDivider( Prcm::EClkTv_F, 1 );
|
|
535 |
|
|
536 |
|
|
537 |
SET_REGISTER( DSS_SYSCONFIG, 0x00000010 ); // Display Subsystem reset
|
|
538 |
while ( !( GET_REGISTER( DISPC_SYSSTATUS ) & 1 ) ); // Spin until reset complete
|
|
539 |
|
|
540 |
TInt8 MIDLEMODE = 0x2; // Smart Standby. MStandby is asserted based on the internal activity of the module.
|
|
541 |
TInt8 CLOCKACTIVITY = 0x0; // interface and functional clocks can be switched off.
|
|
542 |
TInt8 SIDLEMODE = 0x2; // Smart idle. Idle request is acknowledged based on the internal activity of the module
|
|
543 |
TInt8 ENWAKEUP = 0x1; // Wakeup is enabled.
|
|
544 |
TInt8 SOFTRESET = 0x0; // Normal mode
|
|
545 |
TInt8 AUTOIDLE = 0x1; // Automatic L3 and L4 interface clock gating strategy is applied based on interface activity
|
|
546 |
l = MIDLEMODE<<12 | CLOCKACTIVITY<<8 | SIDLEMODE<<3 | ENWAKEUP<<2 | SOFTRESET<<1 | AUTOIDLE;
|
|
547 |
SET_REGISTER( DISPC_SYSCONFIG, l );
|
|
548 |
|
|
549 |
TInt8 LOADMOAD = 0x2; //Frame data only loaded every frame
|
|
550 |
l = LOADMOAD<<1;
|
|
551 |
SET_REGISTER( DISPC_CONFIG, l );
|
|
552 |
|
|
553 |
SET_REGISTER( DISPC_DEFAULT_COLOR0, 0xFFFFFFFF );
|
|
554 |
SET_REGISTER( DISPC_TRANS_COLOR0, 0x00000000 );
|
|
555 |
|
|
556 |
TUint8 hbp = H_BPORCH - 1; // Horizontal Back Porch
|
|
557 |
TUint8 hfp = H_FPORCH - 1; // Horizontal front porch
|
|
558 |
TUint8 hsw = H_SYNC - 1; // Horizontal synchronization pulse width
|
|
559 |
if ( hsw > 63 )
|
|
560 |
{
|
|
561 |
hsw = 63;
|
|
562 |
Kern::Printf("[LCD] H_SYNC too big");
|
|
563 |
}
|
|
564 |
l = hbp<<20 | hfp<<8 | hsw;
|
|
565 |
SET_REGISTER( DISPC_TIMING_H, l );
|
|
566 |
|
|
567 |
TUint8 vbp = V_BPORCH; // Vertical back porch
|
|
568 |
TUint8 vfp = V_FPORCH; // Vertical front porch
|
|
569 |
TUint8 vsw = V_SYNC; // Vertical synchronization pulse width
|
|
570 |
__ASSERT_ALWAYS( vbp<=255, Kern::Fault("LCD", 1) );
|
|
571 |
__ASSERT_ALWAYS( vfp<=255, Kern::Fault("LCD", 1) );
|
|
572 |
__ASSERT_ALWAYS( vsw>=1 && vsw<=255, Kern::Fault("LCD", 1) );
|
|
573 |
l = vbp<<20 | vfp<<8 | vsw;
|
|
574 |
SET_REGISTER( DISPC_TIMING_V, l );
|
|
575 |
|
|
576 |
TUint8 onoff= 0;
|
|
577 |
TUint8 rf = 0;
|
|
578 |
TUint8 ieo = 0;
|
|
579 |
TUint8 ipc = 1; // Invert Pixel Clock
|
|
580 |
TUint8 ihs = H_SYNC_POL ? 0 : 1; // Invert HSYNC (0: Positive Sync polarity, 1: Negative Sync polarity)
|
|
581 |
TUint8 ivs = V_SYNC_POL ? 0 : 1; // Invert VSYNC (0: Positive Sync polarity, 1: Negative Sync polarity)
|
|
582 |
TUint8 acbi = 0;
|
|
583 |
TUint16 acb = 0x28; // AC-bias pin frequency
|
|
584 |
l = onoff<<17 | rf<<16 | ieo<<15 | ipc<<14 | ihs<<13 | ivs<<12 | acbi<<8 | acb;
|
|
585 |
SET_REGISTER( DISPC_POL_FREQ, l );
|
|
586 |
|
|
587 |
TUint8 lcd = 1; // Display Controller Logic Clock Divisor
|
|
588 |
TUint8 pcd = ( 432000 + (PIXEL_CLK - 1) ) / PIXEL_CLK; // Pixel Clock Divisor - add (PIXEL_CLK - 1) to avoid rounding error
|
|
589 |
__ASSERT_ALWAYS( lcd>=1 && lcd<=255, Kern::Fault("LCD", 1) );
|
|
590 |
__ASSERT_ALWAYS( pcd>=2 && pcd<=255, Kern::Fault("LCD", 1) );
|
|
591 |
l = lcd<<16 | pcd;
|
|
592 |
SET_REGISTER( DISPC_DIVISOR, l );
|
|
593 |
|
|
594 |
TUint16 ppl = H_DISP - 1; // Pixels per line
|
|
595 |
TUint16 llp = V_DISP - 1; // Lines per panel
|
|
596 |
__ASSERT_ALWAYS( ppl>=1 && ppl<=2048, Kern::Fault("LCD", 1) );
|
|
597 |
__ASSERT_ALWAYS( llp>=1 && llp<=2048, Kern::Fault("LCD", 1) );
|
|
598 |
l = llp<<16 | ppl;
|
|
599 |
SET_REGISTER( DISPC_SIZE_LCD, l );
|
|
600 |
|
|
601 |
|
|
602 |
// Setup a graphics region (GFX)
|
|
603 |
|
|
604 |
// Set GFX frame buffer
|
|
605 |
SET_REGISTER( DISPC_GFX_BA1, ivRamPhys );
|
|
606 |
|
|
607 |
// Center the GFX
|
|
608 |
TInt16 gfxposy = ( V_DISP - KConfigLcdHeight ) / 2;
|
|
609 |
TInt16 gfxposx = ( H_DISP - KConfigLcdWidth ) / 2;
|
|
610 |
l = ( gfxposy << 16 ) | gfxposx;
|
|
611 |
SET_REGISTER( DISPC_GFX_POSITION, l );
|
|
612 |
|
|
613 |
// Set the GFX dimensions
|
|
614 |
TInt16 gfxsizey = KConfigLcdHeight - 1;
|
|
615 |
TInt16 gfxsizex = KConfigLcdWidth - 1;
|
|
616 |
l = gfxsizey<<16 | gfxsizex;
|
|
617 |
SET_REGISTER( DISPC_GFX_SIZE, l );
|
|
618 |
|
|
619 |
TInt8 GFXSELFREFRESH = 0x0;
|
|
620 |
TInt8 GFXARBITRATION = 0x0;
|
|
621 |
TInt8 GFXROTATION = 0x0;
|
|
622 |
TInt8 GFXFIFOPRELOAD = 0x0;
|
|
623 |
TInt8 GFXENDIANNESS = 0x0;
|
|
624 |
TInt8 GFXNIBBLEMODE = 0x0;
|
|
625 |
TInt8 GFXCHANNELOUT = 0x0;
|
|
626 |
TInt8 GFXBURSTSIZE = 0x2; // 16x32bit bursts
|
|
627 |
TInt8 GFXREPLICATIONENABLE = 0x0; // Disable Graphics replication logic
|
|
628 |
TInt8 GFXFORMAT = 0x6; // RGB16=0x6, RGB24-unpacked=0x8, RGB24-packed=0x9
|
|
629 |
TInt8 GFXENABLE = 0x1; // Graphics enabled
|
|
630 |
l = GFXSELFREFRESH<<15 | GFXARBITRATION<<14 | GFXROTATION<<12 | GFXFIFOPRELOAD<<11 | GFXENDIANNESS<<10 | GFXNIBBLEMODE<<9 | GFXCHANNELOUT<8 | GFXBURSTSIZE<<6 | GFXREPLICATIONENABLE<<5 | GFXFORMAT<<1 | GFXENABLE;
|
|
631 |
SET_REGISTER( DISPC_GFX_ATTRIBUTES, l );
|
|
632 |
|
|
633 |
TInt16 GFXFIFOHIGHTHRESHOLD = 0x3fc; // Graphics FIFO High Threshold
|
|
634 |
TInt16 GFXFIFOLOWTHRESHOLD = 0x3BC; // Graphics FIFO Low Threshold
|
|
635 |
l = GFXFIFOHIGHTHRESHOLD<<16 | GFXFIFOLOWTHRESHOLD;
|
|
636 |
SET_REGISTER(DISPC_GFX_FIFO_THRESHOLD, l);
|
|
637 |
|
|
638 |
TInt16 GFXFIFOSIZE = 0x400; // Number of bytes defining the FIFO value
|
|
639 |
l = GFXFIFOSIZE;
|
|
640 |
SET_REGISTER(DISPC_GFX_FIFO_SIZE_STATUS, l);
|
|
641 |
|
|
642 |
TInt32 GFXROWINC = 0x1;
|
|
643 |
l = GFXROWINC;
|
|
644 |
SET_REGISTER(DISPC_GFX_ROW_INC, l);
|
|
645 |
|
|
646 |
TInt16 GFXPIXELINC = 0x1;
|
|
647 |
l = GFXPIXELINC;
|
|
648 |
SET_REGISTER(DISPC_GFX_PIXEL_INC, l);
|
|
649 |
|
|
650 |
TInt32 GFXWINDOWSKIP = 0x0;
|
|
651 |
l = GFXWINDOWSKIP;
|
|
652 |
SET_REGISTER(DISPC_GFX_WINDOW_SKIP, l);
|
|
653 |
|
|
654 |
// TO DO: Sort out the Gamma table + pallets
|
|
655 |
TInt32 GFXTABLEBA = 0x807ff000;
|
|
656 |
l = GFXTABLEBA;
|
|
657 |
SET_REGISTER(DISPC_GFX_TABLE_BA, l);
|
|
658 |
|
|
659 |
|
|
660 |
// Propigate all the shadowed registers
|
|
661 |
|
|
662 |
TInt8 SPATIALTEMPORALDITHERINGFRAMES = 0;
|
|
663 |
TInt8 LCDENABLEPOL = 0;
|
|
664 |
TInt8 LCDENABLESIGNAL = 0;
|
|
665 |
TInt8 PCKFREEENABLE = 0;
|
|
666 |
TInt8 TDMUNUSEDBITS = 0;
|
|
667 |
TInt8 TDMCYCLEFORMAT = 0;
|
|
668 |
TInt8 TDMPARALLELMODE = 0;
|
|
669 |
TInt8 TDMENABLE = 0;
|
|
670 |
TInt8 HT = 0;
|
|
671 |
TInt8 GPOUT1 = 1;
|
|
672 |
TInt8 GPOUT0 = 1;
|
|
673 |
TInt8 GPIN1 = 0;
|
|
674 |
TInt8 GPIN0 = 0;
|
|
675 |
TInt8 OVERLAYOPTIMIZATION = 0;
|
|
676 |
TInt8 RFBIMODE = 0;
|
|
677 |
TInt8 SECURE = 0;
|
|
678 |
TInt8 TFTDATALINES = 0x3;
|
|
679 |
TInt8 STDITHERENABLE = 0;
|
|
680 |
TInt8 GODIGITAL = 1;
|
|
681 |
TInt8 GOLCD = 1;
|
|
682 |
TInt8 M8B = 0;
|
|
683 |
TInt8 STNTFT = 1;
|
|
684 |
TInt8 MONOCOLOR = 0;
|
|
685 |
TInt8 DIGITALENABLE = 1;
|
|
686 |
TInt8 LCDENABLE = 1;
|
|
687 |
l = SPATIALTEMPORALDITHERINGFRAMES<<30 | LCDENABLEPOL<<29 | LCDENABLESIGNAL<<28 | PCKFREEENABLE<<27 |
|
|
688 |
TDMUNUSEDBITS<<25 | TDMCYCLEFORMAT<<23 | TDMPARALLELMODE<<21 | TDMENABLE<<20 | HT<<17 | GPOUT1<<16 |
|
|
689 |
GPOUT0<<15 | GPIN1<<14 | GPIN0<<13 | OVERLAYOPTIMIZATION<<12 | RFBIMODE<<11 | SECURE<<10 |
|
|
690 |
TFTDATALINES<<8 | STDITHERENABLE<<7 | GODIGITAL<<6 | GOLCD<<5 | M8B<<4 | STNTFT<<3 |
|
|
691 |
MONOCOLOR<<2 | DIGITALENABLE<<1 | LCDENABLE;
|
|
692 |
NKern::Sleep(1);
|
|
693 |
SET_REGISTER(DISPC_CONTROL, l);
|
|
694 |
NKern::Sleep(1);
|
|
695 |
|
|
696 |
}
|
|
697 |
|
|
698 |
|
|
699 |
/**
|
|
700 |
Power down the display and the backlight
|
|
701 |
*/
|
|
702 |
void DLcdPowerHandler::PowerDownLcd()
|
|
703 |
{
|
|
704 |
SetBacklightState(EFalse);
|
|
705 |
|
|
706 |
// TO DO: (mandatory)
|
|
707 |
// Power down the display & disable LCD DMA.
|
|
708 |
// May need to wait until the current frame has been output
|
|
709 |
//
|
|
710 |
|
|
711 |
SET_REGISTER(DISPC_CONTROL, 0);
|
|
712 |
|
|
713 |
}
|
|
714 |
|
|
715 |
/**
|
|
716 |
Set the Lcd contrast
|
|
717 |
|
|
718 |
@param aValue the contrast setting
|
|
719 |
*/
|
|
720 |
TInt DLcdPowerHandler::SetContrast(TInt aValue)
|
|
721 |
{
|
|
722 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("SetContrast(%d)", aValue));
|
|
723 |
|
|
724 |
if (aValue >= KConfigLcdMinDisplayContrast && aValue <= KConfigLcdMaxDisplayContrast)
|
|
725 |
{
|
|
726 |
iContrast=aValue;
|
|
727 |
|
|
728 |
// TO DO: (mandatory)
|
|
729 |
// set the contrast
|
|
730 |
//
|
|
731 |
return KErrNone;
|
|
732 |
}
|
|
733 |
|
|
734 |
return KErrArgument;
|
|
735 |
}
|
|
736 |
|
|
737 |
/**
|
|
738 |
Set the Lcd brightness
|
|
739 |
|
|
740 |
@param aValue the brightness setting
|
|
741 |
*/
|
|
742 |
TInt DLcdPowerHandler::SetBrightness(TInt aValue)
|
|
743 |
{
|
|
744 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("SetBrightness(%d)", aValue));
|
|
745 |
|
|
746 |
if (aValue >= KConfigLcdMinDisplayBrightness && aValue <= KConfigLcdMaxDisplayBrightness)
|
|
747 |
{
|
|
748 |
iBrightness=aValue;
|
|
749 |
|
|
750 |
// TO DO: (mandatory)
|
|
751 |
// set the brightness
|
|
752 |
//
|
|
753 |
return KErrNone;
|
|
754 |
}
|
|
755 |
return KErrArgument;
|
|
756 |
}
|
|
757 |
|
|
758 |
/**
|
|
759 |
Turn the backlight on
|
|
760 |
*/
|
|
761 |
void DLcdPowerHandler::BacklightOn()
|
|
762 |
{
|
|
763 |
// TO DO: (mandatory)
|
|
764 |
// turn the backlight on
|
|
765 |
//
|
|
766 |
}
|
|
767 |
|
|
768 |
/**
|
|
769 |
Turn the backlight off
|
|
770 |
*/
|
|
771 |
void DLcdPowerHandler::BacklightOff()
|
|
772 |
{
|
|
773 |
// TO DO: (mandatory)
|
|
774 |
// turn the backlight off
|
|
775 |
//
|
|
776 |
}
|
|
777 |
|
|
778 |
/**
|
|
779 |
Set the state of the backlight
|
|
780 |
|
|
781 |
@param aState ETrue if setting the backlight on
|
|
782 |
*/
|
|
783 |
void DLcdPowerHandler::SetBacklightState(TBool aState)
|
|
784 |
{
|
|
785 |
iBacklightOn=aState;
|
|
786 |
if (iBacklightOn)
|
|
787 |
BacklightOn();
|
|
788 |
else
|
|
789 |
BacklightOff();
|
|
790 |
}
|
|
791 |
|
|
792 |
void DLcdPowerHandler::ScreenInfo(TScreenInfoV01& anInfo)
|
|
793 |
{
|
|
794 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("DLcdPowerHandler::ScreenInfo"));
|
|
795 |
anInfo.iWindowHandleValid=EFalse;
|
|
796 |
anInfo.iWindowHandle=NULL;
|
|
797 |
anInfo.iScreenAddressValid=ETrue;
|
|
798 |
anInfo.iScreenAddress=(TAny *)(iChunk->LinearAddress());
|
|
799 |
anInfo.iScreenSize.iWidth=KConfigLcdWidth;
|
|
800 |
anInfo.iScreenSize.iHeight=KConfigLcdHeight;
|
|
801 |
}
|
|
802 |
|
|
803 |
/**
|
|
804 |
Handle a message from the power handler
|
|
805 |
*/
|
|
806 |
void DLcdPowerHandler::HandleMsg(void)
|
|
807 |
{
|
|
808 |
|
|
809 |
TMessageBase* msg = iMsgQ.iMessage;
|
|
810 |
if (msg == NULL)
|
|
811 |
return;
|
|
812 |
|
|
813 |
if (msg->iValue)
|
|
814 |
DisplayOn();
|
|
815 |
else
|
|
816 |
DisplayOff();
|
|
817 |
msg->Complete(KErrNone,ETrue);
|
|
818 |
}
|
|
819 |
|
|
820 |
/**
|
|
821 |
Send a message to the power-handler message queue to turn the display on
|
|
822 |
*/
|
|
823 |
void DLcdPowerHandler::WsSwitchOnScreen()
|
|
824 |
{
|
|
825 |
TThreadMessage& m=Kern::Message();
|
|
826 |
m.iValue = ETrue;
|
|
827 |
m.SendReceive(&iMsgQ); // send a message and block Client thread until keyboard has been powered up
|
|
828 |
}
|
|
829 |
|
|
830 |
/**
|
|
831 |
Send a message to the power-handler message queue to turn the display off
|
|
832 |
*/
|
|
833 |
void DLcdPowerHandler::WsSwitchOffScreen()
|
|
834 |
{
|
|
835 |
TThreadMessage& m=Kern::Message();
|
|
836 |
m.iValue = EFalse;
|
|
837 |
m.SendReceive(&iMsgQ); // send a message and block Client thread until keyboard has been powered down
|
|
838 |
}
|
|
839 |
|
|
840 |
/**
|
|
841 |
Return information about the current display mode
|
|
842 |
|
|
843 |
@param aInfo a structure supplied by the caller to be filled by this function.
|
|
844 |
@param aSecure ETrue if requesting information about the secure display
|
|
845 |
@return KErrNone if successful
|
|
846 |
*/
|
|
847 |
TInt DLcdPowerHandler::GetCurrentDisplayModeInfo(TVideoInfoV01& aInfo, TBool aSecure)
|
|
848 |
{
|
|
849 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("GetCurrentDisplayModeInfo"));
|
|
850 |
NKern::FMWait(&iLock);
|
|
851 |
if (aSecure)
|
|
852 |
aInfo = iSecureVideoInfo;
|
|
853 |
else
|
|
854 |
aInfo = iVideoInfo;
|
|
855 |
NKern::FMSignal(&iLock);
|
|
856 |
return KErrNone;
|
|
857 |
}
|
|
858 |
|
|
859 |
/**
|
|
860 |
Return information about the specified display mode
|
|
861 |
|
|
862 |
@param aMode the display mode to query
|
|
863 |
@param aInfo a structure supplied by the caller to be filled by this function.
|
|
864 |
@return KErrNone if successful
|
|
865 |
*/
|
|
866 |
TInt DLcdPowerHandler::GetSpecifiedDisplayModeInfo(TInt aMode, TVideoInfoV01& aInfo)
|
|
867 |
{
|
|
868 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("GetSpecifiedDisplayModeInfo mode is %d",aMode));
|
|
869 |
|
|
870 |
if (aMode < 0 || aMode >= KConfigLcdNumberOfDisplayModes)
|
|
871 |
return KErrArgument;
|
|
872 |
|
|
873 |
NKern::FMWait(&iLock);
|
|
874 |
aInfo = iVideoInfo;
|
|
875 |
NKern::FMSignal(&iLock);
|
|
876 |
|
|
877 |
if (aMode != aInfo.iDisplayMode)
|
|
878 |
{
|
|
879 |
aInfo.iOffsetToFirstPixel=Lcd_Mode_Config[aMode].iOffsetToFirstVideoBuffer;
|
|
880 |
aInfo.iIsPalettized = Lcd_Mode_Config[aMode].iIsPalettized;
|
|
881 |
aInfo.iOffsetBetweenLines=Lcd_Mode_Config[aMode].iOffsetBetweenLines;
|
|
882 |
aInfo.iBitsPerPixel = Lcd_Mode_Config[aMode].iBitsPerPixel;
|
|
883 |
}
|
|
884 |
return KErrNone;
|
|
885 |
}
|
|
886 |
|
|
887 |
/**
|
|
888 |
Set the display mode
|
|
889 |
|
|
890 |
@param aMode the display mode to set
|
|
891 |
*/
|
|
892 |
TInt DLcdPowerHandler::SetDisplayMode(TInt aMode)
|
|
893 |
{
|
|
894 |
|
|
895 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("SetDisplayMode = %d", aMode));
|
|
896 |
|
|
897 |
if (aMode < 0 || aMode >= KConfigLcdNumberOfDisplayModes)
|
|
898 |
return KErrArgument;
|
|
899 |
|
|
900 |
NKern::FMWait(&iLock);
|
|
901 |
|
|
902 |
// store the current mode
|
|
903 |
iVideoInfo.iDisplayMode = aMode;
|
|
904 |
iVideoInfo.iOffsetToFirstPixel = Lcd_Mode_Config[aMode].iOffsetToFirstVideoBuffer;
|
|
905 |
iVideoInfo.iIsPalettized = Lcd_Mode_Config[aMode].iIsPalettized;
|
|
906 |
iVideoInfo.iOffsetBetweenLines = Lcd_Mode_Config[aMode].iOffsetBetweenLines;
|
|
907 |
iVideoInfo.iBitsPerPixel = Lcd_Mode_Config[aMode].iBitsPerPixel;
|
|
908 |
|
|
909 |
// store the current mode for secure screen
|
|
910 |
iSecureVideoInfo.iDisplayMode = aMode;
|
|
911 |
iSecureVideoInfo.iOffsetToFirstPixel = Lcd_Mode_Config[aMode].iOffsetToFirstVideoBuffer;
|
|
912 |
iSecureVideoInfo.iIsPalettized = Lcd_Mode_Config[aMode].iIsPalettized;
|
|
913 |
iSecureVideoInfo.iOffsetBetweenLines = Lcd_Mode_Config[aMode].iOffsetBetweenLines;
|
|
914 |
iSecureVideoInfo.iBitsPerPixel = Lcd_Mode_Config[aMode].iBitsPerPixel;
|
|
915 |
|
|
916 |
// TO DO: (mandatory)
|
|
917 |
// set bits per pixel on hardware
|
|
918 |
// May need to reconfigure DMA if video buffer size and location have changed
|
|
919 |
//
|
|
920 |
NKern::FMSignal(&iLock);
|
|
921 |
|
|
922 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("SetDisplayMode mode = %d, otfp = %d, palettized = %d, bpp = %d, obl = %d",
|
|
923 |
aMode, iVideoInfo.iOffsetToFirstPixel, iVideoInfo.iIsPalettized, iVideoInfo.iBitsPerPixel, iVideoInfo.iOffsetBetweenLines));
|
|
924 |
|
|
925 |
return KErrNone;
|
|
926 |
}
|
|
927 |
|
|
928 |
/**
|
|
929 |
Fill the video memory with an initial pattern or image
|
|
930 |
This will be displayed on boot-up
|
|
931 |
*/
|
|
932 |
void DLcdPowerHandler::SplashScreen()
|
|
933 |
{
|
|
934 |
// TO DO: (optional)
|
|
935 |
// replace the example code below to display a different spash screen
|
|
936 |
|
|
937 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("Splash SCreen +"));
|
|
938 |
TUint* pV=(TUint*)(iVideoInfo.iVideoAddress + iVideoInfo.iOffsetToFirstPixel);
|
|
939 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("Splash SCreen FB @ %x",pV));
|
|
940 |
|
|
941 |
//Fill the framebuffer with bars
|
|
942 |
|
|
943 |
for (TInt y = 0; y<KConfigLcdHeight; ++y)
|
|
944 |
{
|
|
945 |
for(TInt x = 0; x<KConfigLcdHeight; ++x)
|
|
946 |
{
|
|
947 |
TUint8 r = 0x00;
|
|
948 |
TUint8 g = 0x00;
|
|
949 |
TUint8 b = 0x00;
|
|
950 |
TUint16 rgb = ((r&0xf8) << 8) | ((g&0xfc) << 3) | ((b&0xf8) >> 3);
|
|
951 |
|
|
952 |
TUint16* px = reinterpret_cast<TUint16*>(pV) + y*KConfigLcdWidth + x;
|
|
953 |
*px = rgb;
|
|
954 |
}
|
|
955 |
}
|
|
956 |
|
|
957 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("Splash SCreen -"));
|
|
958 |
}
|
|
959 |
|
|
960 |
|
|
961 |
/**
|
|
962 |
Get the size of the pallete
|
|
963 |
|
|
964 |
@return the number of pallete entries
|
|
965 |
*/
|
|
966 |
TInt DLcdPowerHandler::NumberOfPaletteEntries() //only call when holding mutex
|
|
967 |
{
|
|
968 |
// TO DO: (mandatory)
|
|
969 |
// Calculate the number of Palette entries - this is normally
|
|
970 |
// calculated from the bits per-pixel.
|
|
971 |
// This is only example code... you may need to modify it for your hardware
|
|
972 |
//
|
|
973 |
TInt num = iVideoInfo.iIsPalettized ? 1<<iVideoInfo.iBitsPerPixel : 0;
|
|
974 |
|
|
975 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("NumberOfPaletteEntries = %d", num));
|
|
976 |
|
|
977 |
return num;
|
|
978 |
}
|
|
979 |
|
|
980 |
|
|
981 |
/**
|
|
982 |
Retrieve the palette entry at a particular offset
|
|
983 |
|
|
984 |
@param aEntry the palette index
|
|
985 |
@param aColor a caller-supplied pointer to a location where the returned RGB color is to be stored
|
|
986 |
@return KErrNone if successful
|
|
987 |
KErrNotSupported if the current vide mode does not support a palette
|
|
988 |
KErrArgument if aEntry is out of range
|
|
989 |
*/
|
|
990 |
TInt DLcdPowerHandler::GetPaletteEntry(TInt aEntry, TInt* aColor)
|
|
991 |
{
|
|
992 |
NKern::FMWait(&iLock);
|
|
993 |
if (!iVideoInfo.iIsPalettized)
|
|
994 |
{
|
|
995 |
NKern::FMSignal(&iLock);
|
|
996 |
return KErrNotSupported;
|
|
997 |
}
|
|
998 |
|
|
999 |
if ((aEntry < 0) || (aEntry >= NumberOfPaletteEntries()))
|
|
1000 |
{
|
|
1001 |
NKern::FMSignal(&iLock);
|
|
1002 |
return KErrArgument;
|
|
1003 |
}
|
|
1004 |
|
|
1005 |
// TO DO: (mandatory)
|
|
1006 |
// read the RGB value of the palette entry into aColor
|
|
1007 |
// NOTE: the palette could either be a buffer allocated in system RAM (usually contiguous to Video buffer)
|
|
1008 |
// or could be offered as part of the hardware block that implemenst the lcd control
|
|
1009 |
//
|
|
1010 |
NKern::FMSignal(&iLock);
|
|
1011 |
|
|
1012 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("GetPaletteEntry %d color 0x%x", aEntry, aColor));
|
|
1013 |
|
|
1014 |
return KErrNone;
|
|
1015 |
}
|
|
1016 |
|
|
1017 |
/**
|
|
1018 |
Set the palette entry at a particular offset
|
|
1019 |
|
|
1020 |
@param aEntry the palette index
|
|
1021 |
@param aColor the RGB color to store
|
|
1022 |
@return KErrNone if successful
|
|
1023 |
KErrNotSupported if the current vide mode does not support a palette
|
|
1024 |
KErrArgument if aEntry is out of range
|
|
1025 |
*/
|
|
1026 |
TInt DLcdPowerHandler::SetPaletteEntry(TInt aEntry, TInt aColor)
|
|
1027 |
{
|
|
1028 |
|
|
1029 |
NKern::FMWait(&iLock);
|
|
1030 |
if (!iVideoInfo.iIsPalettized)
|
|
1031 |
{
|
|
1032 |
NKern::FMSignal(&iLock);
|
|
1033 |
return KErrNotSupported;
|
|
1034 |
}
|
|
1035 |
|
|
1036 |
if ((aEntry < 0) || (aEntry >= NumberOfPaletteEntries())) //check entry in range
|
|
1037 |
{
|
|
1038 |
NKern::FMSignal(&iLock);
|
|
1039 |
return KErrArgument;
|
|
1040 |
}
|
|
1041 |
|
|
1042 |
// TO DO: (mandatory)
|
|
1043 |
// update the palette entry for the secure and non-secure screen
|
|
1044 |
// NOTE: the palette could either be a buffer allocated in system RAM (usually contiguous to Video buffer)
|
|
1045 |
// or could be offered as part of the hardware block that implemenst the lcd control
|
|
1046 |
//
|
|
1047 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("SetPaletteEntry %d to 0x%x", aEntry, aColor ));
|
|
1048 |
|
|
1049 |
return KErrNone;
|
|
1050 |
}
|
|
1051 |
|
|
1052 |
/**
|
|
1053 |
a HAL entry handling function for HAL group attribute EHalGroupDisplay
|
|
1054 |
|
|
1055 |
@param a1 an arbitrary argument
|
|
1056 |
@param a2 an arbitrary argument
|
|
1057 |
@return KErrNone if successful
|
|
1058 |
*/
|
|
1059 |
TInt DLcdPowerHandler::HalFunction(TInt aFunction, TAny* a1, TAny* a2)
|
|
1060 |
{
|
|
1061 |
TInt r=KErrNone;
|
|
1062 |
switch(aFunction)
|
|
1063 |
{
|
|
1064 |
case EDisplayHalScreenInfo:
|
|
1065 |
{
|
|
1066 |
TPckgBuf<TScreenInfoV01> vPckg;
|
|
1067 |
ScreenInfo(vPckg());
|
|
1068 |
Kern::InfoCopy(*(TDes8*)a1,vPckg);
|
|
1069 |
break;
|
|
1070 |
}
|
|
1071 |
|
|
1072 |
case EDisplayHalWsRegisterSwitchOnScreenHandling:
|
|
1073 |
iWsSwitchOnScreen=(TBool)a1;
|
|
1074 |
break;
|
|
1075 |
|
|
1076 |
case EDisplayHalWsSwitchOnScreen:
|
|
1077 |
WsSwitchOnScreen();
|
|
1078 |
break;
|
|
1079 |
|
|
1080 |
case EDisplayHalMaxDisplayContrast:
|
|
1081 |
{
|
|
1082 |
TInt mc=KConfigLcdMaxDisplayContrast;
|
|
1083 |
kumemput32(a1,&mc,sizeof(mc));
|
|
1084 |
break;
|
|
1085 |
}
|
|
1086 |
case EDisplayHalSetDisplayContrast:
|
|
1087 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("EDisplayHalSetDisplayContrast"));
|
|
1088 |
if(!Kern::CurrentThreadHasCapability(ECapabilityWriteDeviceData,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetDisplayContrast")))
|
|
1089 |
return KErrPermissionDenied;
|
|
1090 |
r=SetContrast(TInt(a1));
|
|
1091 |
break;
|
|
1092 |
|
|
1093 |
case EDisplayHalDisplayContrast:
|
|
1094 |
kumemput32(a1,&iContrast,sizeof(iContrast));
|
|
1095 |
break;
|
|
1096 |
|
|
1097 |
case EDisplayHalMaxDisplayBrightness:
|
|
1098 |
{
|
|
1099 |
TInt mc=KConfigLcdMaxDisplayBrightness;
|
|
1100 |
kumemput32(a1,&mc,sizeof(mc));
|
|
1101 |
break;
|
|
1102 |
}
|
|
1103 |
|
|
1104 |
case EDisplayHalSetDisplayBrightness:
|
|
1105 |
__KTRACE_OPT(KEXTENSION,Kern::Printf("EDisplayHalSetDisplayBrightness"));
|
|
1106 |
if(!Kern::CurrentThreadHasCapability(ECapabilityWriteDeviceData,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetDisplayBrightness")))
|
|
1107 |
return KErrPermissionDenied;
|
|
1108 |
r=SetBrightness(TInt(a1));
|
|
1109 |
break;
|
|
1110 |
|
|
1111 |
case EDisplayHalDisplayBrightness:
|
|
1112 |
kumemput32(a1,&iBrightness,sizeof(iBrightness));
|
|
1113 |
break;
|
|
1114 |
|
|
1115 |
case EDisplayHalSetBacklightOn:
|
|
1116 |
if(!Kern::CurrentThreadHasCapability(ECapabilityWriteDeviceData,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetBacklightOn")))
|
|
1117 |
return KErrPermissionDenied;
|
|
1118 |
if (Kern::MachinePowerStatus()<ELow)
|
|
1119 |
r=KErrBadPower;
|
|
1120 |
else
|
|
1121 |
SetBacklightState(TBool(a1));
|
|
1122 |
break;
|
|
1123 |
|
|
1124 |
case EDisplayHalBacklightOn:
|
|
1125 |
kumemput32(a1,&iBacklightOn,sizeof(TInt));
|
|
1126 |
break;
|
|
1127 |
|
|
1128 |
case EDisplayHalModeCount:
|
|
1129 |
{
|
|
1130 |
TInt ndm = KConfigLcdNumberOfDisplayModes;
|
|
1131 |
kumemput32(a1, &ndm, sizeof(ndm));
|
|
1132 |
break;
|
|
1133 |
}
|
|
1134 |
|
|
1135 |
case EDisplayHalSetMode:
|
|
1136 |
if(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetMode")))
|
|
1137 |
return KErrPermissionDenied;
|
|
1138 |
r = SetDisplayMode((TInt)a1);
|
|
1139 |
break;
|
|
1140 |
|
|
1141 |
case EDisplayHalMode:
|
|
1142 |
kumemput32(a1, &iVideoInfo.iDisplayMode, sizeof(iVideoInfo.iDisplayMode));
|
|
1143 |
break;
|
|
1144 |
|
|
1145 |
case EDisplayHalSetPaletteEntry:
|
|
1146 |
if(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetPaletteEntry")))
|
|
1147 |
return KErrPermissionDenied;
|
|
1148 |
r = SetPaletteEntry((TInt)a1, (TInt)a2);
|
|
1149 |
break;
|
|
1150 |
|
|
1151 |
case EDisplayHalPaletteEntry:
|
|
1152 |
{
|
|
1153 |
TInt entry;
|
|
1154 |
kumemget32(&entry, a1, sizeof(TInt));
|
|
1155 |
TInt x;
|
|
1156 |
r = GetPaletteEntry(entry, &x);
|
|
1157 |
if (r == KErrNone)
|
|
1158 |
kumemput32(a2, &x, sizeof(x));
|
|
1159 |
break;
|
|
1160 |
}
|
|
1161 |
|
|
1162 |
case EDisplayHalSetState:
|
|
1163 |
{
|
|
1164 |
if(!Kern::CurrentThreadHasCapability(ECapabilityPowerMgmt,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetState")))
|
|
1165 |
return KErrPermissionDenied;
|
|
1166 |
if ((TBool)a1)
|
|
1167 |
{
|
|
1168 |
WsSwitchOnScreen();
|
|
1169 |
}
|
|
1170 |
else
|
|
1171 |
{
|
|
1172 |
WsSwitchOffScreen();
|
|
1173 |
}
|
|
1174 |
break;
|
|
1175 |
}
|
|
1176 |
|
|
1177 |
case EDisplayHalState:
|
|
1178 |
kumemput32(a1, &iDisplayOn, sizeof(TBool));
|
|
1179 |
break;
|
|
1180 |
|
|
1181 |
case EDisplayHalColors:
|
|
1182 |
{
|
|
1183 |
TInt mdc = KConfigLcdMaxDisplayColors;
|
|
1184 |
kumemput32(a1, &mdc, sizeof(mdc));
|
|
1185 |
break;
|
|
1186 |
}
|
|
1187 |
|
|
1188 |
case EDisplayHalCurrentModeInfo:
|
|
1189 |
{
|
|
1190 |
TPckgBuf<TVideoInfoV01> vPckg;
|
|
1191 |
r = GetCurrentDisplayModeInfo(vPckg(), (TBool)a2);
|
|
1192 |
if (KErrNone == r)
|
|
1193 |
Kern::InfoCopy(*(TDes8*)a1,vPckg);
|
|
1194 |
}
|
|
1195 |
break;
|
|
1196 |
|
|
1197 |
case EDisplayHalSpecifiedModeInfo:
|
|
1198 |
{
|
|
1199 |
TPckgBuf<TVideoInfoV01> vPckg;
|
|
1200 |
TInt mode;
|
|
1201 |
kumemget32(&mode, a1, sizeof(mode));
|
|
1202 |
r = GetSpecifiedDisplayModeInfo(mode, vPckg());
|
|
1203 |
if (KErrNone == r)
|
|
1204 |
Kern::InfoCopy(*(TDes8*)a2,vPckg);
|
|
1205 |
}
|
|
1206 |
break;
|
|
1207 |
|
|
1208 |
case EDisplayHalSecure:
|
|
1209 |
kumemput32(a1, &iSecureDisplay, sizeof(TBool));
|
|
1210 |
break;
|
|
1211 |
|
|
1212 |
case EDisplayHalSetSecure:
|
|
1213 |
{
|
|
1214 |
if(!Kern::CurrentThreadHasCapability(ECapabilityMultimediaDD,__PLATSEC_DIAGNOSTIC_STRING("Checked by Hal function EDisplayHalSetSecure")))
|
|
1215 |
return KErrPermissionDenied;
|
|
1216 |
SwitchDisplay((TBool)a1);
|
|
1217 |
}
|
|
1218 |
break;
|
|
1219 |
|
|
1220 |
default:
|
|
1221 |
r=KErrNotSupported;
|
|
1222 |
break;
|
|
1223 |
}
|
|
1224 |
return r;
|
|
1225 |
}
|
|
1226 |
|
|
1227 |
|
|
1228 |
DECLARE_STANDARD_EXTENSION()
|
|
1229 |
{
|
|
1230 |
__KTRACE_OPT(KPOWER,Kern::Printf("Starting LCD power manager"));
|
|
1231 |
|
|
1232 |
// create LCD power handler
|
|
1233 |
TInt r=KErrNoMemory;
|
|
1234 |
DLcdPowerHandler* pH=new DLcdPowerHandler;
|
|
1235 |
if (pH)
|
|
1236 |
r=pH->Create();
|
|
1237 |
|
|
1238 |
__KTRACE_OPT(KPOWER,Kern::Printf("Returns %d",r));
|
|
1239 |
return r;
|
|
1240 |
}
|
|
1241 |
|