📄 power.c
字号:
#include <bsp.h>
#include <DrvLib.h>
#include "pmplatform.h"
#include "SVEngine.h"
void SVE_initialize_power_context(void)
{
SVEnginePowerContext *pPMCtxt;
VDE_MSG((_T("[VDE] SVE_initialize_context()\r\n")));
pPMCtxt = SVE_get_power_context();
memset(pPMCtxt, 0x0, sizeof(SVEnginePowerContext));
pPMCtxt->bPowerOn = TRUE; // Initially Power On
// Invalidate All Stored Values
pPMCtxt->bFIMDOutputParam = FALSE;
pPMCtxt->bFIMDOutputTV = FALSE;
pPMCtxt->bFIMDOutputEnable = FALSE;
pPMCtxt->bFIMDWinMode[DISP_WIN0] = FALSE;
pPMCtxt->bFIMDWinMode[DISP_WIN1] = FALSE;
pPMCtxt->bFIMDWinMode[DISP_WIN2] = FALSE;
pPMCtxt->bFIMDWinMode[DISP_WIN3] = FALSE;
pPMCtxt->bFIMDWinMode[DISP_WIN4] = FALSE;
pPMCtxt->bFIMDWinFBuffer[DISP_WIN0] = FALSE;
pPMCtxt->bFIMDWinFBuffer[DISP_WIN1] = FALSE;
pPMCtxt->bFIMDWinFBuffer[DISP_WIN2] = FALSE;
pPMCtxt->bFIMDWinFBuffer[DISP_WIN3] = FALSE;
pPMCtxt->bFIMDWinFBuffer[DISP_WIN4] = FALSE;
pPMCtxt->bFIMDColorKey[DISP_WIN0] = FALSE; // Never Used
pPMCtxt->bFIMDColorKey[DISP_WIN1] = FALSE;
pPMCtxt->bFIMDColorKey[DISP_WIN2] = FALSE;
pPMCtxt->bFIMDColorKey[DISP_WIN3] = FALSE;
pPMCtxt->bFIMDColorKey[DISP_WIN4] = FALSE;
pPMCtxt->bFIMDAlpha[DISP_WIN0] = FALSE; // Never Used
pPMCtxt->bFIMDAlpha[DISP_WIN1] = FALSE;
pPMCtxt->bFIMDAlpha[DISP_WIN2] = FALSE;
pPMCtxt->bFIMDAlpha[DISP_WIN3] = FALSE;
pPMCtxt->bFIMDAlpha[DISP_WIN4] = FALSE;
pPMCtxt->bFIMDWinEnable[DISP_WIN0] = FALSE;
pPMCtxt->bFIMDWinEnable[DISP_WIN1] = FALSE;
pPMCtxt->bFIMDWinEnable[DISP_WIN2] = FALSE;
pPMCtxt->bFIMDWinEnable[DISP_WIN3] = FALSE;
pPMCtxt->bFIMDWinEnable[DISP_WIN4] = FALSE;
pPMCtxt->bPostParam = FALSE;
pPMCtxt->bPostSrcBuffer = FALSE;
pPMCtxt->bPostDstBuffer = FALSE;
pPMCtxt->bPostStart = FALSE;
pPMCtxt->bLocalPathWin0Enable = FALSE;
pPMCtxt->bLocalPathWin1Enable = FALSE;
pPMCtxt->bLocalPathWin2Enable = FALSE;
pPMCtxt->bRotatorParam = FALSE;
pPMCtxt->bRotatorSrcBuffer = FALSE;
pPMCtxt->bRotatorDstBuffer = FALSE;
pPMCtxt->bRotatorStart = FALSE;
pPMCtxt->bTVSCParam = FALSE;
pPMCtxt->bTVSCSrcBuffer = FALSE;
pPMCtxt->bTVSCDstBuffer = FALSE;
pPMCtxt->bTVSCStart = FALSE;
pPMCtxt->bTVEncParam = FALSE;
pPMCtxt->bTVEncEnable = FALSE;
}
void SVE_deinitialize_power_context(void)
{
VDE_MSG((_T("[VDE] SVE_deinitialize_power_context()\r\n")));
return;
}
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;
}
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -