diff options
author | Harald Welte <laforge@gnumonks.org> | 2010-03-12 12:18:17 +0800 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2010-03-12 12:18:17 +0800 |
commit | 066222d4419761ce8c2a8f9ef6ecd0605ac3230c (patch) | |
tree | 974c56ec947bf0a1db024b11705f78375dd5204e | |
parent | a13a4fda926aa272e55964c8f86cb31fb4065995 (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/Makefile | 2 | ||||
-rw-r--r-- | src/target/firmware/apps/compal_dsp_dump/main.c | 1 | ||||
-rw-r--r-- | src/target/firmware/apps/hello_world/main.c | 8 | ||||
-rw-r--r-- | src/target/firmware/apps/l1test/main.c | 6 | ||||
-rw-r--r-- | src/target/firmware/apps/layer1/main.c | 6 | ||||
-rw-r--r-- | src/target/firmware/apps/loader/main.c | 1 | ||||
-rw-r--r-- | src/target/firmware/board/compal_e88/init.c | 5 | ||||
-rw-r--r-- | src/target/firmware/board/compal_e99/init.c | 5 | ||||
-rw-r--r-- | src/target/firmware/calypso/rtc.c | 6 | ||||
-rw-r--r-- | src/target/firmware/display/display.c | 20 | ||||
-rw-r--r-- | src/target/firmware/display/ssd1783.c | 109 | ||||
-rw-r--r-- | src/target/firmware/display/st7558.c | 55 | ||||
-rw-r--r-- | src/target/firmware/include/display.h | 47 | ||||
-rw-r--r-- | src/target/firmware/include/display/ssd1783.h | 7 | ||||
-rw-r--r-- | src/target/firmware/include/display/st7558.h | 15 |
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 |