summaryrefslogtreecommitdiff
path: root/uisimulator
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2002-03-26 10:06:28 +0000
committerDaniel Stenberg <daniel@haxx.se>2002-03-26 10:06:28 +0000
commitd20e6eee0e483582a40968bff25108c3ed855195 (patch)
treeaec37196db49ed0dc957c2ae8dcb9c12354e7407 /uisimulator
parent643542799e448dc03684efebff5ac61dcd602ee5 (diff)
generic and specific LCD functions
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'uisimulator')
-rw-r--r--uisimulator/lcd-recorder.c174
-rw-r--r--uisimulator/lcd-x11.c23
-rw-r--r--uisimulator/lcd.c179
3 files changed, 376 insertions, 0 deletions
diff --git a/uisimulator/lcd-recorder.c b/uisimulator/lcd-recorder.c
new file mode 100644
index 0000000000..37f4d3b142
--- /dev/null
+++ b/uisimulator/lcd-recorder.c
@@ -0,0 +1,174 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Daniel Stenberg <daniel@haxx.se>
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/*
+ * Hardware-specific implementations for the Archos Recorder LCD.
+ *
+ * Archos Jukebox Recorder LCD functions.
+ * Solomon SSD1815Z controller and Shing Yih Technology G112064-30 LCD.
+ *
+ */
+
+/* LCD command codes */
+#define LCD_CNTL_RESET 0xe2 /* Software reset */
+#define LCD_CNTL_POWER 0x2f /* Power control */
+#define LCD_CNTL_CONTRAST 0x81 /* Contrast */
+#define LCD_CNTL_OUTSCAN 0xc8 /* Output scan direction */
+#define LCD_CNTL_SEGREMAP 0xa1 /* Segment remap */
+#define LCD_CNTL_DISPON 0xaf /* Display on */
+
+#define LCD_CNTL_PAGE 0xb0 /* Page address */
+#define LCD_CNTL_HIGHCOL 0x10 /* Upper column address */
+#define LCD_CNTL_LOWCOL 0x00 /* Lower column address */
+
+
+/*
+ * Initialize LCD
+ */
+void lcd_init (void)
+{
+ /* Initialize PB0-3 as output pins */
+ PBCR2 &= 0xff00; /* MD = 00 */
+ PBIOR |= 0x000f; /* IOR = 1 */
+
+ /* Initialize LCD */
+ lcd_write (TRUE, LCD_CNTL_RESET);
+ lcd_write (TRUE, LCD_CNTL_POWER);
+ lcd_write (TRUE, LCD_CNTL_SEGREMAP);
+ lcd_write (TRUE, LCD_CNTL_OUTSCAN);
+ lcd_write (TRUE, LCD_CNTL_CONTRAST);
+ lcd_write (TRUE, 0x30); /* contrast parameter */
+ lcd_write (TRUE, LCD_CNTL_DISPON);
+
+ lcd_clear();
+ lcd_update();
+}
+
+/*
+ * Update the display.
+ * This must be called after all other LCD funtions that change the display.
+ */
+void lcd_update (void)
+{
+ int row, col;
+
+ /* Copy display bitmap to hardware */
+ for (row = 0; row < DISP_Y/8; row++) {
+ lcd_write (TRUE, LCD_CNTL_PAGE | (row & 0xf));
+ lcd_write (TRUE, LCD_CNTL_HIGHCOL);
+ lcd_write (TRUE, LCD_CNTL_LOWCOL);
+
+ for (col = 0; col < DISP_X; col++)
+ lcd_write (FALSE, display[row][col]);
+ }
+}
+
+/*
+ * Display a string at current position
+ */
+void lcd_string (const char *text, BOOL invert)
+{
+ int ch;
+
+ while ((ch = *text++) != '\0') {
+ if (lcd_y > DISP_Y-CHAR_Y) {
+ /* Scroll (8 pixels) */
+ memcpy (display[0], display[1], DISP_X*(DISP_Y/8-1));
+ lcd_y -= 8;
+ }
+
+ if (ch == '\n')
+ lcd_x = DISP_X;
+ else {
+ lcd_char (ch, invert);
+ lcd_x += CHAR_X;
+ }
+
+ if (lcd_x > DISP_X-CHAR_X) {
+ /* Wrap to next line */
+ lcd_x = 0;
+ lcd_y += CHAR_Y;
+ }
+ }
+}
+
+/*
+ * Display a character.
+ * This writes a 5x8 character within a 6x8 cell.
+ * The cell does not have to be aligned to a display byte.
+ * The top left of the cell is displayed at the current position.
+ * invert is TRUE to display in reverse video.
+ */
+void lcd_char (int ch, BOOL invert)
+{
+ uchar (*dp)[DISP_X] = (void *) &display[lcd_y/8][lcd_x];
+ uint32 shift, mask, col;
+
+ /* Limit to char generation table */
+ if (ch < ASCII_MIN || ch > ASCII_MAX)
+ ch = ASCII_MAX;
+
+ /* Calculate shift and masks for cell bit position */
+ shift = (lcd_y & 0x7);
+ mask = ~(COL_MASK << shift);
+ if (invert)
+ invert = ~mask;
+
+ /* Write each char column */
+ for (col = 0; col < CHAR_X-1; col++) {
+ uint32 data = (char_gen[ch-ASCII_MIN][col] << shift) ^ invert;
+ dp[0][col] = (dp[0][col] & mask) | data;
+ if (lcd_y < DISP_Y-8)
+ dp[1][col] = (dp[1][col] & (mask >> 8)) | (data >> 8);
+ }
+
+ /* Column after char */
+ dp[0][CHAR_X-1] = (dp[0][CHAR_X-1] & mask) | invert;
+ if (lcd_y < DISP_Y-8)
+ dp[1][CHAR_X-1] = (dp[1][CHAR_X-1] & (mask >> 8)) | (invert >> 8);
+}
+
+/*
+ * Write a byte to LCD controller.
+ * command is TRUE if value is a command byte.
+ */
+static void lcd_write (BOOL command, int value)
+{
+ int i;
+
+ /* Read PBDR, clear LCD bits */
+ int pbdr = PBDR & ~(PBDR_LCD_CS1|PBDR_LCD_DC|PBDR_LCD_SDA|PBDR_LCD_SCK);
+ if (!command)
+ pbdr |= PBDR_LCD_DC; /* set data indicator */
+
+ /* Send each bit, starting with MSB */
+ for (i = 0; i < 8; i++) {
+ if (value & 0x80) {
+ /* Set data, toggle clock */
+ PBDR = pbdr | PBDR_LCD_SDA;
+ PBDR = pbdr | PBDR_LCD_SDA | PBDR_LCD_SCK;
+ }
+ else {
+ /* Clear data, toggle clock */
+ PBDR = pbdr;
+ PBDR = pbdr | PBDR_LCD_SCK;
+ }
+ value <<= 1;
+ }
+}
diff --git a/uisimulator/lcd-x11.c b/uisimulator/lcd-x11.c
new file mode 100644
index 0000000000..efd6c9e8bd
--- /dev/null
+++ b/uisimulator/lcd-x11.c
@@ -0,0 +1,23 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Daniel Stenberg <daniel@haxx.se>
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/*
+ * Specific implementations for X11, using the generic LCD functions and data.
+ */
+
diff --git a/uisimulator/lcd.c b/uisimulator/lcd.c
new file mode 100644
index 0000000000..0db77e09bb
--- /dev/null
+++ b/uisimulator/lcd.c
@@ -0,0 +1,179 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Daniel Stenberg <daniel@haxx.se>
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/*
+ * This file is meant for generic LCD defines and global variables etc.
+ */
+
+#define DISP_X 112 /* Display width in pixels */
+#define DISP_Y 64 /* Display height in pixels */
+
+#define CHAR_X 6 /* Character width in pixels */
+#define CHAR_Y 8 /* Character height in pixels */
+#define COL_MASK 0xff /* Character column pixels changed */
+
+/*
+ * ASCII character generation table
+ *
+ * This contains only the printable characters (0x20-0x7f).
+ * Each row in this table is a 5x8 pixel character pattern.
+ * Each byte is a column of pixels, with the top pixel in the LSB.
+ */
+#define ASCII_MIN 0x20 /* First char in table */
+#define ASCII_MAX 0x7f /* Last char in table */
+
+static const uchar char_gen[ASCII_MAX-ASCII_MIN+1][CHAR_X-1] =
+{
+ 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x2f */
+ 0x00, 0x00, 0x4f, 0x00, 0x00,
+ 0x00, 0x07, 0x00, 0x07, 0x00,
+ 0x14, 0x7f, 0x14, 0x7f, 0x14,
+ 0x24, 0x2a, 0x7f, 0x2a, 0x12,
+ 0x23, 0x13, 0x08, 0x64, 0x62,
+ 0x36, 0x49, 0x55, 0x22, 0x50,
+ 0x00, 0x05, 0x03, 0x00, 0x00,
+ 0x00, 0x1c, 0x22, 0x41, 0x00,
+ 0x00, 0x41, 0x22, 0x1c, 0x00,
+ 0x14, 0x08, 0x3e, 0x08, 0x14,
+ 0x08, 0x08, 0x3e, 0x08, 0x08,
+ 0x00, 0xa0, 0x60, 0x00, 0x00,
+ 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x00, 0x60, 0x60, 0x00, 0x00,
+ 0x20, 0x10, 0x08, 0x04, 0x02,
+
+ 0x3e, 0x51, 0x49, 0x45, 0x3e, /* 0x30-0x3f */
+ 0x00, 0x42, 0x7f, 0x40, 0x00,
+ 0x42, 0x61, 0x51, 0x49, 0x46,
+ 0x21, 0x41, 0x45, 0x4b, 0x31,
+ 0x18, 0x14, 0x12, 0x7f, 0x10,
+ 0x27, 0x45, 0x45, 0x45, 0x39,
+ 0x3c, 0x4a, 0x49, 0x49, 0x30,
+ 0x01, 0x71, 0x09, 0x05, 0x03,
+ 0x36, 0x49, 0x49, 0x49, 0x36,
+ 0x06, 0x49, 0x49, 0x29, 0x1e,
+ 0x00, 0x6c, 0x6c, 0x00, 0x00,
+ 0x00, 0xac, 0x6c, 0x00, 0x00,
+ 0x08, 0x14, 0x22, 0x41, 0x00,
+ 0x14, 0x14, 0x14, 0x14, 0x14,
+ 0x00, 0x41, 0x22, 0x14, 0x08,
+ 0x02, 0x01, 0x51, 0x09, 0x06,
+
+ 0x32, 0x49, 0x79, 0x41, 0x3e, /* 0x40-0x4f */
+ 0x7e, 0x11, 0x11, 0x11, 0x7e,
+ 0x7f, 0x49, 0x49, 0x49, 0x36,
+ 0x3e, 0x41, 0x41, 0x41, 0x22,
+ 0x7f, 0x41, 0x41, 0x22, 0x1c,
+ 0x7f, 0x49, 0x49, 0x49, 0x41,
+ 0x7f, 0x09, 0x09, 0x09, 0x01,
+ 0x3e, 0x41, 0x49, 0x49, 0x7a,
+ 0x7f, 0x08, 0x08, 0x08, 0x7f,
+ 0x00, 0x41, 0x7f, 0x41, 0x00,
+ 0x20, 0x40, 0x41, 0x3f, 0x01,
+ 0x7f, 0x08, 0x14, 0x22, 0x41,
+ 0x7f, 0x40, 0x40, 0x40, 0x40,
+ 0x7f, 0x02, 0x0c, 0x02, 0x7f,
+ 0x7f, 0x04, 0x08, 0x10, 0x7f,
+ 0x3e, 0x41, 0x41, 0x41, 0x3e,
+
+ 0x7f, 0x09, 0x09, 0x09, 0x06, /* 0x50-0x5f */
+ 0x3e, 0x41, 0x51, 0x21, 0x5e,
+ 0x7f, 0x09, 0x19, 0x29, 0x46,
+ 0x46, 0x49, 0x49, 0x49, 0x31,
+ 0x01, 0x01, 0x7f, 0x01, 0x01,
+ 0x3f, 0x40, 0x40, 0x40, 0x3f,
+ 0x1f, 0x20, 0x40, 0x20, 0x1f,
+ 0x3f, 0x40, 0x38, 0x40, 0x3f,
+ 0x63, 0x14, 0x08, 0x14, 0x63,
+ 0x07, 0x08, 0x70, 0x08, 0x07,
+ 0x71, 0x51, 0x49, 0x45, 0x43,
+ 0x00, 0x7f, 0x41, 0x41, 0x00,
+ 0x02, 0x04, 0x08, 0x10, 0x20,
+ 0x00, 0x41, 0x41, 0x7f, 0x00,
+ 0x04, 0x02, 0x01, 0x02, 0x04,
+ 0x40, 0x40, 0x40, 0x40, 0x40,
+
+ 0x00, 0x01, 0x02, 0x04, 0x00, /* 0x60-0x6f */
+ 0x20, 0x54, 0x54, 0x54, 0x78,
+ 0x7f, 0x48, 0x44, 0x44, 0x38,
+ 0x38, 0x44, 0x44, 0x44, 0x20,
+ 0x38, 0x44, 0x44, 0x48, 0x7f,
+ 0x38, 0x54, 0x54, 0x54, 0x18,
+ 0x08, 0x7e, 0x09, 0x01, 0x02,
+ 0x18, 0xa4, 0xa4, 0xa4, 0x7c,
+ 0x7f, 0x08, 0x04, 0x04, 0x78,
+ 0x00, 0x44, 0x7d, 0x40, 0x00,
+ 0x40, 0x80, 0x84, 0x7d, 0x00,
+ 0x7f, 0x10, 0x28, 0x44, 0x00,
+ 0x00, 0x41, 0x7f, 0x40, 0x00,
+ 0x7c, 0x04, 0x18, 0x04, 0x78,
+ 0x7c, 0x08, 0x04, 0x04, 0x78,
+ 0x38, 0x44, 0x44, 0x44, 0x38,
+
+ 0xfc, 0x24, 0x24, 0x24, 0x18, /* 0x70-0x7f */
+ 0x18, 0x24, 0x24, 0x24, 0xfc,
+ 0x7c, 0x08, 0x04, 0x04, 0x08,
+ 0x48, 0x54, 0x54, 0x54, 0x20,
+ 0x04, 0x3f, 0x44, 0x40, 0x20,
+ 0x3c, 0x40, 0x40, 0x20, 0x7c,
+ 0x1c, 0x20, 0x40, 0x20, 0x1c,
+ 0x3c, 0x40, 0x30, 0x40, 0x3c,
+ 0x44, 0x28, 0x10, 0x28, 0x44,
+ 0x1c, 0xa0, 0xa0, 0xa0, 0x7c,
+ 0x44, 0x64, 0x54, 0x4c, 0x44,
+ 0x00, 0x08, 0x36, 0x41, 0x00,
+ 0x00, 0x00, 0x7f, 0x00, 0x00,
+ 0x00, 0x41, 0x36, 0x08, 0x00,
+ 0x04, 0x02, 0x04, 0x08, 0x04,
+ 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
+};
+
+/*
+ * Memory copy of display bitmap
+ *
+ * This has the same format as the Recorder hardware:
+ * Bits within a byte are arranged veritcally, LSB at top.
+ * Byte 0 is top left, byte 1 is 2nd left, byte DISP_X starts 2nd row.
+ */
+static uchar display[DISP_Y/8][DISP_X];
+
+static uint16 lcd_y; /* Current pixel row */
+static uint16 lcd_x; /* Current pixel column */
+
+/*
+ * Set current x,y position
+ */
+void lcd_position (int x, int y)
+{
+ if (x >= 0 && x < DISP_X && y >= 0 && y < DISP_Y)
+ {
+ lcd_x = x;
+ lcd_y = y;
+ }
+}
+
+/*
+ * Clear the display
+ */
+void lcd_clear (void)
+{
+ lcd_x = 0;
+ lcd_y = 0;
+ memset (display, 0, sizeof display);
+}
+