fbconsole.c
来自「cpc-1631的BSP包for VxWorks操作系统」· C语言 代码 · 共 911 行 · 第 1/3 页
C
911 行
{
CURSOR_OFF
console_col--;
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, ' ');
}
/*****************************************************************************/
static void console_newline (void)
{
CURSOR_OFF
console_row++;
console_col = 0;
/* Check if we need to scroll the terminal */
if (console_row >= CONSOLE_ROWS)
{
/* Scroll everything up */
console_scrollup ();
/* Decrement row number */
console_row--;
}
}
/*****************************************************************************/
void video_putc (const char c)
{
switch (c)
{
case 13: /* ignore */
break;
case '\n': /* next line */
console_newline();
break;
case 9: /* tab 8 */
CURSOR_OFF
console_col |= 0x0008;
console_col &= ~0x0007;
if (console_col >= CONSOLE_COLS)
console_newline();
break;
case 8: /* backspace */
console_back();
break;
default: /* draw the char */
video_putchar (console_col * VIDEO_FONT_WIDTH,
console_row * VIDEO_FONT_HEIGHT, c);
console_col++ ;
/* check for newline */
if (console_col >= CONSOLE_COLS)
console_newline();
}
CURSOR_SET
}
/*****************************************************************************/
void video_puts (const char *s)
{
int count = strlen(s);
while(count--)
video_putc(*s++);
}
/*****************************************************************************/
#ifdef CONFIG_VIDEO_LOGO
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;
#ifdef CONFIG_VIDEO_BMP_LOGO
source = bmp_logo_bitmap;
/* Allocate temporary space for computing colormap */
logo_red = malloc (BMP_LOGO_COLORS);
logo_green = malloc (BMP_LOGO_COLORS);
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;
}
#else
source = linux_logo;
logo_red = linux_logo_red;
logo_green = linux_logo_green;
logo_blue = linux_logo_blue;
#endif
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]);
}
}
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];
switch (VIDEO_DATA_FORMAT)
{
case GDF__8BIT_INDEX:
*dest = *source;
break;
case GDF__8BIT_332RGB:
*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)));
break;
case GDF_16BIT_565RGB:
*(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));
break;
case GDF_24BIT_888RGB:
#ifdef VIDEO_FB_LITTLE_ENDIAN
dest[0] = b;
dest[1] = g;
dest[2] = r;
#else
dest[0] = r;
dest[1] = g;
dest[2] = b;
#endif
break;
}
source++;
dest += VIDEO_PIXEL_SIZE;
}
dest += skip;
}
#ifdef CONFIG_VIDEO_BMP_LOGO
free (logo_red);
free (logo_green);
free (logo_blue);
#endif
}
/*****************************************************************************/
void *video_logo (void)
{
char info[128];
char version_string = "WIS Media SDK 1.0";
logo_plot (video_fb_address, VIDEO_COLS, 0, 0);
sprintf(info, " %s", &version_string);
video_drawstring (VIDEO_INFO_X, VIDEO_INFO_Y, info);
return (video_fb_address + VIDEO_LOGO_HEIGHT * VIDEO_LINE_LEN);
}
#endif
/*****************************************************************************/
int video_init(void)
{
unsigned char color8;
if ((pGD=video_hw_init()) == NULL)
return -1;
video_fb_address = (void*)VIDEO_FB_ADRS;
#ifdef CONFIG_VIDEO_HW_CURSOR
video_init_hw_cursor(VIDEO_FONT_WIDTH, VIDEO_FONT_HEIGHT);
#endif
/* Init drawing pats */
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);
fgx = 0x01010101;
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;
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));
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));
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;
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;
break;
}
eorx = fgx ^ bgx;
#define CONFIG_VIDEO_LOGO
#ifdef CONFIG_VIDEO_LOGO
/* Plot the logo and get start point of console */
PRINTD("Video: Drawing the logo ...\n");
video_console_address = video_logo();
#else
video_console_address = video_fb_address;
#endif
/* Initialize the console */
console_col = 0;
console_row = 0;
return 0 ;
}
/*****************************************************************************/
int drv_video_init (void)
{
int skip_dev_init;
char *penv;
char buf[150];
skip_dev_init = 0;
/* Init video chip - returns with framebuffer cleared */
if (video_init() == -1)
skip_dev_init = 1;
/* Init console device */
#if 0
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 */
console_dev.puts = video_puts; /* 'puts' function */
console_dev.tstc = VIDEO_TSTC_FCT; /* 'tstc' function */
console_dev.getc = VIDEO_GETC_FCT; /* 'getc' function */
if (device_register (&console_dev) == 0)
return 1;
}
#endif
/* No console dev available */
video_puts("WIS Technologies\n");
video_puts("Copyright (C) 2003, WIS Technologies Inc.");
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?