📄 s3c6400_display_con.c
字号:
break;
default:
DISP_ERR((_T("[DISP:ERR] Disp_set_fifo_interrupt() : Unknown FIFO Level [%d]\n\r"), Level));
error = DISP_ERROR_ILLEGAL_PARAMETER;
break;
}
DISP_MSG((_T("[DISP]--Disp_set_fifo_interrupt() : %d\n\r"), error));
return error;
}
DISP_ERROR Disp_enable_fifo_interrupt(void)
{
DISP_ERROR error = DISP_SUCCESS;
DISP_MSG((_T("[DISP]++Disp_enable_fifo_interrupt()\n\r")));
g_pDispConReg->VIDINTCON0 |= (INTFIFOEN_ENABLE | INTEN_ENABLE);
DISP_MSG((_T("[DISP]--Disp_enable_fifo_interrupt() : %d\n\r"), error));
return error;
}
DISP_ERROR Disp_disable_fifo_interrupt(void)
{
DISP_ERROR error = DISP_SUCCESS;
DISP_MSG((_T("[DISP]++Disp_disable_fifo_interrupt()\n\r")));
if (g_pDispConReg->VIDINTCON0 & INTFRMEN_ENABLE)
{
// If Frame Interrupt is enabled, Clear only FIFO Interrupt Enable Bit
g_pDispConReg->VIDINTCON0 &= ~INTFIFOEN_ENABLE;
}
else
{
g_pDispConReg->VIDINTCON0 &= ~(INTFIFOEN_ENABLE | INTEN_ENABLE);
}
DISP_MSG((_T("[DISP]--Disp_disable_fifo_interrupt() : %d\n\r"), error));
return error;
}
DISP_INTERRUPT Disp_clear_interrupt_pending(void)
{
DISP_INTERRUPT Interrupt = DISP_INT_NONE;
// Check Interrupt Source and Clear Pending
if (g_pDispConReg->VIDINTCON1 & INTFIFO_PEND)
{
g_pDispConReg->VIDINTCON1 = INTFIFO_PEND;
Interrupt = DISP_INT_FIFO;
}
else if (g_pDispConReg->VIDINTCON1 & INTFRM_PEND)
{
g_pDispConReg->VIDINTCON1 = INTFRM_PEND;
Interrupt = DISP_INT_FRAME;
}
else if (g_pDispConReg->VIDINTCON1 & INTSYSIF_PEND)
{
g_pDispConReg->VIDINTCON1 = INTSYSIF_PEND;
Interrupt = DISP_INT_I80;
}
return Interrupt;
}
unsigned int Disp_get_line_count(void)
{
unsigned int uiLineCnt;
DISP_MSG((_T("[DISP]++Disp_get_line_count()\n\r")));
uiLineCnt = ((g_pDispConReg->VIDCON1)>>16)&0x7ff;
DISP_MSG((_T("[DISP]--Disp_get_line_count() : Line Count = %d\n\r"), uiLineCnt));
return uiLineCnt;
}
DISP_VERTICAL_STATUS Disp_get_vertical_status(void)
{
unsigned int status;
DISP_MSG((_T("[DISP]++Disp_get_vertical_status()\n\r")));
status = ((g_pDispConReg->VIDCON1)>>13)&0x3;
DISP_MSG((_T("[DISP]--Disp_get_vertical_status() : Status = %d\n\r"), status));
return (DISP_VERTICAL_STATUS)status;
}
DISP_HORIZONTAL_STATUS Disp_get_horizontal_status(void)
{
unsigned int status;
DISP_MSG((_T("[DISP]++Disp_get_horizontal_status()\n\r")));
status = ((g_pDispConReg->VIDCON1)>>11)&0x3;
DISP_MSG((_T("[DISP]--Disp_get_horizontal_status() : Status = %d\n\r"), status));
return (DISP_HORIZONTAL_STATUS)status;
}
static DISP_ERROR Disp_initialize_port_RGBIF(DISP_RGBIFOUT_MODE RGBOutMode)
{
DISP_ERROR error = DISP_SUCCESS;
DISP_MSG((_T("[DISP]++Disp_initialize_port_RGBIF(%d)\n\r"), RGBOutMode));
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_DevInfo.VCLK_Source, &g_DevInfo.VCLK_Direction, &VCLKDivider))
{
g_pDispConReg->VIDCON0 = PROGRESSIVE | VIDOUT_RGBIF | g_DevInfo.PNR_Mode | CLKVALUP_ALWAYS |
CLKVAL_F(VCLKDivider) | VCLK_NORMAL | g_DevInfo.VCLK_Direction |
g_DevInfo.VCLK_Source | ENVID_DISABLE | ENVID_F_DISABLE;
g_pDispConReg->VIDCON1 = g_DevInfo.VCLK_Polarity | g_DevInfo.HSYNC_Polarity |
g_DevInfo.VSYNC_Polarity | g_DevInfo.VDEN_Polarity;
g_pDispConReg->VIDCON2 = TVIF_FMT_YUV444; // Should be this value
g_pDispConReg->VIDTCON0 = VBPDE(1) | VBPD(g_DevInfo.VBPD_Value) |
VFPD(g_DevInfo.VFPD_Value) | VSPW(g_DevInfo.VSPW_Value);
g_pDispConReg->VIDTCON1 = VFPDE(1) | HBPD(g_DevInfo.HBPD_Value) |
HFPD(g_DevInfo.HFPD_Value) | HSPW(g_DevInfo.HSPW_Value);
g_pDispConReg->VIDTCON2 = LINEVAL(g_DevInfo.uiHeight) | HOZVAL(g_DevInfo.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_DevInfo.VCLK_Source, &g_DevInfo.VCLK_Direction, &VCLKDivider))
{
g_pDispConReg->VIDCON0 = PROGRESSIVE | VIDOUT_TV_RGBIF | g_DevInfo.PNR_Mode | CLKVALUP_ALWAYS |
CLKVAL_F(VCLKDivider) | VCLK_NORMAL | g_DevInfo.VCLK_Direction |
g_DevInfo.VCLK_Source | ENVID_DISABLE | ENVID_F_DISABLE;
g_pDispConReg->VIDCON1 = g_DevInfo.VCLK_Polarity | g_DevInfo.HSYNC_Polarity |
g_DevInfo.VSYNC_Polarity | g_DevInfo.VDEN_Polarity;
g_pDispConReg->VIDCON2 = TVIF_FMT_YUV444; // Should be this value
g_pDispConReg->VIDTCON0 = VBPDE(1) | VBPD(g_DevInfo.VBPD_Value) |
VFPD(g_DevInfo.VFPD_Value) | VSPW(g_DevInfo.VSPW_Value);
g_pDispConReg->VIDTCON1 = VFPDE(1) | HBPD(g_DevInfo.HBPD_Value) |
HFPD(g_DevInfo.HFPD_Value) | HSPW(g_DevInfo.HSPW_Value);
g_pDispConReg->VIDTCON2 = LINEVAL(g_DevInfo.uiHeight) | HOZVAL(g_DevInfo.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")));
g_pDispConReg->VIDCON0 = PROGRESSIVE | VIDOUT_TVENC | g_DevInfo.PNR_Mode | CLKVALUP_ALWAYS |
CLKVAL_F(2) | VCLK_NORMAL | CLKDIR_DIVIDED |
CLKSEL_F_EXT27M | ENVID_DISABLE | ENVID_F_DISABLE;
g_pDispConReg->VIDCON1 = g_DevInfo.VCLK_Polarity | g_DevInfo.HSYNC_Polarity |
g_DevInfo.VSYNC_Polarity | g_DevInfo.VDEN_Polarity;
g_pDispConReg->VIDCON2 = TVIF_FMT_YUV444; // Should be this value
g_pDispConReg->VIDTCON0 = VBPDE(1) | VBPD(g_DevInfo.VBPD_Value) |
VFPD(g_DevInfo.VFPD_Value) | VSPW(g_DevInfo.VSPW_Value);
g_pDispConReg->VIDTCON1 = VFPDE(1) | HBPD(g_DevInfo.HBPD_Value) |
HFPD(g_DevInfo.HFPD_Value) | HSPW(g_DevInfo.HSPW_Value);
g_pDispConReg->VIDTCON2 = LINEVAL(g_DevInfo.uiHeight) | HOZVAL(g_DevInfo.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));
error = 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));
error = 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.uiPageWidth%4)
{
DISP_ERR((_T("[DISP:ERR] Disp_window0_initialize() : uiPageWidth is not Word Aligned [%d]\n\r"), g_Win0Config.uiPageWidth));
error = DISP_ERROR_ILLEGAL_PARAMETER;
}
else if (g_Win0Config.uiPageWidth >= 16*4)
{
g_Win0Config.BurstLength = BURSTLEN_16WORD;
}
else if (g_Win0Config.uiPageWidth >= 8*4)
{
g_Win0Config.BurstLength = BURSTLEN_8WORD;
}
else
{
g_Win0Config.BurstLength = BURSTLEN_4WORD;
}
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));
error = 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));
error = DISP_ERROR_ILLEGAL_PARAMETER;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -