summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/lcd.c16
-rw-r--r--common/lcd_console.c24
-rw-r--r--include/lcd.h25
3 files changed, 54 insertions, 11 deletions
diff --git a/common/lcd.c b/common/lcd.c
index f33942c..408937d 100644
--- a/common/lcd.c
+++ b/common/lcd.c
@@ -38,11 +38,6 @@
#define CONFIG_LCD_ALIGNMENT PAGE_SIZE
#endif
-#if (LCD_BPP != LCD_COLOR8) && (LCD_BPP != LCD_COLOR16) && \
- (LCD_BPP != LCD_COLOR32)
-#error Unsupported LCD BPP.
-#endif
-
DECLARE_GLOBAL_DATA_PTR;
static int lcd_init(void *lcdbase);
@@ -172,7 +167,11 @@ void lcd_clear(void)
char *s;
ulong addr;
static int do_splash = 1;
-#if LCD_BPP == LCD_COLOR8
+#if LCD_BPP == LCD_MONOCHROME
+ /* Setting the palette */
+ lcd_initcolregs();
+
+#elif LCD_BPP == LCD_COLOR8
/* Setting the palette */
lcd_setcolreg(CONSOLE_COLOR_BLACK, 0, 0, 0);
lcd_setcolreg(CONSOLE_COLOR_RED, 0xFF, 0, 0);
@@ -200,14 +199,15 @@ void lcd_clear(void)
#else
/* set framebuffer to background color */
#if (LCD_BPP != LCD_COLOR32)
- memset((char *)lcd_base, bg_color, lcd_line_length * panel_info.vl_row);
+ memset((char *)lcd_base, COLOR_MASK(lcd_getbgcolor()),
+ lcd_line_length * panel_info.vl_row);
#else
u32 *ppix = lcd_base;
u32 i;
for (i = 0;
i < (lcd_line_length * panel_info.vl_row)/NBYTES(panel_info.vl_bpix);
i++) {
- *ppix++ = bg_color;
+ *ppix++ = COLOR_MASK(lcd_getbgcolor());
}
#endif
#endif
diff --git a/common/lcd_console.c b/common/lcd_console.c
index 8bf83b9..7aab81f 100644
--- a/common/lcd_console.c
+++ b/common/lcd_console.c
@@ -61,6 +61,10 @@ static void lcd_drawchars(ushort x, ushort y, uchar *str, int count)
ushort row;
int fg_color, bg_color;
+#if LCD_BPP == LCD_MONOCHROME
+ ushort off = x * (1 << LCD_BPP) % 8;
+#endif
+
dest = (uchar *)(lcd_console_address +
y * lcd_line_length + x * NBITS(LCD_BPP) / 8);
@@ -77,17 +81,33 @@ static void lcd_drawchars(ushort x, ushort y, uchar *str, int count)
fg_color = lcd_getfgcolor();
bg_color = lcd_getbgcolor();
+
+#if LCD_BPP == LCD_MONOCHROME
+ uchar rest = *d & -(1 << (8 - off));
+ uchar sym;
+#endif
for (i = 0; i < count; ++i) {
uchar c, bits;
c = *s++;
bits = video_fontdata[c * VIDEO_FONT_HEIGHT + row];
+#if LCD_BPP == LCD_MONOCHROME
+ sym = (COLOR_MASK(fg_color) & bits) |
+ (COLOR_MASK(bg_color) & ~bits);
+
+ *d++ = rest | (sym >> off);
+ rest = sym << (8-off);
+#else /* LCD_BPP == LCD_COLOR8 or LCD_COLOR16 or LCD_COLOR32 */
for (c = 0; c < 8; ++c) {
*d++ = (bits & 0x80) ? fg_color : bg_color;
bits <<= 1;
}
+#endif
}
+#if LCD_BPP == LCD_MONOCHROME
+ *d = rest | (*d & ((1 << (8 - off)) - 1));
+#endif
}
}
@@ -109,7 +129,7 @@ static void console_scrollup(void)
/* Clear the last rows */
#if (LCD_BPP != LCD_COLOR32)
memset(lcd_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE * rows,
- bg_color, CONSOLE_ROW_SIZE * rows);
+ COLOR_MASK(bg_color), CONSOLE_ROW_SIZE * rows);
#else
u32 *ppix = lcd_console_address +
CONSOLE_SIZE - CONSOLE_ROW_SIZE * rows;
@@ -117,7 +137,7 @@ static void console_scrollup(void)
for (i = 0;
i < (CONSOLE_ROW_SIZE * rows) / NBYTES(panel_info.vl_bpix);
i++) {
- *ppix++ = bg_color;
+ *ppix++ = COLOR_MASK(bg_color);
}
#endif
lcd_sync();
diff --git a/include/lcd.h b/include/lcd.h
index bd580be..ddcd53c 100644
--- a/include/lcd.h
+++ b/include/lcd.h
@@ -25,6 +25,7 @@ extern struct vidinfo panel_info;
void lcd_ctrl_init(void *lcdbase);
void lcd_enable(void);
void lcd_setcolreg(ushort regno, ushort red, ushort green, ushort blue);
+void lcd_initcolregs (void);
struct bmp_image *gunzip_bmp(unsigned long addr, unsigned long *lenp,
void **alloc_addr);
@@ -99,6 +100,11 @@ typedef struct vidinfo {
ushort *cmap;
struct epdc_data_struct epdc_data;
} vidinfo_t;
+
+static __maybe_unused ushort *configuration_get_cmap(void)
+{
+ return panel_info.cmap;
+}
#else
typedef struct vidinfo {
ushort vl_col; /* Number of columns (i.e. 160) */
@@ -214,6 +220,16 @@ void lcd_sync(void);
#define LCD_BPP LCD_COLOR8
#endif
+#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) || (LCD_BPP == LCD_COLOR16) || \
+ (LCD_BPP == LCD_COLOR32)
+# define COLOR_MASK(c) (c)
+#else
+#error Unsupported LCD BPP.
+#endif
+
#ifndef LCD_DF
#define LCD_DF 1
#endif
@@ -222,7 +238,14 @@ void lcd_sync(void);
#define NBITS(bit_code) (1 << (bit_code))
#define NCOLORS(bit_code) (1 << NBITS(bit_code))
-#if LCD_BPP == LCD_COLOR8
+#if LCD_BPP == LCD_MONOCHROME
+/*
+ * Simple black/white definitions
+ */
+# define CONSOLE_COLOR_BLACK 0
+# define CONSOLE_COLOR_WHITE 1 /* Must remain last / highest */
+
+#elif LCD_BPP == LCD_COLOR8
# define CONSOLE_COLOR_BLACK 0
# define CONSOLE_COLOR_RED 1
# define CONSOLE_COLOR_GREEN 2