/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id: lcd-archos-bitmap.c 13114 2007-04-11 23:51:00Z amiconn $ * * Copyright (C) 2002 by Alan Korr * * 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 "lcd.h" #include "kernel.h" #include "system.h" #include "system-target.h" #include "hwcompat.h" /* TCC77x specific defines */ #define HwCSCFG1 *(volatile unsigned long *)0xF0000014 // R/W, Ext. CS Configuration #define HwMCFG *(volatile unsigned long *)0xF0000008 // R/W, Misc. Configuration #define HwCSCFG1_URDY (1<<21) // Use Ready #define LCD_CMD *(volatile unsigned char*)(0x50080000) #define LCD_DATA *(volatile unsigned char*)(0x50080001) #define LCD_CS 1 #define LCD_BASEADDR 0x5 #define LCD_BUSWIDTH 3 #define LCD_STUPTIME 5 #define LCD_PULSEWIDTH 9 #define LCD_HOLDTIME 2 #define HwCSCFG(CS) *(volatile unsigned long*)(0xF0000010 + ((CS)<<2)) #define McSetLCD(CS, BASE, BW, URDY, SETUP, PW, HOLD) \ HwCSCFG(CS) = ( \ ((3) << 26) | \ (((BW)^((HwMCFG&0x1800)>>11)) << 28) | \ ((BASE)<<22) | \ ((URDY)<<21) | \ ((1<<20)) | \ (((SETUP)&7)<<11) | \ (((PW)&0xFF)<<3) | \ ((HOLD)&7) \ ) void lcd_write_command(int byte) { LCD_CMD = byte; asm volatile ( "nop \n\t" "nop \n\t" "nop \n\t" ); } void lcd_write_data(const fb_data* p_bytes, int count) { while (count--) { LCD_DATA = *(p_bytes++); asm volatile ( "nop \n\t" "nop \n\t" "nop \n\t" ); } } void lcd_write_reg(int reg, int data) { GPIOA |= 0x400; outw(0, 0x50010000); outw(reg<<1,0x50010000); GPIOA &= ~0x400; outw((data & 0xff00) >> 7, 0x50010008); outw((data << 24)>>23, 0x50010008); } static void lcd_delay(int x) { int i; x *= 0xc35; for (i=0;i> 30)) <<28) | 0x0d500023; /* lcd init 1 */ lcd_write_reg(0x0, 0x1); lcd_delay(0xf); lcd_write_reg(0x7, 0x0); lcd_delay(0xa); lcd_write_reg(0x11, 0x2); lcd_write_reg(0x12, 0xa); lcd_write_reg(0x13, 0xc5a); lcd_write_reg(0x10, 0x4); lcd_write_reg(0x10, 0x134); lcd_write_reg(0x11, 0x111); lcd_write_reg(0x12, 0x1c); lcd_delay(0x28); lcd_write_reg(0x13, 0x2c40); lcd_write_reg(0x10, 0x510); lcd_delay(0x3c); /* lcd init 2 */ lcd_write_reg(0x1, 0x113); lcd_write_reg(0x2, 0x700); lcd_write_reg(0x3, 0x1038); lcd_write_reg(0x8, 0x508); lcd_write_reg(0x9, 0x0); lcd_write_reg(0xb, 0x3); lcd_write_reg(0x21, 0x0); lcd_write_reg(0x30, 0x406); lcd_write_reg(0x31, 0x303); lcd_write_reg(0x32, 0x0); lcd_write_reg(0x33, 0x305); lcd_write_reg(0x34, 0x404); lcd_write_reg(0x35, 0x0); lcd_write_reg(0x36, 0x0); lcd_write_reg(0x37, 0x503); lcd_write_reg(0x38, 0x1d05); lcd_write_reg(0x39, 0x1d05); lcd_write_reg(0x41, 0x0); lcd_write_reg(0x42, 0x9f00); lcd_write_reg(0x43, 0x9f00); lcd_write_reg(0x44, 0x7f00); lcd_write_reg(0x45, 0x9f00); /* lcd init 3 */ lcd_write_reg(0x10, 0x4510); lcd_write_reg(0x7, 0x5); lcd_delay(0x28); lcd_write_reg(0x7, 0x25); lcd_write_reg(0x7, 0x27); lcd_delay(0x28); lcd_write_reg(0x7, 0x37); } /*** Update functions ***/ /* Performance function that works with an external buffer note that by and bheight are in 8-pixel units! */ void lcd_blit(const fb_data* data, int x, int by, int width, int bheight, int stride) { } /* Update the display. This must be called after all other LCD functions that change the display. */ //void lcd_update(void) ICODE_ATTR; void lcd_update(void) { } /* Update a fraction of the display. */ //void lcd_update_rect(int, int, int, int) ICODE_ATTR; void lcd_update_rect(int x, int y, int width, int height) { }