📄 lcd.c.svn-base
字号:
/* * (C) Copyright 2001-2002 * Wolfgang Denk, DENX Software Engineering -- wd@denx.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 *//************************************************************************//* ** HEADER FILES *//************************************************************************//* #define DEBUG */#include <config.h>#include <common.h>#include <watchdog.h>#include <version.h>#include <stdarg.h>#include <lcdvideo.h>#include <linux/types.h>#include <devices.h>#if defined(CONFIG_POST)#include <post.h>#endif#include <lcd.h>#ifdef CONFIG_LCD/************************************************************************//* ** CONFIG STUFF -- should be moved to board config file *//************************************************************************/#define CONFIG_LCD_LOGO#define LCD_INFO /* Display Logo, (C) and system info */#if defined(CONFIG_V37) || defined(CONFIG_EDT32F10)#undef CONFIG_LCD_LOGO#undef LCD_INFO#endif/* #define LCD_TEST_PATTERN */ /* color backgnd for frame/color adjust *//* #define CFG_INVERT_COLORS */ /* Not needed - adjust vl_dp instead *//************************************************************************//************************************************************************//* ** BITMAP DISPLAY SUPPORT -- should probably be moved elsewhere *//************************************************************************/#if (CONFIG_COMMANDS & CFG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN)#include <bmp_layout.h>#endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) || CONFIG_SPLASH_SCREEN *//************************************************************************//* ** FONT AND LOGO DATA *//************************************************************************/#include <video_font.h> /* Get font data, width and height */#ifdef CONFIG_LCD_LOGO# include <bmp_logo.h> /* Get logo data, width and height */#endif/************************************************************************//************************************************************************//* * Information about displays we are using. This is for configuring * the LCD controller and memory allocation. Someone has to know what * is connected, as we can't autodetect anything. */#define CFG_HIGH 0 /* Pins are active high */#define CFG_LOW 1 /* Pins are active low */typedef struct vidinfo { ushort vl_col; /* Number of columns (i.e. 640) */ ushort vl_row; /* Number of rows (i.e. 480) */ ushort vl_width; /* Width of display area in millimeters */ ushort vl_height; /* Height of display area in millimeters */ /* LCD configuration register. */ u_char vl_clkp; /* Clock polarity */ u_char vl_oep; /* Output Enable polarity */ u_char vl_hsp; /* Horizontal Sync polarity */ u_char vl_vsp; /* Vertical Sync polarity */ u_char vl_dp; /* Data polarity */ u_char vl_bpix; /* Bits per pixel, 0 = 1, 1 = 2, 2 = 4, 3 = 8 */ u_char vl_lbw; /* LCD Bus width, 0 = 4, 1 = 8 */ u_char vl_splt; /* Split display, 0 = single-scan, 1 = dual-scan */ u_char vl_clor; /* Color, 0 = mono, 1 = color */ u_char vl_tft; /* 0 = passive, 1 = TFT */ /* Horizontal control register. Timing from data sheet. */ ushort vl_wbl; /* Wait between lines */ /* Vertical control register. */ u_char vl_vpw; /* Vertical sync pulse width */ u_char vl_lcdac; /* LCD AC timing */ u_char vl_wbf; /* Wait between frames */} vidinfo_t;#define LCD_MONOCHROME 0#define LCD_COLOR2 1#define LCD_COLOR4 2#define LCD_COLOR8 3/*----------------------------------------------------------------------*/#ifdef CONFIG_KYOCERA_KCS057QV1AJ/* * Kyocera KCS057QV1AJ-G23. Passive, color, single scan. */#define LCD_BPP LCD_COLOR4static vidinfo_t panel_info = { 640, 480, 132, 99, CFG_HIGH, CFG_HIGH, CFG_HIGH, CFG_HIGH, CFG_HIGH, LCD_BPP, 1, 0, 1, 0, 5, 0, 0, 0 /* wbl, vpw, lcdac, wbf */};#endif /* CONFIG_KYOCERA_KCS057QV1AJ *//*----------------------------------------------------------------------*//*----------------------------------------------------------------------*/#ifdef CONFIG_HITACHI_SP19X001_Z1A/* * Hitachi SP19X001-. Active, color, single scan. */static vidinfo_t panel_info = { 640, 480, 154, 116, CFG_HIGH, CFG_HIGH, CFG_HIGH, CFG_HIGH, CFG_HIGH, LCD_COLOR8, 1, 0, 1, 0, 0, 0, 0, 0 /* wbl, vpw, lcdac, wbf */};#endif /* CONFIG_HITACHI_SP19X001_Z1A *//*----------------------------------------------------------------------*//*----------------------------------------------------------------------*/#ifdef CONFIG_NEC_NL6448AC33/* * NEC NL6448AC33-18. Active, color, single scan. */static vidinfo_t panel_info = { 640, 480, 132, 99, CFG_HIGH, CFG_HIGH, CFG_LOW, CFG_LOW, CFG_HIGH, 3, 0, 0, 1, 1, 144, 2, 0, 33 /* wbl, vpw, lcdac, wbf */};#endif /* CONFIG_NEC_NL6448AC33 *//*----------------------------------------------------------------------*/#ifdef CONFIG_NEC_NL6448BC20/* * NEC NL6448BC20-08. 6.5", 640x480. Active, color, single scan. */static vidinfo_t panel_info = { 640, 480, 132, 99, CFG_HIGH, CFG_HIGH, CFG_LOW, CFG_LOW, CFG_HIGH, 3, 0, 0, 1, 1, 144, 2, 0, 33 /* wbl, vpw, lcdac, wbf */};#endif /* CONFIG_NEC_NL6448BC20 *//*----------------------------------------------------------------------*/#ifdef CONFIG_NEC_NL6448BC33_54/* * NEC NL6448BC33-54. 10.4", 640x480. Active, color, single scan. */static vidinfo_t panel_info = { 640, 480, 212, 158, CFG_HIGH, CFG_HIGH, CFG_LOW, CFG_LOW, CFG_HIGH, 3, 0, 0, 1, 1, 144, 2, 0, 33 /* wbl, vpw, lcdac, wbf */};#endif /* CONFIG_NEC_NL6448BC33_54 *//*----------------------------------------------------------------------*/#ifdef CONFIG_SHARP_LQ104V7DS01/* * SHARP LQ104V7DS01. 6.5", 640x480. Active, color, single scan. */static vidinfo_t panel_info = { 640, 480, 132, 99, CFG_HIGH, CFG_HIGH, CFG_LOW, CFG_LOW, CFG_LOW, 3, 0, 0, 1, 1, 25, 1, 0, 33 /* wbl, vpw, lcdac, wbf */};#endif /* CONFIG_SHARP_LQ104V7DS01 *//*----------------------------------------------------------------------*/#ifdef CONFIG_SHARP_16x9/* * Sharp 320x240. Active, color, single scan. It isn't 16x9, and I am * not sure what it is....... */static vidinfo_t panel_info = { 320, 240, 0, 0, CFG_HIGH, CFG_HIGH, CFG_HIGH, CFG_HIGH, CFG_HIGH, 3, 0, 0, 1, 1, 15, 4, 0, 3};#endif /* CONFIG_SHARP_16x9 *//*----------------------------------------------------------------------*/#ifdef CONFIG_SHARP_LQ057Q3DC02/* * Sharp LQ057Q3DC02 display. Active, color, single scan. */#define LCD_DF 12static vidinfo_t panel_info = { 320, 240, 0, 0, CFG_HIGH, CFG_HIGH, CFG_LOW, CFG_LOW, CFG_HIGH, 3, 0, 0, 1, 1, 15, 4, 0, 3 /* wbl, vpw, lcdac, wbf */};#define LCD_INFO_BELOW_LOGO#endif /* CONFIG_SHARP_LQ057Q3DC02 *//*----------------------------------------------------------------------*/#ifdef CONFIG_SHARP_LQ64D341/* * Sharp LQ64D341 display, 640x480. Active, color, single scan. */static vidinfo_t panel_info = { 640, 480, 0, 0, CFG_HIGH, CFG_HIGH, CFG_LOW, CFG_LOW, CFG_HIGH, 3, 0, 0, 1, 1, 128, 16, 0, 32 /* wbl, vpw, lcdac, wbf */};#endif /* CONFIG_SHARP_LQ64D341 */#ifdef CONFIG_SHARP_LQ065T9DR51U/* * Sharp LQ065T9DR51U display, 400x240. Active, color, single scan. */static vidinfo_t panel_info = { 400, 240, 143, 79, CFG_HIGH, CFG_HIGH, CFG_HIGH, CFG_HIGH, CFG_HIGH, 3, 0, 0, 1, 1, 248, 4, 0, 35 /* wbl, vpw, lcdac, wbf */};#define LCD_INFO_BELOW_LOGO#endif /* CONFIG_SHARP_LQ065T9DR51U */#ifdef CONFIG_SHARP_LQ084V1DG21/* * Sharp LQ084V1DG21 display, 640x480. Active, color, single scan. */static vidinfo_t panel_info = { 640, 480, 171, 129, CFG_HIGH, CFG_HIGH, CFG_LOW, CFG_LOW, CFG_LOW, 3, 0, 0, 1, 1, 160, 3, 0, 48 /* wbl, vpw, lcdac, wbf */};#endif /* CONFIG_SHARP_LQ084V1DG21 *//*----------------------------------------------------------------------*/#ifdef CONFIG_HLD1045/* * HLD1045 display, 640x480. Active, color, single scan. */static vidinfo_t panel_info = { 640, 480, 0, 0, CFG_HIGH, CFG_HIGH, CFG_LOW, CFG_LOW, CFG_HIGH, 3, 0, 0, 1, 1, 160, 3, 0, 48 /* wbl, vpw, lcdac, wbf */};#endif /* CONFIG_HLD1045 *//*----------------------------------------------------------------------*/#ifdef CONFIG_PRIMEVIEW_V16C6448AC/* * Prime View V16C6448AC */static vidinfo_t panel_info = { 640, 480, 130, 98, CFG_HIGH, CFG_HIGH, CFG_LOW, CFG_LOW, CFG_HIGH, 3, 0, 0, 1, 1, 144, 2, 0, 35 /* wbl, vpw, lcdac, wbf */};#endif /* CONFIG_PRIMEVIEW_V16C6448AC *//*----------------------------------------------------------------------*/#ifdef CONFIG_OPTREX_BW/* * Optrex CBL50840-2 NF-FW 99 22 M5 * or * Hitachi LMG6912RPFC-00T * or * Hitachi SP14Q002 * * 320x240. Black & white. */#define OPTREX_BPP 0 /* 0 - monochrome, 1 bpp */ /* 1 - 4 grey levels, 2 bpp */ /* 2 - 16 grey levels, 4 bpp */static vidinfo_t panel_info = { 320, 240, 0, 0, CFG_HIGH, CFG_HIGH, CFG_HIGH, CFG_HIGH, CFG_LOW, OPTREX_BPP, 0, 0, 0, 0, 0, 0, 0, 0, 4};#endif /* CONFIG_OPTREX_BW *//*-----------------------------------------------------------------*/#ifdef CONFIG_EDT32F10/* * Emerging Display Technologies 320x240. Passive, monochrome, single scan. */#define LCD_BPP LCD_MONOCHROME#define LCD_DF 10static vidinfo_t panel_info = { 320, 240, 0, 0, CFG_HIGH, CFG_HIGH, CFG_HIGH, CFG_HIGH, CFG_LOW, LCD_BPP, 0, 0, 0, 0, 33, 0, 0, 0};#endif/*----------------------------------------------------------------------*/#if defined(LCD_INFO_BELOW_LOGO)# define LCD_INFO_X 0# define LCD_INFO_Y (BMP_LOGO_HEIGHT + VIDEO_FONT_HEIGHT)#elif defined(CONFIG_LCD_LOGO)# define LCD_INFO_X (BMP_LOGO_WIDTH + 4 * VIDEO_FONT_WIDTH)# define LCD_INFO_Y (VIDEO_FONT_HEIGHT)#else# define LCD_INFO_X (VIDEO_FONT_WIDTH)# define LCD_INFO_Y (VIDEO_FONT_HEIGHT)#endif#ifndef LCD_BPP#define LCD_BPP LCD_COLOR8#endif#ifndef LCD_DF#define LCD_DF 1#endif#define NBITS(bit_code) (1 << (bit_code))#define NCOLORS(bit_code) (1 << NBITS(bit_code))static int lcd_line_length;static int lcd_color_fg;static int lcd_color_bg;char lcd_is_enabled = 0; /* Indicate that LCD is enabled *//* * Frame buffer memory information */static void *lcd_base; /* Start of framebuffer memory */static void *lcd_console_address; /* Start of console buffer *//************************************************************************//* ** CONSOLE CONSTANTS *//************************************************************************/#if LCD_BPP == LCD_MONOCHROME/* * Simple color definitions */#define CONSOLE_COLOR_BLACK 0#define CONSOLE_COLOR_WHITE 1 /* Must remain last / highest */#else/* * Simple color definitions */#define CONSOLE_COLOR_BLACK 0#define CONSOLE_COLOR_RED 1#define CONSOLE_COLOR_GREEN 2#define CONSOLE_COLOR_YELLOW 3#define CONSOLE_COLOR_BLUE 4#define CONSOLE_COLOR_MAGENTA 5#define CONSOLE_COLOR_CYAN 6#define CONSOLE_COLOR_GREY 14#define CONSOLE_COLOR_WHITE 15 /* Must remain last / highest */#endif#if defined(CONFIG_LCD_LOGO) && (CONSOLE_COLOR_WHITE >= BMP_LOGO_OFFSET)#error Default Color Map overlaps with Logo Color Map#endif/************************************************************************/#ifndef PAGE_SIZE#define PAGE_SIZE 4096#endif/************************************************************************//* ** CONSOLE DEFINITIONS & FUNCTIONS *//************************************************************************/#if defined(CONFIG_LCD_LOGO) && !defined(LCD_INFO_BELOW_LOGO)#define CONSOLE_ROWS ((panel_info.vl_row-BMP_LOGO_HEIGHT) \ / VIDEO_FONT_HEIGHT)#else#define CONSOLE_ROWS (panel_info.vl_row / VIDEO_FONT_HEIGHT)#endif#define CONSOLE_COLS (panel_info.vl_col / VIDEO_FONT_WIDTH)#define CONSOLE_ROW_SIZE (VIDEO_FONT_HEIGHT * lcd_line_length)#define CONSOLE_ROW_FIRST (lcd_console_address)#define CONSOLE_ROW_SECOND (lcd_console_address + CONSOLE_ROW_SIZE)#define CONSOLE_ROW_LAST (lcd_console_address + CONSOLE_SIZE \ - CONSOLE_ROW_SIZE)#define CONSOLE_SIZE (CONSOLE_ROW_SIZE * CONSOLE_ROWS)#define CONSOLE_SCROLL_SIZE (CONSOLE_SIZE - CONSOLE_ROW_SIZE)#if LCD_BPP == LCD_MONOCHROME#define COLOR_MASK(c) ((c) | (c) << 1 | (c) << 2 | (c) << 3 | \ (c) << 4 | (c) << 5 | (c) << 6 | (c) << 7)#elif LCD_BPP == LCD_COLOR8#define COLOR_MASK(c) (c)#else#error Unsupported LCD BPP.#endifstatic short console_col;static short console_row;/************************************************************************/ulong lcd_setmem (ulong addr);static void lcd_drawchars (ushort x, ushort y, uchar *str, int count);static inline void lcd_puts_xy (ushort x, ushort y, uchar *s);static inline void lcd_putc_xy (ushort x, ushort y, uchar c);int lcd_init (void *lcdbase);static void lcd_ctrl_init (void *lcdbase);static void lcd_enable (void);static void *lcd_logo (void);#if LCD_BPP == LCD_COLOR8static void lcd_setcolreg (ushort regno, ushort red, ushort green, ushort blue);#endif#if LCD_BPP == LCD_MONOCHROMEstatic void lcd_initcolregs (void);#endifstatic int lcd_getbgcolor (void);static void lcd_setfgcolor (int color);static void lcd_setbgcolor (int color);#if defined(CONFIG_RBC823)void lcd_disable (void);#endif#ifdef NOT_USED_SO_FARstatic void lcd_getcolreg (ushort regno,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -