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