1 /* 2 * Ben NanoNote LCD initialisation, based on uboot-xburst and xburst-tools. 3 * 4 * Copyright (C) 2001-2002 Wolfgang Denk, DENX Software Engineering, <wd@denx.de> 5 * Copyright (C) 2015 Paul Boddie <paul@boddie.org.uk> 6 * 7 * This program is free software; you can redistribute it and/or modify it under 8 * the terms of the GNU General Public License as published by the Free Software 9 * Foundation; either version 3 of the License, or (at your option) any later 10 * version. 11 * 12 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 15 * details. 16 * 17 * You should have received a copy of the GNU General Public License along with 18 * this program. If not, see <http://www.gnu.org/licenses/>. 19 */ 20 21 #ifdef CONFIG_CPU_JZ4730_MINIPC 22 #include "minipc_claa070vc01.h" 23 #include "minipc.h" 24 #else 25 #include "nanonote_gpm940b0.h" 26 #include "nanonote.h" 27 #endif 28 29 #include "xburst_types.h" 30 #include "jzlcd.h" 31 #include "sdram.h" 32 #include "board.h" 33 34 #define ALIGN(x,a) __ALIGN_MASK((x),(typeof(x))(a)-1) 35 #define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask)) 36 37 extern vidinfo_t panel_info; 38 39 unsigned long lcd_setmem(unsigned long addr) 40 { 41 unsigned long size; 42 43 size = lcd_get_size(); 44 45 /* Round up to nearest full page, or MMU section if defined */ 46 size = ALIGN(size, PAGE_SIZE); 47 addr = ALIGN(addr - PAGE_SIZE + 1, PAGE_SIZE); 48 49 /* Allocate pages for the frame buffer. */ 50 addr -= size; 51 52 return addr; 53 } 54 55 static void test_pattern(void *lcd_base) 56 { 57 unsigned short v_max = panel_info.vl_row; 58 unsigned short h_max = panel_info.vl_col; 59 unsigned short v, h; 60 u32 *pix = (u32 *)lcd_base; 61 62 /* WARNING: Code silently assumes 32 bit/pixel */ 63 for (v = 0; v < v_max; v += 1) { 64 for (h = 0; h < h_max; h += 1) { 65 *pix++ = ( 66 (((255 * (h_max - h)) / (h_max - 1)) << 16) + 67 ((((255 * h) / (h_max - 1) + (255 * (v_max - v)) / (v_max - 1)) / 2) << 8) + 68 ((255 * v) / (v_max - 1)) 69 ); 70 } 71 } 72 } 73 74 void lcd_clear(void *lcd_base) 75 { 76 test_pattern(lcd_base); 77 } 78 79 /* LCD initialisation. */ 80 81 static void *lcd_base; 82 83 void lcd_init(void) 84 { 85 __lcd_display_pin_init(); 86 __lcd_display_on(); 87 88 /* Start from the top of memory and obtain a framebuffer region. */ 89 90 lcd_base = (void *) lcd_setmem(get_memory_size()); 91 lcd_ctrl_init(lcd_base); 92 lcd_clear(lcd_base); 93 lcd_enable(); 94 }