summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2006-04-06 21:05:59 +0000
committerJens Arnold <amiconn@rockbox.org>2006-04-06 21:05:59 +0000
commita5d2a2808998ff9a7b319b9a41e5e130b9636565 (patch)
tree02cd88d4999edff41ac578bb79fa96a50919245c
parentcf23618980461702dc7f75e77c480afb09b86c10 (diff)
downloadrockbox-a5d2a2808998ff9a7b319b9a41e5e130b9636565.zip
rockbox-a5d2a2808998ff9a7b319b9a41e5e130b9636565.tar.gz
rockbox-a5d2a2808998ff9a7b319b9a41e5e130b9636565.tar.bz2
rockbox-a5d2a2808998ff9a7b319b9a41e5e130b9636565.tar.xz
lcd_blit() (with mono->2bit expansion) implemented for greyscale ipods. Changed the flip mode maths for the mini LCD for coexistence with lcd_blit().
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9540 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/drivers/lcd-2bit-horz.c5
-rw-r--r--firmware/drivers/lcd-ipod.c57
2 files changed, 32 insertions, 30 deletions
diff --git a/firmware/drivers/lcd-2bit-horz.c b/firmware/drivers/lcd-2bit-horz.c
index e15d8dd..f965e1b 100644
--- a/firmware/drivers/lcd-2bit-horz.c
+++ b/firmware/drivers/lcd-2bit-horz.c
@@ -40,11 +40,6 @@
unsigned char lcd_framebuffer[LCD_HEIGHT][LCD_FBWIDTH] IBSS_ATTR;
-static const unsigned char dibits[16] ICONST_ATTR = {
- 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F,
- 0xC0, 0xC3, 0xCC, 0xCF, 0xF0, 0xF3, 0xFC, 0xFF
-};
-
static const unsigned char pixmask[4] ICONST_ATTR = {
0xC0, 0x30, 0x0C, 0x03
};
diff --git a/firmware/drivers/lcd-ipod.c b/firmware/drivers/lcd-ipod.c
index ab0940d..74bda3b 100644
--- a/firmware/drivers/lcd-ipod.c
+++ b/firmware/drivers/lcd-ipod.c
@@ -76,6 +76,11 @@ static int addr_offset;
static int pix_offset;
#endif
+static const unsigned char dibits[16] ICONST_ATTR = {
+ 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F,
+ 0xC0, 0xC3, 0xCC, 0xCF, 0xF0, 0xF3, 0xFC, 0xFF
+};
+
/* wait for LCD with timeout */
static inline void lcd_wait_write(void)
{
@@ -139,23 +144,6 @@ void lcd_init_device(void)
#endif
}
-/*** update functions ***/
-/* srccopy bitblt, opcode is currently ignored*/
-
-/* Performance function that works with an external buffer
- note that x and bwidtht are in 8-pixel units! */
-void lcd_blit(const unsigned char* data, int x, int by, int width,
- int bheight, int stride)
-{
- /* TODO implement this on iPod */
- (void)data;
- (void)x;
- (void)by;
- (void)width;
- (void)bheight;
- (void)stride;
-}
-
/*** hardware configuration ***/
/* Rockbox stores the contrast as 0..63 - we add 64 to it */
@@ -183,8 +171,8 @@ void lcd_set_flip(bool yesno)
/* 168x112, inverse COM order */
lcd_cmd_and_data(R_DRV_OUTPUT_CONTROL, 0x020d);
lcd_cmd_and_data(R_1ST_SCR_DRV_POS, 0x8316); /* 22..131 */
- addr_offset = (22 << 5) | (20 - 3);
- pix_offset = 6;
+ addr_offset = (22 << 5) | (20 - 4);
+ pix_offset = -2;
} else {
/* 168x112, inverse SEG order */
lcd_cmd_and_data(R_DRV_OUTPUT_CONTROL, 0x010d);
@@ -207,6 +195,28 @@ void lcd_set_flip(bool yesno)
#endif
}
+/*** update functions ***/
+
+/* Performance function that works with an external buffer
+ note that x, bwidtht and stride are in 8-pixel units! */
+void lcd_blit(const unsigned char* data, int bx, int y, int bwidth,
+ int height, int stride)
+{
+ const unsigned char *src, *src_end;
+
+ while (height--) {
+ src = data;
+ src_end = data + bwidth;
+ lcd_cmd_and_data(R_RAM_ADDR_SET, (y++ << 5) + addr_offset - bx);
+ lcd_prepare_cmd(R_RAM_DATA);
+ do {
+ unsigned byte = *src++;
+ lcd_send_data((dibits[byte>>4] << 8) | dibits[byte&0x0f]);
+ } while (src < src_end);
+ data += stride;
+ }
+}
+
void lcd_update_rect(int x, int y, int width, int height)
{
int xmax, ymax;
@@ -230,23 +240,20 @@ void lcd_update_rect(int x, int y, int width, int height)
for (; y <= ymax; y++) {
unsigned char *data, *data_end;
- int ram_addr = (y << 5) + addr_offset - x;
- lcd_cmd_and_data(R_RAM_ADDR_SET, ram_addr);
+ lcd_cmd_and_data(R_RAM_ADDR_SET, (y << 5) + addr_offset - x);
lcd_prepare_cmd(R_RAM_DATA);
data = &lcd_framebuffer[y][2*x];
data_end = data + 2 * width;
#if defined(IPOD_MINI) || defined(IPOD_MINI2G)
- if (pix_offset == 6) {
- data -= 2;
- data_end -= 1;
+ if (pix_offset == -2) {
unsigned cur_word = *data++;
do {
cur_word = (cur_word << 8) | *data++;
cur_word = (cur_word << 8) | *data++;
lcd_send_data((cur_word >> 4) & 0xffff);
- } while (data < data_end);
+ } while (data <= data_end);
} else
#endif
{