int s3cfb_set_timing(struct s3cfb_global *ctrl) { struct s3cfb_lcd_timing *time; u32 cfg; time = &ctrl->lcd->timing; cfg = 0; cfg |= S3C_VIDTCON0_VBPDE(time->v_bpe - 1); cfg |= S3C_VIDTCON0_VBPD(time->v_bp - 1); cfg |= S3C_VIDTCON0_VFPD(time->v_fp - 1); cfg |= S3C_VIDTCON0_VSPW(time->v_sw - 1); writel(cfg, ctrl->regs + S3C_VIDTCON0); cfg = 0; cfg |= S3C_VIDTCON1_VFPDE(time->v_fpe - 1); cfg |= S3C_VIDTCON1_HBPD(time->h_bp - 1); cfg |= S3C_VIDTCON1_HFPD(time->h_fp - 1); cfg |= S3C_VIDTCON1_HSPW(time->h_sw - 1); writel(cfg, ctrl->regs + S3C_VIDTCON1); return 0; }
static void s3cfb_set_fimd_info(void) { s3cfb_fimd.vidcon1 = S3C_VIDCON1_IHSYNC_INVERT | S3C_VIDCON1_IVSYNC_INVERT | S3C_VIDCON1_IVDEN_NORMAL; s3cfb_fimd.vidtcon0 = S3C_VIDTCON0_VBPD(S3C_FB_VBP - 1) | S3C_VIDTCON0_VFPD(S3C_FB_VFP - 1) | S3C_VIDTCON0_VSPW(S3C_FB_VSW - 1); s3cfb_fimd.vidtcon1 = S3C_VIDTCON1_HBPD(S3C_FB_HBP - 1) | S3C_VIDTCON1_HFPD(S3C_FB_HFP - 1) | S3C_VIDTCON1_HSPW(S3C_FB_HSW - 1); s3cfb_fimd.vidtcon2 = S3C_VIDTCON2_LINEVAL(S3C_FB_VRES - 1) | S3C_VIDTCON2_HOZVAL(S3C_FB_HRES - 1); s3cfb_fimd.vidosd0a = S3C_VIDOSDxA_OSD_LTX_F(0) | S3C_VIDOSDxA_OSD_LTY_F(0); s3cfb_fimd.vidosd0b = S3C_VIDOSDxB_OSD_RBX_F(S3C_FB_HRES - 1) | S3C_VIDOSDxB_OSD_RBY_F(S3C_FB_VRES - 1); s3cfb_fimd.vidosd1a = S3C_VIDOSDxA_OSD_LTX_F(0) | S3C_VIDOSDxA_OSD_LTY_F(0); s3cfb_fimd.vidosd1b = S3C_VIDOSDxB_OSD_RBX_F(S3C_FB_HRES_OSD - 1) | S3C_VIDOSDxB_OSD_RBY_F(S3C_FB_VRES_OSD - 1); s3cfb_fimd.width = S3C_FB_HRES; s3cfb_fimd.height = S3C_FB_VRES; s3cfb_fimd.xres = S3C_FB_HRES; s3cfb_fimd.yres = S3C_FB_VRES; #if defined(CONFIG_FB_S3C_VIRTUAL_SCREEN) s3cfb_fimd.xres_virtual = S3C_FB_HRES_VIRTUAL; s3cfb_fimd.yres_virtual = S3C_FB_VRES_VIRTUAL; #else s3cfb_fimd.xres_virtual = S3C_FB_HRES; s3cfb_fimd.yres_virtual = S3C_FB_VRES; #endif s3cfb_fimd.osd_width = S3C_FB_HRES_OSD; s3cfb_fimd.osd_height = S3C_FB_VRES_OSD; s3cfb_fimd.osd_xres = S3C_FB_HRES_OSD; s3cfb_fimd.osd_yres = S3C_FB_VRES_OSD; s3cfb_fimd.osd_xres_virtual = S3C_FB_HRES_OSD; s3cfb_fimd.osd_yres_virtual = S3C_FB_VRES_OSD; s3cfb_fimd.pixclock = S3C_FB_PIXEL_CLOCK; s3cfb_fimd.hsync_len = S3C_FB_HSW; s3cfb_fimd.vsync_len = S3C_FB_VSW; s3cfb_fimd.left_margin = S3C_FB_HFP; s3cfb_fimd.upper_margin = S3C_FB_VFP; s3cfb_fimd.right_margin = S3C_FB_HBP; s3cfb_fimd.lower_margin = S3C_FB_VBP; }
static void s3cfb_set_fimd_info(struct s3c64xxfb_platform_data *pdata) { if (!pdata->dither) { s3c_fimd.dithmode = 0; } else { u32 dith_en = S3C_DITHMODE_DITHERING_ENABLE; u32 dith_pos = 0; switch (pdata->dither & 0xF) { case 8: dith_pos = S3C_DITHMODE_BDITHPOS_8BIT; break; case 6: dith_pos = S3C_DITHMODE_BDITHPOS_6BIT; break; case 5: dith_pos = S3C_DITHMODE_BDITHPOS_5BIT; break; default: dith_en = 0; } switch (pdata->dither & 0xF0) { case 80: dith_pos |= S3C_DITHMODE_GDITHPOS_8BIT; break; case 60: dith_pos |= S3C_DITHMODE_GDITHPOS_6BIT; break; case 50: dith_pos |= S3C_DITHMODE_GDITHPOS_5BIT; break; default: dith_en = 0; } switch (pdata->dither & 0xF00) { case 800: dith_pos |= S3C_DITHMODE_RDITHPOS_8BIT; break; case 600: dith_pos |= S3C_DITHMODE_RDITHPOS_6BIT; break; case 500: dith_pos |= S3C_DITHMODE_RDITHPOS_5BIT; break; default: dith_en = 0; } s3c_fimd.dithmode = dith_en | dith_pos; } s3c_fimd.vidcon1 = pdata->vidcon1; s3c_fimd.vidtcon0 = S3C_VIDTCON0_VBPD(pdata->vbp - 1) | S3C_VIDTCON0_VFPD(pdata->vfp - 1) | S3C_VIDTCON0_VSPW(pdata->vsw - 1); s3c_fimd.vidtcon1 = S3C_VIDTCON1_HBPD(pdata->hbp - 1) | S3C_VIDTCON1_HFPD(pdata->hfp - 1) | S3C_VIDTCON1_HSPW(pdata->hsw - 1); s3c_fimd.vidtcon2 = S3C_VIDTCON2_LINEVAL(pdata->yres - 1) | S3C_VIDTCON2_HOZVAL(pdata->xres - 1); s3c_fimd.width = pdata->width; s3c_fimd.height = pdata->height; s3c_fimd.xres = pdata->xres; s3c_fimd.yres = pdata->yres; s3c_fimd.xres_virtual = pdata->xres; s3c_fimd.yres_virtual = pdata->yres * 2; s3c_fimd.pixclock = pdata->refresh_rate * (pdata->hfp + pdata->hsw + pdata->hbp + pdata->xres) * (pdata->vfp + pdata->vsw + pdata->vbp + pdata->yres); s3c_fimd.hsync_len = pdata->hsw; s3c_fimd.vsync_len = pdata->vsw; s3c_fimd.left_margin = pdata->hfp; s3c_fimd.upper_margin = pdata->vfp; s3c_fimd.right_margin = pdata->hbp; s3c_fimd.lower_margin = pdata->vbp; s3c_fimd.logo_base = pdata->logo_base; s3c_fimd.logo_size = pdata->logo_size; }
/******************************************************************************* * * Init video chip with common Linux graphic modes (lilo) */ void *video_hw_init (void) { S5PC11X_FB * const fb = S5PC11X_GetBase_FB(); GraphicDevice *pGD = (GraphicDevice *)&smi; int videomode; unsigned long t1, hsynch, vsynch; char *penv; int tmp, i, bits_per_pixel; struct ctfb_res_modes *res_mode; struct ctfb_res_modes var_mode; int clkval; /* Search for video chip */ printf("Video: "); tmp = 0; videomode = CFG_SYS_DEFAULT_VIDEO_MODE; /* get video mode via environment */ if ((penv = getenv ("videomode")) != NULL) { /* deceide if it is a string */ if (penv[0] <= '9') { videomode = (int) simple_strtoul (penv, NULL, 16); tmp = 1; } } else { tmp = 1; } if (tmp) { /* parameter are vesa modes */ /* search params */ for (i = 0; i < VESA_MODES_COUNT; i++) { if (vesa_modes[i].vesanr == videomode) break; } if (i == VESA_MODES_COUNT) { printf ("no VESA Mode found, switching to mode 0x%x ", CFG_SYS_DEFAULT_VIDEO_MODE); i = 0; } res_mode = (struct ctfb_res_modes *)&res_mode_init[vesa_modes[i].resindex]; bits_per_pixel = vesa_modes[i].bits_per_pixel; } else { res_mode = (struct ctfb_res_modes *) &var_mode; bits_per_pixel = video_get_params (res_mode, penv); } /* calculate hsynch and vsynch freq (info only) */ t1 = (res_mode->left_margin + res_mode->xres + res_mode->right_margin + res_mode->hsync_len) / 8; t1 *= 8; t1 *= res_mode->pixclock; t1 /= 1000; hsynch = 1000000000L / t1; t1 *= (res_mode->upper_margin + res_mode->yres + res_mode->lower_margin + res_mode->vsync_len); t1 /= 1000; vsynch = 1000000000L / t1; /* fill in Graphic device struct */ sprintf (pGD->modeIdent, "%dx%dx%d %ldkHz %ldHz", res_mode->xres, res_mode->yres, bits_per_pixel, (hsynch / 1000), (vsynch / 1000)); printf ("%s\n", pGD->modeIdent); pGD->winSizeX = res_mode->xres; pGD->winSizeY = res_mode->yres; pGD->plnSizeX = res_mode->xres; pGD->plnSizeY = res_mode->yres; switch (bits_per_pixel) { case 8: pGD->gdfBytesPP = 1; pGD->gdfIndex = GDF__8BIT_INDEX; break; case 15: pGD->gdfBytesPP = 2; pGD->gdfIndex = GDF_15BIT_555RGB; break; case 16: pGD->gdfBytesPP = 2; pGD->gdfIndex = GDF_16BIT_565RGB; break; case 24: pGD->gdfBytesPP = 3; pGD->gdfIndex = GDF_24BIT_888RGB; break; case 32: pGD->gdfBytesPP = 4; pGD->gdfIndex = GDF_32BIT_X888RGB; break; } #if 0 /* statically configure settings */ pGD->winSizeX = pGD->plnSizeX = 240; pGD->winSizeY = pGD->plnSizeY = 320; pGD->gdfBytesPP = 2; pGD->gdfIndex = GDF_16BIT_565RGB; #endif pGD->frameAdrs = LCD_VIDEO_ADDR; pGD->memSize = VIDEO_MEM_SIZE; /* Clear video memory */ memset((void *)pGD->frameAdrs, 0x00, pGD->memSize); board_video_init(pGD); t1 = res_mode->pixclock; t1 /= 1000; t1 = 1000000000L / t1; clkval = (CONFIG_SYS_VIDEO_VCLOCK_HZ / t1) - 1; /* 配置视频输出格式和显示使能/禁止。*/ fb->VIDCON0 = ( S3C_VIDCON0_VIDOUT_RGB | S3C_VIDCON0_PNRMODE_RGB_P | S3C_VIDCON0_CLKVALUP_ALWAYS | S3C_VIDCON0_CLKVAL_F(clkval)| S3C_VIDCON0_VCLKEN_NORMAL | S3C_VIDCON0_CLKDIR_DIVIDED| S3C_VIDCON0_CLKSEL_HCLK ); /* RGB I/F控制信号。*/ fb->VIDCON1 = ( S3C_VIDCON1_IVSYNC_INVERT | S3C_VIDCON1_IHSYNC_INVERT); /* 配置视频输出时序和显示尺寸。*/ fb->VIDTCON0 = ( S3C_VIDTCON0_VBPD(res_mode->upper_margin) | S3C_VIDTCON0_VFPD(res_mode->lower_margin) | S3C_VIDTCON0_VSPW(res_mode->vsync_len)); fb->VIDTCON1 = ( S3C_VIDTCON1_HBPD(res_mode->left_margin) | S3C_VIDTCON1_HFPD(res_mode->right_margin) | S3C_VIDTCON1_HSPW(res_mode->hsync_len)); fb->VIDTCON2 = ( S3C_VIDTCON2_LINEVAL(pGD->winSizeY - 1) | S3C_VIDTCON2_HOZVAL(pGD->winSizeX - 1)); #if defined(LCD_VIDEO_BACKGROUND) fb->WINCON0 = (S3C_WINCON_BPPMODE_16BPP_565 | S3C_WINCON_ENWIN_ENABLE | S3C_WINCON_HAWSWP_ENABLE); fb->VIDOSD0A = ( S3C_VIDOSD_LEFT_X(0) | S3C_VIDOSD_TOP_Y(0)); fb->VIDOSD0B = ( S3C_VIDOSD_RIGHT_X(pGD->winSizeX - 1) | S3C_VIDOSD_BOTTOM_Y(pGD->winSizeY - 1)); /* 指定视频窗口0的大小控制寄存器。*/ fb->VIDOSD0C = S3C_VIDOSD_SIZE(pGD->winSizeY * pGD->winSizeX); #endif /* 窗口格式设置 */ fb->WINCON1 = (S3C_WINCON_BPPMODE_16BPP_565 | S3C_WINCON_ENWIN_ENABLE | S3C_WINCON_HAWSWP_ENABLE); /* 指定OSD图像的左上角像素的横向屏幕坐标。*/ fb->VIDOSD1A = ( S3C_VIDOSD_LEFT_X(0) | S3C_VIDOSD_TOP_Y(0)); /* 指定横屏右下角的OSD图像的像素坐标。*/ fb->VIDOSD1B = ( S3C_VIDOSD_RIGHT_X(pGD->winSizeX - 1) | S3C_VIDOSD_BOTTOM_Y(pGD->winSizeY - 1)); #if defined(LCD_VIDEO_BACKGROUND) fb->VIDOSD1C = ( S3C_VIDOSD_ALPHA0_R(LCD_VIDEO_BACKGROUND_ALPHA) | S3C_VIDOSD_ALPHA0_G(LCD_VIDEO_BACKGROUND_ALPHA) | S3C_VIDOSD_ALPHA0_B(LCD_VIDEO_BACKGROUND_ALPHA) ); #endif /* 指定视频窗口1的大小控制寄存器。*/ fb->VIDOSD1D = S3C_VIDOSD_SIZE(pGD->winSizeY * pGD->winSizeX); fb->SHADOWCON = S3C_WINSHMAP_CH_ENABLE(1); //Enables Channel 1 #if defined(LCD_VIDEO_BACKGROUND) /* config Display framebuffer addr for background*/ /* 指定窗口0的缓冲区起始地址寄存器,缓冲器0。*/ fb->VIDW00ADD0B0 = LCD_VIDEO_BACKGROUND_ADDR; /* This marks the end of the frame buffer. */ /* 指定窗口0的缓冲区,缓冲区结束地址寄存器0。*/ fb->VIDW00ADD1B0 = (S3C_VIDW00ADD0B0 &0xffffffff) + (pGD->winSizeX+0) * pGD->winSizeY * (pGD->gdfBytesPP); /* 指定窗口0的缓冲区大小寄存器。*/ fb->VIDW00ADD2= ((pGD->winSizeX * pGD->gdfBytesPP) & 0x1fff); #endif /* config Display framebuffer addr for console*/ fb->VIDW01ADD0B0 = pGD->frameAdrs; /* This marks the end of the frame buffer. */ fb->VIDW01ADD1B0 = (S3C_VIDW01ADD0B0 &0xffffffff) + (pGD->winSizeX+0) * pGD->winSizeY * (pGD->gdfBytesPP); fb->VIDW01ADD2= ((pGD->winSizeX * pGD->gdfBytesPP) & 0x1fff); /* Enable Display */ fb->VIDCON0 |= (S3C_VIDCON0_ENVID_ENABLE | S3C_VIDCON0_ENVID_F_ENABLE); /* ENVID = 1 ENVID_F = 1*/ fb->TRIGCON = 3;//(TRGMODE_I80 | SWTRGCMD_I80);TRIGCON = 3 /* Enable Display */ //VIDCON0 |= (VIDCON0_ENVID_ENABLE | VIDCON0_ENVID_F_ENABLE); /* ENVID = 1 ENVID_F = 1*/ //TRIGCON = (TRGMODE_I80 | SWTRGCMD_I80); //TRIGCON = 3 printf("Video: video_hw_init complete \n"); return ((void*)&smi); }
void lcd_ctrl_init_70(void *lcdbase) { ulong freq_lcdclk; ulong freq_Hclk; ulong fb_size; unsigned char nn; unsigned short *pp; int i; GPICON_REG = 0xaaaaaaaa; GPIPUD_REG = 0xaaaaaaaa; GPJCON_REG = 0xaaaaaaaa; GPJPUD_REG = 0xaaaaaaaa; lcd_disable(); S3C_WINCON0 &= (~(S3C_WINCONx_ENWIN_F_ENABLE)); MIFPCON_REG &= (~SEL_BYPASS_MASK); SPCON_REG &= (~LCD_SEL_MASK); SPCON_REG |= (RGB_IF_STYLE_MASK); freq_lcdclk = S3CFB_PIXEL_CLOCK; freq_Hclk = get_HCLK(); nn = (unsigned char)(freq_Hclk / freq_lcdclk) - 1; if(freq_lcdclk < freq_Hclk/2) { S3C_VIDCON0 = S3C_VIDCON0_INTERLACE_F_PROGRESSIVE + S3C_VIDCON0_VIDOUT_RGB_IF + \ S3C_VIDCON0_PNRMODE_RGB_P + S3C_VIDCON0_CLKVALUP_ST_FRM + S3C_VIDCON0_CLKVAL_F(nn) + \ S3C_VIDCON0_CLKDIR_DIVIDED + S3C_VIDCON0_CLKSEL_F_HCLK; }else { S3C_VIDCON0 = S3C_VIDCON0_INTERLACE_F_PROGRESSIVE + S3C_VIDCON0_VIDOUT_RGB_IF + \ S3C_VIDCON0_PNRMODE_RGB_P + S3C_VIDCON0_CLKVALUP_ST_FRM + S3C_VIDCON0_CLKVAL_F(0) + \ S3C_VIDCON0_CLKDIR_DIRECTED + S3C_VIDCON0_CLKSEL_F_HCLK; } nn = 0; if(S3CFB_IVCLK) { nn += S3C_VIDCON1_IVCLK_RISE_EDGE; } if(S3CFB_IHSYNC) { nn += S3C_VIDCON1_IHSYNC_INVERT; } if(S3CFB_IVSYNC) { nn += S3C_VIDCON1_IVSYNC_INVERT; } if(S3CFB_IVDEN) { nn += S3C_VIDCON1_IVDEN_INVERT; } S3C_VIDCON1 = (unsigned int)nn; S3C_VIDCON2 = 0; S3C_VIDTCON0 = S3C_VIDTCON0_VBPD(S3CFB_VBP - 1) | S3C_VIDTCON0_VFPD(S3CFB_VFP - 1) | S3C_VIDTCON0_VSPW(S3CFB_VSW - 1); S3C_VIDTCON1 = S3C_VIDTCON1_HBPD(S3CFB_HBP - 1) | S3C_VIDTCON1_HFPD(S3CFB_HFP -1) | S3C_VIDTCON1_HSPW(S3CFB_HSW - 1); S3C_VIDTCON2 = S3C_VIDTCON2_LINEVAL(S3CFB_VRES - 1) | S3C_VIDTCON2_HOZVAL(S3CFB_HRES - 1); #if LCD_BPP == LCD_COLOR32 S3C_WINCON0 = S3C_WINCONx_BPPMODE_F_24BPP_888; S3C_WINCON1 = S3C_WINCONx_BPPMODE_F_24BPP_888 | S3C_WINCONx_BLD_PIX_PIXEL; #else S3C_WINCON0 = S3C_WINCONx_BPPMODE_F_16BPP_565 | S3C_WINCONx_HAWSWP_ENABLE; S3C_WINCON1 = S3C_WINCONx_BPPMODE_F_16BPP_565 | S3C_WINCONx_HAWSWP_ENABLE | S3C_WINCONx_BLD_PIX_PIXEL; #endif S3C_WINCON2 = 0; S3C_WINCON3 = 0; S3C_WINCON4 = 0; S3C_VIDOSD0A = S3C_VIDOSDxA_OSD_LTX_F(0) + S3C_VIDOSDxA_OSD_LTY_F(0); S3C_VIDOSD0B = S3C_VIDOSDxB_OSD_RBX_F(S3CFB_HRES - 1) | S3C_VIDOSDxB_OSD_RBY_F(S3CFB_VRES - 1); S3C_VIDOSD0C = S3C_VIDOSD0C_OSDSIZE(S3CFB_HRES*S3CFB_VRES); S3C_VIDOSD1A = S3C_VIDOSDxA_OSD_LTX_F(0) + S3C_VIDOSDxA_OSD_LTY_F(0); S3C_VIDOSD1B = S3C_VIDOSDxB_OSD_RBX_F(S3CFB_HRES - 1) | S3C_VIDOSDxB_OSD_RBY_F(S3CFB_VRES - 1); S3C_VIDOSD1C = 0xDDD000;/*alpha blending*/ S3C_VIDOSD1D = S3C_VIDOSD0C_OSDSIZE(S3CFB_HRES*S3CFB_VRES); S3C_VIDOSD2A = 0; S3C_VIDOSD2B = 0; S3C_VIDOSD2C = 0; S3C_VIDOSD2D = 0; S3C_VIDOSD3A = 0; S3C_VIDOSD3B = 0; S3C_VIDOSD3C = 0; S3C_VIDOSD4A = 0; S3C_VIDOSD4B = 0; S3C_VIDOSD4C = 0; fb_size = calc_fbsize(); S3C_VIDW00ADD0B0 = virt_to_phys(lcdbase); S3C_VIDW00ADD0B1 = 0; S3C_VIDW01ADD0B0 = virt_to_phys(osd_frame_buffer); S3C_VIDW01ADD0B1 = 0; S3C_VIDW02ADD0 = 0; S3C_VIDW03ADD0 = 0; S3C_VIDW04ADD0 = 0; S3C_VIDW00ADD1B0 = virt_to_phys((unsigned int)(lcdbase) + fb_size); S3C_VIDW00ADD1B1 = 0; S3C_VIDW01ADD1B0 = virt_to_phys(osd_frame_buffer) + fb_size; S3C_VIDW01ADD1B1 = 0; S3C_VIDW02ADD1 = 0; S3C_VIDW03ADD1 = 0; S3C_VIDW04ADD1 = 0; S3C_VIDW00ADD2 = 0;//S3C_VIDWxxADD2_OFFSIZE_F(0) | (S3C_VIDWxxADD2_PAGEWIDTH_F(panel_info.vl_col*panel_info.vl_bpix/8)); S3C_VIDW01ADD2 = 0;//S3C_VIDWxxADD2_OFFSIZE_F(0) | (S3C_VIDWxxADD2_PAGEWIDTH_F(panel_info.vl_col*panel_info.vl_bpix/8)); S3C_VIDW02ADD2 = 0; S3C_VIDW03ADD2 = 0; S3C_VIDW04ADD2 = 0; S3C_W1KEYCON0 = S3C_WxKEYCON0_KEYBLEN_ENABLE | S3C_WxKEYCON0_KEYEN_F_ENABLE | S3C_WxKEYCON0_COMPKEY(0xFFFF); S3C_W1KEYCON1 = 0x00000000;/*color key*/ #if 1 memset(lcdbase,0x00,fb_size*2); #else pp = lcdbase; for(i=0;i< S3CFB_HRES * S3CFB_VRES;i++) { *pp = 0xf100; pp++; } #endif lcd_enable(); S3C_WINCON0 |= S3C_WINCONx_ENWIN_F_ENABLE; S3C_WINCON1 |= S3C_WINCONx_ENWIN_F_ENABLE; return (0); }