Esempio n. 1
0
BOOL SVE_resource_request_TVScaler_TVEncoder(DWORD dwOpenContext)
{
    SVEngineContext *pCtxt = SVE_get_context();
    SVEnginePowerContext *pPMCtxt = SVE_get_power_context();

    if (pCtxt->dwOccupantTVScalerTVEncoder == 0)
    {
        pCtxt->dwOccupantTVScalerTVEncoder = dwOpenContext;
        SVE_hw_power_control(HWPWR_TV_ON);
        SVE_hw_clock_control(HWCLK_TV_ON);
        pPMCtxt->bTVSCParam = TRUE;
        pPMCtxt->bTVEncParam = TRUE;
        VDE_MSG((_T("[VDE] SVE_resource_request_TVScaler_TVEncoder() : OpenContext[0x%08x] have resource\r\n"), dwOpenContext));
        return TRUE;
    }
    else if (pCtxt->dwOccupantTVScalerTVEncoder == dwOpenContext)
    {
        DEBUGMSG(VDE_ZONE_TEMP, (_T("[VDE:ERR] SVE_resource_request_TVScaler_TVEncoder() : OpenContext[0x%08x] already have resource\r\n"), dwOpenContext));
        return TRUE;
    }
    else
    {
        VDE_ERR((_T("[VDE:ERR] SVE_resource_request_TVScaler_TVEncoder() : Resource was occupied by other OpenContext\r\n")));
        return FALSE;
    }
}
Esempio n. 2
0
BOOL SVE_resource_request_FIMD_interface(DWORD dwOpenContext)
{
    SVEngineContext *pCtxt = SVE_get_context();
    SVEnginePowerContext *pPMCtxt = SVE_get_power_context();

    if (pCtxt->dwOccupantFIMD == 0)
    {
        pCtxt->dwOccupantFIMD = dwOpenContext;
        SVE_hw_power_control(HWPWR_DISPLAY_ON);
        SVE_hw_clock_control(HWCLK_DISPLAY_ON);
        pPMCtxt->bFIMDOutputParam = TRUE;
        VDE_MSG((_T("[VDE] SVE_resource_request_FIMD_interface() : OpenContext[0x%08x] have resource\r\n"), dwOpenContext));
        return TRUE;
    }
    else if (pCtxt->dwOccupantFIMD == dwOpenContext)
    {
        DEBUGMSG(VDE_ZONE_ERROR, (_T("[VDE:ERR] SVE_resource_request_FIMD_interface() : OpenContext[0x%08x] already have resource\r\n"), dwOpenContext));
        return TRUE;
    }
    else
    {
        VDE_ERR((_T("[VDE:ERR] SVE_resource_request_FIMD_interface() : Resource was occupied by other OpenContext\r\n")));
        return FALSE;
    }
}
Esempio n. 3
0
BOOL SVE_resource_release_Rotator(DWORD dwOpenContext)
{
    SVEngineContext *pCtxt = SVE_get_context();
    SVEnginePowerContext *pPMCtxt = SVE_get_power_context();

    if (pCtxt->dwOccupantRotator == dwOpenContext)
    {
        pCtxt->dwOccupantRotator = 0;
        SVE_hw_power_control(HWPWR_ROTATOR_OFF);
        SVE_hw_clock_control(HWCLK_ROTATOR_OFF);
        pPMCtxt->bRotatorParam = FALSE;
        VDE_MSG((_T("[VDE] SVE_resource_release_Rotator() : OpenContext[0x%08x] release resource\r\n"), dwOpenContext));
        return TRUE;
    }
    else
    {
        VDE_ERR((_T("[VDE:ERR] SVE_resource_release_Rotator() : Resource was occupied by other OpenContext\r\n")));
        return FALSE;
    }
}
Esempio n. 4
0
BOOL SVE_video_engine_power_on(void)
{
	SVEngineContext *pCtxt;
	SVEnginePowerContext *pPMCtxt;
	BOOL bRet = TRUE;
	int iWinCnt;

	VDE_MSG((_T("[VDE] ++SVE_video_engine_power_on()\r\n")));

	pCtxt = SVE_get_context();
	pPMCtxt = SVE_get_power_context();

	if (pPMCtxt->bPowerOn)
	{
		VDE_INF((_T("[VDE:INF] SVE_video_engine_power_on() : Video Engine is Already Power On\r\n")));
		goto CleanUp;
	}

	//-------------------------------
	// HW Block Power On and Clock On
	//-------------------------------
	//SVE_hw_power_control(HWPWR_ALL_ON);
	SVE_hw_power_control(HWPWR_DISPLAY_ON);
	SVE_hw_power_control(HWPWR_2D_ON);
	//SVE_hw_clock_control(HWCLK_ALL_ON);
	SVE_hw_clock_control(HWCLK_DISPLAY_ON);
	SVE_hw_clock_control(HWCLK_2D_ON);

	//-------------------
	// FIMD Reconfiguration
	//-------------------
	if (pPMCtxt->bFIMDOutputParam)
	{
		Disp_set_output_device_information(&pPMCtxt->tFIMDOutputParam.tRGBDevInfo);
		Disp_set_output_TV_information(pPMCtxt->tFIMDOutputParam.dwTVOutScreenWidth, pPMCtxt->tFIMDOutputParam.dwTVOutScreenHeight);

		if (pPMCtxt->bFIMDOutputTV)
		{
			Disp_initialize_output_interface(DISP_VIDOUT_TVENCODER);
		}
		else
		{
			Disp_initialize_output_interface(DISP_VIDOUT_RGBIF);
		}
	}

	//---------------------------
	// FIMD Window Reconfiguration
	//---------------------------

	for (iWinCnt=DISP_WIN0; iWinCnt< DISP_WIN_MAX; iWinCnt++)
	{
		if (pPMCtxt->bFIMDWinMode[iWinCnt])
		{
			Disp_set_window_mode(pPMCtxt->tFIMDWinMode[iWinCnt].dwWinMode, pPMCtxt->tFIMDWinMode[iWinCnt].dwBPP,
									pPMCtxt->tFIMDWinMode[iWinCnt].dwWidth, pPMCtxt->tFIMDWinMode[iWinCnt].dwHeight,
									pPMCtxt->tFIMDWinMode[iWinCnt].dwOffsetX, pPMCtxt->tFIMDWinMode[iWinCnt].dwOffsetY);
		}

		if (pPMCtxt->bFIMDWinFBuffer[iWinCnt])
		{
			Disp_set_framebuffer(iWinCnt, pPMCtxt->tFIMDWinFBuffer[iWinCnt].dwFrameBuffer);
		}

		if (pPMCtxt->bFIMDColorKey[iWinCnt])
		{
			Disp_set_color_key(iWinCnt, pPMCtxt->tFIMDColorKey[iWinCnt].bOnOff, pPMCtxt->tFIMDColorKey[iWinCnt].dwDirection,
								pPMCtxt->tFIMDColorKey[iWinCnt].dwColorKey, pPMCtxt->tFIMDColorKey[iWinCnt].dwCompareKey);
		}

		if (pPMCtxt->bFIMDAlpha[iWinCnt])
		{
			Disp_set_alpha_blending(iWinCnt, pPMCtxt->tFIMDAlpha[iWinCnt].dwMethod,
									pPMCtxt->tFIMDAlpha[iWinCnt].dwAlpha0, pPMCtxt->tFIMDAlpha[iWinCnt].dwAlpha1);
		}

		if (pPMCtxt->bFIMDWinEnable[iWinCnt])
		{
			Disp_window_onfoff(iWinCnt, DISP_WINDOW_ON);
			pCtxt->bWindowEnable[iWinCnt] = TRUE;
		}
	}

	//---------------------------
	// Post Processor Reconfiguration
	//---------------------------

	if (pPMCtxt->bPostParam)
	{
		SVE_hw_power_control(HWPWR_POST_ON);
		SVE_hw_clock_control(HWCLK_POST_ON);
		Post_initialize(pPMCtxt->tPostParam.dwOpMode, pPMCtxt->tPostParam.dwScanMode,
					pPMCtxt->tPostParam.dwSrcType,
					pPMCtxt->tPostParam.dwSrcBaseWidth, pPMCtxt->tPostParam.dwSrcBaseHeight,
					pPMCtxt->tPostParam.dwSrcWidth, pPMCtxt->tPostParam.dwSrcHeight,
					pPMCtxt->tPostParam.dwSrcOffsetX, pPMCtxt->tPostParam.dwSrcOffsetY,
					pPMCtxt->tPostParam.dwDstType,
					pPMCtxt->tPostParam.dwDstBaseWidth, pPMCtxt->tPostParam.dwDstBaseHeight,
					pPMCtxt->tPostParam.dwDstWidth, pPMCtxt->tPostParam.dwDstHeight,
					pPMCtxt->tPostParam.dwDstOffsetX, pPMCtxt->tPostParam.dwDstOffsetY);

		if (pPMCtxt->bPostSrcBuffer)
		{
			Post_set_source_buffer(pPMCtxt->tPostSrcBuffer.dwBufferRGBY,
										pPMCtxt->tPostSrcBuffer.dwBufferCb,
										pPMCtxt->tPostSrcBuffer.dwBufferCr);

			Post_set_next_source_buffer(pPMCtxt->tPostSrcBuffer.dwBufferRGBY,
										pPMCtxt->tPostSrcBuffer.dwBufferCb,
										pPMCtxt->tPostSrcBuffer.dwBufferCr);
		}

		if (pPMCtxt->bPostDstBuffer)
		{

			Post_set_destination_buffer(pPMCtxt->tPostDstBuffer.dwBufferRGBY,
										pPMCtxt->tPostDstBuffer.dwBufferCb,
										pPMCtxt->tPostDstBuffer.dwBufferCr);

			Post_set_next_destination_buffer(pPMCtxt->tPostDstBuffer.dwBufferRGBY,
										pPMCtxt->tPostDstBuffer.dwBufferCb,
										pPMCtxt->tPostDstBuffer.dwBufferCr);
		}

		if (pPMCtxt->bPostStart)
		{
			pPMCtxt->bTVSCStart  = FALSE;	// for Trigger Once
			Post_enable_interrupt();
			Post_processing_start();
		}
	}

	//-----------------------
	// TV Scaler Reconfiguration
	//-----------------------

	if (pPMCtxt->bTVSCParam)
	{
		SVE_hw_power_control(HWPWR_TV_ON);
		SVE_hw_clock_control(HWCLK_TV_ON);
		TVSC_initialize(pPMCtxt->tTVSCParam.dwOpMode, pPMCtxt->tTVSCParam.dwScanMode,
					pPMCtxt->tTVSCParam.dwSrcType,
					pPMCtxt->tTVSCParam.dwSrcBaseWidth, pPMCtxt->tTVSCParam.dwSrcBaseHeight,
					pPMCtxt->tTVSCParam.dwSrcWidth, pPMCtxt->tTVSCParam.dwSrcHeight,
					pPMCtxt->tTVSCParam.dwSrcOffsetX, pPMCtxt->tTVSCParam.dwSrcOffsetY,
					pPMCtxt->tTVSCParam.dwDstType,
					pPMCtxt->tTVSCParam.dwDstBaseWidth, pPMCtxt->tTVSCParam.dwDstBaseHeight,
					pPMCtxt->tTVSCParam.dwDstWidth, pPMCtxt->tTVSCParam.dwDstHeight,
					pPMCtxt->tTVSCParam.dwDstOffsetX, pPMCtxt->tTVSCParam.dwDstOffsetY);

		if (pPMCtxt->bTVSCSrcBuffer)
		{
			TVSC_set_source_buffer(pPMCtxt->tTVSCSrcBuffer.dwBufferRGBY,
										pPMCtxt->tTVSCSrcBuffer.dwBufferCb,
										pPMCtxt->tTVSCSrcBuffer.dwBufferCr);

			TVSC_set_next_source_buffer(pPMCtxt->tTVSCSrcBuffer.dwBufferRGBY,
										pPMCtxt->tTVSCSrcBuffer.dwBufferCb,
										pPMCtxt->tTVSCSrcBuffer.dwBufferCr);
		}

		if (pPMCtxt->bTVSCDstBuffer)
		{
			TVSC_set_destination_buffer(pPMCtxt->tTVSCDstBuffer.dwBufferRGBY,
										pPMCtxt->tTVSCDstBuffer.dwBufferCb,
										pPMCtxt->tTVSCDstBuffer.dwBufferCr);

			TVSC_set_next_destination_buffer(pPMCtxt->tTVSCDstBuffer.dwBufferRGBY,
										pPMCtxt->tTVSCDstBuffer.dwBufferCb,
										pPMCtxt->tTVSCDstBuffer.dwBufferCr);
		}

		if (pPMCtxt->bTVSCStart)
		{
			pPMCtxt->bTVSCStart  = FALSE;
			TVSC_enable_interrupt();
			TVSC_processing_start();
		}
	}

	//---------------------------
	// Local Path Reconfiguration
	//---------------------------

	if (pPMCtxt->bLocalPathWin0Enable)
	{
		Post_enable_interrupt();
		Post_processing_start();
		Disp_set_framebuffer(DISP_WIN0, IMAGE_FRAMEBUFFER_PA_START);	// Safe Frame Bufer Address for Local Path
		Disp_window_onfoff(DISP_WIN0, DISP_WINDOW_ON);

		pCtxt->bWindowEnable[DISP_WIN0] = TRUE;
	}

	if (pPMCtxt->bLocalPathWin1Enable)
	{
		// TODO: Enable CamIF MSDMA or TV Scaler
		pCtxt->bWindowEnable[DISP_WIN1] = TRUE;
	}

	if (pPMCtxt->bLocalPathWin2Enable)
	{
		// TODO: Enable CamIF MSDMA or TV Scaler
		pCtxt->bWindowEnable[DISP_WIN2] = TRUE;
	}

	//---------------------------
	// Image Rotator Reconfiguration
	//---------------------------

	if (pPMCtxt->bRotatorParam)
	{
		SVE_hw_power_control(HWPWR_ROTATOR_ON);
		SVE_hw_clock_control(HWCLK_ROTATOR_ON);
		Rotator_initialize(pPMCtxt->tRotatorParam.dwImgFormat,
						pPMCtxt->tRotatorParam.dwOpType,
						pPMCtxt->tRotatorParam.dwSrcWidth,
						pPMCtxt->tRotatorParam.dwSrcHeight);

		if (pPMCtxt->bRotatorSrcBuffer)
		{
			Rotator_set_source_buffer(pPMCtxt->tRotatorSrcBuffer.dwBufferRGBY,
									pPMCtxt->tRotatorSrcBuffer.dwBufferCb,
									pPMCtxt->tRotatorSrcBuffer.dwBufferCr);
		}

		if (pPMCtxt->bRotatorDstBuffer)
		{
			Rotator_set_destination_buffer(pPMCtxt->tRotatorDstBuffer.dwBufferRGBY,
									pPMCtxt->tRotatorDstBuffer.dwBufferCb,
									pPMCtxt->tRotatorDstBuffer.dwBufferCr);
		}

		if (pPMCtxt->bRotatorStart)
		{
			pPMCtxt->bRotatorStart = FALSE;
			pCtxt->bRotatorBusy = TRUE;
			Rotator_enable_interrupt();
			Rotator_start();
		}
	}

	//---------------------------
	// TV Encoder Reconfiguration
	//---------------------------

	if (pPMCtxt->bTVEncParam)
	{
		TVEnc_initialize(pPMCtxt->tTVEncParam.dwOutputType,
						pPMCtxt->tTVEncParam.dwOutputStandard, pPMCtxt->tTVEncParam.dwMVisionPattern,
						pPMCtxt->tTVEncParam.dwSrcWidth, pPMCtxt->tTVEncParam.dwSrcHeight);
	}

	//-------------------
	// Enable Video Output
	//-------------------

	if (pPMCtxt->bTVEncEnable)
	{
		// TV Encoder On
		TVEnc_output_onoff(TVENC_ENCODER_ON);

		// TV Scaler Start
		TVSC_enable_interrupt();
		TVSC_processing_start();
	}

	if (pPMCtxt->bFIMDOutputEnable)
	{
		// Enable Interrupt
		Disp_set_frame_interrupt(DISP_FRMINT_FRONTPORCH);
		Disp_enable_frame_interrupt();

		// Video Output Enable
		Disp_envid_onoff(DISP_ENVID_ON);
		pCtxt->bVideoEnable = TRUE;
	}

	//-------------------
	// Update Power State
	//-------------------
	pPMCtxt->bPowerOn = TRUE;

CleanUp:

	VDE_MSG((_T("[VDE] --SVE_video_engine_power_on()\r\n")));

	return bRet;
}
Esempio n. 5
0
BOOL SVE_video_engine_power_off(void)
{
	SVEngineContext *pCtxt;
	SVEnginePowerContext *pPMCtxt;
	BOOL bRet = TRUE;

	VDE_MSG((_T("[VDE] ++SVE_video_engine_power_off()\r\n")));

	pCtxt = SVE_get_context();
	pPMCtxt = SVE_get_power_context();

	if (!pPMCtxt->bPowerOn)
	{
		VDE_INF((_T("[VDE:INF] SVE_video_engine_power_off() : Video Engine is Already Power Off\r\n")));
		goto CleanUp;
	}

	//-----------------------
	// Disable Video Engine HW
	//-----------------------

	// Disable All Interrupt
	Disp_disable_frame_interrupt();
	Post_disable_interrupt();
	Rotator_disable_interrupt();
	TVSC_disable_interrupt();

	// Clear All Interrupt Pending
	Disp_clear_interrupt_pending();
	Post_clear_interrupt_pending();
	Rotator_clear_interrupt_pending();
	TVSC_clear_interrupt_pending();

	// Disable FIMD output
	Disp_envid_onoff(DISP_ENVID_DIRECT_OFF);
	pCtxt->bVideoEnable = FALSE;
	pCtxt->bWindowEnable[DISP_WIN0] = FALSE;
	pCtxt->bWindowEnable[DISP_WIN1] = FALSE;
	pCtxt->bWindowEnable[DISP_WIN2] = FALSE;
	pCtxt->bWindowEnable[DISP_WIN3] = FALSE;
	pCtxt->bWindowEnable[DISP_WIN4] = FALSE;

	// Disable TV Scaler Operation
	TVSC_processing_stop();

	// Disable TV Encoder Operation
	TVEnc_output_onoff(TVENC_ENCODER_OFF);

	// Disable Post Processor Operation
	Post_processing_stop();

	// Disable Rotator Operation
	Rotator_stop();
	pCtxt->bRotatorBusy = FALSE;

	//----------------------
	// Clear Command Context
	//----------------------
	pCtxt->DispCmdCtxt[DISP_WIN0].bCmdSetBuffer = FALSE;
	pCtxt->DispCmdCtxt[DISP_WIN0].bCmdSetPosition = FALSE;
	pCtxt->DispCmdCtxt[DISP_WIN1].bCmdSetBuffer = FALSE;
	pCtxt->DispCmdCtxt[DISP_WIN1].bCmdSetPosition = FALSE;
	pCtxt->DispCmdCtxt[DISP_WIN2].bCmdSetBuffer = FALSE;
	pCtxt->DispCmdCtxt[DISP_WIN2].bCmdSetPosition = FALSE;
	pCtxt->DispCmdCtxt[DISP_WIN3].bCmdSetBuffer = FALSE;
	pCtxt->DispCmdCtxt[DISP_WIN3].bCmdSetPosition = FALSE;
	pCtxt->DispCmdCtxt[DISP_WIN4].bCmdSetBuffer = FALSE;
	pCtxt->DispCmdCtxt[DISP_WIN4].bCmdSetPosition = FALSE;

	pCtxt->PostCmdCtxt.bCmdSetSrcBuffer = FALSE;
	pCtxt->PostCmdCtxt.bCmdSetDstBuffer = FALSE;

	pCtxt->LocalPathCmdCtxt.bCmdSetWin0Disable = FALSE;
	pCtxt->LocalPathCmdCtxt.bCmdSetWin1Disable = FALSE;
	pCtxt->LocalPathCmdCtxt.bCmdSetWin2Disable = FALSE;

	pCtxt->TVSCCmdCtxt.bCmdSetSrcBuffer = FALSE;
	pCtxt->TVSCCmdCtxt.bCmdSetDstBuffer = FALSE;

	//-------------------------------
	// HW Clock Off and Block Power Off
	//-------------------------------
	SVE_hw_clock_control(HWCLK_ALL_OFF);
	SVE_hw_power_control(HWPWR_ALL_OFF);

	//-------------------
	// Update Power State
	//-------------------
	pPMCtxt->bPowerOn = FALSE;

CleanUp:

	VDE_MSG((_T("[VDE] --SVE_video_engine_power_off()\r\n")));

	return bRet;
}
Esempio n. 6
0
BOOL SVE_initialize_video_engine(void)
{
    SVEngineContext *pCtxt;

    VDE_MSG((_T("[VDE] ++SVE_initialize_video_engine()\r\n")));

    pCtxt = SVE_get_context();

    // Clear Context
    SVE_initialize_context();
    SVE_initialize_power_context();

    // map device SFR address
    if (SVE_map_device_address() == FALSE)
    {
        VDE_ERR((_T("[VDE:ERR] SVE_initialize_video_engine() : SVE_map_device_address() Failed\r\n")));
        goto CleanUp;
    }

    // Intialize interrupt
    if (SVE_initialize_interrupt() == FALSE)
    {
        VDE_ERR((_T("[VDE:ERR] SVE_initialize_video_engine() : SVE_intialize_interrupt() Failed\r\n")));
        goto CleanUp;
    }

    // Create Interrupt Thread
    if (SVE_initialize_thread() == FALSE)
    {
        VDE_ERR((_T("[VDE:ERR] SVE_initialize_video_engine() : SVE_initialize_thread() Failed\r\n")));
        goto CleanUp;
    }

    // Open Power Control Driver
    if (SVE_initialize_power_control() == FALSE)
    {
        VDE_ERR((_T("[VDE:ERR] SVE_initialize_video_engine() : SVE_initialize_power_control() Failed\r\n")));
        goto CleanUp;
    }

    // Initialize SFR Address of Sub Module
    LDI_initialize_register_address((void *)pCtxt->pSPIReg, (void *)pCtxt->pDispConReg, (void *)pCtxt->pGPIOReg);
    Disp_initialize_register_address((void *)pCtxt->pDispConReg, (void *)pCtxt->pMSMIFReg, (void *)pCtxt->pGPIOReg);
    Post_initialize_register_address((void *)pCtxt->pPostReg);
    Rotator_initialize_register_address((void *)pCtxt->pRotatorReg);
    TVSC_initialize_register_address((void *)pCtxt->pTVSCReg);
    TVEnc_initialize_register_address((void *)pCtxt->pTVEncReg, (void *)pCtxt->pGPIOReg);

    SVE_hw_power_control(HWPWR_DISPLAY_ON);
    SVE_hw_power_control(HWPWR_2D_ON);

    SVE_hw_clock_control(HWCLK_DISPLAY_ON);
    SVE_hw_clock_control(HWCLK_2D_ON);

    VDE_MSG((_T("[VDE] --SVE_initialize_video_engine()\r\n")));

    return TRUE;

CleanUp:

    SVE_deinitialize_video_engine();

    VDE_ERR((_T("[VDE:ERR] --SVE_initialize_video_engine() : Failed\r\n")));


    return FALSE;
}