brdbootldr/ubootldr/display.cpp
changeset 0 a41df078684a
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     1 // Copyright (c) 1996-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 // bootldr\src\display\display.cpp
       
    15 // 
       
    16 //
       
    17 
       
    18 #define FILE_ID	0x44495350
       
    19 #define DEFINE_COLOURS
       
    20 
       
    21 //
       
    22 // Defining ENABLE_TRANSFER_STATS will display simplistic average and point
       
    23 // transfer rates in bytes per second and provide an estimate of the length of
       
    24 // time remaining.
       
    25 //
       
    26 #define ENABLE_TRANSFER_STATS
       
    27 
       
    28 #include "bootldr.h"
       
    29 #include <videodriver.h>
       
    30 #include <hal.h>
       
    31 
       
    32 TUint8* Screen;
       
    33 TInt Screenwidth, Screenheight;		// screen dimentions in pixels
       
    34 TInt XPos;
       
    35 TInt YPos;
       
    36 TUint Colours;
       
    37 TUint PixelSize = 1;	// size of a pixel in bytes
       
    38 
       
    39 TUint Progress[2];
       
    40 TUint Pixels[2];
       
    41 TUint Limit[2];
       
    42 TUint32 ProgressTime[2];
       
    43 TUint32 StartTime;
       
    44 
       
    45 // Palette entries are in the platform's config.h
       
    46 const TUint16 Palette[16]=	{
       
    47 		KPaletteEntBlack		| KPaletteEntPBS,
       
    48 		KPaletteEntMidBlue,		// 1
       
    49 		KPaletteEntMidGreen,	// 2
       
    50 		KPaletteEntMidCyan,		// 3
       
    51 		KPaletteEntMidRed,		// 4
       
    52 		KPaletteEntMidMagenta,	// 5
       
    53 		KPaletteEntMidYellow,	// 6
       
    54 		KPaletteEntDimWhite,	// 7
       
    55 		KPaletteEntGray,		// 8
       
    56 		KPaletteEntBlue,		// 9
       
    57 		KPaletteEntGreen,		// 10 A
       
    58 		KPaletteEntCyan,		// 11 B
       
    59 		KPaletteEntRed,			// 12 C
       
    60 		KPaletteEntMagenta,		// 13 D
       
    61 		KPaletteEntYellow,		// 14 E
       
    62 		KPaletteEntWhite 		// 15 F
       
    63 		};
       
    64 
       
    65 const TUint KRgbBlack		= 0x000000;
       
    66 //const TUint KRgbDarkGray	= 0x555555;
       
    67 const TUint KRgbDarkRed		= 0x800000;
       
    68 const TUint KRgbDarkGreen	= 0x008000;
       
    69 const TUint KRgbDarkYellow	= 0x808000;
       
    70 const TUint KRgbDarkBlue	= 0x000080;
       
    71 const TUint KRgbDarkMagenta	= 0x800080;
       
    72 const TUint KRgbDarkCyan	= 0x008080;
       
    73 const TUint KRgbRed			= 0xFF0000;
       
    74 //const TUint KRgbGreen		= 0x00FF00;
       
    75 const TUint KRgbYellow		= 0xFFFF00;
       
    76 const TUint KRgbBlue		= 0x0000FF;
       
    77 const TUint KRgbMagenta		= 0xFF00FF;
       
    78 const TUint KRgbCyan		= 0x00FFFF;
       
    79 const TUint KRgbGray		= 0xAAAAAA;
       
    80 const TUint KRgbWhite		= 0xFFFFFF;
       
    81 
       
    82 const TUint KRgbDimWhite    = 0xCCCCCC;
       
    83 
       
    84 const TUint32 Palette32[16] =
       
    85 {
       
    86     KRgbBlack,       // 0
       
    87     KRgbDarkBlue,    // 1
       
    88     KRgbDarkGreen,   // 2
       
    89     KRgbDarkCyan,    // 3
       
    90     KRgbDarkRed,     // 4
       
    91     KRgbDarkMagenta, // 5
       
    92     KRgbDarkYellow,  // 6
       
    93     KRgbDimWhite,    // 7 KRgbDarkGray()
       
    94     KRgbGray,        // 8
       
    95     KRgbBlue,        // 9
       
    96     KRgbDarkGreen,   // 10
       
    97     KRgbCyan,        // 11
       
    98     KRgbRed,         // 12
       
    99     KRgbMagenta,     // 13
       
   100     KRgbYellow,      // 14
       
   101     KRgbWhite        // 15
       
   102 };
       
   103 
       
   104 // KForeground, Kbackground and [I]Pcolour entries are indexes into the palette.
       
   105 // The progress bar colours are of the form "(foreground << 8) | background"
       
   106 const TUint8 KForeground = 15;
       
   107 const TUint8 KBackground = 9;
       
   108 const TUint PColour[2]={ 0xa08, 0xc08 };		//	(10|8) and (12|8)
       
   109 const TUint IPColour[2]={ 0x809, 0x809 };		//	(8|9) and (8|9)
       
   110 
       
   111 #define NUM_FONTS	96
       
   112 #define FONT_HEIGHT	10
       
   113 #define FONT_WIDTH	8
       
   114 
       
   115 #define SCREEN_SIZE			(Screenheight*Screenwidth*PixelSize)			// number of pixels (size in bytes)
       
   116 
       
   117 #define MAX_COLUMN			(Screenwidth/FONT_WIDTH)			// chars per line e.g. 80 or 40
       
   118 #define MAX_ROW				(Screenheight/FONT_HEIGHT)			// lines per screen e.g. 48 or 24
       
   119 #define PROGRESSBAR0_ROW	(MAX_ROW-1)							// row in which to draw progress bar 0
       
   120 #define PROGRESSBAR1_ROW	(MAX_ROW-2)							// row in which to draw progress bar 1
       
   121 #define STATS_ROW			(MAX_ROW-3)							// DEBUGGING row in which to write eta/bps
       
   122 //
       
   123 // ascii character code - 32 == character index into bootldr table
       
   124 //
       
   125 extern const TUint8 Font[NUM_FONTS][FONT_HEIGHT] =
       
   126  	{
       
   127 		{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
       
   128 		{0x30,0x78,0x78,0x78,0x30,0x00,0x30,0x00,0x00,0x00},	//!
       
   129 		{0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
       
   130 		{0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00,0x00,0x00},	//#
       
   131 		{0x30,0x7C,0xC0,0x78,0x0C,0xF8,0x30,0x00,0x00,0x00},	//$
       
   132 		{0x00,0xC6,0xCC,0x18,0x30,0x66,0xC6,0x00,0x00,0x00},
       
   133 		{0x38,0x6C,0x38,0x76,0xDC,0xCC,0x76,0x00,0x00,0x00},
       
   134 		{0x60,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
       
   135 		{0x18,0x30,0x60,0x60,0x60,0x30,0x18,0x00,0x00,0x00},
       
   136 		{0x60,0x30,0x18,0x18,0x18,0x30,0x60,0x00,0x00,0x00},
       
   137 		{0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x00},
       
   138 		{0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00,0x00,0x00},
       
   139 		{0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x60,0x00,0x00},
       
   140 		{0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00},	//-
       
   141 		{0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00},	//.
       
   142 		{0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x00,0x00},	///
       
   143 
       
   144 		{0x7C,0xC6,0xCE,0xDE,0xF6,0xE6,0x7C,0x00,0x00,0x00},	//0
       
   145 		{0x30,0x70,0x30,0x30,0x30,0x30,0xFC,0x00,0x00,0x00},
       
   146 		{0x78,0xCC,0x0C,0x38,0x60,0xCC,0xFC,0x00,0x00,0x00},
       
   147 		{0x78,0xCC,0x0C,0x38,0x0C,0xCC,0x78,0x00,0x00,0x00},
       
   148 		{0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x1E,0x00,0x00,0x00},
       
   149 		{0xFC,0xC0,0xF8,0x0C,0x0C,0xCC,0x78,0x00,0x00,0x00},
       
   150 		{0x38,0x60,0xC0,0xF8,0xCC,0xCC,0x78,0x00,0x00,0x00},
       
   151 		{0xFC,0xCC,0x0C,0x18,0x30,0x30,0x30,0x00,0x00,0x00},
       
   152 		{0x78,0xCC,0xCC,0x78,0xCC,0xCC,0x78,0x00,0x00,0x00},
       
   153 		{0x78,0xCC,0xCC,0x7C,0x0C,0x18,0x70,0x00,0x00,0x00},	//9
       
   154 		{0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x00},	//:
       
   155 		{0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x60,0x00,0x00},	//;
       
   156 		{0x18,0x30,0x60,0xC0,0x60,0x30,0x18,0x00,0x00,0x00},	//<
       
   157 		{0x00,0x00,0xFC,0x00,0x00,0xFC,0x00,0x00,0x00,0x00},	//=
       
   158 		{0x60,0x30,0x18,0x0C,0x18,0x30,0x60,0x00,0x00,0x00},	//>
       
   159 		{0x78,0xCC,0x0C,0x18,0x30,0x00,0x30,0x00,0x00,0x00},	//?
       
   160 
       
   161 		{0x7C,0xC6,0xDE,0xDE,0xDE,0xC0,0x78,0x00,0x00,0x00},	//@
       
   162 		{0x30,0x78,0xCC,0xCC,0xFC,0xCC,0xCC,0x00,0x00,0x00},	//A
       
   163 		{0xFC,0x66,0x66,0x7C,0x66,0x66,0xFC,0x00,0x00,0x00},	//B
       
   164 		{0x3C,0x66,0xC0,0xC0,0xC0,0x66,0x3C,0x00,0x00,0x00},	//C
       
   165 		{0xF8,0x6C,0x66,0x66,0x66,0x6C,0xF8,0x00,0x00,0x00},	//D
       
   166 		{0x7E,0x60,0x60,0x78,0x60,0x60,0x7E,0x00,0x00,0x00},	//E
       
   167 		{0x7E,0x60,0x60,0x78,0x60,0x60,0x60,0x00,0x00,0x00},	//F
       
   168 		{0x3C,0x66,0xC0,0xC0,0xCE,0x66,0x3E,0x00,0x00,0x00},	//G
       
   169 		{0xCC,0xCC,0xCC,0xFC,0xCC,0xCC,0xCC,0x00,0x00,0x00},	//H
       
   170 		{0x78,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00},	//I
       
   171 		{0x1E,0x0C,0x0C,0x0C,0xCC,0xCC,0x78,0x00,0x00,0x00},	//J
       
   172 		{0xE6,0x66,0x6C,0x78,0x6C,0x66,0xE6,0x00,0x00,0x00},	//K
       
   173 		{0x60,0x60,0x60,0x60,0x60,0x60,0x7E,0x00,0x00,0x00},	//L
       
   174 		{0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0x00,0x00,0x00},	//M
       
   175 		{0xC6,0xE6,0xF6,0xDE,0xCE,0xC6,0xC6,0x00,0x00,0x00},	//N
       
   176 		{0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00},	//O
       
   177 
       
   178 		{0xFC,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00,0x00,0x00},	//P
       
   179 		{0x78,0xCC,0xCC,0xCC,0xDC,0x78,0x1C,0x00,0x00,0x00},	//Q
       
   180 		{0xFC,0x66,0x66,0x7C,0x6C,0x66,0xE6,0x00,0x00,0x00},	//R
       
   181 		{0x78,0xCC,0xE0,0x70,0x1C,0xCC,0x78,0x00,0x00,0x00},	//S
       
   182 		{0xFC,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00},	//T
       
   183 		{0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xFC,0x00,0x00,0x00},	//U
       
   184 		{0xCC,0xCC,0xCC,0xCC,0xCC,0x78,0x30,0x00,0x00,0x00},	//V
       
   185 		{0xC6,0xC6,0xC6,0xD6,0xFE,0xEE,0xC6,0x00,0x00,0x00},	//W
       
   186 		{0xC6,0xC6,0x6C,0x38,0x38,0x6C,0xC6,0x00,0x00,0x00},	//X
       
   187 		{0xCC,0xCC,0xCC,0x78,0x30,0x30,0x78,0x00,0x00,0x00},	//Y
       
   188 		{0xFE,0x06,0x0C,0x18,0x30,0x60,0xFE,0x00,0x00,0x00},	//Z
       
   189 		{0x78,0x60,0x60,0x60,0x60,0x60,0x78,0x00,0x00,0x00},
       
   190 		{0xC0,0x60,0x30,0x18,0x0C,0x06,0x02,0x00,0x00,0x00},
       
   191 		{0x78,0x18,0x18,0x18,0x18,0x18,0x78,0x00,0x00,0x00},
       
   192 		{0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00},
       
   193 		{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00},
       
   194 
       
   195 		{0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
       
   196 		{0x00,0x00,0x78,0x0C,0x7C,0xCC,0x76,0x00,0x00,0x00},
       
   197 		{0xE0,0x60,0x60,0x7C,0x66,0x66,0xDC,0x00,0x00,0x00},
       
   198 		{0x00,0x00,0x78,0xCC,0xC0,0xCC,0x78,0x00,0x00,0x00},
       
   199 		{0x1C,0x0C,0x0C,0x7C,0xCC,0xCC,0x76,0x00,0x00,0x00},
       
   200 		{0x00,0x00,0x78,0xCC,0xFC,0xC0,0x78,0x00,0x00,0x00},
       
   201 		{0x38,0x6C,0x60,0xF0,0x60,0x60,0xF0,0x00,0x00,0x00},
       
   202 		{0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0xF8,0x00,0x00},
       
   203 		{0xE0,0x60,0x6C,0x76,0x66,0x66,0xE6,0x00,0x00,0x00},
       
   204 		{0x30,0x00,0x70,0x30,0x30,0x30,0x78,0x00,0x00,0x00},
       
   205 		{0x0C,0x00,0x0C,0x0C,0x0C,0xCC,0xCC,0x78,0x00,0x00},
       
   206 		{0xE0,0x60,0x66,0x6C,0x78,0x6C,0xE6,0x00,0x00,0x00},
       
   207 		{0x70,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00},
       
   208 		{0x00,0x00,0xCC,0xFE,0xFE,0xD6,0xC6,0x00,0x00,0x00},
       
   209 		{0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xCC,0x00,0x00,0x00},
       
   210 		{0x00,0x00,0x78,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00},
       
   211 
       
   212 		{0x00,0x00,0xDC,0x66,0x66,0x7C,0x60,0xF0,0x00,0x00},
       
   213 		{0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0x1E,0x00,0x00},
       
   214 		{0x00,0x00,0xDC,0x76,0x66,0x60,0xF0,0x00,0x00,0x00},
       
   215 		{0x00,0x00,0x7C,0xC0,0x78,0x0C,0xF8,0x00,0x00,0x00},
       
   216 		{0x10,0x30,0x7C,0x30,0x30,0x34,0x18,0x00,0x00,0x00},
       
   217 		{0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00},
       
   218 		{0x00,0x00,0xCC,0xCC,0xCC,0x78,0x30,0x00,0x00,0x00},
       
   219 		{0x00,0x00,0xC6,0xD6,0xFE,0xFE,0x6C,0x00,0x00,0x00},
       
   220 		{0x00,0x00,0xC6,0x6C,0x38,0x6C,0xC6,0x00,0x00,0x00},
       
   221 		{0x00,0x00,0xCC,0xCC,0xCC,0x7C,0x0C,0xF8,0x00,0x00},
       
   222 		{0x00,0x00,0xFC,0x98,0x30,0x64,0xFC,0x00,0x00,0x00},
       
   223 		{0x1C,0x30,0x30,0xE0,0x30,0x30,0x1C,0x00,0x00,0x00},
       
   224 		{0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x00,0x00,0x00},
       
   225 		{0xE0,0x30,0x30,0x1C,0x30,0x30,0xE0,0x00,0x00,0x00},
       
   226 		{0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
       
   227 		{0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00},
       
   228 	};
       
   229 
       
   230 inline void ColourPixel(TInt aXPos, TInt aYPos, TUint aColour)
       
   231 /**
       
   232 colour a pixel on the screen
       
   233 @param aXPos	pixel's X coordinate
       
   234 @param aYPos	pixel's Y coordinate
       
   235 @param aColour	chosen colour specified as a palette index
       
   236 */
       
   237 {
       
   238 	TUint8* pV = (TUint8*)Screen + (aYPos * (Screenwidth * PixelSize)) + (aXPos * PixelSize);
       
   239 
       
   240 	switch(PixelSize)
       
   241 		{
       
   242 		case 4:
       
   243 			*(TUint32*)pV = Palette32[aColour];
       
   244 			break;
       
   245 		case 2:
       
   246 			*pV++ = Palette[aColour] & 0xFF ;
       
   247 			*pV = Palette[aColour] >> 8 ;
       
   248 			break;
       
   249 		case 1:
       
   250 			*pV = aColour;
       
   251 			break;
       
   252 		default:
       
   253 			// Kern::Fault("BOOTLDR colourpixel: Unsupported bpp", PixelSize);
       
   254 			BOOT_FAULT();
       
   255 		}
       
   256 }
       
   257 
       
   258 #ifndef USE_ASM_DISPLAYCHAR
       
   259 void DisplayChar(TInt aChar, TInt aXPos, TInt aYPos, TUint aColours)
       
   260 /**
       
   261 Write a character to the framebuffer
       
   262 @param aChar	Character to draw
       
   263 @param aXPos	Character's column
       
   264 @param aYPos	Character's row
       
   265 @param aColour	Palette index specified (foreground << 8| background)
       
   266 */
       
   267 	{
       
   268 	// Convert the ascii value into an index for the Font table
       
   269 	TInt tmpChar = aChar - 32;
       
   270 
       
   271 	// Validate this is a valid font index
       
   272 	if (tmpChar < 0 || tmpChar >= NUM_FONTS)
       
   273 		return;
       
   274 
       
   275 	// Validate coordinates lie within range.
       
   276 	if (aXPos > MAX_COLUMN-1 || aYPos > MAX_ROW-1)
       
   277 		return;
       
   278 
       
   279 	// for each line of the font
       
   280 	for (TUint line=0 ; line < FONT_HEIGHT ; line++)
       
   281 		{
       
   282 		TUint8 tmpLine = Font[tmpChar][line];
       
   283 		TUint8 tmpMask = 0x80;
       
   284 		// for each pixel of the line
       
   285 		for (TUint pixel=0 ; pixel < FONT_WIDTH ; pixel++)
       
   286 			{
       
   287 			ColourPixel(aXPos * FONT_WIDTH + pixel,
       
   288 						aYPos * FONT_HEIGHT + line,
       
   289 						(tmpLine & tmpMask) ? aColours >> 8 : aColours & 0xFF);
       
   290 
       
   291 			// Shift the mask one bit downward to examine the next pixel
       
   292 			tmpMask = tmpMask >> 1;
       
   293 			}
       
   294 		}
       
   295 
       
   296 	return;
       
   297 	}
       
   298 #endif
       
   299 
       
   300 
       
   301 GLDEF_C void ClearScreen()
       
   302 /**
       
   303 Set all the pixels on the screen to the background
       
   304 */
       
   305 	{
       
   306 	for (TInt y = 0 ; y<Screenheight ; y++)
       
   307 		for (TInt x = 0 ; x<Screenwidth ; x++)
       
   308 			ColourPixel(x, y, KBackground);
       
   309 
       
   310 	XPos=0;
       
   311 	YPos=0;
       
   312 	Colours=(KForeground<<8)|KBackground;
       
   313 	}
       
   314 
       
   315 void ScrollScreen()
       
   316 /**
       
   317 Move all the pixels in the scrolling text area up one line and fill the
       
   318 last line with the background colour
       
   319 */
       
   320 	{
       
   321 	TUint8* pV=Screen;
       
   322 	wordmove(pV, pV+(Screenwidth*PixelSize*FONT_HEIGHT), (Screenwidth*PixelSize*(Screenheight-(2*FONT_HEIGHT))-(Screenwidth*PixelSize*FONT_HEIGHT)));
       
   323 	pV+=(Screenwidth*PixelSize*(Screenheight-(2*FONT_HEIGHT))-(Screenwidth*PixelSize*FONT_HEIGHT));
       
   324 
       
   325 	TInt StartLine = (Screenheight-(4*FONT_HEIGHT));
       
   326 	for (TInt y = StartLine ; y<(StartLine+FONT_HEIGHT) ; y++)
       
   327 		for (TInt x = 0 ; x<Screenwidth ; x++)
       
   328 			ColourPixel(x, y, KBackground);
       
   329 	}
       
   330 
       
   331 void ScrollScreenDown()
       
   332 /**
       
   333 Move all the pixels in the scrolling text area down one line and fill the
       
   334 first line with the background colour
       
   335 */
       
   336 	{
       
   337 	TUint8* pV=Screen;
       
   338 	wordmove(pV+(Screenwidth*PixelSize*FONT_HEIGHT), pV, (Screenwidth*PixelSize*(Screenheight-(2*FONT_HEIGHT))-(Screenwidth*PixelSize*FONT_HEIGHT)));
       
   339 
       
   340 	for (TInt y = 0 ; y<FONT_HEIGHT ; y++)
       
   341 		for (TInt x = 0 ; x<Screenwidth ; x++)
       
   342 			ColourPixel(x, y, KBackground);
       
   343 
       
   344 	}
       
   345 
       
   346 void CurDown()
       
   347 /**
       
   348 Move the cursor down the screen, scrolling the text area if necessary
       
   349 */
       
   350 	{
       
   351 	if (++YPos==(MAX_ROW-3))
       
   352 		{
       
   353 		YPos=(MAX_ROW-4);
       
   354 		ScrollScreen();
       
   355 		}
       
   356 	}
       
   357 
       
   358 void CurUp()
       
   359 /**
       
   360 Move the cursor up the screen, scrolling the text area if necessary
       
   361 */
       
   362 	{
       
   363 	if (--YPos<0)
       
   364 		{
       
   365 		YPos=0;
       
   366 		ScrollScreenDown();
       
   367 		}
       
   368 	}
       
   369 
       
   370 void CurRight()
       
   371 /**
       
   372 Move the cursor along the screen, scrolling the text area if necessary
       
   373 */
       
   374 	{
       
   375 	if (++XPos==MAX_COLUMN)
       
   376 		{
       
   377 		XPos=0;
       
   378 		CurDown();
       
   379 		}
       
   380 	}
       
   381 
       
   382 void CurLeft()
       
   383 /**
       
   384 Move the cursor backwards along the screen, scrolling the text area if necessary
       
   385 */
       
   386 	{
       
   387 	if (--XPos<0)
       
   388 		{
       
   389 		XPos=MAX_COLUMN-1;
       
   390 		CurUp();
       
   391 		}
       
   392 	}
       
   393 
       
   394 void SetPos(TInt X, TInt Y)
       
   395 /**
       
   396 Set the cursor to a point on the screen
       
   397 @param X	Character's column
       
   398 @param Y	Character's row
       
   399 */
       
   400 	{
       
   401 	XPos=X;
       
   402 	YPos=Y;
       
   403 	}
       
   404 
       
   405 void PutChar(TUint aChar)
       
   406 /**
       
   407 Write a character to the screen then moves the cursor to the next position,
       
   408 scrolling the screen if necessary
       
   409 @param aChar	Character to write
       
   410 */
       
   411 	{
       
   412 	switch (aChar)
       
   413 		{
       
   414 		case 0x08: CurLeft(); return;		// BS '\b'
       
   415 		case 0x09: CurRight(); return;		// HT '\t'
       
   416 		case 0x0a: CurDown(); return;		// LF '\n'
       
   417 		case 0x0b: CurUp(); return;			// VT '\v'
       
   418 		case 0x0c: ClearScreen(); return;	// FF '\f'
       
   419 		case 0x0d: XPos=0; return;			// CR '\r'
       
   420 		default: break;
       
   421 		}
       
   422 	DisplayChar(aChar,XPos,YPos,Colours);
       
   423 	if (++XPos==MAX_COLUMN)					// chars per line
       
   424 		{
       
   425 		XPos=0;
       
   426 		if (++YPos==(MAX_ROW-3))	// lines per screen - 3 for progress bars & stats
       
   427 			{
       
   428 			YPos=(MAX_ROW-4);		// lines per screen - 4
       
   429 			ScrollScreen();
       
   430 			}
       
   431 		}
       
   432 	}
       
   433 
       
   434 GLDEF_C void PrintToScreen(TRefByValue<const TDesC> aFmt, ...)
       
   435 	{
       
   436 	VA_LIST list;
       
   437 	VA_START(list,aFmt);
       
   438 
       
   439 	TBuf<0x100> aBuf;
       
   440 	aBuf.AppendFormatList(aFmt,list);
       
   441 	PutString(aBuf);
       
   442 	//RDebug::RawPrint(aBuf);
       
   443 	}
       
   444 
       
   445 void PutString(const TDesC& aBuf)
       
   446 /**
       
   447 For each character in the given string write it to the screen
       
   448 @param aString	String of characters to write
       
   449 */
       
   450 	{
       
   451 	const TText* pS=aBuf.Ptr();
       
   452 	const TText* pE=pS+aBuf.Length();
       
   453 	if (pS!=pE)
       
   454 		{
       
   455 		while (pS<pE)
       
   456 			PutChar(*pS++);
       
   457 		}
       
   458 	}
       
   459 
       
   460 GLDEF_C void InitProgressBar(TInt aId, TUint aLimit, const TDesC& aBuf)
       
   461 /**
       
   462 Initialise a progress bar, writes a label and sets the pixels to the
       
   463 background colour
       
   464 @param aId		configure Bar0 or Bar1
       
   465 @param aLimit	Sets the upper bound of the value given to Update
       
   466 @param aTitle	Label to place before the progress bar (7 characters wide)
       
   467 */
       
   468 	{
       
   469 	const TText* aTitle=aBuf.Ptr();
       
   470 	TInt line=aId ? PROGRESSBAR0_ROW : PROGRESSBAR1_ROW;
       
   471 	Progress[aId]=0;
       
   472 	if (aId==0)
       
   473 			StartTime=0;
       
   474 
       
   475 	Pixels[aId]=0;
       
   476 	Limit[aId]=aLimit;
       
   477 	char c;
       
   478 	TInt x=0;
       
   479 	while ((c=*aTitle++)!=0 && x<7)
       
   480 		{
       
   481 		DisplayChar(c,x,line,Colours);
       
   482 		++x;
       
   483 		}
       
   484 	if (x<7)
       
   485 		x=7;
       
   486 	for (; x<(MAX_COLUMN-1); ++x)
       
   487 		DisplayChar(0x7f,x,line,IPColour[aId]);
       
   488 	}
       
   489 
       
   490 GLDEF_C void UpdateProgressBar(TInt aId, TUint aProgress)
       
   491 /**
       
   492 Update a progress bar filling in the bar to a new position
       
   493 If ENABLE_TRANSFER_STATS has been defined at build time the function will
       
   494 generate some simple statistics.
       
   495 @param aId			update Bar0 or Bar1
       
   496 @param aProgress	The point value between 0 and the given aLimit
       
   497 */
       
   498 	{
       
   499 	TInt line=aId ? PROGRESSBAR0_ROW : PROGRESSBAR1_ROW;
       
   500 	TUint old_pixels=Pixels[aId];
       
   501 
       
   502 #ifdef ENABLE_TRANSFER_STATS
       
   503 	// turn this on and get a few statistics as it loads
       
   504 	if (aId==0) {
       
   505 			if (StartTime == 0) {
       
   506 					StartTime = User::NTickCount();
       
   507 					ProgressTime[aId] = StartTime;
       
   508 			}
       
   509 			TUint avg_bps=0, bps=0, eta=0;
       
   510 			TUint32 timenow = User::NTickCount();
       
   511 			TUint32 delta_time = timenow - ProgressTime[aId];
       
   512 			ProgressTime[aId] = timenow;
       
   513 			if (delta_time) {
       
   514 					bps = ((aProgress - Progress[aId]) * 1000) / delta_time;		// delta bytes / delta milliseconds
       
   515 
       
   516 					delta_time = (timenow - StartTime);					// milliseconds since started
       
   517 					if (delta_time) {
       
   518 							avg_bps = ((TUint64)aProgress  * 1000) / delta_time;
       
   519 							eta = (Limit[aId] - aProgress) / avg_bps;
       
   520 					}
       
   521 			}
       
   522 
       
   523 			TInt savedXPos=XPos, savedYPos=YPos;
       
   524 			XPos=0;
       
   525 			YPos=STATS_ROW;
       
   526 //			Printf("C/s avg: %7d point: %7d ETA: %d    ", avg_bps, bps, eta);
       
   527 			PrintToScreen(_L("point: %7d ETA: %d    "), bps, eta);
       
   528 			XPos=savedXPos;
       
   529 			YPos=savedYPos;
       
   530 	}
       
   531 #endif
       
   532 
       
   533 	Progress[aId]=aProgress;
       
   534 	Int64 prog64=aProgress;
       
   535 	prog64*=(Screenwidth - (8*FONT_WIDTH));		// screenwidth in pixels - 8 characters
       
   536 	prog64/=Limit[aId];
       
   537 	TUint pixels=(TUint)prog64;
       
   538 	if (pixels>old_pixels)
       
   539 		{
       
   540 		Pixels[aId]=pixels;
       
   541 
       
   542 		while (old_pixels<pixels)
       
   543 			{
       
   544 			for (TInt i=0; i<6; ++i)
       
   545 				ColourPixel( old_pixels + (7*FONT_WIDTH), (line * FONT_HEIGHT) + 2 + i  , (PColour[aId]>>8));
       
   546 
       
   547 			++old_pixels;
       
   548 			}
       
   549 		}
       
   550 	}
       
   551 
       
   552 void InitDisplay()
       
   553 /**
       
   554 Reads the properties of the screen from the HAL and configures the settings so
       
   555 this driver can colour in pixels.
       
   556 */
       
   557     {
       
   558 	TInt iDisplayMode;
       
   559 	TInt iScreenAddress;
       
   560 	TInt iBitsPerPixel;
       
   561 	TInt iIsPalettized;
       
   562 	TInt offset;
       
   563 
       
   564 	HAL::Get(HAL::EDisplayMode, iDisplayMode);
       
   565 	iBitsPerPixel = iDisplayMode; //getbpp needs the current mode as its param
       
   566 	HAL::Get(HAL::EDisplayBitsPerPixel, iBitsPerPixel);	
       
   567 
       
   568 	iIsPalettized = iDisplayMode; //ispalettized needs the current mode as its param
       
   569 	HAL::Get(HAL::EDisplayIsPalettized, iIsPalettized);	
       
   570 
       
   571 	HAL::Get(HAL::EDisplayMemoryAddress, iScreenAddress);
       
   572 	
       
   573 	offset = iDisplayMode;
       
   574 	HAL::Get(HAL::EDisplayOffsetToFirstPixel, offset);
       
   575 	iScreenAddress += offset;
       
   576 
       
   577 	// get the dimentions of the screen
       
   578 	HAL::Get(HAL::EDisplayXPixels, Screenwidth);
       
   579 	HAL::Get(HAL::EDisplayYPixels, Screenheight);
       
   580 	
       
   581 	Screen = (TUint8 *)iScreenAddress;
       
   582 
       
   583 #if 0
       
   584 	RDebug::Printf("EDisplayMode %d", iDisplayMode);
       
   585 	RDebug::Printf("EDisplayBitsPerPixel %d", iBitsPerPixel);
       
   586 	RDebug::Printf("EDisplayIsPalettized %d", iIsPalettized);
       
   587 	RDebug::Printf("EDisplayMemoryAddress 0x%x (after offset)", iScreenAddress);
       
   588 	RDebug::Printf("EDisplayOffsetToFirstPixel  %d",offset);
       
   589 	RDebug::Printf("EDisplayXPixels  %d",Screenwidth);
       
   590 	RDebug::Printf("EDisplayYPixels  %d", Screenheight);
       
   591 #endif
       
   592 	
       
   593 	// get the bits per pixel to work out the size
       
   594 	if (iBitsPerPixel == 32)
       
   595 		{
       
   596 		PixelSize = 4;
       
   597 		}
       
   598 	else if (iBitsPerPixel == 16)
       
   599 		{
       
   600 		PixelSize = 2;
       
   601 		}
       
   602 	else if (iBitsPerPixel == 8)
       
   603 		{
       
   604 #if 0
       
   605 		// derive where the palette is located - assumes when no offset to first
       
   606 		// pixel the palette is at end of framebuffer.
       
   607 		TUint8* pV;
       
   608 		if(vidBuf().iOffsetToFirstPixel)
       
   609 			pV=(TUint8*)(vidBuf().iVideoAddress);
       
   610 		else
       
   611 			pV=(TUint8*)(vidBuf().iVideoAddress)+SCREEN_SIZE;
       
   612 
       
   613 		// Kern::Printf("Screenbuffer 0x%x palette 0x%x (%dx%d)",Screen,pV,Screenwidth,Screenheight);
       
   614 		PixelSize = 1;
       
   615 		memcpy(pV,Palette,32);
       
   616 #endif
       
   617 		}
       
   618 	else
       
   619 		{
       
   620 		RDebug::Printf("BOOTLDR display: Unsupported bpp %d",iBitsPerPixel);
       
   621 		BOOT_FAULT();
       
   622 		}
       
   623 
       
   624 	ClearScreen();
       
   625 	}