⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfb_console.c

📁 F:worksip2440a board可启动u-boot-like.tar.gz F:worksip2440a board可启动u-boot-like.tar.gz
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * (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 + -