/*************************************************************************** * __________ __ ___. * 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" #include "lcd-target.h" /* Copies a rectangle from one framebuffer to another. Can be used in single transfer mode with width = num pixels, and height = 1 which allows a full-width rectangle to be copied more efficiently. */ extern void lcd_copy_buffer_rect(fb_data *dst, const fb_data *src, int width, int height); 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); IO_OSD_MODE=0x00ff; IO_OSD_VIDWINMD=0x0002; IO_OSD_OSDWINMD0=0x2001; IO_OSD_OSDWINMD1=0x0002; IO_OSD_ATRMD=0x0000; IO_OSD_RECTCUR=0x0000; IO_OSD_OSDWIN0OFST=(480*2) / 32; addr = ((int)FRAME-CONFIG_SDRAM_START) / 32; IO_OSD_OSDWINADH=addr >> 16; IO_OSD_OSDWIN0ADL=addr & 0xFFFF; IO_OSD_BASEPX=80; IO_OSD_BASEPY=2; IO_OSD_OSDWIN0XP=0; IO_OSD_OSDWIN0YP=0; IO_OSD_OSDWIN0XL=480; IO_OSD_OSDWIN0YL=640; } /* Update a fraction of the display. */ void lcd_update_rect(int x, int y, int width, int height) { register 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 */ #if CONFIG_ORIENTATION == SCREEN_PORTRAIT 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) { /* Not full width - do line-by-line */ lcd_copy_buffer_rect(dst, src, width, height); } else { /* Full width - copy as one line */ lcd_copy_buffer_rect(dst, src, LCD_WIDTH*height, 1); } #else src = &lcd_framebuffer[y][x]; register int xc, yc; register fb_data *start=FRAME + LCD_HEIGHT*(LCD_WIDTH-x-1) + y + 1; for(yc=0;yc= 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_set_flip(bool yesno) { (void) yesno; // TODO: }