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

📄 dispconapi.c

📁 6410BSP3
💻 C
📖 第 1 页 / 共 2 页
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES.
//
//
// 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:    DispConAPI.c

Abstract:       Implementation of Video Driver
                This module handle Display Controller IOCTLs

Functions:


Notes:


--*/


#include <bsp.h>
#include "SVEngine.h"

BOOL SVE_DispCon_API_Proc(
    DWORD hOpenContext,
    DWORD dwCode,
    PBYTE pBufIn,
    DWORD dwLenIn,
    PBYTE pBufOut,
    DWORD dwLenOut,
    PDWORD pdwActualOut
    )
{
    SVEngineContext *pCtxt;
    SVEnginePowerContext *pPMCtxt;
    BOOL bRet = TRUE;

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

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

    //-------------------------------------------------------------
    // Check OpenContext of Caller have the right to access to H/W Resource
    //-------------------------------------------------------------
    switch(dwCode)
    {
        case SVE_FIMD_SET_INTERFACE_PARAM:
        case SVE_FIMD_SET_OUTPUT_RGBIF:
        case SVE_FIMD_SET_OUTPUT_TV:
        case SVE_FIMD_SET_OUTPUT_ENABLE:
        case SVE_FIMD_SET_OUTPUT_DISABLE:
        case SVE_FIMD_GET_OUTPUT_STATUS:
        {
            bRet = SVE_resource_compare_FIMD_interface(hOpenContext);
            break;
        }
        case SVE_FIMD_SET_WINDOW_MODE:
        {
            if(!pBufIn)
            {
                DEBUGMSG(VDE_ZONE_ERROR,(TEXT("Invalid Buffer : pBufIn:0x%x\n"), pBufIn));
                bRet = FALSE;
            }
            else
            {
                SVEARG_FIMD_WIN_MODE *pArg = (SVEARG_FIMD_WIN_MODE *)pBufIn;
                bRet = SVE_resource_compare_FIMD_window(Disp_get_win_num_from_win_mode(pArg->dwWinMode), hOpenContext);
            }
            break;
        }
        case SVE_FIMD_SET_WINDOW_POSITION:
        {
            if(!pBufIn)
            {
                DEBUGMSG(VDE_ZONE_ERROR,(TEXT("Invalid Buffer : pBufIn:0x%x\n"), pBufIn));
                bRet = FALSE;
            } 
            else
            {
                SVEARG_FIMD_WIN_POS *pArg = (SVEARG_FIMD_WIN_POS *)pBufIn;
                bRet = SVE_resource_compare_FIMD_window(pArg->dwWinNum, hOpenContext);
            }
            break;
        }
        case SVE_FIMD_SET_WINDOW_FRAMEBUFFER:
        {
            if(!pBufIn)
            {
                DEBUGMSG(VDE_ZONE_ERROR,(TEXT("Invalid Buffer : pBufIn:0x%x\n"), pBufIn));
                bRet = FALSE;
            }
            else
            {
                SVEARG_FIMD_WIN_FRAMEBUFFER *pArg = (SVEARG_FIMD_WIN_FRAMEBUFFER *)pBufIn;
                bRet = SVE_resource_compare_FIMD_window(pArg->dwWinNum, hOpenContext);
            }
            break;
        }
        case SVE_FIMD_SET_WINDOW_ENABLE:
        case SVE_FIMD_SET_WINDOW_DISABLE:
        {
            if(!pBufIn)
            {
                DEBUGMSG(VDE_ZONE_ERROR,(TEXT("Invalid Buffer : pBufIn:0x%x\n"), pBufIn));
                bRet = FALSE;
            }
            else
            {
                DWORD dwWinNum = *((DWORD *)pBufIn);
                bRet = SVE_resource_compare_FIMD_window(dwWinNum, hOpenContext);
            }
            break;
        }
        // ColorKey and AlphaBlend setting depends on two adjacent windows's setting
        case SVE_FIMD_SET_WINDOW_BLEND_COLORKEY:
        case SVE_FIMD_SET_WINDOW_BLEND_ALPHA:
            
        case SVE_FIMD_WAIT_FRAME_INTERRUPT:
        case SVE_FIMD_SET_WINDOW_COLORMAP:
        case SVE_FIMD_GET_WINDOW_STATUS:
        case SVE_FIMD_SET_WINDOW_BLEND_DISABLE:
            bRet = TRUE;
            break;
        default:
            DEBUGMSG(VDE_ZONE_ERROR, (TEXT("[VDE:ERR] Invalid IOCTL code\n")));
            bRet = FALSE;
            goto CleanUp;              
    }

    if (!bRet)
    {
        VDE_ERR((_T("[VDE:ERR] SVE_DispCon_API_Proc(0x%08x) : No Right to Access to H/W Resource\r\n"), dwCode));
        goto CleanUp;
    }

    //-----------------------------------
    // Processing IOCTL for Display Controller
    //-----------------------------------
    switch(dwCode)
    {
        case SVE_FIMD_SET_INTERFACE_PARAM:
        {
            SVEARG_FIMD_OUTPUT_IF *pArg;

            VDE_MSG((_T("[VDE] SVE_DispCon_API_Proc() : SVE_FIMD_SET_INTERFACE_PARAM\n\r")));
            
            if(!pBufIn)
            {
                DEBUGMSG(VDE_ZONE_ERROR,(TEXT("Invalid Buffer : pBufIn:0x%x\n"), pBufIn));
                bRet = FALSE;
                break;
            }                   

            pArg = (SVEARG_FIMD_OUTPUT_IF *)pBufIn;

            if (pPMCtxt->bPowerOn)
            {
                // Setup Output Device Information fot LCD
                Disp_set_output_device_information(&pArg->tRGBDevInfo);

                // Setup Output Device Information for TV
                Disp_set_output_TV_information(pArg->dwTVOutScreenWidth, pArg->dwTVOutScreenHeight);
            }

            // Backup for PM
            memcpy(&pPMCtxt->tFIMDOutputParam, pArg, sizeof(SVEARG_FIMD_OUTPUT_IF));

            break;
        }

        case SVE_FIMD_SET_OUTPUT_RGBIF:
        {
            VDE_MSG((_T("[VDE] SVE_DispCon_API_Proc() : SVE_FIMD_SET_OUTPUT_RGBIF\n\r")));

            if (pPMCtxt->bPowerOn)
            {
                // Initialize Display Controller for RGB I/F
                Disp_initialize_output_interface(DISP_VIDOUT_RGBIF);
            }

            // Backup for PM
            pPMCtxt->bFIMDOutputTV = FALSE;

            break;
        }

        case SVE_FIMD_SET_OUTPUT_TV:
        {
            VDE_MSG((_T("[VDE] SVE_DispCon_API_Proc() : SVE_FIMD_SET_OUTPUT_TV\n\r")));

            if (pPMCtxt->bPowerOn)
            {
                // Initialize Display Controller for TV out
                Disp_initialize_output_interface(DISP_VIDOUT_TVENCODER);
            }

            // Backup for PM
            pPMCtxt->bFIMDOutputTV = TRUE;

            break;
        }

        case SVE_FIMD_SET_OUTPUT_ENABLE:
        {
            VDE_MSG((_T("[VDE] SVE_DispCon_API_Proc() : SVE_FIMD_SET_OUTPUT_ENABLE\n\r")));

            if (pPMCtxt->bPowerOn)
            {
                // 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;
            }

            // Backup for PM
            pPMCtxt->bFIMDOutputEnable = TRUE;

            break;
        }

        case SVE_FIMD_SET_OUTPUT_DISABLE:
        {
            VDE_MSG((_T("[VDE] SVE_DispCon_API_Proc() : SVE_FIMD_SET_OUTPUT_DISABLE\n\r")));
            Sleep(10); // Because of HW Bug for TVSC off.

            if (pPMCtxt->bPowerOn)
            {
                // Video Output Disable
                Disp_envid_onoff(DISP_ENVID_OFF);
                pCtxt->bVideoEnable = FALSE;
            }

            // Backup for PM
            pPMCtxt->bFIMDOutputEnable = FALSE;

            break;
        }

        case SVE_FIMD_SET_WINDOW_MODE:
        {
            SVEARG_FIMD_WIN_MODE *pArg;

            VDE_MSG((_T("[VDE] SVE_DispCon_API_Proc() : SVE_FIMD_SET_WINDOW_MODE\n\r")));

            // pBufIn is already validated.
            pArg = (SVEARG_FIMD_WIN_MODE *)pBufIn;

            if (pPMCtxt->bPowerOn)
            {
                Disp_set_window_mode(pArg->dwWinMode, pArg->dwBPP, pArg->dwWidth, pArg->dwHeight, pArg->dwOffsetX, pArg->dwOffsetY);
            }

            // Backup for PM
            memcpy(&pPMCtxt->tFIMDWinMode[Disp_get_win_num_from_win_mode(pArg->dwWinMode)], pArg, sizeof(SVEARG_FIMD_WIN_MODE));
            pPMCtxt->bFIMDWinMode[Disp_get_win_num_from_win_mode(pArg->dwWinMode)] = TRUE;

            break;
        }

        case SVE_FIMD_SET_WINDOW_POSITION:
        {
            SVEARG_FIMD_WIN_POS *pArg;

            VDE_MSG((_T("[VDE] SVE_DispCon_API_Proc() : SVE_FIMD_SET_WINDOW_POSITION\n\r")));

            if(!pBufIn)
            {
                DEBUGMSG(VDE_ZONE_ERROR,(TEXT("Invalid Buffer : pBufIn:0x%x\n"), pBufIn));
                bRet = FALSE;
                break;
            }                   

⌨️ 快捷键说明

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