⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s3c6400_display_con.c

📁 Samsung公司S3C6400芯片的BSP源码包
💻 C
📖 第 1 页 / 共 4 页
字号:
		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 + -