@ -168,6 +168,11 @@ CONFIG_VIDEO_HW_CURSOR: - Uses the hardware cursor capability of the
# endif
# if (CONFIG_COMMANDS & CFG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN)
# include <watchdog.h>
# include <bmp_layout.h>
# endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) || CONFIG_SPLASH_SCREEN */
/*****************************************************************************/
/* Cursor definition: */
/* CONFIG_CONSOLE_CURSOR: Uses a timer function (see drivers/i8042.c) to */
@ -367,7 +372,6 @@ static const int video_font_draw_table32[16][4] = {
/******************************************************************************/
static void video_drawchars ( int xx , int yy , unsigned char * s , int count )
{
u8 * cdat , * dest , * dest0 ;
@ -376,19 +380,19 @@ static void video_drawchars (int xx, int yy, unsigned char *s, int count)
offset = yy * VIDEO_LINE_LEN + xx * VIDEO_PIXEL_SIZE ;
dest0 = video_fb_address + offset ;
switch ( VIDEO_DATA_FORMAT )
{
switch ( VIDEO_DATA_FORMAT ) {
case GDF__8BIT_INDEX :
case GDF__8BIT_332RGB :
while ( count - - )
{
c = * s ;
while ( count - - ) {
c = * s ;
cdat = video_fontdata + c * VIDEO_FONT_HEIGHT ;
for ( rows = VIDEO_FONT_HEIGHT , dest = dest0 ; rows - - ; dest + = VIDEO_LINE_LEN )
{
for ( rows = VIDEO_FONT_HEIGHT , dest = dest0 ;
rows - - ;
dest + = VIDEO_LINE_LEN ) {
u8 bits = * cdat + + ;
( ( u32 * ) dest ) [ 0 ] = ( video_font_draw_table8 [ bits > > 4 ] & eorx ) ^ bgx ;
( ( u32 * ) dest ) [ 1 ] = ( video_font_draw_table8 [ bits & 15 ] & eorx ) ^ bgx ;
( ( u32 * ) dest ) [ 0 ] = ( video_font_draw_table8 [ bits > > 4 ] & eorx ) ^ bgx ;
( ( u32 * ) dest ) [ 1 ] = ( video_font_draw_table8 [ bits & 15 ] & eorx ) ^ bgx ;
}
dest0 + = VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE ;
s + + ;
@ -396,80 +400,84 @@ static void video_drawchars (int xx, int yy, unsigned char *s, int count)
break ;
case GDF_15BIT_555RGB :
while ( count - - )
{
c = * s ;
while ( count - - ) {
c = * s ;
cdat = video_fontdata + c * VIDEO_FONT_HEIGHT ;
for ( rows = VIDEO_FONT_HEIGHT , dest = dest0 ; rows - - ; dest + = VIDEO_LINE_LEN )
{
for ( rows = VIDEO_FONT_HEIGHT , dest = dest0 ;
rows - - ;
dest + = VIDEO_LINE_LEN ) {
u8 bits = * cdat + + ;
( ( u32 * ) dest ) [ 0 ] = SHORTSWAP32 ( ( video_font_draw_table15 [ bits > > 6 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 1 ] = SHORTSWAP32 ( ( video_font_draw_table15 [ bits > > 4 & 3 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 2 ] = SHORTSWAP32 ( ( video_font_draw_table15 [ bits > > 2 & 3 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 3 ] = SHORTSWAP32 ( ( video_font_draw_table15 [ bits & 3 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 0 ] = SHORTSWAP32 ( ( video_font_draw_table15 [ bits > > 6 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 1 ] = SHORTSWAP32 ( ( video_font_draw_table15 [ bits > > 4 & 3 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 2 ] = SHORTSWAP32 ( ( video_font_draw_table15 [ bits > > 2 & 3 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 3 ] = SHORTSWAP32 ( ( video_font_draw_table15 [ bits & 3 ] & eorx ) ^ bgx ) ;
}
dest0 + = VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE ;
s + + ;
s + + ;
}
break ;
case GDF_16BIT_565RGB :
while ( count - - )
{
c = * s ;
while ( count - - ) {
c = * s ;
cdat = video_fontdata + c * VIDEO_FONT_HEIGHT ;
for ( rows = VIDEO_FONT_HEIGHT , dest = dest0 ; rows - - ; dest + = VIDEO_LINE_LEN )
{
for ( rows = VIDEO_FONT_HEIGHT , dest = dest0 ;
rows - - ;
dest + = VIDEO_LINE_LEN ) {
u8 bits = * cdat + + ;
( ( u32 * ) dest ) [ 0 ] = SHORTSWAP32 ( ( video_font_draw_table16 [ bits > > 6 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 1 ] = SHORTSWAP32 ( ( video_font_draw_table16 [ bits > > 4 & 3 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 2 ] = SHORTSWAP32 ( ( video_font_draw_table16 [ bits > > 2 & 3 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 3 ] = SHORTSWAP32 ( ( video_font_draw_table16 [ bits & 3 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 0 ] = SHORTSWAP32 ( ( video_font_draw_table16 [ bits > > 6 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 1 ] = SHORTSWAP32 ( ( video_font_draw_table16 [ bits > > 4 & 3 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 2 ] = SHORTSWAP32 ( ( video_font_draw_table16 [ bits > > 2 & 3 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 3 ] = SHORTSWAP32 ( ( video_font_draw_table16 [ bits & 3 ] & eorx ) ^ bgx ) ;
}
dest0 + = VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE ;
s + + ;
s + + ;
}
break ;
case GDF_32BIT_X888RGB :
while ( count - - )
{
c = * s ;
while ( count - - ) {
c = * s ;
cdat = video_fontdata + c * VIDEO_FONT_HEIGHT ;
for ( rows = VIDEO_FONT_HEIGHT , dest = dest0 ; rows - - ; dest + = VIDEO_LINE_LEN )
{
for ( rows = VIDEO_FONT_HEIGHT , dest = dest0 ;
rows - - ;
dest + = VIDEO_LINE_LEN ) {
u8 bits = * cdat + + ;
( ( u32 * ) dest ) [ 0 ] = SWAP32 ( ( video_font_draw_table32 [ bits > > 4 ] [ 0 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 1 ] = SWAP32 ( ( video_font_draw_table32 [ bits > > 4 ] [ 1 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 2 ] = SWAP32 ( ( video_font_draw_table32 [ bits > > 4 ] [ 2 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 3 ] = SWAP32 ( ( video_font_draw_table32 [ bits > > 4 ] [ 3 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 4 ] = SWAP32 ( ( video_font_draw_table32 [ bits & 15 ] [ 0 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 5 ] = SWAP32 ( ( video_font_draw_table32 [ bits & 15 ] [ 1 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 6 ] = SWAP32 ( ( video_font_draw_table32 [ bits & 15 ] [ 2 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 7 ] = SWAP32 ( ( video_font_draw_table32 [ bits & 15 ] [ 3 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 0 ] = SWAP32 ( ( video_font_draw_table32 [ bits > > 4 ] [ 0 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 1 ] = SWAP32 ( ( video_font_draw_table32 [ bits > > 4 ] [ 1 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 2 ] = SWAP32 ( ( video_font_draw_table32 [ bits > > 4 ] [ 2 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 3 ] = SWAP32 ( ( video_font_draw_table32 [ bits > > 4 ] [ 3 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 4 ] = SWAP32 ( ( video_font_draw_table32 [ bits & 15 ] [ 0 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 5 ] = SWAP32 ( ( video_font_draw_table32 [ bits & 15 ] [ 1 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 6 ] = SWAP32 ( ( video_font_draw_table32 [ bits & 15 ] [ 2 ] & eorx ) ^ bgx ) ;
( ( u32 * ) dest ) [ 7 ] = SWAP32 ( ( video_font_draw_table32 [ bits & 15 ] [ 3 ] & eorx ) ^ bgx ) ;
}
dest0 + = VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE ;
s + + ;
s + + ;
}
break ;
case GDF_24BIT_888RGB :
while ( count - - )
{
c = * s ;
while ( count - - ) {
c = * s ;
cdat = video_fontdata + c * VIDEO_FONT_HEIGHT ;
for ( rows = VIDEO_FONT_HEIGHT , dest = dest0 ; rows - - ; dest + = VIDEO_LINE_LEN )
{
for ( rows = VIDEO_FONT_HEIGHT , dest = dest0 ;
rows - - ;
dest + = VIDEO_LINE_LEN ) {
u8 bits = * cdat + + ;
( ( u32 * ) dest ) [ 0 ] = ( video_font_draw_table24 [ bits > > 4 ] [ 0 ] & eorx ) ^ bgx ;
( ( u32 * ) dest ) [ 1 ] = ( video_font_draw_table24 [ bits > > 4 ] [ 1 ] & eorx ) ^ bgx ;
( ( u32 * ) dest ) [ 2 ] = ( video_font_draw_table24 [ bits > > 4 ] [ 2 ] & eorx ) ^ bgx ;
( ( u32 * ) dest ) [ 3 ] = ( video_font_draw_table24 [ bits & 15 ] [ 0 ] & eorx ) ^ bgx ;
( ( u32 * ) dest ) [ 4 ] = ( video_font_draw_table24 [ bits & 15 ] [ 1 ] & eorx ) ^ bgx ;
( ( u32 * ) dest ) [ 5 ] = ( video_font_draw_table24 [ bits & 15 ] [ 2 ] & eorx ) ^ bgx ;
( ( u32 * ) dest ) [ 0 ] = ( video_font_draw_table24 [ bits > > 4 ] [ 0 ] & eorx ) ^ bgx ;
( ( u32 * ) dest ) [ 1 ] = ( video_font_draw_table24 [ bits > > 4 ] [ 1 ] & eorx ) ^ bgx ;
( ( u32 * ) dest ) [ 2 ] = ( video_font_draw_table24 [ bits > > 4 ] [ 2 ] & eorx ) ^ bgx ;
( ( u32 * ) dest ) [ 3 ] = ( video_font_draw_table24 [ bits & 15 ] [ 0 ] & eorx ) ^ bgx ;
( ( u32 * ) dest ) [ 4 ] = ( video_font_draw_table24 [ bits & 15 ] [ 1 ] & eorx ) ^ bgx ;
( ( u32 * ) dest ) [ 5 ] = ( video_font_draw_table24 [ bits & 15 ] [ 2 ] & eorx ) ^ bgx ;
}
dest0 + = VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE ;
s + + ;
s + + ;
}
break ;
}
@ -477,21 +485,21 @@ static void video_drawchars (int xx, int yy, unsigned char *s, int count)
/*****************************************************************************/
static inline void video_drawstring ( int xx , int yy , unsigned char * s )
static inline void video_drawstring ( int xx , int yy , unsigned char * s )
{
video_drawchars ( xx , yy , s , strlen ( s ) ) ;
video_drawchars ( xx , yy , s , strlen ( s ) ) ;
}
/*****************************************************************************/
static void video_putchar ( int xx , int yy , unsigned char c )
static void video_putchar ( int xx , int yy , unsigned char c )
{
video_drawchars ( xx , yy + VIDEO_LOGO_HEIGHT , & c , 1 ) ;
}
/*****************************************************************************/
# if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR)
static void video_set_cursor ( void )
static void video_set_cursor ( void )
{
/* swap drawing colors */
eorx = fgx ;
@ -500,7 +508,8 @@ static void video_set_cursor(void)
eorx = fgx ^ bgx ;
/* draw cursor */
video_putchar ( console_col * VIDEO_FONT_WIDTH ,
console_row * VIDEO_FONT_HEIGHT , ' ' ) ;
console_row * VIDEO_FONT_HEIGHT ,
' ' ) ;
/* restore drawing colors */
eorx = fgx ;
fgx = bgx ;
@ -513,35 +522,36 @@ static void video_set_cursor(void)
void console_cursor ( int state )
{
static int last_state = 0 ;
# ifdef CONFIG_CONSOLE_TIME
struct rtc_time tm ;
char info [ 16 ] ;
/* time update only if cursor is on (faster scroll) */
if ( state )
{
if ( state ) {
rtc_get ( & tm ) ;
sprintf ( info , " %02d:%02d:%02d " , tm . tm_hour , tm . tm_min , tm . tm_sec ) ;
video_drawstring ( VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH ,
sprintf ( info , " %02d:%02d:%02d " , tm . tm_hour , tm . tm_min ,
tm . tm_sec ) ;
video_drawstring ( VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH ,
VIDEO_INFO_Y , info ) ;
sprintf ( info , " %02d.%02d.%04d " , tm . tm_mday , tm . tm_mon , tm . tm_year ) ;
video_drawstring ( VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH ,
VIDEO_INFO_Y + 1 * VIDEO_FONT_HEIGHT , info ) ;
sprintf ( info , " %02d.%02d.%04d " , tm . tm_mday , tm . tm_mon ,
tm . tm_year ) ;
video_drawstring ( VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH ,
VIDEO_INFO_Y + 1 * VIDEO_FONT_HEIGHT , info ) ;
}
# endif
if ( state & & ( last_state ! = state ) )
{
video_set_cursor ( ) ;
if ( state & & ( last_state ! = state ) ) {
video_set_cursor ( ) ;
}
if ( ! state & & ( last_state ! = state ) )
{
if ( ! state & & ( last_state ! = state ) ) {
/* clear cursor */
video_putchar ( console_col * VIDEO_FONT_WIDTH ,
console_row * VIDEO_FONT_HEIGHT , ' ' ) ;
console_row * VIDEO_FONT_HEIGHT ,
' ' ) ;
}
last_state = state ;
@ -575,8 +585,7 @@ static void console_scrollup (void)
/* copy up rows ignoring the first one */
# ifdef VIDEO_HW_BITBLT
video_hw_bitblt (
VIDEO_PIXEL_SIZE , /* bytes per pixel */
video_hw_bitblt ( VIDEO_PIXEL_SIZE , /* bytes per pixel */
0 , /* source pos x */
VIDEO_LOGO_HEIGHT + VIDEO_FONT_HEIGHT , /* source pos y */
0 , /* dest pos x */
@ -585,13 +594,13 @@ static void console_scrollup (void)
VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT - VIDEO_FONT_HEIGHT /* frame height */
) ;
# else
memcpyl ( CONSOLE_ROW_FIRST , CONSOLE_ROW_SECOND , CONSOLE_SCROLL_SIZE > > 2 ) ;
memcpyl ( CONSOLE_ROW_FIRST , CONSOLE_ROW_SECOND ,
CONSOLE_SCROLL_SIZE > > 2 ) ;
# endif
/* clear the last one */
# ifdef VIDEO_HW_RECTFILL
video_hw_rectfill (
VIDEO_PIXEL_SIZE , /* bytes per pixel */
video_hw_rectfill ( VIDEO_PIXEL_SIZE , /* bytes per pixel */
0 , /* dest pos x */
VIDEO_VISIBLE_ROWS - VIDEO_FONT_HEIGHT , /* dest pos y */
VIDEO_VISIBLE_COLS , /* frame width */
@ -607,31 +616,28 @@ static void console_scrollup (void)
static void console_back ( void )
{
CURSOR_OFF
console_col - - ;
CURSOR_OFF console_col - - ;
if ( console_col < 0 )
{
if ( console_col < 0 ) {
console_col = CONSOLE_COLS - 1 ;
console_row - - ;
if ( console_row < 0 )
console_row = 0 ;
}
video_putchar ( console_col * VIDEO_FONT_WIDTH ,
console_row * VIDEO_FONT_HEIGHT , ' ' ) ;
console_row * VIDEO_FONT_HEIGHT ,
' ' ) ;
}
/*****************************************************************************/
static void console_newline ( void )
{
CURSOR_OFF
console_row + + ;
CURSOR_OFF console_row + + ;
console_col = 0 ;
/* Check if we need to scroll the terminal */
if ( console_row > = CONSOLE_ROWS )
{
if ( console_row > = CONSOLE_ROWS ) {
/* Scroll everything up */
console_scrollup ( ) ;
@ -644,50 +650,304 @@ static void console_newline (void)
void video_putc ( const char c )
{
switch ( c )
{
switch ( c ) {
case 13 : /* ignore */
break ;
case ' \n ' : /* next line */
console_newline ( ) ;
console_newline ( ) ;
break ;
case 9 : /* tab 8 */
CURSOR_OFF
console_col | = 0x0008 ;
CURSOR_OFF console_col | = 0x0008 ;
console_col & = ~ 0x0007 ;
if ( console_col > = CONSOLE_COLS )
console_newline ( ) ;
console_newline ( ) ;
break ;
case 8 : /* backspace */
console_back ( ) ;
console_back ( ) ;
break ;
default : /* draw the char */
video_putchar ( console_col * VIDEO_FONT_WIDTH ,
console_row * VIDEO_FONT_HEIGHT , c ) ;
console_col + + ;
console_row * VIDEO_FONT_HEIGHT ,
c ) ;
console_col + + ;
/* check for newline */
if ( console_col > = CONSOLE_COLS )
console_newline ( ) ;
console_newline ( ) ;
}
CURSOR_SET
}
CURSOR_SET }
/*****************************************************************************/
void video_puts ( const char * s )
{
int count = strlen ( s ) ;
int count = strlen ( s ) ;
while ( count - - )
video_putc ( * s + + ) ;
}
/*****************************************************************************/
# if (CONFIG_COMMANDS & CFG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN)
# define FILL_8BIT_332RGB(r,g,b) { \
* fb = ( ( r > > 5 ) < < 5 ) | ( ( g > > 5 ) < < 2 ) | ( b > > 6 ) ; \
fb + + ; \
}
# define FILL_15BIT_555RGB(r,g,b) { \
* ( unsigned short * ) fb = SWAP16 ( ( unsigned short ) ( ( ( r > > 3 ) < < 10 ) | ( ( g > > 3 ) < < 5 ) | ( b > > 3 ) ) ) ; \
fb + = 2 ; \
}
# define FILL_16BIT_565RGB(r,g,b) { \
* ( unsigned short * ) fb = SWAP16 ( ( unsigned short ) ( ( ( ( r ) > > 3 ) < < 11 ) | ( ( ( g ) > > 2 ) < < 5 ) | ( ( b ) > > 3 ) ) ) ; \
fb + = 2 ; \
}
while ( count - - )
video_putc ( * s + + ) ;
# define FILL_32BIT_X888RGB(r,g,b) { \
* ( unsigned long * ) fb = SWAP32 ( ( unsigned long ) ( ( ( r < < 16 ) | ( g < < 8 ) | b ) ) ) ; \
fb + = 4 ; \
}
# ifdef VIDEO_FB_LITTLE_ENDIAN
# define FILL_24BIT_888RGB(r,g,b) { \
fb [ 0 ] = b ; \
fb [ 1 ] = g ; \
fb [ 2 ] = r ; \
fb + = 3 ; \
}
# else
# define FILL_24BIT_888RGB(r,g,b) { \
fb [ 0 ] = r ; \
fb [ 1 ] = g ; \
fb [ 2 ] = b ; \
fb + = 3 ; \
}
# endif
/*
* Display the BMP file located at address bmp_image .
* Only uncompressed
*/
int video_display_bitmap ( ulong bmp_image , int x , int y )
{
ushort xcount , ycount ;
uchar * fb ;
bmp_image_t * bmp = ( bmp_image_t * ) bmp_image ;
uchar * bmap ;
ushort padded_line ;
unsigned long width , height , bpp ;
unsigned colors ;
unsigned long compression ;
bmp_color_table_entry_t cte ;
WATCHDOG_RESET ( ) ;
if ( ! ( ( bmp - > header . signature [ 0 ] = = ' B ' ) & &
( bmp - > header . signature [ 1 ] = = ' M ' ) ) ) {
printf ( " Error: no valid bmp image at %lx \n " , bmp_image ) ;
return 1 ;
}
width = le32_to_cpu ( bmp - > header . width ) ;
height = le32_to_cpu ( bmp - > header . height ) ;
bpp = le16_to_cpu ( bmp - > header . bit_count ) ;
colors = le32_to_cpu ( bmp - > header . colors_used ) ;
compression = le32_to_cpu ( bmp - > header . compression ) ;
debug ( " Display-bmp: %d x %d with %d colors \n " ,
width , height , colors ) ;
if ( compression ! = BMP_BI_RGB ) {
printf ( " Error: compression type %ld not supported \n " ,
compression ) ;
return 1 ;
}
padded_line = ( ( ( width * bpp + 7 ) / 8 ) + 3 ) & ~ 0x3 ;
if ( ( x + width ) > VIDEO_VISIBLE_COLS )
width = VIDEO_VISIBLE_COLS - x ;
if ( ( y + height ) > VIDEO_VISIBLE_ROWS )
height = VIDEO_VISIBLE_ROWS - y ;
bmap = ( uchar * ) bmp + le32_to_cpu ( bmp - > header . data_offset ) ;
fb = ( uchar * ) ( video_fb_address +
( ( y + height - 1 ) * VIDEO_COLS * VIDEO_PIXEL_SIZE ) +
x * VIDEO_PIXEL_SIZE ) ;
/* We handle only 8bpp or 24 bpp bitmap */
switch ( le16_to_cpu ( bmp - > header . bit_count ) ) {
case 8 :
padded_line - = width ;
if ( VIDEO_DATA_FORMAT = = GDF__8BIT_INDEX ) {
/* Copy colormap */
for ( xcount = 0 ; xcount < colors ; + + xcount ) {
cte = bmp - > color_table [ xcount ] ;
video_set_lut ( xcount , cte . red , cte . green , cte . blue ) ;
}
}
ycount = height ;
switch ( VIDEO_DATA_FORMAT ) {
case GDF__8BIT_INDEX :
while ( ycount - - ) {
WATCHDOG_RESET ( ) ;
xcount = width ;
while ( xcount - - ) {
* fb + + = * bmap + + ;
}
bmap + = padded_line ;
fb - = ( VIDEO_VISIBLE_COLS + width ) * VIDEO_PIXEL_SIZE ;
}
break ;
case GDF__8BIT_332RGB :
while ( ycount - - ) {
WATCHDOG_RESET ( ) ;
xcount = width ;
while ( xcount - - ) {
cte = bmp - > color_table [ * bmap + + ] ;
FILL_8BIT_332RGB ( cte . red , cte . green , cte . blue ) ;
}
bmap + = padded_line ;
fb - = ( VIDEO_VISIBLE_COLS + width ) * VIDEO_PIXEL_SIZE ;
}
break ;
case GDF_15BIT_555RGB :
while ( ycount - - ) {
WATCHDOG_RESET ( ) ;
xcount = width ;
while ( xcount - - ) {
cte = bmp - > color_table [ * bmap + + ] ;
FILL_15BIT_555RGB ( cte . red , cte . green , cte . blue ) ;
}
bmap + = padded_line ;
fb - = ( VIDEO_VISIBLE_COLS + width ) * VIDEO_PIXEL_SIZE ;
}
break ;
case GDF_16BIT_565RGB :
while ( ycount - - ) {
WATCHDOG_RESET ( ) ;
xcount = width ;
while ( xcount - - ) {
cte = bmp - > color_table [ * bmap + + ] ;
FILL_16BIT_565RGB ( cte . red , cte . green , cte . blue ) ;
}
bmap + = padded_line ;
fb - = ( VIDEO_VISIBLE_COLS + width ) * VIDEO_PIXEL_SIZE ;
}
break ;
case GDF_32BIT_X888RGB :
while ( ycount - - ) {
WATCHDOG_RESET ( ) ;
xcount = width ;
while ( xcount - - ) {
cte = bmp - > color_table [ * bmap + + ] ;
FILL_32BIT_X888RGB ( cte . red , cte . green , cte . blue ) ;
}
bmap + = padded_line ;
fb - = ( VIDEO_VISIBLE_COLS + width ) * VIDEO_PIXEL_SIZE ;
}
break ;
case GDF_24BIT_888RGB :
while ( ycount - - ) {
WATCHDOG_RESET ( ) ;
xcount = width ;
while ( xcount - - ) {
cte = bmp - > color_table [ * bmap + + ] ;
FILL_24BIT_888RGB ( cte . red , cte . green , cte . blue ) ;
}
bmap + = padded_line ;
fb - = ( VIDEO_VISIBLE_COLS + width ) * VIDEO_PIXEL_SIZE ;
}
break ;
}
break ;
case 24 :
padded_line - = 3 * width ;
ycount = height ;
switch ( VIDEO_DATA_FORMAT ) {
case GDF__8BIT_332RGB :
while ( ycount - - ) {
WATCHDOG_RESET ( ) ;
xcount = width ;
while ( xcount - - ) {
FILL_8BIT_332RGB ( bmap [ 2 ] , bmap [ 1 ] , bmap [ 0 ] ) ;
bmap + = 3 ;
}
bmap + = padded_line ;
fb - = ( VIDEO_VISIBLE_COLS + width ) * VIDEO_PIXEL_SIZE ;
}
break ;
case GDF_15BIT_555RGB :
while ( ycount - - ) {
WATCHDOG_RESET ( ) ;
xcount = width ;
while ( xcount - - ) {
FILL_15BIT_555RGB ( bmap [ 2 ] , bmap [ 1 ] , bmap [ 0 ] ) ;
bmap + = 3 ;
}
bmap + = padded_line ;
fb - = ( VIDEO_VISIBLE_COLS + width ) * VIDEO_PIXEL_SIZE ;
}
break ;
case GDF_16BIT_565RGB :
while ( ycount - - ) {
WATCHDOG_RESET ( ) ;
xcount = width ;
while ( xcount - - ) {
FILL_16BIT_565RGB ( bmap [ 2 ] , bmap [ 1 ] , bmap [ 0 ] ) ;
bmap + = 3 ;
}
bmap + = padded_line ;
fb - = ( VIDEO_VISIBLE_COLS + width ) * VIDEO_PIXEL_SIZE ;
}
break ;
case GDF_32BIT_X888RGB :
while ( ycount - - ) {
WATCHDOG_RESET ( ) ;
xcount = width ;
while ( xcount - - ) {
FILL_32BIT_X888RGB ( bmap [ 2 ] , bmap [ 1 ] , bmap [ 0 ] ) ;
bmap + = 3 ;
}
bmap + = padded_line ;
fb - = ( VIDEO_VISIBLE_COLS + width ) * VIDEO_PIXEL_SIZE ;
}
break ;
case GDF_24BIT_888RGB :
while ( ycount - - ) {
WATCHDOG_RESET ( ) ;
xcount = width ;
while ( xcount - - ) {
FILL_24BIT_888RGB ( bmap [ 2 ] , bmap [ 1 ] , bmap [ 0 ] ) ;
bmap + = 3 ;
}
bmap + = padded_line ;
fb - = ( VIDEO_VISIBLE_COLS + width ) * VIDEO_PIXEL_SIZE ;
}
break ;
default :
printf ( " Error: 24 bits/pixel bitmap incompatible with current video mode \n " ) ;
break ;
}
break ;
default :
printf ( " Error: %d bit/pixel bitmaps not supported by U-Boot \n " ,
le16_to_cpu ( bmp - > header . bit_count ) ) ;
break ;
}
return ( 0 ) ;
}
# endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) || CONFIG_SPLASH_SCREEN */
/*****************************************************************************/
@ -695,13 +955,12 @@ void video_puts (const char *s)
void logo_plot ( void * screen , int width , int x , int y )
{
int skip = ( width - VIDEO_LOGO_WIDTH ) * VIDEO_PIXEL_SIZE ,
xcount , i ,
ycount = VIDEO_LOGO_HEIGHT ;
unsigned char
* source ,
* dest = ( unsigned char * ) screen + ( ( y * width * VIDEO_PIXEL_SIZE ) + x ) ,
r , g , b , * logo_red , * logo_blue , * logo_green ;
int xcount , i ;
int skip = ( width - VIDEO_LOGO_WIDTH ) * VIDEO_PIXEL_SIZE ;
int ycount = VIDEO_LOGO_HEIGHT ;
unsigned char r , g , b , * logo_red , * logo_blue , * logo_green ;
unsigned char * source ;
unsigned char * dest = ( unsigned char * ) screen + ( ( y * width * VIDEO_PIXEL_SIZE ) + x ) ;
# ifdef CONFIG_VIDEO_BMP_LOGO
source = bmp_logo_bitmap ;
@ -712,9 +971,9 @@ void logo_plot (void *screen, int width, int x, int y)
logo_blue = malloc ( BMP_LOGO_COLORS ) ;
/* Compute color map */
for ( i = 0 ; i < VIDEO_LOGO_COLORS ; i + + ) {
logo_red [ i ] = ( bmp_logo_palette [ i ] & 0x0f00 ) > > 4 ;
logo_green [ i ] = ( bmp_logo_palette [ i ] & 0x00f0 ) ;
logo_blue [ i ] = ( bmp_logo_palette [ i ] & 0x000f ) < < 4 ;
logo_red [ i ] = ( bmp_logo_palette [ i ] & 0x0f00 ) > > 4 ;
logo_green [ i ] = ( bmp_logo_palette [ i ] & 0x00f0 ) ;
logo_blue [ i ] = ( bmp_logo_palette [ i ] & 0x000f ) < < 4 ;
}
# else
source = linux_logo ;
@ -723,43 +982,38 @@ void logo_plot (void *screen, int width, int x, int y)
logo_blue = linux_logo_blue ;
# endif
if ( VIDEO_DATA_FORMAT = = GDF__8BIT_INDEX )
{
for ( i = 0 ; i < VIDEO_LOGO_COLORS ; i + + )
{
if ( VIDEO_DATA_FORMAT = = GDF__8BIT_INDEX ) {
for ( i = 0 ; i < VIDEO_LOGO_COLORS ; i + + ) {
video_set_lut ( i + VIDEO_LOGO_LUT_OFFSET ,
logo_red [ i ] , logo_green [ i ] , logo_blue [ i ] ) ;
logo_red [ i ] , logo_green [ i ] , logo_blue [ i ] ) ;
}
}
while ( ycount - - )
{
while ( ycount - - ) {
xcount = VIDEO_LOGO_WIDTH ;
while ( xcount - - )
{
r = logo_red [ * source - VIDEO_LOGO_LUT_OFFSET ] ;
g = logo_green [ * source - VIDEO_LOGO_LUT_OFFSET ] ;
b = logo_blue [ * source - VIDEO_LOGO_LUT_OFFSET ] ;
while ( xcount - - ) {
r = logo_red [ * source - VIDEO_LOGO_LUT_OFFSET ] ;
g = logo_green [ * source - VIDEO_LOGO_LUT_OFFSET ] ;
b = logo_blue [ * source - VIDEO_LOGO_LUT_OFFSET ] ;
switch ( VIDEO_DATA_FORMAT )
{
switch ( VIDEO_DATA_FORMAT ) {
case GDF__8BIT_INDEX :
* dest = * source ;
break ;
case GDF__8BIT_332RGB :
* dest = ( ( r > > 5 ) < < 5 ) | ( ( g > > 5 ) < < 2 ) | ( b > > 6 ) ;
* dest = ( ( r > > 5 ) < < 5 ) | ( ( g > > 5 ) < < 2 ) | ( b > > 6 ) ;
break ;
case GDF_15BIT_555RGB :
* ( unsigned short * ) dest =
SWAP16 ( ( unsigned short ) ( ( ( r > > 3 ) < < 10 ) | ( ( g > > 3 ) < < 5 ) | ( b > > 3 ) ) ) ;
* ( unsigned short * ) dest =
SWAP16 ( ( unsigned short ) ( ( ( r > > 3 ) < < 10 ) | ( ( g > > 3 ) < < 5 ) | ( b > > 3 ) ) ) ;
break ;
case GDF_16BIT_565RGB :
* ( unsigned short * ) dest =
SWAP16 ( ( unsigned short ) ( ( ( r > > 3 ) < < 11 ) | ( ( g > > 2 ) < < 5 ) | ( b > > 3 ) ) ) ;
* ( unsigned short * ) dest =
SWAP16 ( ( unsigned short ) ( ( ( r > > 3 ) < < 11 ) | ( ( g > > 2 ) < < 5 ) | ( b > > 3 ) ) ) ;
break ;
case GDF_32BIT_X888RGB :
* ( unsigned long * ) dest =
SWAP32 ( ( unsigned long ) ( ( r < < 16 ) | ( g < < 8 ) | b ) ) ;
* ( unsigned long * ) dest =
SWAP32 ( ( unsigned long ) ( ( r < < 16 ) | ( g < < 8 ) | b ) ) ;
break ;
case GDF_24BIT_888RGB :
# ifdef VIDEO_FB_LITTLE_ENDIAN
@ -792,21 +1046,35 @@ static void *video_logo (void)
char info [ 128 ] ;
extern char version_string ;
# ifdef CONFIG_SPLASH_SCREEN
char * s ;
ulong addr ;
if ( ( s = getenv ( " splashimage " ) ) ! = NULL ) {
addr = simple_strtoul ( s , NULL , 16 ) ;
if ( video_display_bitmap ( addr , 0 , 0 ) = = 0 ) {
return ( ( void * ) ( video_fb_address ) ) ;
}
}
# endif /* CONFIG_SPLASH_SCREEN */
logo_plot ( video_fb_address , VIDEO_COLS , 0 , 0 ) ;
sprintf ( info , " %s " , & version_string ) ;
sprintf ( info , " %s " , & version_string ) ;
video_drawstring ( VIDEO_INFO_X , VIDEO_INFO_Y , info ) ;
# ifdef CONFIG_CONSOLE_EXTRA_INFO
{
int i , n = ( ( VIDEO_LOGO_HEIGHT - VIDEO_FONT_HEIGHT ) / VIDEO_FONT_HEIGHT ) ;
int i , n = ( ( VIDEO_LOGO_HEIGHT - VIDEO_FONT_HEIGHT ) / VIDEO_FONT_HEIGHT ) ;
for ( i = 1 ; i < n ; i + + )
{
for ( i = 1 ; i < n ; i + + ) {
video_get_info_str ( i , info ) ;
if ( * info )
video_drawstring ( VIDEO_INFO_X ,
VIDEO_INFO_Y + i * VIDEO_FONT_HEIGHT , info ) ;
VIDEO_INFO_Y + i * VIDEO_FONT_HEIGHT ,
info ) ;
}
}
# endif
@ -818,21 +1086,20 @@ static void *video_logo (void)
/*****************************************************************************/
static int video_init ( void )
static int video_init ( void )
{
unsigned char color8 ;
if ( ( pGD = video_hw_init ( ) ) = = NULL )
if ( ( pGD = video_hw_init ( ) ) = = NULL )
return - 1 ;
video_fb_address = ( void * ) VIDEO_FB_ADRS ;
video_fb_address = ( void * ) VIDEO_FB_ADRS ;
# ifdef CONFIG_VIDEO_HW_CURSOR
video_init_hw_cursor ( VIDEO_FONT_WIDTH , VIDEO_FONT_HEIGHT ) ;
video_init_hw_cursor ( VIDEO_FONT_WIDTH , VIDEO_FONT_HEIGHT ) ;
# endif
/* Init drawing pats */
switch ( VIDEO_DATA_FORMAT )
{
switch ( VIDEO_DATA_FORMAT ) {
case GDF__8BIT_INDEX :
video_set_lut ( 0x01 , CONSOLE_FG_COL , CONSOLE_FG_COL , CONSOLE_FG_COL ) ;
video_set_lut ( 0x00 , CONSOLE_BG_COL , CONSOLE_BG_COL , CONSOLE_BG_COL ) ;
@ -840,38 +1107,50 @@ static int video_init(void)
bgx = 0x00000000 ;
break ;
case GDF__8BIT_332RGB :
color8 = ( ( CONSOLE_FG_COL & 0xe0 ) | ( ( CONSOLE_FG_COL > > 3 ) & 0x1c ) | CONSOLE_FG_COL > > 6 ) ;
fgx = ( color8 < < 24 ) | ( color8 < < 16 ) | ( color8 < < 8 ) | color8 ;
color8 = ( ( CONSOLE_BG_COL & 0xe0 ) | ( ( CONSOLE_BG_COL > > 3 ) & 0x1c ) | CONSOLE_BG_COL > > 6 ) ;
bgx = ( color8 < < 24 ) | ( color8 < < 16 ) | ( color8 < < 8 ) | color8 ;
color8 = ( ( CONSOLE_FG_COL & 0xe0 ) |
( ( CONSOLE_FG_COL > > 3 ) & 0x1c ) | CONSOLE_FG_COL > > 6 ) ;
fgx = ( color8 < < 24 ) | ( color8 < < 16 ) | ( color8 < < 8 ) | color8 ;
color8 = ( ( CONSOLE_BG_COL & 0xe0 ) |
( ( CONSOLE_BG_COL > > 3 ) & 0x1c ) | CONSOLE_BG_COL > > 6 ) ;
bgx = ( color8 < < 24 ) | ( color8 < < 16 ) | ( color8 < < 8 ) | color8 ;
break ;
case GDF_15BIT_555RGB :
fgx = ( ( ( CONSOLE_FG_COL > > 3 ) < < 26 ) | ( ( CONSOLE_FG_COL > > 3 ) < < 21 ) | ( ( CONSOLE_FG_COL > > 3 ) < < 16 ) |
( ( CONSOLE_FG_COL > > 3 ) < < 10 ) | ( ( CONSOLE_FG_COL > > 3 ) < < 5 ) | ( CONSOLE_FG_COL > > 3 ) ) ;
bgx = ( ( ( CONSOLE_BG_COL > > 3 ) < < 26 ) | ( ( CONSOLE_BG_COL > > 3 ) < < 21 ) | ( ( CONSOLE_BG_COL > > 3 ) < < 16 ) |
( ( CONSOLE_BG_COL > > 3 ) < < 10 ) | ( ( CONSOLE_BG_COL > > 3 ) < < 5 ) | ( CONSOLE_BG_COL > > 3 ) ) ;
fgx = ( ( ( CONSOLE_FG_COL > > 3 ) < < 26 ) |
( ( CONSOLE_FG_COL > > 3 ) < < 21 ) | ( ( CONSOLE_FG_COL > > 3 ) < < 16 ) |
( ( CONSOLE_FG_COL > > 3 ) < < 10 ) | ( ( CONSOLE_FG_COL > > 3 ) < < 5 ) |
( CONSOLE_FG_COL > > 3 ) ) ;
bgx = ( ( ( CONSOLE_BG_COL > > 3 ) < < 26 ) |
( ( CONSOLE_BG_COL > > 3 ) < < 21 ) | ( ( CONSOLE_BG_COL > > 3 ) < < 16 ) |
( ( CONSOLE_BG_COL > > 3 ) < < 10 ) | ( ( CONSOLE_BG_COL > > 3 ) < < 5 ) |
( CONSOLE_BG_COL > > 3 ) ) ;
break ;
case GDF_16BIT_565RGB :
fgx = ( ( ( CONSOLE_FG_COL > > 3 ) < < 27 ) | ( ( CONSOLE_FG_COL > > 2 ) < < 21 ) | ( ( CONSOLE_FG_COL > > 3 ) < < 16 ) |
( ( CONSOLE_FG_COL > > 3 ) < < 11 ) | ( ( CONSOLE_FG_COL > > 2 ) < < 5 ) | ( CONSOLE_FG_COL > > 3 ) ) ;
bgx = ( ( ( CONSOLE_BG_COL > > 3 ) < < 27 ) | ( ( CONSOLE_BG_COL > > 2 ) < < 21 ) | ( ( CONSOLE_BG_COL > > 3 ) < < 16 ) |
( ( CONSOLE_BG_COL > > 3 ) < < 11 ) | ( ( CONSOLE_BG_COL > > 2 ) < < 5 ) | ( CONSOLE_BG_COL > > 3 ) ) ;
fgx = ( ( ( CONSOLE_FG_COL > > 3 ) < < 27 ) |
( ( CONSOLE_FG_COL > > 2 ) < < 21 ) | ( ( CONSOLE_FG_COL > > 3 ) < < 16 ) |
( ( CONSOLE_FG_COL > > 3 ) < < 11 ) | ( ( CONSOLE_FG_COL > > 2 ) < < 5 ) |
( CONSOLE_FG_COL > > 3 ) ) ;
bgx = ( ( ( CONSOLE_BG_COL > > 3 ) < < 27 ) |
( ( CONSOLE_BG_COL > > 2 ) < < 21 ) | ( ( CONSOLE_BG_COL > > 3 ) < < 16 ) |
( ( CONSOLE_BG_COL > > 3 ) < < 11 ) | ( ( CONSOLE_BG_COL > > 2 ) < < 5 ) |
( CONSOLE_BG_COL > > 3 ) ) ;
break ;
case GDF_32BIT_X888RGB :
fgx = ( CONSOLE_FG_COL < < 16 ) | ( CONSOLE_FG_COL < < 8 ) | CONSOLE_FG_COL ;
bgx = ( CONSOLE_BG_COL < < 16 ) | ( CONSOLE_BG_COL < < 8 ) | CONSOLE_BG_COL ;
fgx = ( CONSOLE_FG_COL < < 16 ) | ( CONSOLE_FG_COL < < 8 ) | CONSOLE_FG_COL ;
bgx = ( CONSOLE_BG_COL < < 16 ) | ( CONSOLE_BG_COL < < 8 ) | CONSOLE_BG_COL ;
break ;
case GDF_24BIT_888RGB :
fgx = ( CONSOLE_FG_COL < < 24 ) | ( CONSOLE_FG_COL < < 16 ) | ( CONSOLE_FG_COL < < 8 ) | CONSOLE_FG_COL ;
bgx = ( CONSOLE_BG_COL < < 24 ) | ( CONSOLE_BG_COL < < 16 ) | ( CONSOLE_BG_COL < < 8 ) | CONSOLE_BG_COL ;
fgx = ( CONSOLE_FG_COL < < 24 ) | ( CONSOLE_FG_COL < < 16 ) |
( CONSOLE_FG_COL < < 8 ) | CONSOLE_FG_COL ;
bgx = ( CONSOLE_BG_COL < < 24 ) | ( CONSOLE_BG_COL < < 16 ) |
( CONSOLE_BG_COL < < 8 ) | CONSOLE_BG_COL ;
break ;
}
eorx = fgx ^ bgx ;
# ifdef CONFIG_VIDEO_LOGO
/* Plot the logo and get start point of console */
PRINTD ( " Video: Drawing the logo ... \n " ) ;
video_console_address = video_logo ( ) ;
PRINTD ( " Video: Drawing the logo ... \n " ) ;
video_console_address = video_logo ( ) ;
# else
video_console_address = video_fb_address ;
# endif
@ -880,7 +1159,7 @@ static int video_init(void)
console_col = 0 ;
console_row = 0 ;
return 0 ;
return 0 ;
}
@ -900,15 +1179,14 @@ int drv_video_init (void)
return 0 ;
/* Init video chip - returns with framebuffer cleared */
if ( video_init ( ) = = - 1 )
if ( video_init ( ) = = - 1 )
skip_dev_init = 1 ;
# ifdef CONFIG_VGA_AS_SINGLE_DEVICE
/* Devices VGA and Keyboard will be assigned seperately */
/* Init vga device */
if ( ! skip_dev_init )
{
memset ( & console_dev , 0 , sizeof ( console_dev ) ) ;
strcpy ( console_dev . name , " vga " ) ;
if ( ! skip_dev_init ) {
memset ( & console_dev , 0 , sizeof ( console_dev ) ) ;
strcpy ( console_dev . name , " vga " ) ;
console_dev . ext = DEV_EXT_VIDEO ; /* Video extensions */
console_dev . flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_SYSTEM ;
console_dev . putc = video_putc ; /* 'putc' function */
@ -920,15 +1198,14 @@ int drv_video_init (void)
return 1 ;
}
# else
PRINTD ( " KBD: Keyboard init ... \n " ) ;
PRINTD ( " KBD: Keyboard init ... \n " ) ;
if ( VIDEO_KBD_INIT_FCT = = - 1 )
skip_dev_init = 1 ;
/* Init console device */
if ( ! skip_dev_init )
{
memset ( & console_dev , 0 , sizeof ( console_dev ) ) ;
strcpy ( console_dev . name , " console " ) ;
if ( ! skip_dev_init ) {
memset ( & console_dev , 0 , sizeof ( console_dev ) ) ;
strcpy ( console_dev . name , " console " ) ;
console_dev . ext = DEV_EXT_VIDEO ; /* Video extensions */
console_dev . flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM ;
console_dev . putc = video_putc ; /* 'putc' function */
@ -943,5 +1220,4 @@ int drv_video_init (void)
/* No console dev available */
return 0 ;
}
# endif /* CONFIG_CFB_CONSOLE */