/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) 2007 by Karl Kurbjun * * Some of this is based on the Cowon A2 Firmware release: * http://www.cowonglobal.com/download/gnu/cowon_pmp_a2_src_1.59_GPL.tar.gz * * 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. * ****************************************************************************/ #include "config.h" #include "cpu.h" #include "string.h" #include "lcd.h" #include "kernel.h" #include "memory.h" #include "system-target.h" static volatile bool lcd_on = true; volatile bool lcd_poweroff = false; /* ** These are imported from lcd-16bit.c */ extern unsigned fg_pattern; extern unsigned bg_pattern; bool lcd_enabled(void) { return lcd_on; } /* LCD init - based on code from ingenient-bsp/bootloader/board/dm320/splash.c * and code by Catalin Patulea from the M:Robe 500i linux port */ void lcd_init_device(void) { unsigned int addr; /* Clear the Frame */ memset16(FRAME, 0x0000, LCD_WIDTH*LCD_HEIGHT); outw(0x00ff, IO_OSD_MODE); outw(0x0002, IO_OSD_VIDWINMD); outw(0x2001, IO_OSD_OSDWINMD0); outw(0x0002, IO_OSD_OSDWINMD1); outw(0x0000, IO_OSD_ATRMD); outw(0x0000, IO_OSD_RECTCUR); outw((480*2) / 32, IO_OSD_OSDWIN0OFST); addr = ((int)FRAME-CONFIG_SDRAM_START) / 32; outw(addr >> 16, IO_OSD_OSDWINADH); outw(addr & 0xFFFF, IO_OSD_OSDWIN0ADL); outw(80, IO_OSD_BASEPX); outw(2, IO_OSD_BASEPY); outw(0, IO_OSD_OSDWIN0XP); outw(0, IO_OSD_OSDWIN0YP); outw(480, IO_OSD_OSDWIN0XL); outw(640, IO_OSD_OSDWIN0YL); } /* Update a fraction of the display. */ void lcd_update_rect(int x, int y, int width, int height) { fb_data *dst, *src; if (!lcd_on) return; if (x + width > LCD_WIDTH) width = LCD_WIDTH - x; /* Clip right */ if (x < 0) width += x, x = 0; /* Clip left */ if (width <= 0) return; /* nothing left to do */ if (y + height > LCD_HEIGHT) height = LCD_HEIGHT - y; /* Clip bottom */ if (y < 0) height += y, y = 0; /* Clip top */ if (height <= 0) return; /* nothing left to do */ dst = (fb_data *)FRAME + LCD_WIDTH*y + x; src = &lcd_framebuffer[y][x]; /* Copy part of the Rockbox framebuffer to the second framebuffer */ if (width < LCD_WIDTH) { int y; /* Not full width - do line-by-line */ for(y=0;y= 2 or else */ width &= ~1; height >>= 1; fb_data *dst = (fb_data*)FRAME + x * LCD_WIDTH + (LCD_WIDTH - y) - 1; z = stride*src_y; yuv_src[0] = src[0] + z + src_x; yuv_src[1] = src[1] + (z >> 2) + (src_x >> 1); yuv_src[2] = src[2] + (yuv_src[1] - src[1]); do { /* lcd_write_yuv420_lines(dst, chroma_buf, yuv_src, width, stride); */ yuv_src[0] += stride << 1; /* Skip down two luma lines */ yuv_src[1] += stride >> 1; /* Skip down one chroma line */ yuv_src[2] += stride >> 1; dst -= 2; } while (--height > 0); } void lcd_set_contrast(int val) { (void) val; // TODO: } void lcd_set_invert_display(bool yesno) { (void) yesno; // TODO: } void lcd_blit(const fb_data* data, int bx, int y, int bwidth, int height, int stride) { (void) data; (void) bx; (void) y; (void) bwidth; (void) height; (void) stride; //TODO: } void lcd_set_flip(bool yesno) { (void) yesno; // TODO: }