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 + -
显示快捷键?