📄 cfb_console.c
字号:
/* * (C) Copyright 2002 ELTEC Elektronik AG * Frank Gottschling <fgottschling@eltec.de> * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA *//* * cfb_console.c * * Color Framebuffer Console driver for 8/15/16/24/32 bits per pixel. * * At the moment only the 8x16 font is tested and the font fore- and * background color is limited to black/white/gray colors. The Linux * logo can be placed in the upper left corner and additional board * information strings (that normaly goes to serial port) can be drawed. * * The console driver can use the standard PC keyboard interface (i8042) * for character input. Character output goes to a memory mapped video * framebuffer with little or big-endian organisation. * With environment setting 'console=serial' the console i/o can be * forced to serial port. The driver uses graphic specific defines/parameters/functions: (for SMI LynxE graphic chip) CONFIG_VIDEO_SMI_LYNXEM - use graphic driver for SMI 710,712,810 VIDEO_FB_LITTLE_ENDIAN - framebuffer organisation default: big endian VIDEO_HW_RECTFILL - graphic driver supports hardware rectangle fill VIDEO_HW_BITBLT - graphic driver supports hardware bit blt Console Parameters are set by graphic drivers global struct: VIDEO_VISIBLE_COLS - x resolution VIDEO_VISIBLE_ROWS - y resolution VIDEO_PIXEL_SIZE - storage size in byte per pixel VIDEO_DATA_FORMAT - graphical data format GDF VIDEO_FB_ADRS - start of video memory CONFIG_I8042_KBD - AT Keyboard driver for i8042 VIDEO_KBD_INIT_FCT - init function for keyboard VIDEO_TSTC_FCT - keyboard_tstc function VIDEO_GETC_FCT - keyboard_getc function CONFIG_CONSOLE_CURSOR - on/off drawing cursor is done with delay loop in VIDEO_TSTC_FCT (i8042) CFG_CONSOLE_BLINK_COUNT - value for delay loop - blink rate CONFIG_CONSOLE_TIME - display time/date in upper right corner, needs CFG_CMD_DATE and CONFIG_CONSOLE_CURSOR CONFIG_VIDEO_LOGO - display Linux Logo in upper left corner CONFIG_VIDEO_BMP_LOGO - use bmp_logo instead of linux_logo CONFIG_CONSOLE_EXTRA_INFO - display additional board information strings that normaly goes to serial port. This define requires a board specific function: video_drawstring (VIDEO_INFO_X, VIDEO_INFO_Y + i*VIDEO_FONT_HEIGHT, info); that fills a info buffer at i=row. s.a: board/eltec/bab7xx.CONFIG_VGA_AS_SINGLE_DEVICE - If set the framebuffer device will be initialised as an output only device. The Keyboard driver will not be set-up. This may be used, if you have none or more than one Keyboard devices (USB Keyboard, AT Keyboard).CONFIG_VIDEO_SW_CURSOR: - Draws a cursor after the last character. No blinking is provided. Uses the macros CURSOR_SET and CURSOR_OFF.CONFIG_VIDEO_HW_CURSOR: - Uses the hardware cursor capability of the graphic chip. Uses the macro CURSOR_SET. ATTENTION: If booting an OS, the display driver must disable the hardware register of the graphic chip. Otherwise a blinking field is displayed*/#include <common.h>#include <command.h>#include <bmp_layout.h>#ifdef CONFIG_CFB_CONSOLE#undef CONFIG_CONSOLE_EXTRA_INFO#include <malloc.h>/*****************************************************************************//* Console device defines with SMI graphic *//* Any other graphic must change this section *//*****************************************************************************/#ifdef CONFIG_VIDEO_SM501#include <sm501.h>#include <sm501acc.h>#define VIDEO_FB_LITTLE_ENDIAN#define VIDEO_HW_RECTFILL#define VIDEO_HW_BITBLT#endif/*****************************************************************************//* Defines for the CT69000 driver *//*****************************************************************************/#ifdef CONFIG_VIDEO_CT69000#define VIDEO_FB_LITTLE_ENDIAN#define VIDEO_HW_RECTFILL#define VIDEO_HW_BITBLT#endif/*****************************************************************************//* Defines for the SED13806 driver *//*****************************************************************************/#ifdef CONFIG_VIDEO_SED13806#ifndef CONFIG_TOTAL5200#define VIDEO_FB_LITTLE_ENDIAN#endif#define VIDEO_HW_RECTFILL#define VIDEO_HW_BITBLT#endif/*****************************************************************************//* Include video_fb.h after definitions of VIDEO_HW_RECTFILL etc *//*****************************************************************************/#include <video_fb.h>/*****************************************************************************//* some Macros *//*****************************************************************************/#define VIDEO_VISIBLE_COLS (pGD->winSizeX)#define VIDEO_VISIBLE_ROWS (pGD->winSizeY)#define VIDEO_PIXEL_SIZE (pGD->gdfBytesPP)#define VIDEO_DATA_FORMAT (pGD->gdfIndex)#define VIDEO_FB_ADRS (pGD->frameAdrs)/*****************************************************************************//* Console device defines with i8042 keyboard controller *//* Any other keyboard controller must change this section *//*****************************************************************************/#ifdef CONFIG_I8042_KBD#include <i8042.h>#define VIDEO_KBD_INIT_FCT i8042_kbd_init()#define VIDEO_TSTC_FCT i8042_tstc#define VIDEO_GETC_FCT i8042_getc#endif/*****************************************************************************//* Console device *//*****************************************************************************/#include <version.h>#include <linux/types.h>#include <devices.h>#include <video_font.h>#ifdef CFG_CMD_DATE#include <rtc.h>#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 *//* let the cursor blink. Uses the macros CURSOR_OFF *//* and CURSOR_ON. *//* CONFIG_VIDEO_SW_CURSOR: Draws a cursor after the last character. No *//* blinking is provided. Uses the macros CURSOR_SET *//* and CURSOR_OFF. *//* CONFIG_VIDEO_HW_CURSOR: Uses the hardware cursor capability of the *//* graphic chip. Uses the macro CURSOR_SET. *//* ATTENTION: If booting an OS, the display driver *//* must disable the hardware register of the graphic *//* chip. Otherwise a blinking field is displayed *//*****************************************************************************/#if !defined(CONFIG_CONSOLE_CURSOR) && \ !defined(CONFIG_VIDEO_SW_CURSOR) && \ !defined(CONFIG_VIDEO_HW_CURSOR)/* no Cursor defined */#define CURSOR_ON#define CURSOR_OFF#define CURSOR_SET#endif#ifdef CONFIG_CONSOLE_CURSOR#ifdef CURSOR_ON#error only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined#endifvoid console_cursor (int state);#define CURSOR_ON console_cursor(1);#define CURSOR_OFF console_cursor(0);#define CURSOR_SET#ifndef CONFIG_I8042_KBD#warning Cursor drawing on/off needs timer function s.a. drivers/i8042.c#endif#else#ifdef CONFIG_CONSOLE_TIME#error CONFIG_CONSOLE_CURSOR must be defined for CONFIG_CONSOLE_TIME#endif#endif /* CONFIG_CONSOLE_CURSOR */#ifdef CONFIG_VIDEO_SW_CURSOR#ifdef CURSOR_ON#error only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined#endif#define CURSOR_ON#define CURSOR_OFF video_putchar(console_col * VIDEO_FONT_WIDTH,\ console_row * VIDEO_FONT_HEIGHT, ' ');#define CURSOR_SET video_set_cursor();#endif /* CONFIG_VIDEO_SW_CURSOR */#ifdef CONFIG_VIDEO_HW_CURSOR#ifdef CURSOR_ON#error only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined#endif#define CURSOR_ON#define CURSOR_OFF#define CURSOR_SET video_set_hw_cursor(console_col * VIDEO_FONT_WIDTH, \ (console_row * VIDEO_FONT_HEIGHT) + VIDEO_LOGO_HEIGHT);#endif /* CONFIG_VIDEO_HW_CURSOR */#ifdef CONFIG_VIDEO_LOGO#ifdef CONFIG_VIDEO_BMP_LOGO#include <bmp_logo.h>#include <bmp_layout.h>#define VIDEO_LOGO_WIDTH BMP_LOGO_WIDTH#define VIDEO_LOGO_HEIGHT BMP_LOGO_HEIGHT#define VIDEO_LOGO_LUT_OFFSET BMP_LOGO_OFFSET#define VIDEO_LOGO_COLORS BMP_LOGO_COLORS#else /* CONFIG_VIDEO_BMP_LOGO */#define LINUX_LOGO_WIDTH 80#define LINUX_LOGO_HEIGHT 80#define LINUX_LOGO_COLORS 214#define LINUX_LOGO_LUT_OFFSET 0x20#define __initdata#include <linux_logo.h>#define VIDEO_LOGO_WIDTH LINUX_LOGO_WIDTH#define VIDEO_LOGO_HEIGHT LINUX_LOGO_HEIGHT#define VIDEO_LOGO_LUT_OFFSET LINUX_LOGO_LUT_OFFSET#define VIDEO_LOGO_COLORS LINUX_LOGO_COLORS#endif /* CONFIG_VIDEO_BMP_LOGO */#define VIDEO_INFO_X (VIDEO_LOGO_WIDTH)#define VIDEO_INFO_Y (VIDEO_FONT_HEIGHT/2)#else /* CONFIG_VIDEO_LOGO */#define VIDEO_LOGO_WIDTH 0#define VIDEO_LOGO_HEIGHT 0#endif /* CONFIG_VIDEO_LOGO */#define VIDEO_COLS VIDEO_VISIBLE_COLS#define VIDEO_ROWS VIDEO_VISIBLE_ROWS#define VIDEO_SIZE (VIDEO_ROWS*VIDEO_COLS*VIDEO_PIXEL_SIZE)#define VIDEO_PIX_BLOCKS (VIDEO_SIZE >> 2)#define VIDEO_LINE_LEN (VIDEO_COLS*VIDEO_PIXEL_SIZE)#define VIDEO_BURST_LEN (VIDEO_COLS/8)#ifdef CONFIG_VIDEO_LOGO#define CONSOLE_ROWS ((VIDEO_ROWS - VIDEO_LOGO_HEIGHT) / VIDEO_FONT_HEIGHT)#else#define CONSOLE_ROWS (VIDEO_ROWS / VIDEO_FONT_HEIGHT)#endif#define CONSOLE_COLS (VIDEO_COLS / VIDEO_FONT_WIDTH)#define CONSOLE_ROW_SIZE (VIDEO_FONT_HEIGHT * VIDEO_LINE_LEN)#define CONSOLE_ROW_FIRST (video_console_address)#define CONSOLE_ROW_SECOND (video_console_address + CONSOLE_ROW_SIZE)#define CONSOLE_ROW_LAST (video_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE)#define CONSOLE_SIZE (CONSOLE_ROW_SIZE * CONSOLE_ROWS)#define CONSOLE_SCROLL_SIZE (CONSOLE_SIZE - CONSOLE_ROW_SIZE)/* Macros */#ifdef VIDEO_FB_LITTLE_ENDIAN#define SWAP16(x) ((((x) & 0x00ff) << 8) | ( (x) >> 8))#define SWAP32(x) ((((x) & 0x000000ff) << 24) | (((x) & 0x0000ff00) << 8)|\ (((x) & 0x00ff0000) >> 8) | (((x) & 0xff000000) >> 24) )#define SHORTSWAP32(x) ((((x) & 0x000000ff) << 8) | (((x) & 0x0000ff00) >> 8)|\ (((x) & 0x00ff0000) << 8) | (((x) & 0xff000000) >> 8) )#else#define SWAP16(x) (x)#define SWAP32(x) (x)#define SHORTSWAP32(x) (x)#endif#if defined(DEBUG) || defined(DEBUG_CFB_CONSOLE)#define PRINTD(x) printf(x)#else#define PRINTD(x)#endif#ifdef CONFIG_CONSOLE_EXTRA_INFOextern void video_get_info_str ( /* setup a board string: type, speed, etc. */ int line_number, /* location to place info string beside logo */ char *info /* buffer for info string */ );#endif/* Locals */static GraphicDevice *pGD; /* Pointer to Graphic array */static void *video_fb_address; /* frame buffer address */static void *video_console_address; /* console buffer start address */static int console_col = 0; /* cursor col */static int console_row = 0; /* cursor row */static u32 eorx, fgx, bgx; /* color pats */static const int video_font_draw_table8[] = { 0x00000000, 0x000000ff, 0x0000ff00, 0x0000ffff, 0x00ff0000, 0x00ff00ff, 0x00ffff00, 0x00ffffff, 0xff000000, 0xff0000ff, 0xff00ff00, 0xff00ffff, 0xffff0000, 0xffff00ff, 0xffffff00, 0xffffffff };static const int video_font_draw_table15[] = { 0x00000000, 0x00007fff, 0x7fff0000, 0x7fff7fff };static const int video_font_draw_table16[] = { 0x00000000, 0x0000ffff, 0xffff0000, 0xffffffff };static const int video_font_draw_table24[16][3] = { { 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00ffffff }, { 0x00000000, 0x0000ffff, 0xff000000 }, { 0x00000000, 0x0000ffff, 0xffffffff }, { 0x000000ff, 0xffff0000, 0x00000000 }, { 0x000000ff, 0xffff0000, 0x00ffffff }, { 0x000000ff, 0xffffffff, 0xff000000 }, { 0x000000ff, 0xffffffff, 0xffffffff }, { 0xffffff00, 0x00000000, 0x00000000 }, { 0xffffff00, 0x00000000, 0x00ffffff }, { 0xffffff00, 0x0000ffff, 0xff000000 }, { 0xffffff00, 0x0000ffff, 0xffffffff }, { 0xffffffff, 0xffff0000, 0x00000000 }, { 0xffffffff, 0xffff0000, 0x00ffffff }, { 0xffffffff, 0xffffffff, 0xff000000 }, { 0xffffffff, 0xffffffff, 0xffffffff } };static const int video_font_draw_table32[16][4] = { { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00ffffff }, { 0x00000000, 0x00000000, 0x00ffffff, 0x00000000 }, { 0x00000000, 0x00000000, 0x00ffffff, 0x00ffffff }, { 0x00000000, 0x00ffffff, 0x00000000, 0x00000000 }, { 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff }, { 0x00000000, 0x00ffffff, 0x00ffffff, 0x00000000 }, { 0x00000000, 0x00ffffff, 0x00ffffff, 0x00ffffff }, { 0x00ffffff, 0x00000000, 0x00000000, 0x00000000 }, { 0x00ffffff, 0x00000000, 0x00000000, 0x00ffffff }, { 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000 }, { 0x00ffffff, 0x00000000, 0x00ffffff, 0x00ffffff }, { 0x00ffffff, 0x00ffffff, 0x00000000, 0x00000000 }, { 0x00ffffff, 0x00ffffff, 0x00000000, 0x00ffffff }, { 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00000000 }, { 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff } };/******************************************************************************/static void video_drawchars (int xx, int yy, unsigned char *s, int count){ u8 *cdat, *dest, *dest0; int rows, offset, c;#ifdef CONFIG_VIDEO_SM501 WaitIdleEmpty();#endif offset = yy * VIDEO_LINE_LEN + xx * VIDEO_PIXEL_SIZE; if(offset % 4) offset = offset / 4 * 4; dest0 = video_fb_address + offset; switch (VIDEO_DATA_FORMAT) { case GDF__8BIT_INDEX: case GDF__8BIT_332RGB: while (count--) { c = *s; cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 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; } dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; s++; } break; case GDF_15BIT_555RGB: while (count--) { c = *s; cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; for (rows = VIDEO_FONT_HEIGHT, dest = dest0; rows--; dest += VIDEO_LINE_LEN) { u8 bits = *cdat++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -