blob: f76fca77f9f57f03fd2a79bd4e54c470f7d0ee96 [file] [log] [blame]
wdenkfe8c2802002-11-03 00:38:21 +00001/*
wdenk8655b6f2004-10-09 23:25:58 +00002 * MPC823 and PXA LCD Controller
wdenkfe8c2802002-11-03 00:38:21 +00003 *
4 * Modeled after video interface by Paolo Scaffardi
5 *
6 *
7 * (C) Copyright 2001
8 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
9 *
Wolfgang Denk3765b3e2013-10-07 13:07:26 +020010 * SPDX-License-Identifier: GPL-2.0+
wdenkfe8c2802002-11-03 00:38:21 +000011 */
12
13#ifndef _LCD_H_
14#define _LCD_H_
Nikita Kiryanov904672e2014-12-08 17:14:45 +020015#include <lcd_console.h>
Nikita Kiryanovc8d2feb2015-02-03 13:32:29 +020016#if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN)
17#include <bmp_layout.h>
18#include <asm/byteorder.h>
19#endif
wdenkfe8c2802002-11-03 00:38:21 +000020
Simon Glass6cbf5de2016-01-18 19:52:16 -070021int bmp_display(ulong addr, int x, int y);
22struct bmp_image *gunzip_bmp(unsigned long addr, unsigned long *lenp,
23 void **alloc_addr);
24
25#ifndef CONFIG_DM_VIDEO
26
wdenk682011f2003-06-03 23:54:09 +000027extern char lcd_is_enabled;
wdenk8655b6f2004-10-09 23:25:58 +000028extern int lcd_line_length;
Alessandro Rubini61117222009-07-19 17:52:27 +020029extern struct vidinfo panel_info;
30
Jeroen Hofstee6b035142013-01-12 12:07:56 +000031void lcd_ctrl_init(void *lcdbase);
32void lcd_enable(void);
Jeroen Hofstee6b035142013-01-12 12:07:56 +000033void lcd_setcolreg(ushort regno, ushort red, ushort green, ushort blue);
Alessandro Rubini61117222009-07-19 17:52:27 +020034
Simon Glass9a8efc42012-10-30 13:40:18 +000035/**
36 * Set whether we need to flush the dcache when changing the LCD image. This
37 * defaults to off.
38 *
39 * @param flush non-zero to flush cache after update, 0 to skip
40 */
41void lcd_set_flush_dcache(int flush);
42
wdenk8655b6f2004-10-09 23:25:58 +000043#if defined CONFIG_MPC823
Nikita Kiryanovbaaa7dd2015-02-03 13:32:20 +020044#include <mpc823_lcd.h>
Marek Vasutabc20ab2011-11-26 07:20:07 +010045#elif defined(CONFIG_CPU_PXA25X) || defined(CONFIG_CPU_PXA27X) || \
46 defined CONFIG_CPU_MONAHANS
Nikita Kiryanovbaaa7dd2015-02-03 13:32:20 +020047#include <pxa_lcd.h>
Bo Shenf6b690e2012-05-25 00:59:58 +000048#elif defined(CONFIG_ATMEL_LCD) || defined(CONFIG_ATMEL_HLCD)
Nikita Kiryanovbaaa7dd2015-02-03 13:32:20 +020049#include <atmel_lcd.h>
Donghwa Lee559a05c2012-04-05 19:36:15 +000050#elif defined(CONFIG_EXYNOS_FB)
Nikita Kiryanovbaaa7dd2015-02-03 13:32:20 +020051#include <exynos_lcd.h>
Guennadi Liakhovetskib245e652009-02-06 10:37:53 +010052#else
Guennadi Liakhovetskib245e652009-02-06 10:37:53 +010053typedef struct vidinfo {
54 ushort vl_col; /* Number of columns (i.e. 160) */
55 ushort vl_row; /* Number of rows (i.e. 100) */
Hannes Petermaier604c7d42015-03-27 08:01:38 +010056 ushort vl_rot; /* Rotation of Display (0, 1, 2, 3) */
Guennadi Liakhovetskib245e652009-02-06 10:37:53 +010057 u_char vl_bpix; /* Bits per pixel, 0 = 1 */
Guennadi Liakhovetskib245e652009-02-06 10:37:53 +010058 ushort *cmap; /* Pointer to the colormap */
Guennadi Liakhovetskib245e652009-02-06 10:37:53 +010059 void *priv; /* Pointer to driver-specific data */
60} vidinfo_t;
Nikita Kiryanov38b55082015-02-03 13:32:21 +020061
62static __maybe_unused ushort *configuration_get_cmap(void)
63{
64 return panel_info.cmap;
65}
Nikita Kiryanovbaaa7dd2015-02-03 13:32:20 +020066#endif
wdenk8655b6f2004-10-09 23:25:58 +000067
Nikita Kiryanov38b55082015-02-03 13:32:21 +020068ushort *configuration_get_cmap(void);
69
Alessandro Rubini60e97412009-07-21 14:09:45 +020070extern vidinfo_t panel_info;
71
Nikita Kiryanovc8d2feb2015-02-03 13:32:29 +020072void lcd_putc(const char c);
73void lcd_puts(const char *s);
74void lcd_printf(const char *fmt, ...);
75void lcd_clear(void);
76int lcd_display_bitmap(ulong bmp_image, int x, int y);
wdenkfe8c2802002-11-03 00:38:21 +000077
Vadim Bendebury395166c2012-09-28 15:11:13 +000078/**
79 * Get the width of the LCD in pixels
80 *
81 * @return width of LCD in pixels
82 */
83int lcd_get_pixel_width(void);
84
85/**
86 * Get the height of the LCD in pixels
87 *
88 * @return height of LCD in pixels
89 */
90int lcd_get_pixel_height(void);
91
92/**
93 * Get the number of text lines/rows on the LCD
94 *
95 * @return number of rows
96 */
97int lcd_get_screen_rows(void);
98
99/**
100 * Get the number of text columns on the LCD
101 *
102 * @return number of columns
103 */
104int lcd_get_screen_columns(void);
105
106/**
Nikita Kiryanov4d036342014-12-08 17:14:43 +0200107 * Get the background color of the LCD
108 *
109 * @return background color value
110 */
111int lcd_getbgcolor(void);
112
113/**
114 * Get the foreground color of the LCD
115 *
116 * @return foreground color value
117 */
118int lcd_getfgcolor(void);
119
120/**
Vadim Bendebury395166c2012-09-28 15:11:13 +0000121 * Set the position of the text cursor
122 *
123 * @param col Column to place cursor (0 = left side)
124 * @param row Row to place cursor (0 = top line)
125 */
126void lcd_position_cursor(unsigned col, unsigned row);
127
Haavard Skinnemoen6b59e032008-09-01 16:21:22 +0200128/* Allow boards to customize the information displayed */
129void lcd_show_board_info(void);
wdenk8655b6f2004-10-09 23:25:58 +0000130
Simon Glass676d3192012-10-17 13:24:54 +0000131/* Return the size of the LCD frame buffer, and the line length */
132int lcd_get_size(int *line_length);
133
Simon Glass7d95f2a2014-02-27 13:26:19 -0700134/* Update the LCD / flush the cache */
135void lcd_sync(void);
136
wdenk8655b6f2004-10-09 23:25:58 +0000137/*
138 * Information about displays we are using. This is for configuring
139 * the LCD controller and memory allocation. Someone has to know what
140 * is connected, as we can't autodetect anything.
141 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200142#define CONFIG_SYS_HIGH 0 /* Pins are active high */
Jeroen Hofstee6b035142013-01-12 12:07:56 +0000143#define CONFIG_SYS_LOW 1 /* Pins are active low */
wdenk8655b6f2004-10-09 23:25:58 +0000144
145#define LCD_MONOCHROME 0
146#define LCD_COLOR2 1
147#define LCD_COLOR4 2
148#define LCD_COLOR8 3
149#define LCD_COLOR16 4
Hannes Petermaier57d76a82014-03-07 18:55:40 +0100150#define LCD_COLOR32 5
Nikita Kiryanovc8d2feb2015-02-03 13:32:29 +0200151
wdenk88804d12005-07-04 00:03:16 +0000152#if defined(CONFIG_LCD_INFO_BELOW_LOGO)
Nikita Kiryanovc8d2feb2015-02-03 13:32:29 +0200153#define LCD_INFO_X 0
154#define LCD_INFO_Y (BMP_LOGO_HEIGHT + VIDEO_FONT_HEIGHT)
wdenk8655b6f2004-10-09 23:25:58 +0000155#elif defined(CONFIG_LCD_LOGO)
Nikita Kiryanovc8d2feb2015-02-03 13:32:29 +0200156#define LCD_INFO_X (BMP_LOGO_WIDTH + 4 * VIDEO_FONT_WIDTH)
157#define LCD_INFO_Y VIDEO_FONT_HEIGHT
wdenk8655b6f2004-10-09 23:25:58 +0000158#else
Nikita Kiryanovc8d2feb2015-02-03 13:32:29 +0200159#define LCD_INFO_X VIDEO_FONT_WIDTH
160#define LCD_INFO_Y VIDEO_FONT_HEIGHT
wdenk8655b6f2004-10-09 23:25:58 +0000161#endif
162
163/* Default to 8bpp if bit depth not specified */
164#ifndef LCD_BPP
Nikita Kiryanovc8d2feb2015-02-03 13:32:29 +0200165#define LCD_BPP LCD_COLOR8
wdenk8655b6f2004-10-09 23:25:58 +0000166#endif
Nikita Kiryanovc8d2feb2015-02-03 13:32:29 +0200167
wdenk8655b6f2004-10-09 23:25:58 +0000168#ifndef LCD_DF
Nikita Kiryanovc8d2feb2015-02-03 13:32:29 +0200169#define LCD_DF 1
wdenk8655b6f2004-10-09 23:25:58 +0000170#endif
171
172/* Calculate nr. of bits per pixel and nr. of colors */
173#define NBITS(bit_code) (1 << (bit_code))
174#define NCOLORS(bit_code) (1 << NBITS(bit_code))
175
Nikita Kiryanovf4469f52014-12-08 17:14:38 +0200176#if LCD_BPP == LCD_COLOR8
wdenk8655b6f2004-10-09 23:25:58 +0000177# define CONSOLE_COLOR_BLACK 0
178# define CONSOLE_COLOR_RED 1
179# define CONSOLE_COLOR_GREEN 2
180# define CONSOLE_COLOR_YELLOW 3
181# define CONSOLE_COLOR_BLUE 4
182# define CONSOLE_COLOR_MAGENTA 5
183# define CONSOLE_COLOR_CYAN 6
184# define CONSOLE_COLOR_GREY 14
Nikita Kiryanovc8d2feb2015-02-03 13:32:29 +0200185# define CONSOLE_COLOR_WHITE 15 /* Must remain last / highest */
Hannes Petermaier57d76a82014-03-07 18:55:40 +0100186#elif LCD_BPP == LCD_COLOR32
Nikita Kiryanovc8d2feb2015-02-03 13:32:29 +0200187#define CONSOLE_COLOR_RED 0x00ff0000
188#define CONSOLE_COLOR_GREEN 0x0000ff00
189#define CONSOLE_COLOR_YELLOW 0x00ffff00
190#define CONSOLE_COLOR_BLUE 0x000000ff
191#define CONSOLE_COLOR_MAGENTA 0x00ff00ff
192#define CONSOLE_COLOR_CYAN 0x0000ffff
193#define CONSOLE_COLOR_GREY 0x00aaaaaa
194#define CONSOLE_COLOR_BLACK 0x00000000
195#define CONSOLE_COLOR_WHITE 0x00ffffff /* Must remain last / highest */
196#define NBYTES(bit_code) (NBITS(bit_code) >> 3)
197#else /* 16bpp color definitions */
Andreas Neubachere32951b2016-01-21 13:06:32 +0100198# define CONSOLE_COLOR_BLACK 0x0000
199# define CONSOLE_COLOR_RED 0xF800
200# define CONSOLE_COLOR_GREEN 0x07E0
201# define CONSOLE_COLOR_YELLOW 0xFFE0
202# define CONSOLE_COLOR_BLUE 0x001F
203# define CONSOLE_COLOR_MAGENTA 0xF81F
204# define CONSOLE_COLOR_CYAN 0x07FF
205# define CONSOLE_COLOR_GREY 0xC618
206# define CONSOLE_COLOR_WHITE 0xffff /* Must remain last / highest */
wdenk8655b6f2004-10-09 23:25:58 +0000207#endif /* color definitions */
208
Hannes Petermaier604c7d42015-03-27 08:01:38 +0100209#if LCD_BPP == LCD_COLOR16
210#define fbptr_t ushort
211#elif LCD_BPP == LCD_COLOR32
212#define fbptr_t u32
213#else
214#define fbptr_t uchar
215#endif
216
wdenk8655b6f2004-10-09 23:25:58 +0000217#ifndef PAGE_SIZE
Nikita Kiryanovc8d2feb2015-02-03 13:32:29 +0200218#define PAGE_SIZE 4096
wdenk8655b6f2004-10-09 23:25:58 +0000219#endif
220
Simon Glass6cbf5de2016-01-18 19:52:16 -0700221#endif /* !CONFIG_DM_VIDEO */
222
wdenk8655b6f2004-10-09 23:25:58 +0000223#endif /* _LCD_H_ */