tvcontrol.cpp
来自「6410BSP3」· C++ 代码 · 共 447 行 · 第 1/2 页
CPP
447 行
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
// Copyright (c) Samsung Electronics. Co. LTD. All rights reserved.
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Module Name:
tvcontrol.cpp
Abstract:
This module implements the main class that derived from DDGPE of display driver to support DirectDraw
In this part, there are codes related with TV-Out, This is special feature of S3C6410
Functions:
Overlay Resource Control, Overlay Enable/Disable
Notes:
--*/
#include "precomp.h"
void
S3C6410Disp::DevOutputEnableTV(void)
{
DWORD dwBytes;
RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++S3C6410Disp::DevOutputEnableTV()\n\r")));
// Video Output Disable
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_OUTPUT_DISABLE, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTV() : IOCTL_SVE_FIMD_SET_OUTPUT_DISABLE Failed\n\r")));
}
// Display Controller initialize to TV Out
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_OUTPUT_TV, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTV() : IOCTL_SVE_FIMD_SET_OUTPUT_TV Failed\n\r")));
}
// TV Scaler Initialize
SVEARG_TVSC_PARAMETER tParamTVSC;
tParamTVSC.dwOpMode = TVSC_FREE_RUN_MODE;
tParamTVSC.dwScanMode = TVSC_INTERLACE;
tParamTVSC.dwSrcType = TVSC_SRC_FIFO;
tParamTVSC.dwSrcBaseWidth = m_dwDeviceScreenWidth;
tParamTVSC.dwSrcBaseHeight = m_dwDeviceScreenHeight;
tParamTVSC.dwSrcWidth = m_dwDeviceScreenWidth;
tParamTVSC.dwSrcHeight = m_dwDeviceScreenHeight;
tParamTVSC.dwSrcOffsetX = 0;
tParamTVSC.dwSrcOffsetY = 0;
tParamTVSC.dwDstType = TVSC_DST_FIFO_YUV444;
tParamTVSC.dwDstBaseWidth = TV_DST_WIDTH*2;
tParamTVSC.dwDstBaseHeight = TV_DST_HEIGHT;
tParamTVSC.dwDstWidth = TV_DST_WIDTH*2;
tParamTVSC.dwDstHeight = TV_DST_HEIGHT;
tParamTVSC.dwDstOffsetX = 0;
tParamTVSC.dwDstOffsetY = 0;
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_TVSC_SET_PROCESSING_PARAM, &tParamTVSC, sizeof(SVEARG_TVSC_PARAMETER), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTV() : IOCTL_SVE_TVSC_SET_PROCESSING_PARAM Failed\n\r")));
}
// TV Encoder Initialize
SVEARG_TVENC_PARAMETER tParamTVEnc;
tParamTVEnc.dwOutputType = TVENC_COMPOSITE;
tParamTVEnc.dwOutputStandard = TVENC_NTSC_M;
tParamTVEnc.dwMVisionPattern = TVENC_MACROVISION_OFF;
tParamTVEnc.dwSrcWidth = TV_DST_WIDTH;
tParamTVEnc.dwSrcHeight = TV_DST_HEIGHT;
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_TVENC_SET_INTERFACE_PARAM, &tParamTVEnc, sizeof(SVEARG_TVENC_PARAMETER), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTV() : IOCTL_SVE_TVENC_SET_INTERFACE_PARAM Failed\n\r")));
}
// TV Encoder On & TV Scaler Start
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_TVENC_SET_ENCODER_ON, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTV() : IOCTL_SVE_TVENC_SET_ENCODER_ON Failed\n\r")));
}
switch(m_pModeEx->ePixelFormat)
{
case ddgpePixelFormat_565:
{
SVEARG_FIMD_WIN_MODE tParam;
tParam.dwWinMode = PRIMARY_WINDOW_MODE;
tParam.dwBPP = DISP_16BPP_565;
tParam.dwWidth = m_dwDeviceScreenWidth;
tParam.dwHeight = m_dwDeviceScreenHeight;
tParam.dwOffsetX = 0;
tParam.dwOffsetY = 0;
// Primary Window Initialize
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_MODE, &tParam, sizeof(SVEARG_FIMD_WIN_MODE), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTV() : IOCTL_SVE_FIMD_SET_WINDOW_MODE Failed\n\r")));
}
break;
}
//case ddgpePixelFormat_8880: // FIMD can not support Packed RGB888
case ddgpePixelFormat_8888:
{
SVEARG_FIMD_WIN_MODE tParam;
tParam.dwWinMode = PRIMARY_WINDOW_MODE;
tParam.dwBPP = DISP_24BPP_888;
tParam.dwWidth = m_dwDeviceScreenWidth;
tParam.dwHeight = m_dwDeviceScreenHeight;
tParam.dwOffsetX = 0;
tParam.dwOffsetY = 0;
// Primary Window Initialize
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_MODE, &tParam, sizeof(SVEARG_FIMD_WIN_MODE), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTV() : IOCTL_SVE_FIMD_SET_WINDOW_MODE Failed\n\r")));
}
break;
}
default:
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTV() : Unknown PixelFormat %d \n\r"), m_pModeEx->ePixelFormat));
break;
}
// Set Primary Window Framebuffer
SVEARG_FIMD_WIN_FRAMEBUFFER tParamFB;
tParamFB.dwWinNum = PRIMARY_WINDOW;
tParamFB.dwFrameBuffer = m_VideoMemoryPhysicalBase;
tParamFB.bWaitForVSync = FALSE;
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_FRAMEBUFFER, &tParamFB, sizeof(SVEARG_FIMD_WIN_FRAMEBUFFER), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTV() : IOCTL_SVE_FIMD_SET_WINDOW_FRAMEBUFFER Failed\n\r")));
}
// Primary Window Enable
DWORD dwParam;
dwParam = PRIMARY_WINDOW;
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_ENABLE, &dwParam, sizeof(DWORD), NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTV() : IOCTL_SVE_FIMD_SET_WINDOW_ENABLE Failed\n\r")));
}
// Video Output Enable
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_OUTPUT_ENABLE, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputEnableTV() : IOCTL_SVE_LCD_SET_MODULE_ENABLE Failed\n\r")));
}
// Enable Overlay Window and Blending
DevRecoverOverlay();
RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --S3C6410Disp::DevOutputEnableTV()\n\r")));
}
void
S3C6410Disp::DevOutputDisableTV(void)
{
DWORD dwBytes;
RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++S3C6410Disp::DevOutputDisableTV()\n\r")));
// Disable Overlay
DevOverlayDisable();
// Video Output Disable
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_OUTPUT_DISABLE, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputDisableTV() : IOCTL_SVE_FIMD_SET_OUTPUT_DISABLE Failed\n\r")));
}
// TV Scaler Stop & TV Encoder Off
if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_TVENC_SET_ENCODER_OFF, NULL, 0, NULL, 0, &dwBytes, NULL) )
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOutputDisableTV() : IOCTL_SVE_TVENC_SET_ENCODER_OFF Failed\n\r")));
}
RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --S3C6410Disp::DevOutputDisableTV()\n\r")));
}
BOOL
S3C6410Disp::DevSetTVDMAMode(TV_DMA_MODE eType)
{
RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++S3C6410Disp::DevSetTVDMAMode(%d)\n\r"), eType));
if (m_eOutputInterface == OUTPUT_IF_TV)
{
// In case of OUTPUT_IF_TV, we can not use TV out DMA mode
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevSetTVDMAMode() : Current output I/F is TV out. TV DMA is not available.\n\r")));
return FALSE;
}
else if (m_eTVDMAMode != TV_DMA_DISABLE)
{
RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevSetTVDMAMode() : TV DMA is already in use [%d] mode\n\r"), m_eTVDMAMode));
return FALSE;
}
// Update TV DMA mode
m_eTVDMAMode = eType;
if (eType == TV_DMA_PRIMARY)
{
DevUpdateTVDMAContext();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?