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 + -
显示快捷键?