1fe8c2806Swdenk /* 2*8655b6f8Swdenk * MPC823 and PXA LCD Controller 3fe8c2806Swdenk * 4fe8c2806Swdenk * Modeled after video interface by Paolo Scaffardi 5fe8c2806Swdenk * 6fe8c2806Swdenk * 7fe8c2806Swdenk * (C) Copyright 2001 8fe8c2806Swdenk * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 9fe8c2806Swdenk * 10fe8c2806Swdenk * See file CREDITS for list of people who contributed to this 11fe8c2806Swdenk * project. 12fe8c2806Swdenk * 13fe8c2806Swdenk * This program is free software; you can redistribute it and/or 14fe8c2806Swdenk * modify it under the terms of the GNU General Public License as 15fe8c2806Swdenk * published by the Free Software Foundation; either version 2 of 16fe8c2806Swdenk * the License, or (at your option) any later version. 17fe8c2806Swdenk * 18fe8c2806Swdenk * This program is distributed in the hope that it will be useful, 19fe8c2806Swdenk * but WITHOUT ANY WARRANTY; without even the implied warranty of 20fe8c2806Swdenk * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21fe8c2806Swdenk * GNU General Public License for more details. 22fe8c2806Swdenk * 23fe8c2806Swdenk * You should have received a copy of the GNU General Public License 24fe8c2806Swdenk * along with this program; if not, write to the Free Software 25fe8c2806Swdenk * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 26fe8c2806Swdenk * MA 02111-1307 USA 27fe8c2806Swdenk */ 28fe8c2806Swdenk 29fe8c2806Swdenk #ifndef _LCD_H_ 30fe8c2806Swdenk #define _LCD_H_ 31fe8c2806Swdenk 32*8655b6f8Swdenk extern char lcd_is_enabled; 33*8655b6f8Swdenk 34*8655b6f8Swdenk extern int lcd_line_length; 35*8655b6f8Swdenk extern int lcd_color_fg; 36*8655b6f8Swdenk extern int lcd_color_bg; 37*8655b6f8Swdenk 38*8655b6f8Swdenk /* 39*8655b6f8Swdenk * Frame buffer memory information 40*8655b6f8Swdenk */ 41*8655b6f8Swdenk extern void *lcd_base; /* Start of framebuffer memory */ 42*8655b6f8Swdenk extern void *lcd_console_address; /* Start of console buffer */ 43*8655b6f8Swdenk 44*8655b6f8Swdenk extern short console_col; 45*8655b6f8Swdenk extern short console_row; 46*8655b6f8Swdenk 47*8655b6f8Swdenk #if defined CONFIG_MPC823 48*8655b6f8Swdenk /* 49*8655b6f8Swdenk * LCD controller stucture for MPC823 CPU 50*8655b6f8Swdenk */ 51*8655b6f8Swdenk typedef struct vidinfo { 52*8655b6f8Swdenk ushort vl_col; /* Number of columns (i.e. 640) */ 53*8655b6f8Swdenk ushort vl_row; /* Number of rows (i.e. 480) */ 54*8655b6f8Swdenk ushort vl_width; /* Width of display area in millimeters */ 55*8655b6f8Swdenk ushort vl_height; /* Height of display area in millimeters */ 56*8655b6f8Swdenk 57*8655b6f8Swdenk /* LCD configuration register */ 58*8655b6f8Swdenk u_char vl_clkp; /* Clock polarity */ 59*8655b6f8Swdenk u_char vl_oep; /* Output Enable polarity */ 60*8655b6f8Swdenk u_char vl_hsp; /* Horizontal Sync polarity */ 61*8655b6f8Swdenk u_char vl_vsp; /* Vertical Sync polarity */ 62*8655b6f8Swdenk u_char vl_dp; /* Data polarity */ 63*8655b6f8Swdenk u_char vl_bpix; /* Bits per pixel, 0 = 1, 1 = 2, 2 = 4, 3 = 8 */ 64*8655b6f8Swdenk u_char vl_lbw; /* LCD Bus width, 0 = 4, 1 = 8 */ 65*8655b6f8Swdenk u_char vl_splt; /* Split display, 0 = single-scan, 1 = dual-scan */ 66*8655b6f8Swdenk u_char vl_clor; /* Color, 0 = mono, 1 = color */ 67*8655b6f8Swdenk u_char vl_tft; /* 0 = passive, 1 = TFT */ 68*8655b6f8Swdenk 69*8655b6f8Swdenk /* Horizontal control register. Timing from data sheet */ 70*8655b6f8Swdenk ushort vl_wbl; /* Wait between lines */ 71*8655b6f8Swdenk 72*8655b6f8Swdenk /* Vertical control register */ 73*8655b6f8Swdenk u_char vl_vpw; /* Vertical sync pulse width */ 74*8655b6f8Swdenk u_char vl_lcdac; /* LCD AC timing */ 75*8655b6f8Swdenk u_char vl_wbf; /* Wait between frames */ 76*8655b6f8Swdenk } vidinfo_t; 77*8655b6f8Swdenk 78*8655b6f8Swdenk extern vidinfo_t panel_info; 79*8655b6f8Swdenk 80*8655b6f8Swdenk #elif defined CONFIG_PXA250 81*8655b6f8Swdenk /* 82*8655b6f8Swdenk * PXA LCD DMA descriptor 83*8655b6f8Swdenk */ 84*8655b6f8Swdenk struct pxafb_dma_descriptor { 85*8655b6f8Swdenk u_long fdadr; /* Frame descriptor address register */ 86*8655b6f8Swdenk u_long fsadr; /* Frame source address register */ 87*8655b6f8Swdenk u_long fidr; /* Frame ID register */ 88*8655b6f8Swdenk u_long ldcmd; /* Command register */ 89*8655b6f8Swdenk }; 90*8655b6f8Swdenk 91*8655b6f8Swdenk /* 92*8655b6f8Swdenk * PXA LCD info 93*8655b6f8Swdenk */ 94*8655b6f8Swdenk struct pxafb_info { 95*8655b6f8Swdenk 96*8655b6f8Swdenk /* Misc registers */ 97*8655b6f8Swdenk u_long reg_lccr3; 98*8655b6f8Swdenk u_long reg_lccr2; 99*8655b6f8Swdenk u_long reg_lccr1; 100*8655b6f8Swdenk u_long reg_lccr0; 101*8655b6f8Swdenk u_long fdadr0; 102*8655b6f8Swdenk u_long fdadr1; 103*8655b6f8Swdenk 104*8655b6f8Swdenk /* DMA descriptors */ 105*8655b6f8Swdenk struct pxafb_dma_descriptor * dmadesc_fblow; 106*8655b6f8Swdenk struct pxafb_dma_descriptor * dmadesc_fbhigh; 107*8655b6f8Swdenk struct pxafb_dma_descriptor * dmadesc_palette; 108*8655b6f8Swdenk 109*8655b6f8Swdenk u_long screen; /* physical address of frame buffer */ 110*8655b6f8Swdenk u_long palette; /* physical address of palette memory */ 111*8655b6f8Swdenk u_int palette_size; 112*8655b6f8Swdenk }; 113*8655b6f8Swdenk 114*8655b6f8Swdenk /* 115*8655b6f8Swdenk * LCD controller stucture for PXA CPU 116*8655b6f8Swdenk */ 117*8655b6f8Swdenk typedef struct vidinfo { 118*8655b6f8Swdenk ushort vl_col; /* Number of columns (i.e. 640) */ 119*8655b6f8Swdenk ushort vl_row; /* Number of rows (i.e. 480) */ 120*8655b6f8Swdenk ushort vl_width; /* Width of display area in millimeters */ 121*8655b6f8Swdenk ushort vl_height; /* Height of display area in millimeters */ 122*8655b6f8Swdenk 123*8655b6f8Swdenk /* LCD configuration register */ 124*8655b6f8Swdenk u_char vl_clkp; /* Clock polarity */ 125*8655b6f8Swdenk u_char vl_oep; /* Output Enable polarity */ 126*8655b6f8Swdenk u_char vl_hsp; /* Horizontal Sync polarity */ 127*8655b6f8Swdenk u_char vl_vsp; /* Vertical Sync polarity */ 128*8655b6f8Swdenk u_char vl_dp; /* Data polarity */ 129*8655b6f8Swdenk u_char vl_bpix; /* Bits per pixel, 0 = 1, 1 = 2, 2 = 4, 3 = 8, 4 = 16 */ 130*8655b6f8Swdenk u_char vl_lbw; /* LCD Bus width, 0 = 4, 1 = 8 */ 131*8655b6f8Swdenk u_char vl_splt; /* Split display, 0 = single-scan, 1 = dual-scan */ 132*8655b6f8Swdenk u_char vl_clor; /* Color, 0 = mono, 1 = color */ 133*8655b6f8Swdenk u_char vl_tft; /* 0 = passive, 1 = TFT */ 134*8655b6f8Swdenk 135*8655b6f8Swdenk /* Horizontal control register. Timing from data sheet */ 136*8655b6f8Swdenk ushort vl_hpw; /* Horz sync pulse width */ 137*8655b6f8Swdenk u_char vl_blw; /* Wait before of line */ 138*8655b6f8Swdenk u_char vl_elw; /* Wait end of line */ 139*8655b6f8Swdenk 140*8655b6f8Swdenk /* Vertical control register. */ 141*8655b6f8Swdenk u_char vl_vpw; /* Vertical sync pulse width */ 142*8655b6f8Swdenk u_char vl_bfw; /* Wait before of frame */ 143*8655b6f8Swdenk u_char vl_efw; /* Wait end of frame */ 144*8655b6f8Swdenk 145*8655b6f8Swdenk /* PXA LCD controller params */ 146*8655b6f8Swdenk struct pxafb_info pxa; 147*8655b6f8Swdenk } vidinfo_t; 148*8655b6f8Swdenk 149*8655b6f8Swdenk extern vidinfo_t panel_info; 150*8655b6f8Swdenk 151*8655b6f8Swdenk #endif /* CONFIG_MPC823 or CONFIG_PXA250 */ 152*8655b6f8Swdenk 153*8655b6f8Swdenk /* Video functions */ 154*8655b6f8Swdenk 155682011ffSwdenk #if defined(CONFIG_RBC823) 156682011ffSwdenk void lcd_disable (void); 157682011ffSwdenk #endif 158682011ffSwdenk 159fe8c2806Swdenk 160c3f4d17eSwdenk /* int lcd_init (void *lcdbase); */ 161fe8c2806Swdenk void lcd_putc (const char c); 162fe8c2806Swdenk void lcd_puts (const char *s); 163fe8c2806Swdenk void lcd_printf (const char *fmt, ...); 164fe8c2806Swdenk 165*8655b6f8Swdenk 166*8655b6f8Swdenk /************************************************************************/ 167*8655b6f8Swdenk /* ** BITMAP DISPLAY SUPPORT */ 168*8655b6f8Swdenk /************************************************************************/ 169*8655b6f8Swdenk #if (CONFIG_COMMANDS & CFG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN) 170*8655b6f8Swdenk # include <bmp_layout.h> 171*8655b6f8Swdenk # include <asm/byteorder.h> 172*8655b6f8Swdenk #endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) || CONFIG_SPLASH_SCREEN */ 173*8655b6f8Swdenk 174*8655b6f8Swdenk /************************************************************************/ 175*8655b6f8Swdenk /* ** LOGO DATA */ 176*8655b6f8Swdenk /************************************************************************/ 177*8655b6f8Swdenk #ifdef CONFIG_LCD_LOGO 178*8655b6f8Swdenk # include <bmp_logo.h> /* Get logo data, width and height */ 179fe8c2806Swdenk #endif 180*8655b6f8Swdenk 181*8655b6f8Swdenk /* 182*8655b6f8Swdenk * Information about displays we are using. This is for configuring 183*8655b6f8Swdenk * the LCD controller and memory allocation. Someone has to know what 184*8655b6f8Swdenk * is connected, as we can't autodetect anything. 185*8655b6f8Swdenk */ 186*8655b6f8Swdenk #define CFG_HIGH 0 /* Pins are active high */ 187*8655b6f8Swdenk #define CFG_LOW 1 /* Pins are active low */ 188*8655b6f8Swdenk 189*8655b6f8Swdenk #define LCD_MONOCHROME 0 190*8655b6f8Swdenk #define LCD_COLOR2 1 191*8655b6f8Swdenk #define LCD_COLOR4 2 192*8655b6f8Swdenk #define LCD_COLOR8 3 193*8655b6f8Swdenk #define LCD_COLOR16 4 194*8655b6f8Swdenk 195*8655b6f8Swdenk /*----------------------------------------------------------------------*/ 196*8655b6f8Swdenk #if defined(LCD_INFO_BELOW_LOGO) 197*8655b6f8Swdenk # define LCD_INFO_X 0 198*8655b6f8Swdenk # define LCD_INFO_Y (BMP_LOGO_HEIGHT + VIDEO_FONT_HEIGHT) 199*8655b6f8Swdenk #elif defined(CONFIG_LCD_LOGO) 200*8655b6f8Swdenk # define LCD_INFO_X (BMP_LOGO_WIDTH + 4 * VIDEO_FONT_WIDTH) 201*8655b6f8Swdenk # define LCD_INFO_Y (VIDEO_FONT_HEIGHT) 202*8655b6f8Swdenk #else 203*8655b6f8Swdenk # define LCD_INFO_X (VIDEO_FONT_WIDTH) 204*8655b6f8Swdenk # define LCD_INFO_Y (VIDEO_FONT_HEIGHT) 205*8655b6f8Swdenk #endif 206*8655b6f8Swdenk 207*8655b6f8Swdenk /* Default to 8bpp if bit depth not specified */ 208*8655b6f8Swdenk #ifndef LCD_BPP 209*8655b6f8Swdenk # define LCD_BPP LCD_COLOR8 210*8655b6f8Swdenk #endif 211*8655b6f8Swdenk #ifndef LCD_DF 212*8655b6f8Swdenk # define LCD_DF 1 213*8655b6f8Swdenk #endif 214*8655b6f8Swdenk 215*8655b6f8Swdenk /* Calculate nr. of bits per pixel and nr. of colors */ 216*8655b6f8Swdenk #define NBITS(bit_code) (1 << (bit_code)) 217*8655b6f8Swdenk #define NCOLORS(bit_code) (1 << NBITS(bit_code)) 218*8655b6f8Swdenk 219*8655b6f8Swdenk /************************************************************************/ 220*8655b6f8Swdenk /* ** CONSOLE CONSTANTS */ 221*8655b6f8Swdenk /************************************************************************/ 222*8655b6f8Swdenk #if LCD_BPP == LCD_MONOCHROME 223*8655b6f8Swdenk 224*8655b6f8Swdenk /* 225*8655b6f8Swdenk * Simple black/white definitions 226*8655b6f8Swdenk */ 227*8655b6f8Swdenk # define CONSOLE_COLOR_BLACK 0 228*8655b6f8Swdenk # define CONSOLE_COLOR_WHITE 1 /* Must remain last / highest */ 229*8655b6f8Swdenk 230*8655b6f8Swdenk #elif LCD_BPP == LCD_COLOR8 231*8655b6f8Swdenk 232*8655b6f8Swdenk /* 233*8655b6f8Swdenk * 8bpp color definitions 234*8655b6f8Swdenk */ 235*8655b6f8Swdenk # define CONSOLE_COLOR_BLACK 0 236*8655b6f8Swdenk # define CONSOLE_COLOR_RED 1 237*8655b6f8Swdenk # define CONSOLE_COLOR_GREEN 2 238*8655b6f8Swdenk # define CONSOLE_COLOR_YELLOW 3 239*8655b6f8Swdenk # define CONSOLE_COLOR_BLUE 4 240*8655b6f8Swdenk # define CONSOLE_COLOR_MAGENTA 5 241*8655b6f8Swdenk # define CONSOLE_COLOR_CYAN 6 242*8655b6f8Swdenk # define CONSOLE_COLOR_GREY 14 243*8655b6f8Swdenk # define CONSOLE_COLOR_WHITE 15 /* Must remain last / highest */ 244*8655b6f8Swdenk 245*8655b6f8Swdenk #else 246*8655b6f8Swdenk 247*8655b6f8Swdenk /* 248*8655b6f8Swdenk * 16bpp color definitions 249*8655b6f8Swdenk */ 250*8655b6f8Swdenk # define CONSOLE_COLOR_BLACK 0x0000 251*8655b6f8Swdenk # define CONSOLE_COLOR_WHITE 0xffff /* Must remain last / highest */ 252*8655b6f8Swdenk 253*8655b6f8Swdenk #endif /* color definitions */ 254*8655b6f8Swdenk 255*8655b6f8Swdenk #if defined(CONFIG_LCD_LOGO) && (CONSOLE_COLOR_WHITE >= BMP_LOGO_OFFSET) 256*8655b6f8Swdenk # error Default Color Map overlaps with Logo Color Map 257*8655b6f8Swdenk #endif 258*8655b6f8Swdenk 259*8655b6f8Swdenk /************************************************************************/ 260*8655b6f8Swdenk #ifndef PAGE_SIZE 261*8655b6f8Swdenk # define PAGE_SIZE 4096 262*8655b6f8Swdenk #endif 263*8655b6f8Swdenk 264*8655b6f8Swdenk /************************************************************************/ 265*8655b6f8Swdenk /* ** CONSOLE DEFINITIONS & FUNCTIONS */ 266*8655b6f8Swdenk /************************************************************************/ 267*8655b6f8Swdenk #if defined(CONFIG_LCD_LOGO) && !defined(LCD_INFO_BELOW_LOGO) 268*8655b6f8Swdenk # define CONSOLE_ROWS ((panel_info.vl_row-BMP_LOGO_HEIGHT) \ 269*8655b6f8Swdenk / VIDEO_FONT_HEIGHT) 270*8655b6f8Swdenk #else 271*8655b6f8Swdenk # define CONSOLE_ROWS (panel_info.vl_row / VIDEO_FONT_HEIGHT) 272*8655b6f8Swdenk #endif 273*8655b6f8Swdenk 274*8655b6f8Swdenk #define CONSOLE_COLS (panel_info.vl_col / VIDEO_FONT_WIDTH) 275*8655b6f8Swdenk #define CONSOLE_ROW_SIZE (VIDEO_FONT_HEIGHT * lcd_line_length) 276*8655b6f8Swdenk #define CONSOLE_ROW_FIRST (lcd_console_address) 277*8655b6f8Swdenk #define CONSOLE_ROW_SECOND (lcd_console_address + CONSOLE_ROW_SIZE) 278*8655b6f8Swdenk #define CONSOLE_ROW_LAST (lcd_console_address + CONSOLE_SIZE \ 279*8655b6f8Swdenk - CONSOLE_ROW_SIZE) 280*8655b6f8Swdenk #define CONSOLE_SIZE (CONSOLE_ROW_SIZE * CONSOLE_ROWS) 281*8655b6f8Swdenk #define CONSOLE_SCROLL_SIZE (CONSOLE_SIZE - CONSOLE_ROW_SIZE) 282*8655b6f8Swdenk 283*8655b6f8Swdenk #if LCD_BPP == LCD_MONOCHROME 284*8655b6f8Swdenk # define COLOR_MASK(c) ((c) | (c) << 1 | (c) << 2 | (c) << 3 | \ 285*8655b6f8Swdenk (c) << 4 | (c) << 5 | (c) << 6 | (c) << 7) 286*8655b6f8Swdenk #elif LCD_BPP == LCD_COLOR8 287*8655b6f8Swdenk # define COLOR_MASK(c) (c) 288*8655b6f8Swdenk #else 289*8655b6f8Swdenk # error Unsupported LCD BPP. 290*8655b6f8Swdenk #endif 291*8655b6f8Swdenk 292*8655b6f8Swdenk /************************************************************************/ 293*8655b6f8Swdenk 294*8655b6f8Swdenk #endif /* _LCD_H_ */ 295