diff options
| author | Andrew Ryabinin <ryabinin.a.a@gmail.com> | 2012-06-23 22:35:04 +0400 |
|---|---|---|
| committer | Andrew Ryabinin <ryabinin.a.a@gmail.com> | 2012-06-30 21:01:25 +0400 |
| commit | 052b5f1da916ac931ea6afebb232839fc913aaba (patch) | |
| tree | b05bf65a5491be7ca8ded4b7c11b37f0382cc1fc | |
| parent | bed847a655763925311029acd7080543b7fcf352 (diff) | |
| download | rockbox-052b5f1da916ac931ea6afebb232839fc913aaba.zip rockbox-052b5f1da916ac931ea6afebb232839fc913aaba.tar.gz rockbox-052b5f1da916ac931ea6afebb232839fc913aaba.tar.bz2 rockbox-052b5f1da916ac931ea6afebb232839fc913aaba.tar.xz | |
hm60x: Add support for HM-601 slims with new lcds.
Change-Id: I02d5c85e70686c842f1379aba24ff045b260a4ff
| -rw-r--r-- | firmware/target/arm/rk27xx/lcd-hifiman.c | 187 |
1 files changed, 167 insertions, 20 deletions
diff --git a/firmware/target/arm/rk27xx/lcd-hifiman.c b/firmware/target/arm/rk27xx/lcd-hifiman.c index d98ed5a..b97766c 100644 --- a/firmware/target/arm/rk27xx/lcd-hifiman.c +++ b/firmware/target/arm/rk27xx/lcd-hifiman.c @@ -29,7 +29,7 @@ static bool display_on = false; -static void lcd_display_init(void) +static void lcd_v1_display_init(void) { unsigned int x, y; @@ -108,13 +108,7 @@ static void lcd_display_init(void) display_on = true; } -void lcd_init_device(void) -{ - lcdif_init(LCDIF_16BIT); - lcd_display_init(); -} - -void lcd_enable (bool on) +static void lcd_v1_enable (bool on) { if (on) { @@ -145,32 +139,185 @@ void lcd_enable (bool on) lcd_write_reg(0x21, 0x00); } display_on = on; - } -bool lcd_active() +static void lcd_v1_update_rect(int x, int y, int width, int height) { - return display_on; + int px = x, py = y; + int pxmax = x + width, pymax = y + height; + + lcd_write_reg(0x03, y); + lcd_write_reg(0x05, pymax-1); + lcd_write_reg(0x07, x); + lcd_write_reg(0x09, pxmax-1); + + lcd_cmd(0x22); + + for (px=x; px<pxmax; px++) + for (py=y; py<pymax; py++) + lcd_data(*FBADDR(px, py)); } -void lcd_update_rect(int x, int y, int width, int height) +#ifdef HM60X + +enum lcd_type_t { - int px = x, py = y; - int pxmax = x + width, pymax = y + height; + LCD_V1, + LCD_v2 +} lcd_type; + +static void identify_lcd(void) +{ + SCU_IOMUXB_CON &= ~(1<<2); + GPIO_PCCON |= (1<<4); + if (GPIO_PCDR & (1<<4)) + { + lcd_type = LCD_V1; + } + else + { + lcd_type = LCD_v2; + } +} + +static void lcd_v2_display_init(void) +{ + unsigned int x, y; - lcd_write_reg(0x03, y); - lcd_write_reg(0x05, pymax-1); - lcd_write_reg(0x07, x); - lcd_write_reg(0x09, pxmax-1); + lcd_write_reg(0xD0, 0x0003); + lcd_write_reg(0xEB, 0x0B00); + lcd_write_reg(0xEC, 0x00CF); + lcd_write_reg(0xC7, 0x030F); + + lcd_write_reg(0x01, 0x001C); + lcd_write_reg(0x02, 0x0100); + lcd_write_reg(0x03, 0x1038); + lcd_write_reg(0x07, 0x0000); + lcd_write_reg(0x08, 0x0808); + lcd_write_reg(0x0F, 0x0901); + lcd_write_reg(0x10, 0x0000); + lcd_write_reg(0x11, 0x1B41); + lcd_write_reg(0x12, 0x2010); + lcd_write_reg(0x13, 0x0009); + lcd_write_reg(0x14, 0x4C65); + + lcd_write_reg(0x30, 0x0000); + lcd_write_reg(0x31, 0x00DB); + lcd_write_reg(0x32, 0x0000); + lcd_write_reg(0x33, 0x0000); + lcd_write_reg(0x34, 0x00DB); + lcd_write_reg(0x35, 0x0000); + lcd_write_reg(0x36, 0x00AF); + lcd_write_reg(0x37, 0x0000); + lcd_write_reg(0x38, 0x00DB); + lcd_write_reg(0x39, 0x0000); + + lcd_write_reg(0x50, 0x0000); + lcd_write_reg(0x51, 0x0705); + lcd_write_reg(0x52, 0x0C0A); + lcd_write_reg(0x53, 0x0401); + lcd_write_reg(0x54, 0x040C); + lcd_write_reg(0x55, 0x0608); + lcd_write_reg(0x56, 0x0000); + lcd_write_reg(0x57, 0x0104); + lcd_write_reg(0x58, 0x0E06); + lcd_write_reg(0x59, 0x060E); + + lcd_write_reg(0x20, 0x0000); + lcd_write_reg(0x21, 0x0000); + + lcd_write_reg(0x07, 0x1017); + + lcd_write_reg(0x20, 0x00AF); + lcd_write_reg(0x21, 0x0000); lcd_cmd(0x22); - for (px=x; px<pxmax; px++) - for (py=y; py<pymax; py++) + for (x=0; x<LCD_WIDTH; x++) + for(y=0; y<LCD_HEIGHT; y++) + lcd_data(0x00); + + display_on = true; +} + +static void lcd_v2_enable (bool on) +{ + display_on = on; +} + +static void lcd_v2_update_rect(int x, int y, int width, int height) +{ + int px, py; + (void) x; + (void) y; + (void) width; + (void)height; + + lcd_cmd(0x22); + + for (py=0; py<LCD_HEIGHT; py++) + for (px=0; px<LCD_WIDTH; px++) lcd_data(*FBADDR(px, py)); } +void lcd_init_device(void) +{ + lcdif_init(LCDIF_16BIT); + + identify_lcd(); + if (lcd_type == LCD_V1) + lcd_v1_display_init(); + else + lcd_v2_display_init(); + +} + +void lcd_enable (bool on) +{ + if (lcd_type == LCD_V1) + lcd_v1_enable(on); + else + lcd_v2_enable(on); +} + +void lcd_update_rect(int x, int y, int width, int height) +{ + if (lcd_type == LCD_V1) + lcd_v1_update_rect(x, y, width, height); + else + lcd_v2_update_rect(x, y, width, height); +} + + + +#else /* HM801 */ + +void lcd_init_device(void) +{ + lcdif_init(LCDIF_16BIT); + lcd_v1_display_init(); +} + +void lcd_enable (bool on) +{ + lcd_v1_enable(on); +} + +void lcd_update_rect(int x, int y, int width, int height) +{ + lcd_v1_update_rect(x, y, width, height); +} + +#endif + + + +bool lcd_active() +{ + return display_on; +} + /* Blit a YUV bitmap directly to the LCD */ void lcd_blit_yuv(unsigned char * const src[3], int src_x, int src_y, int stride, |