fbconsole.c
来自「cpc-1631的BSP包for VxWorks操作系统」· C语言 代码 · 共 911 行 · 第 1/3 页
C
911 行
/*
* (C) Copyright 2002 WIS Technologies.
* James Dougherty <jfd@wischip.com>
*/
/*
* (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
*/
/*
* fbconsole.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 <osl_vx.h>*/
/*****************************************************************************/
/* Console device defines with SMI graphic */
/* Any other graphic must change this section */
/*****************************************************************************/
#ifdef CONFIG_VIDEO_SMI_LYNXEM
#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
#define VIDEO_FB_LITTLE_ENDIAN
#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 "wis_types.h"*/
#include "video_font.h"
/*****************************************************************************/
/* 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
#endif
void 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 */
/*
* Always show bitmap on boot.
*/
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#ifdef CONFIG_VIDEO_LOGO
#ifdef CONFIG_VIDEO_BMP_LOGO
#include "bmp_logo.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
#define DEBUG
#define DEBUG_CFB_CONSOLE
#if defined(DEBUG) || defined(DEBUG_CFB_CONSOLE)
#define PRINTD(x) printf(x)
#else
#define PRINTD(x)
#endif
/* Locals */
static GraphicDevice *pGD; /* Pointer to Graphic array */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?