summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2010-03-12 12:18:17 +0800
committerHarald Welte <laforge@gnumonks.org>2010-03-12 12:18:17 +0800
commit066222d4419761ce8c2a8f9ef6ecd0605ac3230c (patch)
tree974c56ec947bf0a1db024b11705f78375dd5204e
parenta13a4fda926aa272e55964c8f86cb31fb4065995 (diff)
Introduce LCD display_driver infrastructure
* introduce display_driver layer * port st7558 and ssd1783 drivers to display_driver * allow for run-time selection of display driver from board/init.c * replace st7558_puts() calls with display_puts() calls
-rw-r--r--src/target/firmware/Makefile2
-rw-r--r--src/target/firmware/apps/compal_dsp_dump/main.c1
-rw-r--r--src/target/firmware/apps/hello_world/main.c8
-rw-r--r--src/target/firmware/apps/l1test/main.c6
-rw-r--r--src/target/firmware/apps/layer1/main.c6
-rw-r--r--src/target/firmware/apps/loader/main.c1
-rw-r--r--src/target/firmware/board/compal_e88/init.c5
-rw-r--r--src/target/firmware/board/compal_e99/init.c5
-rw-r--r--src/target/firmware/calypso/rtc.c6
-rw-r--r--src/target/firmware/display/display.c20
-rw-r--r--src/target/firmware/display/ssd1783.c109
-rw-r--r--src/target/firmware/display/st7558.c55
-rw-r--r--src/target/firmware/include/display.h47
-rw-r--r--src/target/firmware/include/display/ssd1783.h7
-rw-r--r--src/target/firmware/include/display/st7558.h15
15 files changed, 190 insertions, 103 deletions
diff --git a/src/target/firmware/Makefile b/src/target/firmware/Makefile
index bc99fc05..b6e20ecf 100644
--- a/src/target/firmware/Makefile
+++ b/src/target/firmware/Makefile
@@ -4,7 +4,7 @@ INCLUDES=-Iinclude/ -I../../../include -I../../shared/libosmocore/include
# Various objects that are currently linked into all applications
FLASH_OBJS=flash/cfi_flash.o
-DISPLAY_OBJS=display/font_r8x8.o display/font_r8x8_horiz.o display/st7558.o display/ssd1783.o
+DISPLAY_OBJS=display/font_r8x8.o display/font_r8x8_horiz.o display/st7558.o display/ssd1783.o display/display.o
ABB_OBJS=abb/twl3025.o
RF_OBJS=rf/trf6151.o
diff --git a/src/target/firmware/apps/compal_dsp_dump/main.c b/src/target/firmware/apps/compal_dsp_dump/main.c
index c7c56739..a7126118 100644
--- a/src/target/firmware/apps/compal_dsp_dump/main.c
+++ b/src/target/firmware/apps/compal_dsp_dump/main.c
@@ -28,7 +28,6 @@
#include <keypad.h>
#include <board.h>
#include <abb/twl3025.h>
-#include <display/st7558.h>
#include <rf/trf6151.h>
#include <calypso/clock.h>
#include <calypso/tpu.h>
diff --git a/src/target/firmware/apps/hello_world/main.c b/src/target/firmware/apps/hello_world/main.c
index e74fcbc1..5eb36af0 100644
--- a/src/target/firmware/apps/hello_world/main.c
+++ b/src/target/firmware/apps/hello_world/main.c
@@ -30,7 +30,7 @@
#include <keypad.h>
#include <board.h>
#include <abb/twl3025.h>
-#include <display/st7558.h>
+#include <display.h>
#include <rf/trf6151.h>
#include <calypso/clock.h>
#include <calypso/tpu.h>
@@ -69,7 +69,7 @@ static void console_rx_cb(uint8_t dlci, struct msgb *msg)
}
printf("Message on console DLCI: '%s'\n", msg->data);
- st7558_puts((char *) msg->data);
+ display_puts((char *) msg->data);
msgb_free(msg);
}
@@ -100,8 +100,8 @@ int main(void)
puts(hr);
#endif
- st7558_set_attr(DISP_ATTR_INVERT);
- st7558_puts("Hello World");
+ display_set_attr(DISP_ATTR_INVERT);
+ display_puts("Hello World");
sercomm_register_rx_cb(SC_DLCI_CONSOLE, console_rx_cb);
diff --git a/src/target/firmware/apps/l1test/main.c b/src/target/firmware/apps/l1test/main.c
index 7e620505..384820c0 100644
--- a/src/target/firmware/apps/l1test/main.c
+++ b/src/target/firmware/apps/l1test/main.c
@@ -30,7 +30,7 @@
#include <board.h>
#include <abb/twl3025.h>
-#include <display/st7558.h>
+#include <display.h>
#include <rf/trf6151.h>
#include <comm/sercomm.h>
@@ -193,8 +193,8 @@ int main(void)
calypso_clk_dump();
puts(hr);
- st7558_set_attr(DISP_ATTR_INVERT);
- st7558_puts("l1test.bin");
+ display_set_attr(DISP_ATTR_INVERT);
+ display_puts("l1test.bin");
layer1_init();
l1s_set_handler(&l1s_signal_cb);
diff --git a/src/target/firmware/apps/layer1/main.c b/src/target/firmware/apps/layer1/main.c
index 726c723d..7281d17f 100644
--- a/src/target/firmware/apps/layer1/main.c
+++ b/src/target/firmware/apps/layer1/main.c
@@ -30,7 +30,7 @@
#include <board.h>
#include <abb/twl3025.h>
-#include <display/st7558.h>
+#include <display.h>
#include <rf/trf6151.h>
#include <comm/sercomm.h>
@@ -93,8 +93,8 @@ int main(void)
calypso_clk_dump();
puts(hr);
- st7558_set_attr(DISP_ATTR_INVERT);
- st7558_puts("layer1.bin");
+ display_set_attr(DISP_ATTR_INVERT);
+ display_puts("layer1.bin");
layer1_init();
l1s_set_handler(&l1s_signal_cb);
diff --git a/src/target/firmware/apps/loader/main.c b/src/target/firmware/apps/loader/main.c
index 8c635b0d..f4e1f545 100644
--- a/src/target/firmware/apps/loader/main.c
+++ b/src/target/firmware/apps/loader/main.c
@@ -32,7 +32,6 @@
#include <console.h>
#include <abb/twl3025.h>
-#include <display/st7558.h>
#include <rf/trf6151.h>
#include <comm/sercomm.h>
diff --git a/src/target/firmware/board/compal_e88/init.c b/src/target/firmware/board/compal_e88/init.c
index 36563360..83cb4828 100644
--- a/src/target/firmware/board/compal_e88/init.c
+++ b/src/target/firmware/board/compal_e88/init.c
@@ -42,7 +42,7 @@
#include <abb/twl3025.h>
#include <rf/trf6151.h>
-#include <display/st7558.h>
+#include <display.h>
#define ARMIO_LATCH_OUT 0xfffe4802
#define ARMIO_CNTL_REG 0xfffe4804
@@ -120,7 +120,8 @@ void board_init(void)
timer_init();
/* Initialize LCD driver (uses I2C) */
- st7558_init();
+ display = &st7558_display;
+ display_init();
/* Initialize keypad driver */
keypad_init(1);
diff --git a/src/target/firmware/board/compal_e99/init.c b/src/target/firmware/board/compal_e99/init.c
index 9b9e2b50..8e0ce139 100644
--- a/src/target/firmware/board/compal_e99/init.c
+++ b/src/target/firmware/board/compal_e99/init.c
@@ -42,7 +42,7 @@
#include <abb/twl3025.h>
#include <rf/trf6151.h>
-#include <display/ssd1783.h>
+#include <display.h>
#define ARMIO_LATCH_OUT 0xfffe4802
#define ARMIO_CNTL_REG 0xfffe4804
@@ -119,7 +119,8 @@ void board_init(void)
rtc_init();
/* Initialize LCD driver (uses UWire) */
- ssd1783_init();
+ display = &ssd1783_display;
+ display_init();
keypad_init(1);
diff --git a/src/target/firmware/calypso/rtc.c b/src/target/firmware/calypso/rtc.c
index 20497008..ce750c29 100644
--- a/src/target/firmware/calypso/rtc.c
+++ b/src/target/firmware/calypso/rtc.c
@@ -26,8 +26,8 @@
#include <defines.h>
#include <debug.h>
#include <memory.h>
+#include <display.h>
#include <calypso/irq.h>
-#include <display/st7558.h>
#define BASE_ADDR_RTC 0xfffe1800
#define RTC_REG(x) ((void *)BASE_ADDR_RTC + (x))
@@ -62,9 +62,9 @@ static int tick_ctr;
static void rtc_irq_tick(__unused enum irq_nr nr)
{
if (tick_ctr & 1)
- st7558_set_attr(DISP_ATTR_INVERT);
+ display_set_attr(DISP_ATTR_INVERT);
else
- st7558_unset_attr(DISP_ATTR_INVERT);
+ display_unset_attr(DISP_ATTR_INVERT);
tick_ctr++;
}
diff --git a/src/target/firmware/display/display.c b/src/target/firmware/display/display.c
new file mode 100644
index 00000000..1c8f1fb4
--- /dev/null
+++ b/src/target/firmware/display/display.c
@@ -0,0 +1,20 @@
+
+#include <stdint.h>
+
+#include <display.h>
+
+struct display_driver *display;
+
+int display_puts(const char *str)
+{
+ char c;
+
+ if (display->puts)
+ display->puts(str);
+ else {
+ while ((c = *str++))
+ display_putchar(c);
+ }
+
+ return 0;
+}
diff --git a/src/target/firmware/display/ssd1783.c b/src/target/firmware/display/ssd1783.c
index 4e016e3e..c1504a6c 100644
--- a/src/target/firmware/display/ssd1783.c
+++ b/src/target/firmware/display/ssd1783.c
@@ -1,6 +1,7 @@
/* Solomon SSD1783 LCD Driver (Epson S1D15G10D08B000 clone) */
/* (C) 2010 by Steve Markgraf <steve@steve-m.de>
+ * (C) 2010 by Harald Welte <laforge@gnumonks.org>
*
* All Rights Reserved
*
@@ -26,6 +27,7 @@
#include <debug.h>
#include <delay.h>
#include <uwire.h>
+#include <display.h>
#include <display/ssd1783.h>
#include <calypso/clock.h>
@@ -62,19 +64,39 @@ static const uint8_t rgb8_palette[] ={
0x0f, //P20 Intermediate blue tone 11
};
-void ssd1783_cmd_write(const uint8_t cmd)
+static void ssd1783_cmd_write(const uint8_t cmd)
{
uint16_t cmd_out = cmd;
uwire_xfer(SSD1783_DEV_ID, SSD1783_UWIRE_BITLEN, &cmd_out, NULL);
}
-void ssd1783_data_write(const uint8_t data)
+static void ssd1783_data_write(const uint8_t data)
{
uint16_t data_out = ((0x01 << 8) + data);
uwire_xfer(SSD1783_DEV_ID, SSD1783_UWIRE_BITLEN, &data_out, NULL);
}
-void ssd1783_init(void)
+static void ssd1783_clrscr(void)
+{
+ uint16_t i;
+
+ /* Select the whole display area for clearing */
+ ssd1783_cmd_write(CMD_PASET); /* Page address set [2] */
+ ssd1783_data_write(0x00); /* Start page: 0x00 */
+ ssd1783_data_write(LCD_ROWS-1); /* End page */
+ ssd1783_cmd_write(CMD_CASET); /* Column address set [2] */
+ ssd1783_data_write(0x00); /* Start column: 0x00 */
+ ssd1783_data_write((LCD_COLUMNS/2)-1); /* End column (2 pixels per column) */
+ ssd1783_cmd_write(CMD_RAMWR); /* Write to memory */
+
+ /* Fill the display with white */
+ for(i=0; i < (LCD_ROWS * (LCD_COLUMNS/2) * PIXEL_BYTES); i++){
+ ssd1783_data_write(0xff);
+ }
+ ssd1783_cmd_write(CMD_NOP); /* Terminate RAMWR with NOP */
+}
+
+static void ssd1783_init(void)
{
unsigned int i;
@@ -133,26 +155,6 @@ void ssd1783_init(void)
ssd1783_clrscr(); /* Clear the display */
}
-void ssd1783_clrscr(void)
-{
- uint16_t i;
-
- /* Select the whole display area for clearing */
- ssd1783_cmd_write(CMD_PASET); /* Page address set [2] */
- ssd1783_data_write(0x00); /* Start page: 0x00 */
- ssd1783_data_write(LCD_ROWS-1); /* End page */
- ssd1783_cmd_write(CMD_CASET); /* Column address set [2] */
- ssd1783_data_write(0x00); /* Start column: 0x00 */
- ssd1783_data_write((LCD_COLUMNS/2)-1); /* End column (2 pixels per column) */
- ssd1783_cmd_write(CMD_RAMWR); /* Write to memory */
-
- /* Fill the display with white */
- for(i=0; i < (LCD_ROWS * (LCD_COLUMNS/2) * PIXEL_BYTES); i++){
- ssd1783_data_write(0xff);
- }
- ssd1783_cmd_write(CMD_NOP); /* Terminate RAMWR with NOP */
-}
-
extern const unsigned char fontdata_r8x8_horiz[];
/*
@@ -162,16 +164,8 @@ extern const unsigned char fontdata_r8x8_horiz[];
* D7, D6, D5, D4, D3, D2, D1, D0: GGGGBBBB (8 bits) 3rd write
*/
-void ssd1783_putchar(unsigned char c, int xpos, int ypos, int fColor, int bColor)
+static void ssd1783_goto_xy(int xpos, int ypos)
{
- int i, j;
- uint8_t cols = FONT_WIDTH;
- uint8_t rows = FONT_HEIGHT;
- uint8_t row_slice;
- uint8_t rowmask;
- uint16_t pixel0; /* left pixel */
- uint16_t pixel1; /* right pixel */
-
ssd1783_cmd_write(CMD_PASET);
ssd1783_data_write(xpos);
ssd1783_data_write(xpos + (FONT_HEIGHT-1));
@@ -180,6 +174,19 @@ void ssd1783_putchar(unsigned char c, int xpos, int ypos, int fColor, int bColor
ssd1783_data_write(ypos);
ssd1783_data_write(ypos + ((FONT_WIDTH/2)-1));
+ ssd1783_cmd_write(CMD_NOP);
+}
+
+static int ssd1783_putc_col(unsigned char c, int fColor, int bColor)
+{
+ int i, j;
+ uint8_t cols = FONT_WIDTH;
+ uint8_t rows = FONT_HEIGHT;
+ uint8_t row_slice;
+ uint8_t rowmask;
+ uint16_t pixel0; /* left pixel */
+ uint16_t pixel1; /* right pixel */
+
ssd1783_cmd_write(CMD_RAMWR);
for (i = 0; i < rows; i++) {
@@ -204,12 +211,46 @@ void ssd1783_putchar(unsigned char c, int xpos, int ypos, int fColor, int bColor
}
}
ssd1783_cmd_write(CMD_NOP);
+
+ return c;
}
-void ssd1783_puts(const char *str, int txtline, int fColor, int bColor)
+static int ssd1783_puts_col(const char *str, int txtline, int fColor, int bColor)
{
int i;
for (i = 0; *str != 0x00; i += (FONT_WIDTH/2)) {
- ssd1783_putchar(*str++, ((txtline*FONT_HEIGHT)+LCD_TOP_FREE_ROWS), (i + LCD_LEFT_FREE_COLS), fColor, bColor);
+ ssd1783_goto_xy(((txtline*FONT_HEIGHT)+LCD_TOP_FREE_ROWS),
+ (i + LCD_LEFT_FREE_COLS));
+ ssd1783_putc_col(*str++, fColor, bColor);
}
+
+ return 0;
+}
+
+/* interface to display driver core */
+
+static void ssd1783_set_attr(unsigned long attr)
+{
+ /* FIXME */
}
+
+static int ssd1783_putc(unsigned int c)
+{
+ return ssd1783_putc_col(c, BLACK, WHITE);
+}
+
+static int ssd1783_puts(const char *str)
+{
+ return ssd1783_puts_col(str, 0, BLACK, WHITE);
+}
+
+const struct display_driver ssd1783_display = {
+ .name = "ssd1783",
+ .init = &ssd1783_init,
+ .set_attr = &ssd1783_set_attr,
+ .unset_attr = &ssd1783_set_attr,
+ .clrscr = &ssd1783_clrscr,
+ .goto_xy = &ssd1783_goto_xy,
+ .putc = &ssd1783_putc,
+ .puts = &ssd1783_puts,
+};
diff --git a/src/target/firmware/display/st7558.c b/src/target/firmware/display/st7558.c
index daba94bd..baed9eb0 100644
--- a/src/target/firmware/display/st7558.c
+++ b/src/target/firmware/display/st7558.c
@@ -27,7 +27,7 @@
#include <delay.h>
#include <memory.h>
#include <i2c.h>
-#include <display/st7558.h>
+#include <display.h>
#include <calypso/clock.h>
#define MORE_CONTROL 0x80
@@ -53,7 +53,22 @@ static int st7558_write(const uint8_t *data, int len)
return rc;
}
-void st7558_init(void)
+static const uint8_t zero16[] = { CONTROL_RS_RAM,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0 };
+static void st7558_clrscr(void)
+{
+ int i;
+
+ st7558_write(home, sizeof(home));
+
+ for (i = 0; i < 102*9; i += 16)
+ st7558_write(zero16, sizeof(zero16));
+
+ st7558_write(home, sizeof(home));
+}
+
+static void st7558_init(void)
{
/* Release nRESET */
calypso_reset_set(RESET_EXT, 0);
@@ -65,33 +80,18 @@ void st7558_init(void)
st7558_clrscr();
}
-void st7558_set_attr(unsigned long attr)
+static void st7558_set_attr(unsigned long attr)
{
if (attr & DISP_ATTR_INVERT)
st7558_write(invert, sizeof(invert));
}
-void st7558_unset_attr(unsigned long attr)
+static void st7558_unset_attr(unsigned long attr)
{
if (attr & DISP_ATTR_INVERT)
st7558_write(normal, sizeof(normal));
}
-static const uint8_t zero16[] = { CONTROL_RS_RAM,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0 };
-void st7558_clrscr(void)
-{
- int i;
-
- st7558_write(home, sizeof(home));
-
- for (i = 0; i < 102*9; i += 16)
- st7558_write(zero16, sizeof(zero16));
-
- st7558_write(home, sizeof(home));
-}
-
/* FIXME: we need a mini-libc */
static void *mcpy(uint8_t *dst, const uint8_t *src, int len)
{
@@ -103,7 +103,7 @@ static void *mcpy(uint8_t *dst, const uint8_t *src, int len)
extern const unsigned char fontdata_r8x8[];
-void st7558_putchar(unsigned char c)
+static void st7558_putc(unsigned char c)
{
uint8_t putc_buf[16];
uint8_t bytes_per_char = 8;
@@ -113,10 +113,11 @@ void st7558_putchar(unsigned char c)
st7558_write(putc_buf, 1+bytes_per_char);
}
-void st7558_puts(const char *str)
-{
- char c;
-
- while ((c = *str++))
- st7558_putchar(c);
-}
+const struct display_driver st7558_display = {
+ .name = "st7558",
+ .init = &st7558_init,
+ .clrscr = &st7558_clrscr,
+ .set_attr = &st7558_set_attr,
+ .unset_attr = &st7558_unset_attr,
+ .putc = &st7558_putc,
+};
diff --git a/src/target/firmware/include/display.h b/src/target/firmware/include/display.h
new file mode 100644
index 00000000..b49ae7bd
--- /dev/null
+++ b/src/target/firmware/include/display.h
@@ -0,0 +1,47 @@
+#ifndef _DISPLAY_DRIVER_H
+#define _DISPLAY_DRIVER_H
+
+enum display_attr {
+ DISP_ATTR_INVERT = 0x0001,
+};
+
+struct display_driver {
+ char *name;
+ void (*init)(void);
+ void (*set_attr)(unsigned long attr);
+ void (*unset_attr)(unsigned long attr);
+ void (*clrscr)(void);
+ void (*goto_xy)(int xpos, int ypos);
+ void (*set_color)(int fgcolor, int bgcolor);
+ int (*putc)(unsigned char c);
+ int (*puts)(const char *str);
+};
+
+extern struct display_driver *display;
+
+static inline void display_init(void)
+{
+ display->init();
+}
+static inline void display_set_attr(unsigned long attr)
+{
+ display->set_attr(attr);
+}
+static inline void display_unset_attr(unsigned long attr)
+{
+ display->unset_attr(attr);
+}
+static inline void display_clrscr(void)
+{
+ display->clrscr();
+}
+static inline int display_putchar(unsigned char c)
+{
+ return display->putc(c);
+}
+int display_puts(const char *s);
+
+extern const struct display_driver st7558_display;
+extern const struct display_driver ssd1783_display;
+
+#endif
diff --git a/src/target/firmware/include/display/ssd1783.h b/src/target/firmware/include/display/ssd1783.h
index 79a81868..c72eebac 100644
--- a/src/target/firmware/include/display/ssd1783.h
+++ b/src/target/firmware/include/display/ssd1783.h
@@ -1,13 +1,6 @@
#ifndef _SSD1783_H
#define _SSD1783_H
-void ssd1783_cmd_write(const uint8_t cmd);
-void ssd1783_data_write(const uint8_t data);
-void ssd1783_init(void);
-void ssd1783_clrscr(void);
-void ssd1783_putchar(unsigned char c, int xpos, int ypos, int fColor, int bColor);
-void ssd1783_puts(const char *str, int txtline, int fColor, int bColor);
-
/* Some basic colors */
#define RED 0x0f00
#define GREEN 0x00f0
diff --git a/src/target/firmware/include/display/st7558.h b/src/target/firmware/include/display/st7558.h
deleted file mode 100644
index efed064c..00000000
--- a/src/target/firmware/include/display/st7558.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef _ST7558_H
-#define _ST7558_H
-
-enum display_attr {
- DISP_ATTR_INVERT = 0x0001,
-};
-
-void st7558_init(void);
-void st7558_set_attr(unsigned long attr);
-void st7558_unset_attr(unsigned long attr);
-void st7558_clrscr(void);
-void st7558_putchar(unsigned char c);
-void st7558_puts(const char *str);
-
-#endif