📄 cfb_console.c
字号:
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_LOGOvoid logo_plot (void *screen, int width, int x, int y){ int skip = (width - LINUX_LOGO_WIDTH) * VIDEO_PIXEL_SIZE, xcount, i, ycount = LINUX_LOGO_HEIGHT; unsigned char *source = linux_logo, *dest = (unsigned char *) screen + ((y * width * VIDEO_PIXEL_SIZE) + x), r, g, b; if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX) { for (i = 0; i < LINUX_LOGO_COLORS; i++) { r = (unsigned char)linux_logo_red [i]; g = (unsigned char)linux_logo_green[i]; b = (unsigned char)linux_logo_blue [i]; video_set_lut (LINUX_LOGO_LUT_OFFSET + i, r, g, b); } } while (ycount--) { xcount = LINUX_LOGO_WIDTH; while (xcount--) { r = (unsigned char)linux_logo_red [*source - LINUX_LOGO_LUT_OFFSET]; g = (unsigned char)linux_logo_green[*source - LINUX_LOGO_LUT_OFFSET]; b = (unsigned char)linux_logo_blue [*source - LINUX_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; }}/*****************************************************************************/static void *video_logo (void){ char info[128]; logo_plot (video_fb_address, VIDEO_COLS, 0, 0); sprintf(info, " %s (%s - %s)", PPCBOOT_VERSION, __DATE__, __TIME__); 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); 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); } }#endif return (video_fb_address + VIDEO_LOGO_HEIGHT * VIDEO_LINE_LEN);}#endif/*****************************************************************************/static 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;#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; device_t console_dev; char *penv; skip_dev_init = 0; /* Force console i/o to serial ? */ if ((penv = getenv ("console")) != NULL) if (strcmp (penv, "serial") == 0) return 0; /* Init video chip - returns with framebuffer cleared */ 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"); console_dev.ext = DEV_EXT_VIDEO; /* Video extensions */ console_dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_SYSTEM; console_dev.putc = video_putc; /* 'putc' function */ console_dev.puts = video_puts; /* 'puts' function */ console_dev.tstc = NULL; /* 'tstc' function */ console_dev.getc = NULL; /* 'getc' function */ if (device_register (&console_dev) == 0) return 1; }#else 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"); 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 /* CONFIG_VGA_AS_SINGLE_DEVICE */ /* No console dev available */ return 0;}#endif /* CONFIG_CFB_CONSOLE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -