?? s3c6410_display_con.c
字號:
switch(RGBOutMode)
{
case DISP_16BIT_RGB565_P: // GPJ[7:3]->R[4:0], GPI[15:10]->G[5:0], GPI[7:3] -> B[4:0]
g_pGPIOReg->GPIPUD &= ~(0xfff0ffc0); // Pull up/down disable
g_pGPIOReg->GPICON = (g_pGPIOReg->GPICON & ~(0xfff0ffc0)) | (0xaaa0aa80); // G[5:0], B[4:0]
g_pGPIOReg->GPJPUD &= ~(0xffc0); // Pull up/down disable
g_pGPIOReg->GPJCON = (g_pGPIOReg->GPJCON & ~(0xffc0)) | (0xaa80); // R[4:0]
break;
case DISP_18BIT_RGB666_P: // GPJ[7:2]->R[5:0], GPI[15:10]->G[5:0], GPI[7:2] -> B[5:0]
g_pGPIOReg->GPIPUD &= ~(0xfff0fff0); // Pull up/down disable
g_pGPIOReg->GPICON = (g_pGPIOReg->GPICON & ~(0xfff0fff0)) | (0xaaa0aaa0); // G[5:0], B[5:0]
g_pGPIOReg->GPJPUD &= ~(0xfff0); // Pull up/down disable
g_pGPIOReg->GPJCON = (g_pGPIOReg->GPJCON & ~(0xfff0)) | (0xaaa0); // R[5:0]
break;
case DISP_24BIT_RGB888_P: // GPI[15:0] -> Data[15:0], GPJ[7:0]->Data[23:16]
g_pGPIOReg->GPIPUD = 0; // Pull up/down disable
g_pGPIOReg->GPICON = 0xaaaaaaaa; // Data[15:0]
g_pGPIOReg->GPJPUD &= ~0xffff; // Pull up/down disable
g_pGPIOReg->GPJCON = (g_pGPIOReg->GPJCON & ~0xffff) | 0xaaaa; // Data[23:16]
break;
case DISP_16BIT_RGB565_S: // GPJ[7:2] -> Data[5:0]
case DISP_18BIT_RGB666_S: // GPJ[7:2] -> Data[5:0]
g_pGPIOReg->GPJPUD &= ~(0xfff0); // Pull up/down disable
g_pGPIOReg->GPJCON = (g_pGPIOReg->GPJCON & ~(0xfff0)) | (0xaaa0); // Data[5:0]
break;
case DISP_24BIT_RGB888_S: // GPJ[7:0] -> Data[7:0]
g_pGPIOReg->GPJPUD &= ~0xffff; // Pull up/down disable
g_pGPIOReg->GPJCON = (g_pGPIOReg->GPJCON & ~(0xffff)) | 0xaaaa; // Data[7:0]
break;
default:
DISP_ERR((_T("[DISP:ERR] Disp_initialize_port_RGBIF() : Unsupported RGB I/F Output Mode [%d]\n\r"), RGBOutMode));
error = DISP_ERROR_NOT_INITIALIZED;
break;
}
// Control Signal (HSync, VSync, VDEN, VClk)
g_pGPIOReg->GPJPUD &= ~(0xf<<16); // Pull up/down disable
g_pGPIOReg->GPJCON = (g_pGPIOReg->GPJCON & ~(0xff<<16)) | (0xaa<<16); // HSync, VSync, VDEN, VCLK
// MSM I/F Bypass Mode Disable
g_pMSMIFReg->MIFPCON &= ~(0x1<<3); // SEL_BYPASS -> Normal Mode
// LCD Interface Type
g_pGPIOReg->SPCON = (g_pGPIOReg->SPCON & ~(0x3)) | (0x1);
DISP_MSG((_T("[DISP]--Disp_initialize_port_RGBIF() : %d\n\r"), error));
return error;
}
static DISP_ERROR Disp_initialize_RGBIF(void)
{
DISP_ERROR error = DISP_SUCCESS;
unsigned int VCLKDivider;
DISP_MSG((_T("[DISP]++Disp_initialize_RGBIF()\n\r")));
if (Disp_get_vclk_direction_divider(g_DevInfoRGB.VCLK_Source, &g_DevInfoRGB.VCLK_Direction, &VCLKDivider))
{
g_pDispConReg->VIDCON0 = PROGRESSIVE | VIDOUT_RGBIF | g_DevInfoRGB.PNR_Mode | CLKVALUP_ALWAYS |
CLKVAL_F(VCLKDivider) | VCLK_NORMAL | g_DevInfoRGB.VCLK_Direction |
g_DevInfoRGB.VCLK_Source | ENVID_DISABLE | ENVID_F_DISABLE;
g_pDispConReg->VIDCON1 = g_DevInfoRGB.VCLK_Polarity | g_DevInfoRGB.HSYNC_Polarity |
g_DevInfoRGB.VSYNC_Polarity | g_DevInfoRGB.VDEN_Polarity;
g_pDispConReg->VIDCON2 = TVIF_FMT_YUV444; // Should be this value
g_pDispConReg->VIDTCON0 = VBPDE(1) | VBPD(g_DevInfoRGB.VBPD_Value) |
VFPD(g_DevInfoRGB.VFPD_Value) | VSPW(g_DevInfoRGB.VSPW_Value);
g_pDispConReg->VIDTCON1 = VFPDE(1) | HBPD(g_DevInfoRGB.HBPD_Value) |
HFPD(g_DevInfoRGB.HFPD_Value) | HSPW(g_DevInfoRGB.HSPW_Value);
g_pDispConReg->VIDTCON2 = LINEVAL(g_DevInfoRGB.uiHeight) | HOZVAL(g_DevInfoRGB.uiWidth);
}
else
{
DISP_ERR((_T("[DISP:ERR] Disp_initialize_RGBIF() : Clock Source Decision Failed\n\r")));
error = DISP_ERROR_ILLEGAL_PARAMETER;
}
DISP_MSG((_T("[DISP]--Disp_initialize_RGBIF() : %d\n\r"), error));
return error;
}
static DISP_ERROR Disp_initialize_RGBIF_withTVEnc(void)
{
DISP_ERROR error = DISP_SUCCESS;
unsigned int VCLKDivider;
DISP_MSG((_T("[DISP]++Disp_initialize_RGBIF_withTVEnc()\n\r")));
if (Disp_get_vclk_direction_divider_forTVEnc(g_DevInfoRGB.VCLK_Source, &g_DevInfoRGB.VCLK_Direction, &VCLKDivider))
{
g_pDispConReg->VIDCON0 = PROGRESSIVE | VIDOUT_TV_RGBIF | g_DevInfoRGB.PNR_Mode | CLKVALUP_ALWAYS |
CLKVAL_F(VCLKDivider) | VCLK_NORMAL | g_DevInfoRGB.VCLK_Direction |
g_DevInfoRGB.VCLK_Source | ENVID_DISABLE | ENVID_F_DISABLE;
g_pDispConReg->VIDCON1 = g_DevInfoRGB.VCLK_Polarity | g_DevInfoRGB.HSYNC_Polarity |
g_DevInfoRGB.VSYNC_Polarity | g_DevInfoRGB.VDEN_Polarity;
g_pDispConReg->VIDCON2 = TVIF_FMT_YUV444; // Should be this value
g_pDispConReg->VIDTCON0 = VBPDE(1) | VBPD(g_DevInfoRGB.VBPD_Value) |
VFPD(g_DevInfoRGB.VFPD_Value) | VSPW(g_DevInfoRGB.VSPW_Value);
g_pDispConReg->VIDTCON1 = VFPDE(1) | HBPD(g_DevInfoRGB.HBPD_Value) |
HFPD(g_DevInfoRGB.HFPD_Value) | HSPW(g_DevInfoRGB.HSPW_Value);
g_pDispConReg->VIDTCON2 = LINEVAL(g_DevInfoRGB.uiHeight) | HOZVAL(g_DevInfoRGB.uiWidth);
}
else
{
DISP_ERR((_T("[DISP:ERR] Disp_initialize_RGBIF_withTVEnc() : Clock Source Decision Failed\n\r")));
error = DISP_ERROR_ILLEGAL_PARAMETER;
}
DISP_MSG((_T("[DISP]--Disp_initialize_RGBIF_withTVEnc() : %d\n\r"), error));
return error;
}
static DISP_ERROR Disp_initialize_TVEnc(void)
{
DISP_ERROR error = DISP_SUCCESS;
DISP_MSG((_T("[DISP]++Disp_initialize_TVEnc()\n\r")));
#if 0 // TV Encoder FIFO underrun at WVGA(800x480) size Frame Buffer
g_pDispConReg->VIDCON0 = PROGRESSIVE | VIDOUT_TVENC | g_DevInfoTV.PNR_Mode | CLKVALUP_ALWAYS |
CLKVAL_F(2) | VCLK_NORMAL | CLKDIR_DIRECT |
CLKSEL_F_EXT27M | ENVID_DISABLE | ENVID_F_DISABLE;
#else
g_pDispConReg->VIDCON0 = PROGRESSIVE | VIDOUT_TVENC | g_DevInfoTV.PNR_Mode | CLKVALUP_ALWAYS |
CLKVAL_F(4) | VCLK_NORMAL | CLKDIR_DIVIDED |
CLKSEL_F_HCLK | ENVID_DISABLE | ENVID_F_DISABLE;
#endif
g_pDispConReg->VIDCON1 = g_DevInfoTV.VCLK_Polarity | g_DevInfoTV.HSYNC_Polarity |
g_DevInfoTV.VSYNC_Polarity | g_DevInfoTV.VDEN_Polarity;
g_pDispConReg->VIDCON2 = TVIF_FMT_YUV444; // Should be this value
g_pDispConReg->VIDTCON0 = VBPDE(1) | VBPD(g_DevInfoTV.VBPD_Value) |
VFPD(g_DevInfoTV.VFPD_Value) | VSPW(g_DevInfoTV.VSPW_Value);
g_pDispConReg->VIDTCON1 = VFPDE(1) | HBPD(g_DevInfoTV.HBPD_Value) |
HFPD(g_DevInfoTV.HFPD_Value) | HSPW(g_DevInfoTV.HSPW_Value);
g_pDispConReg->VIDTCON2 = LINEVAL(g_DevInfoTV.uiHeight) | HOZVAL(g_DevInfoTV.uiWidth);
DISP_MSG((_T("[DISP]--Disp_initialize_TVEnc() : %d\n\r"), error));
return error;
}
static DISP_ERROR Disp_window0_initialize(DISP_WINDOW_MODE Mode, DISP_BPP_MODE BPPMode, unsigned int uiWidth, unsigned int uiHeight, unsigned int uiOffsetX, unsigned int uiOffsetY)
{
DISP_ERROR error = DISP_SUCCESS;
DISP_MSG((_T("[DISP]++Disp_window0_initialize(%d, %d, %d, %d, %d, %d)\n\r"), Mode, BPPMode, uiWidth, uiHeight, uiOffsetX, uiOffsetY));
switch(Mode)
{
case DISP_WIN0_DMA:
g_Win0Config.LocalPathEnable = LOCAL_PATH_DISABLE;
//g_Win0Config.LocaPathSourceFormat; // Don't care when Local Path is disabled
break;
case DISP_WIN0_POST_RGB:
g_Win0Config.LocalPathEnable = LOCAL_PATH_ENABLE;
g_Win0Config.LocaPathSourceFormat = LOCAL_IN_RGB888;
break;
case DISP_WIN0_POST_YUV:
g_Win0Config.LocalPathEnable = LOCAL_PATH_ENABLE;
g_Win0Config.LocaPathSourceFormat = LOCAL_IN_YUV444;
break;
default:
DISP_ERR((_T("[DISP:ERR] Disp_window0_initialize() : Unsupported Window Mode [%d]\n\r"), Mode));
return DISP_ERROR_ILLEGAL_PARAMETER;
break;
}
g_Win0Config.BitSwapping = BITSWP_DISABLE;
g_Win0Config.ByteSwapping = BYTSWP_DISABLE;
g_Win0Config.HalfWordSwapping = HAWSWP_DISABLE;
switch(BPPMode)
{
//case DISP_1BPP:
//case DISP_2BPP:
//case DISP_4BPP:
//case DISP_8BPP_PAL:
//case DISP_16BPP_I555:
case DISP_16BPP_565:
g_Win0Config.uiPageWidth = uiWidth*2; // 2 byte per pixel
g_Win0Config.HalfWordSwapping = HAWSWP_ENABLE; // 16BPP need Halfword Swapping
break;
case DISP_18BPP_666:
case DISP_24BPP_888:
g_Win0Config.uiPageWidth = uiWidth*4; // 4 byte per pixel
break;
default:
DISP_ERR((_T("[DISP:ERR] Disp_window0_initialize() : Unsupported BPP Mode [%d]\n\r"), BPPMode));
return DISP_ERROR_ILLEGAL_PARAMETER;
break;
}
g_Win0Config.BPP_Mode = BPPMode;
g_Win0Config.BufferSelect = BUFSEL_BUF0;
g_Win0Config.BufferAutoControl = BUFAUTO_DISABLE;
g_Win0Config.uiWidth = uiWidth;
g_Win0Config.uiHeight = uiHeight;
g_Win0Config.uiOffsetX = uiOffsetX;
g_Win0Config.uiOffsetY = uiOffsetY;
if (g_Win0Config.LocalPathEnable == LOCAL_PATH_ENABLE)
{
g_Win0Config.BurstLength = BURSTLEN_4WORD; // 4 Words Burst
}
else if ((g_Win0Config.uiPageWidth%64) == 0) // 16 words burst case
{
g_Win0Config.BurstLength = BURSTLEN_16WORD;
}
else if ((g_Win0Config.uiPageWidth%32) == 0) // 8 words burst case
{
g_Win0Config.BurstLength = BURSTLEN_8WORD;
}
else if ((g_Win0Config.uiPageWidth%16) == 0) // 4 words burst case
{
g_Win0Config.BurstLength = BURSTLEN_4WORD;
}
else
{
DISP_ERR((_T("[DISP:ERR] Disp_window0_initialize() : uiPageWidth[%d] is not Aligned with Minimum Burst Size (4 Words)\n\r"), g_Win0Config.uiPageWidth));
return DISP_ERROR_ILLEGAL_PARAMETER;
}
g_pDispConReg->WINCON0 = CSC_WIDE_RANGE | //g_Win0Config.LocalPathEnable |
g_Win0Config.BufferSelect | g_Win0Config.BufferAutoControl | g_Win0Config.BitSwapping |
g_Win0Config.ByteSwapping | g_Win0Config.HalfWordSwapping | g_Win0Config.LocaPathSourceFormat |
g_Win0Config.BurstLength | BPPMODE_F(g_Win0Config.BPP_Mode);
g_pDispConReg->VIDOSD0A = OSD_LEFTTOPX_F(g_Win0Config.uiOffsetX) | OSD_LEFTTOPY_F(g_Win0Config.uiOffsetY);
g_pDispConReg->VIDOSD0B = OSD_RIGHTBOTX_F(g_Win0Config.uiWidth+g_Win0Config.uiOffsetX-1) |
OSD_RIGHTBOTY_F(g_Win0Config.uiHeight+g_Win0Config.uiOffsetY-1);
g_pDispConReg->VIDOSD0C = OSD_SIZE(g_Win0Config.uiWidth*g_Win0Config.uiHeight);
DISP_MSG((_T("[DISP]--Disp_window0_initialize() : %d\n\r"), error));
return error;
}
static DISP_ERROR Disp_window1_initialize(DISP_WINDOW_MODE Mode, DISP_BPP_MODE BPPMode, unsigned int uiWidth, unsigned int uiHeight, unsigned int uiOffsetX, unsigned int uiOffsetY)
{
DISP_ERROR error = DISP_SUCCESS;
DISP_MSG((_T("[DISP]++Disp_window1_initialize(%d, %d, %d, %d, %d, %d)\n\r"), Mode, BPPMode, uiWidth, uiHeight, uiOffsetX, uiOffsetY));
switch(Mode)
{
case DISP_WIN1_DMA:
g_Win1Config.LocalPathEnable = LOCAL_PATH_DISABLE;
//g_Win1Config.LocalPathSelect; // Don't care when Local Path is disabled
//g_Win1Config.LocaPathSourceFormat; // Don't care when Local Path is disabled
break;
case DISP_WIN1_TVSCALER_RGB:
g_Win1Config.LocalPathEnable = LOCAL_PATH_ENABLE;
g_Win1Config.LocalPathSelect = LOCALSEL_TVSCALER;
g_Win1Config.LocaPathSourceFormat = LOCAL_IN_RGB888;
break;
case DISP_WIN1_TVSCALER_YUV:
g_Win1Config.LocalPathEnable = LOCAL_PATH_ENABLE;
g_Win1Config.LocalPathSelect = LOCALSEL_TVSCALER;
g_Win1Config.LocaPathSourceFormat = LOCAL_IN_YUV444;
break;
case DISP_WIN1_CIPREVIEW_RGB:
g_Win1Config.LocalPathEnable = LOCAL_PATH_ENABLE;
g_Win1Config.LocalPathSelect = LOCALSEL_CIPREVIEW;
g_Win1Config.LocaPathSourceFormat = LOCAL_IN_RGB888;
break;
case DISP_WIN1_CIPREVIEW_YUV:
g_Win1Config.LocalPathEnable = LOCAL_PATH_ENABLE;
g_Win1Config.LocalPathSelect = LOCALSEL_CIPREVIEW;
g_Win1Config.LocaPathSourceFormat = LOCAL_IN_YUV444;
break;
default:
DISP_ERR((_T("[DISP:ERR] Disp_window1_initialize() : Unsupported Window Mode [%d]\n\r"), Mode));
return DISP_ERROR_ILLEGAL_PARAMETER;
break;
}
g_Win1Config.BitSwapping = BITSWP_DISABLE;
g_Win1Config.ByteSwapping = BYTSWP_DISABLE;
g_Win1Config.HalfWordSwapping = HAWSWP_DISABLE;
switch(BPPMode)
{
//case DISP_1BPP:
//case DISP_2BPP:
//case DISP_4BPP:
//case DISP_8BPP_PAL:
//case DISP_8BPP_NOPAL:
//case DISP_16BPP_A555:
//case DISP_16BPP_I555:
//case DISP_18BPP_A665:
//case DISP_19BPP_A666:
//case DISP_24BPP_A887:
//case DISP_25BPP_A888:
case DISP_16BPP_565:
g_Win1Config.uiPageWidth = uiWidth*2; // 2 byte per pixel
g_Win1Config.HalfWordSwapping = HAWSWP_ENABLE; // 16BPP need Halfword Swapping
break;
case DISP_18BPP_666:
case DISP_24BPP_888:
g_Win1Config.uiPageWidth = uiWidth*4; // 4 byte per pixel
break;
default:
DISP_ERR((_T("[DISP:ERR] Disp_window1_initialize() : Unsupported BPP Mode [%d]\n\r"), BPPMode));
return DISP_ERROR_ILLEGAL_PARAMETER;
break;
}
g_Win1Config.BPP_Mode = BPPMode;
g_Win1Config.BufferSelect = BUFSEL_BUF0;
g_Win1Config.BufferAutoControl = BUFAUTO_DISABLE;
g_Win1Config.uiWidth = uiWidth;
g_Win1Config.uiHeight = uiHeight;
g_Win1Config.uiOffsetX = uiOffsetX;
g_Win1Config.uiOffsetY = uiOffsetY;
if (g_Win1Config.LocalPathEnable == LOCAL_PATH_ENABLE)
{
g_Win1Config.BurstLength = BURSTLEN_4WORD; // 4 Words Burst
}
else if ((g_Win1Config.uiPageWidth%64) == 0) // 16 words burst case
{
g_Win1Config.BurstLength = BURSTLEN_16WORD;
}
else if ((g_Win1Config.uiPageWidth%32) == 0) // 8 words burst case
{
g_Win1Config.BurstLength = BURSTLEN_8WORD;
}
else if ((g_Win1Config.uiPageWidth%16) == 0) // 4 words burst case
{
g_Win1Config.BurstLength = BURSTLEN_4WORD;
}
else
{
DISP_ERR((_T("[DISP:ERR] Disp_window1_initialize() : uiPageWidth is not Word Aligned [%d]\n\r"), g_Win0Config.uiPageWidth));
return DISP_ERROR_ILLEGAL_PARAMETER;
}
g_pDispConReg->WINCON1 = CSC_WIDE_RANGE | g_Win1Config.LocalPathSelect | //g_Win1Config.LocalPathEnable |
g_Win1Config.BufferSelect | g_Win1Config.BufferAutoControl | g_Win1Config.BitSwapping |
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -