1 /* 2 * Copyright 2007 Freescale Semiconductor, Inc. 3 * York Sun <yorksun@freescale.com> 4 * 5 * FSL DIU Framebuffer driver 6 * 7 * See file CREDITS for list of people who contributed to this 8 * project. 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License as 12 * published by the Free Software Foundation; either version 2 of 13 * the License, or (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 23 * MA 02111-1307 USA 24 */ 25 26 #include <common.h> 27 #include <command.h> 28 #include <asm/io.h> 29 30 #ifdef CONFIG_FSL_DIU_FB 31 32 #include "../common/fsl_diu_fb.h" 33 34 #if defined(CONFIG_VIDEO) || defined(CONFIG_CFB_CONSOLE) 35 #include <stdio_dev.h> 36 #include <video_fb.h> 37 #endif 38 39 extern unsigned int FSL_Logo_BMP[]; 40 41 static int xres, yres; 42 43 void diu_set_pixel_clock(unsigned int pixclock) 44 { 45 volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR; 46 volatile ccsr_gur_t *gur = &immap->im_gur; 47 volatile unsigned int *guts_clkdvdr = &gur->clkdvdr; 48 unsigned long speed_ccb, temp, pixval; 49 50 speed_ccb = get_bus_freq(0); 51 temp = 1000000000/pixclock; 52 temp *= 1000; 53 pixval = speed_ccb / temp; 54 debug("DIU pixval = %lu\n", pixval); 55 56 /* Modify PXCLK in GUTS CLKDVDR */ 57 debug("DIU: Current value of CLKDVDR = 0x%08x\n", *guts_clkdvdr); 58 temp = *guts_clkdvdr & 0x2000FFFF; 59 *guts_clkdvdr = temp; /* turn off clock */ 60 *guts_clkdvdr = temp | 0x80000000 | ((pixval & 0x1F) << 16); 61 debug("DIU: Modified value of CLKDVDR = 0x%08x\n", *guts_clkdvdr); 62 } 63 64 void mpc8610hpcd_diu_init(void) 65 { 66 char *monitor_port; 67 int gamma_fix; 68 unsigned int pixel_format; 69 unsigned char tmp_val; 70 unsigned char pixis_arch; 71 u8 *pixis_base = (u8 *)PIXIS_BASE; 72 73 tmp_val = in_8(pixis_base + PIXIS_BRDCFG0); 74 pixis_arch = in_8(pixis_base + PIXIS_VER); 75 76 monitor_port = getenv("monitor"); 77 if (!strncmp(monitor_port, "0", 1)) { /* 0 - DVI */ 78 xres = 1280; 79 yres = 1024; 80 if (pixis_arch == 0x01) 81 pixel_format = 0x88882317; 82 else 83 pixel_format = 0x88883316; 84 gamma_fix = 0; 85 out_8(pixis_base + PIXIS_BRDCFG0, tmp_val | 0x08); 86 87 } else if (!strncmp(monitor_port, "1", 1)) { /* 1 - Single link LVDS */ 88 xres = 1024; 89 yres = 768; 90 pixel_format = 0x88883316; 91 gamma_fix = 0; 92 out_8(pixis_base + PIXIS_BRDCFG0, (tmp_val & 0xf7) | 0x10); 93 94 } else if (!strncmp(monitor_port, "2", 1)) { /* 2 - Double link LVDS */ 95 xres = 1280; 96 yres = 1024; 97 pixel_format = 0x88883316; 98 gamma_fix = 1; 99 out_8(pixis_base + PIXIS_BRDCFG0, tmp_val & 0xe7); 100 101 } else { /* DVI */ 102 xres = 1280; 103 yres = 1024; 104 pixel_format = 0x88882317; 105 gamma_fix = 0; 106 out_8(pixis_base + PIXIS_BRDCFG0, tmp_val | 0x08); 107 } 108 109 fsl_diu_init(xres, pixel_format, gamma_fix, 110 (unsigned char *)FSL_Logo_BMP); 111 } 112 113 int mpc8610diu_init_show_bmp(cmd_tbl_t *cmdtp, 114 int flag, int argc, char * const argv[]) 115 { 116 unsigned int addr; 117 118 if (argc < 2) 119 return cmd_usage(cmdtp); 120 121 if (!strncmp(argv[1],"init",4)) { 122 #if defined(CONFIG_VIDEO) || defined(CONFIG_CFB_CONSOLE) 123 fsl_diu_clear_screen(); 124 drv_video_init(); 125 #else 126 mpc8610hpcd_diu_init(); 127 #endif 128 } else { 129 addr = simple_strtoul(argv[1], NULL, 16); 130 fsl_diu_clear_screen(); 131 fsl_diu_display_bmp((unsigned char *)addr, 0, 0, 0); 132 } 133 134 return 0; 135 } 136 137 U_BOOT_CMD( 138 diufb, CONFIG_SYS_MAXARGS, 1, mpc8610diu_init_show_bmp, 139 "Init or Display BMP file", 140 "init\n - initialize DIU\n" 141 "addr\n - display bmp at address 'addr'" 142 ); 143 144 145 #if defined(CONFIG_VIDEO) || defined(CONFIG_CFB_CONSOLE) 146 147 /* 148 * The Graphic Device 149 */ 150 GraphicDevice ctfb; 151 void *video_hw_init(void) 152 { 153 GraphicDevice *pGD = (GraphicDevice *) &ctfb; 154 struct fb_info *info; 155 156 mpc8610hpcd_diu_init(); 157 158 /* fill in Graphic device struct */ 159 sprintf(pGD->modeIdent, 160 "%dx%dx%d %ldkHz %ldHz", 161 xres, yres, 32, 64, 60); 162 163 pGD->frameAdrs = (unsigned int)fsl_fb_open(&info); 164 pGD->winSizeX = xres; 165 pGD->winSizeY = yres - info->logo_height; 166 pGD->plnSizeX = pGD->winSizeX; 167 pGD->plnSizeY = pGD->winSizeY; 168 169 pGD->gdfBytesPP = 4; 170 pGD->gdfIndex = GDF_32BIT_X888RGB; 171 172 pGD->isaBase = 0; 173 pGD->pciBase = 0; 174 pGD->memSize = info->screen_size - info->logo_size; 175 176 /* Cursor Start Address */ 177 pGD->dprBase = 0; 178 pGD->vprBase = 0; 179 pGD->cprBase = 0; 180 181 return (void *)pGD; 182 } 183 184 #endif /* defined(CONFIG_VIDEO) || defined(CONFIG_CFB_CONSOLE) */ 185 186 #endif /* CONFIG_FSL_DIU_FB */ 187