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

📄 s3c6400_disp.cpp

📁 Samsung公司S3C6400芯片的BSP源码包
💻 CPP
📖 第 1 页 / 共 5 页
字号:

	LeaveCriticalSection(&m_csDevice);
}


void
S3C6400Disp::OverlayEnable(void)
{
	DISPDRV_MSG((_T("[DISPDRV] S3C6400Disp::OverlayEnable()\n\r")));

	if (m_VideoPowerState == VideoPowerOff)
	{
		// To Avoid System Hang in SystemIdle State
		// When Application access to DDraw API in SystemIdle State
		// System Hangs... (Maybe Display Driver in VideoPowerOff state)
		DISPDRV_INF((_T("[DISPDRV:INF] DevOverlayEnable() : Skipped in 'VideoPowerOff State'\n\r")));
	}
	else
	{
		EnterCriticalSection(&m_csDevice);

		DevOverlayEnable();

		LeaveCriticalSection(&m_csDevice);
	}
}


void
S3C6400Disp::OverlayDisable(void)
{
	DISPDRV_MSG((_T("[DISPDRV] S3C6400Disp::OverlayDisable()\n\r")));

	if (m_VideoPowerState == VideoPowerOff)
	{
		// To Avoid System Hang in SystemIdle State
		// When Application access to DDraw API in SystemIdle State
		// System Hangs... (Maybe Display Driver in VideoPowerOff state)
		DISPDRV_INF((_T("[DISPDRV:INF] OverlayDisable() : Skipped in 'VideoPowerOff State'\n\r")));
	}
	else
	{
		EnterCriticalSection(&m_csDevice);

		DevOverlayDisable();

		LeaveCriticalSection(&m_csDevice);
	}
}


void
S3C6400Disp::OverlayBlendDisable(void)
{
	m_OverlayCtxt.bBlendOn = FALSE;

	if (m_VideoPowerState == VideoPowerOff)
	{
		// To Avoid System Hang in SystemIdle State
		// When Application access to DDraw API in SystemIdle State
		// System Hangs... (Maybe Display Driver in VideoPowerOff state)
		DISPDRV_INF((_T("[DISPDRV:INF] OverlayBlendDisable() : Skipped in 'VideoPowerOff State'\n\r")));
	}
	else
	{
		//EnterCriticalSection(&m_csDevice);		// Not so Critical

		DevOverlayBlendDisable();

		//LeaveCriticalSection(&m_csDevice);		// Not so Critical
	}
}


void
S3C6400Disp::OverlaySetColorKey(BOOL bSrcCKey, EDDGPEPixelFormat Format, DWORD ColorKey)
{
	m_OverlayCtxt.bBlendOn = TRUE;
	m_OverlayCtxt.bColorKey = TRUE;
	m_OverlayCtxt.bSrcCKey = bSrcCKey;
	m_OverlayCtxt.Format = Format;
	m_OverlayCtxt.ColorKey = ColorKey;

	if (m_VideoPowerState == VideoPowerOff)
	{
		// To Avoid System Hang in SystemIdle State
		// When Application access to DDraw API in SystemIdle State
		// System Hangs... (Maybe Display Driver in VideoPowerOff state)
		DISPDRV_INF((_T("[DISPDRV:INF] OverlaySetColorKey() : Skipped in 'VideoPowerOff State'\n\r")));
	}
	else
	{
		//EnterCriticalSection(&m_csDevice);		// Not so Critical

		DevOverlaySetColorKey();

		//LeaveCriticalSection(&m_csDevice);		// Not so Critical
	}
}


void
S3C6400Disp::OverlaySetAlpha(BOOL bUsePixelBlend, DWORD Alpha)
{
	m_OverlayCtxt.bBlendOn = TRUE;
	m_OverlayCtxt.bColorKey = FALSE;
	m_OverlayCtxt.bUsePixelBlend = bUsePixelBlend;
	m_OverlayCtxt.Alpha = Alpha;

	if (m_VideoPowerState == VideoPowerOff)
	{
		// To Avoid System Hang in SystemIdle State
		// When Application access to DDraw API in SystemIdle State
		// System Hangs... (Maybe Display Driver in VideoPowerOff state)
		DISPDRV_INF((_T("[DISPDRV:INF] OverlaySetAlpha() : Skipped in 'VideoPowerOff State'\n\r")));
	}
	else
	{
		//EnterCriticalSection(&m_csDevice);		// Not so Critical

		DevOverlaySetAlpha();

		//LeaveCriticalSection(&m_csDevice);		// Not so Critical
	}
}


BOOL
S3C6400Disp::DevInitialize(void)
{
	DISPDRV_MSG((_T("[DISPDRV] ++S3C6400Disp::DevInitialize()\n\r")));

	EnterCriticalSection(&m_csDevice);

	// Enable Block Power
	DevHWPowerGating(HWPWR_DISPLAY_ON);
	DevHWPowerGating(HWPWR_POST_ON);		// Post Processor keeps Always On while Display is On, But Clock is Controlled

	// Enable Clock Source
	DevHWClockGating(HWCLK_DISPLAY_ON);
	DevHWClockGating(HWCLK_MSMIF_ON);

	// Initialize SFR Address of Sub Module
	LDI_initialize_register_address((void *)m_pSPIReg, (void *)m_pDispConReg, (void *)m_pGPIOReg);
	Disp_initialize_register_address((void *)m_pDispConReg, (void *)m_pMSMIFReg, (void *)m_pGPIOReg);
	Post_initialize_register_address((void *)m_pPostReg);
	TVSC_initialize_register_address((void *)m_pTVSCReg);
	TVEnc_initialize_register_address((void *)m_pTVEncReg, (void *)m_pGPIOReg);

#if (SMDK6400_LCD_MODULE == LCD_MODULE_LTE480)		// LTE480 need RGB I/F Signal during LCD Pannel Initialization

	//------------------------
	// Display Controller Initialize
	//------------------------
	Disp_set_output_device_information(DISP_DEV_LTE480WV_RGB);
	Disp_initialize_output_interface(DISP_VIDOUT_RGBIF);

	switch(m_pModeEx->ePixelFormat)
	{
	case ddgpePixelFormat_565:
		Disp_set_dithering_mode(DISP_DITHER_565);
		Disp_set_window_mode(DISP_WIN2_DMA, DISP_16BPP_565, m_dwDeviceScreenWidth, m_dwDeviceScreenHeight, 0, 0);
		break;
	case ddgpePixelFormat_8888:
		Disp_set_dithering_mode(DISP_DITHER_OFF);
		Disp_set_window_mode(DISP_WIN2_DMA, DISP_24BPP_888, m_dwDeviceScreenWidth, m_dwDeviceScreenHeight, 0, 0);
		break;
	default:
		DISPDRV_ERR((_T("[DISPDRV:ERR] InitializeDevice() : Unknown PixelFormat %d \n\r"), m_pModeEx->ePixelFormat));
		break;
	}

	Disp_set_framebuffer(DISP_WIN2, m_VideoMemoryPhysicalBase);
	Disp_window_onfoff(DISP_WIN2, DISP_WINDOW_ON);
	Disp_set_frame_interrupt(DISP_FRMINT_FRONTPORCH);

	// Disable Interrupt
	Disp_disable_frame_interrupt();

	// Display Output Enable
	Disp_envid_onoff(DISP_ENVID_ON);

	//-------------------
	// LCD Module Initialize
	//-------------------

	LDI_set_LCD_module_type(LDI_LTE480WV_RGB);
	LDI_initialize_LCD_module();

#else	// (SMDK6400_LCD_MODULE == LCD_MODULE_LTE480)

	//-------------------
	// LCD Module Initialize
	//-------------------
#if (SMDK6400_LCD_MODULE == LCD_MODULE_LTS222)
	// MSM I/F Bypass Mode Disable
	m_pMSMIFReg->MIFPCON &= ~(0x1<<3);	// SEL_BYPASS -> Normal Mode
	LDI_set_LCD_module_type(LDI_LTS222QV_RGB);
#elif (SMDK6400_LCD_MODULE == LCD_MODULE_LTV350)
	LDI_set_LCD_module_type(LDI_LTV350QV_RGB);
#elif (SMDK6400_LCD_MODULE == LCD_MODULE_LTP700)
	LDI_set_LCD_module_type(LDI_LTP700WV_RGB);
#elif (SMDK6400_LCD_MODULE == LCD_MODULE_EMULQV)
	LDI_set_LCD_module_type(LDI_LTE480WV_RGB);
#elif (SMDK6400_LCD_MODULE == LCD_MODULE_EMULPQV)
	LDI_set_LCD_module_type(LDI_LTE480WV_RGB);
#endif
	LDI_initialize_LCD_module();

	//------------------------
	// Display Controller Initialize
	//------------------------
#if (SMDK6400_LCD_MODULE == LCD_MODULE_LTS222)
	Disp_set_output_device_information(DISP_DEV_LTS222QV_RGB);
#elif (SMDK6400_LCD_MODULE == LCD_MODULE_LTV350)
	Disp_set_output_device_information(DISP_DEV_LTV350QV_RGB);
#elif (SMDK6400_LCD_MODULE == LCD_MODULE_LTP700)
	Disp_set_output_device_information(DISP_DEV_LTP700WV_RGB);
#elif (SMDK6400_LCD_MODULE == LCD_MODULE_EMULQV)
	Disp_set_output_device_information(DISP_DEV_LTE480WV_RGB);
#elif (SMDK6400_LCD_MODULE == LCD_MODULE_EMULPQV)
	Disp_set_output_device_information(DISP_DEV_LTE480WV_RGB);
#endif

#if	1
	Disp_initialize_output_interface(DISP_VIDOUT_RGBIF);
#else	// for Test
#if	0
	Disp_initialize_output_interface(DISP_VIDOUT_RGBIF_TVENCODER);
	TVSC_initialize(TVSC_FREE_RUN_MODE, TVSC_INTERLACE, TVSC_SRC_FIFO, m_dwDeviceScreenWidth, m_dwDeviceScreenHeight, TVSC_DST_FIFO_YUV444, 720*2, 480);
	TVSC_disable_interrupt();
	TVEnc_initialize(TVENC_COMPOSITE, TVENC_NTSC_M, TVENC_MACROVISION_OFF, 720, 480);
	TVEnc_disable_interrupt();
	TVEnc_output_onoff(TVENC_ENCODER_ON);
	TVSC_processing_start();
#elif 0
	Disp_initialize_output_interface(DISP_VIDOUT_TVENCODER);
	// TODO:
	TVSC_initialize(TVSC_FREE_RUN_MODE, TVSC_INTERLACE, TVSC_SRC_FIFO, m_dwDeviceScreenWidth, m_dwDeviceScreenHeight, TVSC_DST_FIFO_YUV444, 640*2, 448);
	TVSC_disable_interrupt();
	TVEnc_initialize(TVENC_COMPOSITE, TVENC_NTSC_M, TVENC_MACROVISION_OFF, 640, 448);
	TVEnc_disable_interrupt();
	TVEnc_output_onoff(TVENC_ENCODER_ON);
	TVSC_processing_start();
#endif
#endif

	switch(m_pModeEx->ePixelFormat)
	{
	case ddgpePixelFormat_565:
		Disp_set_dithering_mode(DISP_DITHER_565);
		Disp_set_window_mode(DISP_WIN2_DMA, DISP_16BPP_565, m_dwDeviceScreenWidth, m_dwDeviceScreenHeight, 0, 0);
		break;
	case ddgpePixelFormat_8888:
		Disp_set_dithering_mode(DISP_DITHER_OFF);
		Disp_set_window_mode(DISP_WIN2_DMA, DISP_24BPP_888, m_dwDeviceScreenWidth, m_dwDeviceScreenHeight, 0, 0);
		break;
	default:
		DISPDRV_ERR((_T("[DISPDRV:ERR] InitializeDevice() : Unknown PixelFormat %d \n\r"), m_pModeEx->ePixelFormat));
		break;
	}

	Disp_set_framebuffer(DISP_WIN2, m_VideoMemoryPhysicalBase);
	Disp_window_onfoff(DISP_WIN2, DISP_WINDOW_ON);
	Disp_set_frame_interrupt(DISP_FRMINT_FRONTPORCH);

	// Disable Interrupt
	Disp_disable_frame_interrupt();

	// Display Output Enable
	Disp_envid_onoff(DISP_ENVID_ON);

#endif	// (SMDK6400_LCD_MODULE == LCD_MODULE_LTE480)

	// Disable Clock Source
	DevHWClockGating(HWCLK_MSMIF_OFF);

	LeaveCriticalSection(&m_csDevice);

	// Backlight On
	// TODO: To be Replaced with Backlight Driver
	m_pGPIOReg->GPFDAT |= (1<<15);										// set GPF[15] to High
	m_pGPIOReg->GPFCON = (m_pGPIOReg->GPFCON & ~(3<<30)) | (1<<30);	// set GPF[15] as Output

	DISPDRV_MSG((_T("[DISPDRV] --S3C6400Disp::DevInitialize()\n\r")));

	return TRUE;
}


BOOL
S3C6400Disp::DevPowerOn(void)
{
	DISPDRV_INF((_T("[DISPDRV] ++S3C6400Disp::DevPowerOn()\n\r")));

	EnterCriticalSection(&m_csDevice);

	// Enable Block Power
	DevHWPowerGating(HWPWR_DISPLAY_ON);
	DevHWPowerGating(HWPWR_POST_ON);		// Post Processor keeps Always On while Display is On, But Clock is Controlled
#if G2D_ACCELERATE
	DevHWPowerGating(HWPWR_2D_ON);
#endif

	// Enable Clock Source
	DevHWClockGating(HWCLK_DISPLAY_ON);
	DevHWClockGating(HWCLK_MSMIF_ON);
#if G2D_ACCELERATE
	DevHWClockGating(HWCLK_2D_ON);
#endif

	// Don't Use Color Map with Local Path
	Disp_set_window_color_map(DISP_WIN2, FALSE, 0x0);
	Disp_set_window_color_map(DISP_WIN0, FALSE, 0x0);

#if (SMDK6400_LCD_MODULE == LCD_MODULE_LTE480)		// LTE480 need RGB I/F Signal during LCD Pannel Initialization

	//------------------------
	// Display Controller Initialize
	//------------------------
 	Disp_set_output_device_information(DISP_DEV_LTE480WV_RGB);
	Disp_initialize_output_interface(DISP_VIDOUT_RGBIF);

	switch(m_pModeEx->ePixelFormat)
	{
	case ddgpePixelFormat_565:
		Disp_set_dithering_mode(DISP_DITHER_565);
		Disp_set_window_mode(DISP_WIN2_DMA, DISP_16BPP_565, m_dwDeviceScreenWidth, m_dwDeviceScreenHeight, 0, 0);
		break;
	case ddgpePixelFormat_8888:
		Disp_set_dithering_mode(DISP_DITHER_OFF);
		Disp_set_window_mode(DISP_WIN2_DMA, DISP_24BPP_888, m_dwDeviceScreenWidth, m_dwDeviceScreenHeight, 0, 0);
		break;
	default:
		DISPDRV_ERR((_T("[DISPDRV:ERR] DevPowerOn() : Unknown PixelFormat %d \n\r"), m_pModeEx->ePixelFormat));
		break;
	}

	Disp_set_framebuffer(DISP_WIN2, m_VideoMemoryPhysicalBase);
	Disp_window_onfoff(DISP_WIN2, DISP_WINDOW_ON);
	Disp_set_frame_interrupt(DISP_FRMINT_FRONTPORCH);

	// Disable Interrupt
	Disp_disable_frame_interrupt();

	// Display Output Enable
	Disp_envid_onoff(DISP_ENVID_ON);

	//-------------------
	// LCD Module Initialize
	//-------------------
 	LDI_set_LCD_module_type(LDI_LTE480WV_RGB);
 	LDI_initialize_LCD_module();

#else	// (SMDK6400_LCD_MODULE == LCD_MODULE_LTE480)

	//-------------------
	// LCD Module Initialize
	//-------------------
#if (SMDK6400_LCD_MODULE == LCD_MODULE_LTS222)
	// MSM I/F Bypass Mode Disable
	m_pMSMIFReg->MIFPCON &= ~(0x1<<3);	// SEL_BYPASS -> Normal Mode
	LDI_set_LCD_module_type(LDI_LTS222QV_RGB);
#elif (SMDK6400_LCD_MODULE == LCD_MODULE_LTV350)
	LDI_set_LCD_module_type(LDI_LTV350QV_RGB);
 #elif (SMDK6400_LCD_MODULE == LCD_MODULE_LTP700)
	LDI_set_LCD_module_type(LDI_LTP700WV_RGB);
#elif (SMDK6400_LCD_MODULE == LCD_MODULE_EMULQV)
	LDI_set_LCD_module_type(LDI_LTE480WV_RGB);
#elif (SMDK6400_LCD_MODULE == LCD_MODULE_EMULPQV)
	LDI_set_LCD_module_type(LDI_LTE480WV_RGB);
#endif
	LDI_initialize_LCD_module();

	//------------------------
	// Display Controller Initialize
	//------------------------
#if (SMDK6400_LCD_MODULE == LCD_MODULE_LTS222)
	Disp_set_output_device_information(DISP_DEV_LTS222QV_RGB);
#elif (SMDK6400_LCD_MODULE == LCD_MODULE_LTV350)
	Disp_set_output_device_information(DISP_DEV_LTV350QV_RGB);
 #elif (SMDK6400_LCD_MODULE == LCD_MODULE_LTP700)
	Disp_set_output_device_information(DISP_DEV_LTP700WV_RGB);
#elif (SMDK6400_LCD_MODULE == LCD_MODULE_EMULQV)
	Disp_set_output_device_information(DISP_DEV_LTE480WV_RGB);
#elif (SMDK6400_LCD_MODULE == LCD_MODULE_EMULPQV)
	Disp_set_output_device_information(DISP_DEV_LTE480WV_RGB);
#endif

	Disp_initialize_output_interface(DISP_VIDOUT_RGBIF);

	switch(m_pModeEx->ePixelFormat)
	{
	case ddgpePixelFormat_565:
		Disp_set_dithering_mode(DISP_DITHER_565);
		Disp_set_window_mode(DISP_WIN2_DMA, DISP_16BPP_565, m_dwDeviceScreenWidth, m_dwDeviceScreenHeight, 0, 0);
		break;
	case ddgpePixelFormat_8888:
		Disp_set_dithering_mode(DISP_DITHER_OFF);
		Disp_set_window_mode(DISP_WIN2_DMA, DISP_24BPP_888, m_dwDeviceScreenWidth, m_dwDeviceScreenHeight, 0, 0);
		break;
	default:
		DISPDRV_ERR((_T("[DISPDRV:ERR] DevPowerOn() : Unknown PixelFormat %d \n\r"), m_pModeEx->ePixelFormat));
		break;
	}

	Disp_set_framebuffer(DISP_WIN2, m_VideoMemoryPhysicalBase);
	Disp_window_onfoff(DISP_WIN2, DISP_WINDOW_ON);
	Disp_set_frame_interrupt(DISP_FRMINT_FRONTPORCH);

	// Disable Interrupt
	Disp_disable_frame_interrupt();

	// Display Output Enable
	Disp_envid_onoff(DISP_ENVID_ON);

#endif	// (SMDK6400_LCD_MODULE == LCD_MODULE_LTE480)

	// Disable Clock Source
	DevHWClockGating(HWCLK_MSMIF_OFF);

	// Overlay On
	if(m_fpCurrentOverlay)
	{
		DevRecoverOverlay();
	}

	// Backlight On
	// TODO: To be Replaced with Backlight Driver
	m_pGPIOReg->GPFDAT |= (1<<15);										// set GPF[15] to High
	m_pGPIOReg->GPFCON = (m_pGPIOReg->GPFCON & ~(3<<30)) | (1<<30);	// set GPF[15] as Output

	LeaveCriticalSection(&m_csDevice);

	DISPDRV_INF((_T("[DISPDRV] --S3C6400Disp::DevPowerOn()\n\r")));

	return TRUE;
}


BOOL
S3C6400Disp::DevPowerOff(void)
{
	DISPDRV_INF((_T("[DISPDRV] ++S3C6400Disp::DevPowerOff()\n\r")));

	// Backlight Off
	// TODO: To be Replaced with Backlight Driver
	m_pGPIOReg->GPFDAT &= ~(1<<15);									// set GPF[15] to Low
	m_pGPIOReg->GPFCON = (m_pGPIOReg->GPFCON & ~(3<<30)) | (1<<30);	// set GPF[15] as Output

	EnterCriticalSection(&m_csDevice);

	// Overlay Off
	if(m_fpCurrentOverlay)
	{
		DevOverlayDisable();
	}

	// TODO: LCD Module Power Off code shoud be implemented

	// Don't Use Color Map with Local Path
	// Set window image output to specific color (Black)
	Disp_set_window_color_map(DISP_WIN2, TRUE, 0x0);
	Disp_set_wind

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -